feat: Add trainer virtual switch (#3937)
Co-authored-by: Peter Feerick <peter.feerick@gmail.com>
This commit is contained in:
@@ -167,6 +167,7 @@ RawSwitchItemModel::RawSwitchItemModel(const GeneralSettings * const generalSett
|
||||
setUpdateMask(IMUE_FlightModes | IMUE_LogicalSwitches | IMUE_TeleSensors | IMUE_FunctionSwitches);
|
||||
|
||||
// Descending switch direction: NOT (!) switches
|
||||
addItems(SWITCH_TYPE_TRAINER, -1);
|
||||
addItems(SWITCH_TYPE_ACT, -1);
|
||||
addItems(SWITCH_TYPE_SENSOR, -firmware->getCapability(Sensors));
|
||||
addItems(SWITCH_TYPE_TELEMETRY, -1);
|
||||
@@ -190,6 +191,7 @@ RawSwitchItemModel::RawSwitchItemModel(const GeneralSettings * const generalSett
|
||||
addItems(SWITCH_TYPE_ON, 1);
|
||||
addItems(SWITCH_TYPE_ONE, 1);
|
||||
addItems(SWITCH_TYPE_ACT, 1);
|
||||
addItems(SWITCH_TYPE_TRAINER, 1);
|
||||
}
|
||||
|
||||
void RawSwitchItemModel::setDynamicItemData(QStandardItem * item, const RawSwitch & rsw) const
|
||||
|
||||
@@ -166,7 +166,7 @@ RawSwitch YamlRawSwitchDecode(const std::string& sw_str)
|
||||
int sw_type = getCurrentFirmware()->getRawSwitchTypesIndex(sw_str_tmp.c_str());
|
||||
if (sw_type >= 0) {
|
||||
rhs.type = (RawSwitchType)sw_type;
|
||||
if (rhs.type == SWITCH_TYPE_TELEMETRY || rhs.type == SWITCH_TYPE_ACT || rhs.type == SWITCH_TYPE_ONE)
|
||||
if (rhs.type == SWITCH_TYPE_TELEMETRY || rhs.type == SWITCH_TYPE_TRAINER || rhs.type == SWITCH_TYPE_ACT || rhs.type == SWITCH_TYPE_ONE)
|
||||
// these types use index = 1
|
||||
rhs.index = 1;
|
||||
else
|
||||
|
||||
@@ -149,6 +149,9 @@ QString RawSwitch::toString(Board::Type board, const GeneralSettings * const gen
|
||||
case SWITCH_TYPE_TELEMETRY:
|
||||
return tr("Telemetry");
|
||||
|
||||
case SWITCH_TYPE_TRAINER:
|
||||
return tr("Trn");
|
||||
|
||||
default:
|
||||
return CPN_STR_UNKNOWN_ITEM;
|
||||
}
|
||||
@@ -280,6 +283,7 @@ StringTagMappingTable RawSwitch::getRawSwitchTypesLookupTable()
|
||||
{std::to_string(SWITCH_TYPE_TELEMETRY), "TELEMETRY_STREAMING"},
|
||||
{std::to_string(SWITCH_TYPE_SENSOR), "Tnn"},
|
||||
{std::to_string(SWITCH_TYPE_ACT), "RADIO_ACTIVITY"},
|
||||
{std::to_string(SWITCH_TYPE_TRAINER), "TRAINER_CONNECTED"},
|
||||
});
|
||||
|
||||
return tbl;
|
||||
|
||||
@@ -47,6 +47,7 @@ enum RawSwitchType {
|
||||
SWITCH_TYPE_TELEMETRY,
|
||||
SWITCH_TYPE_SENSOR,
|
||||
SWITCH_TYPE_ACT,
|
||||
SWITCH_TYPE_TRAINER,
|
||||
MAX_SWITCH_TYPE
|
||||
};
|
||||
|
||||
|
||||
@@ -441,6 +441,8 @@ enum SwitchSources {
|
||||
|
||||
SWSRC_RADIO_ACTIVITY,
|
||||
|
||||
SWSRC_TRAINER_CONNECTED,
|
||||
|
||||
#if defined(DEBUG_LATENCY)
|
||||
SWSRC_LATENCY_TOGGLE,
|
||||
#endif
|
||||
|
||||
@@ -47,13 +47,14 @@ class SwitchChoiceMenuToolbar : public MenuToolbar
|
||||
#if defined(DEBUG_LATENCY)
|
||||
auto lastSource = SWSRC_LATENCY_TOGGLE;
|
||||
#else
|
||||
auto lastSource = SWSRC_RADIO_ACTIVITY;
|
||||
auto lastSource = SWSRC_TRAINER_CONNECTED;
|
||||
#endif
|
||||
addButton(
|
||||
STR_CHAR_FUNCTION, SWSRC_ON, lastSource,
|
||||
[=](int16_t index) {
|
||||
index = abs(index);
|
||||
return index == 0 || index == SWSRC_ON || index == SWSRC_ONE ||
|
||||
index == SWSRC_TRAINER_CONNECTED ||
|
||||
(index >= SWSRC_TELEMETRY_STREAMING && index <= lastSource &&
|
||||
!(index >= SWSRC_FIRST_SENSOR && index <= SWSRC_LAST_SENSOR));
|
||||
},
|
||||
|
||||
@@ -159,6 +159,7 @@ const struct YamlIdStr enum_SwitchSources[] = {
|
||||
{ SWSRC_ONE, "ONE" },
|
||||
{ SWSRC_TELEMETRY_STREAMING, "TELEMETRY_STREAMING" },
|
||||
{ SWSRC_RADIO_ACTIVITY, "RADIO_ACTIVITY" },
|
||||
{ SWSRC_TRAINER_CONNECTED, "TRAINER_CONNECTED" },
|
||||
{ SWSRC_OFF, "OFF" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
|
||||
@@ -161,6 +161,7 @@ const struct YamlIdStr enum_SwitchSources[] = {
|
||||
{ SWSRC_ONE, "ONE" },
|
||||
{ SWSRC_TELEMETRY_STREAMING, "TELEMETRY_STREAMING" },
|
||||
{ SWSRC_RADIO_ACTIVITY, "RADIO_ACTIVITY" },
|
||||
{ SWSRC_TRAINER_CONNECTED, "TRAINER_CONNECTED" },
|
||||
{ SWSRC_OFF, "OFF" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
|
||||
@@ -159,6 +159,7 @@ const struct YamlIdStr enum_SwitchSources[] = {
|
||||
{ SWSRC_ONE, "ONE" },
|
||||
{ SWSRC_TELEMETRY_STREAMING, "TELEMETRY_STREAMING" },
|
||||
{ SWSRC_RADIO_ACTIVITY, "RADIO_ACTIVITY" },
|
||||
{ SWSRC_TRAINER_CONNECTED, "TRAINER_CONNECTED" },
|
||||
{ SWSRC_OFF, "OFF" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
|
||||
@@ -159,6 +159,7 @@ const struct YamlIdStr enum_SwitchSources[] = {
|
||||
{ SWSRC_ONE, "ONE" },
|
||||
{ SWSRC_TELEMETRY_STREAMING, "TELEMETRY_STREAMING" },
|
||||
{ SWSRC_RADIO_ACTIVITY, "RADIO_ACTIVITY" },
|
||||
{ SWSRC_TRAINER_CONNECTED, "TRAINER_CONNECTED" },
|
||||
{ SWSRC_OFF, "OFF" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
|
||||
@@ -169,6 +169,7 @@ const struct YamlIdStr enum_SwitchSources[] = {
|
||||
{ SWSRC_ONE, "ONE" },
|
||||
{ SWSRC_TELEMETRY_STREAMING, "TELEMETRY_STREAMING" },
|
||||
{ SWSRC_RADIO_ACTIVITY, "RADIO_ACTIVITY" },
|
||||
{ SWSRC_TRAINER_CONNECTED, "TRAINER_CONNECTED" },
|
||||
{ SWSRC_OFF, "OFF" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
|
||||
@@ -169,6 +169,7 @@ const struct YamlIdStr enum_SwitchSources[] = {
|
||||
{ SWSRC_ONE, "ONE" },
|
||||
{ SWSRC_TELEMETRY_STREAMING, "TELEMETRY_STREAMING" },
|
||||
{ SWSRC_RADIO_ACTIVITY, "RADIO_ACTIVITY" },
|
||||
{ SWSRC_TRAINER_CONNECTED, "TRAINER_CONNECTED" },
|
||||
{ SWSRC_OFF, "OFF" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
|
||||
@@ -159,6 +159,7 @@ const struct YamlIdStr enum_SwitchSources[] = {
|
||||
{ SWSRC_ONE, "ONE" },
|
||||
{ SWSRC_TELEMETRY_STREAMING, "TELEMETRY_STREAMING" },
|
||||
{ SWSRC_RADIO_ACTIVITY, "RADIO_ACTIVITY" },
|
||||
{ SWSRC_TRAINER_CONNECTED, "TRAINER_CONNECTED" },
|
||||
{ SWSRC_OFF, "OFF" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
|
||||
@@ -159,6 +159,7 @@ const struct YamlIdStr enum_SwitchSources[] = {
|
||||
{ SWSRC_ONE, "ONE" },
|
||||
{ SWSRC_TELEMETRY_STREAMING, "TELEMETRY_STREAMING" },
|
||||
{ SWSRC_RADIO_ACTIVITY, "RADIO_ACTIVITY" },
|
||||
{ SWSRC_TRAINER_CONNECTED, "TRAINER_CONNECTED" },
|
||||
{ SWSRC_OFF, "OFF" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
|
||||
@@ -159,6 +159,7 @@ const struct YamlIdStr enum_SwitchSources[] = {
|
||||
{ SWSRC_ONE, "ONE" },
|
||||
{ SWSRC_TELEMETRY_STREAMING, "TELEMETRY_STREAMING" },
|
||||
{ SWSRC_RADIO_ACTIVITY, "RADIO_ACTIVITY" },
|
||||
{ SWSRC_TRAINER_CONNECTED, "TRAINER_CONNECTED" },
|
||||
{ SWSRC_OFF, "OFF" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
|
||||
@@ -161,6 +161,7 @@ const struct YamlIdStr enum_SwitchSources[] = {
|
||||
{ SWSRC_ONE, "ONE" },
|
||||
{ SWSRC_TELEMETRY_STREAMING, "TELEMETRY_STREAMING" },
|
||||
{ SWSRC_RADIO_ACTIVITY, "RADIO_ACTIVITY" },
|
||||
{ SWSRC_TRAINER_CONNECTED, "TRAINER_CONNECTED" },
|
||||
{ SWSRC_OFF, "OFF" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
|
||||
@@ -511,6 +511,8 @@ char *getSwitchPositionName(char *dest, swsrc_t idx)
|
||||
strcpy(s, "Tele");
|
||||
} else if (idx == SWSRC_RADIO_ACTIVITY) {
|
||||
strcpy(s, "Act");
|
||||
} else if (idx == SWSRC_TRAINER_CONNECTED) {
|
||||
strcpy(s, "Trn");
|
||||
}
|
||||
#if defined(DEBUG_LATENCY)
|
||||
else if (idx == SWSRC_LATENCY_TOGGLE) {
|
||||
|
||||
@@ -603,6 +603,9 @@ bool getSwitch(swsrc_t swtch, uint8_t flags)
|
||||
else if (cs_idx == SWSRC_RADIO_ACTIVITY) {
|
||||
result = (inactivity.counter < 2);
|
||||
}
|
||||
else if (cs_idx == SWSRC_TRAINER_CONNECTED) {
|
||||
result = isTrainerConnected();
|
||||
}
|
||||
else if (cs_idx >= SWSRC_FIRST_SENSOR) {
|
||||
result = !telemetryItems[cs_idx-SWSRC_FIRST_SENSOR].isOld();
|
||||
}
|
||||
|
||||
@@ -35,6 +35,11 @@ enum {
|
||||
};
|
||||
uint8_t trainerStatus = TRAINER_NOT_CONNECTED;
|
||||
|
||||
bool isTrainerConnected()
|
||||
{
|
||||
return trainerStatus == TRAINER_CONNECTED || trainerStatus == TRAINER_RECONNECTED;
|
||||
}
|
||||
|
||||
void checkTrainerSignalWarning()
|
||||
{
|
||||
enum {
|
||||
|
||||
@@ -37,6 +37,7 @@ void checkTrainerSignalWarning();
|
||||
void checkTrainerSettings();
|
||||
void stopTrainer();
|
||||
void forceResetTrainerSettings();
|
||||
bool isTrainerConnected();
|
||||
|
||||
// Needs to be inlined to avoid slow function calls in ISR routines
|
||||
inline void captureTrainerPulses(uint16_t capture)
|
||||
|
||||
Reference in New Issue
Block a user