From e0a8b3d8c3e262bce42b865da707c79cd4ba3888 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Thu, 16 Sep 2021 10:14:06 +0200 Subject: [PATCH] Added RX options (PWM/PPM, iBUS/SBUS) --- radio/src/datastructs.h | 2 ++ radio/src/gui/colorlcd/model_setup.cpp | 49 +++++++++++++++++++++++--- radio/src/pulses/afhds3.cpp | 19 ++++++---- radio/src/pulses/flysky.cpp | 2 +- radio/src/translations.cpp | 2 ++ radio/src/translations.h | 3 ++ radio/src/translations/untranslated.h | 6 ++++ 7 files changed, 71 insertions(+), 12 deletions(-) diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index e330aafec..8af0b5df2 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -485,6 +485,8 @@ PACK(struct ModuleData { uint8_t telemetry:1; uint16_t failsafeTimeout; uint8_t rx_freq[2]; + uint8_t mode:2; + uint8_t reserved:6; uint16_t rxFreq() { return (uint16_t)rx_freq[0] | (((uint16_t)rx_freq[1]) << 8); diff --git a/radio/src/gui/colorlcd/model_setup.cpp b/radio/src/gui/colorlcd/model_setup.cpp index 736d4c4e7..5356200b1 100644 --- a/radio/src/gui/colorlcd/model_setup.cpp +++ b/radio/src/gui/colorlcd/model_setup.cpp @@ -856,12 +856,51 @@ class ModuleWindow : public FormGroup { [](int v) { return v == FLYSKY_SUBTYPE_AFHDS2A; }); } #endif + // RX options: + grid.nextLine(); + new StaticText(this, grid.getLabelSlot(true), STR_OPTIONS, 0, + COLOR_THEME_PRIMARY1); + + // PPM / PWM + if (isModuleAFHDS2A(moduleIdx)) { + new Choice( + this, grid.getFieldSlot(2, 0), STR_FLYSKY_PULSE_PROTO, 0, 1, + [=]() { return g_model.moduleData[moduleIdx].flysky.mode >> 1; }, + [=](int v) { + g_model.moduleData[moduleIdx].flysky.mode = + (g_model.moduleData[moduleIdx].flysky.mode & 1) | + ((v & 1) << 1); + }); + } else { + new Choice( + this, grid.getFieldSlot(2, 0), STR_FLYSKY_PULSE_PROTO, 0, 1, + [=]() { return g_model.moduleData[moduleIdx].afhds3.mode >> 1; }, + [=](int v) { + g_model.moduleData[moduleIdx].afhds3.mode = + (g_model.moduleData[moduleIdx].afhds3.mode & 1) | + ((v & 1) << 1); + }); + } + + // SBUS / iBUS + if (isModuleAFHDS2A(moduleIdx)) { + new Choice( + this, grid.getFieldSlot(2, 1), STR_FLYSKY_SERIAL_PROTO, 0, 1, + [=]() { return g_model.moduleData[moduleIdx].flysky.mode & 1; }, + [=](int v) { + g_model.moduleData[moduleIdx].flysky.mode = + (g_model.moduleData[moduleIdx].flysky.mode & 2) | (v & 1); + }); + } else { + new Choice( + this, grid.getFieldSlot(2, 1), STR_FLYSKY_SERIAL_PROTO, 0, 1, + [=]() { return g_model.moduleData[moduleIdx].afhds3.mode & 1; }, + [=](int v) { + g_model.moduleData[moduleIdx].afhds3.mode = + (g_model.moduleData[moduleIdx].afhds3.mode & 2) | (v & 1); + }); + } - // TODO: - // - options (currently taken from 'subType'...): - // - PWM / PPM - // - SBUS / iBUS - #if defined(AFHDS3) if (isModuleAFHDS3(moduleIdx)) { diff --git a/radio/src/pulses/afhds3.cpp b/radio/src/pulses/afhds3.cpp index bafe7817c..9a1c176bc 100644 --- a/radio/src/pulses/afhds3.cpp +++ b/radio/src/pulses/afhds3.cpp @@ -549,7 +549,7 @@ inline bool isSbus(uint8_t mode) inline bool isPWM(uint8_t mode) { - return mode < 2; + return !(mode & 2); } RUN_POWER PulsesData::getMaxRunPower() const @@ -604,7 +604,9 @@ bool PulsesData::syncSettings() putFrame(COMMAND::SEND_COMMAND, FRAME_TYPE::REQUEST_SET_EXPECT_DATA, data, sizeof(data)); return true; } - PULSE_MODE modelPulseMode = isPWM(moduleData->subType) ? PULSE_MODE::PWM_MODE : PULSE_MODE::PPM_MODE; + PULSE_MODE modelPulseMode = isPWM(moduleData->afhds3.mode) + ? PULSE_MODE::PWM_MODE + : PULSE_MODE::PPM_MODE; if (modelPulseMode != cfg.config.pulseMode) { cfg.config.pulseMode = modelPulseMode; TRACE("AFHDS3 PWM/PPM %d", modelPulseMode); @@ -613,7 +615,9 @@ bool PulsesData::syncSettings() return true; } - SERIAL_MODE modelSerialMode = isSbus(moduleData->subType) ? SERIAL_MODE::SBUS_MODE : SERIAL_MODE::IBUS; + SERIAL_MODE modelSerialMode = isSbus(moduleData->afhds3.mode) + ? SERIAL_MODE::SBUS_MODE + : SERIAL_MODE::IBUS; if (modelSerialMode != cfg.config.serialMode) { cfg.config.serialMode = modelSerialMode; TRACE("AFHDS3 IBUS/SBUS %d", modelSerialMode); @@ -660,9 +664,12 @@ void PulsesData::setConfigFromModel() cfg.config.emiStandard = EMI_STANDARD::FCC; cfg.config.telemetry = moduleData->afhds3.telemetry; //always use bidirectional mode cfg.config.pwmFreq = moduleData->afhds3.rxFreq(); - cfg.config.serialMode = isSbus(moduleData->subType) ? SERIAL_MODE::SBUS_MODE : SERIAL_MODE::IBUS; - cfg.config.pulseMode = isPWM(moduleData->subType) ? PULSE_MODE::PWM_MODE : PULSE_MODE::PPM_MODE; - //use max channels - because channel count can not be changed after bind + cfg.config.serialMode = isSbus(moduleData->afhds3.mode) + ? SERIAL_MODE::SBUS_MODE + : SERIAL_MODE::IBUS; + cfg.config.pulseMode = isPWM(moduleData->afhds3.mode) ? PULSE_MODE::PWM_MODE + : PULSE_MODE::PPM_MODE; + // use max channels - because channel count can not be changed after bind cfg.config.channelCount = MAX_CHANNELS; cfg.config.failSafeTimout = moduleData->afhds3.failsafeTimeout; setFailSafe(cfg.config.failSafeMode); diff --git a/radio/src/pulses/flysky.cpp b/radio/src/pulses/flysky.cpp index 1fb307776..d09fd8c8d 100644 --- a/radio/src/pulses/flysky.cpp +++ b/radio/src/pulses/flysky.cpp @@ -97,7 +97,7 @@ enum FlySkyModuleState_E { STATE_SEND_CHANNELS = 19, }; -#define AfhdsPwmMode (gRomData.mode < 2 ? FLYSKY_PWM : FLYSKY_PPM) +#define AfhdsPwmMode (gRomData.mode & 2 ? FLYSKY_PPM : FLYSKY_PWM) #define AfhdsIbusMode (gRomData.mode & 1 ? FLYSKY_SBUS : FLYSKY_IBUS) struct rf_info_t { diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 1e81cd8d9..398ac4707 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -75,6 +75,8 @@ ISTR(R9M_PXX2_RF_PROTOCOLS); ISTR(DSM_PROTOCOLS); ISTR(AFHDS3_PROTOCOLS); ISTR(AFHDS3_POWERS); +ISTR(FLYSKY_PULSE_PROTO); +ISTR(FLYSKY_SERIAL_PROTO); ISTR(CURVE_TYPES); ISTR(VSENSORTYPES); ISTR(VFORMULAS); diff --git a/radio/src/translations.h b/radio/src/translations.h index 00b752045..ffb33e98e 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -187,6 +187,9 @@ extern const char STR_AFHDS3_RX_FREQ[]; extern const char STR_AFHDS3_ACTUAL_POWER[]; extern const char STR_AFHDS3_POWER_SOURCE[]; +extern const char STR_FLYSKY_PULSE_PROTO[]; +extern const char STR_FLYSKY_SERIAL_PROTO[]; + extern const char STR_CURVE_TYPES[]; extern const char STR_VSENSORTYPES[]; extern const char STR_VFORMULAS[]; diff --git a/radio/src/translations/untranslated.h b/radio/src/translations/untranslated.h index 29fa724ad..f502a45f9 100644 --- a/radio/src/translations/untranslated.h +++ b/radio/src/translations/untranslated.h @@ -176,6 +176,12 @@ #define LEN_AFHDS3_POWERS "\006" #define TR_AFHDS3_POWERS "25 mW\0""100 mW""500 mW""1 W\0 ""2 W\0 " +#define LEN_FLYSKY_PULSE_PROTO "\x003" +#define TR_FLYSKY_PULSE_PROTO "PWM""PPM" + +#define LEN_FLYSKY_SERIAL_PROTO "\x004" +#define TR_FLYSKY_SERIAL_PROTO "iBUS""SBUS" + #define LEN_PPM_POL "\001" #define TR_PPM_POL "-""+"