From b54ad7169acf53d6c387007a36ed38c6add87739 Mon Sep 17 00:00:00 2001 From: Peter Feerick Date: Tue, 22 Mar 2022 16:14:57 +1000 Subject: [PATCH] feat: Option for inverting rotary encoder direction (#1690) * feat: Add option for rotary encoder direction Based heavily on opentx/opentx#8852 by @3djc * companion ui elements * Cleanup * Hook up UI, reading setting from yaml * Teach simulator about rotEncDirection * Simu and radio default scroll direction correction Otherwise the "default" would be the opposite to how it has always been * Remove what will be a confict with fix in #1586 * Wasn't using rotEncDirection consistently * Zorro RE dir is opp to TX16, TX12, TPro, X9D+2019 --- .../firmwares/edgetx/yaml_generalsettings.cpp | 2 + companion/src/firmwares/eeprominterface.h | 3 +- companion/src/firmwares/generalsettings.h | 1 + .../src/firmwares/opentx/opentxeeprom.cpp | 5 +- .../src/firmwares/opentx/opentxinterface.cpp | 6 + companion/src/generaledit/generalsetup.cpp | 14 + companion/src/generaledit/generalsetup.h | 1 + companion/src/generaledit/generalsetup.ui | 601 +++++++++--------- radio/src/datastructs_private.h | 2 +- radio/src/gui/128x64/radio_setup.cpp | 8 + radio/src/gui/212x64/radio_setup.cpp | 8 + radio/src/gui/colorlcd/radio_setup.cpp | 6 + radio/src/opentx.h | 8 +- .../storage/yaml/yaml_datastructs_nv14.cpp | 2 +- .../src/storage/yaml/yaml_datastructs_t12.cpp | 2 +- .../src/storage/yaml/yaml_datastructs_t8.cpp | 2 +- .../storage/yaml/yaml_datastructs_tlite.cpp | 2 +- .../storage/yaml/yaml_datastructs_tpro.cpp | 2 +- .../storage/yaml/yaml_datastructs_tx12.cpp | 2 +- .../src/storage/yaml/yaml_datastructs_x10.cpp | 2 +- .../storage/yaml/yaml_datastructs_x12s.cpp | 2 +- .../src/storage/yaml/yaml_datastructs_x7.cpp | 2 +- .../src/storage/yaml/yaml_datastructs_x9d.cpp | 2 +- .../src/storage/yaml/yaml_datastructs_x9e.cpp | 2 +- .../storage/yaml/yaml_datastructs_x9lite.cpp | 2 +- .../storage/yaml/yaml_datastructs_x9lites.cpp | 2 +- .../storage/yaml/yaml_datastructs_xlite.cpp | 2 +- .../storage/yaml/yaml_datastructs_xlites.cpp | 2 +- .../storage/yaml/yaml_datastructs_zorro.cpp | 2 +- .../arm/stm32/rotary_encoder_driver.cpp | 24 +- radio/src/targets/simu/opentxsimulator.cpp | 2 + radio/src/targets/taranis/board.h | 4 - radio/src/translations.cpp | 1 + radio/src/translations.h | 1 + radio/src/translations/cn.h.txt | 1 + radio/src/translations/cz.h.txt | 1 + radio/src/translations/de.h.txt | 1 + radio/src/translations/en.h.txt | 1 + radio/src/translations/es.h.txt | 1 + radio/src/translations/fi.h.txt | 1 + radio/src/translations/fr.h.txt | 1 + radio/src/translations/it.h.txt | 1 + radio/src/translations/nl.h.txt | 1 + radio/src/translations/pl.h.txt | 1 + radio/src/translations/pt.h.txt | 1 + radio/src/translations/se.h.txt | 1 + radio/src/translations/tw.h.txt | 1 + 47 files changed, 416 insertions(+), 326 deletions(-) diff --git a/companion/src/firmwares/edgetx/yaml_generalsettings.cpp b/companion/src/firmwares/edgetx/yaml_generalsettings.cpp index b02ba90bb..58ee69c43 100644 --- a/companion/src/firmwares/edgetx/yaml_generalsettings.cpp +++ b/companion/src/firmwares/edgetx/yaml_generalsettings.cpp @@ -200,6 +200,7 @@ Node convert::encode(const GeneralSettings& rhs) node["noJitterFilter"] = (int)rhs.noJitterFilter; node["disableRtcWarning"] = (int)rhs.rtcCheckDisable; // TODO: verify node["keysBacklight"] = (int)rhs.keysBacklight; + node["rotEncDirection"] = (int)rhs.rotEncDirection; node["imperial"] = rhs.imperial; node["ttsLanguage"] = rhs.ttsLanguage; node["beepVolume"] = rhs.beepVolume + 2; @@ -390,6 +391,7 @@ bool convert::decode(const Node& node, GeneralSettings& rhs) node["noJitterFilter"] >> rhs.noJitterFilter; // new, but don't write old node["disableRtcWarning"] >> rhs.rtcCheckDisable; // TODO: verify node["keysBacklight"] >> rhs.keysBacklight; + node["rotEncDirection"] >> rhs.rotEncDirection; node["imperial"] >> rhs.imperial; node["ttsLanguage"] >> rhs.ttsLanguage; node["beepVolume"] >> ioffset_int(rhs.beepVolume, 2); diff --git a/companion/src/firmwares/eeprominterface.h b/companion/src/firmwares/eeprominterface.h index f8fc7cc45..22abfde3f 100644 --- a/companion/src/firmwares/eeprominterface.h +++ b/companion/src/firmwares/eeprominterface.h @@ -167,7 +167,8 @@ enum Capability { HasTelemetryBaudrate, TopBarZones, HasModelsList, - HasFlySkyGimbals + HasFlySkyGimbals, + RotaryEncoderNavigation }; class EEPROMInterface diff --git a/companion/src/firmwares/generalsettings.h b/companion/src/firmwares/generalsettings.h index 4d98286d5..411db520d 100644 --- a/companion/src/firmwares/generalsettings.h +++ b/companion/src/firmwares/generalsettings.h @@ -228,6 +228,7 @@ class GeneralSettings { bool noJitterFilter; bool rtcCheckDisable; bool keysBacklight; + bool rotEncDirection; unsigned int imperial; char ttsLanguage[TTS_LANGUAGE_LEN + 1]; int beepVolume; diff --git a/companion/src/firmwares/opentx/opentxeeprom.cpp b/companion/src/firmwares/opentx/opentxeeprom.cpp index 4b10c0dfa..338f81ed2 100644 --- a/companion/src/firmwares/opentx/opentxeeprom.cpp +++ b/companion/src/firmwares/opentx/opentxeeprom.cpp @@ -3035,10 +3035,11 @@ OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, Board::Type internalField.Append(new BoolField<1>(this, generalData.rtcCheckDisable)); if (IS_JUMPER_T18(board)) { internalField.Append(new BoolField<1>(this, generalData.keysBacklight)); - internalField.Append(new SpareBitsField<1>(this)); + internalField.Append(new BoolField<1>(this, generalData.rotEncDirection)); } else { - internalField.Append(new SpareBitsField<2>(this)); + internalField.Append(new SpareBitsField<1>(this)); + internalField.Append(new BoolField<1>(this, generalData.rotEncDirection)); } for (int i=0; i<4; i++) { diff --git a/companion/src/firmwares/opentx/opentxinterface.cpp b/companion/src/firmwares/opentx/opentxinterface.cpp index 937fab164..bab62bac1 100644 --- a/companion/src/firmwares/opentx/opentxinterface.cpp +++ b/companion/src/firmwares/opentx/opentxinterface.cpp @@ -766,6 +766,12 @@ int OpenTxFirmware::getCapability(::Capability capability) return IS_FAMILY_HORUS_OR_T16(board); case HasFlySkyGimbals: return (IS_RADIOMASTER_TX16S(board) && id.contains("flyskygimbals")); + case RotaryEncoderNavigation: + return (IS_TARANIS_X9E(board) || IS_TARANIS_X9DP_2019(board) || + IS_TARANIS_X7(board) || IS_JUMPER_TPRO(board) || + IS_TARANIS_X9LITE(board) || IS_RADIOMASTER_TX12(board) || + IS_RADIOMASTER_ZORRO(board) || IS_RADIOMASTER_TX16S(board) || + IS_JUMPER_T18(board)); default: return 0; } diff --git a/companion/src/generaledit/generalsetup.cpp b/companion/src/generaledit/generalsetup.cpp index 036378f31..39338a306 100644 --- a/companion/src/generaledit/generalsetup.cpp +++ b/companion/src/generaledit/generalsetup.cpp @@ -125,6 +125,14 @@ ui(new Ui::GeneralSetup) ui->faimode_CB->setChecked(generalSettings.fai); } + if (!firmware->getCapability(RotaryEncoderNavigation)) { + ui->invertRotary_CB->hide(); + ui->invertRotary_label->hide(); + } + else { + ui->invertRotary_CB->setChecked(generalSettings.rotEncDirection); + } + if (!firmware->getCapability(HasPxxCountry)) { ui->countrycode_label->hide(); ui->countrycode_CB->hide(); @@ -475,6 +483,12 @@ void GeneralSetupPanel::on_faimode_CB_stateChanged(int) emit modified(); } +void GeneralSetupPanel::on_invertRotary_CB_stateChanged(int) +{ + generalSettings.rotEncDirection = ui->invertRotary_CB->isChecked(); + emit modified(); +} + void GeneralSetupPanel::on_speakerPitchSB_editingFinished() { generalSettings.speakerPitch = ui->speakerPitchSB->value(); diff --git a/companion/src/generaledit/generalsetup.h b/companion/src/generaledit/generalsetup.h index 43e098aee..3ac2e8dff 100644 --- a/companion/src/generaledit/generalsetup.h +++ b/companion/src/generaledit/generalsetup.h @@ -49,6 +49,7 @@ class GeneralSetupPanel : public GeneralPanel void on_countrycode_CB_currentIndexChanged(int index); void on_units_CB_currentIndexChanged(int index); void on_faimode_CB_stateChanged(int ); + void on_invertRotary_CB_stateChanged(int); void on_speakerPitchSB_editingFinished(); void on_timezoneSB_editingFinished(); void on_adjustRTC_stateChanged(int); diff --git a/companion/src/generaledit/generalsetup.ui b/companion/src/generaledit/generalsetup.ui index 422eddc7d..ca651917b 100644 --- a/companion/src/generaledit/generalsetup.ui +++ b/companion/src/generaledit/generalsetup.ui @@ -561,6 +561,16 @@ + + + + + + + Sound Mode + + + @@ -657,16 +667,6 @@ - - - - - - - Sound Mode - - - @@ -674,6 +674,174 @@ + + + + Backlight OFF Brightness + + + + + + + + 0 + 0 + + + + 23 + + + + + + + + Beeper + + + + + Speaker + + + + + BeeperVoice + + + + + SpeakerVoice + + + + + + + + + 0 + 0 + + + + Stick reverse + + + + + + + nnnnnnNN + + + 8 + + + + + + + 5 + + + 100 + + + + + + + Backlight Switch + + + + + + + + America + + + + + Japan + + + + + Europe + + + + + + + + RotEnc Navigation + + + + + + + Vario pitch at zero + + + + + + + Hz + + + 300 + + + 1100 + + + 10 + + + 700 + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + ms + + + 200 + + + 1000 + + + 10 + + + 500 + + + @@ -724,269 +892,6 @@ - - - - Hz - - - 300 - - - 1100 - - - 10 - - - 700 - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - ms - - - 200 - - - 1000 - - - 10 - - - 500 - - - - - - - - 0 - 0 - - - - Stick reverse - - - - - - - nnnnnnNN - - - 8 - - - - - - - - Beeper - - - - - Speaker - - - - - BeeperVoice - - - - - SpeakerVoice - - - - - - - - Backlight OFF Brightness - - - - - - - - 0 - 0 - - - - 23 - - - - - - - RotEnc Navigation - - - - - - - 5 - - - 100 - - - - - - - Backlight Switch - - - - - - - - America - - - - - Japan - - - - - Europe - - - - - - - - Vario pitch at zero - - - - - - - If you enable FAI, only RSSI and RxBt sensors will keep working. This function cannot be disabled by the radio. - - - - - - - - - - Backlight Auto OFF after - - - - - - - Hz - - - 1300 - - - 2900 - - - 10 - - - 1700 - - - - - - - 100 - - - - - - - FAI Mode - - - - - - - - - Color 1 - - - - - - - 20 - - - 5 - - - Qt::Horizontal - - - - - - - Color 2 - - - - - - - - - Backlight color - - - - - - - Owner Registration ID - - - @@ -1052,43 +957,100 @@ - - + + - Backlight Brightness + Backlight Auto OFF after - - - - Vario repeat at zero + + + + 100 - - + + - Voice Language + FAI Mode - - - - Backlight flash on alarm + + + + Hz + + + 1300 + + + 2900 + + + 10 + + + 1700 - - + + + + If you enable FAI, only RSSI and RxBt sensors will keep working. This function cannot be disabled by the radio. + - Vario pitch at max + - - + + + + Backlight color + + + + + + + + + Color 1 + + + + + + + 20 + + + 5 + + + Qt::Horizontal + + + + + + + Color 2 + + + + + + + + + Owner Registration ID + + @@ -1145,6 +1107,61 @@ p, li { white-space: pre-wrap; } + + + + Backlight flash on alarm + + + + + + + Vario pitch at max + + + + + + + Backlight Brightness + + + + + + + Vario repeat at zero + + + + + + + Voice Language + + + + + + + + + + Invert Rotary + + + + + + + Invert the direction of the rotary encoder + + + + + + diff --git a/radio/src/datastructs_private.h b/radio/src/datastructs_private.h index 8e17b4c4f..513bc76d9 100644 --- a/radio/src/datastructs_private.h +++ b/radio/src/datastructs_private.h @@ -854,7 +854,7 @@ PACK(struct RadioData { int8_t antennaMode:2 ENUM(AntennaModes); uint8_t disableRtcWarning:1; uint8_t keysBacklight:1; - int8_t spare1:1 SKIP; + int8_t rotEncDirection:1; NOBACKUP(uint8_t internalModule ENUM(ModuleType)); NOBACKUP(TrainerData trainer); NOBACKUP(uint8_t view); // index of view in main screen diff --git a/radio/src/gui/128x64/radio_setup.cpp b/radio/src/gui/128x64/radio_setup.cpp index dd860a7c6..b142143ba 100644 --- a/radio/src/gui/128x64/radio_setup.cpp +++ b/radio/src/gui/128x64/radio_setup.cpp @@ -102,6 +102,7 @@ enum { ITEM_RADIO_SETUP_USB_MODE, CASE_JACK_DETECT(ITEM_RADIO_SETUP_JACK_MODE) ITEM_RADIO_SETUP_RX_CHANNEL_ORD, + CASE_ROTARY_ENCODER(ITEM_RADIO_SETUP_ROTARY_INVERSE) ITEM_RADIO_SETUP_STICK_MODE_LABELS, ITEM_RADIO_SETUP_STICK_MODE, ITEM_RADIO_SETUP_MAX @@ -175,6 +176,7 @@ void menuRadioSetup(event_t event) 0, 0, // USB mode CASE_JACK_DETECT(0) // Jack mode + CASE_ROTARY_ENCODER(0) 0, COL_TX_MODE, 0, 1/*to force edit mode*/}); if (event == EVT_ENTRY) { @@ -658,6 +660,12 @@ void menuRadioSetup(event_t event) #endif break; +#if defined(ROTARY_ENCODER_NAVIGATION) + case ITEM_RADIO_SETUP_ROTARY_INVERSE: + g_eeGeneral.rotEncDirection = editCheckBox(g_eeGeneral.rotEncDirection, RADIO_SETUP_2ND_COLUMN, y, STR_INVERT_ROTARY, attr, event); + break; +#endif + case ITEM_RADIO_SETUP_STICK_MODE: lcdDrawChar(2*FW, y, '1'+reusableBuffer.generalSettings.stickMode, attr); for (uint8_t i=0; iAETR choice = new Choice(window, grid.getFieldSlot(), 0, 4*3*2 - 1, GET_SET_DEFAULT(g_eeGeneral.templateSetup)); diff --git a/radio/src/opentx.h b/radio/src/opentx.h index c76122558..52d8ec9f2 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -373,6 +373,7 @@ inline bool SPLASH_NEEDED() #endif #if defined(ROTARY_ENCODER_NAVIGATION) + #define CASE_ROTARY_ENCODER(x) x, #define IS_ROTARY_ENCODER_NAVIGATION_ENABLE() true extern volatile rotenc_t rotencValue; #define ROTARY_ENCODER_NAVIGATION_VALUE rotencValue @@ -381,8 +382,11 @@ inline bool SPLASH_NEEDED() #define ROTENC_HIGHSPEED 50 #define ROTENC_DELAY_MIDSPEED 32 #define ROTENC_DELAY_HIGHSPEED 16 -#elif defined(RADIO_T8) - constexpr uint8_t rotencSpeed = 1; +#else + #define CASE_ROTARY_ENCODER(x) + #if defined(RADIO_T8) + constexpr uint8_t rotencSpeed = 1; + #endif #endif constexpr uint8_t HEART_TIMER_10MS = 0x01; diff --git a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp index 2d645ee3b..749defc07 100644 --- a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp @@ -366,7 +366,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_ENUM("antennaMode", 2, enum_AntennaModes), YAML_UNSIGNED( "disableRtcWarning", 1 ), YAML_UNSIGNED( "keysBacklight", 1 ), - YAML_PADDING( 1 ), + YAML_SIGNED( "rotEncDirection", 1 ), YAML_ENUM("internalModule", 8, enum_ModuleType), YAML_STRUCT("trainer", 128, struct_TrainerData, NULL), YAML_UNSIGNED( "view", 8 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_t12.cpp b/radio/src/storage/yaml/yaml_datastructs_t12.cpp index a5b79fa88..1bd49c0fd 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t12.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t12.cpp @@ -337,7 +337,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_ENUM("antennaMode", 2, enum_AntennaModes), YAML_UNSIGNED( "disableRtcWarning", 1 ), YAML_UNSIGNED( "keysBacklight", 1 ), - YAML_PADDING( 1 ), + YAML_SIGNED( "rotEncDirection", 1 ), YAML_ENUM("internalModule", 8, enum_ModuleType), YAML_STRUCT("trainer", 128, struct_TrainerData, NULL), YAML_UNSIGNED( "view", 8 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_t8.cpp b/radio/src/storage/yaml/yaml_datastructs_t8.cpp index fdb323b39..5a0f44126 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t8.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t8.cpp @@ -337,7 +337,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_ENUM("antennaMode", 2, enum_AntennaModes), YAML_UNSIGNED( "disableRtcWarning", 1 ), YAML_UNSIGNED( "keysBacklight", 1 ), - YAML_PADDING( 1 ), + YAML_SIGNED( "rotEncDirection", 1 ), YAML_ENUM("internalModule", 8, enum_ModuleType), YAML_STRUCT("trainer", 128, struct_TrainerData, NULL), YAML_UNSIGNED( "view", 8 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_tlite.cpp b/radio/src/storage/yaml/yaml_datastructs_tlite.cpp index fdb323b39..5a0f44126 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tlite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tlite.cpp @@ -337,7 +337,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_ENUM("antennaMode", 2, enum_AntennaModes), YAML_UNSIGNED( "disableRtcWarning", 1 ), YAML_UNSIGNED( "keysBacklight", 1 ), - YAML_PADDING( 1 ), + YAML_SIGNED( "rotEncDirection", 1 ), YAML_ENUM("internalModule", 8, enum_ModuleType), YAML_STRUCT("trainer", 128, struct_TrainerData, NULL), YAML_UNSIGNED( "view", 8 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_tpro.cpp b/radio/src/storage/yaml/yaml_datastructs_tpro.cpp index 4525810be..f5b765b7b 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tpro.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tpro.cpp @@ -345,7 +345,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_ENUM("antennaMode", 2, enum_AntennaModes), YAML_UNSIGNED( "disableRtcWarning", 1 ), YAML_UNSIGNED( "keysBacklight", 1 ), - YAML_PADDING( 1 ), + YAML_SIGNED( "rotEncDirection", 1 ), YAML_ENUM("internalModule", 8, enum_ModuleType), YAML_STRUCT("trainer", 128, struct_TrainerData, NULL), YAML_UNSIGNED( "view", 8 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_tx12.cpp b/radio/src/storage/yaml/yaml_datastructs_tx12.cpp index e5eae7c00..77bb37df6 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tx12.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tx12.cpp @@ -337,7 +337,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_ENUM("antennaMode", 2, enum_AntennaModes), YAML_UNSIGNED( "disableRtcWarning", 1 ), YAML_UNSIGNED( "keysBacklight", 1 ), - YAML_PADDING( 1 ), + YAML_SIGNED( "rotEncDirection", 1 ), YAML_ENUM("internalModule", 8, enum_ModuleType), YAML_STRUCT("trainer", 128, struct_TrainerData, NULL), YAML_UNSIGNED( "view", 8 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_x10.cpp b/radio/src/storage/yaml/yaml_datastructs_x10.cpp index aa3d02998..03a7d8acc 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x10.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x10.cpp @@ -387,7 +387,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_ENUM("antennaMode", 2, enum_AntennaModes), YAML_UNSIGNED( "disableRtcWarning", 1 ), YAML_UNSIGNED( "keysBacklight", 1 ), - YAML_PADDING( 1 ), + YAML_SIGNED( "rotEncDirection", 1 ), YAML_ENUM("internalModule", 8, enum_ModuleType), YAML_STRUCT("trainer", 128, struct_TrainerData, NULL), YAML_UNSIGNED( "view", 8 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp index 5e2fad015..59fefc53c 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp @@ -385,7 +385,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_ENUM("antennaMode", 2, enum_AntennaModes), YAML_UNSIGNED( "disableRtcWarning", 1 ), YAML_UNSIGNED( "keysBacklight", 1 ), - YAML_PADDING( 1 ), + YAML_SIGNED( "rotEncDirection", 1 ), YAML_ENUM("internalModule", 8, enum_ModuleType), YAML_STRUCT("trainer", 128, struct_TrainerData, NULL), YAML_UNSIGNED( "view", 8 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_x7.cpp b/radio/src/storage/yaml/yaml_datastructs_x7.cpp index fdb323b39..5a0f44126 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x7.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x7.cpp @@ -337,7 +337,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_ENUM("antennaMode", 2, enum_AntennaModes), YAML_UNSIGNED( "disableRtcWarning", 1 ), YAML_UNSIGNED( "keysBacklight", 1 ), - YAML_PADDING( 1 ), + YAML_SIGNED( "rotEncDirection", 1 ), YAML_ENUM("internalModule", 8, enum_ModuleType), YAML_STRUCT("trainer", 128, struct_TrainerData, NULL), YAML_UNSIGNED( "view", 8 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp index fd45bdb41..8b9d46f55 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp @@ -344,7 +344,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_ENUM("antennaMode", 2, enum_AntennaModes), YAML_UNSIGNED( "disableRtcWarning", 1 ), YAML_UNSIGNED( "keysBacklight", 1 ), - YAML_PADDING( 1 ), + YAML_SIGNED( "rotEncDirection", 1 ), YAML_ENUM("internalModule", 8, enum_ModuleType), YAML_STRUCT("trainer", 128, struct_TrainerData, NULL), YAML_UNSIGNED( "view", 8 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp index 787052d09..7dc17894a 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp @@ -383,7 +383,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_ENUM("antennaMode", 2, enum_AntennaModes), YAML_UNSIGNED( "disableRtcWarning", 1 ), YAML_UNSIGNED( "keysBacklight", 1 ), - YAML_PADDING( 1 ), + YAML_SIGNED( "rotEncDirection", 1 ), YAML_ENUM("internalModule", 8, enum_ModuleType), YAML_STRUCT("trainer", 128, struct_TrainerData, NULL), YAML_UNSIGNED( "view", 8 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp b/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp index cd51911b5..65060ffba 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp @@ -324,7 +324,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_ENUM("antennaMode", 2, enum_AntennaModes), YAML_UNSIGNED( "disableRtcWarning", 1 ), YAML_UNSIGNED( "keysBacklight", 1 ), - YAML_PADDING( 1 ), + YAML_SIGNED( "rotEncDirection", 1 ), YAML_ENUM("internalModule", 8, enum_ModuleType), YAML_STRUCT("trainer", 128, struct_TrainerData, NULL), YAML_UNSIGNED( "view", 8 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp b/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp index c971edba1..f64b16fc3 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp @@ -332,7 +332,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_ENUM("antennaMode", 2, enum_AntennaModes), YAML_UNSIGNED( "disableRtcWarning", 1 ), YAML_UNSIGNED( "keysBacklight", 1 ), - YAML_PADDING( 1 ), + YAML_SIGNED( "rotEncDirection", 1 ), YAML_ENUM("internalModule", 8, enum_ModuleType), YAML_STRUCT("trainer", 128, struct_TrainerData, NULL), YAML_UNSIGNED( "view", 8 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_xlite.cpp b/radio/src/storage/yaml/yaml_datastructs_xlite.cpp index abc707a28..6fa269d70 100644 --- a/radio/src/storage/yaml/yaml_datastructs_xlite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_xlite.cpp @@ -329,7 +329,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_ENUM("antennaMode", 2, enum_AntennaModes), YAML_UNSIGNED( "disableRtcWarning", 1 ), YAML_UNSIGNED( "keysBacklight", 1 ), - YAML_PADDING( 1 ), + YAML_SIGNED( "rotEncDirection", 1 ), YAML_ENUM("internalModule", 8, enum_ModuleType), YAML_STRUCT("trainer", 128, struct_TrainerData, NULL), YAML_UNSIGNED( "view", 8 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp index b56c93f11..2736d19f1 100644 --- a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp @@ -331,7 +331,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_ENUM("antennaMode", 2, enum_AntennaModes), YAML_UNSIGNED( "disableRtcWarning", 1 ), YAML_UNSIGNED( "keysBacklight", 1 ), - YAML_PADDING( 1 ), + YAML_SIGNED( "rotEncDirection", 1 ), YAML_ENUM("internalModule", 8, enum_ModuleType), YAML_STRUCT("trainer", 128, struct_TrainerData, NULL), YAML_UNSIGNED( "view", 8 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_zorro.cpp b/radio/src/storage/yaml/yaml_datastructs_zorro.cpp index c1c0ae7df..413969539 100644 --- a/radio/src/storage/yaml/yaml_datastructs_zorro.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_zorro.cpp @@ -337,7 +337,7 @@ static const struct YamlNode struct_RadioData[] = { YAML_ENUM("antennaMode", 2, enum_AntennaModes), YAML_UNSIGNED( "disableRtcWarning", 1 ), YAML_UNSIGNED( "keysBacklight", 1 ), - YAML_PADDING( 1 ), + YAML_SIGNED( "rotEncDirection", 1 ), YAML_ENUM("internalModule", 8, enum_ModuleType), YAML_STRUCT("trainer", 128, struct_TrainerData, NULL), YAML_UNSIGNED( "view", 8 ), diff --git a/radio/src/targets/common/arm/stm32/rotary_encoder_driver.cpp b/radio/src/targets/common/arm/stm32/rotary_encoder_driver.cpp index 7fbb2b451..adc38485e 100644 --- a/radio/src/targets/common/arm/stm32/rotary_encoder_driver.cpp +++ b/radio/src/targets/common/arm/stm32/rotary_encoder_driver.cpp @@ -71,6 +71,14 @@ void rotaryEncoderInit() NVIC_SetPriority(ROTARY_ENCODER_TIMER_IRQn, 7); } +#if defined(BOOT) +#define INC_ROT 1 +#define INC_ROT_2 2 +#else +#define INC_ROT (g_eeGeneral.rotEncDirection ? -1 : 1); +#define INC_ROT_2 (g_eeGeneral.rotEncDirection ? -2 : 2); +#endif + void rotaryEncoderCheck() { #if (defined(RADIO_FAMILY_T16) && !defined(RADIO_T18)) || defined(RADIO_TX12) @@ -82,22 +90,22 @@ void rotaryEncoderCheck() { if (pins == 3) { - rotencValue += 2; + rotencValue += INC_ROT_2; } else { - rotencValue -= 2; + rotencValue -= INC_ROT_2; } } else { if ((state & 0x01) ^ ((pins & 0x02) >> 1)) { - rotencValue -= 1; + rotencValue -= INC_ROT; } else { - rotencValue += 1; + rotencValue += INC_ROT; } } state &= ~0x03; @@ -105,14 +113,14 @@ void rotaryEncoderCheck() #else uint8_t newPosition = ROTARY_ENCODER_POSITION(); if (newPosition != rotencPosition && !(readKeys() & (1 << KEY_ENTER))) { -#if defined(ROTARY_ENCODER_INVERT) - if (!((rotencPosition & 0x01) ^ ((newPosition & 0x02) >> 1))) { +#if defined(RADIO_ZORRO) // zorro def. rotation dir is inverse of other radios + if (!(rotencPosition & 0x01) ^ ((newPosition & 0x02) >> 1)) { #else if ((rotencPosition & 0x01) ^ ((newPosition & 0x02) >> 1)) { #endif - --rotencValue; + rotencValue -= INC_ROT; } else { - ++rotencValue; + rotencValue += INC_ROT; } rotencPosition = newPosition; #endif diff --git a/radio/src/targets/simu/opentxsimulator.cpp b/radio/src/targets/simu/opentxsimulator.cpp index 727d423e5..49d83951f 100644 --- a/radio/src/targets/simu/opentxsimulator.cpp +++ b/radio/src/targets/simu/opentxsimulator.cpp @@ -277,6 +277,8 @@ void OpenTxSimulator::setInputValue(int type, uint8_t index, int16_t value) void OpenTxSimulator::rotaryEncoderEvent(int steps) { #if defined(ROTARY_ENCODER_NAVIGATION) + (g_eeGeneral.rotEncDirection ? steps *= -1 : steps); + ROTARY_ENCODER_NAVIGATION_VALUE += steps * ROTARY_ENCODER_GRANULARITY; #else // TODO : this should probably be handled in the GUI diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index 3994d9bd9..f9b65c20f 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -41,10 +41,6 @@ void rotaryEncoderInit(); void rotaryEncoderCheck(); #endif -#if defined(RADIO_ZORRO) -#define ROTARY_ENCODER_INVERT -#endif - #define FLASHSIZE 0x80000 #define BOOTLOADER_SIZE 0x8000 #define FIRMWARE_ADDRESS 0x08000000 diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index b65850e5d..65d021c12 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -474,6 +474,7 @@ const char STR_OWN[] = TR_OWN; const char STR_DATE[] = TR_DATE; const char STR_CHANNELS_MONITOR[] = TR_CHANNELS_MONITOR; const char STR_ROTARY_ENCODER[] = TR_ROTARY_ENCODER; +const char STR_INVERT_ROTARY[] = TR_INVERT_ROTARY; const char STR_MIXERS_MONITOR[] = TR_MIXERS_MONITOR; const char STR_PATH_TOO_LONG[] = TR_PATH_TOO_LONG; const char STR_VIEW_TEXT[] = TR_VIEW_TEXT; diff --git a/radio/src/translations.h b/radio/src/translations.h index 505c22bcc..4b55de949 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -721,6 +721,7 @@ extern const char STR_GLOBAL_VAR[]; extern const char STR_OWN[]; extern const char STR_DATE[]; extern const char STR_ROTARY_ENCODER[]; +extern const char STR_INVERT_ROTARY[]; extern const char STR_CHANNELS_MONITOR[]; extern const char STR_MIXERS_MONITOR[]; extern const char STR_PATH_TOO_LONG[]; diff --git a/radio/src/translations/cn.h.txt b/radio/src/translations/cn.h.txt index 3139efe10..c91d343c5 100644 --- a/radio/src/translations/cn.h.txt +++ b/radio/src/translations/cn.h.txt @@ -808,6 +808,7 @@ #define TR_MONTH "月" #define TR_DAY "日" #define TR_ROTARY_ENCODER "滚轮" +#define TR_INVERT_ROTARY "Invert Rotary" #define TR_CHANNELS_MONITOR "通道查看器" #define TR_MIXERS_MONITOR "混控查看器" #define TR_PATH_TOO_LONG "路径太长" diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index 0a26d8498..7a6b25b9a 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -848,6 +848,7 @@ #define TR_DATE "Datum" #define TR_MONTHS { "Led", "Úno", "Bře", "Dub", "Kvě", "Čvn", "Čvc", "Srp", "Zář", "Říj", "Lis", "Pro" } #define TR_ROTARY_ENCODER "R.Enko" +#define TR_INVERT_ROTARY "Invert Rotary" #define TR_CHANNELS_MONITOR "MONITOR KANÁLU" #define TR_MIXERS_MONITOR "MONITOR MIXU" #define TR_PATH_TOO_LONG "Cesta je moc dlouhá" diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index 0d47943b1..7eb97b439 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -850,6 +850,7 @@ #define TR_DATE "Datum:" #define TR_MONTHS { "Jan", "Feb", "Mar", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez" } #define TR_ROTARY_ENCODER "Drehgeber" +#define TR_INVERT_ROTARY "Invert Rotary" #define TR_CHANNELS_MONITOR "Kanal-Monitor==>" #define TR_MIXERS_MONITOR "==>Mischer Monitor" #define TR_PATH_TOO_LONG "Pfad zu Lang" diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index b34eae0a3..06e382d94 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -855,6 +855,7 @@ #define TR_DATE "Date" #define TR_MONTHS { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" } #define TR_ROTARY_ENCODER "R.E." +#define TR_INVERT_ROTARY "Invert Rotary" #define TR_CHANNELS_MONITOR "CHANNELS MONITOR" #define TR_MIXERS_MONITOR "MIXERS MONITOR" #define TR_PATH_TOO_LONG "Path too long" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index 75e33003b..c89eec0d8 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -853,6 +853,7 @@ #define TR_DATE "Fecha" #define TR_MONTHS { "Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ago", "Sep", "Oct", "Nov", "Dic" } #define TR_ROTARY_ENCODER "R.E." +#define TR_INVERT_ROTARY "Invert Rotary" #define TR_CHANNELS_MONITOR "MONITOR CANALES" #define TR_MIXERS_MONITOR "MONITOR MEZCLAS" #define TR_PATH_TOO_LONG "Path muy largo" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index a1cb940c9..ea0454524 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -866,6 +866,7 @@ #define TR_DATE "Date" #define TR_MONTHS { "Jan", "Fev", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" } #define TR_ROTARY_ENCODER "R.E." +#define TR_INVERT_ROTARY "Invert Rotary" #define TR_CHANNELS_MONITOR "CHANNELS MONITOR" #define TR_MIXERS_MONITOR "MIXERS MONITOR" #define TR_PATH_TOO_LONG "Path too long" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index 2bdf2a225..666ad315c 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -871,6 +871,7 @@ #define TR_DATE "Date" #define TR_MONTHS { "Jan", "Fév", "Mar", "Avr", "Mai", "Jun", "Jul", "Aou", "Sep", "Oct", "Nov", "Dec" } #define TR_ROTARY_ENCODER "Enc.Rot." +#define TR_INVERT_ROTARY "Invert Rotary" #define TR_CHANNELS_MONITOR "MONITEUR CANAUX" #define TR_MIXERS_MONITOR "MONITEUR MIXAGES " #define TR_PATH_TOO_LONG "Chemin trop long" diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index 327badac2..a410268f5 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -872,6 +872,7 @@ #define TR_DATE "Data" #define TR_MONTHS { "Gen", "Feb", "Mar", "Apr", "Mag", "Giu", "Lug", "Ago", "Set", "Ott", "Nov", "Dic" } #define TR_ROTARY_ENCODER "R.E." +#define TR_INVERT_ROTARY "Invert Rotary" #define TR_CHANNELS_MONITOR "MONITOR CANALI" #define TR_MIXERS_MONITOR "MONITOR MIXER" #define TR_PATH_TOO_LONG "Path troppo lungo" diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index efeb64b0c..6fa17bd22 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -858,6 +858,7 @@ #define TR_DATE "Datum:" #define TR_MONTHS { "Jan", "Feb", "Mar", "Apr", "Mei", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec" } #define TR_ROTARY_ENCODER "Draaischakelaar" +#define TR_INVERT_ROTARY "Invert Rotary" #define TR_CHANNELS_MONITOR "Kanaal-Monitor==>" #define TR_MIXERS_MONITOR "==>MIXERS MONitor" #define TR_PATH_TOO_LONG "Pad te Lang" diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index a722029b8..dfae2d53a 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -869,6 +869,7 @@ #define TR_DATE "Data" #define TR_MONTHS { "Jan", "Fev", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" } #define TR_ROTARY_ENCODER "R.E." +#define TR_INVERT_ROTARY "Invert Rotary" #define TR_CHANNELS_MONITOR "MONITOR KANAŁÓW" #define TR_MIXERS_MONITOR "MONITOR MIKSER" #define TR_PATH_TOO_LONG "Ścieżka za długa" diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index 37fcb8484..32f347f34 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -877,6 +877,7 @@ #define TR_DATE "Data" #define TR_MONTHS { "Jan", "Fev", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" } #define TR_ROTARY_ENCODER "R.E." +#define TR_INVERT_ROTARY "Invert Rotary" #define TR_CHANNELS_MONITOR "CHANNELS MONITOR" #define TR_MIXERS_MONITOR "MIXERS MONITOR" #define TR_PATH_TOO_LONG "Path too long" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index 21f339c8f..12aa7a06f 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -877,6 +877,7 @@ #define TR_DATE "Datum" #define TR_MONTHS { "Jan", "Fev", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" } #define TR_ROTARY_ENCODER "R.Enks" +#define TR_INVERT_ROTARY "Invert Rotary" #define TR_CHANNELS_MONITOR "Kanalöversikt" #define TR_MIXERS_MONITOR "MIXER-SKÄRM" #define TR_PATH_TOO_LONG "För lång sökväg" diff --git a/radio/src/translations/tw.h.txt b/radio/src/translations/tw.h.txt index a4328692f..94bdb2cbf 100644 --- a/radio/src/translations/tw.h.txt +++ b/radio/src/translations/tw.h.txt @@ -809,6 +809,7 @@ #define TR_MONTH "月" #define TR_DAY "日" #define TR_ROTARY_ENCODER "滾輪" +#define TR_INVERT_ROTARY "Invert Rotary" #define TR_CHANNELS_MONITOR "通道查看器" #define TR_MIXERS_MONITOR "混控查看器" #define TR_PATH_TOO_LONG "路徑太長"