// sd_logger.h - SD Card Logger with PCAP format #ifndef SD_LOGGER_H #define SD_LOGGER_H #include #include #include #include "config.h" #include "types.h" // SD status extern bool sdInitialized; extern uint64_t sdCardSize; extern uint64_t sdFreeSpace; // Current log file extern File currentLogFile; extern char currentLogFileName[64]; extern uint32_t currentLogFileSize; // Initialize SD card bool initSDCard(); // Create log directories bool createLogDirectories(); // Start new log file bool startLogFile(); // Close current log file void closeLogFile(); // Write CAN frame to SD (PCAP format) bool writeCANFrameToSD(const CanFrame& frame); // Flush write buffer to SD card bool flushWriteBuffer(); // SD Write Task (runs on Core 1) void sdWriteTask(void *pvParameters); // Get SD card info uint64_t getSDCardSize(); uint64_t getFreeSpace(); uint64_t getUsedSpace(); // List log files int listLogFiles(char* buffer, size_t bufferSize); // Get file info bool getLogFileInfo(const char* filename, uint32_t& size, uint32_t& timestamp); // Delete log file bool deleteLogFile(const char* filename); // Get current filename const char* getCurrentLogFilename(); // PCAP file structures #pragma pack(push, 1) struct PCAPGlobalHeader { uint32_t magicNumber; // 0xa1b2c3d4 uint16_t versionMajor; // 2 uint16_t versionMinor; // 4 int32_t thiszone; // GMT to local correction uint32_t sigfigs; // accuracy of timestamps uint32_t snaplen; // max length of captured packets uint32_t network; // data link type (227 = LINKTYPE_CAN_SOCKETCAN) }; struct PCAPPacketHeader { uint32_t tsSec; // timestamp seconds uint32_t tsUsec; // timestamp microseconds uint32_t inclLen; // number of octets of packet saved in file uint32_t origLen; // actual length of packet }; struct CANFDFrame { uint32_t canId; // CAN ID + flags uint8_t len; // payload length uint8_t flags; // FD flags uint8_t reserved0; uint8_t reserved1; uint8_t data[64]; // payload }; #pragma pack(pop) #endif // SD_LOGGER_H