Crossfire telemetry protocol start

This commit is contained in:
Bertrand Songis
2016-03-28 19:07:28 +02:00
parent 5a5f192451
commit a3c175f537
21 changed files with 396 additions and 73 deletions
+24 -15
View File
@@ -20,9 +20,6 @@
#include "opentx.h"
uint8_t frskyRxBuffer[FRSKY_RX_PACKET_SIZE]; // Receive buffer. 9 bytes (full packet), worst case 18 bytes with byte-stuffing (+1)
uint8_t frskyRxBufferCount = 0;
#if !defined(CPUARM)
uint8_t frskyTxBuffer[FRSKY_TX_PACKET_SIZE];
uint8_t frskyTxBufferCount = 0;
@@ -39,6 +36,18 @@ extern uint8_t TrotCount;
extern uint8_t TezRotary;
#endif
// Receive buffer state machine state enum
enum FrSkyDataState {
STATE_DATA_IDLE,
STATE_DATA_START,
STATE_DATA_IN_FRAME,
STATE_DATA_XOR,
#if defined(TELEMETREZ)
STATE_DATA_PRIVATE_LEN,
STATE_DATA_PRIVATE_VALUE
#endif
};
NOINLINE void processFrskyTelemetryData(uint8_t data)
{
static uint8_t dataState = STATE_DATA_IDLE;
@@ -72,12 +81,12 @@ NOINLINE void processFrskyTelemetryData(uint8_t data)
if (data == START_STOP) {
if (IS_FRSKY_SPORT_PROTOCOL()) {
dataState = STATE_DATA_IN_FRAME ;
frskyRxBufferCount = 0;
telemetryRxBufferCount = 0;
}
}
else {
if (frskyRxBufferCount < FRSKY_RX_PACKET_SIZE) {
frskyRxBuffer[frskyRxBufferCount++] = data;
if (telemetryRxBufferCount < TELEMETRY_RX_PACKET_SIZE) {
telemetryRxBuffer[telemetryRxBufferCount++] = data;
}
dataState = STATE_DATA_IN_FRAME;
}
@@ -90,30 +99,30 @@ NOINLINE void processFrskyTelemetryData(uint8_t data)
else if (data == START_STOP) {
if (IS_FRSKY_SPORT_PROTOCOL()) {
dataState = STATE_DATA_IN_FRAME ;
frskyRxBufferCount = 0;
telemetryRxBufferCount = 0;
}
else {
// end of frame detected
frskyDProcessPacket(frskyRxBuffer);
frskyDProcessPacket(telemetryRxBuffer);
dataState = STATE_DATA_IDLE;
}
break;
}
else if (frskyRxBufferCount < FRSKY_RX_PACKET_SIZE) {
frskyRxBuffer[frskyRxBufferCount++] = data;
else if (telemetryRxBufferCount < TELEMETRY_RX_PACKET_SIZE) {
telemetryRxBuffer[telemetryRxBufferCount++] = data;
}
break;
case STATE_DATA_XOR:
if (frskyRxBufferCount < FRSKY_RX_PACKET_SIZE) {
frskyRxBuffer[frskyRxBufferCount++] = data ^ STUFF_MASK;
if (telemetryRxBufferCount < TELEMETRY_RX_PACKET_SIZE) {
telemetryRxBuffer[telemetryRxBufferCount++] = data ^ STUFF_MASK;
}
dataState = STATE_DATA_IN_FRAME;
break;
case STATE_DATA_IDLE:
if (data == START_STOP) {
frskyRxBufferCount = 0;
telemetryRxBufferCount = 0;
dataState = STATE_DATA_START;
}
#if defined(TELEMETREZ)
@@ -155,8 +164,8 @@ NOINLINE void processFrskyTelemetryData(uint8_t data)
} // switch
#if defined(FRSKY_SPORT)
if (IS_FRSKY_SPORT_PROTOCOL() && frskyRxBufferCount >= FRSKY_SPORT_PACKET_SIZE) {
processSportPacket(frskyRxBuffer);
if (IS_FRSKY_SPORT_PROTOCOL() && telemetryRxBufferCount >= FRSKY_SPORT_PACKET_SIZE) {
processSportPacket(telemetryRxBuffer);
dataState = STATE_DATA_IDLE;
}
#endif