#ifndef ARM_CS_FRAME_MUX_DATA_H_INCLUDED
#define ARM_CS_FRAME_MUX_DATA_H_INCLUDED
#include <cstdio>
#include <inttypes.h>
#include <vector>
class CSFrameMuxData
{
public:
CSFrameMuxData();
~CSFrameMuxData();
void initMux(const size_t frame_capacity = 16);
int muxInData(const uint8_t* in_data, const uint32_t in_size, const uint8_t in_CSID, const bool padEnd);
int extractFrames(uint8_t* out_frame_buffer, const uint32_t out_size);
const bool hasIncompleteFrame() const { return (bool)(curr_frame_idx != 0); };
const int numFrames() const { return ((int)cs_frames.size() / frame_size_bytes); };
const uint8_t* getFrameBuffer() { return cs_frames.data(); };
size_t getFrameBufferSize() { return cs_frames.size(); };
void clearFrames(int nFrames);
private:
void copyCurrFrameToStack(); void setCSIDByte(const int frame_idx, const uint8_t newCSID, const bool nextDataNewID = true);
void padCurrFrame();
static const int frame_size_bytes = 16;
std::vector<uint8_t> cs_frames; int frames_since_id; uint8_t curr_frame[frame_size_bytes]; int curr_frame_idx; uint8_t curr_CSID; };
#endif