light_maymays/microcontroller/dmx_buffers.h

39 lines
819 B
C++

#ifndef DMX_TRIPLE_BUFFER_H
#define DMX_TRIPLE_BUFFER_H
struct InternalBuffer {
char data[512] = {0};
bool is_fresh = false;
};
class DMXTripleBuffer
{
public:
DMXTripleBuffer() {
fill_buffer = &_buffers[0];
drain_buffer = &_buffers[1];
off_buffer = &_buffers[2];
}
void on_fill_complete() {
fill_pos = 0;
fill_buffer->is_fresh = true;
std::swap(fill_buffer, off_buffer);
}
void on_drain_complete() {
drain_pos = 0;
drain_buffer->is_fresh = false;
if (off_buffer->is_fresh) {
std::swap(drain_buffer, off_buffer);
}
}
InternalBuffer *fill_buffer, *drain_buffer, *off_buffer;
size_t fill_pos = 0, drain_pos = 0;
private:
InternalBuffer _buffers[3];
};
#endif