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:
@@ -113,6 +113,7 @@ static const YamlLookupTable trainerModeLut = {
|
||||
{ TRAINER_MODE_MASTER_BLUETOOTH, "MASTER_BT" },
|
||||
{ TRAINER_MODE_SLAVE_BLUETOOTH, "SLAVE_BT" },
|
||||
{ TRAINER_MODE_MULTI, "MASTER_MULTI" },
|
||||
{ TRAINER_MODE_CRSF, "MASTER_CRSF" },
|
||||
};
|
||||
|
||||
static const YamlLookupTable swashTypeLut = {
|
||||
|
||||
@@ -1634,6 +1634,8 @@ QString ModelData::trainerModeToString(int value)
|
||||
return tr("Slave/Bluetooth");
|
||||
case TRAINER_MODE_MULTI:
|
||||
return tr("Master/Multi");
|
||||
case TRAINER_MODE_CRSF:
|
||||
return tr("Master/CRSF");
|
||||
default:
|
||||
return CPN_STR_UNKNOWN_ITEM;
|
||||
}
|
||||
|
||||
@@ -83,7 +83,8 @@ enum TrainerMode {
|
||||
TRAINER_MODE_MASTER_BLUETOOTH,
|
||||
TRAINER_MODE_SLAVE_BLUETOOTH,
|
||||
TRAINER_MODE_MULTI,
|
||||
TRAINER_MODE_LAST = TRAINER_MODE_MULTI
|
||||
TRAINER_MODE_CRSF,
|
||||
TRAINER_MODE_LAST = TRAINER_MODE_CRSF
|
||||
};
|
||||
|
||||
#define MODEL_NAME_LEN 15
|
||||
|
||||
@@ -206,10 +206,11 @@ enum TrainerMode {
|
||||
TRAINER_MODE_MASTER_BLUETOOTH,
|
||||
TRAINER_MODE_SLAVE_BLUETOOTH,
|
||||
TRAINER_MODE_MULTI,
|
||||
TRAINER_MODE_CRSF,
|
||||
};
|
||||
|
||||
#define TRAINER_MODE_MIN() TRAINER_MODE_OFF
|
||||
#define TRAINER_MODE_MAX() TRAINER_MODE_MULTI
|
||||
#define TRAINER_MODE_MAX() TRAINER_MODE_CRSF
|
||||
|
||||
enum SerialPort {
|
||||
SP_AUX1=0,
|
||||
|
||||
@@ -1101,6 +1101,18 @@ bool isTrainerModeAvailable(int mode)
|
||||
#endif
|
||||
}
|
||||
|
||||
if (mode == TRAINER_MODE_CRSF) {
|
||||
|
||||
#if !defined(CROSSFIRE)
|
||||
return false;
|
||||
#else
|
||||
if ((!IS_INTERNAL_MODULE_ENABLED() && !IS_EXTERNAL_MODULE_ENABLED()) ||
|
||||
(!(isModuleELRS(INTERNAL_MODULE) && CRSF_ELRS_MIN_VER(INTERNAL_MODULE, 4, 0)) &&
|
||||
!(isModuleELRS(EXTERNAL_MODULE) && CRSF_ELRS_MIN_VER(EXTERNAL_MODULE, 4, 0))))
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -1329,6 +1329,7 @@ static const struct YamlIdStr enum_TrainerMode[] = {
|
||||
{ TRAINER_MODE_MASTER_BLUETOOTH, "MASTER_BT" },
|
||||
{ TRAINER_MODE_SLAVE_BLUETOOTH, "SLAVE_BT" },
|
||||
{ TRAINER_MODE_MULTI, "MASTER_MULTI" },
|
||||
{ TRAINER_MODE_CRSF, "MASTER_CRSF" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -158,8 +158,9 @@ const uint8_t CROSSFIRE_FRAME_PERIODS[] = {
|
||||
|
||||
#define CRSF_ELRS_MIN_VER(moduleIdx, maj, min) \
|
||||
(crossfireModuleStatus[moduleIdx].isELRS \
|
||||
&& crossfireModuleStatus[moduleIdx].major >= maj \
|
||||
&& crossfireModuleStatus[moduleIdx].minor >= min)
|
||||
&& (crossfireModuleStatus[moduleIdx].major > maj \
|
||||
|| (crossfireModuleStatus[moduleIdx].major == maj \
|
||||
&& crossfireModuleStatus[moduleIdx].minor >= min)))
|
||||
|
||||
#if defined(HARDWARE_INTERNAL_MODULE)
|
||||
#define INT_CROSSFIRE_BR_IDX CROSSFIRE_STORE_TO_INDEX(g_eeGeneral.internalModuleBaudrate)
|
||||
|
||||
@@ -211,6 +211,7 @@
|
||||
#define TR_VTRAINER_MASTER_BATTERY "教练主机/串口"
|
||||
#define TR_VTRAINER_BLUETOOTH "教练主机/蓝牙","教练从机/蓝牙"
|
||||
#define TR_VTRAINER_MULTI "教练主机/多协议"
|
||||
#define TR_VTRAINER_CRSF "教练主机/CRSF"
|
||||
#define TR_VFAILSAFE "未设置","失控保持","自定义","无脉冲","接收机"
|
||||
#define TR_VSENSORTYPES "自定义","运算"
|
||||
#define TR_VFORMULAS "加","平均值","最小值","最大值","乘","总计值","单节电池","消耗量","距离"
|
||||
|
||||
@@ -221,6 +221,7 @@
|
||||
#define TR_VTRAINER_MASTER_BATTERY "Učitel/Serial"
|
||||
#define TR_VTRAINER_BLUETOOTH TR("Učitel/BT","Učitel/Bluetooth"),TR("Žák/BT","Žák/Bluetooth")
|
||||
#define TR_VTRAINER_MULTI "Master/Multi"
|
||||
#define TR_VTRAINER_CRSF "Master/CRSF"
|
||||
#define TR_VFAILSAFE "Nenastaven","Držet","Vlastní","Bez pulzů","Přijímač"
|
||||
#define TR_VSENSORTYPES "Vlastní","Vypočtený"
|
||||
#define TR_VFORMULAS "Součet","Průměr","Min","Max","Násobení","Celkem","Článek","Spotřeba","Vzdálenost"
|
||||
|
||||
@@ -217,6 +217,7 @@
|
||||
#define TR_VTRAINER_MASTER_BATTERY "Træner/Seriel"
|
||||
#define TR_VTRAINER_BLUETOOTH "Træner/" TR("BT","Bluetooth"), "Elev/" TR("BT","Bluetooth")
|
||||
#define TR_VTRAINER_MULTI "Træner/Multi"
|
||||
#define TR_VTRAINER_CRSF "Træner/CRSF"
|
||||
#define TR_VFAILSAFE "Ikke sat","Hold","Tilpasset","Ingen puls","Modtager"
|
||||
#define TR_VSENSORTYPES "Tilpasset","Beregnet"
|
||||
#define TR_VFORMULAS "Tillæg","Gennems.","Min","Max","Gange","Sum","Cell","Forbrug","Afstand"
|
||||
|
||||
@@ -212,6 +212,7 @@
|
||||
#define TR_VTRAINER_MASTER_BATTERY "Lehrer/Serial"
|
||||
#define TR_VTRAINER_BLUETOOTH TR("Lehrer/BT","Lehrer/Bluetooth"),TR("Schüler/BT","Schüler/Bluetooth")
|
||||
#define TR_VTRAINER_MULTI "Lehrer/Multi"
|
||||
#define TR_VTRAINER_CRSF "Lehrer/CRSF"
|
||||
#define TR_VFAILSAFE "Kein Failsafe","Halte Pos.","Kanäle","Kein Signal","Empfänger"
|
||||
#define TR_VSENSORTYPES "Sensor","Berechnung"
|
||||
#define TR_VFORMULAS "Addieren","Mittelwert","Min","Max","Multiplizier","Gesamt","Zelle","Verbrauch","Distanz"
|
||||
|
||||
@@ -214,6 +214,7 @@
|
||||
#define TR_VTRAINER_MASTER_BATTERY "Master/Serial"
|
||||
#define TR_VTRAINER_BLUETOOTH "Master/" TR("BT","Bluetooth"), "Slave/" TR("BT","Bluetooth")
|
||||
#define TR_VTRAINER_MULTI "Master/Multi"
|
||||
#define TR_VTRAINER_CRSF "Master/CRSF"
|
||||
#define TR_VFAILSAFE "Not set","Hold","Custom","No pulses","Receiver"
|
||||
#define TR_VSENSORTYPES "Custom","Calculated"
|
||||
#define TR_VFORMULAS "Add","Average","Min","Max","Multiply","Totalize","Cell","Consumpt","Distance"
|
||||
|
||||
@@ -210,6 +210,7 @@
|
||||
#define TR_VTRAINER_MASTER_BATTERY "Master/Serie"
|
||||
#define TR_VTRAINER_BLUETOOTH TR("Master/BT","Master/Bluetooth"),TR("Esclavo/BT","Esclavo/Bluetooth")
|
||||
#define TR_VTRAINER_MULTI "Master/Multi"
|
||||
#define TR_VTRAINER_CRSF "Master/CRSF"
|
||||
#define TR_VFAILSAFE "No","Hold","Custom","No pulsos","Receptor"
|
||||
#define TR_VSENSORTYPES "Custom","Calculado"
|
||||
#define TR_VFORMULAS "Suma","Media","Min","Máx","Multipl.","Total","Cell","Consumo","Distancia"
|
||||
|
||||
@@ -219,6 +219,7 @@
|
||||
#define TR_VTRAINER_MASTER_BATTERY "Master/Serial"
|
||||
#define TR_VTRAINER_BLUETOOTH TR("Master/BT","Master/Bluetooth"),TR("Slave/BT","Slave/Bluetooth")
|
||||
#define TR_VTRAINER_MULTI "Master/Multi"
|
||||
#define TR_VTRAINER_CRSF "Master/CRSF"
|
||||
#define TR_VFAILSAFE "Not set","Hold","Custom","No pulses","Receiver"
|
||||
#define TR_VSENSORTYPES "Custom","Calculated"
|
||||
#define TR_VFORMULAS "Add","Average","Min","Max","Multiply","Totalize","Cell","Kulutus","Etäisyys"
|
||||
|
||||
@@ -217,6 +217,7 @@
|
||||
#define TR_VTRAINER_MASTER_BATTERY "Maître/Série"
|
||||
#define TR_VTRAINER_BLUETOOTH TR("Maître/BT","Maître/Bluetooth"),TR("Élève/BT","Élève/Bluetooth")
|
||||
#define TR_VTRAINER_MULTI "Maître/Multi"
|
||||
#define TR_VTRAINER_CRSF "Maître/CRSF"
|
||||
#define TR_VFAILSAFE "Pas déf.","Maintien",TR("Prédéf.","Prédéfini"),"Pas d'imp","Récepteur"
|
||||
#define TR_VSENSORTYPES "Perso","Calculé"
|
||||
#define TR_VFORMULAS "Addition","Moyenne","Min","Max","Multipl.","Totalise","Élém.","Consomm.","Distance"
|
||||
|
||||
@@ -218,6 +218,7 @@
|
||||
#define TR_VTRAINER_MASTER_BATTERY "Master/Serial"
|
||||
#define TR_VTRAINER_BLUETOOTH "Master/" TR("BT","Bluetooth"), "Slave/" TR("BT","Bluetooth")
|
||||
#define TR_VTRAINER_MULTI "Master/Multi"
|
||||
#define TR_VTRAINER_CRSF "Master/CRSF"
|
||||
#define TR_VFAILSAFE "לא מוגדר","מוחזק","הגדרה ידנית - מומלץ!","ללא שינוי","מקלט"
|
||||
#define TR_VSENSORTYPES "Custom","Calculated"
|
||||
#define TR_VFORMULAS "Add","Average","Min","Max","Multiply","Totalize","Cell","Consumpt","Distance"
|
||||
|
||||
@@ -214,6 +214,7 @@
|
||||
#define TR_VTRAINER_MASTER_BATTERY "Master/Seriale"
|
||||
#define TR_VTRAINER_BLUETOOTH "Master/" TR("BT","Bluetooth"), "Slave/" TR("BT","Bluetooth")
|
||||
#define TR_VTRAINER_MULTI "Master/Multi"
|
||||
#define TR_VTRAINER_CRSF "Master/CRSF"
|
||||
#define TR_VFAILSAFE "Non settato","Mantieni","Personali","No impulsi","Ricevente"
|
||||
#define TR_VSENSORTYPES "Person.","Calcolato"
|
||||
#define TR_VFORMULAS "Somma","Media","Min","Max","Moltipl","Totalizza","Cella","Consumo","Distanza"
|
||||
|
||||
@@ -213,6 +213,7 @@
|
||||
#define TR_VTRAINER_MASTER_BATTERY "マスター/シリアル"
|
||||
#define TR_VTRAINER_BLUETOOTH "マスター/" TR("BT","Bluetooth"), "スレーブ/" TR("BT","Bluetooth")
|
||||
#define TR_VTRAINER_MULTI "マスター/Multi"
|
||||
#define TR_VTRAINER_CRSF "マスター/CRSF"
|
||||
#define TR_VFAILSAFE "設定なし","ホールド","カスタム","信号なし","受信機"
|
||||
#define TR_VSENSORTYPES "カスタム","演算"
|
||||
#define TR_VFORMULAS "加算値","平均値","最小値","最大値","乗算値","合計値","セル","消費量","距離"
|
||||
|
||||
@@ -211,6 +211,7 @@
|
||||
#define TR_VTRAINER_MASTER_BATTERY "Master/Serial"
|
||||
#define TR_VTRAINER_BLUETOOTH "Master/" TR("BT","Bluetooth"), "Slave/" TR("BT","Bluetooth")
|
||||
#define TR_VTRAINER_MULTI "Master/Multi"
|
||||
#define TR_VTRAINER_CRSF "Master/CRSF"
|
||||
#define TR_VFAILSAFE "Niet Gezet","Vasthouden","Custom","Geen Pulsen","Ontvanger"
|
||||
#define TR_VSENSORTYPES "Custom","Berekend"
|
||||
#define TR_VFORMULAS "Optellen","Gemiddeld","Min","Max","Vermenigvuld","Totaal","Cellen","Verbruik","Afstand"
|
||||
|
||||
@@ -210,6 +210,7 @@
|
||||
#define TR_VTRAINER_MASTER_BATTERY "Trener/Serial"
|
||||
#define TR_VTRAINER_BLUETOOTH "Master/" TR("BT","Bluetooth"), "Slave/" TR("BT","Bluetooth")
|
||||
#define TR_VTRAINER_MULTI "Master/Multi"
|
||||
#define TR_VTRAINER_CRSF "Master/CRSF"
|
||||
#define TR_VFAILSAFE "Brak","Utrzymuj","Własne","0 sygnału","Odbiornik"
|
||||
#define TR_VSENSORTYPES "Użytkownik","Obliczone"
|
||||
#define TR_VFORMULAS "Dodaj","Średnie","Min","Max","Mnóż","Zliczani","Komórka","Zużycie","Zasięg"
|
||||
|
||||
@@ -217,6 +217,7 @@
|
||||
#define TR_VTRAINER_MASTER_BATTERY "Mestre/Serial"
|
||||
#define TR_VTRAINER_BLUETOOTH "Mestre/" TR("BT","Bluetooth"), "Escrv/" TR("BT","Bluetooth")
|
||||
#define TR_VTRAINER_MULTI "Mestre/Multi"
|
||||
#define TR_VTRAINER_CRSF "Mestre/CRSF"
|
||||
#define TR_VFAILSAFE "Nao def","Manter","Custom","Sem Pulsos","Receptor"
|
||||
#define TR_VSENSORTYPES "Custom","Calculado"
|
||||
#define TR_VFORMULAS "Soma","Média","Min","Max","Multipl","Totalizar","Cell","Consumido","Distâcia"
|
||||
|
||||
@@ -216,6 +216,7 @@
|
||||
#define TR_VTRAINER_MASTER_BATTERY "Мастер/Серийный"
|
||||
#define TR_VTRAINER_BLUETOOTH "Мастер/" TR("BT","Bluetooth"), "Раб/" TR("BT","Bluetooth")
|
||||
#define TR_VTRAINER_MULTI "Мастер/Мульти"
|
||||
#define TR_VTRAINER_CRSF "Мастер/CRSF"
|
||||
#define TR_VFAILSAFE "Не устан","Удерж","Настр","Нет импул","Прием"
|
||||
#define TR_VSENSORTYPES "Настроен","Рассчитан"
|
||||
#define TR_VFORMULAS "Добав","Средн","Мин","Макс","Умнож","Суммир","Ячейка","Расх","Дист"
|
||||
|
||||
@@ -224,6 +224,7 @@
|
||||
#define TR_VTRAINER_MASTER_BATTERY "Lärare/Seriell"
|
||||
#define TR_VTRAINER_BLUETOOTH TR("Lärare/BT","Lärare/Bluetooth"),TR("Elev/BT","Elev/Bluetooth")
|
||||
#define TR_VTRAINER_MULTI "Lärare/Multi"
|
||||
#define TR_VTRAINER_CRSF "Lärare/CRSF"
|
||||
|
||||
#define TR_VFAILSAFE "Ej inställt","Lås senaste",TR("Eget","Egna värden"),"Inga pulser","Mottagare"
|
||||
#define TR_VSENSORTYPES "Anpassad","Beräknad"
|
||||
|
||||
@@ -216,6 +216,7 @@
|
||||
#define TR_VTRAINER_MASTER_BATTERY "教練主機/端口"
|
||||
#define TR_VTRAINER_BLUETOOTH "教練主機/藍牙","教練從機/藍牙"
|
||||
#define TR_VTRAINER_MULTI "教練主機/多協議"
|
||||
#define TR_VTRAINER_CRSF "教練主機/CRSF"
|
||||
#define TR_VFAILSAFE "未設置","失控保持","自定義","無脈衝", "接收機"
|
||||
#define TR_VSENSORTYPES "自定義","運算"
|
||||
#define TR_VFORMULAS "加","平均值","最小值","最大值","乘","總計值","單節電池","消耗量","距離"
|
||||
|
||||
@@ -216,6 +216,7 @@
|
||||
#define TR_VTRAINER_MASTER_BATTERY "Майстер/Послід."
|
||||
#define TR_VTRAINER_BLUETOOTH "Майстер/" TR("BT","Bluetooth"), "Слейв/" TR("BT","Bluetooth") /* for untranslated - use english */
|
||||
#define TR_VTRAINER_MULTI "Майстер/Мульти"
|
||||
#define TR_VTRAINER_CRSF "Майстер/CRSF"
|
||||
#define TR_VFAILSAFE "Не встан.","Тримай","Корист.","Немає імпульсу","Приймач"
|
||||
#define TR_VSENSORTYPES "Корист.","Обчислено"
|
||||
#define TR_VFORMULAS "Дод.","Середн.","Min","Max","Множ.","Сума","Комірка","Витрата","Дистанц."
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
#define TR_VTRAINERMODES \
|
||||
TR_VTRAINER_MASTER_OFF, TR_VTRAINER_MASTER_JACK, TR_VTRAINER_SLAVE_JACK, \
|
||||
TR_VTRAINER_MASTER_SBUS_MODULE, TR_VTRAINER_MASTER_CPPM_MODULE, \
|
||||
TR_VTRAINER_MASTER_BATTERY, TR_VTRAINER_BLUETOOTH, TR_VTRAINER_MULTI
|
||||
TR_VTRAINER_MASTER_BATTERY, TR_VTRAINER_BLUETOOTH, TR_VTRAINER_MULTI, TR_VTRAINER_CRSF
|
||||
|
||||
#if defined(PCBHORUS)
|
||||
#define TR_SM_VSRCRAW "smA","smB","smC","smD","smE","smF",
|
||||
|
||||
Reference in New Issue
Block a user