From bbf09b60276f6c74d5641f5e5dd771c2c0de3cd3 Mon Sep 17 00:00:00 2001 From: Michael Keller Date: Tue, 8 Oct 2019 17:21:44 +1300 Subject: [PATCH 1/2] Fixed telemetry for FrSky X SPI. --- src/main/rx/cc2500_frsky_d.c | 1 - src/main/rx/cc2500_frsky_x.c | 32 ++++++++++++++++++-------------- 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/src/main/rx/cc2500_frsky_d.c b/src/main/rx/cc2500_frsky_d.c index 5be0848b8..e8367d781 100644 --- a/src/main/rx/cc2500_frsky_d.c +++ b/src/main/rx/cc2500_frsky_d.c @@ -295,7 +295,6 @@ rx_spi_received_e frSkyDHandlePacket(uint8_t * const packet, uint8_t * const pro cc2500Strobe(CC2500_SIDLE); cc2500WriteFifo(frame, frame[0] + 1); *protocolState = STATE_DATA; - ret = RX_SPI_RECEIVED_DATA; lastPacketReceivedTime = currentPacketReceivedTime; } diff --git a/src/main/rx/cc2500_frsky_x.c b/src/main/rx/cc2500_frsky_x.c index f2e590198..9820074ae 100644 --- a/src/main/rx/cc2500_frsky_x.c +++ b/src/main/rx/cc2500_frsky_x.c @@ -155,7 +155,8 @@ static uint8_t telemetryOutBuffer[TELEMETRY_OUT_BUFFER_SIZE]; static bool telemetryEnabled = false; -static uint8_t remoteProcessedId = 0; +static uint8_t remoteToProcessId = 0; +static uint8_t remoteToProcessIndex = 0; #endif #endif // USE_RX_FRSKY_SPI_TELEMETRY @@ -432,7 +433,8 @@ rx_spi_received_e frSkyXHandlePacket(uint8_t * const packet, uint8_t * const pro if (receiveTelemetryRetryCount >= 5) { #if defined(USE_RX_FRSKY_SPI_TELEMETRY) && defined(USE_TELEMETRY_SMARTPORT) - remoteProcessedId = TELEMETRY_SEQUENCE_LENGTH - 1; + remoteToProcessId = 0; + remoteToProcessIndex = 0; #endif remoteAckId = TELEMETRY_SEQUENCE_LENGTH - 1; for (unsigned i = 0; i < TELEMETRY_SEQUENCE_LENGTH; i++) { @@ -468,6 +470,10 @@ rx_spi_received_e frSkyXHandlePacket(uint8_t * const packet, uint8_t * const pro cc2500Strobe(CC2500_SRX); *protocolState = STATE_UPDATE; } + if (frameReceived) { + ret |= RX_SPI_RECEIVED_DATA; + } + break; #ifdef USE_RX_FRSKY_SPI_TELEMETRY case STATE_TELEMETRY: @@ -488,9 +494,6 @@ rx_spi_received_e frSkyXHandlePacket(uint8_t * const packet, uint8_t * const pro } #endif *protocolState = STATE_RESUME; - if (frameReceived) { - ret |= RX_SPI_RECEIVED_DATA; - } } break; @@ -531,7 +534,6 @@ rx_spi_received_e frSkyXHandlePacket(uint8_t * const packet, uint8_t * const pro rx_spi_received_e frSkyXProcessFrame(uint8_t * const packet) { static timeMs_t pollingTimeMs = 0; - static uint8_t remoteToProcessIndex = 0; UNUSED(packet); @@ -543,19 +545,21 @@ rx_spi_received_e frSkyXProcessFrame(uint8_t * const packet) clearToSend = true; } else { - uint8_t remoteToProcessId = (remoteProcessedId + 1) % TELEMETRY_SEQUENCE_LENGTH; while (telemetryRxBuffer[remoteToProcessId].needsProcessing && !payload) { + if (remoteToProcessIndex >= telemetryRxBuffer[remoteToProcessId].data.dataLength) { + remoteToProcessIndex = 0; + telemetryRxBuffer[remoteToProcessId].needsProcessing = false; + remoteToProcessId = (remoteToProcessId + 1) % TELEMETRY_SEQUENCE_LENGTH; + + if (!telemetryRxBuffer[remoteToProcessId].needsProcessing) { + break; + } + } + while (remoteToProcessIndex < telemetryRxBuffer[remoteToProcessId].data.dataLength && !payload) { payload = smartPortDataReceive(telemetryRxBuffer[remoteToProcessId].data.data[remoteToProcessIndex], &clearToSend, frSkyXCheckQueueEmpty, false); remoteToProcessIndex = remoteToProcessIndex + 1; } - - if (remoteToProcessIndex == telemetryRxBuffer[remoteToProcessId].data.dataLength) { - remoteToProcessIndex = 0; - telemetryRxBuffer[remoteToProcessId].needsProcessing = false; - remoteProcessedId = remoteToProcessId; - remoteToProcessId = (remoteToProcessId + 1) % TELEMETRY_SEQUENCE_LENGTH; - } } } From e78f9761bc58cf7035d2772023ed68a6d1bb5e67 Mon Sep 17 00:00:00 2001 From: mikeller Date: Thu, 10 Oct 2019 01:59:07 +1300 Subject: [PATCH 2/2] Fixed RX FIFO buffer flush on frame error. --- src/main/rx/cc2500_frsky_d.c | 2 +- src/main/rx/cc2500_frsky_x.c | 6 +----- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/main/rx/cc2500_frsky_d.c b/src/main/rx/cc2500_frsky_d.c index e8367d781..b57369dae 100644 --- a/src/main/rx/cc2500_frsky_d.c +++ b/src/main/rx/cc2500_frsky_d.c @@ -249,7 +249,7 @@ rx_spi_received_e frSkyDHandlePacket(uint8_t * const packet, uint8_t * const pro } } if (!packetOk) { - cc2500Strobe(CC2500_SRX); + cc2500Strobe(CC2500_SFRX); } } diff --git a/src/main/rx/cc2500_frsky_x.c b/src/main/rx/cc2500_frsky_x.c index 9820074ae..3f008adf8 100644 --- a/src/main/rx/cc2500_frsky_x.c +++ b/src/main/rx/cc2500_frsky_x.c @@ -369,12 +369,10 @@ rx_spi_received_e frSkyXHandlePacket(uint8_t * const packet, uint8_t * const pro // here FS code could be case STATE_DATA: if (cc2500getGdo() && (frameReceived == false)){ - bool packetOk = false; uint8_t ccLen = cc2500ReadReg(CC2500_3B_RXBYTES | CC2500_READ_BURST) & 0x7F; if (ccLen >= packetLength) { cc2500ReadFifo(packet, packetLength); if (isValidPacket(packet)) { - packetOk = true; missingPackets = 0; timeoutUs = 1; receiveDelayUs = 0; @@ -450,11 +448,9 @@ rx_spi_received_e frSkyXHandlePacket(uint8_t * const packet, uint8_t * const pro if (!frameReceived) { packetErrors++; DEBUG_SET(DEBUG_RX_FRSKY_SPI, DEBUG_DATA_BAD_FRAME, packetErrors); + cc2500Strobe(CC2500_SFRX); } } - if (!packetOk) { - cc2500Strobe(CC2500_SRX); - } } if (telemetryReceived) { if (cmpTimeUs(micros(), packetTimerUs) > receiveDelayUs) { // if received or not received in this time sent telemetry data