fprime/Svc/ComLogger/ComLogger.hpp
Johan Bertrand f0f19baafb
Fix shadow variables (#2482)
* Fixed shadow warnings from Fprime

* Fix unit tests

* Fix missing shadow warnings

* Fix condition in cmake

* Fix cmake

* Fixes from review

* Fixed mistake in PathName

* Fixing comment

---------

Co-authored-by: M Starch <LeStarch@googlemail.com>
2024-02-01 10:18:10 -08:00

158 lines
5.1 KiB
C++

// ----------------------------------------------------------------------
//
// ComLogger.hpp
//
// ----------------------------------------------------------------------
#ifndef Svc_ComLogger_HPP
#define Svc_ComLogger_HPP
#include "Svc/ComLogger/ComLoggerComponentAc.hpp"
#include <Os/File.hpp>
#include <Os/Mutex.hpp>
#include <Fw/Types/Assert.hpp>
#include <Utils/Hash/Hash.hpp>
#include <limits.h>
#include <cstdio>
#include <cstdarg>
// some limits.h don't have PATH_MAX
#ifdef PATH_MAX
#define COMLOGGER_PATH_MAX PATH_MAX
#else
#define COMLOGGER_PATH_MAX 255
#endif
// some limits.h don't have NAME_MAX
#ifdef NAME_MAX
#define COMLOGGER_NAME_MAX NAME_MAX
#else
#define COMLOGGER_NAME_MAX 255
#endif
namespace Svc {
class ComLogger :
public ComLoggerComponentBase
{
// ----------------------------------------------------------------------
// Construction, initialization, and destruction
// ----------------------------------------------------------------------
public:
// CONSTRUCTOR:
// filePrefix: string to prepend the file name with, ie. "thermal_telemetry"
// maxFileSize: the maximum size a file should reach before being closed and a new one opened
// storeBufferLength: if true, store the length of each com buffer before storing the buffer itself,
// otherwise just store the com buffer. false might be advantageous in a system
// where you can ensure that all buffers given to the ComLogger are the same size
// in which case you do not need the overhead. Or you store an id which you can
// match to an expected size on the ground during post processing.
ComLogger(const char* compName, const char* filePrefix, U32 maxFileSize, bool storeBufferLength=true);
// CONSTRUCTOR:
ComLogger(const char* compName);
void init(
NATIVE_INT_TYPE queueDepth, //!< The queue depth
NATIVE_INT_TYPE instance //!< The instance number
);
// filePrefix: string to prepend the file name with, ie. "thermal_telemetry"
// maxFileSize: the maximum size a file should reach before being closed and a new one opened
// storeBufferLength: if true, store the length of each com buffer before storing the buffer itself,
// otherwise just store the com buffer. false might be advantageous in a system
// where you can ensure that all buffers given to the ComLogger are the same size
// in which case you do not need the overhead. Or you store an id which you can
// match to an expected size on the ground during post processing.
void init_log_file(const char* filePrefix, U32 maxFileSize, bool storeBufferLength=true);
~ComLogger();
// ----------------------------------------------------------------------
// Handler implementations
// ----------------------------------------------------------------------
PRIVATE:
void comIn_handler(
NATIVE_INT_TYPE portNum,
Fw::ComBuffer &data,
U32 context
);
void CloseFile_cmdHandler(
FwOpcodeType opCode,
U32 cmdSeq
);
//! Handler implementation for pingIn
//!
void pingIn_handler(
const NATIVE_INT_TYPE portNum, /*!< The port number*/
U32 key /*!< Value to return to pinger*/
);
// ----------------------------------------------------------------------
// Constants:
// ----------------------------------------------------------------------
// The maximum size of a filename
enum {
MAX_FILENAME_SIZE = COMLOGGER_NAME_MAX,
MAX_PATH_SIZE = COMLOGGER_PATH_MAX
};
// The filename data:
CHAR m_filePrefix[MAX_FILENAME_SIZE + MAX_PATH_SIZE];
U32 m_maxFileSize;
// ----------------------------------------------------------------------
// Internal state:
// ----------------------------------------------------------------------
enum FileMode {
CLOSED = 0,
OPEN = 1
};
FileMode m_fileMode;
Os::File m_file;
CHAR m_fileName[MAX_FILENAME_SIZE + MAX_PATH_SIZE];
CHAR m_hashFileName[MAX_FILENAME_SIZE + MAX_PATH_SIZE];
U32 m_byteCount;
bool m_writeErrorOccurred;
bool m_openErrorOccurred;
bool m_storeBufferLength;
bool m_initialized;
// ----------------------------------------------------------------------
// File functions:
// ----------------------------------------------------------------------
void openFile(
);
void closeFile(
);
void writeComBufferToFile(
Fw::ComBuffer &data,
U16 size
);
// ----------------------------------------------------------------------
// Helper functions:
// ----------------------------------------------------------------------
bool writeToFile(
void* data,
U16 length
);
void writeHashFile(
);
};
}
#endif