feat: Add trainer virtual switch (#3937)

Co-authored-by: Peter Feerick <peter.feerick@gmail.com>
This commit is contained in:
3djc
2023-10-16 08:41:40 +10:00
committed by GitHub
co-authored by Peter Feerick
parent ee9d50dca4
commit d396b38e8b
20 changed files with 33 additions and 2 deletions
@@ -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
+4
View File
@@ -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;
+1
View File
@@ -47,6 +47,7 @@ enum RawSwitchType {
SWITCH_TYPE_TELEMETRY,
SWITCH_TYPE_SENSOR,
SWITCH_TYPE_ACT,
SWITCH_TYPE_TRAINER,
MAX_SWITCH_TYPE
};
+2
View File
@@ -441,6 +441,8 @@ enum SwitchSources {
SWSRC_RADIO_ACTIVITY,
SWSRC_TRAINER_CONNECTED,
#if defined(DEBUG_LATENCY)
SWSRC_LATENCY_TOGGLE,
#endif
+2 -1
View File
@@ -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 }
};
+2
View File
@@ -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) {
+3
View File
@@ -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();
}
+5
View File
@@ -35,6 +35,11 @@ enum {
};
uint8_t trainerStatus = TRAINER_NOT_CONNECTED;
bool isTrainerConnected()
{
return trainerStatus == TRAINER_CONNECTED || trainerStatus == TRAINER_RECONNECTED;
}
void checkTrainerSignalWarning()
{
enum {
+1
View File
@@ -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)