diff --git a/radio/sdcard/FrSky-utilities/FrSky SBEC.lua b/radio/sdcard/FrSky-utilities/FrSky SBEC.lua index af5c1ccc1..15bd76bf0 100644 --- a/radio/sdcard/FrSky-utilities/FrSky SBEC.lua +++ b/radio/sdcard/FrSky-utilities/FrSky SBEC.lua @@ -244,7 +244,6 @@ local function runFieldsPage(event) return 0 end - local function runSettingsPage(event) fields = settingsFields return runFieldsPage(event) diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index ddaa8faca..aac6deaab 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -350,8 +350,7 @@ PACK(struct TelemetrySensor { union { PACK(struct { uint8_t physID:5; // instance ID to allow handling multiple instances of same value type, for FrSky can be the physical ID of the sensor - uint8_t module:1; - uint8_t rx_uid:2; + uint8_t rxIndex:3; }) frskyInstance; uint8_t instance; NOBACKUP(uint8_t formula); diff --git a/radio/src/lua/api_general.cpp b/radio/src/lua/api_general.cpp index 3765157aa..1e321cc77 100644 --- a/radio/src/lua/api_general.cpp +++ b/radio/src/lua/api_general.cpp @@ -419,22 +419,61 @@ When called without parameters, it will only return the status of the output buf @status current Introduced in 2.2.0 */ + +TelemetryEndpoint getTelemetryEndpoint(uint8_t receiverIndex) +{ + TelemetryEndpoint result; + + for (uint8_t module=0; module> 8; // 0-100 - crc &= 0x00ff; - } - outputTelemetryBuffer.data[count] = 0xFF - crc; - outputTelemetryBuffer.size = count + 1; -} - -void sportProcessTelemetryPacketWithoutCrc(uint8_t origin, const uint8_t * packet) +void sportProcessTelemetryPacketWithoutCrc(uint8_t originValue, const uint8_t * packet) { + TelemetryEndpoint & origin = (TelemetryEndpoint &)originValue; uint8_t physicalId = packet[0] & 0x1F; uint8_t primId = packet[1]; uint16_t dataId = *((uint16_t *)(packet+2)); uint32_t data = SPORT_DATA_S32(packet); if (primId == DATA_FRAME) { - if (outputTelemetryBuffer.destination.value == TELEMETRY_ENDPOINT_ANY && dataId == outputTelemetryBuffer.sport.dataId) { - // outputTelemetryBuffer.sport.physicalId = packet[0]; - if (origin == SPORT_MODULE) - sportOutputByteStuffAndCrc(); - outputTelemetryBuffer.setDestination(origin); - } - uint8_t instance = physicalId + 1; + uint8_t instance = physicalId + (origin.rxUid << 5); if (dataId == RSSI_ID && isValidIdAndInstance(RSSI_ID, instance)) { telemetryStreaming = TELEMETRY_TIMEOUT10ms; // reset counter only if valid packets are being detected data = SPORT_DATA_U8(packet); diff --git a/radio/src/telemetry/telemetry.h b/radio/src/telemetry/telemetry.h index c8f16d62b..5a70ef21e 100644 --- a/radio/src/telemetry/telemetry.h +++ b/radio/src/telemetry/telemetry.h @@ -155,9 +155,8 @@ void logTelemetryWriteByte(uint8_t data); #define LOG_TELEMETRY_WRITE_BYTE(data) #endif -#define TELEMETRY_ENDPOINT_ANY 0xFF -#define TELEMETRY_ENDPOINT_NONE 0xFE -#define TELEMETRY_ENDPOINT_SPORT 0xFD +#define TELEMETRY_ENDPOINT_NONE 0xFF +#define TELEMETRY_ENDPOINT_SPORT 0x07 union TelemetryEndpoint { PACK(struct { @@ -169,22 +168,56 @@ union TelemetryEndpoint { class OutputTelemetryBuffer { public: - OutputTelemetryBuffer() { + OutputTelemetryBuffer() + { reset(); } - void setDestination(uint8_t value) { + void setDestination(uint8_t value) + { destination.value = value; } - void reset() { + void reset() + { destination.value = TELEMETRY_ENDPOINT_NONE; } - bool isAvailable() { + bool isAvailable() + { return destination.value == TELEMETRY_ENDPOINT_NONE; } + void pushByte(uint8_t byte) + { + data[size++] = byte; + } + + void pushByteWithBytestuffing(uint8_t byte) + { + if (byte == 0x7E || byte == 0x7D) { + pushByte(0x7D); + pushByte(0x20 ^ byte); + } + else { + pushByte(byte); + } + } + + void pushSportPacketWithBytestuffing(SportTelemetryPacket & packet) + { + uint16_t crc = 0; + sport.physicalId = packet.physicalId; // no bytestuffing, no CRC + for (uint8_t i=1; i> 8; // 0-100 + crc &= 0x00ff; + } + pushByte(0xFF - crc); + } + public: union { SportTelemetryPacket sport;