2929#define VOLT_MIN_CRSFRATE 5000
3030#define AIRSPEED_MIN_CRSFRATE 5000
3131
32+ constexpr uint8_t SIZE_8BIT = 1 ;
33+ constexpr uint8_t SIZE_16BIT = 2 ;
34+ constexpr uint8_t SIZE_24BIT = 3 ;
35+
3236extern Telemetry telemetry;
3337
3438SerialHoTT_TLM::SerialHoTT_TLM (Stream &out, Stream &in, const int8_t serial1TXpin)
@@ -265,6 +269,8 @@ void SerialHoTT_TLM::scheduleCRSFtelemetry(uint32_t now)
265269 else if (device[ESC].present )
266270 {
267271 deviceToUse = ESC;
272+
273+ escIsTurbine = esc.version == TURBINE_PROTOCOL;
268274 }
269275
270276 sendCRSFrpm (now, deviceToUse);
@@ -348,13 +354,13 @@ void SerialHoTT_TLM::sendCRSFrpm(uint32_t now, HoTTDevices device)
348354
349355 crsfRpm.p .source_id = device;
350356
351- uint8_t payloadSize = 1 + 2 * 3 ;
357+ uint8_t payloadSize = SIZE_8BIT + SIZE_24BIT * 2 ;
352358
353359 if (device == EAM)
354360 {
355361 crsfRpm.p .rpm0 = htobe24 (eam.rpm * HOTT_RPM_SCALE);
356362
357- payloadSize = 1 + 3 ;
363+ payloadSize = SIZE_8BIT + SIZE_24BIT * 1 ;
358364 }
359365 else if (device == GAM)
360366 {
@@ -363,8 +369,16 @@ void SerialHoTT_TLM::sendCRSFrpm(uint32_t now, HoTTDevices device)
363369 }
364370 else if (device == ESC)
365371 {
366- crsfRpm.p .rpm0 = htobe24 (esc.rpm * HOTT_RPM_SCALE);
372+ crsfRpm.p .rpm0 = htobe24 (esc.rpm * HOTT_RPM_SCALE); // turbine: RPM
367373 crsfRpm.p .rpm1 = htobe24 (esc.rpmMax * HOTT_RPM_SCALE);
374+
375+ if (escIsTurbine)
376+ {
377+ crsfRpm.p .rpm2 = htobe24 ((esc.becTemp + (esc.capacitorTemp << 8 ))); // turbine: fuel in ml
378+ crsfRpm.p .rpm3 = htobe24 (esc.becCurrent ); // turbine: fuel flow in ml/min
379+
380+ payloadSize += SIZE_8BIT + SIZE_24BIT * 2 ;
381+ }
368382 }
369383
370384 crsfRouter.SetHeaderAndCrc ((crsf_header_t *)&crsfRpm, CRSF_FRAMETYPE_RPM, CRSF_FRAME_SIZE (payloadSize), CRSF_ADDRESS_RADIO_TRANSMITTER);
@@ -389,7 +403,7 @@ void SerialHoTT_TLM::sendCRSFtemp(uint32_t now, HoTTDevices device)
389403
390404 crsfTemp.p .source_id = device;
391405
392- uint8_t payloadSize = 1 + 2 * 2 ;
406+ uint8_t payloadSize = SIZE_8BIT + SIZE_16BIT * 2 ;
393407
394408 if (device == EAM)
395409 {
@@ -405,11 +419,19 @@ void SerialHoTT_TLM::sendCRSFtemp(uint32_t now, HoTTDevices device)
405419 {
406420 crsfTemp.p .temperature [0 ] = htobe16 ((esc.escTemp - HOTT_TEMP_OFFSET) * HOTT_TEMP_SCALE);
407421 crsfTemp.p .temperature [1 ] = htobe16 ((esc.becTemp - HOTT_TEMP_OFFSET) * HOTT_TEMP_SCALE);
408- crsfTemp.p .temperature [2 ] = htobe16 ((esc.motorTemp - HOTT_TEMP_OFFSET) * HOTT_TEMP_SCALE);
422+ crsfTemp.p .temperature [2 ] = htobe16 ((esc.motorTemp - HOTT_TEMP_OFFSET) * HOTT_TEMP_SCALE); // turbine: EGT
409423 crsfTemp.p .temperature [3 ] = htobe16 ((esc.pumpTemp - HOTT_TEMP_OFFSET) * HOTT_TEMP_SCALE);
410424 crsfTemp.p .temperature [4 ] = htobe16 ((esc.auxTemp - HOTT_TEMP_OFFSET) * HOTT_TEMP_SCALE);
411425
412- payloadSize = 1 + 2 * 5 ;
426+ payloadSize = SIZE_8BIT + SIZE_16BIT * 5 ;
427+
428+ if (escIsTurbine)
429+ {
430+ crsfTemp.p .temperature [5 ] = htobe16 ((esc.throttle ) * HOTT_TEMP_SCALE); // turbine: throttle %
431+ crsfTemp.p .temperature [6 ] = htobe16 (((int8_t )esc.turbineNumber ) * HOTT_TEMP_SCALE); // turbine: status
432+
433+ payloadSize += SIZE_8BIT + SIZE_16BIT * 2 ;
434+ }
413435 }
414436
415437 crsfRouter.SetHeaderAndCrc ((crsf_header_t *)&crsfTemp, CRSF_FRAMETYPE_TEMP, CRSF_FRAME_SIZE (payloadSize), CRSF_ADDRESS_RADIO_TRANSMITTER);
@@ -437,7 +459,7 @@ void SerialHoTT_TLM::sendCRSFcells(uint32_t now, HoTTDevices device)
437459
438460 crsfCells.p .source_id = device;
439461
440- uint8_t payloadSize = 1 + 14 * 2 ;
462+ uint8_t payloadSize = SIZE_8BIT + SIZE_16BIT * 14 ;
441463
442464 if (device == EAM)
443465 {
@@ -466,7 +488,7 @@ void SerialHoTT_TLM::sendCRSFcells(uint32_t now, HoTTDevices device)
466488 crsfCells.p .cell [4 ] = htobe16 (gam.voltageCell5 * HOTT_CELL_SCALE);
467489 crsfCells.p .cell [5 ] = htobe16 (gam.voltageCell6 * HOTT_CELL_SCALE);
468490
469- payloadSize = 1 + 6 * 2 ;
491+ payloadSize = SIZE_8BIT + SIZE_16BIT * 6 ;
470492 }
471493
472494 crsfRouter.SetHeaderAndCrc ((crsf_header_t *)&crsfCells, CRSF_FRAMETYPE_CELLS, CRSF_FRAME_SIZE (payloadSize), CRSF_ADDRESS_RADIO_TRANSMITTER);
@@ -491,7 +513,7 @@ void SerialHoTT_TLM::sendCRSFvolt(uint32_t now, HoTTDevices device)
491513
492514 crsfVolt.p .source_id = 128 + device;
493515
494- uint8_t payloadSize = 1 + 2 * 3 ;
516+ uint8_t payloadSize = SIZE_8BIT + SIZE_16BIT * 3 ;
495517
496518 if (device == EAM)
497519 {
@@ -507,10 +529,10 @@ void SerialHoTT_TLM::sendCRSFvolt(uint32_t now, HoTTDevices device)
507529 }
508530 else if (device == ESC)
509531 {
510- crsfVolt.p .cell [0 ] = htobe16 (esc.inputVoltage * HOTT_VOLT_SCALE);
511- crsfVolt.p .cell [1 ] = htobe16 (esc.becVoltage * HOTT_VOLT_SCALE);
532+ crsfVolt.p .cell [0 ] = htobe16 (esc.inputVoltage * HOTT_VOLT_SCALE); // turbine: ECU voltage
533+ crsfVolt.p .cell [1 ] = htobe16 (esc.becVoltage * HOTT_VOLT_SCALE); // turbine: pumpV or pumpPW depending on turbine
512534
513- payloadSize = 1 + 2 * 2 ;
535+ payloadSize = SIZE_8BIT + SIZE_16BIT * 2 ;
514536 }
515537
516538 crsfRouter.SetHeaderAndCrc ((crsf_header_t *)&crsfVolt, CRSF_FRAMETYPE_CELLS, CRSF_FRAME_SIZE (payloadSize), CRSF_ADDRESS_RADIO_TRANSMITTER);
0 commit comments