From 92771b666f5aed67d5afa248b8b829c175deed3a Mon Sep 17 00:00:00 2001 From: Bruce Luckcuck Date: Thu, 21 Nov 2019 15:35:13 -0500 Subject: [PATCH] Add protocol level receiver frame rate measurement for IBUS --- src/main/rx/ibus.c | 17 ++++++++++++----- src/test/unit/rx_ibus_unittest.cc | 4 ++++ 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/main/rx/ibus.c b/src/main/rx/ibus.c index 0f79b5c07..10afe5deb 100644 --- a/src/main/rx/ibus.c +++ b/src/main/rx/ibus.c @@ -75,7 +75,7 @@ static bool ibusFrameDone = false; static uint32_t ibusChannelData[IBUS_MAX_CHANNEL]; static uint8_t ibus[IBUS_BUFFSIZE] = { 0, }; - +static timeDelta_t lastFrameDelta = 0; static bool isValidIa6bIbusPacketLength(uint8_t length) { @@ -88,13 +88,13 @@ static void ibusDataReceive(uint16_t c, void *data) { UNUSED(data); - uint32_t ibusTime; - static uint32_t ibusTimeLast; + static timeUs_t ibusTimeLast; static uint8_t ibusFramePosition; + static timeUs_t lastFrameCompleteTimeUs = 0; - ibusTime = micros(); + const timeUs_t ibusTime = microsISR(); - if ((ibusTime - ibusTimeLast) > IBUS_FRAME_GAP) { + if (cmpTimeUs(ibusTime, ibusTimeLast) > IBUS_FRAME_GAP) { ibusFramePosition = 0; rxBytesToIgnore = 0; } else if (rxBytesToIgnore) { @@ -125,6 +125,8 @@ static void ibusDataReceive(uint16_t c, void *data) ibus[ibusFramePosition] = (uint8_t)c; if (ibusFramePosition == ibusFrameSize - 1) { + lastFrameDelta = cmpTimeUs(ibusTime, lastFrameCompleteTimeUs); + lastFrameCompleteTimeUs = ibusTime; ibusFrameDone = true; } else { ibusFramePosition++; @@ -202,6 +204,10 @@ static uint16_t ibusReadRawRC(const rxRuntimeState_t *rxRuntimeState, uint8_t ch return ibusChannelData[chan]; } +static timeDelta_t ibusFrameDelta(void) +{ + return lastFrameDelta; +} bool ibusInit(const rxConfig_t *rxConfig, rxRuntimeState_t *rxRuntimeState) { @@ -213,6 +219,7 @@ bool ibusInit(const rxConfig_t *rxConfig, rxRuntimeState_t *rxRuntimeState) rxRuntimeState->rcReadRawFn = ibusReadRawRC; rxRuntimeState->rcFrameStatusFn = ibusFrameStatus; + rxRuntimeState->rcFrameDeltaFn = ibusFrameDelta; const serialPortConfig_t *portConfig = findSerialPortConfig(FUNCTION_RX_SERIAL); if (!portConfig) { diff --git a/src/test/unit/rx_ibus_unittest.cc b/src/test/unit/rx_ibus_unittest.cc index c34764dd2..9323a9180 100644 --- a/src/test/unit/rx_ibus_unittest.cc +++ b/src/test/unit/rx_ibus_unittest.cc @@ -67,6 +67,10 @@ uint32_t micros(void) { return microseconds_stub_value; } +uint32_t microsISR(void) +{ + return micros(); +} #define SERIAL_BUFFER_SIZE 256 #define SERIAL_PORT_DUMMY_IDENTIFIER (serialPortIdentifier_e)0x1234 -- 2.11.4.GIT