feat(telem): add support for latest CRSF/ELRS sensor definition (#6274)

This commit is contained in:
3djc
2025-05-25 13:14:29 +10:00
committed by GitHub
parent 878e3b8951
commit a0aec17d66
5 changed files with 74 additions and 22 deletions
+62 -1
View File
@@ -63,6 +63,10 @@ const CrossfireSensor crossfireSensors[] = {
CS(FLIGHT_MODE_ID, 0, STR_SENSOR_FLIGHT_MODE, UNIT_TEXT, 0),
CS(CF_VARIO_ID, 0, STR_SENSOR_VSPD, UNIT_METERS_PER_SECOND, 2),
CS(BARO_ALT_ID, 0, STR_SENSOR_ALT, UNIT_METERS, 2),
CS(AIRSPEED_ID, 0, STR_SENSOR_ASPD, UNIT_KMH, 1),
CS(CF_RPM_ID, 0, STR_SENSOR_RPM, UNIT_RPMS, 0),
CS(TEMP_ID, 0, STR_SENSOR_TEMP, UNIT_DEGREE, 1),
CS(CELLS_ID, 0, STR_SENSOR_CELLS, UNIT_CELLS, 2),
CS(0, 0, "UNKNOWN", UNIT_RAW, 0),
};
// clang-format on
@@ -89,6 +93,14 @@ const CrossfireSensor & getCrossfireSensor(uint8_t id, uint8_t subId)
return crossfireSensors[FLIGHT_MODE_INDEX];
else if (id == BARO_ALT_ID)
return crossfireSensors[BARO_ALTITUDE_INDEX];
else if (id == AIRSPEED_ID)
return crossfireSensors[AIRSPEED_INDEX];
else if (id == CF_RPM_ID)
return crossfireSensors[CF_RPM_INDEX];
else if (id == TEMP_ID)
return crossfireSensors[TEMP_INDEX];
else if (id == CELLS_ID)
return crossfireSensors[CELLS_INDEX];
else
return crossfireSensors[UNKNOWN_INDEX];
}
@@ -172,6 +184,55 @@ void processCrossfireTelemetryFrame(uint8_t module, uint8_t* rxBuffer,
processCrossfireTelemetryValue(VERTICAL_SPEED_INDEX, value);
break;
case AIRSPEED_ID:
if (getCrossfireTelemetryValue<2>(3, value, rxBuffer)) {
// Airspeed in 0.1 * km/h (hectometers/h)
// Converstion to KMH is done through PREC1
processCrossfireTelemetryValue(AIRSPEED_INDEX, value);
}
break;
case CF_RPM_ID:
{
getCrossfireTelemetryValue<1>(3, value, rxBuffer);
uint8_t sensorID = value;
for(uint8_t i = 0; i * 3 < (crsfPayloadLen - 4); i++) {
getCrossfireTelemetryValue<3>(4 + i * 3, value, rxBuffer);
const CrossfireSensor & sensor = crossfireSensors[CF_RPM_INDEX];
setTelemetryValue(PROTOCOL_TELEMETRY_CROSSFIRE, sensor.id + (sensorID << 8), 0, i,
value, sensor.unit, sensor.precision);
}
break;
}
case TEMP_ID:
{
getCrossfireTelemetryValue<1>(3, value, rxBuffer);
uint8_t sensorID = value;
for(uint8_t i = 0; i * 2 < (crsfPayloadLen - 4); i++) {
getCrossfireTelemetryValue<2>(4 + i * 2, value, rxBuffer);
const CrossfireSensor & sensor = crossfireSensors[TEMP_INDEX];
setTelemetryValue(PROTOCOL_TELEMETRY_CROSSFIRE, sensor.id + (sensorID << 8), 0, i,
value, sensor.unit, sensor.precision);
}
break;
}
case CELLS_ID:
{
getCrossfireTelemetryValue<1>(3, value, rxBuffer);
uint8_t sensorID = value;
// We can handle only up to 8 cells
for(uint8_t i = 0; i * 2 < min(16, crsfPayloadLen - 4); i++) {
getCrossfireTelemetryValue<2>(4 + i * 2, value, rxBuffer);
const CrossfireSensor & sensor = crossfireSensors[CELLS_INDEX];
setTelemetryValue(PROTOCOL_TELEMETRY_CROSSFIRE, sensor.id + (sensorID << 8), 0, 0,
i << 16 | value / 10, sensor.unit, sensor.precision);
}
break;
}
case LINK_ID:
for (unsigned int i=0; i<=TX_SNR_INDEX; i++) {
if (getCrossfireTelemetryValue<1>(3+i, value, rxBuffer)) {
@@ -318,7 +379,7 @@ void processCrossfireTelemetryFrame(uint8_t module, uint8_t* rxBuffer,
}
}
void crossfireSetDefault(int index, uint8_t id, uint8_t subId)
void crossfireSetDefault(int index, uint16_t id, uint8_t subId)
{
TelemetrySensor & telemetrySensor = g_model.telemetrySensors[index];