@@ -63,6 +63,10 @@ const CrossfireSensor crossfireSensors[] = {
63
63
CS (FLIGHT_MODE_ID, 0 , STR_SENSOR_FLIGHT_MODE, UNIT_TEXT, 0 ),
64
64
CS (CF_VARIO_ID, 0 , STR_SENSOR_VSPD, UNIT_METERS_PER_SECOND, 2 ),
65
65
CS (BARO_ALT_ID, 0 , STR_SENSOR_ALT, UNIT_METERS, 2 ),
66
+ CS (AIRSPEED_ID, 0 , STR_SENSOR_ASPD, UNIT_KMH, 1 ),
67
+ CS (CF_RPM_ID, 0 , STR_SENSOR_RPM, UNIT_RPMS, 0 ),
68
+ CS (TEMP_ID, 0 , STR_SENSOR_TEMP, UNIT_DEGREE, 1 ),
69
+ CS (CELLS_ID, 0 , STR_SENSOR_CELLS, UNIT_CELLS, 2 ),
66
70
CS (0 , 0 , " UNKNOWN" , UNIT_RAW, 0 ),
67
71
};
68
72
// clang-format on
@@ -89,6 +93,14 @@ const CrossfireSensor & getCrossfireSensor(uint8_t id, uint8_t subId)
89
93
return crossfireSensors[FLIGHT_MODE_INDEX];
90
94
else if (id == BARO_ALT_ID)
91
95
return crossfireSensors[BARO_ALTITUDE_INDEX];
96
+ else if (id == AIRSPEED_ID)
97
+ return crossfireSensors[AIRSPEED_INDEX];
98
+ else if (id == CF_RPM_ID)
99
+ return crossfireSensors[CF_RPM_INDEX];
100
+ else if (id == TEMP_ID)
101
+ return crossfireSensors[TEMP_INDEX];
102
+ else if (id == CELLS_ID)
103
+ return crossfireSensors[CELLS_INDEX];
92
104
else
93
105
return crossfireSensors[UNKNOWN_INDEX];
94
106
}
@@ -172,6 +184,55 @@ void processCrossfireTelemetryFrame(uint8_t module, uint8_t* rxBuffer,
172
184
processCrossfireTelemetryValue (VERTICAL_SPEED_INDEX, value);
173
185
break ;
174
186
187
+ case AIRSPEED_ID:
188
+ if (getCrossfireTelemetryValue<2 >(3 , value, rxBuffer)) {
189
+ // Airspeed in 0.1 * km/h (hectometers/h)
190
+ // Converstion to KMH is done through PREC1
191
+ processCrossfireTelemetryValue (AIRSPEED_INDEX, value);
192
+ }
193
+ break ;
194
+
195
+ case CF_RPM_ID:
196
+ {
197
+ getCrossfireTelemetryValue<1 >(3 , value, rxBuffer);
198
+ uint8_t sensorID = value;
199
+ for (uint8_t i = 0 ; i * 3 < (crsfPayloadLen - 4 ); i++) {
200
+ getCrossfireTelemetryValue<3 >(4 + i * 3 , value, rxBuffer);
201
+ const CrossfireSensor & sensor = crossfireSensors[CF_RPM_INDEX];
202
+ setTelemetryValue (PROTOCOL_TELEMETRY_CROSSFIRE, sensor.id + (sensorID << 8 ), 0 , i,
203
+ value, sensor.unit , sensor.precision );
204
+ }
205
+ break ;
206
+ }
207
+
208
+ case TEMP_ID:
209
+ {
210
+ getCrossfireTelemetryValue<1 >(3 , value, rxBuffer);
211
+ uint8_t sensorID = value;
212
+ for (uint8_t i = 0 ; i * 2 < (crsfPayloadLen - 4 ); i++) {
213
+ getCrossfireTelemetryValue<2 >(4 + i * 2 , value, rxBuffer);
214
+ const CrossfireSensor & sensor = crossfireSensors[TEMP_INDEX];
215
+ setTelemetryValue (PROTOCOL_TELEMETRY_CROSSFIRE, sensor.id + (sensorID << 8 ), 0 , i,
216
+ value, sensor.unit , sensor.precision );
217
+ }
218
+ break ;
219
+ }
220
+
221
+ case CELLS_ID:
222
+ {
223
+ getCrossfireTelemetryValue<1 >(3 , value, rxBuffer);
224
+ uint8_t sensorID = value;
225
+
226
+ // We can handle only up to 8 cells
227
+ for (uint8_t i = 0 ; i * 2 < min (16 , crsfPayloadLen - 4 ); i++) {
228
+ getCrossfireTelemetryValue<2 >(4 + i * 2 , value, rxBuffer);
229
+ const CrossfireSensor & sensor = crossfireSensors[CELLS_INDEX];
230
+ setTelemetryValue (PROTOCOL_TELEMETRY_CROSSFIRE, sensor.id + (sensorID << 8 ), 0 , 0 ,
231
+ i << 16 | value / 10 , sensor.unit , sensor.precision );
232
+ }
233
+ break ;
234
+ }
235
+
175
236
case LINK_ID:
176
237
for (unsigned int i=0 ; i<=TX_SNR_INDEX; i++) {
177
238
if (getCrossfireTelemetryValue<1 >(3 +i, value, rxBuffer)) {
@@ -318,7 +379,7 @@ void processCrossfireTelemetryFrame(uint8_t module, uint8_t* rxBuffer,
318
379
}
319
380
}
320
381
321
- void crossfireSetDefault (int index, uint8_t id, uint8_t subId)
382
+ void crossfireSetDefault (int index, uint16_t id, uint8_t subId)
322
383
{
323
384
TelemetrySensor & telemetrySensor = g_model.telemetrySensors [index ];
324
385
0 commit comments