59 lines
1.2 KiB
C++
59 lines
1.2 KiB
C++
// psram_buffer.h - PSRAM-based Ring Buffer for CAN FD Logger
|
|
|
|
#ifndef PSRAM_BUFFER_H
|
|
#define PSRAM_BUFFER_H
|
|
|
|
#include <Arduino.h>
|
|
#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
|