rx_spi_received_e frSkyDHandlePacket(uint8_t * const packet, uint8_t * const protocolState) { static timeUs_t lastPacketReceivedTime = 0; static timeUs_t telemetryTimeUs; rx_spi_received_e ret = RX_SPI_RECEIVED_NONE; const timeUs_t currentPacketReceivedTime = micros(); switch (*protocolState) { case STATE_STARTING: listLength = 47; initialiseData(0); *protocolState = STATE_UPDATE; nextChannel(1); cc2500Strobe(CC2500_SRX); break; case STATE_UPDATE: lastPacketReceivedTime = currentPacketReceivedTime; *protocolState = STATE_DATA; if (rxSpiCheckBindRequested(false)) { lastPacketReceivedTime = 0; timeoutUs = 50; missingPackets = 0; *protocolState = STATE_INIT; break; } FALLTHROUGH; //!!TODO -check this fall through is correct // here FS code could be case STATE_DATA: if (cc2500getGdo()) { uint8_t ccLen = cc2500ReadReg(CC2500_3B_RXBYTES | CC2500_READ_BURST) & 0x7F; if (ccLen >= 20) { cc2500ReadFifo(packet, 20); if (packet[19] & 0x80) { missingPackets = 0; timeoutUs = 1; if (packet[0] == 0x11) { if ((packet[1] == rxFrSkySpiConfig()->bindTxId[0]) && (packet[2] == rxFrSkySpiConfig()->bindTxId[1])) { rxSpiLedOn(); nextChannel(1); cc2500setRssiDbm(packet[18]); #if defined(USE_RX_FRSKY_SPI_TELEMETRY) if ((packet[3] % 4) == 2) { telemetryTimeUs = micros(); buildTelemetryFrame(packet); *protocolState = STATE_TELEMETRY; } else #endif { cc2500Strobe(CC2500_SRX); *protocolState = STATE_UPDATE; } ret = RX_SPI_RECEIVED_DATA; lastPacketReceivedTime = currentPacketReceivedTime; } } } } } if (cmpTimeUs(currentPacketReceivedTime, lastPacketReceivedTime) > (timeoutUs * SYNC_DELAY_MAX)) { #if defined(USE_RX_CC2500_SPI_PA_LNA) cc2500TxDisable(); #endif if (timeoutUs == 1) { #if defined(USE_RX_CC2500_SPI_PA_LNA) && defined(USE_RX_CC2500_SPI_DIVERSITY) // SE4311 chip if (missingPackets >= 2) { cc2500switchAntennae(); } #endif if (missingPackets > MAX_MISSING_PKT) { timeoutUs = 50; setRssiDirect(0, RSSI_SOURCE_RX_PROTOCOL); } missingPackets++; nextChannel(1); } else { rxSpiLedToggle(); setRssi(0, RSSI_SOURCE_RX_PROTOCOL); nextChannel(13); } cc2500Strobe(CC2500_SRX); *protocolState = STATE_UPDATE; } break; #if defined(USE_RX_FRSKY_SPI_TELEMETRY) case STATE_TELEMETRY: if (cmpTimeUs(micros(), telemetryTimeUs) >= 1380) { cc2500Strobe(CC2500_SIDLE); cc2500SetPower(6); cc2500Strobe(CC2500_SFRX); #if defined(USE_RX_CC2500_SPI_PA_LNA) cc2500TxEnable(); #endif cc2500Strobe(CC2500_SIDLE); cc2500WriteFifo(frame, frame[0] + 1); *protocolState = STATE_DATA; ret = RX_SPI_RECEIVED_DATA; lastPacketReceivedTime = currentPacketReceivedTime; } break; #endif } return ret; }
rx_spi_received_e frSkySpiDataReceived(uint8_t *packet) { rx_spi_received_e ret = RX_SPI_RECEIVED_NONE; switch (protocolState) { case STATE_INIT: if ((millis() - start_time) > 10) { initialise(); protocolState = STATE_BIND; } break; case STATE_BIND: if (rxSpiCheckBindRequested(true) || rxCc2500SpiConfig()->autoBind) { rxSpiLedOn(); initTuneRx(); protocolState = STATE_BIND_TUNING; } else { protocolState = STATE_STARTING; } break; case STATE_BIND_TUNING: if (tuneRx(packet)) { initGetBind(); initialiseData(1); protocolState = STATE_BIND_BINDING1; } break; case STATE_BIND_BINDING1: if (getBind1(packet)) { protocolState = STATE_BIND_BINDING2; } break; case STATE_BIND_BINDING2: if (getBind2(packet)) { cc2500Strobe(CC2500_SIDLE); protocolState = STATE_BIND_COMPLETE; } break; case STATE_BIND_COMPLETE: if (!rxCc2500SpiConfig()->autoBind) { writeEEPROM(); } else { uint8_t ctr = 80; while (ctr--) { rxSpiLedToggle(); delay(50); } } ret = RX_SPI_RECEIVED_BIND; protocolState = STATE_STARTING; break; default: ret = handlePacket(packet, &protocolState); break; } return ret; }