diff --git a/radio/src/fifo.h b/radio/src/fifo.h index 727294f50..59eb1566e 100644 --- a/radio/src/fifo.h +++ b/radio/src/fifo.h @@ -24,6 +24,8 @@ template class Fifo { + static_assert((N > 1) & !(N & (N - 1)), "Fifo size must be a power of two!"); + public: Fifo(): widx(0), @@ -57,7 +59,7 @@ class Fifo } } - bool isEmpty() + bool isEmpty() const { return (ridx == widx); } @@ -73,12 +75,17 @@ class Fifo while (!isEmpty()) {}; } - uint32_t size() + uint32_t size() const { return (N + widx - ridx) & (N-1); } - bool probe(T & element) + uint32_t hasSpace(uint32_t n) const + { + return (N > (size() + n)); + } + + bool probe(T & element) const { if (isEmpty()) { return false; diff --git a/radio/src/telemetry/crossfire.cpp b/radio/src/telemetry/crossfire.cpp index 1d9d7546d..6bb02b79f 100644 --- a/radio/src/telemetry/crossfire.cpp +++ b/radio/src/telemetry/crossfire.cpp @@ -198,7 +198,7 @@ void processCrossfireTelemetryFrame() #if defined(LUA) default: - if (luaInputTelemetryFifo) { + if (luaInputTelemetryFifo && luaInputTelemetryFifo->hasSpace(telemetryRxBufferCount-2) ) { for (uint8_t i=1; ipush(telemetryRxBuffer[i]); diff --git a/radio/src/telemetry/frsky_sport.cpp b/radio/src/telemetry/frsky_sport.cpp index be3df1bc3..6dacb1a76 100644 --- a/radio/src/telemetry/frsky_sport.cpp +++ b/radio/src/telemetry/frsky_sport.cpp @@ -201,13 +201,13 @@ void sportProcessTelemetryPacket(uint8_t * packet) } else if (id >= DIY_FIRST_ID && id <= DIY_LAST_ID) { #if defined(LUA) - if (luaInputTelemetryFifo) { + if (luaInputTelemetryFifo && luaInputTelemetryFifo->hasSpace(sizeof(SportTelemetryPacket))) { SportTelemetryPacket luaPacket; luaPacket.physicalId = physicalId; luaPacket.primId = primId; luaPacket.dataId = id; luaPacket.value = data; - for (uint8_t i=0; ipush(luaPacket.raw[i]); } } @@ -221,13 +221,13 @@ void sportProcessTelemetryPacket(uint8_t * packet) } #if defined(LUA) else if (primId == 0x32) { - if (luaInputTelemetryFifo) { + if (luaInputTelemetryFifo && luaInputTelemetryFifo->hasSpace(sizeof(SportTelemetryPacket))) { SportTelemetryPacket luaPacket; luaPacket.physicalId = physicalId; luaPacket.primId = primId; luaPacket.dataId = id; luaPacket.value = data; - for (uint8_t i=0; ipush(luaPacket.raw[i]); } }