feat: process RC packets back from CRSF module as trainer input (#5724)

i.e. allow head tracker data to be relayed via backpack!
This commit is contained in:
Paul Kendall
2025-01-03 10:01:12 +10:00
committed by GitHub
parent 7b1ae2404c
commit 574f753376
27 changed files with 69 additions and 5 deletions
+27
View File
@@ -22,9 +22,15 @@
#include "crossfire.h"
#include "edgetx.h"
#include "trainer.h"
// clang-format off
#define CS(id,subId,name,unit,precision) {id,subId,unit,precision,name}
#define CROSSFIRE_CH_BITS 11
#define CROSSFIRE_CH_MASK ((1 << CROSSFIRE_CH_BITS) - 1)
#define CROSSFIRE_CH_CENTER 0x3E0
const CrossfireSensor crossfireSensors[] = {
CS(LINK_ID, 0, STR_SENSOR_RX_RSSI1, UNIT_DB, 0),
CS(LINK_ID, 1, STR_SENSOR_RX_RSSI2, UNIT_DB, 0),
@@ -194,6 +200,27 @@ void processCrossfireTelemetryFrame(uint8_t module, uint8_t* rxBuffer,
}
break;
case CHANNELS_ID:
if (g_model.trainerData.mode == TRAINER_MODE_CRSF) {
uint8_t inputbitsavailable = 0;
uint32_t inputbits = 0;
uint8_t byteIdx = 3;
int16_t *pulses = trainerInput;
for (int i = 0; i < min(CROSSFIRE_CHANNELS_COUNT, MAX_TRAINER_CHANNELS); i++) {
while (inputbitsavailable < CROSSFIRE_CH_BITS) {
inputbits |= (uint32_t)(rxBuffer[byteIdx++]) << inputbitsavailable;
inputbitsavailable += 8;
}
*pulses++ = ((int32_t)(inputbits & CROSSFIRE_CH_MASK) - CROSSFIRE_CH_CENTER) * 5 / 8;
inputbitsavailable -= CROSSFIRE_CH_BITS;
inputbits >>= CROSSFIRE_CH_BITS;
}
trainerResetTimer();
}
break;
case LINK_RX_ID:
if (getCrossfireTelemetryValue<1>(4, value, rxBuffer))
processCrossfireTelemetryValue(RX_RSSI_PERC_INDEX, value);