Skip to content

Commit e08ddb0

Browse files
authored
HoTT TLM / Support VSpeak turbine protocol (#3382)
* initial commit * fix overflow * update for fuel in ml * Support HoTT turbine protocol, detects ESC and turbine protocol * cleanup * changed EGT back to 8bit to maintain comaptibility with Graupner radios * update to VSpeak/ELRS telemetry spec V1.0 * cleanup * updated source for pumpV/pumpPW due to VSpeak spec change * deleted redundant code * review comments * code cleanup * code cleanup
1 parent 83893fe commit e08ddb0

File tree

2 files changed

+209
-183
lines changed

2 files changed

+209
-183
lines changed

src/src/rx-serial/SerialHoTT_TLM.cpp

Lines changed: 34 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@
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+
3236
extern Telemetry telemetry;
3337

3438
SerialHoTT_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

Comments
 (0)