// psram_buffer.h - PSRAM-based Ring Buffer for CAN FD Logger #ifndef PSRAM_BUFFER_H #define PSRAM_BUFFER_H #include #include "types.h" #define PSRAM_CAN_BUFFER_SIZE (512 * 1024) #define PSRAM_SD_BUFFER_SIZE (16 * 1024) #define PSRAM_SIGNAL_BUFFER_SIZE (4 * 1024) #define MAX_PSRAM_CAN_FRAMES (PSRAM_CAN_BUFFER_SIZE / sizeof(CanFrame)) class PSRAMRingBuffer { public: PSRAMRingBuffer(); ~PSRAMRingBuffer(); bool begin(size_t capacity); bool push(const CanFrame& frame); bool pop(CanFrame& frame); bool peek(CanFrame& frame); size_t available(); size_t capacity(); size_t freeSpace(); bool isFull(); bool isEmpty(); void clear(); void flush(); CanFrame* getBuffer(); size_t getHead(); size_t getTail(); private: CanFrame* _buffer; size_t _capacity; volatile size_t _head; volatile size_t _tail; volatile size_t _count; SemaphoreHandle_t _mutex; }; extern PSRAMRingBuffer canFrameBuffer; bool initPSRAMBuffers(); void deinitPSRAMBuffers(); uint8_t* getSDWriteBuffer(); uint8_t* getSignalBuffer(); size_t getFreePSRAM(); size_t getUsedPSRAM(); size_t getTotalPSRAM(); void printMemoryStatus(); #endif // PSRAM_BUFFER_H