diff --git a/.github/stale.yml b/.github/stale.yml new file mode 100644 index 000000000..38fce078d --- /dev/null +++ b/.github/stale.yml @@ -0,0 +1,17 @@ +# Number of days of inactivity before an issue becomes stale +daysUntilStale: 180 +# Number of days of inactivity before a stale issue is closed +daysUntilClose: 90 +# Issues with these labels will never be considered stale +exemptLabels: + - pinned + - Bug +# Label to use when marking an issue as stale +staleLabel: stale +# Comment to post when marking an issue as stale. Set to `false` to disable +markComment: > + This issue has been automatically marked as stale because it has not had + recent activity. It will be closed if no further activity occurs. Thank you + for your contributions. +# Comment to post when closing a stale issue. Set to `false` to disable +closeComment: false diff --git a/CREDITS.txt b/CREDITS.txt index 40bca616c..af9c13330 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -40,8 +40,7 @@ Michael Byrne Craft & Theory (monthly) OpenTX Manuals by Lothar Thole Team BlackSheep -Team BlackSheep -www.3dxr.co.uk +3DXR [People who have donated to OpenTX] Mario Sette @@ -1518,3 +1517,19 @@ Jean Gaillard Michel Garbarino For Our Better World Lothar Herrl +James Rhodes +Edward Glover +James Snodgrass +Dwayne Carden +Gerald Migely +Mark Schmidt +Hendrik Goessaert +Arturas Giedraitis +Paul Vernon +Rick Smith +Marcin Galczynski +Tom Knudtson +Sascha Heinrich +James Snodgrass +Alain Labonne +Darko Perković diff --git a/companion/src/CMakeLists.txt b/companion/src/CMakeLists.txt index d8fa6efc0..24224ef17 100644 --- a/companion/src/CMakeLists.txt +++ b/companion/src/CMakeLists.txt @@ -404,6 +404,7 @@ elseif(WIN32) set(wdqtopts ${wdqtopts} -dir "\"${INSTALL_DESTINATION}\"" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/Release/${COMPANION_NAME}.exe" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/Release/${SIMULATOR_NAME}.exe") # Add installer command to execute windeployqt + message(STATUS "windeployqt command: ${QT_BIN_DIR}/windeployqt.exe ${wdqtopts}") install(CODE "execute_process(COMMAND \"${QT_BIN_DIR}/windeployqt.exe\" ${wdqtopts})") # SDL dll diff --git a/companion/src/apppreferencesdialog.ui b/companion/src/apppreferencesdialog.ui index c72a15fa7..ca015d2dc 100644 --- a/companion/src/apppreferencesdialog.ui +++ b/companion/src/apppreferencesdialog.ui @@ -26,7 +26,17 @@ true - + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + @@ -35,7 +45,7 @@ - 0 + 1 @@ -51,40 +61,22 @@ - - 0 - - - 0 - - - 0 - - - 0 - 5 4 + + 0 + - - 0 - - - 0 - - - 0 - - + 0 @@ -734,31 +726,6 @@ Mode 4: - - - - - 0 - 0 - - - - - Use releases (stable) - - - - - Use releases and release candidates (testing) - - - - - Use nightly builds (unstable) - - - - @@ -810,7 +777,7 @@ Mode 4: - + @@ -823,7 +790,24 @@ Mode 4: - + + + + Qt::Horizontal + + + + + + + Show splash screen when Companion starts + + + true + + + + @@ -836,13 +820,6 @@ Mode 4: - - - - Qt::Horizontal - - - @@ -856,17 +833,7 @@ Mode 4: - - - - Show splash screen when Companion starts - - - true - - - - + @@ -890,7 +857,14 @@ Mode 4: - + + + + Qt::Horizontal + + + + @@ -917,7 +891,17 @@ Mode 4: - + + + + <html><head/><body><p>This option maintains the behaviour from older OpenTx versions where empty model slots are preserved when a model is deleted or moved. </p><p>When this option is de-selected, the other models may be re-arranged to fill the gap left by the removed model.</p></body></html> + + + Remove empty model slots when deleting models (only applies for radios w/out categories) + + + + @@ -930,24 +914,20 @@ Mode 4: - - - - Qt::Horizontal + + + + + 0 + 0 + + + + Debug Output Logging - - - <html><head/><body><p>This option maintains the behaviour from older OpenTx versions where empty model slots are preserved when a model is deleted or moved. </p><p>When this option is de-selected, the other models may be re-arranged to fill the gap left by the removed model.</p></body></html> - - - Remove empty model slots when deleting models (only applies for radios w/out categories) - - - - @@ -981,7 +961,7 @@ Mode 4: - + @@ -994,27 +974,14 @@ Mode 4: - - - - - 0 - 0 - - - - Debug Output Logging - - - - + Qt::Horizontal - + @@ -1034,14 +1001,14 @@ Mode 4: - + Qt::Horizontal - + @@ -1065,7 +1032,7 @@ Mode 4: - + @@ -1086,7 +1053,53 @@ Mode 4: - + + + + Qt::Horizontal + + + + + + + + 0 + 0 + + + + User Splash Screens + + + + + + + + 0 + 0 + + + + Splash Screen Library + + + + + + + + 0 + 0 + + + + Action on New Model + + + + @@ -1110,50 +1123,36 @@ Mode 4: - - - - - 0 - 0 - - - - Splash Screen Library - - - - - - - Qt::Horizontal - - - - - - - - 0 - 0 - - - - User Splash Screens - - - - + + + Release channel + + + + + - + 0 0 - - Action on New Model - + + + Releases (stable) + + + + + Release candidates (testing) + + + + + Nightly builds (unstable) + + @@ -1410,20 +1409,9 @@ Mode 4: - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - tabWidget profileNameLE boardCB sdPath diff --git a/companion/src/constants.h b/companion/src/constants.h index fdabacbc4..d2d32a745 100644 --- a/companion/src/constants.h +++ b/companion/src/constants.h @@ -38,7 +38,7 @@ #define CPN_MAX_MODULES 2 #define CPN_MAX_STICKS Board::STICK_AXIS_COUNT #define CPN_MAX_TRIMS Board::TRIM_AXIS_COUNT -#define CPN_MAX_KNOBS 4 +#define CPN_MAX_KNOBS 8 #define CPN_MAX_SLIDERS 4 #define CPN_MAX_POTS (CPN_MAX_KNOBS + CPN_MAX_SLIDERS) #define CPN_MAX_CYC 3 diff --git a/companion/src/firmwares/boards.cpp b/companion/src/firmwares/boards.cpp index 2feff463d..f753b354e 100644 --- a/companion/src/firmwares/boards.cpp +++ b/companion/src/firmwares/boards.cpp @@ -70,6 +70,7 @@ uint32_t Boards::getFourCC(Type board) return 0x3578746F; case BOARD_TARANIS_X9D: case BOARD_TARANIS_X9DP: + case BOARD_TARANIS_X9DP_2019: return 0x3378746F; case BOARD_TARANIS_X9LITE: return 0x3C78746F; @@ -113,6 +114,7 @@ const int Boards::getEEpromSize(Board::Type board) case BOARD_TARANIS_X9LITE: case BOARD_TARANIS_X9D: case BOARD_TARANIS_X9DP: + case BOARD_TARANIS_X9DP_2019: case BOARD_TARANIS_X9E: case BOARD_JUMPER_T12: return EESIZE_TARANIS; @@ -147,6 +149,7 @@ const int Boards::getFlashSize(Type board) case BOARD_TARANIS_X9LITE: case BOARD_TARANIS_X9D: case BOARD_TARANIS_X9DP: + case BOARD_TARANIS_X9DP_2019: case BOARD_TARANIS_X9E: case BOARD_JUMPER_T12: return FSIZE_TARANIS; @@ -223,7 +226,7 @@ const SwitchInfo Boards::getSwitchInfo(Board::Type board, int index) {SWITCH_2POS, "SF"}, {SWITCH_3POS, "SG"}, {SWITCH_TOGGLE, "SH"}, - {SWITCH_3POS, "SI"}, + {board == Board::BOARD_TARANIS_X9DP_2019 ? SWITCH_TOGGLE : SWITCH_3POS, "SI"}, {SWITCH_3POS, "SJ"}, {SWITCH_3POS, "SK"}, {SWITCH_3POS, "SL"}, @@ -267,9 +270,19 @@ const int Boards::getCapability(Board::Type board, Board::Capability capability) return 2; else if (IS_TARANIS_X9E(board)) return 4; + else if (IS_HORUS_X10(board)) + return 5; + else if (IS_HORUS_X12S(board)) + return 3; else return 3; + case PotsStorage: + if (IS_HORUS(board)) + return 5; + else + return getCapability(board, Pots); + case FactoryInstalledPots: if (IS_TARANIS_X9(board)) return 2; @@ -284,8 +297,14 @@ const int Boards::getCapability(Board::Type board, Board::Capability capability) else return 0; + case SlidersStorage: + if (IS_HORUS_X10(board)) + return 4; + else + return getCapability(board, Sliders); + case MouseAnalogs: - if (IS_HORUS_X12S(board)) + if (IS_HORUS(board)) return 2; else return 0; @@ -317,9 +336,13 @@ const int Boards::getCapability(Board::Type board, Board::Capability capability) else if (IS_TARANIS_XLITES(board)) return 6; else if (IS_TARANIS_XLITE(board)) - return 4; - else if (IS_HORUS_OR_TARANIS(board)) + return 6; + else if (IS_TARANIS(board)) return 8; + else if (board == Board::BOARD_TARANIS_X9DP_2019) + return 9; + else if (IS_HORUS(board)) + return 10; else return 7; @@ -445,6 +468,8 @@ const QString Boards::getAnalogInputName(Board::Type board, int index) "S1", "6P", "S2", + "EX1", + "EX2", "LS", "RS" }; @@ -483,6 +508,8 @@ const QString Boards::getBoardName(Board::Type board) return "Taranis X9D"; case BOARD_TARANIS_X9DP: return "Taranis X9D+"; + case BOARD_TARANIS_X9DP_2019: + return "Taranis X9D+ 2019"; case BOARD_TARANIS_X9E: return "Taranis X9E"; case BOARD_TARANIS_X9LITE: diff --git a/companion/src/firmwares/boards.h b/companion/src/firmwares/boards.h index e9fe9ae54..1533107c3 100644 --- a/companion/src/firmwares/boards.h +++ b/companion/src/firmwares/boards.h @@ -42,13 +42,14 @@ namespace Board { BOARD_TARANIS_X7, BOARD_TARANIS_X9D, BOARD_TARANIS_X9DP, + BOARD_TARANIS_X9DP_2019, BOARD_TARANIS_X9E, BOARD_X12S, BOARD_X10, BOARD_TARANIS_XLITE, BOARD_TARANIS_XLITES, BOARD_TARANIS_X9LITE, - BOARD_JUMPER_T12 + BOARD_JUMPER_T12, }; constexpr int BOARD_TYPE_MAX = BOARD_JUMPER_T12 ; @@ -113,8 +114,10 @@ namespace Board { enum Capability { Sticks, Pots, + PotsStorage, FactoryInstalledPots, Sliders, + SlidersStorage, MouseAnalogs, GyroAnalogs, MaxAnalogs, @@ -196,8 +199,8 @@ class Boards #define IS_TARANIS_XLITES(board) (board==Board::BOARD_TARANIS_XLITES) #define IS_TARANIS_X7(board) (board==Board::BOARD_TARANIS_X7) #define IS_TARANIS_X9LITE(board) (board==Board::BOARD_TARANIS_X9LITE) -#define IS_TARANIS_X9(board) (board==Board::BOARD_TARANIS_X9D || board==Board::BOARD_TARANIS_X9DP || board==Board::BOARD_TARANIS_X9E) -#define IS_TARANIS_X9D(board) (board==Board::BOARD_TARANIS_X9D || board==Board::BOARD_TARANIS_X9DP) +#define IS_TARANIS_X9(board) (board==Board::BOARD_TARANIS_X9D || board==Board::BOARD_TARANIS_X9DP || board==Board::BOARD_TARANIS_X9DP_2019 || board==Board::BOARD_TARANIS_X9E) +#define IS_TARANIS_X9D(board) (board==Board::BOARD_TARANIS_X9D || board==Board::BOARD_TARANIS_X9DP || board==Board::BOARD_TARANIS_X9DP_2019) #define IS_TARANIS_PLUS(board) (board==Board::BOARD_TARANIS_X9DP || board==Board::BOARD_TARANIS_X9E) #define IS_TARANIS_X9E(board) (board==Board::BOARD_TARANIS_X9E) #define IS_TARANIS(board) (IS_TARANIS_X9(board) || IS_TARANIS_X7(board) || IS_TARANIS_X9LITE(board) || IS_TARANIS_XLITE(board) || IS_JUMPER_T12(board)) diff --git a/companion/src/firmwares/eeprominterface.h b/companion/src/firmwares/eeprominterface.h index e8da6274d..b562f50e9 100644 --- a/companion/src/firmwares/eeprominterface.h +++ b/companion/src/firmwares/eeprominterface.h @@ -148,7 +148,8 @@ enum Capability { HasBatMeterRange, DangerousFunctions, HasModelCategories, - HasSwitchableJack + HasSwitchableJack, + PwrButtonPress }; class EEPROMInterface diff --git a/companion/src/firmwares/er9x/er9xeeprom.cpp b/companion/src/firmwares/er9x/er9xeeprom.cpp index b78538f70..82655d1d3 100644 --- a/companion/src/firmwares/er9x/er9xeeprom.cpp +++ b/companion/src/firmwares/er9x/er9xeeprom.cpp @@ -59,7 +59,7 @@ t_Er9xTrainerMix::operator TrainerMix() t_Er9xTrainerData::t_Er9xTrainerData() { - memset(this, 0, sizeof(t_Er9xTrainerData)); + memset(reinterpret_cast(this), 0, sizeof(t_Er9xTrainerData)); } t_Er9xTrainerData::operator TrainerData () @@ -74,7 +74,7 @@ t_Er9xTrainerData::operator TrainerData () t_Er9xGeneral::t_Er9xGeneral() { - memset(this, 0, sizeof(t_Er9xGeneral)); + memset(reinterpret_cast(this), 0, sizeof(t_Er9xGeneral)); } Er9xGeneral::operator GeneralSettings () @@ -334,7 +334,7 @@ t_Er9xFrSkyChannelData::operator FrSkyChannelData () t_Er9xFrSkyData::t_Er9xFrSkyData() { - memset(this, 0, sizeof(t_Er9xFrSkyData)); + memset(reinterpret_cast(this), 0, sizeof(t_Er9xFrSkyData)); } t_Er9xFrSkyData::operator FrSkyData () diff --git a/companion/src/firmwares/er9x/er9xeeprom.h b/companion/src/firmwares/er9x/er9xeeprom.h index 2ad3917cb..558702ed3 100644 --- a/companion/src/firmwares/er9x/er9xeeprom.h +++ b/companion/src/firmwares/er9x/er9xeeprom.h @@ -259,7 +259,7 @@ PACK(typedef struct t_Er9xModelData { Er9xFlightModeData flightModeData[ER9X_MAX_MODES] ; operator ModelData(); - t_Er9xModelData() { memset(this, 0, sizeof(t_Er9xModelData)); } + t_Er9xModelData() { memset(reinterpret_cast(this), 0, sizeof(t_Er9xModelData)); } }) Er9xModelData; #endif // _ER9XEEPROM_H_ diff --git a/companion/src/firmwares/ersky9x/ersky9xeeprom.cpp b/companion/src/firmwares/ersky9x/ersky9xeeprom.cpp index 647cdd8d0..f6e6752ff 100644 --- a/companion/src/firmwares/ersky9x/ersky9xeeprom.cpp +++ b/companion/src/firmwares/ersky9x/ersky9xeeprom.cpp @@ -54,7 +54,7 @@ RawSwitch ersky9xToSwitch(int8_t sw) t_Ersky9xTrainerMix::t_Ersky9xTrainerMix() { - memset(this, 0, sizeof(t_Ersky9xTrainerMix)); + memset(reinterpret_cast(this), 0, sizeof(t_Ersky9xTrainerMix)); } t_Ersky9xTrainerMix::operator TrainerMix() @@ -69,7 +69,7 @@ t_Ersky9xTrainerMix::operator TrainerMix() t_Ersky9xTrainerData::t_Ersky9xTrainerData() { - memset(this, 0, sizeof(t_Ersky9xTrainerData)); + memset(reinterpret_cast(this), 0, sizeof(t_Ersky9xTrainerData)); } t_Ersky9xTrainerData::operator TrainerData () @@ -84,7 +84,7 @@ t_Ersky9xTrainerData::operator TrainerData () t_Ersky9xGeneral::t_Ersky9xGeneral() { - memset(this, 0, sizeof(t_Ersky9xGeneral)); + memset(reinterpret_cast(this), 0, sizeof(t_Ersky9xGeneral)); } Ersky9xGeneral::operator GeneralSettings () @@ -157,7 +157,7 @@ Ersky9xGeneral::operator GeneralSettings () t_Ersky9xLimitData::t_Ersky9xLimitData() { - memset(this, 0, sizeof(t_Ersky9xLimitData)); + memset(reinterpret_cast(this), 0, sizeof(t_Ersky9xLimitData)); } t_Ersky9xLimitData::operator LimitData () @@ -172,7 +172,7 @@ t_Ersky9xLimitData::operator LimitData () t_Ersky9xMixData_v10::t_Ersky9xMixData_v10() { - memset(this, 0, sizeof(t_Ersky9xMixData_v10)); + memset(reinterpret_cast(this), 0, sizeof(t_Ersky9xMixData_v10)); } t_Ersky9xMixData_v10::operator MixData () @@ -242,7 +242,7 @@ t_Ersky9xMixData_v10::operator MixData () t_Ersky9xMixData_v11::t_Ersky9xMixData_v11() { - memset(this, 0, sizeof(t_Ersky9xMixData_v11)); + memset(reinterpret_cast(this), 0, sizeof(t_Ersky9xMixData_v11)); } t_Ersky9xMixData_v11::operator MixData () @@ -416,17 +416,17 @@ Ersky9xLogicalSwitchData_v11::operator LogicalSwitchData () t_Ersky9xSafetySwData_v10::t_Ersky9xSafetySwData_v10() { - memset(this, 0, sizeof(t_Ersky9xSafetySwData_v10)); + memset(reinterpret_cast(this), 0, sizeof(t_Ersky9xSafetySwData_v10)); } t_Ersky9xSafetySwData_v11::t_Ersky9xSafetySwData_v11() { - memset(this, 0, sizeof(t_Ersky9xSafetySwData_v11)); + memset(reinterpret_cast(this), 0, sizeof(t_Ersky9xSafetySwData_v11)); } t_Ersky9xFrSkyChannelData_v10::t_Ersky9xFrSkyChannelData_v10() { - memset(this, 0, sizeof(t_Ersky9xFrSkyChannelData_v10)); + memset(reinterpret_cast(this), 0, sizeof(t_Ersky9xFrSkyChannelData_v10)); } t_Ersky9xFrSkyChannelData_v10::operator FrSkyChannelData () @@ -450,7 +450,7 @@ t_Ersky9xFrSkyChannelData_v10::operator FrSkyChannelData () t_Ersky9xFrSkyChannelData_v11::t_Ersky9xFrSkyChannelData_v11() { - memset(this, 0, sizeof(t_Ersky9xFrSkyChannelData_v11)); + memset(reinterpret_cast(this), 0, sizeof(t_Ersky9xFrSkyChannelData_v11)); } t_Ersky9xFrSkyChannelData_v11::operator FrSkyChannelData () @@ -474,7 +474,7 @@ t_Ersky9xFrSkyChannelData_v11::operator FrSkyChannelData () t_Ersky9xFrSkyData_v10::t_Ersky9xFrSkyData_v10() { - memset(this, 0, sizeof(t_Ersky9xFrSkyData_v10)); + memset(reinterpret_cast(this), 0, sizeof(t_Ersky9xFrSkyData_v10)); } t_Ersky9xFrSkyData_v10::operator FrSkyData () @@ -487,7 +487,7 @@ t_Ersky9xFrSkyData_v10::operator FrSkyData () t_Ersky9xFrSkyData_v11::t_Ersky9xFrSkyData_v11() { - memset(this, 0, sizeof(t_Ersky9xFrSkyData_v11)); + memset(reinterpret_cast(this), 0, sizeof(t_Ersky9xFrSkyData_v11)); } t_Ersky9xFrSkyData_v11::operator FrSkyData () diff --git a/companion/src/firmwares/ersky9x/ersky9xeeprom.h b/companion/src/firmwares/ersky9x/ersky9xeeprom.h index d96dca944..e7d2ed1f8 100644 --- a/companion/src/firmwares/ersky9x/ersky9xeeprom.h +++ b/companion/src/firmwares/ersky9x/ersky9xeeprom.h @@ -129,7 +129,7 @@ PACK(typedef struct t_Ersky9xExpoData { int8_t drSw1; int8_t drSw2; - t_Ersky9xExpoData() { memset(this, 0, sizeof(t_Ersky9xExpoData)); } + t_Ersky9xExpoData() { memset(reinterpret_cast(this), 0, sizeof(t_Ersky9xExpoData)); } }) Ersky9xExpoData; @@ -196,7 +196,7 @@ PACK(typedef struct t_Ersky9xLogicalSwitchData_v10 { // Custom Switches data uint8_t func; operator LogicalSwitchData(); - t_Ersky9xLogicalSwitchData_v10() { memset(this, 0, sizeof(t_Ersky9xLogicalSwitchData_v10)); } + t_Ersky9xLogicalSwitchData_v10() { memset(reinterpret_cast(this), 0, sizeof(t_Ersky9xLogicalSwitchData_v10)); } }) Ersky9xLogicalSwitchData_v10; PACK(typedef struct t_Ersky9xLogicalSwitchData_v11 { // Custom Switches data @@ -207,7 +207,7 @@ PACK(typedef struct t_Ersky9xLogicalSwitchData_v11 { // Custom Switches data uint8_t res ; operator LogicalSwitchData(); - t_Ersky9xLogicalSwitchData_v11() { memset(this, 0, sizeof(t_Ersky9xLogicalSwitchData_v11)); } + t_Ersky9xLogicalSwitchData_v11() { memset(reinterpret_cast(this), 0, sizeof(t_Ersky9xLogicalSwitchData_v11)); } }) Ersky9xLogicalSwitchData_v11; PACK(typedef struct t_Ersky9xSafetySwData_v10 { // Custom Switches data @@ -372,7 +372,7 @@ PACK(typedef struct t_Ersky9xModelData_v10 { Ersky9xFrSkyData_v10 frsky; Ersky9xTimerMode_v10 timer[2] ; operator ModelData(); - t_Ersky9xModelData_v10() { memset(this, 0, sizeof(t_Ersky9xModelData_v10)); } + t_Ersky9xModelData_v10() { memset(reinterpret_cast(this), 0, sizeof(t_Ersky9xModelData_v10)); } }) Ersky9xModelData_v10; PACK(typedef struct t_Ersky9xModelData_v11 { @@ -430,7 +430,7 @@ PACK(typedef struct t_Ersky9xModelData_v11 { Ersky9xGvarData gvars[ERSKY9X_MAX_GVARS] ; operator ModelData(); - t_Ersky9xModelData_v11() { memset(this, 0, sizeof(t_Ersky9xModelData_v11)); } + t_Ersky9xModelData_v11() { memset(reinterpret_cast(this), 0, sizeof(t_Ersky9xModelData_v11)); } }) Ersky9xModelData_v11; #endif // _ERSKY9XEEPROM_H_ diff --git a/companion/src/firmwares/generalsettings.cpp b/companion/src/firmwares/generalsettings.cpp index 46e117c36..c9c1907be 100644 --- a/companion/src/firmwares/generalsettings.cpp +++ b/companion/src/firmwares/generalsettings.cpp @@ -65,7 +65,7 @@ bool GeneralSettings::isSliderAvailable(int index) const GeneralSettings::GeneralSettings() { - memset(this, 0, sizeof(GeneralSettings)); + memset(reinterpret_cast(this), 0, sizeof(GeneralSettings)); contrast = 25; diff --git a/companion/src/firmwares/generalsettings.h b/companion/src/firmwares/generalsettings.h index 227c0c04a..2fb98e8e6 100644 --- a/companion/src/firmwares/generalsettings.h +++ b/companion/src/firmwares/generalsettings.h @@ -130,8 +130,6 @@ class GeneralSettings { unsigned int backlightBright; unsigned int backlightOffBright; int switchesDelay; - int temperatureCalib; - int temperatureWarn; unsigned int mAhWarn; unsigned int mAhUsed; unsigned int globalTimer; @@ -172,6 +170,9 @@ class GeneralSettings { int gyroMax; int gyroOffset; + int pwrOnSpeed; + int pwrOffSpeed; + bool switchPositionAllowedTaranis(int index) const; bool switchSourceAllowedTaranis(int index) const; bool isPotAvailable(int index) const; diff --git a/companion/src/firmwares/modeldata.cpp b/companion/src/firmwares/modeldata.cpp index aea7d88e6..b615fd649 100644 --- a/companion/src/firmwares/modeldata.cpp +++ b/companion/src/firmwares/modeldata.cpp @@ -311,7 +311,7 @@ void ModelData::setTrimValue(int phaseIdx, int trimIdx, int value) return; if (p == phaseIdx || phaseIdx == 0) { trim = value; - break;; + break; } else if (mode == 0) { phaseIdx = p; diff --git a/companion/src/firmwares/modeldata.h b/companion/src/firmwares/modeldata.h index a5e53432c..732434434 100644 --- a/companion/src/firmwares/modeldata.h +++ b/companion/src/firmwares/modeldata.h @@ -185,6 +185,7 @@ class ModelData { MavlinkData mavlink; unsigned int telemetryProtocol; FrSkyData frsky; + unsigned int rssiSource; RSSIAlarmData rssiAlarms; char bitmap[10+1]; @@ -203,6 +204,8 @@ class ModelData { TopbarData topbarData; + char registrationId[8+1]; + void clear(); bool isEmpty() const; void setDefaultInputs(const GeneralSettings & settings); diff --git a/companion/src/firmwares/moduledata.h b/companion/src/firmwares/moduledata.h index c5148cde5..d96322eab 100644 --- a/companion/src/firmwares/moduledata.h +++ b/companion/src/firmwares/moduledata.h @@ -104,7 +104,10 @@ enum MultiModuleRFProtocols { MODULE_SUBTYPE_MULTI_V911S, MODULE_SUBTYPE_MULTI_GD00X, MODULE_SUBTYPE_MULTI_V761, - MODULE_SUBTYPE_MULTI_LAST = MODULE_SUBTYPE_MULTI_V761 + MODULE_SUBTYPE_MULTI_KF606, + MODULE_SUBTYPE_MULTI_REDPINE, + MODULE_SUBTYPE_MULTI_POTENSIC, + MODULE_SUBTYPE_MULTI_LAST = MODULE_SUBTYPE_MULTI_POTENSIC }; enum TrainerProtocol { diff --git a/companion/src/firmwares/multiprotocols.cpp b/companion/src/firmwares/multiprotocols.cpp index 87104eaee..7378cacb2 100644 --- a/companion/src/firmwares/multiprotocols.cpp +++ b/companion/src/firmwares/multiprotocols.cpp @@ -64,6 +64,8 @@ static const QStringList STR_SUBTYPE_HITEC {"Optima", "Optima Hub Telem", "M static const QStringList STR_SUBTYPE_BUGS_MINI {"Standard", "Bugs 3H"}; static const QStringList STR_SUBTYPE_E01X {"E012", "E015", "E016H"}; static const QStringList STR_SUBTYPE_GD00X {"GD V1", "GD V2"}; +static const QStringList STR_SUBTYPE_REDPINE {"Fast", "Slow"}; +static const QStringList STR_SUBTYPE_POTENSIC {"A20 Firefly", " - "}; static const QStringList NO_SUBTYPE {STR_MULTI_DEFAULT}; @@ -100,7 +102,11 @@ const Multiprotocols multiProtocols { {MODULE_SUBTYPE_MULTI_HITEC, 2, false, STR_SUBTYPE_HITEC, STR_MULTI_RFTUNE}, {MODULE_SUBTYPE_MULTI_BUGS_MINI, 1, false, STR_SUBTYPE_BUGS_MINI, nullptr}, {MODULE_SUBTYPE_MULTI_E01X, 2, false, STR_SUBTYPE_E01X, nullptr}, + {MODULE_SUBTYPE_MULTI_V911S, 0, false, NO_SUBTYPE, STR_MULTI_RFTUNE}, {MODULE_SUBTYPE_MULTI_GD00X, 1, false, STR_SUBTYPE_GD00X, nullptr}, + {MODULE_SUBTYPE_MULTI_KF606, 0, false, NO_SUBTYPE, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_REDPINE, 1, false, STR_SUBTYPE_REDPINE, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_POTENSIC, 1, false, STR_SUBTYPE_POTENSIC, nullptr}, {MM_RF_CUSTOM_SELECTED, 7, true, STR_SUBTYPE_CUSTOM, STR_MULTI_OPTION}, // Sentinel and default for protocols not listed above (MM_RF_CUSTOM is 0xff) @@ -142,7 +148,8 @@ QString Multiprotocols::protocolToString(int protocol, bool custom) "FlySky", "Hubsan", "FrSky", "Hisky", "V2x2", "DSM", "Devo", "YD717", "KN", "SymaX", "SLT", "CX10", "CG023", "Bayang", "ESky", "MT99XX", "MJXQ", "Shenqi", "FY326", "SFHSS", "J6 PRO","FQ777","Assan","Hontai","Open LRS", "FlySky AFHDS2A", "Q2x2", "Walkera", "Q303", "GW008", "DM002", "Cabell", "ESky 150", "H8 3D", "Corona", "CFlie", - "Hitec", "Wfly", "Bugs", "Bugs Mini", "Traxxas", "NCC-1701-A", "E01X", "V911S", "GD00X", "V761" + "Hitec", "Wfly", "Bugs", "Bugs Mini", "Traxxas", "NCC-1701-A", "E01X", "WL Heli V911S", "GD00X", "Volantex V761", + "KFPlan KF606", "Redpine", "Potensic" }); if (protocol == MM_RF_CUSTOM_SELECTED || custom) diff --git a/companion/src/firmwares/opentx/opentxeeprom.cpp b/companion/src/firmwares/opentx/opentxeeprom.cpp index 5968af129..b50228604 100644 --- a/companion/src/firmwares/opentx/opentxeeprom.cpp +++ b/companion/src/firmwares/opentx/opentxeeprom.cpp @@ -18,21 +18,59 @@ * GNU General Public License for more details. */ +#include +#include #include "boards.h" #include "helpers.h" #include "opentxeeprom.h" #include "customdebug.h" -#include -#include +#include "opentxinterface.h" using namespace Board; #define MAX_VIEWS(board) (HAS_LARGE_LCD(board) ? 2 : 256) -#define MAX_SLIDERS(board) (IS_HORUS_X10(board) ? 4 : (Boards::getCapability(board, Board::Sliders))) //TODO need to be remove when x10 eeprom gets fixed -#define MAX_MOUSE_ANALOGS(board) (IS_HORUS_X10(board) ? 2 : (Boards::getCapability(board, Board::MouseAnalogs))) //TODO need to be remove when x10 eeprom gets fixed #define MAX_GYRO_ANALOGS(board, version) (version >= 219 ? Boards::getCapability(board, Board::GyroAnalogs) : 0) -#define MAX_SWITCHES(board, version) (version <= 218 && IS_TARANIS_X7(board) ? 6 : Boards::getCapability(board, Board::Switches)) -#define MAX_SWITCH_SLOTS(board, version) (IS_TARANIS_X9E(board) ? 32 : 8) // bitsize of swconfig_t / 2 (see radio/src/datastructs.h) + +inline int MAX_SWITCHES(Board::Type board, int version) +{ + if (version <= 218 && IS_TARANIS_X7(board)) + return 6; + if (version <= 218 && (IS_TARANIS_X9D(board) || IS_HORUS(board))) + return 8; + return Boards::getCapability(board, Board::Switches); +} + +#define MAX_KNOBS(board, version) (IS_HORUS(board) ? 8 : 4) + +inline int MAX_POTS(Board::Type board, int version) +{ + if (version <= 218 && IS_HORUS(board)) + return 3; + return Boards::getCapability(board, Board::Pots); +} + +inline int MAX_POTS_STORAGE(Board::Type board, int version) +{ + if (version <= 218 && IS_HORUS(board)) + return 3; + return Boards::getCapability(board, Board::PotsStorage); +} + +// bitsize of swconfig_t / 2 (see radio/src/datastructs.h) +inline int MAX_SWITCH_SLOTS(Board::Type board, int version) +{ + if (IS_TARANIS_X9E(board)) + return 32; + + if (IS_HORUS(board)) + return 16; + + if (version >= 219 && IS_TARANIS_X9D(board)) + return 16; + + return 8; +} + #define MAX_SWITCHES_POSITION(board, version) (Boards::getCapability(board, Board::SwitchPositions)) #define MAX_ROTARY_ENCODERS(board) (IS_SKY9X(board) ? 1 : 0) #define MAX_FLIGHT_MODES(board, version) 9 @@ -84,7 +122,7 @@ class SwitchesConversionTable: public ConversionTable { } if (IS_HORUS_OR_TARANIS(board)) { - for (int i=1; i<=Boards::getCapability(board, Board::Pots)*6; i++) { + for (int i=1; i<=MAX_POTS(board, version)*6; i++) { addConversion(RawSwitch(SWITCH_TYPE_MULTIPOS_POT, -i), -val+offset); addConversion(RawSwitch(SWITCH_TYPE_MULTIPOS_POT, i), val++); } @@ -206,7 +244,7 @@ class SourcesConversionTable: public ConversionTable { } } - for (int i=0; i >(this, csw.func, &functionsConversionTable, "Function")); internalField.Append(new SignedField<10>(this, v1)); internalField.Append(new SignedField<10>(this, v3)); - internalField.Append(new ConversionField< SignedField<9> >(this, (int &)csw.andsw, andswitchesConversionTable, "AND switch")); + internalField.Append(new ConversionField< SignedField<9> >(this, (int &)csw.andsw, switchesConversionTable, "AND switch")); internalField.Append(new SpareBitsField<1>(this)); // TODO extra switch mode internalField.Append(new SpareBitsField<2>(this)); internalField.Append(new SignedField<16>(this, v2)); @@ -1263,16 +1245,15 @@ class LogicalSwitchField: public TransformedField { internalField.Append(new ConversionField< UnsignedField<8> >(this, csw.delay, 0, scale)); internalField.Append(new ConversionField< UnsignedField<8> >(this, csw.duration, 0, scale)); if (version == 217) { - internalField.Append(new ConversionField< SignedField<8> >(this, (int &)csw.andsw, andswitchesConversionTable, "AND switch")); + internalField.Append(new ConversionField< SignedField<8> >(this, (int &)csw.andsw, switchesConversionTable, "AND switch")); } } ~LogicalSwitchField() { - delete andswitchesConversionTable; } - virtual void beforeExport() + void beforeExport() override { if (csw.func == LS_FN_TIMER) { v1 = csw.val1; @@ -1297,7 +1278,7 @@ class LogicalSwitchField: public TransformedField { } } - virtual void afterImport() + void afterImport() override { if (csw.func == LS_FN_TIMER) { csw.val1 = v1; @@ -1334,7 +1315,6 @@ class LogicalSwitchField: public TransformedField { LogicalSwitchesFunctionsTable functionsConversionTable; SourcesConversionTable * sourcesConversionTable; SwitchesConversionTable * switchesConversionTable; - ConversionTable * andswitchesConversionTable; int v1; int v2; int v3; @@ -1408,12 +1388,12 @@ class SwitchesWarningField: public TransformedField { { } - virtual void beforeExport() + void beforeExport() override { _sw = sw; } - virtual void afterImport() + void afterImport() override { sw = _sw; qCDebug(eepromImport) << QString("imported %1").arg(internalField.getName()); @@ -1593,101 +1573,6 @@ class ArmCustomFunctionField: public TransformedField { unsigned int _mode; }; -class AvrCustomFunctionField: public TransformedField { - public: - AvrCustomFunctionField(DataField * parent, CustomFunctionData & fn, Board::Type board, unsigned int version, unsigned int variant): - TransformedField(parent, internalField), - internalField(this, "CustomFunction"), - fn(fn), - board(board), - version(version), - variant(variant), - functionsConversionTable(board, version), - sourcesConversionTable(SourcesConversionTable::getInstance(board, version, variant, 0)), - _param(0), - _mode(0), - _union_param(0), - _active(0) - { - internalField.Append(new SwitchField<6>(this, fn.swtch, board, version)); - internalField.Append(new ConversionField< UnsignedField<4> >(this, (unsigned int &)fn.func, &functionsConversionTable, "Function", DataField::tr("OpenTX on this board doesn't accept this function"))); - internalField.Append(new UnsignedField<5>(this, _union_param)); - internalField.Append(new UnsignedField<1>(this, _active)); - internalField.Append(new UnsignedField<8>(this, _param)); - } - - virtual void beforeExport() - { - _param = fn.param; - _active = (fn.enabled ? 1 : 0); - - if (fn.func >= FuncOverrideCH1 && fn.func <= FuncOverrideCH32) { - _union_param = fn.func - FuncOverrideCH1; - } - else if (fn.func >= FuncTrainer && fn.func <= FuncTrainerAIL) { - _union_param = fn.func - FuncTrainer; - } - else if (fn.func >= FuncAdjustGV1 && fn.func <= FuncAdjustGVLast) { - _union_param = fn.adjustMode; - _union_param += (fn.func - FuncAdjustGV1) << 2; - if (fn.adjustMode == 1) - sourcesConversionTable->exportValue(fn.param, (int &)_param); - else if (fn.adjustMode == 2) - _param = RawSource(fn.param).index; - } - else if (fn.func == FuncPlayValue) { - _union_param = fn.repeatParam / 10; - sourcesConversionTable->exportValue(fn.param, (int &)_param); - } - else if (fn.func == FuncPlaySound || fn.func == FuncPlayPrompt || fn.func == FuncPlayBoth) { - _union_param = fn.repeatParam / 10; - } - } - - virtual void afterImport() - { - fn.param = _param; - fn.enabled = (_active & 0x01); - - if (fn.func >= FuncOverrideCH1 && fn.func <= FuncOverrideCH32) { - fn.func = AssignFunc(fn.func + _union_param); - fn.param = (int8_t)fn.param; - } - else if (fn.func >= FuncTrainer && fn.func <= FuncTrainerAIL) { - fn.func = AssignFunc(fn.func + _union_param); - } - else if (fn.func >= FuncAdjustGV1 && fn.func <= FuncAdjustGVLast) { - fn.func = AssignFunc(fn.func + (_union_param >> 2)); - fn.adjustMode = (_union_param & 0x03); - if (fn.adjustMode == 1) - sourcesConversionTable->importValue(_param, (int &)fn.param); - else if (fn.adjustMode == 2) - fn.param = RawSource(SOURCE_TYPE_GVAR, _param).toValue(); - } - else if (fn.func == FuncPlayValue) { - fn.repeatParam = _union_param * 10; - sourcesConversionTable->importValue(_param, (int &)fn.param); - } - else if (fn.func == FuncPlaySound || fn.func == FuncPlayPrompt || fn.func == FuncPlayBoth) { - fn.repeatParam = _union_param * 10; - } - qCDebug(eepromImport) << QString("imported %1").arg(internalField.getName()); - } - - protected: - StructField internalField; - CustomFunctionData & fn; - Board::Type board; - unsigned int version; - unsigned int variant; - CustomFunctionsConversionTable functionsConversionTable; - SourcesConversionTable * sourcesConversionTable; - unsigned int _param; - unsigned int _mode; - unsigned int _union_param; - unsigned int _active; -}; - class FrskyScreenField: public DataField { public: FrskyScreenField(DataField * parent, FrSkyScreenData & screen, Board::Type board, unsigned int version, unsigned int variant): @@ -1860,9 +1745,9 @@ class TelemetryCurrentSourceConversionTable: public ConversionTable } }; -class FrskyField: public StructField { +class Frsky218Field: public StructField { public: - FrskyField(DataField * parent, FrSkyData & frsky, RSSIAlarmData & rssiAlarms, Board::Type board, unsigned int version, unsigned int variant): + Frsky218Field(DataField * parent, FrSkyData & frsky, RSSIAlarmData & rssiAlarms, Board::Type board, unsigned int version, unsigned int variant): StructField(parent, "FrSky"), telemetryVarioSourceConversionTable(board, version), screenTypesConversionTable(board, version), @@ -1909,6 +1794,20 @@ class FrskyField: public StructField { TelemetryCurrentSourceConversionTable telemetryCurrentSourceConversionTable; }; +class VarioField: public StructField { + public: + VarioField(DataField * parent, FrSkyData & frsky, Board::Type board, unsigned int version, unsigned int variant): + StructField(parent, "Vario") + { + Append(new UnsignedField<7>(this, frsky.varioSource, "Vario Source")); + Append(new BoolField<1>(this, frsky.varioCenterSilent)); + Append(new SignedField<8>(this, frsky.varioCenterMax)); + Append(new SignedField<8>(this, frsky.varioCenterMin)); + Append(new SignedField<8>(this, frsky.varioMin)); + Append(new SignedField<8>(this, frsky.varioMax)); + } +}; + /* * TODO */ @@ -2064,7 +1963,10 @@ OpenTxModelData::OpenTxModelData(ModelData & modelData, Board::Type board, unsig internalField.Append(new UnsignedField<8>(this, modelData.moduleData[1].modelId)); if (HAS_LARGE_LCD(board)) { - internalField.Append(new CharField<10>(this, modelData.bitmap, true, "Model bitmap")); + if (version >= 219 && IS_HORUS(board)) + internalField.Append(new CharField<14>(this, modelData.bitmap, true, "Model bitmap")); + else + internalField.Append(new CharField<10>(this, modelData.bitmap, true, "Model bitmap")); } for (int i=0; i= 219) { - // TODO RSSI SOURCE - internalField.Append(new SpareBitsField<8>(this)); + if (version <= 218) { + internalField.Append(new Frsky218Field(this, modelData.frsky, modelData.rssiAlarms, board, version, variant)); + } + else { + internalField.Append(new VarioField(this, modelData.frsky, board, version, variant)); + internalField.Append(new UnsignedField<8>(this, modelData.rssiSource)); if (IS_TARANIS_X9(board)) { // TODO TOPBAR internalField.Append(new SpareBitsField<16>(this)); } - // TODO RSSI ALARMS - internalField.Append(new SpareBitsField<16>(this)); + internalField.Append(new BoolField<1>(this, modelData.rssiAlarms.disabled)); + internalField.Append(new SpareBitsField<1>(this)); + internalField.Append(new ConversionField >(this, modelData.rssiAlarms.warning, -45)); + internalField.Append(new SpareBitsField<2>(this)); + internalField.Append(new ConversionField >(this, modelData.rssiAlarms.critical, -42)); } if (IS_STM32(board) && version <= 218) { @@ -2266,13 +2171,13 @@ OpenTxModelData::OpenTxModelData(ModelData & modelData, Board::Type board, unsig } for (int i=0; i<8; i++) { - if (i < Boards::getCapability(board, Board::Pots) + MAX_SLIDERS(board)) + if (i < Boards::getCapability(board, Board::Pots) + Boards::getCapability(board, Board::Sliders)) internalField.Append(new BoolField<1>(this, modelData.potsWarningEnabled[i])); else internalField.Append(new SpareBitsField<1>(this)); } - for (int i=0; i < Boards::getCapability(board, Board::Pots) + MAX_SLIDERS(board); i++) { + for (int i=0; i < Boards::getCapability(board, Board::Pots) + Boards::getCapability(board, Board::Sliders); i++) { internalField.Append(new SignedField<8>(this, modelData.potPosition[i])); } @@ -2303,6 +2208,11 @@ OpenTxModelData::OpenTxModelData(ModelData & modelData, Board::Type board, unsig for (int i = 0; i < 4; i++) { internalField.Append(new FrskyScreenField(this, modelData.frsky.screens[i], board, version, variant)); } + internalField.Append(new SpareBitsField<8>(this)); // current view + } + + if (version >= 219) { + internalField.Append(new ZCharField<8>(this, modelData.registrationId, "ACCESS Registration ID")); } } @@ -2371,7 +2281,7 @@ void OpenTxModelData::afterImport() } else if (modelData.moduleData[module].protocol == PULSES_MULTIMODULE) { // Copy data from ppm struct to multi struct - unsigned int multiByte = (unsigned int)((modelData.moduleData[module].ppm.delay - 300) / 50); + auto multiByte = (unsigned int)((modelData.moduleData[module].ppm.delay - 300) / 50); modelData.moduleData[module].multi.rfProtocol = (subprotocols[module] & 0x0f) | ((multiByte & 0x3) << 4); modelData.moduleData[module].multi.customProto = (multiByte & 0x80) == 0x80; modelData.moduleData[module].multi.optionValue = modelData.moduleData[module].ppm.frameLength; @@ -2382,7 +2292,7 @@ void OpenTxModelData::afterImport() if ((modelData.moduleData[module].protocol >= PULSES_PXX_XJT_X16 && modelData.moduleData[module].protocol <= PULSES_PXX_XJT_LR12) || modelData.moduleData[module].protocol == PULSES_PXX_R9M) { // Do the same for pxx - unsigned int pxxByte = (unsigned int)((modelData.moduleData[module].ppm.delay - 300) / 50); + auto pxxByte = (unsigned int)((modelData.moduleData[module].ppm.delay - 300) / 50); modelData.moduleData[module].pxx.power = pxxByte & 0x03; modelData.moduleData[module].pxx.receiver_telem_off = static_cast(pxxByte & (1 << 4)); modelData.moduleData[module].pxx.receiver_channel_9_16 = static_cast(pxxByte & (1 << 5)); @@ -2405,12 +2315,12 @@ void OpenTxModelData::afterImport() } OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, Board::Type board, unsigned int version, unsigned int variant): - TransformedField(NULL, internalField), + TransformedField(nullptr, internalField), internalField(this, "General Settings"), generalData(generalData), board(board), version(version), - inputsCount(CPN_MAX_STICKS + Boards::getCapability(board, Board::Pots) + MAX_SLIDERS(board) + MAX_MOUSE_ANALOGS(board)) + inputsCount(CPN_MAX_STICKS + Boards::getCapability(board, Board::PotsStorage) + Boards::getCapability(board, Board::SlidersStorage) + Boards::getCapability(board, Board::MouseAnalogs)) { qCDebug(eepromImport) << QString("OpenTxGeneralData::OpenTxGeneralData(board: %1, version:%2, variant:%3)").arg(board).arg(version).arg(variant); @@ -2421,6 +2331,10 @@ OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, Board::Type internalField.Append(new UnsignedField<16>(this, generalData.variant)); for (int i=0; i(this, generalData.calibMid[i])); internalField.Append(new SignedField<16>(this, generalData.calibSpanNeg[i])); internalField.Append(new SignedField<16>(this, generalData.calibSpanPos[i])); @@ -2463,7 +2377,7 @@ OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, Board::Type } internalField.Append(new UnsignedField<8>(this, generalData.inactivityTimer)); - internalField.Append(new SpareBitsField<3>(this)); + internalField.Append(new SpareBitsField<3>(this)); // telemetryBaudrate if (IS_HORUS(board)) internalField.Append(new SpareBitsField<3>(this)); else if (IS_TARANIS(board)) @@ -2502,11 +2416,11 @@ OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, Board::Type internalField.Append(new UnsignedField<8>(this, generalData.backlightBright)); if (version < 218) internalField.Append(new SignedField<8>(this, generalData.txCurrentCalibration)); - if (version < 218) internalField.Append(new SignedField<8>(this, generalData.temperatureWarn)); + if (version < 218) internalField.Append(new SpareBitsField<8>(this)); if (version < 218) internalField.Append(new UnsignedField<8>(this, generalData.mAhWarn)); if (version < 218) internalField.Append(new UnsignedField<16>(this, generalData.mAhUsed)); internalField.Append(new UnsignedField<32>(this, generalData.globalTimer)); - if (version < 218) internalField.Append(new SignedField<8>(this, generalData.temperatureCalib)); + if (version < 218) internalField.Append(new SpareBitsField<8>(this)); internalField.Append(new UnsignedField<4>(this, generalData.bluetoothBaudrate)); internalField.Append(new UnsignedField<4>(this, generalData.bluetoothMode)); if (version < 218) internalField.Append(new BoolField<8>(this, generalData.optrexDisplay)); @@ -2514,7 +2428,16 @@ OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, Board::Type if (version < 218) internalField.Append(new UnsignedField<8>(this, generalData.rotarySteps)); - internalField.Append(new UnsignedField<8>(this, generalData.countryCode)); + internalField.Append(new UnsignedField<2>(this, generalData.countryCode)); + + if (version >= 219 && IS_HORUS_OR_TARANIS(board)) { + internalField.Append(new SignedField<3>(this, generalData.pwrOnSpeed, "Power On Speed")); + internalField.Append(new SignedField<3>(this, generalData.pwrOffSpeed, "Power Off Speed")); + } + else { + internalField.Append(new SpareBitsField<6>(this)); + } + internalField.Append(new UnsignedField<1>(this, generalData.imperial)); if (version >= 218) { internalField.Append(new BoolField<1>(this, generalData.jitterFilter)); @@ -2553,6 +2476,7 @@ OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, Board::Type if (IS_STM32(board)) { if (version >= 218) { internalField.Append(new UnsignedField<4>(this, generalData.hw_uartMode)); + // not on Horus... for (uint8_t i=0; i<4; i++) { internalField.Append(new UnsignedField<1>(this, generalData.sliderConfig[i])); } @@ -2569,29 +2493,42 @@ OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, Board::Type } if (IS_HORUS(board)) { - for (int i=0; i<16; i++) { + for (int i=0; i(this, generalData.switchConfig[i])); else internalField.Append(new SpareBitsField<2>(this)); } } - for (int i=0; i<4; i++) { - if (i < Boards::getCapability(board, Board::Pots)) + for (int i=0; i(this, generalData.potConfig[i])); else internalField.Append(new SpareBitsField<2>(this)); } + if (IS_HORUS(board)) { + for (int i=0; i<8; i++) { + if (i < Boards::getCapability(board, Board::SlidersStorage)) + internalField.Append(new UnsignedField<1>(this, generalData.sliderConfig[i])); + else + internalField.Append(new SpareBitsField<1>(this)); + } + } if (!IS_HORUS(board)) { internalField.Append(new UnsignedField<8>(this, generalData.backlightColor)); } } else if (IS_SKY9X(board) && version >= 218) { internalField.Append(new SignedField<8>(this, generalData.txCurrentCalibration)); - internalField.Append(new SignedField<8>(this, generalData.temperatureWarn)); + internalField.Append(new SpareBitsField<8>(this)); internalField.Append(new UnsignedField<8>(this, generalData.mAhWarn)); internalField.Append(new UnsignedField<16>(this, generalData.mAhUsed)); - internalField.Append(new SignedField<8>(this, generalData.temperatureCalib)); + internalField.Append(new SpareBitsField<8>(this)); internalField.Append(new BoolField<8>(this, generalData.optrexDisplay)); internalField.Append(new UnsignedField<8>(this, generalData.sticksGain)); internalField.Append(new UnsignedField<8>(this, generalData.rotarySteps)); @@ -2615,10 +2552,14 @@ OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, Board::Type for (int i=0; i(this, generalData.stickName[i], "Stick name")); } - for (int i=0; i(this, generalData.potName[i], "Pot name")); } - for (int i=0; i(this, generalData.sliderName[i], "Slider name")); } internalField.Append(new CharField<17>(this, generalData.currModelFilename, true, "Current model filename")); @@ -2639,7 +2580,7 @@ OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, Board::Type for (int i=0; i(this, generalData.potName[i], "Pot name")); } - for (int i=0; i(this, generalData.sliderName[i], "Slider name")); } } @@ -2662,7 +2603,7 @@ OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, Board::Type } if (version >= 219) { - internalField.Append(new ZCharField<8>(this, generalData.registrationId, "PXX2 Registration ID")); + internalField.Append(new ZCharField<8>(this, generalData.registrationId, "ACCESS Registration ID")); } if (version >= 219 && (IS_TARANIS_XLITES(board) || IS_HORUS(board))) { diff --git a/companion/src/firmwares/opentx/opentxinterface.cpp b/companion/src/firmwares/opentx/opentxinterface.cpp index 9cab7fde4..72483c506 100644 --- a/companion/src/firmwares/opentx/opentxinterface.cpp +++ b/companion/src/firmwares/opentx/opentxinterface.cpp @@ -72,6 +72,8 @@ const char * OpenTxEepromInterface::getName() return "OpenTX for FrSky Taranis X9D"; case BOARD_TARANIS_X9DP: return "OpenTX for FrSky Taranis X9D+"; + case BOARD_TARANIS_X9DP_2019: + return "OpenTX for FrSky Taranis X9D+ 2019"; case BOARD_TARANIS_X9E: return "OpenTX for FrSky Taranis X9E"; case BOARD_TARANIS_X7: @@ -305,8 +307,6 @@ int OpenTxEepromInterface::save(uint8_t * eeprom, const RadioData & radioData, u { // TODO QMessageBox::warning should not be called here - qDebug() << "ICI"; - if (version == 0) { version = getLastDataVersion(board); } @@ -734,6 +734,8 @@ int OpenTxFirmware::getCapability(::Capability capability) return IS_HORUS(board); case HasSwitchableJack: return IS_TARANIS_XLITES(board); + case PwrButtonPress: + return IS_HORUS_OR_TARANIS(board) && (board!=Board::BOARD_TARANIS_X9D) && (board!=Board::BOARD_TARANIS_X9DP); default: return 0; } @@ -1211,6 +1213,12 @@ void registerOpenTxFirmwares() addPPMInternalModuleHack(firmware); registerOpenTxFirmware(firmware); + /* FrSky Taranis X9D+ 2019 board */ + firmware = new OpenTxFirmware("opentx-x9d+2019", Firmware::tr("FrSky Taranis X9D+ 2019"), BOARD_TARANIS_X9DP_2019); + addOpenTxTaranisOptions(firmware); + addPPMInternalModuleHack(firmware); + registerOpenTxFirmware(firmware); + /* FrSky Taranis X9D board */ firmware = new OpenTxFirmware("opentx-x9d", Firmware::tr("FrSky Taranis X9D"), BOARD_TARANIS_X9D); firmware->addOption("haptic", Firmware::tr("Haptic module installed")); @@ -1229,6 +1237,7 @@ void registerOpenTxFirmwares() /* FrSky X9-Lite board */ firmware = new OpenTxFirmware("opentx-x9lite", Firmware::tr("FrSky Taranis X9-Lite"), BOARD_TARANIS_X9LITE); addOpenTxTaranisOptions(firmware); + firmware->addOption("autoupdate", Firmware::tr("Support for auto update on boot")); registerOpenTxFirmware(firmware); /* FrSky X7 board */ @@ -1239,7 +1248,7 @@ void registerOpenTxFirmwares() /* FrSky X-Lite S/PRO board */ firmware = new OpenTxFirmware("opentx-xlites", Firmware::tr("FrSky Taranis X-Lite S/PRO"), BOARD_TARANIS_XLITES); addOpenTxTaranisOptions(firmware); - firmware->addOption("internalpxx1", Firmware::tr("Support for PXX1 internal module replacement")); + firmware->addOption("autoupdate", Firmware::tr("Support for auto update on boot")); registerOpenTxFirmware(firmware); /* FrSky X-Lite board */ @@ -1262,6 +1271,7 @@ void registerOpenTxFirmwares() /* Jumper T12 board */ firmware = new OpenTxFirmware("opentx-t12", QCoreApplication::translate("Firmware", "Jumper T12"), BOARD_JUMPER_T12); addOpenTxCommonOptions(firmware); + firmware->addOption("multimodule", Firmware::tr("Support for the DIY-Multiprotocol-TX-Module")); firmware->addOption("noheli", Firmware::tr("Disable HELI menu and cyclic mix support")); firmware->addOption("nogvars", Firmware::tr("Disable Global variables")); firmware->addOption("lua", Firmware::tr("Enable Lua custom scripts screen")); @@ -1321,7 +1331,6 @@ OpenTxEepromInterface * loadFromByteArray(T & dest, const QByteArray & data) template bool saveToByteArray(const T & dest, QByteArray & data) { - qDebug() << "ICI SAVE"; Board::Type board = getCurrentBoard(); foreach(OpenTxEepromInterface * eepromInterface, opentxEEpromInterfaces) { if (eepromInterface->getBoard() == board) { diff --git a/companion/src/firmwares/rawsource.cpp b/companion/src/firmwares/rawsource.cpp index 507518150..b2d13e401 100644 --- a/companion/src/firmwares/rawsource.cpp +++ b/companion/src/firmwares/rawsource.cpp @@ -128,13 +128,13 @@ RawSourceRange RawSource::getRange(const ModelData * model, const GeneralSetting case TELEMETRY_SOURCE_T2_MAX: result.min = -30; result.max = 225; - result.unit = trUtf8("°C"); + result.unit = tr("°C"); break; case TELEMETRY_SOURCE_HDG: result.step = 2; result.max = 360; result.offset = 256; - result.unit = trUtf8("°"); + result.unit = tr("°"); break; case TELEMETRY_SOURCE_RPM: case TELEMETRY_SOURCE_RPM_MAX: diff --git a/companion/src/firmwares/sensordata.cpp b/companion/src/firmwares/sensordata.cpp index cf294a390..56c2653fe 100644 --- a/companion/src/firmwares/sensordata.cpp +++ b/companion/src/firmwares/sensordata.cpp @@ -52,9 +52,9 @@ QString SensorData::unitString() const case UNIT_FEET: return tr("f"); case UNIT_CELSIUS: - return trUtf8("°C"); + return tr("°C"); case UNIT_FAHRENHEIT: - return trUtf8("°F"); + return tr("°F"); case UNIT_PERCENT: return tr("%"); case UNIT_MAH: @@ -70,9 +70,9 @@ QString SensorData::unitString() const case UNIT_G: return tr("g"); case UNIT_DEGREE: - return trUtf8("°"); + return tr("°"); case UNIT_RADIANS: - return trUtf8("Rad"); + return tr("Rad"); case UNIT_HOURS: return tr("hours"); case UNIT_MINUTES: diff --git a/companion/src/flasheepromdialog.cpp b/companion/src/flasheepromdialog.cpp index ec2b70d67..6c210f940 100644 --- a/companion/src/flasheepromdialog.cpp +++ b/companion/src/flasheepromdialog.cpp @@ -29,10 +29,9 @@ #include "splashlibrarydialog.h" FlashEEpromDialog::FlashEEpromDialog(QWidget *parent, const QString &filename): -QDialog(parent), -ui(new Ui::FlashEEpromDialog), -eepromFilename(filename), -radioData(new RadioData()) + QDialog(parent), + ui(new Ui::FlashEEpromDialog), + eepromFilename(filename) { ui->setupUi(this); ui->profileLabel->setText(tr("Current profile: %1").arg(g.profile[g.id()].name())); @@ -42,7 +41,7 @@ radioData(new RadioData()) } QString backupPath = g.profile[g.id()].pBackupDir(); if (backupPath.isEmpty()) { - backupPath=g.backupDir(); + backupPath = g.backupDir(); ui->backupBeforeWrite->setChecked(g.enableBackup() || g.profile[g.id()].penableBackup()); } if (backupPath.isEmpty() || !QDir(backupPath).exists()) { @@ -123,7 +122,7 @@ int FlashEEpromDialog::getEEpromVersion(const QString & filename) return result; } -bool FlashEEpromDialog::patchCalibration() +bool FlashEEpromDialog::patchCalibration(RadioData * radioData) { QString calib = g.profile[g.id()].stickPotCalib(); QString trainercalib = g.profile[g.id()].trainerCalib(); @@ -168,7 +167,7 @@ bool FlashEEpromDialog::patchCalibration() } } -bool FlashEEpromDialog::patchHardwareSettings() +bool FlashEEpromDialog::patchHardwareSettings(RadioData * radioData) { QString DisplaySet = g.profile[g.id()].display(); QString BeeperSet = g.profile[g.id()].beeper(); @@ -215,32 +214,37 @@ bool FlashEEpromDialog::patchHardwareSettings() void FlashEEpromDialog::on_burnButton_clicked() { - // patch the eeprom if needed - bool patch = false; - if (ui->patchCalibration->isChecked()) { - patch |= patchCalibration(); - } - if (ui->patchHardwareSettings->isChecked()) { - patch |= patchHardwareSettings(); - } QString filename = eepromFilename; - if (patch) { - QString filename = generateProcessUniqueTempFileName("temp.bin"); - QFile file(filename); - uint8_t *eeprom = (uint8_t*)malloc(Boards::getEEpromSize(getCurrentBoard())); - int eeprom_size = getCurrentEEpromInterface()->save(eeprom, *radioData, 0, getCurrentFirmware()->getVariantNumber()); - if (eeprom_size == 0) { - return; + bool patch = false; + + if (ui->patchCalibration->isChecked() || ui->patchHardwareSettings->isChecked()) { + QSharedPointer radioData = QSharedPointer(new RadioData()); + Storage storage(eepromFilename); + if (storage.load(*radioData)) { + if (ui->patchCalibration->isChecked()) + patch |= patchCalibration(radioData.data()); + if (ui->patchHardwareSettings->isChecked()) + patch |= patchHardwareSettings(radioData.data()); } - if (!file.open(QIODevice::WriteOnly)) { - QMessageBox::warning(this, CPN_STR_TTL_ERROR, tr("Cannot write file %1:\n%2.").arg(filename).arg(file.errorString())); - return; - } - QTextStream outputStream(&file); - long result = file.write((char*)eeprom, eeprom_size); - if (result != eeprom_size) { - QMessageBox::warning(this, CPN_STR_TTL_ERROR, tr("Error writing file %1:\n%2.").arg(filename).arg(file.errorString())); - return; + + if (patch) { + filename = generateProcessUniqueTempFileName("patched.bin"); + QFile file(filename); + uint8_t *eeprom = (uint8_t*)malloc(Boards::getEEpromSize(getCurrentBoard())); + int eeprom_size = getCurrentEEpromInterface()->save(eeprom, *radioData, 0, getCurrentFirmware()->getVariantNumber()); + if (eeprom_size == 0) { + return; + } + if (!file.open(QIODevice::WriteOnly)) { + QMessageBox::warning(this, CPN_STR_TTL_ERROR, tr("Cannot write file %1:\n%2.").arg(filename).arg(file.errorString())); + return; + } + QTextStream outputStream(&file); + long result = file.write((char*)eeprom, eeprom_size); + if (result != eeprom_size) { + QMessageBox::warning(this, CPN_STR_TTL_ERROR, tr("Error writing file %1:\n%2.").arg(filename).arg(file.errorString())); + return; + } } } diff --git a/companion/src/flasheepromdialog.h b/companion/src/flasheepromdialog.h index e7973bce6..f962562cb 100644 --- a/companion/src/flasheepromdialog.h +++ b/companion/src/flasheepromdialog.h @@ -49,14 +49,13 @@ protected: void updateUI(); bool isValidEEprom(const QString &filename); int getEEpromVersion(const QString &filename); - bool patchCalibration(); - bool patchHardwareSettings(); + bool patchCalibration(RadioData * radioData); + bool patchHardwareSettings(RadioData * radioData); virtual void showEvent(QShowEvent *); private: Ui::FlashEEpromDialog *ui; QString eepromFilename; - RadioData *radioData; }; #endif // _FLASHEEPROMDIALOG_H_ diff --git a/companion/src/generaledit/generalsetup.cpp b/companion/src/generaledit/generalsetup.cpp index b6bf20711..b96306af3 100644 --- a/companion/src/generaledit/generalsetup.cpp +++ b/companion/src/generaledit/generalsetup.cpp @@ -255,6 +255,17 @@ ui(new Ui::GeneralSetup) ui->splashScreenChkB->setChecked(!generalSettings.splashMode); } + if (!firmware->getCapability(PwrButtonPress)) { + ui->pwrOnSpeedLabel->hide(); + ui->pwrOnSpeed->hide(); + ui->pwrOffSpeedLabel->hide(); + ui->pwrOffSpeed->hide(); + } + else if (!IS_TARANIS(firmware->getBoard())) { + ui->pwrOnSpeedLabel->hide(); + ui->pwrOnSpeed->hide(); + } + setValues(); lock = false; @@ -441,6 +452,9 @@ void GeneralSetupPanel::setValues() ui->vBatMinDSB->setValue((double)(generalSettings.vBatMin + 90) / 10); ui->vBatMaxDSB->setValue((double)(generalSettings.vBatMax + 120) / 10); } + + ui->pwrOnSpeed->setValue(generalSettings.pwrOnSpeed); + ui->pwrOffSpeed->setValue(generalSettings.pwrOffSpeed); } void GeneralSetupPanel::on_faimode_CB_stateChanged(int) @@ -493,6 +507,17 @@ void GeneralSetupPanel::on_splashScreenDuration_currentIndexChanged(int index) emit modified(); } +void GeneralSetupPanel::on_pwrOnSpeed_valueChanged() +{ + generalSettings.pwrOnSpeed = ui->pwrOnSpeed->value(); + emit modified(); +} + +void GeneralSetupPanel::on_pwrOffSpeed_valueChanged() +{ + generalSettings.pwrOffSpeed = ui->pwrOffSpeed->value(); + emit modified(); +} void GeneralSetupPanel::on_beepVolume_SL_valueChanged() { diff --git a/companion/src/generaledit/generalsetup.h b/companion/src/generaledit/generalsetup.h index d3f800714..9dc636768 100644 --- a/companion/src/generaledit/generalsetup.h +++ b/companion/src/generaledit/generalsetup.h @@ -88,6 +88,8 @@ class GeneralSetupPanel : public GeneralPanel void on_vBatMaxDSB_editingFinished(); void on_contrastSB_editingFinished(); + void on_pwrOnSpeed_valueChanged(); + void on_pwrOffSpeed_valueChanged(); private: Ui::GeneralSetup *ui; diff --git a/companion/src/generaledit/generalsetup.ui b/companion/src/generaledit/generalsetup.ui index a6e09c95a..5e2941508 100644 --- a/companion/src/generaledit/generalsetup.ui +++ b/companion/src/generaledit/generalsetup.ui @@ -7,7 +7,7 @@ 0 0 809 - 801 + 880 @@ -29,10 +29,10 @@ QLayout::SetMinimumSize - + 0 - + 0 @@ -1121,7 +1121,65 @@ p, li { white-space: pre-wrap; } QLayout::SetDefaultConstraint - + + + + + 0 + 0 + + + + + 0 + 0 + + + + + + + Contrast + + + + + + + + 0 + 0 + + + + + 0 + 22 + + + + + Quiet + + + + + Only Alarms + + + + + No Keys + + + + + All + + + + + GPS Coordinates @@ -1129,7 +1187,52 @@ p, li { white-space: pre-wrap; } - + + + + Metric + + + + + Imperial + + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + "No Sound" Warning + + + + + + + + 0 + 0 + + + + + 0 + 22 + + @@ -1137,93 +1240,17 @@ p, li { white-space: pre-wrap; } - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">LCD Screen Contrast</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Values can be 20-45</span></p></body></html> + If not zero will sound beeps if the transmitter has been left without inputs for the specified number of minutes. - ms - - - 0 + min - 1000 - - - 10 - - - 0 + 120 - - - - - - Min - - - - - - - v - - - 1 - - - 4.000000000000000 - - - 16.000000000000000 - - - 0.100000000000000 - - - 9.000000000000000 - - - - - - - Max - - - - - - - v - - - 1 - - - 4.000000000000000 - - - 16.000000000000000 - - - 0.100000000000000 - - - 12.000000000000000 - - - - - - + @@ -1277,41 +1304,26 @@ Mode 4: - - - - Stick Mode - - - - - + + - + 0 0 + + + 0 + 0 + + - Default Channel Order + LCD Display Type - - - - - Metric - - - - - Imperial - - - - - + @@ -1447,45 +1459,253 @@ Mode 4: - - - - - Ask on Connect - - - - - Joystick (HID) - - - - - USB Mass Storage - - - - - USB Serial (CDC) - - - - - - - - USB Mode - - - - - + + - + 0 0 + + Play Delay (switch mid position) + + + + + + + + 0 + 0 + + + + + 0 + 22 + + + + + + + + + + Battery warning voltage. +This is the threashhold where the battery warning sounds. + +Acceptable values are 5v..10v + + + + + + V + + + 1 + + + 4.000000000000000 + + + 12.000000000000000 + + + 0.100000000000000 + + + 9.600000000000000 + + + + + + + + 0 + 0 + + + + + 0 + 22 + + + + -2 + + + 2 + + + 1 + + + Qt::Horizontal + + + + + + + Power On Speed + + + + + + + Jack Mode + + + + + + + + 0 + 0 + + + + MAVLink Baud Rate + + + + + + + + 0 + 0 + + + + Default Channel Order + + + + + + + + 0 + 0 + + + + + 20 + 0 + + + + + + + Battery Warning + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + Haptic Strength + + + + + + + + + Min + + + + + + + v + + + 1 + + + 4.000000000000000 + + + 16.000000000000000 + + + 0.100000000000000 + + + 9.000000000000000 + + + + + + + Max + + + + + + + v + + + 1 + + + 4.000000000000000 + + + 16.000000000000000 + + + 0.100000000000000 + + + 12.000000000000000 + + + + + + + + + + 0 + 0 + + + + + 0 + 22 + + 16777215 @@ -1513,25 +1733,6 @@ p, li { white-space: pre-wrap; } - - - - - 0 - 0 - - - - - 0 - 0 - - - - RSSI Poweroff Warning - - - @@ -1551,57 +1752,6 @@ p, li { white-space: pre-wrap; } - - - - - 0 - 0 - - - - - 0 - 22 - - - - - - - - - - Beeper volume - -0 - Quiet. No beeps at all. -1 - No Keys. Normal beeps but menu keys do not beep. -2 - Normal. -3 - Loud. -4 - Extra loud. - - - - Quiet - - - - - Alarms Only - - - - - No Keys - - - - - All - - - - @@ -1643,252 +1793,6 @@ p, li { white-space: pre-wrap; } - - - - - 0 - 0 - - - - - 0 - 0 - - - - Beeper Mode - - - - - - - Measurement Units - - - - - - - - 0 - 0 - - - - - 0 - 0 - - - - Haptic Mode - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - 0 - 0 - - - - Play Delay (switch mid position) - - - - - - - - 4800 Baud - - - - - 9600 Baud - - - - - 14400 Baud - - - - - 19200 Baud - - - - - 38400 Baud - - - - - 57600 Baud - - - - - 76800 Baud - - - - - 115200 Baud - - - - - - - - - 0 - 0 - - - - - 0 - 22 - - - - - X-Short - - - - - Short - - - - - Normal - - - - - Long - - - - - X-Long - - - - - - - - - 0 - 0 - - - - - 0 - 22 - - - - - 16777215 - 16777215 - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" text-decoration: underline;">Warnings</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">These will define startup warnings.</p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Throttle warning - will alert if the throttle is not at idle during startup</p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Switch warning - will alert if switches are not in their defaul position</p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Memory warning - will alert if there's not a lot of memory left</p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Silent mode warning - will alert you if the beeper is set to quiet (0)</p></body></html> - - - - - - true - - - - - - - - DMS - - - - - NMEA - - - - - - - - - 0 - 0 - - - - - 16777215 - 16777215 - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" text-decoration: underline;">Warnings</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">These will define startup warnings.</p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Throttle warning - will alert if the throttle is not at idle during startup</p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Switch warning - will alert if switches are not in their defaul position</p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Memory warning - will alert if there's not a lot of memory left</p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Silent mode warning - will alert you if the beeper is set to quiet (0)</p></body></html> - - - - - - true - - - @@ -1968,8 +1872,8 @@ p, li { white-space: pre-wrap; } - - + + 0 @@ -1979,48 +1883,86 @@ p, li { white-space: pre-wrap; } 0 - 22 + 0 - - - - - - - - If not zero will sound beeps if the transmitter has been left without inputs for the specified number of minutes. - - - min - - - 120 + + Inactivity Timer - - - - - 0 - 0 - + + + + Qt::Vertical - + - 0 - 22 + 20 + 40 + + + + - Standard + Ask on Connect - Optrex + Audio + + + + + Trainer + + + + + + + + + 4800 Baud + + + + + 9600 Baud + + + + + 14400 Baud + + + + + 19200 Baud + + + + + 38400 Baud + + + + + 57600 Baud + + + + + 76800 Baud + + + + + 115200 Baud @@ -2059,171 +2001,18 @@ p, li { white-space: pre-wrap; } - - - - - 0 - 0 - - - - - 0 - 22 - - - - - - - - - - Battery warning voltage. -This is the threashhold where the battery warning sounds. - -Acceptable values are 5v..10v - - - - - - V - - - 1 - - - 4.000000000000000 - - - 12.000000000000000 - - - 0.100000000000000 - - - 9.600000000000000 - - - - - - - - 0 - 0 - - - - - 0 - 22 - - - - -2 - - - 2 - - - 1 - - - Qt::Horizontal - - - - - - - - 0 - 0 - - - - - 0 - 22 - - + + - Quiet + DMS - Only Alarms + NMEA - - - No Keys - - - - - All - - - - - - - - - 0 - 0 - - - - - 0 - 0 - - - - "No Sound" Warning - - - - - - - - 0 - 0 - - - - MAVLink Baud Rate - - - - - - - - 0 - 0 - - - - - 20 - 0 - - - - - - - Battery Warning - @@ -2245,8 +2034,8 @@ Acceptable values are 5v..10v - - + + 0 @@ -2260,7 +2049,42 @@ Acceptable values are 5v..10v - LCD Display Type + Beeper Mode + + + + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" text-decoration: underline;">Warnings</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">These will define startup warnings.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Throttle warning - will alert if the throttle is not at idle during startup</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Switch warning - will alert if switches are not in their defaul position</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Memory warning - will alert if there's not a lot of memory left</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Silent mode warning - will alert you if the beeper is set to quiet (0)</p></body></html> + + + + + + true @@ -2283,45 +2107,42 @@ Acceptable values are 5v..10v - - + + - + 0 0 - + - 0 - 0 + 16777215 + 16777215 + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" text-decoration: underline;">Warnings</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">These will define startup warnings.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Throttle warning - will alert if the throttle is not at idle during startup</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Switch warning - will alert if switches are not in their defaul position</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Memory warning - will alert if there's not a lot of memory left</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Silent mode warning - will alert you if the beeper is set to quiet (0)</p></body></html> + - Haptic Strength + + + + true - - - - - 0 - 0 - - - - - 0 - 0 - - - - Inactivity Timer - - - - + @@ -2340,6 +2161,162 @@ Acceptable values are 5v..10v + + + + + 0 + 0 + + + + + 0 + 0 + + + + RSSI Poweroff Warning + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + Haptic Mode + + + + + + + + 0 + 0 + + + + + 0 + 22 + + + + + Standard + + + + + Optrex + + + + + + + + + 0 + 0 + + + + + 0 + 22 + + + + + X-Short + + + + + Short + + + + + Normal + + + + + Long + + + + + X-Long + + + + + + + + + 0 + 0 + + + + + 0 + 22 + + + + + + + + + + Beeper volume + +0 - Quiet. No beeps at all. +1 - No Keys. Normal beeps but menu keys do not beep. +2 - Normal. +3 - Loud. +4 - Extra loud. + + + + Quiet + + + + + Alarms Only + + + + + No Keys + + + + + All + + + + @@ -2359,37 +2336,55 @@ Acceptable values are 5v..10v - - - - - 0 - 0 - - - - - 0 - 0 - - - - - - - Contrast - - - - - - - Jack Mode - - - - + + + + + + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">LCD Screen Contrast</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Values can be 20-45</span></p></body></html> + + + ms + + + 0 + + + 1000 + + + 10 + + + 0 + + + + + + + Stick Mode + + + + + + + USB Mode + + + + + Ask on Connect @@ -2397,14 +2392,59 @@ Acceptable values are 5v..10v - Audio + Joystick (HID) - Trainer + USB Mass Storage + + + USB Serial (CDC) + + + + + + + + Measurement Units + + + + + + + Power Off Speed + + + + + + + -1 + + + 2 + + + Qt::Horizontal + + + + + + + -1 + + + 2 + + + Qt::Horizontal + diff --git a/companion/src/generaledit/hardware.cpp b/companion/src/generaledit/hardware.cpp index bb482598e..f33800635 100644 --- a/companion/src/generaledit/hardware.cpp +++ b/companion/src/generaledit/hardware.cpp @@ -126,6 +126,7 @@ HardwarePanel::HardwarePanel(QWidget * parent, GeneralSettings & generalSettings setupPotType(1, ui->pot2Label, ui->pot2Name, ui->pot2Type); setupPotType(2, ui->pot3Label, ui->pot3Name, ui->pot3Type); setupPotType(3, ui->pot4Label, ui->pot4Name, ui->pot4Type); + setupPotType(4, ui->pot5Label, ui->pot5Name, ui->pot5Type); setupSliderType(0, ui->lsLabel, ui->lsName, ui->lsType); setupSliderType(1, ui->rsLabel, ui->rsName, ui->rsType); diff --git a/companion/src/generaledit/hardware.ui b/companion/src/generaledit/hardware.ui index 3a54521ba..c28c4584c 100644 --- a/companion/src/generaledit/hardware.ui +++ b/companion/src/generaledit/hardware.ui @@ -23,10 +23,27 @@ 6 - - + + + + + + + + + + + + - SQ + S3 + + + + + + + Rud @@ -37,36 +54,15 @@ - - - - SR - - - - - + + 3 - - - - 3 - - - - - - - LS2 - - - - - + + @@ -78,24 +74,67 @@ - - + + + + + + + + + + + + 3 - - - - SP + + + + + + + + + + - - - - SO + + + + + 0 + 10 + + + + Qt::Horizontal + + + + + + + 3 + + + + + + + 3 + + + + + + + 3 @@ -106,31 +145,122 @@ - - + + + + + + + + + + + + + + Serial Port + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + Bluetooth + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + 3 - - - - RS + + + + + + + + + + - + + + + PPM Multiplier + + + + SB - - + + + + 3 + + + + + + + 3 + + + + + + + 3 + + + + + - PPM 2 + SM + + + + + + + 3 + + + + + + + + + + + + + + RS2 @@ -141,8 +271,41 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SQ + + + + + @@ -151,17 +314,20 @@ - - + + + + + - + @@ -190,95 +356,8 @@ - - - - 3 - - - - - - - 3 - - - - - - - 3 - - - - - - - Rud - - - - - - - -49 - - - 49 - - - - - - - PPM 3 - - - - - - - 3 - - - - - - - S1 - - - - - - - 3 - - - - - - - S2 - - - - - - - S3 - - - - - - - PPM 1 - - - - - + + @@ -296,17 +375,94 @@ - - - - Serial Port - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + 3 - + + + + PPM 1 + + + + + + + SD + + + + + + + S1 + + + + + + + SC + + + + + + + SJ + + + + + + + 3 + + + + + + + SL + + + + + + + + + + + + + + + + + Ail + + + + + + + PPM 2 + + + + + + + 3 + + + + @@ -328,217 +484,21 @@ - - + + + + 3 + + + + + - PPM Multiplier + S2 - - - - - - - - - - - - -9999 - - - 9999 - - - - - - - - - - - - - - - - - - - - Current Offset - - - - - - - PPM 4 - - - - - - - 3 - - - - - - - SA - - - - - - - Ele - - - - - - - 3 - - - - - - - 3 - - - - - - - Ail - - - - - - - 3 - - - - - - - Thr - - - - - - - 3 - - - - - - - SC - - - - - - - 3 - - - - - - - LS - - - - - - - 3 - - - - - - - - - - - - - - - - - - - - 3 - - - - - - - SD - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -9999 - - - 9999 - - - - - - - Battery Offset - - - - @@ -557,310 +517,7 @@ - - - - 3 - - - - - - - SE - - - - - - - - - - - - - - - - - - - - 3 - - - - - - - SF - - - - - - - - - - - - - - - - - - - - 3 - - - - - - - SG - - - - - - - - - - - - - - - - - - - - 3 - - - - - - - SH - - - - - - - 3 - - - - - - - SI - - - - - - - 3 - - - - - - - SJ - - - - - - - 3 - - - - - - - SK - - - - - - - 3 - - - - - - - SL - - - - - - - SM - - - - - - - 3 - - - - - - - SN - - - - - - - 1 - - - 5.000000000000000 - - - 1.000000000000000 - - - - - - - 3 - - - - - - - RS2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -873,56 +530,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -933,64 +540,159 @@ - - - - - - - - - - - - - - - - - - - - - - - - - 0 - 0 - - + + - Bluetooth - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + SA - - + + + + 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 10 + + + + Qt::Horizontal + + + + + + + 3 + + + + + + + SH + + + + + + + SP + + + + + + + 1 + + + 5.000000000000000 + + + 1.000000000000000 + + + + + + + 3 + + + + + + + 3 + + + + + + + 3 + + + + + + + 3 + + + + + + + -49 + + + 49 + + + + + + + + + + + + + + + + + + + + PPM 4 + + + + + 3 - - - - - - - - - - ADC Filter - - - - @@ -1048,7 +750,7 @@ - + @@ -1061,32 +763,343 @@ - - - - - 0 - 10 - - - - Qt::Horizontal + + + + ADC Filter - - - - - 0 - 10 - - - - Qt::Horizontal + + + + SF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 3 + + + + + + + SR + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SG + + + + + + + PPM 3 + + + + + + + 3 + + + + + + + SK + + + + + + + 3 + + + + + + + + + + + + + + + + + + + + RS + + + + + + + LS + + + + + + + Battery Offset + + + + + + + SI + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -9999 + + + 9999 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -9999 + + + 9999 + + + + + + + + + + + + + + + + + + + + LS2 + + + + + + + Ele + + + + + + + 3 + + + + + + + SE + + + + + + + 3 + + + + + + + SN + + + + + + + 3 + + + + + + + 3 + + + + + + + Thr + + + + + + + Current Offset + + + + + + + SO + + + + + + + S5 + + + + + + + + + diff --git a/companion/src/helpers.cpp b/companion/src/helpers.cpp index 4dd966ebc..8ecf55f12 100644 --- a/companion/src/helpers.cpp +++ b/companion/src/helpers.cpp @@ -443,7 +443,7 @@ void Helpers::populateFileComboBox(QComboBox * b, const QSet & set, con bool added = false; // Convert set into list and sort it alphabetically case insensitive QStringList list = QStringList::fromSet(set); - qSort(list.begin(), list.end(), caseInsensitiveLessThan); + std::sort(list.begin(), list.end(), caseInsensitiveLessThan); foreach (QString entry, list) { b->addItem(entry); if (entry == current) { diff --git a/companion/src/logsdialog.cpp b/companion/src/logsdialog.cpp index ed28245ba..e60318c69 100644 --- a/companion/src/logsdialog.cpp +++ b/companion/src/logsdialog.cpp @@ -830,7 +830,7 @@ void LogsDialog::plotLogs() foreach (QModelIndex index, selection) { selectedRows.append(index.row()); } - qSort(selectedRows.begin(), selectedRows.end()); + std::sort(selectedRows.begin(), selectedRows.end()); } else { hasLogSelection = false; rowCount = ui->logTable->rowCount(); diff --git a/companion/src/mainwindow.cpp b/companion/src/mainwindow.cpp index 454007500..e795594cb 100644 --- a/companion/src/mainwindow.cpp +++ b/companion/src/mainwindow.cpp @@ -323,13 +323,13 @@ QString MainWindow::seekCodeString(const QByteArray & qba, const QString & label { int posLabel = qba.indexOf(label); if (posLabel < 0) - return QString::null; + return QString(); int start = qba.indexOf("\"", posLabel + label.length()); if (start < 0) - return QString::null; + return QString(); int end = qba.indexOf("\"", start + 1); if (end < 0) - return QString::null; + return QString(); return qba.mid(start + 1, end - start - 1); } @@ -340,6 +340,15 @@ void MainWindow::checkForCompanionUpdateFinished(QNetworkReply * reply) closeUpdatesWaitDialog(); QString version = seekCodeString(qba, "VERSION"); + const QString errorString = seekCodeString(qba, "ERROR"); + + if (errorString == "NO_RC") + return onUpdatesError(tr("No Companion release candidates are currently being served for this version, please switch release channel")); + else if (errorString == "NO_NIGHTLY") + return onUpdatesError(tr("No nightly Companion builds are currently being served for this version, please switch release channel")); + else if (errorString == "NO_RELEASE") + return onUpdatesError(tr("No Companion release builds are currently being served for this version, please switch release channel")); + if (version.isNull()) return onUpdatesError(tr("Companion update check failed, new version information not found.")); @@ -456,7 +465,45 @@ void MainWindow::checkForFirmwareUpdateFinished(QNetworkReply * reply) const QString versionString = seekCodeString(qba, "VERSION"); const QString dateString = seekCodeString(qba, "DATE"); + const QString errorString = seekCodeString(qba, "ERROR"); + const QString blockedRadios = seekCodeString(qba, "BLOCK"); long version; + + if (errorString == "NO_RC") + return onUpdatesError(tr("No firmware release candidates are currently being served for this version, please switch release channel")); + else if (errorString == "NO_NIGHTLY") + return onUpdatesError(tr("No firmware nightly builds are currently being served for this version, please switch release channel")); + else if (errorString == "NO_RELEASE") + return onUpdatesError(tr("No firmware release builds are currently being served for this version, please switch release channel")); + else if (errorString == "MOVE_TO_RC") { + QMessageBox msgbox; + msgbox.setIcon(QMessageBox::Question); + msgbox.setText(tr("Release candidate builds are now available for this version, would you like to switch to using them?")); + msgbox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); + msgbox.setDefaultButton(QMessageBox::Yes); + + if(msgbox.exec() == QMessageBox::Yes) { + g.OpenTxBranch(AppData::DownloadBranchType(AppData::BRANCH_RC_TESTING)); + return onUpdatesError(tr("Channel changed to RC, please restart the download process")); + } + } + else if (errorString == "MOVE_TO_RELEASE") { + QMessageBox msgbox; + msgbox.setIcon(QMessageBox::Question); + msgbox.setText(tr("Official release builds are now available for this version, would you like to switch to using them?")); + msgbox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); + msgbox.setDefaultButton(QMessageBox::Yes); + + if(msgbox.exec() == QMessageBox::Yes) { + g.OpenTxBranch(AppData::DownloadBranchType(AppData::BRANCH_RELEASE_STABLE)); + return onUpdatesError(tr("Channel changed to Release, please restart the download process")); + } + } + + QString variant = Firmware::getCurrentVariant()->getId(); + QStringList splitId = variant.split("-"); + if (blockedRadios.contains(splitId.value(1))) + return onUpdatesError(tr("This radio (%1) is not currently available in this firmware release channel").arg(getCurrentFirmware()->getName())); if (versionString.isNull() || dateString.isNull() || (version = version2index(versionString)) <= 0) return onUpdatesError(tr("Firmware update check failed, new version information not found or invalid.")); @@ -482,10 +529,10 @@ void MainWindow::checkForFirmwareUpdateFinished(QNetworkReply * reply) QAbstractButton *rnButton = nullptr; msgBox.setText(tr("Firmware %1 does not seem to have ever been downloaded.\nVersion %2 is available.\nDo you want to download it now?\n\nWe recommend you view the release notes using the button below to learn about any changes that may be important to you.") .arg(Firmware::getCurrentVariant()->getId()).arg(fullVersionString)); - QAbstractButton *YesButton = msgBox.addButton(trUtf8("Yes"), QMessageBox::YesRole); - msgBox.addButton(trUtf8("No"), QMessageBox::NoRole); + QAbstractButton *YesButton = msgBox.addButton(tr("Yes"), QMessageBox::YesRole); + msgBox.addButton(tr("No"), QMessageBox::NoRole); if (!rn.isEmpty()) { - rnButton = msgBox.addButton(trUtf8("Release Notes"), QMessageBox::ActionRole); + rnButton = msgBox.addButton(tr("Release Notes"), QMessageBox::ActionRole); } msgBox.setIcon(QMessageBox::Question); msgBox.resize(0, 0); @@ -511,10 +558,10 @@ void MainWindow::checkForFirmwareUpdateFinished(QNetworkReply * reply) QAbstractButton *rnButton = nullptr; msgBox.setText(tr("A new version of %1 firmware is available:\n - current is %2\n - newer is %3\n\nDo you want to download it now?\n\nWe recommend you view the release notes using the button below to learn about any changes that may be important to you.") .arg(Firmware::getCurrentVariant()->getId()).arg(currentVersionString).arg(fullVersionString)); - QAbstractButton *YesButton = msgBox.addButton(trUtf8("Yes"), QMessageBox::YesRole); - msgBox.addButton(trUtf8("No"), QMessageBox::NoRole); + QAbstractButton *YesButton = msgBox.addButton(tr("Yes"), QMessageBox::YesRole); + msgBox.addButton(tr("No"), QMessageBox::NoRole); if (!rn.isEmpty()) { - rnButton = msgBox.addButton(trUtf8("Release Notes"), QMessageBox::ActionRole); + rnButton = msgBox.addButton(tr("Release Notes"), QMessageBox::ActionRole); } msgBox.setIcon(QMessageBox::Question); msgBox.resize(0,0); diff --git a/companion/src/modeledit/inputs.cpp b/companion/src/modeledit/inputs.cpp index cbdefb581..27ca4c42f 100644 --- a/companion/src/modeledit/inputs.cpp +++ b/companion/src/modeledit/inputs.cpp @@ -483,7 +483,7 @@ void InputsPanel::expolistWidget_doubleClicked(QModelIndex index) void InputsPanel::exposDeleteList(QList list, bool clearName) { - qSort(list.begin(), list.end()); + std::sort(list.begin(), list.end()); int iDec = 0; foreach(int idx, list) { diff --git a/companion/src/modeledit/mixes.cpp b/companion/src/modeledit/mixes.cpp index f5d76d32f..c92105ec6 100644 --- a/companion/src/modeledit/mixes.cpp +++ b/companion/src/modeledit/mixes.cpp @@ -222,7 +222,7 @@ void MixesPanel::mixerlistWidget_doubleClicked(QModelIndex index) void MixesPanel::mixersDeleteList(QList list) { - qSort(list.begin(), list.end()); + std::sort(list.begin(), list.end()); int iDec = 0; foreach(int idx, list) { diff --git a/companion/src/modeledit/node.cpp b/companion/src/modeledit/node.cpp index a93e0fb2c..302bfebc8 100644 --- a/companion/src/modeledit/node.cpp +++ b/companion/src/modeledit/node.cpp @@ -160,11 +160,11 @@ void Node::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWid if (option->state & QStyle::State_Sunken) { gradient.setCenter(ballHeight, ballHeight); gradient.setFocalPoint(ballHeight, ballHeight); - gradient.setColorAt(1, nodecolor.light(180)); - gradient.setColorAt(0, nodecolor.light(120)); + gradient.setColorAt(1, nodecolor.lighter(180)); + gradient.setColorAt(0, nodecolor.lighter(120)); } else { gradient.setColorAt(0, nodecolor); - gradient.setColorAt(1, nodecolor.dark(120)); + gradient.setColorAt(1, nodecolor.darker(120)); } painter->setBrush(gradient); painter->setPen(QPen(Qt::black, 0)); diff --git a/companion/src/modeledit/setup.cpp b/companion/src/modeledit/setup.cpp index a30949446..2dc74e5fe 100644 --- a/companion/src/modeledit/setup.cpp +++ b/companion/src/modeledit/setup.cpp @@ -925,7 +925,7 @@ SetupPanel::SetupPanel(QWidget * parent, ModelData & model, GeneralSettings & ge prevFocus = timers[i]->getLastFocus(); } else { - foreach(QLabel *label, findChildren(QRegExp(QString("label_timer%1").arg(i+1)))) { + foreach(QLabel *label, findChildren(QRegularExpression(QString("label_timer%1").arg(i+1)))) { label->hide(); } } diff --git a/companion/src/modeledit/telemetry.cpp b/companion/src/modeledit/telemetry.cpp index a06db920d..64d2dda46 100644 --- a/companion/src/modeledit/telemetry.cpp +++ b/companion/src/modeledit/telemetry.cpp @@ -830,7 +830,7 @@ TelemetryPanel::TelemetryPanel(QWidget *parent, ModelData & model, GeneralSettin } if (IS_ARM(firmware->getBoard())) { - ui->varioSource->setField(model.frsky.varioSource, this); + ui->varioSource->setField(model.frsky.varioSource, this); ui->varioCenterSilent->setField(model.frsky.varioCenterSilent, this); ui->A1GB->hide(); ui->A2GB->hide(); @@ -844,7 +844,7 @@ TelemetryPanel::TelemetryPanel(QWidget *parent, ModelData & model, GeneralSettin } else { ui->sensorsGB->hide(); - ui->altimetryGB->hide(); + ui->altimetryGB->hide(); analogs[0] = new TelemetryAnalog(this, model.frsky.channels[0], model, generalSettings, firmware); ui->A1Layout->addWidget(analogs[0]); connect(analogs[0], SIGNAL(modified()), this, SLOT(onAnalogModified())); @@ -893,6 +893,7 @@ void TelemetryPanel::update() ui->telemetryProtocol->setCurrentIndex(0); } + populateTelemetrySourcesComboBox(ui->rssiSourceCB, model, false); populateTelemetrySourcesComboBox(ui->voltsSource, model, false); populateTelemetrySourcesComboBox(ui->altitudeSource, model, false); populateTelemetrySourcesComboBox(ui->varioSource, model, false); @@ -934,10 +935,18 @@ void TelemetryPanel::setup() ui->rssiAlarmWarningSB->setValue(model->rssiAlarms.warning); ui->rssiAlarmCriticalSB->setValue(model->rssiAlarms.critical); if (!IS_ARM(firmware->getBoard())) { + ui->rssiSourceLabel->hide(); + ui->rssiSourceCB->hide(); ui->rssiAlarmWarningCB->setCurrentIndex(model->rssiAlarms.level[0]); ui->rssiAlarmCriticalCB->setCurrentIndex(model->rssiAlarms.level[1]); } else { + ui->rssiSourceLabel->show(); + ui->rssiSourceLabel->setText(tr("Source")); + ui->rssiSourceCB->setField(model->rssiSource, this); + ui->rssiSourceCB->show(); + populateTelemetrySourcesComboBox(ui->rssiSourceCB, model, false); + ui->rssiAlarmWarningCB->hide(); ui->rssiAlarmCriticalCB->hide(); ui->rssiAlarmWarningLabel->setText(tr("Low Alarm")); diff --git a/companion/src/modeledit/telemetry.ui b/companion/src/modeledit/telemetry.ui index 13e2fe4a5..b064167ba 100644 --- a/companion/src/modeledit/telemetry.ui +++ b/companion/src/modeledit/telemetry.ui @@ -74,7 +74,167 @@ 4 - + + + + + 75 + true + + + + RSSI + + + + + + + + 0 + 0 + + + + + 100 + 0 + + + + + + + Alarm 1 + + + + + + + true + + + + 0 + 0 + + + + + + + 20 + + + 80 + + + 1 + + + 50 + + + + + + + + 0 + 0 + + + + + ---- + + + + + Yellow + + + + + Orange + + + + + Red + + + + + + + + Qt::Vertical + + + + 20 + 0 + + + + + + + + true + + + + 0 + 0 + + + + + + + 20 + + + 80 + + + 1 + + + 50 + + + + + + + Disable telemetry audio warnings + + + + + + + + 0 + 0 + + + + + 100 + 0 + + + + Alarm 2 + + + + @@ -105,164 +265,14 @@ - - - - 0 - 0 - - - - - 100 - 0 - - - - - + - Alarm 1 + Source - - - - - 0 - 0 - - - - - ---- - - - - - Yellow - - - - - Orange - - - - - Red - - - - - - - - - 0 - 0 - - - - - 100 - 0 - - - - Alarm 2 - - - - - - - true - - - - 0 - 0 - - - - - - - 20 - - - 80 - - - 1 - - - 50 - - - - - - - true - - - - 0 - 0 - - - - - - - 20 - - - 80 - - - 1 - - - 50 - - - - - - - - 75 - true - - - - RSSI - - - - - - - Qt::Vertical - - - - 20 - 0 - - - - - - - - Disable telemetry audio warnings - - + + diff --git a/companion/src/modelslist.cpp b/companion/src/modelslist.cpp index 443432a3c..8e5f82369 100644 --- a/companion/src/modelslist.cpp +++ b/companion/src/modelslist.cpp @@ -726,7 +726,7 @@ void TreeModel::refresh() protocol = model.moduleData[j].protocol; // These are the only RXs that allow nominating RX # but changing RX or copying models can leave residual configuration which can cause issues // if (protocol == PULSES_PXX_XJT_X16 || protocol == PULSES_PXX_XJT_LR12 || protocol == PULSES_PXX_R9M || protocol == PULSES_DSMX || protocol == PULSES_MULTIMODULE) { - if (!protocol == PULSES_OFF && model.moduleData[j].modelId > 0) { + if (protocol != PULSES_OFF && model.moduleData[j].modelId > 0) { if (!rxs.isEmpty()) { rxs.append(", "); } @@ -735,10 +735,6 @@ void TreeModel::refresh() if (!isModelIdUnique(mdlidx)) { current->setHighlightRX(true); } - ModelData & mdl = radioData->models[mdlidx-1]; - if (mdl.isEmpty()) { - current->setHighlightRX(true); - } } } current->setData(currentColumn++, rxs); diff --git a/companion/src/simulation/joystickdialog.cpp b/companion/src/simulation/joystickdialog.cpp index 39058a5bc..223e2d77d 100644 --- a/companion/src/simulation/joystickdialog.cpp +++ b/companion/src/simulation/joystickdialog.cpp @@ -45,14 +45,14 @@ joystickDialog::joystickDialog(QWidget *parent, int stick) : }; memcpy(jscal, jscaltmp, sizeof (jscal)); - foreach(QComboBox *cb, findChildren(QRegExp("jsmapCB_[0-9]+"))) { + foreach(QComboBox *cb, findChildren(QRegularExpression("jsmapCB_[0-9]+"))) { populateSourceCombo(cb); sticks[cb->property("channel").toUInt()] = cb; } - foreach(QCheckBox *ib, findChildren(QRegExp("ChInv_[0-9]+"))) { + foreach(QCheckBox *ib, findChildren(QRegularExpression("ChInv_[0-9]+"))) { invert[ib->property("channel").toUInt()] = ib; } - foreach(QSlider *sl, findChildren(QRegExp("Ch_[0-9]+"))) { + foreach(QSlider *sl, findChildren(QRegularExpression("Ch_[0-9]+"))) { sliders[sl->property("channel").toUInt()] = sl; } diff --git a/companion/src/simulation/radiooutputswidget.cpp b/companion/src/simulation/radiooutputswidget.cpp index 18cdbec81..d1c1434f5 100644 --- a/companion/src/simulation/radiooutputswidget.cpp +++ b/companion/src/simulation/radiooutputswidget.cpp @@ -290,7 +290,11 @@ QWidget * RadioOutputsWidget::createLogicalSwitch(QWidget * parent, int switchNo QFont font = swtch->font(); font.setBold(true); swtch->setFont(font); +#if QT_VERSION < QT_VERSION_CHECK(5, 11, 0) swtch->setMinimumWidth(swtch->fontMetrics().width("99") + 10); +#else + swtch->setMinimumWidth(swtch->fontMetrics().horizontalAdvance("99") + 10); +#endif font.setBold(false); swtch->setFont(font); swtch->setText(QString("%1").arg(switchNo+1, 2, 10, QChar('0'))); diff --git a/companion/src/simulation/simulatorinterface.cpp b/companion/src/simulation/simulatorinterface.cpp index 24919e055..1ed9cc520 100644 --- a/companion/src/simulation/simulatorinterface.cpp +++ b/companion/src/simulation/simulatorinterface.cpp @@ -100,7 +100,7 @@ void SimulatorLoader::registerSimulators() path.truncate(path.lastIndexOf('\\')); dir.setPath(path); #else - dir = SIMULATOR_LIB_SEARCH_PATH; + dir.setPath(SIMULATOR_LIB_SEARCH_PATH); #endif registerSimulators(dir); } diff --git a/companion/src/simulation/simulatorwidget.cpp b/companion/src/simulation/simulatorwidget.cpp index e945d7a65..2ec00381d 100644 --- a/companion/src/simulation/simulatorwidget.cpp +++ b/companion/src/simulation/simulatorwidget.cpp @@ -76,6 +76,7 @@ SimulatorWidget::SimulatorWidget(QWidget * parent, SimulatorInterface * simulato break; case Board::BOARD_TARANIS_X9D: case Board::BOARD_TARANIS_X9DP: + case Board::BOARD_TARANIS_X9DP_2019: radioUiWidget = new SimulatedUIWidgetX9(simulator, this); break; case Board::BOARD_TARANIS_XLITE: diff --git a/companion/src/simulation/widgets/radioswitchwidget.h b/companion/src/simulation/widgets/radioswitchwidget.h index 39878a648..8943d8c6e 100644 --- a/companion/src/simulation/widgets/radioswitchwidget.h +++ b/companion/src/simulation/widgets/radioswitchwidget.h @@ -41,6 +41,7 @@ class RadioSwitchWidget : public RadioWidget { init(); } + explicit RadioSwitchWidget(Board::SwitchType type, const QString & labelText, int value = 0, QWidget * parent = Q_NULLPTR, Qt::WindowFlags f = Qt::WindowFlags()) : RadioWidget(labelText, value, parent, f), swType(type) @@ -96,15 +97,24 @@ class RadioSwitchWidget : public RadioWidget setWidget(m_slider); } - connect(m_slider, &QSlider::valueChanged, this, &RadioWidget::setValue); + connect(m_slider, &QSlider::valueChanged, this, &RadioSwitchWidget::setValueFromSlider); connect(this, &RadioWidget::valueChanged, m_slider, &QSlider::setValue); - } - int getValue() const + int getValue() const override { - int val = m_slider->value() - (swType == Board::SWITCH_3POS || m_slider->value() == 1 ? 0 : 1); - return val; + if (swType == Board::SWITCH_3POS) + return m_slider->value(); + else + return m_slider->value() > 0 ? 1 : 0; + } + + void setValueFromSlider(const int & value) + { + if (swType == Board::SWITCH_3POS) + RadioWidget::setValue(value); + else + RadioWidget::setValue(value ? 1 : -1); } void setToggleLocked(bool lock) @@ -139,7 +149,4 @@ class RadioSwitchWidget : public RadioWidget QSlider * m_slider; }; - - - #endif // _RADIOSWITCHWIDGET_H_ diff --git a/companion/src/simulation/widgets/virtualjoystickwidget.cpp b/companion/src/simulation/widgets/virtualjoystickwidget.cpp index 8e9a4fa45..4da39137e 100644 --- a/companion/src/simulation/widgets/virtualjoystickwidget.cpp +++ b/companion/src/simulation/widgets/virtualjoystickwidget.cpp @@ -444,7 +444,11 @@ QLayout *VirtualJoystickWidget::createNodeValueLayout(QChar type, QLabel *& valL val->setObjectName(QString("val_%1").arg(type)); val->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); val->setAlignment(Qt::AlignCenter); +#if QT_VERSION < QT_VERSION_CHECK(5, 11, 0) val->setMinimumWidth(val->fontMetrics().width("-100 ")); +#else + val->setMinimumWidth(val->fontMetrics().horizontalAdvance("-100 ")); +#endif QVBoxLayout * layout = new QVBoxLayout(); layout->setContentsMargins(2, 2, 2, 2); layout->setSpacing(2); diff --git a/companion/src/storage/mountlist.cpp b/companion/src/storage/mountlist.cpp index aa52c1afc..d40339c1c 100644 --- a/companion/src/storage/mountlist.cpp +++ b/companion/src/storage/mountlist.cpp @@ -363,7 +363,7 @@ dev_from_mount_options (char const *mount_options) /* GNU/Linux allows file system implementations to define their own meaning for "dev=" mount options, so don't trust the meaning here. */ -# ifndef __linux__ +#ifndef __linux__ static char const dev_pattern[] = ",dev="; char const *devopt = strstr (mount_options, dev_pattern); diff --git a/companion/src/translations/companion_cs.ts b/companion/src/translations/companion_cs.ts index 1d229ccb8..4a9f97076 100644 --- a/companion/src/translations/companion_cs.ts +++ b/companion/src/translations/companion_cs.ts @@ -466,7 +466,7 @@ Může být jiná než verze firmwaru - Use releases and release candidates (testing) + Use release candidates (testing) diff --git a/companion/src/translations/companion_de.ts b/companion/src/translations/companion_de.ts index 9951130d4..252ae6ea0 100644 --- a/companion/src/translations/companion_de.ts +++ b/companion/src/translations/companion_de.ts @@ -456,7 +456,7 @@ die kann von der Menüsprache abweichen - Use releases and release candidates (testing) + Use release candidates (testing) Releases und Release Candidates (testing) diff --git a/companion/src/translations/companion_en.ts b/companion/src/translations/companion_en.ts index df062e214..b58791b02 100644 --- a/companion/src/translations/companion_en.ts +++ b/companion/src/translations/companion_en.ts @@ -382,7 +382,7 @@ Mode 4: - Use releases and release candidates (testing) + Use release candidates (testing) diff --git a/companion/src/translations/companion_es.ts b/companion/src/translations/companion_es.ts index b869e9170..bbeaabfcd 100644 --- a/companion/src/translations/companion_es.ts +++ b/companion/src/translations/companion_es.ts @@ -456,7 +456,7 @@ Puede ser diferente del lenguaje del firmware - Use releases and release candidates (testing) + Use release candidates (testing) diff --git a/companion/src/translations/companion_fi.ts b/companion/src/translations/companion_fi.ts index 373668c4a..6e235d7b5 100644 --- a/companion/src/translations/companion_fi.ts +++ b/companion/src/translations/companion_fi.ts @@ -459,7 +459,7 @@ Voi olla eri kun firmwaren kieli - Use releases and release candidates (testing) + Use release candidates (testing) diff --git a/companion/src/translations/companion_fr.ts b/companion/src/translations/companion_fr.ts index 46c62cf12..89aa6b010 100644 --- a/companion/src/translations/companion_fr.ts +++ b/companion/src/translations/companion_fr.ts @@ -498,17 +498,17 @@ Manche Droit: Profondeur, Direction Use releases (stable) - Utiliser version officielle (stable) + Utiliser version "officielle" (stable) - Use releases and release candidates (testing) - Utiliser version officielle et candidate (test) + Use release candidates (testing) + Utiliser version "candidate" (test) Use nightly builds (unstable) - Utiliser version "nightly builds" (unstable) + Utiliser version "nightly" (unstable) @@ -628,7 +628,7 @@ Manche Droit: Profondeur, Direction Note: Nightly builds are not available in this version, Release/RC update channel will be used. - Remarque: Les versions " Nightly builds" ne sont pas disponibles dans cette version. Le canal de mise à jour Release/RC sera utilisé. + Remarque: la version " nightly" n'est pas disponible dans cette version. Le canal de mise à jour "officiel" sera utilisé. @@ -723,58 +723,58 @@ Manche Droit: Profondeur, Direction Boards - + Left Horizontal Gauche Horizontal - + Left Vertical Gauche Vertical - + Right Vertical Droit Vertical - + Right Horizontal Droit Horizontal - + Aux. 1 - + Aux. 2 - - + + Unknown Inconnu - + Rud Dir - + Ele Prf - + Thr Gaz - + Ail @@ -1746,32 +1746,22 @@ Si vous avez un fichier de sauvegarde des paramètres, vous pouvez l'import Valeur - - Decr: - Décr: - - - - Incr: - Incr: - - - + played once, not during startup !1x Lu une fois, mais pas à la mise en route - + repeat(%1s) Répéter chaque %1s - + DISABLED DESACTIVE - + CFN FPN @@ -1831,42 +1821,42 @@ Si vous avez un fichier de sauvegarde des paramètres, vous pouvez l'import %1 - + Value Valeur - + Source Source - + GVAR VG - + Increment Incrément - + &Delete &Supprimer - + &Copy &Copier - + &Cut &Couper - + &Paste &Coller @@ -2034,49 +2024,48 @@ Si vous avez un fichier de sauvegarde des paramètres, vous pouvez l'import Erreur de conversion du champ %1 - + Switch Interrupteur - + Switch L'interrupteur - + cannot be exported on this board! n'est pas supporté sur cette carte ! - + Source - + Source %1 cannot be exported on this board! La source %1 n'est pas supportée sur cette plateforme ! - + OpenTX only accepts %1 points in all curves OpenTX n'accepte que %1 points au maximum entre toutes les courbes - + OpenTx only accepts %1 points in all curves OpenTX n'accepte que %1 points au maximum entre toutes les courbes - - - + + OpenTX on this board doesn't accept this function OpenTX ne supporte pas cette fonction sur cette carte - + OpenTX doesn't accept this radio protocol OpenTX ne supporte pas ce protocole radio @@ -2818,247 +2807,254 @@ Blanc signifie "inclure tous".Les métacaractères ?, * et [...] sont Firmware - + Channel values displayed in us Positions de voies affichées en µs - + No OverrideCH functions available Désactive la fonction spéciale "Remplacer VOIExx" - + Possibility to enable FAI MODE (no telemetry) at field Possibilité d'activer le mode FAI (télémétrie désactivée) sur le terrain - + FAI MODE (no telemetry) always enabled Mode FAI (télémétrie toujours désactivée) - + + Support for the DIY-Multiprotocol-TX-Module Support du module "Multiprotocol" - + Removes D8 FrSky protocol support which is not legal for use in the EU on radios sold after Jan 1st, 2015 Masque le protocole D8. Légalement obligatoire sur les radios Européennes importées après le 1er janvier 2015 - - + + Disable HELI menu and cyclic mix support Supprimer le menu HELICO et les mixages cycliques - - + + Disable Global variables Supprimer le support des variables globales - - + + Enable Lua custom scripts screen Activer l'écran des scripts Lua personnalisés - - + + Enable Lua compiler Activer le compilateur Lua - + Support for PPM internal module hack Support du remplacement du module interne par un module PPM - + Use alternative SQT5 font Utiliser la police alternative SQT5 - + Disable RAS (SWR) Désactiver le RAS (SWR). Utile uniquement pour les X9D+ avec un RAS/SWR non fonctionnel - + Pots use in menus navigation Support de la navigation dans les menus avec les POTS - + FrSky Taranis X9D+ - + + FrSky Taranis X9D+ 2019 + + + + FrSky Taranis X9D - + Haptic module installed Module vibreur installé - + FrSky Taranis X9E - + Confirmation before radio shutdown Confirmation avant l'arrêt de la radio - + Horus gimbals installed (Hall sensors) Manches Horus à effet HALL installés - + FrSky Taranis X9-Lite - + + + Support for auto update on boot + Prise en charge de la mise à jour automatique au démarrage + + + FrSky Taranis X7 / X7S - + FrSky Taranis X-Lite S/PRO - - Support for PXX1 internal module replacement - Prise en charge du module interne PXX1 de remplacement - - - + FrSky Taranis X-Lite - + FrSky Horus X10 / X10S - + FrSky Horus X12S - + Use ONLY with first DEV pcb version Exclusivement pour les Horus DEV - + Jumper T12 - + Turnigy 9XR-PRO - + Enable HELI menu and cyclic mix support Activer le menu hélico et les mixages CCPM - + Global variables Variables globales - + Enable non certified firmwares Activer les firmwares non certifiés - - + + Support for Crossfire TX Module Prise en charge du module TX Crossfire - + In model setup menus automatically set source by moving the control Sélectionner les sources des mixeurs en bougeant le contrôle désiré - + In model setup menus automatically set switch by moving the control Sélectionner les interrupteurs en bougeant le contrôle désiré - + No graphical check boxes and sliders Pas de cases à cocher et de curseurs graphiques - + Battery graph Graphique de la batterie - + Don't use bold font for highlighting active items Ne pas mettre les lignes actives en gras - + Turnigy 9XR with m128 chip Turnigy 9XR avec une puce m128 - + Turnigy 9XR - + 9X with stock board 9X avec carte mère d'origine - + Enable resetting values by pressing up and down at the same time Permet la remise à zéro des valeurs en pressant haut-bas en même temps, valeur min avec gauche/bas, valeur max avec haut/droite, inversion avec gauche/droite - + 9X with stock board and m128 chip Carte 9x avec un chip m128 - + 9X with AR9X board 9X avec carte AR9X - + 9X with Sky9x board 9X avec carte Sky9x - + 9X with Gruvin9x board 9X avec carte Gruvin9x - + DIY MEGA2560 radio Radio DIY à base de MEGA2560 @@ -3133,7 +3129,7 @@ Blanc signifie "inclure tous".Les métacaractères ?, * et [...] sont FlashEEpromDialog - + Write Models and Settings to Radio Transférer les réglages et modèles vers la radio @@ -3198,51 +3194,51 @@ Blanc signifie "inclure tous".Les métacaractères ?, * et [...] sont Transférer - + Current profile: %1 Profil courant: %1 - + Choose Radio Backup file Sélectionner le fichier de sauvegarde - + Wrong radio calibration data in profile, Settings not patched Données de calibration incorrectes dans le profil, les réglages ne seront pas transférés - + Wrong radio setting data in profile, Settings not patched Données de configuration incorrectes dans le profil, les réglages ne seront pas transférés - + Cannot write file %1: %2. Ecriture du fichier %1 impossible: %2. - + Error writing file %1: %2. Erreur d'écriture du fichier %1: %2. - + The radio firmware belongs to another product family, check file and preferences! Ce firmware ne correspond pas à la radio sélectionnée, vérifiez le fichier et les préférences ! - + The radio firmware is outdated, please upgrade! Le firmware de la radio est obsolète, veuillez mettre à jour ! - + Cannot check Models and Settings compatibility! Continue anyway? Impossible de vérifier la compatibilité des réglages et modèles ! Continuer quand même ? @@ -4058,7 +4054,7 @@ Communs à tous les modèles d'une même EEPROM. Country Code - Zone géograhpique RF + Zone géographique RF @@ -5936,79 +5932,79 @@ Les colonnes contenant l'altitude "GAlt" et la vitesse "GSpd MainWindow - - + + Edit Édition - - + + File Fichier - + New release available Nouvelle version disponible - + Error opening file %1: %2. Erreur à l'ouverture du fichier %1: %2. - + Compilation server too busy, try later Serveur de compilation surchargé, veuillez réessayer plus tard - + Unknown server failure, try later Erreur inconnue du serveur de compilation, veuillez réessayer plus tard - + Do you want to write the firmware to the radio now ? Voulez vous transférer le firmware à la radio maintenant ? - - + + Yes Oui - - + + No Non - - + + Release Notes Notes de version - + Compare models Comparer les modèles - + Show fuses dialog Afficher les réglages des fusibles - + A monochrome black icon theme Thème avec icônes monochromes noires - + A new version of %1 firmware is available: - current is %2 - newer is %3 @@ -6025,425 +6021,425 @@ Voulez vous la télécharger maintenant ? Nous recommandons de lire attentivement les notes de version à l'aide du bouton ci-dessous, celles-ci peuvent contenir des infos importantes concernant les changements effectués depuis la version précédente. - - + + Synchronize SD Synchroniser la carte SD - + New Nouveau - + Open... Ouvrir... - + A monochrome white icon theme Thème avec icônes monochromes blanches - + A monochrome blue icon theme Thème avec icônes monochromes bleues - + Small Petites - + Use small toolbar icons Petites icônes de barre d'outils - + Use normal size toolbar icons Icônes de barre d'outils normales - + Normal Normales - + Use big toolbar icons Grosses icônes de barre d'outils - + Big Grandes - + Use huge toolbar icons Immenses icônes de barre d'outils - + Huge Immenses - + List programmers... Lister les programmateurs... - + Fuses... Fusibles... - - + + Read Firmware from Radio Lire le firmware de la radio - + Read firmware from Radio Lire le firmware de la radio - + Write Firmware to Radio Transférer le firmware à la radio - + Write firmware to Radio Transférer le firmware à la radio - + Add Radio Profile Ajouter un profil de radio - + Manuals and other Documents Manuels et documents - + Open the OpenTX document page in a web browser Ouvre la page de documentation d'OpenTX dans un navigateur - + Write Models and Settings To Radio Transférer les réglages et modèles vers la radio - + Write Models and Settings to Radio Transférer les réglages et modèles vers la radio - - + + Read Models and Settings from Radio Lire les réglages et modèles depuis la radio - + OpenTX Companion %1 - Radio: %2 - Profile: %3 OpenTX Companion %1 - Radio: %2 - Profil: %3 - + List of recently used files Liste des fichiers récemment utilisés - + Radio Profiles Profil radio - + Create or Select Radio Profiles Créer ou Sélectionner un profil radio - + Configure Communications... Configurer les communications... - + Configure software for communicating with the Radio Configurer le programme gérant les communications avec la radio - + Write Backup to Radio Transférer une sauvegarde à la radio - + Write Backup from file to Radio Transférer une sauvegarde à la radio - + Backup Radio to File Sauvegarder la radio - + Save a complete backup file of all settings and model data in the Radio Créer une copie de sauvegarde de tous les réglages et modèles de la radio - + Contributors... Contributeurs... - + A tribute to those who have contributed to OpenTX and Companion Remerciements à tout ceux qui ont contribué à OpenTX et Companion - + SD card synchronization Synchronisation de la carte SD - + Recent Files Fichiers récents - + Set Icon Theme Choisir le thème d'icônes - + Set Icon Size Choisir la taille des icônes - + Write Ecrire - + A new version of Companion is available (version %1)<br>Would you like to download it? Une nouvelle version de Companion est disponible (version %1)<br>Voulez-vous la télécharger ? - + OpenTX Home Page: <a href='%1'>%1</a> Page d'accueil d'OpenTX: <a href='%1'>%1</a> - + If you've found this program useful, please support by <a href='%1'>donating</a> Si vous trouvez ce programme utile, merci de le supporter par une <a href='%1'>donation</a> - + Ready Prêt - + Show the application's About box Afficher la fenêtre "A propos" de l'application - + File loaded Fichier chargé - - + + Open Models and Settings file Ouvrir un fichier de réglages et modèles - - + + File saved Fichier sauvegardé - + Read Models and Settings From Radio Lire les réglages et modèles depuis la radio - + Not enough flash available on this board for all the selected options Pas assez de place disponible pour les options sélectionnées - + Compilation server temporary failure, try later Erreur de compilation sur le serveur, veuillez réessayer plus tard - + Compilation error Erreur de compilation - + Invalid firmware Firmware invalide - + Invalid board Carte non valide - + Invalid language Language non valide - + Some text will not be translated until the next time you start Companion. Please note that some translations may not be complete. Certains textes ne seront pas traduits avant le prochain redémarrage de Companion. Veuillez noter que certaines traductions peuvent ne pas être complètes. - + Models and Settings read Lecture des modèles et réglages - + Companion update check failed, new version information not found. La vérification de mise à jour de Companion a échoué, les infos sur une nouvelle version sont introuvables. - + Firmware update check failed, new version information not found or invalid. La vérification de mise à jour du Firmware a échoué, les infos sur une nouvelle version sont introuvables ou invalides. - + Local Folder Dossier local - + Radio Folder Dossier Radio - - + + This function is not yet implemented Cette fonction n'est pas implémentée pour l'instant - + Save Radio Backup to File Sauvegarder la radio - + Read Radio Firmware to File Sauvegarder le firmware de la radio - + The OpenTX Companion project was originally forked from <a href='%1'>eePe</a> Le projet OpenTX Companion a été créé à partir d'<a href='%1'>eePe</a> - + Copyright OpenTX Team - + Create a new Models and Settings file Créer un nouveau fichier de réglages et modèles - - + + Save Models and Settings file Enregistrer le fichier de réglages et modèles - + Save Enregistrer - + Save As... Enregistrer sous... - + Close Fermer - + Close Models and Settings file Fermer le fichier de réglages et modèles - + Exit the application Quitter l'application - + Exit Quitter - + Create a new Radio Settings Profile Créer un nouveau profil de réglages et modèles - + Copy Current Radio Profile Copier le profil radio actuel - + Duplicate current Radio Settings Profile Dupliquer les réglages radio du profil actuel - + Delete the current Radio Settings Profile Supprimer les réglages radio du profil actuel - + Use default system language. Utiliser le langage système par défaut. - + Use %1 language (some translations may not be complete). Utiliser la langue %1 (certaines traductions peuvent être incomplètes). - + Classical Classique @@ -6469,12 +6465,67 @@ Nous recommandons de lire attentivement les notes de version à l'aide du b Voulez-vous lancer l'installateur ? - + + No Companion release candidates are currently being served for this version, please switch release channel + Aucune version "candidate" de Companion n'est actuellement disponible sur ce serveur, veuillez commuter sur le canal officiel + + + + No nightly Companion builds are currently being served for this version, please switch release channel + Aucune version "nightly" de Companion n'est actuellement disponible sur ce serveur, veuillez commuter sur le canal officiel + + + + No Companion release builds are currently being served for this version, please switch release channel + Aucune version "officielle" de Companion n'est actuellement disponible sur ce serveur, veuillez commuter sur le canal officiel + + + A new release of Companion is available, please check the <a href='%1'>OpenTX website!</a> Une nouvelle version de Companion est disponible, vérifiez le site OpenTX <a href='%1'> !</a> - + + No firmware release candidates are currently being served for this version, please switch release channel + Aucun firmware "candidate" n'est actuellement disponible sur ce serveur, veuillez commuter sur le canal officiel + + + + No firmware nightly builds are currently being served for this version, please switch release channel + Aucun firmware "nightly" n'est actuellement disponible sur ce serveur, veuillez commuter sur le canal officiel + + + + No firmware release builds are currently being served for this version, please switch release channel + Aucun firmware "officiel" n'est actuellement disponible sur ce serveur, veuillez commuter sur le canal officiel + + + + Release candidate builds are now available for this version, would you like to switch to using them? + Une version "candidate" est maintenant disponible pour cette version, voulez-vous commuter de canal afin de l'utiliser? + + + + Channel changed to RC, please restart the download process + Canal commuté sur "candidate", veuillez redémarrer le processus de téléchargement + + + + Official release builds are now available for this version, would you like to switch to using them? + Une version "officielle" est maintenant disponible pour cette version, voulez-vous commuter de canal afin de l'utiliser? + + + + Channel changed to Release, please restart the download process + Canal commuté sur "officiel", veuillez redémarrer le processus de téléchargement + + + + This radio (%1) is not currently available in this firmware release channel + Le firmware pour cette radio (%1) n'est actuellement pas disponible dans le canal "officiel" + + + Firmware %1 does not seem to have ever been downloaded. Version %2 is available. Do you want to download it now? @@ -6487,18 +6538,18 @@ Voulez-vous le télécharger maintenant? Nous vous recommandons de consulter les notes de mise à jour à l'aide du bouton ci-dessous pour en savoir plus sur les modifications susceptibles de vous intéresser. - - + + Do you want to download version %1 now ? Voulez-vous télécharger la version %1 maintenant? - + Ignore this version %1? Ignorer cette version %1? - + There are unsaved file changes which you may lose when switching radio types. Do you wish to continue? @@ -6507,315 +6558,315 @@ Do you wish to continue? Êtes-vous sûr de vouloir continuer ? - + No local SD structure path configured! Aucun chemin de configuré pour la structure SD en local ! - + No Radio or SD card detected! Pas de Radio ou carte SD de détectée ! - + Release notes... Notes de version... - + Show release notes Afficher les notes de version - + Delete Current Radio Profile... Supprimer le profil radio actuel... - + Export Application Settings.. Exporter les réglages de l'application... - + Save all the current %1 and Simulator settings (including radio profiles) to a file. Enregistrez tous les réglages actuels %1 et du simulateur (y compris les profils radio) dans un fichier. - + Import Application Settings.. Importer les réglages de l'application... - + Load %1 and Simulator settings from a prevously exported settings file. Charger les réglages %1 et les réglages de Simulation depuis un fichier précédemment exporté. - + Tabbed Windows Fenêtres à onglets - + Use tabs to arrange open windows. Utilisez les onglets pour organiser les fenêtres ouvertes. - + Tile Windows Titre de la fenêtre - + Arrange open windows across all the available space. Disposez les fenêtres ouvertes sur tout l'espace disponible. - + Cascade Windows Fenêtres en cascade - + Arrange all open windows in a stack. Organisez toutes les fenêtres ouvertes dans une pile. - + Close All Windows Fermer toutes les fenêtres - + Closes all open files (prompts to save if necessary. Fermer tous les fichiers ouverts (proposer de sauvegarder si nécessaire). - + Window Fenêtre - + Ctrl+Shift+S - + Ctrl+Alt+L - + Ctrl+Alt+D - + Ctrl+Alt+R - + The classic companion9x icon theme Thème d'icônes classique de Companion - + Yerico - + Yellow round honey sweet icon theme Thème d'icônes rondes jaunes - + Monochrome - + MonoWhite Monochrome Blanc - + Alt+%1 - + - Copy - Copier - + Companion :: Open files warning Companion::Ouvrir les fichiers d'avertissement - + Please save or close modified file(s) before deleting the active profile. Veuillez sauvegarder ou fermer le(s) fichier(s) modifié(s) avant de supprimer le profil actif. - + Not possible to remove profile Impossible de supprimer le profil - + The default profile can not be removed. Le profil par défaut ne peut pas être supprimé. - + Confirm Delete Profile Confirmer la suppression du profil - + Are you sure you wish to delete the "%1" radio profile? There is no way to undo this action! Etes-vous sûr de vouloir supprimer le profil radio %1? Cette action est irréversible! - + Please save or close all modified files before importing settings Veuillez sauvegarder ou fermer tous les fichiers modifiés avant d'importer les réglages - + <html><p>%1 and Simulator settings can be imported (restored) from a previosly saved export (backup) file. This will replace current settings with any settings found in the file.</p><p>An automatic backup of the current settings will be attempted. But if the current settings are useful then it is recommended that you make a manual backup first.</p><p>For best results when importing settings, <b>close any other %1 windows you may have open, and make sure the standalone Simulator application is not running.</p><p>Do you wish to continue?</p></html> <html><p>%1 et les réglages du simulateur peuvent être importés (restaurés) à partir d’un fichier d’exportation (sauvegarde) préalablement sauvegardé. Ceci remplacera les réglages actuels par tous les réglages trouvés dans le fichier.</p><p>Une sauvegarde automatique des réglages actuels sera tentée. Mais si les réglages actuels sont utiles, il est recommandé de commencer par une sauvegarde manuelle.</p><p>Pour obtenir de meilleurs résultats lors de l'importation des réglages,<b> fermez les autres fenêtres %1 que vous avez éventuellement ouvertes et assurez-vous que l'application autonome Simulator n'est pas en cours d'exécution. </p><p>Souhaitez-vous continuer? </p></html> - + Confirm Settings Import Confirmer les réglages d'importation - + Select %1: Sélectionnez %1: - + backup sauvegarde - + Press the 'Ignore' button to continue anyway. Appuyez sur le bouton 'Ignorer' pour continuer quand même. - + The settings could not be imported. Les réglages n'ont pas pu être importés. - + <html><p>New settings have been imported from:<br> %1.</p><p>%2 will now re-initialize.</p><p>Note that you may need to close and restart %2 before some settings like language and icon theme take effect.</p> <html><p>Les nouveaux réglages ont été importés depuis:<br> %1. </p><p>%2 sera maintenant réinitialisé.</p><p>Notez que vous devrez peut-être fermer et redémarrer %2 avant que certains réglages tels que la langue et le thème d’icône prennent effet.</p> - + <p>The previous settings were backed up to:<br> %1</p> <p>Les réglages précédents ont été sauvegardés sous:<br> %1 </p> - + MonoBlue Monochrome Bleu - + System language Langue du système - + About... A propos... - + View Log File... Ouvrir un Log... - + Open and view log file Ouvrir et visualiser un log - + Settings... Préférences... - + Edit Settings Éditer les réglages - + Download... Télécharger... - + Download firmware and voice files Télécharger firmware et fichiers son - + Check for Updates... Vérifier les mises à jour... - + Check OpenTX and Companion updates Vérifier les mises à jour d'OpenTX et Companion - + Compare Models... Comparer 2 modèles... - + Edit Radio Splash Image... Éditer l'écran d'accueil de la radio... - + Edit the splash image of your Radio Éditer l'écran d'accueil de la radio - + List available programmers Lister les programmateurs supportés - - + + Save As Enregistrer Sous - - + + No updates available at this time. Aucune mise à jour disponible. - - + + Help Aide @@ -6825,37 +6876,37 @@ Do you wish to continue? Recherche de mises à jour - + The new theme will be loaded the next time you start Companion. Le nouveau thème sera utilisé lors du prochain lancement de Companion. - + About Companion A propos de Companion - + Set Menu Language Choisir la langue des menus - + Settings Réglages - + Read/Write Transfert - + %2 - + New Radio Nouvelle radio @@ -6863,12 +6914,12 @@ Do you wish to continue? MdiChild - + Unable to find file %1! Fichier %1 introuvable ! - + Save As Enregister Sous @@ -7065,49 +7116,49 @@ Do you wish to continue? Afficher la barre d'outils "Modèle" - + Category index out of range. Index de catégorie hors limite. - + Cannot delete the last category. Impossible d'effacer la dernière catégorie. - + This category is not empty! Catégorie non vide ! - + Cannot insert model, last model in list would be deleted. Impossible d'insérer le modèle, le dernier modèle dans la liste serait supprimé. - + Cannot add model, could not find an available model slot. Impossible d'ajouter un modèle, aucun emplacement libre n’est disponible. - + New model Translators: do NOT use accents here, this is a default model name. No accent, but no more than 15 characters!! Nve modele - + Cannot paste model, out of available model slots. Impossible de coller le modèle, aucun emplacement libre n’est disponible. - + You are replacing an existing model, are you sure? Vous allez écraser un modèle existant, êtes-vous sûr ? - + Delete %n selected model(s)? Supprimer le modèle sélectionné ? @@ -7115,7 +7166,7 @@ Do you wish to continue? - + Delete %n selected category(ies)? Supprimer la catégorie sélectionnée ? @@ -7123,59 +7174,59 @@ Do you wish to continue? - + Cannot duplicate model, could not find an available model slot. Impossible de dupliquer le modèle, aucun emplacement libre n’est disponible. - + Do you wish to continue with the conversion? Souhaitez-vous vraiment lancer la conversion ? - + Choose <i>Apply</i> to convert the file, or <i>Close</i> to close it without conversion. Choisissez <i>Appliquer</i> pour convertir le fichier ou <i>Annuler</i> pour le fermer sans conversion. - + <b>The conversion generated some important messages, please review them below.</b> <b>La conversion a généré des messages importants, veuillez les consulter ci-dessous.</b> - + Companion :: Conversion Result for %1 Companion :: Résultat de conversion de %1 - + Unable to find Horus radio SD card! Impossible de trouver la carte SD de la Horus ! - + Models and Settings written Modèle et réglages écrit - + Cannot write temporary file! Ecriture de fichier temporaire impossible ! - + Editing model %1: Édition du modèle %1 : - + Error reading file %1: %2. Fichier %1 corrompu: %2. - + Error opening file %1: %2. Erreur à l'ouverture du fichier %1: @@ -7197,39 +7248,39 @@ Do you wish to continue? - + Do you want to overwrite radio general settings? Voulez-vous vraiment écraser les paramètres généraux ? - + free bytes octets libres - + New category Translators do NOT use accent for this, this is the default category name on Horus. No accent, but no more than 15 characters!! Nlle categorie - + <p><b>Currently selected radio type (%1) is not compatible with file %3 (from %2), models and settings need to be converted.</b></p> <p><b>Le type de radio actuellement sélectionné (%1) n'est pas compatible avec le fichier %3 (à partir de %2), les modèles et les paramètres doivent être convertis.</b></p> - + Open backup Models and Settings file Ouvrir la sauvegarde de réglages et modèles - + Invalid binary backup File %1 Fichier de sauvegarde %1 invalide - + %1 has been modified. Do you want to save your changes? %1 a été modifié. @@ -7639,12 +7690,12 @@ Mixage actif par défaut si non-renseigné. ModelData - + Model: Modèle: - + Throttle Source Source des gaz @@ -8748,12 +8799,12 @@ Mixage actif par défaut si non-renseigné. ModuleData - + Positive - + Negative Négative @@ -8783,50 +8834,50 @@ Mixage actif par défaut si non-renseigné. Module HF - + 10mW - 16CH 10mW - 16 VOIES - - + + 100mW - 16CH 100mW - 16 VOIES - + 500mW - 16CH 500mW - 16 VOIES - + Auto <= 1W - 16CH Auto <= 1W - 16 VOIES - - + + 25mW - 8CH 25mW - 8 VOIES - - + + 25mW - 16CH 25mW - 16 VOIES - + 200mW - 16CH (no telemetry) 200mW - 16 VOIES (pas de télémétrie) - + 500mW - 16CH (no telemetry) 500mW - 16 VOIES (pas de télémétrie) - + 100mW - 16CH (no telemetry) 100mW - 16 VOIES (pas de télémétrie) @@ -8834,27 +8885,27 @@ Mixage actif par défaut si non-renseigné. ModulePanel - + Value Valeur - + Hold Maintien - + No Pulse Pas d'impulsion - + Ext. + Int - + External Externe @@ -9351,7 +9402,7 @@ Mixage actif par défaut si non-renseigné. DÉFAUT - + Custom - proto %1) Personnaliser - proto %1) @@ -9382,12 +9433,12 @@ Mixage actif par défaut si non-renseigné. OpenTxEepromInterface - + Unknown error Erreur inconnue - + ... plus %1 errors ... plus %1 erreurs @@ -9778,7 +9829,7 @@ E RadioSwitchWidget - + Latch/unlatch the momentary switch. Verrouiller/déverrouiller l'inter momentané. @@ -10759,22 +10810,22 @@ Si cette option est cochée, la voie des gaz est inversée: le ralenti est &apo SetupPanel - + Timer %1 Chrono %1 - + THR GAZ - + Profile Settings Réglages du profil - + SD structure path not specified or invalid Chemin de la structure SD non spécifié ou invalide @@ -11498,62 +11549,62 @@ La valeur par défaut est configurée dans le profil radio sélectionné.Simulateur Radio (%1) - + Could not determine startup data source. Impossible de déterminer les données source. - + Could not load data, possibly wrong format. Impossible de charger les données, mauvais format. - + Data Load Error Erreur de lecture des données - + Invalid startup data provided. Plese specify a proper file/path. Données de démarrage fournies non valides. Veuillez spécifier un fichier/chemin approprié. - + Simulator Startup Error Erreur de démarrage du simulateur - + Error saving data: could open file for writing: '%1' Erreur de sauvegarde des données: impossible d'écrire le fichier '%1' - + Error saving data: could not get data from simulator interface. Erreur de sauvegarde des données: impossible de récupérer les données depuis l'interface de simulation. - + An unexpected error occurred while attempting to save radio data to file '%1'. Une erreur inattendue s'est produite lors de l'enregistrement des données radio dans le fichier '%1'. - + Data Save Error Erreur de sauvegarde des données - + Cannot open joystick, joystick disabled Impossible d'accéder au Joystick, Joystick désactivé - + Radio firmware error: %1 Erreur firmware radio: %1 - + - Flight Mode %1 (#%2) - Phase de Vol %1 (#%2) @@ -13231,28 +13282,33 @@ Extra long : bips extra longs. TreeModel - + Index - + Name Nom - + Size Taille - + + RX # + + + + Models Translators do NOT use accent for this, this is the default category name on Horus. Modeles - + Model %1 Translators: do NOT use accents here, this is a default model name. Modele %1 diff --git a/companion/src/translations/companion_it.ts b/companion/src/translations/companion_it.ts index 9d8da37a3..1584cd046 100644 --- a/companion/src/translations/companion_it.ts +++ b/companion/src/translations/companion_it.ts @@ -456,7 +456,7 @@ Può essere differente dalla lingua del firmware - Use releases and release candidates (testing) + Use release candidates (testing) diff --git a/companion/src/translations/companion_ja.ts b/companion/src/translations/companion_ja.ts index 98ba35c33..dd0cda486 100644 --- a/companion/src/translations/companion_ja.ts +++ b/companion/src/translations/companion_ja.ts @@ -404,7 +404,7 @@ Mode 4: - Use releases and release candidates (testing) + Use release candidates (testing) リリースとRC (Test版) を使用 diff --git a/companion/src/translations/companion_pl.ts b/companion/src/translations/companion_pl.ts index de9d52a5a..ad7313770 100644 --- a/companion/src/translations/companion_pl.ts +++ b/companion/src/translations/companion_pl.ts @@ -448,7 +448,7 @@ Może być różny od języka firmware - Use releases and release candidates (testing) + Use release candidates (testing) diff --git a/companion/src/translations/companion_sv.ts b/companion/src/translations/companion_sv.ts index 87d60007a..ad95f82f0 100644 --- a/companion/src/translations/companion_sv.ts +++ b/companion/src/translations/companion_sv.ts @@ -452,7 +452,7 @@ Behöver inte vara samma som menyspråk - Use releases and release candidates (testing) + Use release candidates (testing) diff --git a/companion/src/translations/companion_zh_CN.ts b/companion/src/translations/companion_zh_CN.ts index 9c47a2d78..5bec62fcb 100644 --- a/companion/src/translations/companion_zh_CN.ts +++ b/companion/src/translations/companion_zh_CN.ts @@ -401,7 +401,7 @@ Mode 4: - Use releases and release candidates (testing) + Use release candidates (testing) diff --git a/companion/src/wizarddata.cpp b/companion/src/wizarddata.cpp index 70a246af6..f544ee4b0 100644 --- a/companion/src/wizarddata.cpp +++ b/companion/src/wizarddata.cpp @@ -44,14 +44,14 @@ WizMix::WizMix(const GeneralSettings & settings, unsigned int modelId, const Mod originalModelData(modelData), vehicle(NOVEHICLE) { - strncpy(name, originalModelData.name, WIZ_MODEL_NAME_LENGTH); + memset(name, 0, sizeof(name)); + strncpy(name, originalModelData.name, sizeof(name)-1); } - void WizMix::maxMixSwitch(char *name, MixData &mix, int channel, int sw, int weight) { - strncpy(mix.name, name, MIXDATA_NAME_LEN); - mix.name[MIXDATA_NAME_LEN] = '\0'; + memset(mix.name, 0, sizeof(mix.name)); + strncpy(mix.name, name, sizeof(mix.name)-1); mix.destCh = channel; mix.srcRaw = RawSource(SOURCE_TYPE_MAX); mix.swtch = RawSwitch(SWITCH_TYPE_SWITCH, sw); @@ -75,7 +75,7 @@ void WizMix::addMix(ModelData &model, Input input, int weight, int channel, int } else if (input==FLAPS_INPUT){ // There ought to be some kind of constants for switches somewhere... - maxMixSwitch((char *)"Flaps Up", model.mixData[mixIndex++], channel+1, isHorusOrTaranis ? SWITCH_SA0 :-SWITCH_ELE , weight); //Taranis-Horus SA-UP, 9X ELE-UP + maxMixSwitch((char *)"Flaps Up", model.mixData[mixIndex++], channel+1, isHorusOrTaranis ? SWITCH_SA0 :-SWITCH_ELE , weight); //Taranis-Horus SA-UP, 9X ELE-UP maxMixSwitch((char *)"Flaps Dn", model.mixData[mixIndex++], channel+1, isHorusOrTaranis ? SWITCH_SA2 : SWITCH_ELE , -weight); //Taranis-Horus SA-DOWN, 9X ELE-DOWN } @@ -91,7 +91,6 @@ WizMix::operator ModelData() int throttleChannel = -1; ModelData model; - //ModelData model(originalModelData); model.category = originalModelData.category; model.used = true; model.moduleData[0].modelId = modelId; @@ -101,8 +100,8 @@ WizMix::operator ModelData() int timerIndex = 0; // Safe copy model name - strncpy(model.name, name, WIZ_MODEL_NAME_LENGTH); - model.name[WIZ_MODEL_NAME_LENGTH] = 0; + memset(model.name, 0, sizeof(model.name)); + strncpy(model.name, name, sizeof(model.name)-1); // Add the channel mixes for (int i=0; i= 0){ + memset(model.timers[timerIndex].name, 0, sizeof(model.timers[timerIndex].name)); + strncpy(model.timers[timerIndex].name, "Flt", sizeof(model.timers[timerIndex].name)-1); model.timers[timerIndex].mode.type = SWITCH_TYPE_TIMER_MODE; model.timers[timerIndex].mode.index = TMRMODE_THR_TRG; timerIndex++; } // Add the Throttle Timer option - if (options[THROTTLE_TIMER_OPTION] && throttleChannel >=0){ + if (options[THROTTLE_TIMER_OPTION] && throttleChannel >= 0){ + memset(model.timers[timerIndex].name, 0, sizeof(model.timers[timerIndex].name)); + strncpy(model.timers[timerIndex].name, "Thr", sizeof(model.timers[timerIndex].name)-1); model.timers[timerIndex].mode.type = SWITCH_TYPE_TIMER_MODE; model.timers[timerIndex].mode.index = TMRMODE_THR; timerIndex++; diff --git a/companion/src/wizarddialog.cpp b/companion/src/wizarddialog.cpp index e681cfc6e..189167c97 100644 --- a/companion/src/wizarddialog.cpp +++ b/companion/src/wizarddialog.cpp @@ -306,8 +306,8 @@ bool ModelSelectionPage::validatePage() QString newName(nameLineEdit->text()); newName = (newName.normalized(QString::NormalizationForm_D)); newName = newName.replace(QRegExp("[^ A-Za-z0-9_.-,\\s]"), ""); - strncpy( wizDlg->mix.name, newName.toLatin1(), WIZ_MODEL_NAME_LENGTH); - wizDlg->mix.name[WIZ_MODEL_NAME_LENGTH] = 0; + memset(wizDlg->mix.name, 0, sizeof(wizDlg->mix.name)); + strncpy( wizDlg->mix.name, newName.toLatin1(), sizeof(wizDlg->mix.name)-1); if (multirotorRB->isChecked()) wizDlg->mix.vehicle = MULTICOPTER; @@ -1053,7 +1053,7 @@ QString WizardPrinter::printChannel( Input input1, int weight1, Input input2, in QString WizardPrinter::print() { - QString str = tr("Model Name: ") + mix->name + "\n"; + QString str = tr("Model Name: ") + QString::fromUtf8(mix->name) + "\n"; str += tr("Model Type: ") + vehicleName(mix->vehicle) + "\n"; str += tr("Options: ") + "["; @@ -1075,6 +1075,3 @@ QString WizardPrinter::print() } return str; } - - - diff --git a/radio/sdcard/horus/CROSSFIRE/crossfire.lua b/radio/sdcard/horus/CROSSFIRE/crossfire.lua index 6606f0aaa..c4d71f1b9 100644 --- a/radio/sdcard/horus/CROSSFIRE/crossfire.lua +++ b/radio/sdcard/horus/CROSSFIRE/crossfire.lua @@ -87,11 +87,11 @@ local function run(event) if event == nil then error("Cannot be run as a model script!") return 2 - elseif event == EVT_EXIT_BREAK then + elseif event == EVT_VIRTUAL_EXIT then return 2 - elseif event == EVT_ROT_LEFT then + elseif event == EVT_VIRTUAL_NEXT then selectDevice(1) - elseif event == EVT_ROT_RIGHT then + elseif event == EVT_VIRTUAL_PREVIOUS then selectDevice(-1) end @@ -105,7 +105,7 @@ local function run(event) else for i=1, #devices do local attr = (lineIndex == i and INVERS or 0) - if event == EVT_ROT_BREAK and attr == INVERS then + if event == EVT_VIRTUAL_ENTER and attr == INVERS then crossfireTelemetryPush(0x28, { devices[i].id, 0xEA }) return "device.lua" end diff --git a/radio/sdcard/horus/CROSSFIRE/device.lua b/radio/sdcard/horus/CROSSFIRE/device.lua index 811f01847..e733dc5a6 100644 --- a/radio/sdcard/horus/CROSSFIRE/device.lua +++ b/radio/sdcard/horus/CROSSFIRE/device.lua @@ -435,7 +435,7 @@ local function runDevicePage(event) else return "crossfire.lua" end - elseif event == EVT_ROT_BREAK then -- toggle editing/selecting current field + elseif event == EVT_VIRTUAL_EXIT then -- toggle editing/selecting current field local field = getField(lineIndex) if field.name then if field.type == 10 then @@ -456,15 +456,15 @@ local function runDevicePage(event) end end elseif edit then - if event == EVT_ROT_LEFT then + if event == EVT_VIRTUAL_NEXT then incrField(1) - elseif event == EVT_ROT_RIGHT then + elseif event == EVT_VIRTUAL_PREVIOUS then incrField(-1) end else - if event == EVT_ROT_RIGHT then + if event == EVT_VIRTUAL_NEXT then selectField(1) - elseif event == EVT_ROT_LEFT then + elseif event == EVT_VIRTUAL_PREVIOUS then selectField(-1) end end diff --git a/radio/sdcard/horus/SxR/SxR_Calibrate.lua b/radio/sdcard/horus/SxR Calibrate/SxR_Calibrate.lua similarity index 100% rename from radio/sdcard/horus/SxR/SxR_Calibrate.lua rename to radio/sdcard/horus/SxR Calibrate/SxR_Calibrate.lua diff --git a/radio/sdcard/horus/SxR/img/back.png b/radio/sdcard/horus/SxR Calibrate/img/back.png similarity index 100% rename from radio/sdcard/horus/SxR/img/back.png rename to radio/sdcard/horus/SxR Calibrate/img/back.png diff --git a/radio/sdcard/horus/SxR/img/delta_b.png b/radio/sdcard/horus/SxR Calibrate/img/delta_b.png similarity index 100% rename from radio/sdcard/horus/SxR/img/delta_b.png rename to radio/sdcard/horus/SxR Calibrate/img/delta_b.png diff --git a/radio/sdcard/horus/SxR/img/done.bmp b/radio/sdcard/horus/SxR Calibrate/img/done.bmp similarity index 100% rename from radio/sdcard/horus/SxR/img/done.bmp rename to radio/sdcard/horus/SxR Calibrate/img/done.bmp diff --git a/radio/sdcard/horus/SxR/img/down.png b/radio/sdcard/horus/SxR Calibrate/img/down.png similarity index 100% rename from radio/sdcard/horus/SxR/img/down.png rename to radio/sdcard/horus/SxR Calibrate/img/down.png diff --git a/radio/sdcard/horus/SxR/img/forward.png b/radio/sdcard/horus/SxR Calibrate/img/forward.png similarity index 100% rename from radio/sdcard/horus/SxR/img/forward.png rename to radio/sdcard/horus/SxR Calibrate/img/forward.png diff --git a/radio/sdcard/horus/SxR/img/left.png b/radio/sdcard/horus/SxR Calibrate/img/left.png similarity index 100% rename from radio/sdcard/horus/SxR/img/left.png rename to radio/sdcard/horus/SxR Calibrate/img/left.png diff --git a/radio/sdcard/horus/SxR/img/plane_b.png b/radio/sdcard/horus/SxR Calibrate/img/plane_b.png similarity index 100% rename from radio/sdcard/horus/SxR/img/plane_b.png rename to radio/sdcard/horus/SxR Calibrate/img/plane_b.png diff --git a/radio/sdcard/horus/SxR/img/planev_b.png b/radio/sdcard/horus/SxR Calibrate/img/planev_b.png similarity index 100% rename from radio/sdcard/horus/SxR/img/planev_b.png rename to radio/sdcard/horus/SxR Calibrate/img/planev_b.png diff --git a/radio/sdcard/horus/SxR/img/planev_s.png b/radio/sdcard/horus/SxR Calibrate/img/planev_s.png similarity index 100% rename from radio/sdcard/horus/SxR/img/planev_s.png rename to radio/sdcard/horus/SxR Calibrate/img/planev_s.png diff --git a/radio/sdcard/horus/SxR/img/right.png b/radio/sdcard/horus/SxR Calibrate/img/right.png similarity index 100% rename from radio/sdcard/horus/SxR/img/right.png rename to radio/sdcard/horus/SxR Calibrate/img/right.png diff --git a/radio/sdcard/horus/SxR/img/up.png b/radio/sdcard/horus/SxR Calibrate/img/up.png similarity index 100% rename from radio/sdcard/horus/SxR/img/up.png rename to radio/sdcard/horus/SxR Calibrate/img/up.png diff --git a/radio/sdcard/horus/SxR/img/vert-r.png b/radio/sdcard/horus/SxR Calibrate/img/vert-r.png similarity index 100% rename from radio/sdcard/horus/SxR/img/vert-r.png rename to radio/sdcard/horus/SxR Calibrate/img/vert-r.png diff --git a/radio/sdcard/horus/SxR/img/vert.png b/radio/sdcard/horus/SxR Calibrate/img/vert.png similarity index 100% rename from radio/sdcard/horus/SxR/img/vert.png rename to radio/sdcard/horus/SxR Calibrate/img/vert.png diff --git a/radio/sdcard/horus/SxR/SxR.lua b/radio/sdcard/horus/SxR/SxR.lua deleted file mode 100755 index 0e76fb781..000000000 --- a/radio/sdcard/horus/SxR/SxR.lua +++ /dev/null @@ -1,318 +0,0 @@ ----- ######################################################################### ----- # # ----- # Copyright (C) OpenTX # ------# # ----- # License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html # ----- # # ----- # This program is free software; you can redistribute it and/or modify # ----- # it under the terms of the GNU General Public License version 2 as # ----- # published by the Free Software Foundation. # ----- # # ----- # This program is distributed in the hope that it will be useful # ----- # but WITHOUT ANY WARRANTY; without even the implied warranty of # ----- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # ----- # GNU General Public License for more details. # ----- # # ----- ######################################################################### -local VALUE = 0 -local COMBO = 1 - -local COLUMN_2 = 300 - -local edit = false -local page = 1 -local current = 1 -local refreshState = 0 -local refreshIndex = 0 -local calibrationState = 0 -local pageOffset = 0 -local calibrationStep = 0 -local pages = {} -local fields = {} -local modifications = {} -local wingBitmaps = {} -local mountBitmaps = {} - -local configFields = { - {"Wing type:", COMBO, 0x80, nil, { "Normal", "Delta", "VTail" } }, - {"Mounting type:", COMBO, 0x81, nil, { "Horz", "Horz rev.", "Vert", "Vert rev." } }, -} -local wingBitmapsFile = {"img/plane_b.png", "img/delta_b.png", "img/planev_b.png"} -local mountBitmapsFile = {"img/up.png", "img/down.png", "img/vert.png", "img/vert-r.png"} - -local settingsFields = { - {"SxR functions:", COMBO, 0x9C, nil, { "Disable", "Enable" } }, - {"Quick Mode:", COMBO, 0xAA, nil, { "Disable", "Enable" } }, - {"CH5 mode:", COMBO, 0xA8, nil, { "AIL2", "AUX1" } }, - {"CH6 mode:", COMBO, 0xA9, nil, { "ELE2", "AUX2" } }, - {"AIL direction:", COMBO, 0x82, nil, { "Normal", "Invers" }, { 255, 0 } }, - {"ELE direction:", COMBO, 0x83, nil, { "Normal", "Invers" }, { 255, 0 } }, - {"RUD direction:", COMBO, 0x84, nil, { "Normal", "Invers" }, { 255, 0 } }, - {"AIL2 direction:", COMBO, 0x9A, nil, { "Normal", "Invers" }, { 255, 0 } }, - {"ELE2 direction:", COMBO, 0x9B, nil, { "Normal", "Invers" }, { 255, 0 } }, - {"AIL stabilize gain:", VALUE, 0x85, nil, 0, 200, "%"}, - {"ELE stabilize gain:", VALUE, 0x86, nil, 0, 200, "%"}, - {"RUD stabilize gain:", VALUE, 0x87, nil, 0, 200, "%"}, - {"AIL auto level gain:", VALUE, 0x88, nil, 0, 200, "%"}, - {"ELE auto level gain:", VALUE, 0x89, nil, 0, 200, "%"}, - {"ELE upright gain:", VALUE, 0x8C, nil, 0, 200, "%"}, - {"RUD upright gain:", VALUE, 0x8D, nil, 0, 200, "%"}, - {"AIL crab gain:", VALUE, 0x8E, nil, 0, 200, "%"}, - {"RUD crab gain:", VALUE, 0x90, nil, 0, 200, "%"}, - {"AIL auto angle offset:", VALUE, 0x91, nil, -20, 20, "%", 0x6C}, - {"ELE auto angle offset:", VALUE, 0x92, nil, -20, 20, "%", 0x6C}, - {"ELE upright angle offset:", VALUE, 0x95, nil, -20, 20, "%", 0x6C}, - {"RUD upright angle offset:", VALUE, 0x96, nil, -20, 20, "%", 0x6C}, - {"AIL crab angle offset:", VALUE, 0x97, nil, -20, 20, "%", 0x6C}, - {"RUD crab angle offset:", VALUE, 0x99, nil, -20, 20, "%", 0x6C}, -} - -local calibrationFields = { - {"X:", VALUE, 0x9E, 0, -100, 100, "%"}, - {"Y:", VALUE, 0x9F, 0, -100, 100, "%"}, - {"Z:", VALUE, 0xA0, 0, -100, 100, "%"} -} - -local function drawScreenTitle(title,page, pages) - lcd.drawFilledRectangle(0, 0, LCD_W, 30, TITLE_BGCOLOR) - lcd.drawText(1, 5, title, MENU_TITLE_COLOR) - lcd.drawText(LCD_W-40, 5, page.."/"..pages, MENU_TITLE_COLOR) -end - --- Change display attribute to current field -local function addField(step) - local field = fields[current] - local min, max - if field[2] == VALUE then - min = field[5] - max = field[6] - elseif field[2] == COMBO then - min = 0 - max = #(field[5]) - 1 - end - if (step < 0 and field[4] > min) or (step > 0 and field[4] < max) then - field[4] = field[4] + step - end -end - --- Select the next or previous page -local function selectPage(step) - page = 1 + ((page + step - 1 + #pages) % #pages) - refreshIndex = 0 - calibrationStep = 0 - pageOffset = 0 -end - --- Select the next or previous editable field -local function selectField(step) - current = 1 + ((current + step - 1 + #fields) % #fields) - if current > 7 + pageOffset then - pageOffset = current - 7 - elseif current <= pageOffset then - pageOffset = current - 1 - end -end - -local function drawProgressBar() - local width = (300 * refreshIndex) / #fields - lcd.drawRectangle(100, 10, 300, 6) - lcd.drawFilledRectangle(102, 13, width, 2); -end - --- Redraw the current page -local function redrawFieldsPage(event) - lcd.clear() - drawScreenTitle("SxR", page, #pages) - - if refreshIndex < #fields then - drawProgressBar() - end - - for index = 1, 10, 1 do - local field = fields[pageOffset+index] - if field == nil then - break - end - - local attr = current == (pageOffset+index) and ((edit == true and BLINK or 0) + INVERS) or 0 - attr = attr + TEXT_COLOR - - lcd.drawText(1, 30+20*index, field[1], TEXT_COLOR) - - if field[4] == nil then - lcd.drawText(COLUMN_2, 30+20*index, "---", attr) - else - if field[2] == VALUE then - lcd.drawNumber(COLUMN_2, 30+20*index, field[4], LEFT + attr) - elseif field[2] == COMBO then - if field[4] >= 0 and field[4] < #(field[5]) then - lcd.drawText(COLUMN_2, 30+20*index, field[5][1+field[4]], attr) - end - end - end - end -end - -local function telemetryRead(field) - return sportTelemetryPush(0x17, 0x30, 0x0C30, field) -end - -local function telemetryWrite(field, value) - return sportTelemetryPush(0x17, 0x31, 0x0C30, field + value*256) -end - -local telemetryPopTimeout = 0 -local function refreshNext() - if refreshState == 0 then - if calibrationState == 1 then - if telemetryWrite(0x9D, calibrationStep) == true then - refreshState = 1 - calibrationState = 2 - telemetryPopTimeout = getTime() + 120 -- normal delay is 500ms - end - elseif #modifications > 0 then - telemetryWrite(modifications[1][1], modifications[1][2]) - modifications[1] = nil - elseif refreshIndex < #fields then - local field = fields[refreshIndex + 1] - if telemetryRead(field[3]) == true then - refreshState = 1 - telemetryPopTimeout = getTime() + 80 -- normal delay is 500ms - end - end - elseif refreshState == 1 then - local physicalId, primId, dataId, value = sportTelemetryPop() - if physicalId == 0x1A and primId == 0x32 and dataId == 0x0C30 then - local fieldId = value % 256 - if calibrationState == 2 then - if fieldId == 0x9D then - refreshState = 0 - calibrationState = 0 - calibrationStep = (calibrationStep + 1) % 7 - end - else - local field = fields[refreshIndex + 1] - if fieldId == field[3] then - local value = math.floor(value / 256) - if field[3] == 0xAA then - value = bit32.band(value, 0x0001) - end - if field[3] >= 0x9E and field[3] <= 0xA0 then - local b1 = value % 256 - local b2 = math.floor(value / 256) - value = b1*256 + b2 - value = value - bit32.band(value, 0x8000) * 2 - end - if field[2] == COMBO and #field == 6 then - for index = 1, #(field[6]), 1 do - if value == field[6][index] then - value = index - 1 - break - end - end - elseif field[2] == VALUE and #field == 8 then - value = value - field[8] + field[5] - end - fields[refreshIndex + 1][4] = value - refreshIndex = refreshIndex + 1 - refreshState = 0 - end - end - elseif getTime() > telemetryPopTimeout then - fields[refreshIndex + 1][4] = nil - refreshIndex = refreshIndex + 1 - refreshState = 0 - calibrationState = 0 - end - end -end - -local function updateField(field) - local value = field[4] - if field[2] == COMBO and #field == 6 then - value = field[6][1+value] - elseif field[2] == VALUE and #field == 8 then - value = value + field[8] - field[5] - end - modifications[#modifications+1] = { field[3], value } -end - --- Main -local function runFieldsPage(event) - if event == EVT_EXIT_BREAK then -- exit script - return 2 - elseif event == EVT_ENTER_BREAK or event == EVT_ROT_BREAK then -- toggle editing/selecting current field - if fields[current][4] ~= nil then - edit = not edit - if edit == false then - updateField(fields[current]) - end - end - elseif edit then - if event == EVT_PLUS_FIRST or event == EVT_ROT_RIGHT or event == EVT_PLUS_REPT then - addField(1) - elseif event == EVT_MINUS_FIRST or event == EVT_ROT_LEFT or event == EVT_MINUS_REPT then - addField(-1) - end - else - if event == EVT_MINUS_FIRST or event == EVT_ROT_RIGHT then - selectField(1) - elseif event == EVT_PLUS_FIRST or event == EVT_ROT_LEFT then - selectField(-1) - end - end - redrawFieldsPage(event) - return 0 -end - -local function runConfigPage(event) - fields = configFields - local result = runFieldsPage(event) - if fields[1][4] ~= nil then - if wingBitmaps[1 + fields[1][4]] == nil then - wingBitmaps[1 + fields[1][4]] = Bitmap.open(wingBitmapsFile[1 + fields[1][4]]) - end - lcd.drawBitmap(wingBitmaps[1 + fields[1][4]], 10, 90) - end - if fields[2][4] ~= nil then - if mountBitmaps[1 + fields[2][4]] == nil then - mountBitmaps[1 + fields[2][4]] = Bitmap.open(mountBitmapsFile[1 + fields[2][4]]) - end - lcd.drawBitmap(mountBitmaps[1 + fields[2][4]], 190, 110) - end - return result -end - -local function runSettingsPage(event) - fields = settingsFields - return runFieldsPage(event) -end - --- Init -local function init() - current, edit, refreshState, refreshIndex = 1, false, 0, 0 - pages = { - runConfigPage, - runSettingsPage, - } -end - --- Main -local function run(event) - if event == nil then - error("Cannot be run as a model script!") - return 2 - elseif event == EVT_PAGE_BREAK or event == EVT_PAGEDN_FIRST then - selectPage(1) - elseif event == EVT_PAGE_LONG or event == EVT_PAGEUP_FIRST then - killEvents(event); - selectPage(-1) - end - - local result = pages[page](event) - refreshNext() - - return result -end - -return { init=init, run=run } diff --git a/radio/sdcard/horus/THEMES/Default/mask_radio_tools.png b/radio/sdcard/horus/THEMES/Default/mask_radio_tools.png new file mode 100755 index 000000000..711d499de Binary files /dev/null and b/radio/sdcard/horus/THEMES/Default/mask_radio_tools.png differ diff --git a/radio/sdcard/taranis-x7/CROSSFIRE/crossfire.lua b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/CROSSFIRE/crossfire.lua similarity index 92% rename from radio/sdcard/taranis-x7/CROSSFIRE/crossfire.lua rename to radio/sdcard/taranis-x7/SCRIPTS/TOOLS/CROSSFIRE/crossfire.lua index 8d409ccad..f68c4db3d 100644 --- a/radio/sdcard/taranis-x7/CROSSFIRE/crossfire.lua +++ b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/CROSSFIRE/crossfire.lua @@ -1,3 +1,4 @@ +local toolName = "TNS|Crossfire setup|TNE" ---- ######################################################################### ---- # # ---- # Copyright (C) OpenTX # @@ -85,11 +86,11 @@ local function run(event) if event == nil then error("Cannot be run as a model script!") return 2 - elseif event == EVT_EXIT_BREAK then + elseif event == EVT_VIRTUAL_EXIT then return 2 - elseif event == EVT_ROT_LEFT or event == EVT_DOWN_BREAK then + elseif event == EVT_VIRTUAL_NEXT then selectDevice(1) - elseif event == EVT_ROT_RIGHT or event == EVT_UP_BREAK then + elseif event == EVT_VIRTUAL_PREVIOUS then selectDevice(-1) end @@ -100,7 +101,7 @@ local function run(event) else for i=1, #devices do local attr = (lineIndex == i and INVERS or 0) - if (event == EVT_ROT_BREAK or event == EVT_RIGHT_BREAK) and attr == INVERS then + if event == EVT_VIRTUAL_ENTER and attr == INVERS then crossfireTelemetryPush(0x28, { devices[i].id, 0xEA }) return "device.lua" end diff --git a/radio/sdcard/taranis-x7/CROSSFIRE/device.lua b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/CROSSFIRE/device.lua similarity index 97% rename from radio/sdcard/taranis-x7/CROSSFIRE/device.lua rename to radio/sdcard/taranis-x7/SCRIPTS/TOOLS/CROSSFIRE/device.lua index 616f23842..27900f5b1 100644 --- a/radio/sdcard/taranis-x7/CROSSFIRE/device.lua +++ b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/CROSSFIRE/device.lua @@ -419,7 +419,7 @@ end -- Main local function runDevicePage(event) - if event == EVT_EXIT_BREAK then -- exit script + if event == EVT_VIRTUAL_EXIT then -- exit script if edit == true then edit = false local field = getField(lineIndex) @@ -430,7 +430,7 @@ local function runDevicePage(event) else return "crossfire.lua" end - elseif event == EVT_ROT_BREAK or event == EVT_RIGHT_BREAK then -- toggle editing/selecting current field + elseif event == EVT_VIRTUAL_ENTER then -- toggle editing/selecting current field local field = getField(lineIndex) if field.name then if field.type == 10 then @@ -451,15 +451,15 @@ local function runDevicePage(event) end end elseif edit then - if event == EVT_ROT_RIGHT or event == EVT_DOWN_BREAK then + if event == EVT_VIRTUAL_NEXT or event == EVT_VIRTUAL_NEXT_REPT then incrField(1) - elseif event == EVT_ROT_LEFT or event == EVT_UP_BREAK then + elseif event == EVT_VIRTUAL_PREVIOUS or event == EVT_VIRTUAL_PREVIOUS_REPT then incrField(-1) end else - if event == EVT_ROT_RIGHT or event == EVT_DOWN_BREAK then + if event == EVT_VIRTUAL_NEXT then selectField(1) - elseif event == EVT_ROT_LEFT or event == EVT_UP_BREAK then + elseif event == EVT_VIRTUAL_PREVIOUS then selectField(-1) end end diff --git a/radio/sdcard/FrSky-utilities/GasSuit-config.lua b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/FrSky GaSuite.lua similarity index 95% rename from radio/sdcard/FrSky-utilities/GasSuit-config.lua rename to radio/sdcard/taranis-x7/SCRIPTS/TOOLS/FrSky GaSuite.lua index 9fb219667..df7fce8ce 100755 --- a/radio/sdcard/FrSky-utilities/GasSuit-config.lua +++ b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/FrSky GaSuite.lua @@ -322,9 +322,9 @@ end -- Main1 local function runFieldsPage(event) - if event == EVT_EXIT_BREAK then + if event == EVT_VIRTUAL_EXIT then return 2 - elseif event == EVT_ENTER_BREAK or event == EVT_ROT_BREAK then + elseif event == EVT_VIRTUAL_ENTER then if fields[current][4] ~= nil then edit = not edit if edit == false then @@ -332,15 +332,15 @@ local function runFieldsPage(event) end end elseif edit then - if event == EVT_PLUS_FIRST or event == EVT_ROT_RIGHT or event == EVT_PLUS_REPT or event == EVT_RIGHT_FIRST then + if event == EVT_VIRTUAL_NEXT or event == EVT_VIRTUAL_NEXT_REPT then addField(1) - elseif event == EVT_MINUS_FIRST or event == EVT_ROT_LEFT or event == EVT_MINUS_REPT or event == EVT_LEFT_FIRST then + elseif event == EVT_VIRTUAL_PREVIOUS or event == EVT_VIRTUAL_PREVIOUS_REPT then addField(-1) end else - if event == EVT_MINUS_FIRST or event == EVT_ROT_RIGHT or event == EVT_DOWN_FIRST then + if event == EVT_VIRTUAL_NEXT then selectField(1) - elseif event == EVT_PLUS_FIRST or event == EVT_ROT_LEFT or event == EVT_UP_FIRST then + elseif event == EVT_VIRTUAL_PREVIOUS then selectField(-1) end end @@ -498,9 +498,9 @@ local function run(event) if event == nil then error("Cannot be run as a sensor script!") return 2 - elseif event == EVT_PAGE_BREAK or event == EVT_PAGEDN_FIRST or event == EVT_SHIFT_BREAK then + elseif event == EVT_VIRTUAL_NEXT_PAGE then selectPage(1) - elseif event == EVT_PAGE_LONG or event == EVT_PAGEUP_FIRST or event == EVT_SHIFT_LONG then + elseif event == EVT_VIRTUAL_PREVIOUS_PAGE then killEvents(event); selectPage(-1) end diff --git a/radio/sdcard/FrSky-utilities/FrSky SBEC.lua b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/FrSky SBEC.lua similarity index 93% rename from radio/sdcard/FrSky-utilities/FrSky SBEC.lua rename to radio/sdcard/taranis-x7/SCRIPTS/TOOLS/FrSky SBEC.lua index e09e97e69..1b82bc47f 100644 --- a/radio/sdcard/FrSky-utilities/FrSky SBEC.lua +++ b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/FrSky SBEC.lua @@ -1,4 +1,3 @@ - ---- ######################################################################### ---- # # ---- # Copyright (C) OpenTX # @@ -211,10 +210,10 @@ end -- Main1 local function runFieldsPage(event) - if event == EVT_EXIT_BREAK then + if event == EVT_VIRTUAL_EXIT then telemetryUnIdle(0x80) return 2 - elseif event == EVT_ENTER_BREAK or event == EVT_ROT_BREAK then + elseif event == EVT_VIRTUAL_ENTER then if fields[current][4] ~= nil then edit = not edit if edit == false then @@ -222,15 +221,15 @@ local function runFieldsPage(event) end end elseif edit then - if event == EVT_PLUS_FIRST or event == EVT_ROT_RIGHT or event == EVT_PLUS_REPT or event == EVT_RIGHT_FIRST then + if event == EVT_VIRTUAL_NEXT or event == EVT_VIRTUAL_NEXT_REPT then addField(1) - elseif event == EVT_MINUS_FIRST or event == EVT_ROT_LEFT or event == EVT_MINUS_REPT or event == EVT_LEFT_FIRST then + elseif event == EVT_VIRTUAL_PREVIOUS or event == EVT_VIRTUAL_PREVIOUS_REPT then addField(-1) end else - if event == EVT_MINUS_FIRST or event == EVT_ROT_RIGHT or event == EVT_DOWN_FIRST then + if event == EVT_VIRTUAL_NEXT then selectField(1) - elseif event == EVT_PLUS_FIRST or event == EVT_ROT_LEFT or event == EVT_UP_FIRST then + elseif event == EVT_VIRTUAL_PREVIOUS then selectField(-1) end end diff --git a/radio/sdcard/FrSky-utilities/SxR-config.lua b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/FrSky SxR.lua similarity index 94% rename from radio/sdcard/FrSky-utilities/SxR-config.lua rename to radio/sdcard/taranis-x7/SCRIPTS/TOOLS/FrSky SxR.lua index bfced2ef3..c49b78f52 100755 --- a/radio/sdcard/FrSky-utilities/SxR-config.lua +++ b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/FrSky SxR.lua @@ -258,9 +258,9 @@ end -- Main local function runFieldsPage(event) - if event == EVT_EXIT_BREAK then -- exit script + if event == EVT_VIRTUAL_EXIT then -- exit script return 2 - elseif event == EVT_ENTER_BREAK or event == EVT_ROT_BREAK then -- toggle editing/selecting current field + elseif event == EVT_VIRTUAL_ENTER then -- toggle editing/selecting current field if fields[current][4] ~= nil then edit = not edit if edit == false then @@ -268,15 +268,15 @@ local function runFieldsPage(event) end end elseif edit then - if event == EVT_PLUS_FIRST or event == EVT_ROT_RIGHT or event == EVT_PLUS_REPT then + if event == EVT_VIRTUAL_NEXT or event == EVT_VIRTUAL_NEXT_REPT then addField(1) - elseif event == EVT_MINUS_FIRST or event == EVT_ROT_LEFT or event == EVT_MINUS_REPT then + elseif event == EVT_VIRTUAL_PREVIOUS or event == EVT_VIRTUAL_PREVIOUS_REPT then addField(-1) end else - if event == EVT_MINUS_FIRST or event == EVT_ROT_RIGHT then + if event == EVT_VIRTUAL_NEXT then selectField(1) - elseif event == EVT_PLUS_FIRST or event == EVT_ROT_LEFT then + elseif event == EVT_VIRTUAL_PREVIOUS then selectField(-1) end end @@ -302,7 +302,7 @@ local function runConfigPage(event) if wingBitmaps[1 + fields[1][4]] == nil then wingBitmaps[1 + fields[1][4]] = Bitmap.open(wingBitmapsFile[1 + fields[1][4]]) end - lcd.drawBitmap(wingBitmapsFile[1 + fields[1][4]], 10, 90) + lcd.drawBitmap(wingBitmaps[1 + fields[1][4]], 10, 90) else lcd.drawPixmap(20, 28, wingBitmapsFile[1 + fields[1][4]]) end @@ -346,9 +346,9 @@ local function run(event) if event == nil then error("Cannot be run as a model script!") return 2 - elseif event == EVT_PAGE_BREAK or event == EVT_PAGEDN_FIRST then + elseif event == EVT_VIRTUAL_NEXT_PAGE then selectPage(1) - elseif event == EVT_PAGE_LONG or event == EVT_PAGEUP_FIRST then + elseif event == EVT_VIRTUAL_PREVIOUS_PAGE then killEvents(event); selectPage(-1) end diff --git a/radio/sdcard/taranis-x9/SxR/bmp/back.bmp b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/bmp/back.bmp similarity index 100% rename from radio/sdcard/taranis-x9/SxR/bmp/back.bmp rename to radio/sdcard/taranis-x7/SCRIPTS/TOOLS/bmp/back.bmp diff --git a/radio/sdcard/taranis-x9/SxR/bmp/delta.bmp b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/bmp/delta.bmp similarity index 100% rename from radio/sdcard/taranis-x9/SxR/bmp/delta.bmp rename to radio/sdcard/taranis-x7/SCRIPTS/TOOLS/bmp/delta.bmp diff --git a/radio/sdcard/taranis-x9/SxR/bmp/done.bmp b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/bmp/done.bmp similarity index 100% rename from radio/sdcard/taranis-x9/SxR/bmp/done.bmp rename to radio/sdcard/taranis-x7/SCRIPTS/TOOLS/bmp/done.bmp diff --git a/radio/sdcard/taranis-x9/SxR/bmp/down.bmp b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/bmp/down.bmp similarity index 100% rename from radio/sdcard/taranis-x9/SxR/bmp/down.bmp rename to radio/sdcard/taranis-x7/SCRIPTS/TOOLS/bmp/down.bmp diff --git a/radio/sdcard/taranis-x9/SxR/bmp/forward.bmp b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/bmp/forward.bmp similarity index 100% rename from radio/sdcard/taranis-x9/SxR/bmp/forward.bmp rename to radio/sdcard/taranis-x7/SCRIPTS/TOOLS/bmp/forward.bmp diff --git a/radio/sdcard/taranis-x9/SxR/bmp/horz-r.bmp b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/bmp/horz-r.bmp similarity index 100% rename from radio/sdcard/taranis-x9/SxR/bmp/horz-r.bmp rename to radio/sdcard/taranis-x7/SCRIPTS/TOOLS/bmp/horz-r.bmp diff --git a/radio/sdcard/taranis-x9/SxR/bmp/horz.bmp b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/bmp/horz.bmp similarity index 100% rename from radio/sdcard/taranis-x9/SxR/bmp/horz.bmp rename to radio/sdcard/taranis-x7/SCRIPTS/TOOLS/bmp/horz.bmp diff --git a/radio/sdcard/taranis-x9/SxR/bmp/left.bmp b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/bmp/left.bmp similarity index 100% rename from radio/sdcard/taranis-x9/SxR/bmp/left.bmp rename to radio/sdcard/taranis-x7/SCRIPTS/TOOLS/bmp/left.bmp diff --git a/radio/sdcard/taranis-x9/SxR/bmp/plane.bmp b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/bmp/plane.bmp similarity index 100% rename from radio/sdcard/taranis-x9/SxR/bmp/plane.bmp rename to radio/sdcard/taranis-x7/SCRIPTS/TOOLS/bmp/plane.bmp diff --git a/radio/sdcard/taranis-x9/SxR/bmp/right.bmp b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/bmp/right.bmp similarity index 100% rename from radio/sdcard/taranis-x9/SxR/bmp/right.bmp rename to radio/sdcard/taranis-x7/SCRIPTS/TOOLS/bmp/right.bmp diff --git a/radio/sdcard/taranis-x9/SxR/bmp/up.bmp b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/bmp/up.bmp similarity index 100% rename from radio/sdcard/taranis-x9/SxR/bmp/up.bmp rename to radio/sdcard/taranis-x7/SCRIPTS/TOOLS/bmp/up.bmp diff --git a/radio/sdcard/taranis-x9/SxR/bmp/vert-r.bmp b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/bmp/vert-r.bmp similarity index 100% rename from radio/sdcard/taranis-x9/SxR/bmp/vert-r.bmp rename to radio/sdcard/taranis-x7/SCRIPTS/TOOLS/bmp/vert-r.bmp diff --git a/radio/sdcard/taranis-x9/SxR/bmp/vert.bmp b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/bmp/vert.bmp similarity index 100% rename from radio/sdcard/taranis-x9/SxR/bmp/vert.bmp rename to radio/sdcard/taranis-x7/SCRIPTS/TOOLS/bmp/vert.bmp diff --git a/radio/sdcard/taranis-x9/SxR/bmp/vtail.bmp b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/bmp/vtail.bmp similarity index 100% rename from radio/sdcard/taranis-x9/SxR/bmp/vtail.bmp rename to radio/sdcard/taranis-x7/SCRIPTS/TOOLS/bmp/vtail.bmp diff --git a/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/img/back.png b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/img/back.png new file mode 100755 index 000000000..2cf3cd699 Binary files /dev/null and b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/img/back.png differ diff --git a/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/img/delta_b.png b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/img/delta_b.png new file mode 100755 index 000000000..80c0302f9 Binary files /dev/null and b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/img/delta_b.png differ diff --git a/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/img/done.bmp b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/img/done.bmp new file mode 100755 index 000000000..9ac501398 Binary files /dev/null and b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/img/done.bmp differ diff --git a/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/img/down.png b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/img/down.png new file mode 100755 index 000000000..8eac8039a Binary files /dev/null and b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/img/down.png differ diff --git a/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/img/forward.png b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/img/forward.png new file mode 100755 index 000000000..de09680b7 Binary files /dev/null and b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/img/forward.png differ diff --git a/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/img/left.png b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/img/left.png new file mode 100755 index 000000000..658c9916b Binary files /dev/null and b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/img/left.png differ diff --git a/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/img/plane_b.png b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/img/plane_b.png new file mode 100755 index 000000000..37abedc3a Binary files /dev/null and b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/img/plane_b.png differ diff --git a/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/img/planev_b.png b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/img/planev_b.png new file mode 100755 index 000000000..4e33f660b Binary files /dev/null and b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/img/planev_b.png differ diff --git a/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/img/planev_s.png b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/img/planev_s.png new file mode 100755 index 000000000..48283a290 Binary files /dev/null and b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/img/planev_s.png differ diff --git a/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/img/right.png b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/img/right.png new file mode 100755 index 000000000..01d555394 Binary files /dev/null and b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/img/right.png differ diff --git a/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/img/up.png b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/img/up.png new file mode 100755 index 000000000..f033aba55 Binary files /dev/null and b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/img/up.png differ diff --git a/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/img/vert-r.png b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/img/vert-r.png new file mode 100755 index 000000000..7bfc9450c Binary files /dev/null and b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/img/vert-r.png differ diff --git a/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/img/vert.png b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/img/vert.png new file mode 100755 index 000000000..de09680b7 Binary files /dev/null and b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/img/vert.png differ diff --git a/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/readme.txt b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/readme.txt new file mode 100644 index 000000000..20b95c415 --- /dev/null +++ b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/readme.txt @@ -0,0 +1 @@ +Scripts that need to be available in TOOLS menu should be in this directory diff --git a/radio/sdcard/taranis-x7/SxR/SxR_Calibrate.lua b/radio/sdcard/taranis-x7/SxR Calibrate/SxR_Calibrate.lua similarity index 100% rename from radio/sdcard/taranis-x7/SxR/SxR_Calibrate.lua rename to radio/sdcard/taranis-x7/SxR Calibrate/SxR_Calibrate.lua diff --git a/radio/sdcard/taranis-x7/SxR/SxR.lua b/radio/sdcard/taranis-x7/SxR/SxR.lua deleted file mode 100644 index ba0e94272..000000000 --- a/radio/sdcard/taranis-x7/SxR/SxR.lua +++ /dev/null @@ -1,278 +0,0 @@ ----- ######################################################################### ----- # # ----- # Copyright (C) OpenTX # ------# # ----- # License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html # ----- # # ----- # This program is free software; you can redistribute it and/or modify # ----- # it under the terms of the GNU General Public License version 2 as # ----- # published by the Free Software Foundation. # ----- # # ----- # This program is distributed in the hope that it will be useful # ----- # but WITHOUT ANY WARRANTY; without even the implied warranty of # ----- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # ----- # GNU General Public License for more details. # ----- # # ----- ######################################################################### -local VALUE = 0 -local COMBO = 1 - -local edit = false -local page = 1 -local current = 1 -local refreshState = 0 -local refreshIndex = 0 -local pageOffset = 0 -local pages = {} -local fields = {} -local modifications = {} - -local configFields = { - {"Wing type", COMBO, 0x80, nil, { "Normal", "Delta", "VTail" } }, - {"Mounting type", COMBO, 0x81, nil, { "Horz", "Horz rev.", "Vert", "Vert rev." } }, -} - -local settingsFields = { - {"SxR functions", COMBO, 0x9C, nil, { "Disable", "Enable" } }, - {"Quick Mode:", COMBO, 0xAA, nil, { "Disable", "Enable" } }, - {"CH5 mode", COMBO, 0xA8, nil, { "AIL2", "AUX1" } }, - {"CH6 mode", COMBO, 0xA9, nil, { "ELE2", "AUX2" } }, - {"AIL direction", COMBO, 0x82, nil, { "Normal", "Invers" }, { 255, 0 } }, - {"ELE direction", COMBO, 0x83, nil, { "Normal", "Invers" }, { 255, 0 } }, - {"RUD direction", COMBO, 0x84, nil, { "Normal", "Invers" }, { 255, 0 } }, - {"AIL2 direction", COMBO, 0x9A, nil, { "Normal", "Invers" }, { 255, 0 } }, - {"ELE2 direction", COMBO, 0x9B, nil, { "Normal", "Invers" }, { 255, 0 } }, - {"AIL stab gain", VALUE, 0x85, nil, 0, 200, "%"}, - {"ELE stab gain", VALUE, 0x86, nil, 0, 200, "%"}, - {"RUD stab gain", VALUE, 0x87, nil, 0, 200, "%"}, - {"AIL autolvl gain", VALUE, 0x88, nil, 0, 200, "%"}, - {"ELE autolvl gain", VALUE, 0x89, nil, 0, 200, "%"}, - {"ELE hover gain", VALUE, 0x8C, nil, 0, 200, "%"}, - {"RUD hover gain", VALUE, 0x8D, nil, 0, 200, "%"}, - {"AIL knife gain", VALUE, 0x8E, nil, 0, 200, "%"}, - {"RUD knife gain", VALUE, 0x90, nil, 0, 200, "%"}, - {"AIL autolvl offset", VALUE, 0x91, nil, -20, 20, "%", 0x6C}, - {"ELE autolvl offset", VALUE, 0x92, nil, -20, 20, "%", 0x6C}, - {"ELE hover offset", VALUE, 0x95, nil, -20, 20, "%", 0x6C}, - {"RUD hover offset", VALUE, 0x96, nil, -20, 20, "%", 0x6C}, - {"AIL knife offset", VALUE, 0x97, nil, -20, 20, "%", 0x6C}, - {"RUD knife offset", VALUE, 0x99, nil, -20, 20, "%", 0x6C}, -} - --- Change display attribute to current field -local function addField(step) - local field = fields[current] - local min, max - if field[2] == VALUE then - min = field[5] - max = field[6] - elseif field[2] == COMBO then - min = 0 - max = #(field[5]) - 1 - end - if (step < 0 and field[4] > min) or (step > 0 and field[4] < max) then - field[4] = field[4] + step - end -end - --- Select the next or previous page -local function selectPage(step) - page = 1 + ((page + step - 1 + #pages) % #pages) - refreshIndex = 0 - pageOffset = 0 -end - --- Select the next or previous editable field -local function selectField(step) - current = 1 + ((current + step - 1 + #fields) % #fields) - if current > 7 + pageOffset then - pageOffset = current - 7 - elseif current <= pageOffset then - pageOffset = current - 1 - end -end - -local function drawProgressBar() - local width = (70 * refreshIndex) / #fields - lcd.drawRectangle(30, 1, 70, 6) - lcd.drawFilledRectangle(32, 3, width, 2); -end - --- Redraw the current page -local function redrawFieldsPage() - lcd.clear() - lcd.drawScreenTitle("SxR", page, #pages) - - if refreshIndex < #fields then - drawProgressBar() - end - - for index = 1, 7, 1 do - local field = fields[pageOffset+index] - if field == nil then - break - end - - local attr = current == (pageOffset+index) and ((edit == true and BLINK or 0) + INVERS) or 0 - - lcd.drawText(0, 1+8*index, field[1]) - - if field[4] == nil then - lcd.drawText(LCD_W, 1+8*index, "---", attr + RIGHT) - else - if field[2] == VALUE then - lcd.drawNumber(LCD_W, 1+8*index, field[4], attr + RIGHT) - elseif field[2] == COMBO then - if field[4] >= 0 and field[4] < #(field[5]) then - lcd.drawText(LCD_W, 1+8*index, field[5][1+field[4]], attr + RIGHT) - end - end - end - end -end - -local function telemetryRead(field) - return sportTelemetryPush(0x17, 0x30, 0x0C30, field) -end - -local function telemetryWrite(field, value) - return sportTelemetryPush(0x17, 0x31, 0x0C30, field + value*256) -end - -local telemetryPopTimeout = 0 -local function refreshNext() - if refreshState == 0 then - if #modifications > 0 then - telemetryWrite(modifications[1][1], modifications[1][2]) - modifications[1] = nil - elseif refreshIndex < #fields then - local field = fields[refreshIndex + 1] - if telemetryRead(field[3]) == true then - refreshState = 1 - telemetryPopTimeout = getTime() + 120 -- normal delay is 500ms - end - end - elseif refreshState == 1 then - local physicalId, primId, dataId, value = sportTelemetryPop() - if physicalId == 0x1A and primId == 0x32 and dataId == 0x0C30 then - local fieldId = value % 256 - local field = fields[refreshIndex + 1] - if fieldId == field[3] then - local value = math.floor(value / 256) - if field[3] == 0xAA then - value = bit32.band(value, 0x0001) - end - if field[3] >= 0x9E and field[3] <= 0xA0 then - local b1 = value % 256 - local b2 = math.floor(value / 256) - value = b1*256 + b2 - value = value - bit32.band(value, 0x8000) * 2 - end - if field[2] == COMBO and #field == 6 then - for index = 1, #(field[6]), 1 do - if value == field[6][index] then - value = index - 1 - break - end - end - elseif field[2] == VALUE and #field == 8 then - value = value - field[8] + field[5] - end - fields[refreshIndex + 1][4] = value - refreshIndex = refreshIndex + 1 - refreshState = 0 - end - elseif getTime() > telemetryPopTimeout then - fields[refreshIndex + 1][4] = nil - refreshIndex = refreshIndex + 1 - refreshState = 0 - end - end -end - -local function updateField(field) - local value = field[4] - if field[2] == COMBO and #field == 6 then - value = field[6][1+value] - elseif field[2] == VALUE and #field == 8 then - value = value + field[8] - field[5] - end - modifications[#modifications+1] = { field[3], value } -end - --- Main -local function runFieldsPage(event) - if event == EVT_EXIT_BREAK then -- exit script - return 2 - elseif event == EVT_ENTER_BREAK then -- toggle editing/selecting current field - if fields[current][4] ~= nil then - edit = not edit - if edit == false then - updateField(fields[current]) - end - end - elseif edit then - if event == EVT_PLUS_FIRST or event == EVT_ROT_RIGHT or event == EVT_PLUS_REPT or event == EVT_RIGHT_BREAK then - addField(1) - elseif event == EVT_MINUS_FIRST or event == EVT_ROT_LEFT or event == EVT_MINUS_REPT or event == EVT_LEFT_BREAK then - addField(-1) - end - else - if event == EVT_MINUS_FIRST or event == EVT_ROT_RIGHT or event == EVT_DOWN_BREAK then - selectField(1) - elseif event == EVT_PLUS_FIRST or event == EVT_ROT_LEFT or event == EVT_UP_BREAK then - selectField(-1) - end - end - redrawFieldsPage() - return 0 -end - -local mountText = { "Label is facing the sky", "Label is facing ground", "Label is left when", "Label is right when" } - -local function runConfigPage(event) - fields = configFields - local result = runFieldsPage(event) - if fields[2][4] ~= nil then - lcd.drawText(1, 30, "Pins toward tail") - lcd.drawText(1, 40, mountText[1 + fields[2][4]]) - if fields[2][4] > 1 then - lcd.drawText(1, 50, "looking from the tail") - end - end - return result -end - -local function runSettingsPage(event) - fields = settingsFields - return runFieldsPage(event) -end - --- Init -local function init() - current, edit, refreshState, refreshIndex = 1, false, 0, 0 - pages = { - runConfigPage, - runSettingsPage, - } -end - --- Main -local function run(event) - if event == nil then - error("Cannot be run as a model script!") - return 2 - elseif event == EVT_PAGE_BREAK or (edit == false and event==EVT_RIGHT_BREAK) then - selectPage(1) - elseif event == EVT_PAGE_LONG or (edit == false and event==EVT_LEFT_BREAK) then - killEvents(event); - selectPage(-1) - end - - local result = pages[page](event) - refreshNext() - - return result -end - -return { init=init, run=run } diff --git a/radio/sdcard/taranis-x9/CROSSFIRE/crossfire.lua b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/CROSSFIRE/crossfire.lua similarity index 92% rename from radio/sdcard/taranis-x9/CROSSFIRE/crossfire.lua rename to radio/sdcard/taranis-x9/SCRIPTS/TOOLS/CROSSFIRE/crossfire.lua index 452512621..f68c4db3d 100644 --- a/radio/sdcard/taranis-x9/CROSSFIRE/crossfire.lua +++ b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/CROSSFIRE/crossfire.lua @@ -1,3 +1,4 @@ +local toolName = "TNS|Crossfire setup|TNE" ---- ######################################################################### ---- # # ---- # Copyright (C) OpenTX # @@ -85,11 +86,11 @@ local function run(event) if event == nil then error("Cannot be run as a model script!") return 2 - elseif event == EVT_EXIT_BREAK then + elseif event == EVT_VIRTUAL_EXIT then return 2 - elseif event == EVT_PLUS_FIRST or event == EVT_PLUS_REPT or event == EVT_ROT_RIGHT then + elseif event == EVT_VIRTUAL_NEXT then selectDevice(1) - elseif event == EVT_MINUS_FIRST or event == EVT_MINUS_REPT or event == EVT_ROT_LEFT then + elseif event == EVT_VIRTUAL_PREVIOUS then selectDevice(-1) end @@ -100,7 +101,7 @@ local function run(event) else for i=1, #devices do local attr = (lineIndex == i and INVERS or 0) - if event == EVT_ENTER_BREAK and attr == INVERS then + if event == EVT_VIRTUAL_ENTER and attr == INVERS then crossfireTelemetryPush(0x28, { devices[i].id, 0xEA }) return "device.lua" end diff --git a/radio/sdcard/taranis-x9/CROSSFIRE/device.lua b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/CROSSFIRE/device.lua similarity index 96% rename from radio/sdcard/taranis-x9/CROSSFIRE/device.lua rename to radio/sdcard/taranis-x9/SCRIPTS/TOOLS/CROSSFIRE/device.lua index 2a1d8b7b8..ee3f87958 100644 --- a/radio/sdcard/taranis-x9/CROSSFIRE/device.lua +++ b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/CROSSFIRE/device.lua @@ -419,7 +419,7 @@ end -- Main local function runDevicePage(event) - if event == EVT_EXIT_BREAK then -- exit script + if event == EVT_VIRTUAL_EXIT then -- exit script if edit == true then edit = false local field = getField(lineIndex) @@ -430,7 +430,7 @@ local function runDevicePage(event) else return "crossfire.lua" end - elseif event == EVT_ENTER_BREAK then -- toggle editing/selecting current field + elseif event == EVT_VIRTUAL_ENTER then -- toggle editing/selecting current field local field = getField(lineIndex) if field.name then if field.type == 10 then @@ -451,15 +451,15 @@ local function runDevicePage(event) end end elseif edit then - if event == EVT_PLUS_FIRST or event == EVT_PLUS_REPT or event == EVT_ROT_LEFT then + if event == EVT_VIRTUAL_NEXT or event == EVT_VIRTUAL_NEXT_REPT then incrField(1) - elseif event == EVT_MINUS_FIRST or event == EVT_MINUS_REPT or event == EVT_ROT_RIGHT then + elseif event == EVT_VIRTUAL_PREVIOUS or event == EVT_VIRTUAL_PREVIOUS_REPT then incrField(-1) end else - if event == EVT_MINUS_FIRST or event == EVT_ROT_RIGHT then + if event == EVT_VIRTUAL_NEXT then selectField(1) - elseif event == EVT_PLUS_FIRST or event == EVT_ROT_LEFT then + elseif event == EVT_VIRTUAL_PREVIOUS then selectField(-1) end end diff --git a/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/FrSky GaSuite.lua b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/FrSky GaSuite.lua new file mode 100755 index 000000000..df7fce8ce --- /dev/null +++ b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/FrSky GaSuite.lua @@ -0,0 +1,515 @@ + +---- ######################################################################### +---- # # +---- # Copyright (C) OpenTX # +-----# # +---- # License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html # +---- # # +---- # This program is free software; you can redistribute it and/or modify # +---- # it under the terms of the GNU General Public License version 2 as # +---- # published by the Free Software Foundation. # +---- # # +---- # This program is distributed in the hope that it will be useful # +---- # but WITHOUT ANY WARRANTY; without even the implied warranty of # +---- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # +---- # GNU General Public License for more details. # +---- # # +---- ######################################################################### + +local version = "v1.1" + +local VALUE = 0 +local COMBO = 1 +local FLPOI = 2 + + +local edit = false +local page = 1 +local current = 1 --row +local refreshState = 0 +local refreshIndex = 0 +local refreshIndex3 = 0 +local pageOffset = 0 +local pages = {} +local fields = {} +local modifications = {} +local thistime = getTime() +local lastTime = thistime +local margin = 1 +local spacing = 8 +local configFields = {} +local counter = 0 +local appId = 0 + +local function drawScreenTitle(title,page, pages) + if math.fmod(math.floor(getTime()/100),10) == 0 then + title = version + end + if LCD_W == 480 then + lcd.drawFilledRectangle(0, 0, LCD_W, 30, TITLE_BGCOLOR) + lcd.drawText(1, 5, title, MENU_TITLE_COLOR) + lcd.drawText(LCD_W-40, 5, page.."/"..pages, MENU_TITLE_COLOR) + else + lcd.drawScreenTitle(title, page, pages) + end +end + +local interfaceconfig = { + {"Sensor group select", VALUE, appId, nil, 0, 15}, +} + +local settingsFields = { + {"Software version", FLPOT, 0x0c, nil, 1, 100 }, + {"Physical ID", VALUE, 0x01, nil, 0, 26 }, + {"Application IDgroup", VALUE, 0x0D, nil, 0, 15 }, + {"Data rate(*100ms)", VALUE, 0x22, nil, 1, 255 }, +} + +local telemetryFields = { + {"TEMP1(C/F)", VALUE, 0x90, nil, -30, 600}, + {"TEMP2(C/F)", VALUE, 0x91, nil, -30, 600}, + {"SPEED(r/min)", VALUE, 0x92, nil, 0, 100000}, + {"Residual Volume(mL)", VALUE, 0x93, nil, 0, 60000}, + {"Residual Percent(%)", VALUE, 0x94, nil, 0, 100}, + {"FLOW(mL/min)", VALUE, 0x95, nil, 0, 2000}, + {"Max Flow(mL/min)", VALUE, 0x96, nil, 0, 2000}, + {"Avg Flow(mL/min)", VALUE, 0x97, nil, 0, 2000}, +} + +-- Change display attribute to current field +local function addField(step) + local field = fields[current] + local min, max + if field[2] == VALUE then + min = field[5] + max = field[6] + elseif field[2] == COMBO then + min = 0 + max = #(field[5]) - 1 + end + if field[2] ~= FLPOT then --only read ? + if field[2] == VALUE and field[6] > 256 then + if field[4] > 1000 then + step = step * 50 + field[4] = math.floor(field[4]/50) + field[4] = field[4] *50 + elseif field[4] > 500 then + step = step * 20 + field[4] = math.floor(field[4]/20) + field[4] = field[4] *20 + elseif field[4] > 200 then + step = step * 10 + field[4] = math.floor(field[4]/10) + field[4] = field[4] *10 + else + step = step * 1 + field[4] = math.floor(field[4]/1) + field[4] = field[4] *1 + end + end + if (step < 0 and field[4] > min) or (step > 0 and field[4] < max) then + field[4] = field[4] + step + end + else + field[4] = field[4] + end +end + +-- Select the next or previous page +local function selectPage(step) + page = 1 + ((page + step - 1 + #pages) % #pages) + refreshIndex = 0 + pageOffset = 0 +end + +-- Select the next or previous editable field +local function selectField(step) + current = current + step + if current > #fields then + current = #fields + elseif current < 1 then + current = 1 + end + if current > 7 + pageOffset then + pageOffset = current - 7 + elseif current <= pageOffset then + pageOffset = current - 1 + end +end + +local function drawProgressBar() + if LCD_W == 480 then + local width = (300 * refreshIndex) / #fields + lcd.drawRectangle(100, 10, 300, 6) + lcd.drawFilledRectangle(102, 13, width, 2); + else + local width = (60 * refreshIndex) / #fields + lcd.drawRectangle(45, 1, 60, 6) + lcd.drawFilledRectangle(47, 3, width, 2); + end +end + +-- Redraw the current page +local function redrawFieldsPage() + lcd.clear() + drawScreenTitle("GasSuit", page, #pages) + if refreshIndex < #fields then + drawProgressBar() + end + for index = 1, 7, 1 do + local field = fields[pageOffset+index] + if field == nil then + break + end + local attr = current == (pageOffset+index) and ((edit == true and BLINK or 0) + INVERS) or 0 + lcd.drawText(1, margin+ spacing * index, field[1]) + if field[4] == nil then + lcd.drawText(LCD_W, margin+ spacing * index, "---", attr + RIGHT) + else + if field[2] == VALUE then + if (field[3] == 0x90 or field[3] == 0x91) and field[4] == 500 then + lcd.drawText(LCD_W, margin+ spacing * index, "---", attr + RIGHT) + else + + lcd.drawNumber(LCD_W, margin+ spacing * index, field[4] , attr + RIGHT) + end + elseif field[2] == COMBO then + if field[4] >= 0 and field[4] < #(field[5]) then + lcd.drawText(LCD_W, margin+ spacing * index, field[5][1+field[4]], attr + RIGHT) + end + elseif field[2] == FLPOT then + lcd.drawText(LCD_W, margin+ spacing * index, field[4], attr + RIGHT) + end + end + end +end + +local function telemetryRead(fieldx) + return sportTelemetryPush(0x1b, 0x30, appId, fieldx) +end + +local function telemetryListen(fieldx) + return sportTelemetryPush(0x1b, 0, 0, 0) +end + +local function telemetryWrite(fieldx, valuex) + return sportTelemetryPush(0x1b, 0x31, appId, fieldx + valuex*256) +end + +local telemetryPopTimeout = 0 +local function refreshNext() + if refreshState == 0 and page ~= 3 then -- + if #modifications > 0 then -- + if modifications[1][1] ~= 0x0c then + if modifications[1][1] == 0x22 then + modifications[1][2] = modifications[1][2] + 0xf00 + end + local modificationstmp = modifications[1][2] + if modifications[1][1] == 0x8a or modifications[1][1] == 0x8b then + if configFields[11][4]== 1 then + modificationstmp = (modifications[1][2] - 32)*10 + modificationstmp = math.floor(modificationstmp/18) + end + end + telemetryWrite(modifications[1][1], modificationstmp) + refreshIndex = 0 + end + modifications[1] = nil + elseif refreshIndex < #fields then + local field = fields[refreshIndex + 1] + if telemetryRead(field[3]) == true then + refreshState = 1 + telemetryPopTimeout = getTime() + 80 + end + end + elseif refreshState == 0 and page == 3 then + if #modifications > 0 then + if modifications[1][1] == 0x96 or modifications[1][1] == 0x97 or modifications[1][1] == 0x93 then + telemetryWrite(modifications[1][1], 0) + end + modifications[1] = nil + elseif refreshIndex < #fields then + local field = fields[refreshIndex + 1] + if telemetryRead(field[3]) == true then + refreshState = 1 + telemetryPopTimeout = getTime() + 20 + end + elseif refreshIndex >= #fields then + refreshIndex = 0 + refreshState = 0 + end + elseif refreshState == 1 and page ~= 3 then + local physicalId, primId, dataId, value = sportTelemetryPop() + if primId == 0x32 and dataId >= 0x0d00 and dataId <= 0x0d7f then + local fieldId = value % 256 + local field = fields[refreshIndex + 1] + if fieldId == field[3] then + local value = math.floor(value / 256) + if field[2] == COMBO then + for index = 1, #(field[6]), 1 do + if value == field[6][index] then + value = index - 1 + break + end + end + elseif field[2] == VALUE then + value = value -- - field[8] + field[5] + end + if field[1] == "Software version" then + local flo_string = string.char(value/16%16 + 48).."."..string.char(value%16 + 48) + fields[refreshIndex + 1][4] = flo_string + else + fields[refreshIndex + 1][4] = value + end + refreshIndex = refreshIndex + 1 + refreshState = 0 + end + elseif getTime() > telemetryPopTimeout then + refreshState = 0 + end + elseif refreshState == 1 and page == 3 then + local pageID3 = 0 + local physicalId3, primId3, dataId3, value3 = sportTelemetryPop() + if value3 ~= nil then + pageID3 = value3 % 256 + value3 = math.floor(value3 / 0x100) + end + if primId3 == 0x32 and value3 ~= nil then + if pageID3 == fields[refreshIndex + 1][3] then + local field = fields[refreshIndex + 1] + if field[2] == COMBO and #field == 6 then + for index = 1, #(field[6]), 1 do + if value3 == field[6][index] then + value3 = index - 1 + break + end + end + elseif field[2] == VALUE then + if field[3] == 0x90 or field[3] == 0x91 then + value3 = math.floor(value3 % 0x10000) + if value3 > 0xf000 then + value3 = value3 - 0x10000 + end + if configFields[11][4]== 1 and (field[3] == 0x90 or field[3] == 0x91) then + value3 =(value3*18) + value3 = math.floor(value3/10)+32 + end + else + value3 = value3 + end + end + fields[refreshIndex + 1][4] = value3 + refreshIndex = refreshIndex + 1 + refreshState = 0 + end + elseif getTime() > telemetryPopTimeout then + refreshState = 0 + end + end +end + +local function updateField(field) + local value = field[4] + if field[2] == COMBO and #field == 6 then + value = field[6][1+value] + elseif field[2] == VALUE and #field == 6 then + value = value -- + field[8] - field[5] + elseif field[2] == FLPOT then + value = 0 + end + modifications[#modifications+1] = {field[3], value} +end + +-- Main1 +local function runFieldsPage(event) + if event == EVT_VIRTUAL_EXIT then + return 2 + elseif event == EVT_VIRTUAL_ENTER then + if fields[current][4] ~= nil then + edit = not edit + if edit == false then + updateField(fields[current]) + end + end + elseif edit then + if event == EVT_VIRTUAL_NEXT or event == EVT_VIRTUAL_NEXT_REPT then + addField(1) + elseif event == EVT_VIRTUAL_PREVIOUS or event == EVT_VIRTUAL_PREVIOUS_REPT then + addField(-1) + end + else + if event == EVT_VIRTUAL_NEXT then + selectField(1) + elseif event == EVT_VIRTUAL_PREVIOUS then + selectField(-1) + end + end + redrawFieldsPage() + return 0 +end + +local function runConfigPage(event) + fields = configFields + local result = runFieldsPage(event) + return result +end + +local function runSettingsPage(event) + fields = settingsFields + return runFieldsPage(event) +end + +local function runTelemetryPage(event) + fields = telemetryFields + return runFieldsPage(event) +end + +-- Init +local function init() + current, edit, refreshState, refreshIndex = 1, false, 0, 0 + if LCD_W == 480 then + margin = 10 + spacing = 20 + end + if LCD_W == 128 then + configFields = { + {"CDI off speed limit", VALUE, 0x81, nil, 10,10000}, -- 1 + {"Milliliter per pulse", VALUE, 0x80, nil, 1, 2000}, -- 2 + {"Volume", VALUE, 0x83, nil, 10,60000}, -- 3 + -- {"Flow trigger", VALUE, 0x84, nil, 5, 50 }, + -- {"Flow Reset", COMBO, 0x85, nil, { "ON", "OFF" }, {1 , 0}}, + {"Auto Reset", COMBO, 0x8d, nil, { "ON", "OFF" }, {0 , 1}}, -- 4 + {"Reset settings", COMBO, 0x86, nil,{ "YES", "NO" }, {1 , 0} }, -- 5 + {"Volume alarm(%)", VALUE, 0x87, nil, 0, 90 }, -- 6 + {"Max.Flow alarm", VALUE, 0x88, nil, 0, 2000 }, -- 7 + {"Over speed alarm", VALUE, 0x89, nil, 0, 10000 }, -- 8 + {"Over temp1 alarm", VALUE, 0x8a, nil, 0, 600 }, -- 9 + {"Over temp2 alarm", VALUE, 0x8b, nil, 0, 600 }, -- 10 + {"Temperature C/F", COMBO, 0x8c, nil,{ "C", "F" }, {0 , 1} }, -- 11 + } + else + configFields = { + {"CDI off speed limit(*100RPM)", VALUE, 0x81, nil, 10,10000}, + {"Milliliter per pulse(*0.001mL/pul)", VALUE, 0x80, nil, 1, 2000}, + {"Volume(mL)", VALUE, 0x83, nil, 10,60000}, + -- {"Flow trigger(mL/min)", VALUE, 0x84, nil, 5, 50 }, + -- {"Flow Reset", COMBO, 0x85, nil, { "ON", "OFF" }, {1 , 0}}, + {"Auto Reset", COMBO, 0x8d, nil, { "ON", "OFF" }, {0 , 1}}, + {"Reset to factory settings", COMBO, 0x86, nil,{ "YES", "NO" }, {1 , 0} }, + {"Volume alarm(%)", VALUE, 0x87, nil, 0, 90 }, + {"Max.Flow alarm(mL/min)", VALUE, 0x88, nil, 0, 2000 }, + {"Over speed alarm(*100RPM)", VALUE, 0x89, nil, 0, 10000 }, + {"Over temperature1 alarm(C/F)", VALUE, 0x8a, nil, 0, 600 }, + {"Over temperature2 alarm(C/F)", VALUE, 0x8b, nil, 0, 600 }, + {"Temperature Celsius/Fahrenheit", COMBO, 0x8c, nil,{ "C", "F" }, {0 , 1} }, + } + end + + pages = { + runConfigPage, + runSettingsPage, + runTelemetryPage, + } + + -- Warning : GaSuite tool requires Temp2 to be connected and discovered for script to work + for index = 1, 40, 1 do + local sensor = model.getSensor(index) + if sensor ~= nil and sensor.id >= 0x0d10 and sensor.id <= 0x0d1f then + appId = sensor.id + break + end + end + + if appId == 0 then + error("No GasSuit sensor in this model!") + end +end + +local function background() + local tonefrq,tonelength,tonepause + thistime = getTime() + lastTime = thistime + refreshNext() + if page == 3 then --alarm + local alarmnum = 0 + if fields[3][4] ~= nil and configFields[9][4] ~= nil then + local speedtest = fields[3][4] + local speedover = configFields[9][4]*100 + if speedtest >= speedover then + tonefrq = 800 + math.max(0,math.floor((speedtest - speedover)/10)) + tonelength = 50 + math.max(0,(150 - math.floor((speedtest - speedover)/10))) + tonepause = tonelength + playTone(tonefrq, tonelength, tonepause, PLAY_BACKGROUND,10) + alarmnum = alarmnum + 1 + end + end + if fields[5][4] ~= nil and configFields[7][4] ~= nil then + local Residualtest = fields[5][4] + local Residualline = configFields[6][4] + if Residualtest < Residualline then + tonefrq = 400 + tonelength = 100 + tonepause = 1000 + math.floor( Residualline - Residualtest )*30 + playTone(tonefrq, tonelength, tonepause, PLAY_BACKGROUND,10) + alarmnum = alarmnum + 1 + end + end + if fields[6][4] ~= nil and configFields[8][4] ~= nil then + local Flowtest = fields[6][4] + local Flowover = configFields[7][4] + if Flowtest > Flowover then + tonefrq = 400 + tonelength = 100 + tonepause = 200 + playTone(tonefrq, tonelength, tonepause, PLAY_BACKGROUND,10) + alarmnum = alarmnum + 1 + end + end + if fields[1][4] ~= nil and configFields[10][4] ~= nil then + local temp1test = fields[1][4] -- + local temp1over = configFields[9][4] + if temp1test > temp1over and (temp1test ~= 500 and temp1test ~= 932) then + tonefrq = 2000 + tonelength = 100 + tonepause = 900 + playTone(tonefrq, tonelength, tonepause, PLAY_BACKGROUND,10) + alarmnum = alarmnum + 1 + end + end + if fields[2][4] ~= nil and configFields[11][4] ~= nil then + local temp2test = fields[2][4] + local temp2over = configFields[10][4] + if temp2test > temp2over and (temp2test ~= 500 and temp2test ~= 932) then + tonefrq = 2000 + tonelength = 300 + tonepause = 700 + playTone(tonefrq, tonelength, tonepause, PLAY_BACKGROUND,10) + alarmnum = alarmnum + 1 + end + end + if alarmnum > 1 then + playTone(2000, 100, 100, PLAY_BACKGROUND,10) + end + alarmnum = 0 + end +end + +local function run(event) + if event == nil then + error("Cannot be run as a sensor script!") + return 2 + elseif event == EVT_VIRTUAL_NEXT_PAGE then + selectPage(1) + elseif event == EVT_VIRTUAL_PREVIOUS_PAGE then + killEvents(event); + selectPage(-1) + end + local result = pages[page](event) + if page ~= 3 then + refreshNext() + end + background() + return result +end + +return { init=init, background=background, run=run } diff --git a/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/FrSky SBEC.lua b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/FrSky SBEC.lua new file mode 100644 index 000000000..1b82bc47f --- /dev/null +++ b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/FrSky SBEC.lua @@ -0,0 +1,289 @@ +---- ######################################################################### +---- # # +---- # Copyright (C) OpenTX # +-----# # +---- # License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html # +---- # # +---- # This program is free software; you can redistribute it and/or modify # +---- # it under the terms of the GNU General Public License version 2 as # +---- # published by the Free Software Foundation. # +---- # # +---- # This program is distributed in the hope that it will be useful # +---- # but WITHOUT ANY WARRANTY; without even the implied warranty of # +---- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # +---- # GNU General Public License for more details. # +---- # # +---- ######################################################################### + +local version = "v1.2" + +local VALUE = 0 +local COMBO = 1 + +local edit = false +local page = 1 +local current = 1 --row +local refreshState = 0 +local refreshIndex = 0 +local pageOffset = 0 +local pages = {} +local fields = {} +local modifications = {} +local margin = 1 +local spacing = 8 +local appId = 0 + +local function drawScreenTitle(title,page, pages) + if math.fmod(math.floor(getTime()/100),10) == 0 then + title = version + end + if LCD_W == 480 then + lcd.drawFilledRectangle(0, 0, LCD_W, 30, TITLE_BGCOLOR) + lcd.drawText(1, 5, title, MENU_TITLE_COLOR) + lcd.drawText(LCD_W-40, 5, page.."/"..pages, MENU_TITLE_COLOR) + else + lcd.drawScreenTitle(title, page, pages) + end +end + +local settingsFields = { + {"SBEC OUTPUT (V)", VALUE, 0x80, nil, 50, 84 }, + {"Physical ID", VALUE, 0x01, nil, 0, 26 }, + {"Application IDgroup", VALUE, 0x0D, nil, 0, 15 }, + {"Data rate(*100ms)", VALUE, 0x22, nil, 1, 255 }, +} + +-- Change display attribute to current field +local function addField(step) + local field = fields[current] + local min, max + if field[2] == VALUE then + min = field[5] + max = field[6] + elseif field[2] == COMBO then + min = 0 + max = #(field[5]) - 1 + end + if field[2] ~= FLPOT then --only read ? + if field[2] == VALUE and field[6] > 256 then + if field[4] > 1000 then + step = step * 50 + field[4] = math.floor(field[4]/50) + field[4] = field[4] *50 + elseif field[4] > 500 then + step = step * 20 + field[4] = math.floor(field[4]/20) + field[4] = field[4] *20 + elseif field[4] > 200 then + step = step * 10 + field[4] = math.floor(field[4]/10) + field[4] = field[4] *10 + else + step = step * 1 + field[4] = math.floor(field[4]/1) + field[4] = field[4] *1 + end + end + if (step < 0 and field[4] > min) or (step > 0 and field[4] < max) then + field[4] = field[4] + step + end + else + field[4] = field[4] + end +end + + +-- Select the next or previous editable field +local function selectField(step) + current = current + step + if current > #fields then + current = #fields + elseif current < 1 then + current = 1 + end + if current > 7 + pageOffset then + pageOffset = current - 7 + elseif current <= pageOffset then + pageOffset = current - 1 + end +end + +local function drawProgressBar() + if LCD_W == 480 then + local width = (300 * refreshIndex) / #fields + lcd.drawRectangle(100, 10, 300, 6) + lcd.drawFilledRectangle(102, 13, width, 2); + else + local width = (60 * refreshIndex) / #fields + lcd.drawRectangle(45, 1, 60, 6) + lcd.drawFilledRectangle(47, 3, width, 2); + end +end + +-- Redraw the current page +local function redrawFieldsPage() + lcd.clear() + drawScreenTitle("SBEC", page, #pages) + if refreshIndex < #fields then + drawProgressBar() + end + for index = 1, 7, 1 do + local field = fields[pageOffset+index] + if field == nil then + break + end + local attr = current == (pageOffset+index) and ((edit == true and BLINK or 0) + INVERS) or 0 + lcd.drawText(1, margin+ spacing * index, field[1]) + if field[4] == nil then + lcd.drawText(LCD_W, margin+ spacing * index, "---", attr + RIGHT) + else + if field[2] == VALUE then + if field[3] == 0x80 then + lcd.drawNumber(LCD_W, margin+ spacing * index, field[4] , attr + RIGHT + PREC1) + else + lcd.drawNumber(LCD_W, margin+ spacing * index, field[4] , attr + RIGHT) + end + end + end + end +end + +local function telemetryRead(fieldx) + return sportTelemetryPush(0x17, 0x30, appId, fieldx) +end + +local function telemetryIdle(field) + return sportTelemetryPush(0x17, 0x21, appId, field) +end + +local function telemetryUnIdle(field) + return sportTelemetryPush(0x17, 0x20, appId, field) +end + +local function telemetryWrite(fieldx, valuex) + return sportTelemetryPush(0x17, 0x31, appId, fieldx + valuex*256) +end + +local telemetryPopTimeout = 0 +local function refreshNext() + if refreshState == 0 then + if #modifications > 0 then + local modificationstmp = modifications[1][2] + telemetryWrite(modifications[1][1], modificationstmp) + refreshIndex = 0 + modifications[1] = nil + elseif refreshIndex < #fields then + local field = fields[refreshIndex + 1] + if telemetryRead(field[3]) == true then + refreshState = 1 + telemetryPopTimeout = getTime() + 80 + end + end + elseif refreshState == 1 then + local physicalId, primId, dataId, value = sportTelemetryPop() + if primId == 0x32 and dataId == appId then + local fieldId = value % 256 + local field = fields[refreshIndex + 1] + if fieldId == field[3] then + local value = math.floor(value / 256) + if field[2] == VALUE then + value = value + end + + fields[refreshIndex + 1][4] = value + refreshIndex = refreshIndex + 1 + refreshState = 0 + end + elseif getTime() > telemetryPopTimeout then + refreshState = 0 + end + end +end + +local function updateField(field) + local value = field[4] + if field[2] == VALUE and #field == 6 then + value = value + end + modifications[#modifications+1] = {field[3], value} +end + +-- Main1 +local function runFieldsPage(event) + if event == EVT_VIRTUAL_EXIT then + telemetryUnIdle(0x80) + return 2 + elseif event == EVT_VIRTUAL_ENTER then + if fields[current][4] ~= nil then + edit = not edit + if edit == false then + updateField(fields[current]) + end + end + elseif edit then + if event == EVT_VIRTUAL_NEXT or event == EVT_VIRTUAL_NEXT_REPT then + addField(1) + elseif event == EVT_VIRTUAL_PREVIOUS or event == EVT_VIRTUAL_PREVIOUS_REPT then + addField(-1) + end + else + if event == EVT_VIRTUAL_NEXT then + selectField(1) + elseif event == EVT_VIRTUAL_PREVIOUS then + selectField(-1) + end + end + redrawFieldsPage() + return 0 +end + +local function runSettingsPage(event) + fields = settingsFields + return runFieldsPage(event) +end + +-- Init +local function init() + current, edit, refreshState, refreshIndex = 1, false, 0, 0 + if LCD_W == 480 then + margin = 10 + spacing = 20 + end + + pages = { + runSettingsPage, + } + + for index = 1, 40, 1 do + local sensor = model.getSensor(index) + if sensor ~= nil and sensor.id >= 0x0e50 and sensor.id <= 0x0e5f then + appId = sensor.id + break + end + end + + if appId == 0 then + error("No SBEC sensor in this model!") + end + + telemetryIdle(0x80) +end + +local function run(event) + if event == nil then + error("Cannot run as a model script!") + return 2 + elseif event == EVT_PAGE_BREAK or event == EVT_PAGEDN_FIRST or event == EVT_SHIFT_BREAK then + --selectPage(1) + elseif event == EVT_PAGE_LONG or event == EVT_PAGEUP_FIRST or event == EVT_SHIFT_LONG then + --killEvents(event); + --selectPage(-1) + end + local result = pages[page](event) + + refreshNext() + + return result +end + +return { init=init, background=background, run=run } diff --git a/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/FrSky SxR.lua b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/FrSky SxR.lua new file mode 100755 index 000000000..c49b78f52 --- /dev/null +++ b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/FrSky SxR.lua @@ -0,0 +1,363 @@ +--- - ######################################################################### +---- # # +---- # Copyright (C) OpenTX # +----- # # +---- # License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html # +---- # # +---- # This program is free software; you can redistribute it and/or modify # +---- # it under the terms of the GNU General Public License version 2 as # +---- # published by the Free Software Foundation. # +---- # # +---- # This program is distributed in the hope that it will be useful # +---- # but WITHOUT ANY WARRANTY; without even the implied warranty of # +---- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # +---- # GNU General Public License for more details. # +---- # # +---- ######################################################################### + +local version = "v2.00" + +local VALUE = 0 +local COMBO = 1 + +local COLUMN_2 = 300 + +local edit = false +local page = 1 +local current = 1 +local refreshState = 0 +local refreshIndex = 0 +local calibrationState = 0 +local pageOffset = 0 +local calibrationStep = 0 +local pages = {} +local fields = {} +local modifications = {} +local wingBitmaps = {} +local mountBitmaps = {} +local margin = 1 +local spacing = 8 +local counter = 0 + +local configFields = { + { "Wing type", COMBO, 0x80, nil, { "Normal", "Delta", "VTail" } }, + { "Mounting type", COMBO, 0x81, nil, { "Horz", "Horz rev.", "Vert", "Vert rev." } }, +} + +local wingBitmapsFile = { "bmp/plane.bmp", "bmp/delta.bmp", "bmp/vtail.bmp" } +local mountBitmapsFile = { "bmp/horz.bmp", "bmp/horz-r.bmp", "bmp/vert.bmp", "bmp/vert-r.bmp" } + +local settingsFields = { + {"SxR functions", COMBO, 0x9C, nil, { "Disable", "Enable" } }, + {"Quick Mode:", COMBO, 0xAA, nil, { "Disable", "Enable" } }, + {"CH5 mode", COMBO, 0xA8, nil, { "AIL2", "AUX1" } }, + {"CH6 mode", COMBO, 0xA9, nil, { "ELE2", "AUX2" } }, + {"AIL direction", COMBO, 0x82, nil, { "Normal", "Invers" }, { 255, 0 } }, + {"ELE direction", COMBO, 0x83, nil, { "Normal", "Invers" }, { 255, 0 } }, + {"RUD direction", COMBO, 0x84, nil, { "Normal", "Invers" }, { 255, 0 } }, + {"AIL2 direction", COMBO, 0x9A, nil, { "Normal", "Invers" }, { 255, 0 } }, + {"ELE2 direction", COMBO, 0x9B, nil, { "Normal", "Invers" }, { 255, 0 } }, + {"AIL stab gain", VALUE, 0x85, nil, 0, 200, "%"}, + {"ELE stab gain", VALUE, 0x86, nil, 0, 200, "%"}, + {"RUD stab gain", VALUE, 0x87, nil, 0, 200, "%"}, + {"AIL autolvl gain", VALUE, 0x88, nil, 0, 200, "%"}, + {"ELE autolvl gain", VALUE, 0x89, nil, 0, 200, "%"}, + {"ELE hover gain", VALUE, 0x8C, nil, 0, 200, "%"}, + {"RUD hover gain", VALUE, 0x8D, nil, 0, 200, "%"}, + {"AIL knife gain", VALUE, 0x8E, nil, 0, 200, "%"}, + {"RUD knife gain", VALUE, 0x90, nil, 0, 200, "%"}, + {"AIL autolvl offset", VALUE, 0x91, nil, -20, 20, "%", 0x6C}, + {"ELE autolvl offset", VALUE, 0x92, nil, -20, 20, "%", 0x6C}, + {"ELE hover offset", VALUE, 0x95, nil, -20, 20, "%", 0x6C}, + {"RUD hover offset", VALUE, 0x96, nil, -20, 20, "%", 0x6C}, + {"AIL knife offset", VALUE, 0x97, nil, -20, 20, "%", 0x6C}, + {"RUD knife offset", VALUE, 0x99, nil, -20, 20, "%", 0x6C}, +} + +local calibrationFields = { + { "X:", VALUE, 0x9E, 0, -100, 100, "%" }, + { "Y:", VALUE, 0x9F, 0, -100, 100, "%" }, + { "Z:", VALUE, 0xA0, 0, -100, 100, "%" } +} + +local function drawScreenTitle(title, page, pages) + if math.fmod(math.floor(getTime() / 100), 10) == 0 then + title = version + end + if LCD_W == 480 then + lcd.drawFilledRectangle(0, 0, LCD_W, 30, TITLE_BGCOLOR) + lcd.drawText(1, 5, title, MENU_TITLE_COLOR) + lcd.drawText(LCD_W - 40, 5, page .. "/" .. pages, MENU_TITLE_COLOR) + else + lcd.drawScreenTitle(title, page, pages) + end +end + +-- Change display attribute to current field +local function addField(step) + local field = fields[current] + local min, max + if field[2] == VALUE then + min = field[5] + max = field[6] + elseif field[2] == COMBO then + min = 0 + max = #(field[5]) - 1 + end + if (step < 0 and field[4] > min) or (step > 0 and field[4] < max) then + field[4] = field[4] + step + end +end + +-- Select the next or previous page +local function selectPage(step) + page = 1 + ((page + step - 1 + #pages) % #pages) + refreshIndex = 0 + calibrationStep = 0 + pageOffset = 0 +end + +-- Select the next or previous editable field +local function selectField(step) + current = 1 + ((current + step - 1 + #fields) % #fields) + if current > 7 + pageOffset then + pageOffset = current - 7 + elseif current <= pageOffset then + pageOffset = current - 1 + end +end + +local function drawProgressBar() + if LCD_W == 480 then + local width = (300 * refreshIndex) / #fields + lcd.drawRectangle(100, 10, 300, 6) + lcd.drawFilledRectangle(102, 13, width, 2); + else + local width = (60 * refreshIndex) / #fields + lcd.drawRectangle(45, 1, 60, 6) + lcd.drawFilledRectangle(47, 3, width, 2); + end +end + +-- Redraw the current page +local function redrawFieldsPage(event) + lcd.clear() + drawScreenTitle("SxR", page, #pages) + + if refreshIndex < #fields then + drawProgressBar() + end + + for index = 1, 10, 1 do + local field = fields[pageOffset + index] + if field == nil then + break + end + + local attr = current == (pageOffset + index) and ((edit == true and BLINK or 0) + INVERS) or 0 + + lcd.drawText(1, margin + spacing * index, field[1], attr) + + if field[4] == nil then + lcd.drawText(LCD_W, margin + spacing * index, "---", RIGHT + attr) + else + if field[2] == VALUE then + lcd.drawNumber(LCD_W, margin + spacing * index, field[4], RIGHT + attr) + elseif field[2] == COMBO then + if field[4] >= 0 and field[4] < #(field[5]) then + lcd.drawText(LCD_W, margin + spacing * index, field[5][1 + field[4]], RIGHT + attr) + end + end + end + end +end + +local function telemetryRead(field) + return sportTelemetryPush(0x17, 0x30, 0x0C30, field) +end + +local function telemetryWrite(field, value) + return sportTelemetryPush(0x17, 0x31, 0x0C30, field + value * 256) +end + +local telemetryPopTimeout = 0 +local function refreshNext() + if refreshState == 0 then + if calibrationState == 1 then + if telemetryWrite(0x9D, calibrationStep) == true then + refreshState = 1 + calibrationState = 2 + telemetryPopTimeout = getTime() + 120 -- normal delay is 500ms + end + elseif #modifications > 0 then + telemetryWrite(modifications[1][1], modifications[1][2]) + modifications[1] = nil + elseif refreshIndex < #fields then + local field = fields[refreshIndex + 1] + if telemetryRead(field[3]) == true then + refreshState = 1 + telemetryPopTimeout = getTime() + 80 -- normal delay is 500ms + end + end + elseif refreshState == 1 then + local physicalId, primId, dataId, value = sportTelemetryPop() + if physicalId == 0x1A and primId == 0x32 and dataId == 0x0C30 then + local fieldId = value % 256 + if calibrationState == 2 then + if fieldId == 0x9D then + refreshState = 0 + calibrationState = 0 + calibrationStep = (calibrationStep + 1) % 7 + end + else + local field = fields[refreshIndex + 1] + if fieldId == field[3] then + local value = math.floor(value / 256) + if field[3] == 0xAA then + value = bit32.band(value, 0x0001) + end + if field[3] >= 0x9E and field[3] <= 0xA0 then + local b1 = value % 256 + local b2 = math.floor(value / 256) + value = b1 * 256 + b2 + value = value - bit32.band(value, 0x8000) * 2 + end + if field[2] == COMBO and #field == 6 then + for index = 1, #(field[6]), 1 do + if value == field[6][index] then + value = index - 1 + break + end + end + elseif field[2] == VALUE and #field == 8 then + value = value - field[8] + field[5] + end + fields[refreshIndex + 1][4] = value + refreshIndex = refreshIndex + 1 + refreshState = 0 + end + end + elseif getTime() > telemetryPopTimeout then + fields[refreshIndex + 1][4] = nil + refreshIndex = refreshIndex + 1 + refreshState = 0 + calibrationState = 0 + end + end +end + +local function updateField(field) + local value = field[4] + if field[2] == COMBO and #field == 6 then + value = field[6][1 + value] + elseif field[2] == VALUE and #field == 8 then + value = value + field[8] - field[5] + end + modifications[#modifications + 1] = { field[3], value } +end + +-- Main +local function runFieldsPage(event) + if event == EVT_VIRTUAL_EXIT then -- exit script + return 2 + elseif event == EVT_VIRTUAL_ENTER then -- toggle editing/selecting current field + if fields[current][4] ~= nil then + edit = not edit + if edit == false then + updateField(fields[current]) + end + end + elseif edit then + if event == EVT_VIRTUAL_NEXT or event == EVT_VIRTUAL_NEXT_REPT then + addField(1) + elseif event == EVT_VIRTUAL_PREVIOUS or event == EVT_VIRTUAL_PREVIOUS_REPT then + addField(-1) + end + else + if event == EVT_VIRTUAL_NEXT then + selectField(1) + elseif event == EVT_VIRTUAL_PREVIOUS then + selectField(-1) + end + end + redrawFieldsPage(event) + return 0 +end + +local function runConfigPage(event) + fields = configFields + local result = runFieldsPage(event) + if LCD_W == 128 then + local mountText = { "Label is facing the sky", "Label is facing ground", "Label is left when", "Label is right when" } + if fields[2][4] ~= nil then + lcd.drawText(1, 30, "Pins toward tail") + lcd.drawText(1, 40, mountText[1 + fields[2][4]]) + if fields[2][4] > 1 then + lcd.drawText(1, 50, "looking from the tail") + end + end + else + if fields[1][4] ~= nil then + if LCD_W == 480 then + if wingBitmaps[1 + fields[1][4]] == nil then + wingBitmaps[1 + fields[1][4]] = Bitmap.open(wingBitmapsFile[1 + fields[1][4]]) + end + lcd.drawBitmap(wingBitmaps[1 + fields[1][4]], 10, 90) + else + lcd.drawPixmap(20, 28, wingBitmapsFile[1 + fields[1][4]]) + end + end + if fields[2][4] ~= nil then + if LCD_W == 480 then + if mountBitmaps[1 + fields[2][4]] == nil then + mountBitmaps[1 + fields[2][4]] = Bitmap.open(mountBitmapsFile[1 + fields[2][4]]) + end + lcd.drawBitmap(mountBitmaps[1 + fields[2][4]], 190, 110) + else + lcd.drawPixmap(128, 28, mountBitmapsFile[1 + fields[2][4]]) + end + end + end + return result +end + +local function runSettingsPage(event) + fields = settingsFields + return runFieldsPage(event) +end + +-- Init +local function init() + current, edit, refreshState, refreshIndex = 1, false, 0, 0 + if LCD_W == 480 then + margin = 10 + spacing = 20 + wingBitmapsFile = { "img/plane_b.png", "img/delta_b.png", "img/planev_b.png" } + mountBitmapsFile = { "img/up.png", "img/down.png", "img/vert.png", "img/vert-r.png" } + end + pages = { + runConfigPage, + runSettingsPage, + } +end + +-- Main +local function run(event) + if event == nil then + error("Cannot be run as a model script!") + return 2 + elseif event == EVT_VIRTUAL_NEXT_PAGE then + selectPage(1) + elseif event == EVT_VIRTUAL_PREVIOUS_PAGE then + killEvents(event); + selectPage(-1) + end + + local result = pages[page](event) + refreshNext() + + return result +end + +return { init = init, run = run } + diff --git a/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/bmp/back.bmp b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/bmp/back.bmp new file mode 100644 index 000000000..a8996262c Binary files /dev/null and b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/bmp/back.bmp differ diff --git a/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/bmp/delta.bmp b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/bmp/delta.bmp new file mode 100644 index 000000000..ab94279c1 Binary files /dev/null and b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/bmp/delta.bmp differ diff --git a/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/bmp/done.bmp b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/bmp/done.bmp new file mode 100644 index 000000000..9ac501398 Binary files /dev/null and b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/bmp/done.bmp differ diff --git a/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/bmp/down.bmp b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/bmp/down.bmp new file mode 100644 index 000000000..97f9105ac Binary files /dev/null and b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/bmp/down.bmp differ diff --git a/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/bmp/forward.bmp b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/bmp/forward.bmp new file mode 100644 index 000000000..df769aef2 Binary files /dev/null and b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/bmp/forward.bmp differ diff --git a/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/bmp/horz-r.bmp b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/bmp/horz-r.bmp new file mode 100644 index 000000000..93ffdb0fc Binary files /dev/null and b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/bmp/horz-r.bmp differ diff --git a/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/bmp/horz.bmp b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/bmp/horz.bmp new file mode 100644 index 000000000..4295e8475 Binary files /dev/null and b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/bmp/horz.bmp differ diff --git a/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/bmp/left.bmp b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/bmp/left.bmp new file mode 100644 index 000000000..8cc811fd1 Binary files /dev/null and b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/bmp/left.bmp differ diff --git a/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/bmp/plane.bmp b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/bmp/plane.bmp new file mode 100644 index 000000000..b3e61bf5f Binary files /dev/null and b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/bmp/plane.bmp differ diff --git a/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/bmp/right.bmp b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/bmp/right.bmp new file mode 100644 index 000000000..5fd52d475 Binary files /dev/null and b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/bmp/right.bmp differ diff --git a/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/bmp/up.bmp b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/bmp/up.bmp new file mode 100644 index 000000000..dcffc4186 Binary files /dev/null and b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/bmp/up.bmp differ diff --git a/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/bmp/vert-r.bmp b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/bmp/vert-r.bmp new file mode 100644 index 000000000..763409ec4 Binary files /dev/null and b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/bmp/vert-r.bmp differ diff --git a/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/bmp/vert.bmp b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/bmp/vert.bmp new file mode 100644 index 000000000..5f1b91f05 Binary files /dev/null and b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/bmp/vert.bmp differ diff --git a/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/bmp/vtail.bmp b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/bmp/vtail.bmp new file mode 100644 index 000000000..6c7ec0b56 Binary files /dev/null and b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/bmp/vtail.bmp differ diff --git a/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/img/back.png b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/img/back.png new file mode 100755 index 000000000..2cf3cd699 Binary files /dev/null and b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/img/back.png differ diff --git a/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/img/delta_b.png b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/img/delta_b.png new file mode 100755 index 000000000..80c0302f9 Binary files /dev/null and b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/img/delta_b.png differ diff --git a/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/img/done.bmp b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/img/done.bmp new file mode 100755 index 000000000..9ac501398 Binary files /dev/null and b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/img/done.bmp differ diff --git a/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/img/down.png b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/img/down.png new file mode 100755 index 000000000..8eac8039a Binary files /dev/null and b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/img/down.png differ diff --git a/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/img/forward.png b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/img/forward.png new file mode 100755 index 000000000..de09680b7 Binary files /dev/null and b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/img/forward.png differ diff --git a/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/img/left.png b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/img/left.png new file mode 100755 index 000000000..658c9916b Binary files /dev/null and b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/img/left.png differ diff --git a/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/img/plane_b.png b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/img/plane_b.png new file mode 100755 index 000000000..37abedc3a Binary files /dev/null and b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/img/plane_b.png differ diff --git a/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/img/planev_b.png b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/img/planev_b.png new file mode 100755 index 000000000..4e33f660b Binary files /dev/null and b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/img/planev_b.png differ diff --git a/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/img/planev_s.png b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/img/planev_s.png new file mode 100755 index 000000000..48283a290 Binary files /dev/null and b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/img/planev_s.png differ diff --git a/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/img/right.png b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/img/right.png new file mode 100755 index 000000000..01d555394 Binary files /dev/null and b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/img/right.png differ diff --git a/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/img/up.png b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/img/up.png new file mode 100755 index 000000000..f033aba55 Binary files /dev/null and b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/img/up.png differ diff --git a/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/img/vert-r.png b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/img/vert-r.png new file mode 100755 index 000000000..7bfc9450c Binary files /dev/null and b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/img/vert-r.png differ diff --git a/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/img/vert.png b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/img/vert.png new file mode 100755 index 000000000..de09680b7 Binary files /dev/null and b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/img/vert.png differ diff --git a/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/readme.txt b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/readme.txt new file mode 100644 index 000000000..20b95c415 --- /dev/null +++ b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/readme.txt @@ -0,0 +1 @@ +Scripts that need to be available in TOOLS menu should be in this directory diff --git a/radio/sdcard/taranis-x9/SxR/SxR_Calibrate.lua b/radio/sdcard/taranis-x9/SxR Calibrate/SxR_Calibrate.lua similarity index 100% rename from radio/sdcard/taranis-x9/SxR/SxR_Calibrate.lua rename to radio/sdcard/taranis-x9/SxR Calibrate/SxR_Calibrate.lua diff --git a/radio/sdcard/taranis-x9/SxR Calibrate/bmp/back.bmp b/radio/sdcard/taranis-x9/SxR Calibrate/bmp/back.bmp new file mode 100644 index 000000000..a8996262c Binary files /dev/null and b/radio/sdcard/taranis-x9/SxR Calibrate/bmp/back.bmp differ diff --git a/radio/sdcard/taranis-x9/SxR Calibrate/bmp/delta.bmp b/radio/sdcard/taranis-x9/SxR Calibrate/bmp/delta.bmp new file mode 100644 index 000000000..ab94279c1 Binary files /dev/null and b/radio/sdcard/taranis-x9/SxR Calibrate/bmp/delta.bmp differ diff --git a/radio/sdcard/taranis-x9/SxR Calibrate/bmp/done.bmp b/radio/sdcard/taranis-x9/SxR Calibrate/bmp/done.bmp new file mode 100644 index 000000000..9ac501398 Binary files /dev/null and b/radio/sdcard/taranis-x9/SxR Calibrate/bmp/done.bmp differ diff --git a/radio/sdcard/taranis-x9/SxR Calibrate/bmp/down.bmp b/radio/sdcard/taranis-x9/SxR Calibrate/bmp/down.bmp new file mode 100644 index 000000000..97f9105ac Binary files /dev/null and b/radio/sdcard/taranis-x9/SxR Calibrate/bmp/down.bmp differ diff --git a/radio/sdcard/taranis-x9/SxR Calibrate/bmp/forward.bmp b/radio/sdcard/taranis-x9/SxR Calibrate/bmp/forward.bmp new file mode 100644 index 000000000..df769aef2 Binary files /dev/null and b/radio/sdcard/taranis-x9/SxR Calibrate/bmp/forward.bmp differ diff --git a/radio/sdcard/taranis-x9/SxR Calibrate/bmp/horz-r.bmp b/radio/sdcard/taranis-x9/SxR Calibrate/bmp/horz-r.bmp new file mode 100644 index 000000000..93ffdb0fc Binary files /dev/null and b/radio/sdcard/taranis-x9/SxR Calibrate/bmp/horz-r.bmp differ diff --git a/radio/sdcard/taranis-x9/SxR Calibrate/bmp/horz.bmp b/radio/sdcard/taranis-x9/SxR Calibrate/bmp/horz.bmp new file mode 100644 index 000000000..4295e8475 Binary files /dev/null and b/radio/sdcard/taranis-x9/SxR Calibrate/bmp/horz.bmp differ diff --git a/radio/sdcard/taranis-x9/SxR Calibrate/bmp/left.bmp b/radio/sdcard/taranis-x9/SxR Calibrate/bmp/left.bmp new file mode 100644 index 000000000..8cc811fd1 Binary files /dev/null and b/radio/sdcard/taranis-x9/SxR Calibrate/bmp/left.bmp differ diff --git a/radio/sdcard/taranis-x9/SxR Calibrate/bmp/plane.bmp b/radio/sdcard/taranis-x9/SxR Calibrate/bmp/plane.bmp new file mode 100644 index 000000000..b3e61bf5f Binary files /dev/null and b/radio/sdcard/taranis-x9/SxR Calibrate/bmp/plane.bmp differ diff --git a/radio/sdcard/taranis-x9/SxR Calibrate/bmp/right.bmp b/radio/sdcard/taranis-x9/SxR Calibrate/bmp/right.bmp new file mode 100644 index 000000000..5fd52d475 Binary files /dev/null and b/radio/sdcard/taranis-x9/SxR Calibrate/bmp/right.bmp differ diff --git a/radio/sdcard/taranis-x9/SxR Calibrate/bmp/up.bmp b/radio/sdcard/taranis-x9/SxR Calibrate/bmp/up.bmp new file mode 100644 index 000000000..dcffc4186 Binary files /dev/null and b/radio/sdcard/taranis-x9/SxR Calibrate/bmp/up.bmp differ diff --git a/radio/sdcard/taranis-x9/SxR Calibrate/bmp/vert-r.bmp b/radio/sdcard/taranis-x9/SxR Calibrate/bmp/vert-r.bmp new file mode 100644 index 000000000..763409ec4 Binary files /dev/null and b/radio/sdcard/taranis-x9/SxR Calibrate/bmp/vert-r.bmp differ diff --git a/radio/sdcard/taranis-x9/SxR Calibrate/bmp/vert.bmp b/radio/sdcard/taranis-x9/SxR Calibrate/bmp/vert.bmp new file mode 100644 index 000000000..5f1b91f05 Binary files /dev/null and b/radio/sdcard/taranis-x9/SxR Calibrate/bmp/vert.bmp differ diff --git a/radio/sdcard/taranis-x9/SxR Calibrate/bmp/vtail.bmp b/radio/sdcard/taranis-x9/SxR Calibrate/bmp/vtail.bmp new file mode 100644 index 000000000..6c7ec0b56 Binary files /dev/null and b/radio/sdcard/taranis-x9/SxR Calibrate/bmp/vtail.bmp differ diff --git a/radio/sdcard/taranis-x9/SxR/SxR.lua b/radio/sdcard/taranis-x9/SxR/SxR.lua deleted file mode 100644 index 2a2fb4ef1..000000000 --- a/radio/sdcard/taranis-x9/SxR/SxR.lua +++ /dev/null @@ -1,280 +0,0 @@ ----- ######################################################################### ----- # # ----- # Copyright (C) OpenTX # ------# # ----- # License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html # ----- # # ----- # This program is free software; you can redistribute it and/or modify # ----- # it under the terms of the GNU General Public License version 2 as # ----- # published by the Free Software Foundation. # ----- # # ----- # This program is distributed in the hope that it will be useful # ----- # but WITHOUT ANY WARRANTY; without even the implied warranty of # ----- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # ----- # GNU General Public License for more details. # ----- # # ----- ######################################################################### -local VALUE = 0 -local COMBO = 1 - -local COLUMN_2 = 150 - -local edit = false -local page = 1 -local current = 1 -local refreshState = 0 -local refreshIndex = 0 -local pageOffset = 0 -local pages = {} -local fields = {} -local modifications = {} - -local configFields = { - {"Wing type:", COMBO, 0x80, nil, { "Normal", "Delta", "VTail" } }, - {"Mounting type:", COMBO, 0x81, nil, { "Horz", "Horz rev.", "Vert", "Vert rev." } }, -} - -local settingsFields = { - {"SxR functions:", COMBO, 0x9C, nil, { "Disable", "Enable" } }, - {"Quick Mode:", COMBO, 0xAA, nil, { "Disable", "Enable" } }, - {"CH5 mode:", COMBO, 0xA8, nil, { "AIL2", "AUX1" } }, - {"CH6 mode:", COMBO, 0xA9, nil, { "ELE2", "AUX2" } }, - {"AIL direction:", COMBO, 0x82, nil, { "Normal", "Invers" }, { 255, 0 } }, - {"ELE direction:", COMBO, 0x83, nil, { "Normal", "Invers" }, { 255, 0 } }, - {"RUD direction:", COMBO, 0x84, nil, { "Normal", "Invers" }, { 255, 0 } }, - {"AIL2 direction:", COMBO, 0x9A, nil, { "Normal", "Invers" }, { 255, 0 } }, - {"ELE2 direction:", COMBO, 0x9B, nil, { "Normal", "Invers" }, { 255, 0 } }, - {"AIL stabilize gain:", VALUE, 0x85, nil, 0, 200, "%"}, - {"ELE stabilize gain:", VALUE, 0x86, nil, 0, 200, "%"}, - {"RUD stabilize gain:", VALUE, 0x87, nil, 0, 200, "%"}, - {"AIL auto level gain:", VALUE, 0x88, nil, 0, 200, "%"}, - {"ELE auto level gain:", VALUE, 0x89, nil, 0, 200, "%"}, - {"ELE upright gain:", VALUE, 0x8C, nil, 0, 200, "%"}, - {"RUD upright gain:", VALUE, 0x8D, nil, 0, 200, "%"}, - {"AIL crab gain:", VALUE, 0x8E, nil, 0, 200, "%"}, - {"RUD crab gain:", VALUE, 0x90, nil, 0, 200, "%"}, - {"AIL auto angle offset:", VALUE, 0x91, nil, -20, 20, "%", 0x6C}, - {"ELE auto angle offset:", VALUE, 0x92, nil, -20, 20, "%", 0x6C}, - {"ELE upright angle offset:", VALUE, 0x95, nil, -20, 20, "%", 0x6C}, - {"RUD upright angle offset:", VALUE, 0x96, nil, -20, 20, "%", 0x6C}, - {"AIL crab angle offset:", VALUE, 0x97, nil, -20, 20, "%", 0x6C}, - {"RUD crab angle offset:", VALUE, 0x99, nil, -20, 20, "%", 0x6C}, -} - --- Change display attribute to current field -local function addField(step) - local field = fields[current] - local min, max - if field[2] == VALUE then - min = field[5] - max = field[6] - elseif field[2] == COMBO then - min = 0 - max = #(field[5]) - 1 - end - if (step < 0 and field[4] > min) or (step > 0 and field[4] < max) then - field[4] = field[4] + step - end -end - --- Select the next or previous page -local function selectPage(step) - page = 1 + ((page + step - 1 + #pages) % #pages) - refreshIndex = 0 - pageOffset = 0 -end - --- Select the next or previous editable field -local function selectField(step) - current = 1 + ((current + step - 1 + #fields) % #fields) - if current > 7 + pageOffset then - pageOffset = current - 7 - elseif current <= pageOffset then - pageOffset = current - 1 - end -end - -local function drawProgressBar() - local width = (140 * refreshIndex) / #fields - lcd.drawRectangle(30, 1, 144, 6) - lcd.drawFilledRectangle(32, 3, width, 2); -end - --- Redraw the current page -local function redrawFieldsPage() - lcd.clear() - lcd.drawScreenTitle("SxR", page, #pages) - - if refreshIndex < #fields then - drawProgressBar() - end - - for index = 1, 7, 1 do - local field = fields[pageOffset+index] - if field == nil then - break - end - - local attr = current == (pageOffset+index) and ((edit == true and BLINK or 0) + INVERS) or 0 - - lcd.drawText(0, 1+8*index, field[1]) - - if field[4] == nil then - lcd.drawText(COLUMN_2, 1+8*index, "---", attr) - else - if field[2] == VALUE then - lcd.drawNumber(COLUMN_2, 1+8*index, field[4], LEFT + attr) - elseif field[2] == COMBO then - if field[4] >= 0 and field[4] < #(field[5]) then - lcd.drawText(COLUMN_2, 1+8*index, field[5][1+field[4]], attr) - end - end - end - end -end - -local function telemetryRead(field) - return sportTelemetryPush(0x17, 0x30, 0x0C30, field) -end - -local function telemetryWrite(field, value) - return sportTelemetryPush(0x17, 0x31, 0x0C30, field + value*256) -end - -local telemetryPopTimeout = 0 -local function refreshNext() - if refreshState == 0 then - if #modifications > 0 then - telemetryWrite(modifications[1][1], modifications[1][2]) - modifications[1] = nil - elseif refreshIndex < #fields then - local field = fields[refreshIndex + 1] - if telemetryRead(field[3]) == true then - refreshState = 1 - telemetryPopTimeout = getTime() + 120 -- normal delay is 500ms - end - end - elseif refreshState == 1 then - local physicalId, primId, dataId, value = sportTelemetryPop() - if physicalId == 0x1A and primId == 0x32 and dataId == 0x0C30 then - local fieldId = value % 256 - local field = fields[refreshIndex + 1] - if fieldId == field[3] then - local value = math.floor(value / 256) - if field[3] == 0xAA then - value = bit32.band(value, 0x0001) - end - if field[3] >= 0x9E and field[3] <= 0xA0 then - local b1 = value % 256 - local b2 = math.floor(value / 256) - value = b1*256 + b2 - value = value - bit32.band(value, 0x8000) * 2 - end - if field[2] == COMBO and #field == 6 then - for index = 1, #(field[6]), 1 do - if value == field[6][index] then - value = index - 1 - break - end - end - elseif field[2] == VALUE and #field == 8 then - value = value - field[8] + field[5] - end - fields[refreshIndex + 1][4] = value - refreshIndex = refreshIndex + 1 - refreshState = 0 - end - elseif getTime() > telemetryPopTimeout then - fields[refreshIndex + 1][4] = nil - refreshIndex = refreshIndex + 1 - refreshState = 0 - end - end -end - -local function updateField(field) - local value = field[4] - if field[2] == COMBO and #field == 6 then - value = field[6][1+value] - elseif field[2] == VALUE and #field == 8 then - value = value + field[8] - field[5] - end - modifications[#modifications+1] = { field[3], value } -end - --- Main -local function runFieldsPage(event) - if event == EVT_EXIT_BREAK then -- exit script - return 2 - elseif event == EVT_ENTER_BREAK then -- toggle editing/selecting current field - if fields[current][4] ~= nil then - edit = not edit - if edit == false then - updateField(fields[current]) - end - end - elseif edit then - if event == EVT_PLUS_FIRST or event == EVT_ROT_RIGHT or event == EVT_PLUS_REPT then - addField(1) - elseif event == EVT_MINUS_FIRST or event == EVT_ROT_LEFT or event == EVT_MINUS_REPT then - addField(-1) - end - else - if event == EVT_MINUS_FIRST or event == EVT_ROT_RIGHT then - selectField(1) - elseif event == EVT_PLUS_FIRST or event == EVT_ROT_LEFT then - selectField(-1) - end - end - redrawFieldsPage() - return 0 -end - -local wingBitmaps = { "bmp/plane.bmp", "bmp/delta.bmp", "bmp/vtail.bmp" } -local mountBitmaps = { "bmp/horz.bmp", "bmp/horz-r.bmp", "bmp/vert.bmp", "bmp/vert-r.bmp" } - -local function runConfigPage(event) - fields = configFields - local result = runFieldsPage(event) - if fields[1][4] ~= nil then - lcd.drawPixmap(20, 28, wingBitmaps[1 + fields[1][4]]) - end - if fields[2][4] ~= nil then - lcd.drawPixmap(128, 28, mountBitmaps[1 + fields[2][4]]) - end - return result -end - -local function runSettingsPage(event) - fields = settingsFields - return runFieldsPage(event) -end - --- Init -local function init() - current, edit, refreshState, refreshIndex = 1, false, 0, 0 - pages = { - runConfigPage, - runSettingsPage, - } -end - --- Main -local function run(event) - if event == nil then - error("Cannot be run as a model script!") - return 2 - elseif event == EVT_PAGE_BREAK then - selectPage(1) - elseif event == EVT_PAGE_LONG then - killEvents(event); - selectPage(-1) - end - - local result = pages[page](event) - refreshNext() - - return result -end - -return { init=init, run=run } diff --git a/radio/src/CMakeLists.txt b/radio/src/CMakeLists.txt index e3b89c9d7..615a7de16 100644 --- a/radio/src/CMakeLists.txt +++ b/radio/src/CMakeLists.txt @@ -16,6 +16,7 @@ set_property(CACHE PPM_UNIT PROPERTY STRINGS US PERCENT_PREC1 PERCENT_PREC0) set(DEFAULT_MODE "" CACHE STRING "Default sticks mode") set(FONT "STD" CACHE STRING "Choose font : STD or SQT5") set_property(CACHE FONT PROPERTY STRINGS SQT5) +set(POPUP_LEVEL 2 CACHE STRING "Popup level") option(HELI "Heli menu" ON) option(FLIGHT_MODES "Flight Modes" ON) @@ -314,8 +315,11 @@ endif() if(FRSKY_RELEASE) add_definitions(-DFRSKY_RELEASE) + set(POPUP_LEVEL 3) endif() +add_definitions(-DPOPUP_LEVEL=${POPUP_LEVEL}) + set(SRC ${SRC} opentx.cpp @@ -325,7 +329,7 @@ set(SRC mixer.cpp stamp.cpp timers.cpp - trainer_input.cpp + trainer.cpp ) if(GUI) @@ -357,7 +361,7 @@ endforeach() add_definitions(-DCORRECT_NEGATIVE_SHIFTS) if(NOT MSVC) - set(WARNING_FLAGS "${WARNING_FLAGS} -Wall -Wno-strict-aliasing -Wformat -Wreturn-type -Wunused -Wuninitialized -Wunknown-pragmas -Wno-switch -Wtype-limits") + set(WARNING_FLAGS "${WARNING_FLAGS} -Wall -Wno-address-of-packed-member -Wno-strict-aliasing -Wformat -Wreturn-type -Wunused -Wuninitialized -Wunknown-pragmas -Wno-switch -Wtype-limits") if(WARNINGS_AS_ERRORS) set(WARNING_FLAGS "${WARNING_FLAGS} -Werror") endif(WARNINGS_AS_ERRORS) diff --git a/radio/src/audio.h b/radio/src/audio.h index 3dbfc5911..ac356863a 100644 --- a/radio/src/audio.h +++ b/radio/src/audio.h @@ -588,8 +588,6 @@ void audioTimerCountdown(uint8_t timer, int value); #define AUDIO_TRAINER_LOST() audioEvent(AU_TRAINER_LOST) #define AUDIO_TRAINER_BACK() audioEvent(AU_TRAINER_BACK) -#define AUDIO_HEARTBEAT() - enum AutomaticPromptsCategories { SYSTEM_AUDIO_CATEGORY, MODEL_AUDIO_CATEGORY, diff --git a/radio/src/bitmaps/212x64/shutdown.png b/radio/src/bitmaps/212x64/shutdown.png new file mode 100755 index 000000000..8f3307020 Binary files /dev/null and b/radio/src/bitmaps/212x64/shutdown.png differ diff --git a/radio/src/bluetooth.cpp b/radio/src/bluetooth.cpp index d65dad9ba..7a9b52f04 100644 --- a/radio/src/bluetooth.cpp +++ b/radio/src/bluetooth.cpp @@ -21,14 +21,14 @@ #include "opentx.h" #include "io/frsky_firmware_update.h" -#if defined(PCBHORUS) || defined(PCBX7) || defined(PCBXLITE) || defined(USEHORUSBT) -#define BLUETOOTH_COMMAND_NAME "AT+NAME" -#define BLUETOOTH_ANSWER_NAME "OK+" -#define BLUETOOTH_COMMAND_BAUD_115200 "AT+BAUD115200" -#else +#if defined(PCBX9E) #define BLUETOOTH_COMMAND_NAME "TTM:REN-" #define BLUETOOTH_ANSWER_NAME "TTM:REN" #define BLUETOOTH_COMMAND_BAUD_115200 "TTM:BPS-115200" +#else +#define BLUETOOTH_COMMAND_NAME "AT+NAME" +#define BLUETOOTH_ANSWER_NAME "OK+" +#define BLUETOOTH_COMMAND_BAUD_115200 "AT+BAUD115200" #endif #if defined(_MSC_VER) @@ -47,7 +47,7 @@ void Bluetooth::write(const uint8_t * data, uint8_t length) TRACE_NOCRLF("BT>"); for (int i=0; i 0) { for (int i = 0; i < len; i++) { - *cur++ = zchar2char(g_eeGeneral.bluetoothName[i]); + *cur++ = char2lower(zchar2char(g_eeGeneral.bluetoothName[i])); } *cur = '\0'; } else { - cur = strAppend(cur, "Taranis-X9E"); + cur = strAppend(cur, FLAVOUR); } writeString(command); state = BLUETOOTH_WAIT_TTM; @@ -413,16 +414,12 @@ void Bluetooth::wakeup() uint8_t len = ZLEN(g_eeGeneral.bluetoothName); if (len > 0) { for (int i = 0; i < len; i++) { - *cur++ = zchar2char(g_eeGeneral.bluetoothName[i]); + *cur++ = char2lower(zchar2char(g_eeGeneral.bluetoothName[i])); } *cur = '\0'; } else { -#if defined(PCBHORUS) - cur = strAppend(cur, "Horus"); -#else - cur = strAppend(cur, "Taranis"); -#endif + cur = strAppend(cur, FLAVOUR); } writeString(command); state = BLUETOOTH_STATE_NAME_SENT; @@ -494,13 +491,13 @@ uint8_t Bluetooth::bootloaderChecksum(uint8_t command, const uint8_t * data, uin return sum; } -uint8_t Bluetooth::read(uint8_t * data, uint8_t size, uint8_t timeout) +uint8_t Bluetooth::read(uint8_t * data, uint8_t size, uint32_t timeout) { watchdogSuspend(timeout / 10); uint8_t len = 0; while (len < size) { - uint8_t elapsed = 0; + uint32_t elapsed = 0; uint8_t byte; while (!btRxFifo.pop(byte)) { if (elapsed++ >= timeout) { @@ -516,7 +513,7 @@ uint8_t Bluetooth::read(uint8_t * data, uint8_t size, uint8_t timeout) #define BLUETOOTH_ACK 0xCC #define BLUETOOTH_NACK 0x33 -const char * Bluetooth::bootloaderWaitCommandResponse(uint8_t timeout) +const char * Bluetooth::bootloaderWaitCommandResponse(uint32_t timeout) { uint8_t response[2]; if (read(response, sizeof(response), timeout) != sizeof(response)) { @@ -757,7 +754,7 @@ const char * Bluetooth::doFlashFirmware(const char * filename) } } -void Bluetooth::flashFirmware(const char * filename) +const char * Bluetooth::flashFirmware(const char * filename) { drawProgressScreen(getBasename(filename), STR_MODULE_RESET, 0, 0); @@ -794,4 +791,6 @@ void Bluetooth::flashFirmware(const char * filename) state = BLUETOOTH_STATE_OFF; resumePulses(); + + return result; } diff --git a/radio/src/bluetooth.h b/radio/src/bluetooth.h index e8e86e056..42c5abaa7 100644 --- a/radio/src/bluetooth.h +++ b/radio/src/bluetooth.h @@ -19,7 +19,7 @@ */ enum BluetoothStates { -#if defined(PCBX9E) && !defined(USEHORUSBT) +#if defined(PCBX9E) BLUETOOTH_INIT, BLUETOOTH_WAIT_TTM, BLUETOOTH_WAIT_BAUDRATE_CHANGE, @@ -57,7 +57,7 @@ class Bluetooth void forwardTelemetry(const uint8_t * packet); void wakeup(); - void flashFirmware(const char * filename); + const char * flashFirmware(const char * filename); volatile uint8_t state; char localAddr[LEN_BLUETOOTH_ADDR+1]; @@ -65,7 +65,7 @@ class Bluetooth protected: void pushByte(uint8_t byte); - uint8_t read(uint8_t * data, uint8_t size, uint8_t timeout=100/*ms*/); + uint8_t read(uint8_t * data, uint8_t size, uint32_t timeout=1000/*ms*/); void write(const uint8_t * data, uint8_t length); void appendTrainerByte(uint8_t data); void processTrainerFrame(const uint8_t * buffer); @@ -76,7 +76,7 @@ class Bluetooth uint8_t bootloaderChecksum(uint8_t command, const uint8_t * data, uint8_t size); void bootloaderSendCommand(uint8_t command, const void *data = nullptr, uint8_t size = 0); void bootloaderSendCommandResponse(uint8_t response); - const char * bootloaderWaitCommandResponse(uint8_t timeout=100/*ms*/); + const char * bootloaderWaitCommandResponse(uint32_t timeout=1000/*ms*/); const char * bootloaderWaitResponseData(uint8_t *data, uint8_t size); const char * bootloaderSetAutoBaud(); const char * bootloaderReadStatus(uint8_t &status); diff --git a/radio/src/cli.cpp b/radio/src/cli.cpp index 56f1abc37..7aa071190 100644 --- a/radio/src/cli.cpp +++ b/radio/src/cli.cpp @@ -960,13 +960,13 @@ int cliDisplay(const char ** argv) uint8_t len = STR_VKEYS[0]; strncpy(name, STR_VKEYS+1+len*i, len); name[len] = '\0'; - serialPrint("[%s] = %s", name, keyState(i) ? "on" : "off"); + serialPrint("[%s] = %s", name, keys[i].state() ? "on" : "off"); } #if defined(ROTARY_ENCODER_NAVIGATION) serialPrint("[Enc.] = %d", rotencValue / ROTARY_ENCODER_GRANULARITY); #endif for (int i=TRM_BASE; i<=TRM_LAST; i++) { - serialPrint("[Trim%d] = %s", i-TRM_BASE, keyState(i) ? "on" : "off"); + serialPrint("[Trim%d] = %s", i-TRM_BASE, keys[i].state() ? "on" : "off"); } for (int i=MIXSRC_FIRST_SWITCH; i<=MIXSRC_LAST_SWITCH; i++) { mixsrc_t sw = i - MIXSRC_FIRST_SWITCH; @@ -1016,6 +1016,9 @@ int cliDisplay(const char ** argv) case 2: tim = TIM2; break; + case 8: + tim = TIM8; + break; case 13: tim = TIM13; break; diff --git a/radio/src/crc16.cpp b/radio/src/crc.cpp similarity index 55% rename from radio/src/crc16.cpp rename to radio/src/crc.cpp index caa3c94b9..26a1af500 100644 --- a/radio/src/crc16.cpp +++ b/radio/src/crc.cpp @@ -18,49 +18,19 @@ * GNU General Public License for more details. */ -#include +#include "crc.h" -// CRC16 implementation according to CCITT standards -static const unsigned short crc16tab[256] = { - 0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7, - 0x8108,0x9129,0xa14a,0xb16b,0xc18c,0xd1ad,0xe1ce,0xf1ef, - 0x1231,0x0210,0x3273,0x2252,0x52b5,0x4294,0x72f7,0x62d6, - 0x9339,0x8318,0xb37b,0xa35a,0xd3bd,0xc39c,0xf3ff,0xe3de, - 0x2462,0x3443,0x0420,0x1401,0x64e6,0x74c7,0x44a4,0x5485, - 0xa56a,0xb54b,0x8528,0x9509,0xe5ee,0xf5cf,0xc5ac,0xd58d, - 0x3653,0x2672,0x1611,0x0630,0x76d7,0x66f6,0x5695,0x46b4, - 0xb75b,0xa77a,0x9719,0x8738,0xf7df,0xe7fe,0xd79d,0xc7bc, - 0x48c4,0x58e5,0x6886,0x78a7,0x0840,0x1861,0x2802,0x3823, - 0xc9cc,0xd9ed,0xe98e,0xf9af,0x8948,0x9969,0xa90a,0xb92b, - 0x5af5,0x4ad4,0x7ab7,0x6a96,0x1a71,0x0a50,0x3a33,0x2a12, - 0xdbfd,0xcbdc,0xfbbf,0xeb9e,0x9b79,0x8b58,0xbb3b,0xab1a, - 0x6ca6,0x7c87,0x4ce4,0x5cc5,0x2c22,0x3c03,0x0c60,0x1c41, - 0xedae,0xfd8f,0xcdec,0xddcd,0xad2a,0xbd0b,0x8d68,0x9d49, - 0x7e97,0x6eb6,0x5ed5,0x4ef4,0x3e13,0x2e32,0x1e51,0x0e70, - 0xff9f,0xefbe,0xdfdd,0xcffc,0xbf1b,0xaf3a,0x9f59,0x8f78, - 0x9188,0x81a9,0xb1ca,0xa1eb,0xd10c,0xc12d,0xf14e,0xe16f, - 0x1080,0x00a1,0x30c2,0x20e3,0x5004,0x4025,0x7046,0x6067, - 0x83b9,0x9398,0xa3fb,0xb3da,0xc33d,0xd31c,0xe37f,0xf35e, - 0x02b1,0x1290,0x22f3,0x32d2,0x4235,0x5214,0x6277,0x7256, - 0xb5ea,0xa5cb,0x95a8,0x8589,0xf56e,0xe54f,0xd52c,0xc50d, - 0x34e2,0x24c3,0x14a0,0x0481,0x7466,0x6447,0x5424,0x4405, - 0xa7db,0xb7fa,0x8799,0x97b8,0xe75f,0xf77e,0xc71d,0xd73c, - 0x26d3,0x36f2,0x0691,0x16b0,0x6657,0x7676,0x4615,0x5634, - 0xd94c,0xc96d,0xf90e,0xe92f,0x99c8,0x89e9,0xb98a,0xa9ab, - 0x5844,0x4865,0x7806,0x6827,0x18c0,0x08e1,0x3882,0x28a3, - 0xcb7d,0xdb5c,0xeb3f,0xfb1e,0x8bf9,0x9bd8,0xabbb,0xbb9a, - 0x4a75,0x5a54,0x6a37,0x7a16,0x0af1,0x1ad0,0x2ab3,0x3a92, - 0xfd2e,0xed0f,0xdd6c,0xcd4d,0xbdaa,0xad8b,0x9de8,0x8dc9, - 0x7c26,0x6c07,0x5c64,0x4c45,0x3ca2,0x2c83,0x1ce0,0x0cc1, - 0xef1f,0xff3e,0xcf5d,0xdf7c,0xaf9b,0xbfba,0x8fd9,0x9ff8, - 0x6e17,0x7e36,0x4e55,0x5e74,0x2e93,0x3eb2,0x0ed1,0x1ef0 +static const unsigned short * crc16tab[] = { + crc16tab_1021, + crc16tab_1189 }; -uint16_t crc16(const uint8_t * buf, uint32_t len) +uint16_t crc16(uint8_t index, const uint8_t * buf, uint32_t len, uint16_t start) { - uint16_t crc = 0; + uint16_t crc = start; + const unsigned short * tab = crc16tab[index]; for (uint32_t i=0; i>8) ^ *buf++) & 0x00FF]; + crc = (crc<<8) ^ tab[((crc>>8) ^ *buf++) & 0x00FF]; } return crc; } diff --git a/radio/src/crc.h b/radio/src/crc.h new file mode 100644 index 000000000..025abaf57 --- /dev/null +++ b/radio/src/crc.h @@ -0,0 +1,105 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#ifndef __CRC_H__ +#define __CRC_H__ + +#include + +enum { + CRC_1021, + CRC_1189, +}; + +uint8_t crc8(const uint8_t * ptr, uint32_t len); +uint16_t crc16(uint8_t index, const uint8_t * buf, uint32_t len, uint16_t start = 0); + +// CRC16 implementation according to CCITT standards +static const unsigned short crc16tab_1021[256] = { + 0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7, + 0x8108,0x9129,0xa14a,0xb16b,0xc18c,0xd1ad,0xe1ce,0xf1ef, + 0x1231,0x0210,0x3273,0x2252,0x52b5,0x4294,0x72f7,0x62d6, + 0x9339,0x8318,0xb37b,0xa35a,0xd3bd,0xc39c,0xf3ff,0xe3de, + 0x2462,0x3443,0x0420,0x1401,0x64e6,0x74c7,0x44a4,0x5485, + 0xa56a,0xb54b,0x8528,0x9509,0xe5ee,0xf5cf,0xc5ac,0xd58d, + 0x3653,0x2672,0x1611,0x0630,0x76d7,0x66f6,0x5695,0x46b4, + 0xb75b,0xa77a,0x9719,0x8738,0xf7df,0xe7fe,0xd79d,0xc7bc, + 0x48c4,0x58e5,0x6886,0x78a7,0x0840,0x1861,0x2802,0x3823, + 0xc9cc,0xd9ed,0xe98e,0xf9af,0x8948,0x9969,0xa90a,0xb92b, + 0x5af5,0x4ad4,0x7ab7,0x6a96,0x1a71,0x0a50,0x3a33,0x2a12, + 0xdbfd,0xcbdc,0xfbbf,0xeb9e,0x9b79,0x8b58,0xbb3b,0xab1a, + 0x6ca6,0x7c87,0x4ce4,0x5cc5,0x2c22,0x3c03,0x0c60,0x1c41, + 0xedae,0xfd8f,0xcdec,0xddcd,0xad2a,0xbd0b,0x8d68,0x9d49, + 0x7e97,0x6eb6,0x5ed5,0x4ef4,0x3e13,0x2e32,0x1e51,0x0e70, + 0xff9f,0xefbe,0xdfdd,0xcffc,0xbf1b,0xaf3a,0x9f59,0x8f78, + 0x9188,0x81a9,0xb1ca,0xa1eb,0xd10c,0xc12d,0xf14e,0xe16f, + 0x1080,0x00a1,0x30c2,0x20e3,0x5004,0x4025,0x7046,0x6067, + 0x83b9,0x9398,0xa3fb,0xb3da,0xc33d,0xd31c,0xe37f,0xf35e, + 0x02b1,0x1290,0x22f3,0x32d2,0x4235,0x5214,0x6277,0x7256, + 0xb5ea,0xa5cb,0x95a8,0x8589,0xf56e,0xe54f,0xd52c,0xc50d, + 0x34e2,0x24c3,0x14a0,0x0481,0x7466,0x6447,0x5424,0x4405, + 0xa7db,0xb7fa,0x8799,0x97b8,0xe75f,0xf77e,0xc71d,0xd73c, + 0x26d3,0x36f2,0x0691,0x16b0,0x6657,0x7676,0x4615,0x5634, + 0xd94c,0xc96d,0xf90e,0xe92f,0x99c8,0x89e9,0xb98a,0xa9ab, + 0x5844,0x4865,0x7806,0x6827,0x18c0,0x08e1,0x3882,0x28a3, + 0xcb7d,0xdb5c,0xeb3f,0xfb1e,0x8bf9,0x9bd8,0xabbb,0xbb9a, + 0x4a75,0x5a54,0x6a37,0x7a16,0x0af1,0x1ad0,0x2ab3,0x3a92, + 0xfd2e,0xed0f,0xdd6c,0xcd4d,0xbdaa,0xad8b,0x9de8,0x8dc9, + 0x7c26,0x6c07,0x5c64,0x4c45,0x3ca2,0x2c83,0x1ce0,0x0cc1, + 0xef1f,0xff3e,0xcf5d,0xdf7c,0xaf9b,0xbfba,0x8fd9,0x9ff8, + 0x6e17,0x7e36,0x4e55,0x5e74,0x2e93,0x3eb2,0x0ed1,0x1ef0 +}; + +static const unsigned short crc16tab_1189[256] = { + 0x0000,0x1189,0x2312,0x329b,0x4624,0x57ad,0x6536,0x74bf, + 0x8c48,0x9dc1,0xaf5a,0xbed3,0xca6c,0xdbe5,0xe97e,0xf8f7, + 0x1081,0x0108,0x3393,0x221a,0x56a5,0x472c,0x75b7,0x643e, + 0x9cc9,0x8d40,0xbfdb,0xae52,0xdaed,0xcb64,0xf9ff,0xe876, + 0x2102,0x308b,0x0210,0x1399,0x6726,0x76af,0x4434,0x55bd, + 0xad4a,0xbcc3,0x8e58,0x9fd1,0xeb6e,0xfae7,0xc87c,0xd9f5, + 0x3183,0x200a,0x1291,0x0318,0x77a7,0x662e,0x54b5,0x453c, + 0xbdcb,0xac42,0x9ed9,0x8f50,0xfbef,0xea66,0xd8fd,0xc974, + 0x4204,0x538d,0x6116,0x709f,0x0420,0x15a9,0x2732,0x36bb, + 0xce4c,0xdfc5,0xed5e,0xfcd7,0x8868,0x99e1,0xab7a,0xbaf3, + 0x5285,0x430c,0x7197,0x601e,0x14a1,0x0528,0x37b3,0x263a, + 0xdecd,0xcf44,0xfddf,0xec56,0x98e9,0x8960,0xbbfb,0xaa72, + 0x6306,0x728f,0x4014,0x519d,0x2522,0x34ab,0x0630,0x17b9, + 0xef4e,0xfec7,0xcc5c,0xddd5,0xa96a,0xb8e3,0x8a78,0x9bf1, + 0x7387,0x620e,0x5095,0x411c,0x35a3,0x242a,0x16b1,0x0738, + 0xffcf,0xee46,0xdcdd,0xcd54,0xb9eb,0xa862,0x9af9,0x8b70, + 0x8408,0x9581,0xa71a,0xb693,0xc22c,0xd3a5,0xe13e,0xf0b7, + 0x0840,0x19c9,0x2b52,0x3adb,0x4e64,0x5fed,0x6d76,0x7cff, + 0x9489,0x8500,0xb79b,0xa612,0xd2ad,0xc324,0xf1bf,0xe036, + 0x18c1,0x0948,0x3bd3,0x2a5a,0x5ee5,0x4f6c,0x7df7,0x6c7e, + 0xa50a,0xb483,0x8618,0x9791,0xe32e,0xf2a7,0xc03c,0xd1b5, + 0x2942,0x38cb,0x0a50,0x1bd9,0x6f66,0x7eef,0x4c74,0x5dfd, + 0xb58b,0xa402,0x9699,0x8710,0xf3af,0xe226,0xd0bd,0xc134, + 0x39c3,0x284a,0x1ad1,0x0b58,0x7fe7,0x6e6e,0x5cf5,0x4d7c, + 0xc60c,0xd785,0xe51e,0xf497,0x8028,0x91a1,0xa33a,0xb2b3, + 0x4a44,0x5bcd,0x6956,0x78df,0x0c60,0x1de9,0x2f72,0x3efb, + 0xd68d,0xc704,0xf59f,0xe416,0x90a9,0x8120,0xb3bb,0xa232, + 0x5ac5,0x4b4c,0x79d7,0x685e,0x1ce1,0x0d68,0x3ff3,0x2e7a, + 0xe70e,0xf687,0xc41c,0xd595,0xa12a,0xb0a3,0x8238,0x93b1, + 0x6b46,0x7acf,0x4854,0x59dd,0x2d62,0x3ceb,0x0e70,0x1ff9, + 0xf78f,0xe606,0xd49d,0xc514,0xb1ab,0xa022,0x92b9,0x8330, + 0x7bc7,0x6a4e,0x58d5,0x495c,0x3de3,0x2c6a,0x1ef1,0x0f78 +}; + +#endif diff --git a/radio/src/dataconstants.h b/radio/src/dataconstants.h index 012fcc799..8e05ce0a4 100644 --- a/radio/src/dataconstants.h +++ b/radio/src/dataconstants.h @@ -478,17 +478,6 @@ enum SwitchSources { SWSRC_SR2, #endif -#if defined(STORAGE_SWITCH_GMBL) - SWSRC_GMBL0, - SWSRC_GMBL1, - SWSRC_GMBL2, -#endif - -#if defined(STORAGE_SWITCH_GMBR) - SWSRC_GMBR0, - SWSRC_GMBR1, - SWSRC_GMBR2, -#endif #if defined(PCBSKY9X) SWSRC_ID0 = SWSRC_FIRST_SWITCH, @@ -552,6 +541,8 @@ enum SwitchSources { SWSRC_FIRST_SENSOR, SWSRC_LAST_SENSOR = SWSRC_FIRST_SENSOR+MAX_TELEMETRY_SENSORS-1, + SWSRC_RADIO_ACTIVITY, + #if defined(DEBUG_LATENCY) SWSRC_LATENCY_TOGGLE, #endif @@ -602,19 +593,21 @@ enum MixSources { MIXSRC_S1 = MIXSRC_FIRST_POT, LUA_EXPORT("s1", "Potentiometer S1") MIXSRC_6POS, LUA_EXPORT("6pos", "Multipos Switch") MIXSRC_S2, LUA_EXPORT("s2", "Potentiometer S2") - MIXSRC_FIRST_SLIDER, - MIXSRC_S3 = MIXSRC_FIRST_SLIDER, LUA_EXPORT("s3", "Slider S3") - MIXSRC_S4, LUA_EXPORT("s4", "Slider S4") -#if defined(PCBX12S) - MIXSRC_LS, LUA_EXPORT("ls", "Left rear slider") - MIXSRC_RS, LUA_EXPORT("rs", "Right rear slider") - MIXSRC_LAST_POT = MIXSRC_RS, -#endif #if defined(PCBX10) MIXSRC_EXT1, LUA_EXPORT("ext1", "Ext 1") MIXSRC_EXT2, LUA_EXPORT("ext2", "Ext 2") - MIXSRC_LAST_POT = MIXSRC_EXT2, #endif + MIXSRC_FIRST_SLIDER, +#if defined(PCBX12S) + MIXSRC_S3 = MIXSRC_FIRST_SLIDER, LUA_EXPORT("s3", "Slider S3") + MIXSRC_S4, LUA_EXPORT("s4", "Slider S4") + MIXSRC_LS, LUA_EXPORT("ls", "Left rear slider") + MIXSRC_RS, LUA_EXPORT("rs", "Right rear slider") +#else + MIXSRC_LS = MIXSRC_FIRST_SLIDER, LUA_EXPORT("ls", "Left slider") + MIXSRC_RS, LUA_EXPORT("rs", "Right slider") +#endif + MIXSRC_LAST_POT = MIXSRC_RS, #elif defined(PCBX9E) MIXSRC_POT1 = MIXSRC_FIRST_POT, LUA_EXPORT("s1", "Potentiometer 1") MIXSRC_POT2, LUA_EXPORT("s2", "Potentiometer 2") @@ -680,34 +673,47 @@ enum MixSources { MIXSRC_FIRST_SWITCH, -#if defined(PCBHORUS) || defined(PCBTARANIS) +#if defined(HARDWARE_SWITCH_A) MIXSRC_SA = MIXSRC_FIRST_SWITCH, LUA_EXPORT("sa", "Switch A") MIXSRC_SB, LUA_EXPORT("sb", "Switch B") MIXSRC_SC, LUA_EXPORT("sc", "Switch C") +#endif +#if defined(HARDWARE_SWITCH_D) MIXSRC_SD, LUA_EXPORT("sd", "Switch D") +#elif defined(STORAGE_SWITCH_D) + MIXSRC_SD, #endif -#if defined(PCBHORUS) || defined(PCBX9) || defined(PCBXLITES) +#if defined(HARDWARE_SWITCH_E) MIXSRC_SE, LUA_EXPORT("se", "Switch E") +#elif defined(STORAGE_SWITCH_E) + MIXSRC_SE, #endif -#if defined(PCBHORUS) || defined(PCBX9D) || defined(PCBX9DP) || defined(PCBX9E) || defined(PCBX7) || defined(PCBXLITES) +#if defined(HARDWARE_SWITCH_F) MIXSRC_SF, LUA_EXPORT("sf", "Switch F") +#elif defined(STORAGE_SWITCH_F) + MIXSRC_SF, #endif -#if defined(PCBHORUS) || defined(PCBX9D) || defined(PCBX9DP) || defined(PCBX9E) +#if defined(HARDWARE_SWITCH_G) MIXSRC_SG, LUA_EXPORT("sg", "Switch G") +#elif defined(STORAGE_SWITCH_G) + MIXSRC_SG, #endif -#if defined(PCBHORUS) || defined(PCBX9D) || defined(PCBX9DP) || defined(PCBX9E) || defined(PCBX7) +#if defined(HARDWARE_SWITCH_H) MIXSRC_SH, LUA_EXPORT("sh", "Switch H") +#elif defined(STORAGE_SWITCH_H) + MIXSRC_SH, #endif -#if defined(RADIO_X7) +#if defined(HARDWARE_SWITCH_I) MIXSRC_SI, LUA_EXPORT("si", "Switch I") - MIXSRC_SJ, LUA_EXPORT("sj", "Switch J") -#elif defined(RADIO_T12) // keep switches for eeprom compatibity, but hide them +#elif defined(STORAGE_SWITCH_I) MIXSRC_SI, +#endif +#if defined(HARDWARE_SWITCH_J) + MIXSRC_SJ, LUA_EXPORT("sj", "Switch J") +#elif defined(STORAGE_SWITCH_J) MIXSRC_SJ, #endif -#if defined(PCBX9E) - MIXSRC_SI, LUA_EXPORT("si", "Switch I") - MIXSRC_SJ, LUA_EXPORT("sj", "Switch J") +#if defined(HARDWARE_SWITCH_K) MIXSRC_SK, LUA_EXPORT("sk", "Switch K") MIXSRC_SL, LUA_EXPORT("sl", "Switch L") MIXSRC_SM, LUA_EXPORT("sm", "Switch M") @@ -717,10 +723,6 @@ enum MixSources { MIXSRC_SQ, LUA_EXPORT("sq", "Switch Q") MIXSRC_SR, LUA_EXPORT("sr", "Switch R") #endif -#if defined(PCBHORUS) - MIXSRC_GMBL, LUA_EXPORT("gmbl", "Switch Left gimbal") - MIXSRC_GMBR, LUA_EXPORT("gmbr", "Switch right gimbal") -#endif #if defined(PCBSKY9X) MIXSRC_3POS = MIXSRC_FIRST_SWITCH, MIXSRC_THR, @@ -783,7 +785,7 @@ enum MixSources { }; #if defined(__cplusplus) -static_assert(MIXSRC_FIRST_LOGICAL_SWITCH == MIXSRC_FIRST_SWITCH + NUM_SWITCHES, "Wrong switches definition in MIXSRC list"); +static_assert(MIXSRC_FIRST_LOGICAL_SWITCH == MIXSRC_FIRST_SWITCH + STORAGE_NUM_SWITCHES, "Wrong switches definition in MIXSRC list"); #endif #define MIXSRC_FIRST (MIXSRC_NONE + 1) @@ -886,4 +888,4 @@ enum BluetoothModes { #define PXX2_LEN_RX_NAME 8 #define PXX2_MAX_RECEIVERS_PER_MODULE 3 -#endif // _DATACONSTANTS_H_ \ No newline at end of file +#endif // _DATACONSTANTS_H_ diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index 833abd52c..88ce4159c 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -115,7 +115,7 @@ PACK(struct ExpoData { PACK(struct LimitData { int32_t min:11; int32_t max:11; - int32_t ppmCenter:10; + int32_t ppmCenter:10; // TODO can be reduced to 8 bits int16_t offset:11; uint16_t symetrical:1; uint16_t revert:1; @@ -334,7 +334,8 @@ PACK(struct TelemetrySensor { }; char label[TELEM_LABEL_LEN]; // user defined label uint8_t subId; - uint8_t type:2; // 0=custom / 1=calculated// user can choose what unit to display each value in + uint8_t type:1; // 0=custom / 1=calculated // user can choose what unit to display each value in + uint8_t spare1:1; uint8_t unit:6; uint8_t prec:2; uint8_t autoOffset:1; @@ -342,7 +343,7 @@ PACK(struct TelemetrySensor { uint8_t logs:1; uint8_t persistent:1; uint8_t onlyPositive:1; - uint8_t spare:1; + uint8_t spare2:1; union { NOBACKUP(PACK(struct { uint16_t ratio; @@ -497,16 +498,20 @@ PACK(struct ModelHeader { }); #if defined(COLORLCD) -typedef uint16_t swconfig_t; +typedef uint32_t swconfig_t; typedef uint32_t swarnstate_t; #elif defined(PCBX9E) typedef uint64_t swconfig_t; typedef uint64_t swarnstate_t; typedef uint32_t swarnenable_t; +#elif defined(PCBX9D) || defined(PCBX9DP) +typedef uint32_t swconfig_t; +typedef uint32_t swarnstate_t; +typedef uint16_t swarnenable_t; // TODO remove it in 2.4 #elif defined(PCBTARANIS) typedef uint16_t swconfig_t; typedef uint16_t swarnstate_t; -typedef uint8_t swarnenable_t; +typedef uint8_t swarnenable_t; // TODO remove it in 2.4 #else typedef uint8_t swarnstate_t; typedef uint8_t swarnenable_t; @@ -518,7 +523,7 @@ typedef uint8_t swarnenable_t; #else #define SWITCHES_WARNING_DATA \ swarnstate_t switchWarningState; \ - swarnenable_t switchWarningEnable; + swarnenable_t switchWarningEnable; // TODO remove it in 2.4 #endif #if defined(PCBHORUS) @@ -662,19 +667,19 @@ PACK(struct TrainerData { #if defined(PCBHORUS) #define EXTRA_GENERAL_FIELDS \ NOBACKUP(uint8_t auxSerialMode); \ - uint32_t switchConfig; \ + swconfig_t switchConfig; \ uint16_t potsConfig; /* two bits per pot */ \ uint8_t slidersConfig; /* 1 bit per slider */ \ NOBACKUP(char switchNames[STORAGE_NUM_SWITCHES][LEN_SWITCH_NAME]); \ NOBACKUP(char anaNames[NUM_STICKS + STORAGE_NUM_POTS + STORAGE_NUM_SLIDERS][LEN_ANA_NAME]); \ NOBACKUP(char currModelFilename[LEN_MODEL_FILENAME+1]); \ - NOBACKUP(uint8_t spare:1); \ + NOBACKUP(uint8_t spare4:1); \ NOBACKUP(uint8_t blOffBright:7); \ NOBACKUP(char bluetoothName[LEN_BLUETOOTH_NAME]); #elif defined(PCBTARANIS) - #if defined(BLUETOOTH) + #if defined(STORAGE_BLUETOOTH) #define BLUETOOTH_FIELDS \ - uint8_t spare; \ + uint8_t spare4; \ char bluetoothName[LEN_BLUETOOTH_NAME]; #else #define BLUETOOTH_FIELDS @@ -692,7 +697,7 @@ PACK(struct TrainerData { #elif defined(PCBSKY9X) #define EXTRA_GENERAL_FIELDS \ int8_t txCurrentCalibration; \ - int8_t temperatureWarn; \ + int8_t spare4; \ uint8_t mAhWarn; \ uint16_t mAhUsed; \ int8_t temperatureCalib; \ @@ -718,7 +723,7 @@ PACK(struct TrainerData { #if defined(BUZZER) #define BUZZER_FIELD int8_t buzzerMode:2 // -2=quiet, -1=only alarms, 0=no keys, 1=all (only used on AVR radios without audio hardware) #else - #define BUZZER_FIELD int8_t spareRadio:2 + #define BUZZER_FIELD int8_t spare3:2 #endif PACK(struct RadioData { @@ -751,7 +756,7 @@ PACK(struct RadioData { NOBACKUP(uint8_t templateSetup); // RETA order for receiver channels NOBACKUP(int8_t PPM_Multiplier); NOBACKUP(int8_t hapticLength); - N_HORUS_FIELD(N_TARANIS_FIELD(uint8_t reNavigation)); + N_HORUS_FIELD(N_TARANIS_FIELD(uint8_t spare1)); N_HORUS_FIELD(N_TARANIS_FIELD(uint8_t stickReverse)); NOBACKUP(int8_t beepLength:3); NOBACKUP(int8_t hapticStrength:3); @@ -766,13 +771,15 @@ PACK(struct RadioData { NOBACKUP(uint32_t globalTimer); NOBACKUP(uint8_t bluetoothBaudrate:4); NOBACKUP(uint8_t bluetoothMode:4); - NOBACKUP(uint8_t countryCode); + NOBACKUP(uint8_t countryCode:2); + NOBACKUP(int8_t pwrOnSpeed:3); + NOBACKUP(int8_t pwrOffSpeed:3); NOBACKUP(uint8_t imperial:1); NOBACKUP(uint8_t jitterFilter:1); /* 0 - active */ NOBACKUP(uint8_t disableRssiPoweroffAlarm:1); NOBACKUP(uint8_t USBMode:2); NOBACKUP(uint8_t jackMode:2); - NOBACKUP(uint8_t spareExtraArm:1); + NOBACKUP(uint8_t spare2:1); NOBACKUP(char ttsLanguage[2]); NOBACKUP(int8_t beepVolume:4); NOBACKUP(int8_t wavVolume:4); @@ -918,8 +925,8 @@ static inline void check_struct() CHKSIZE(RadioData, 960); CHKSIZE(ModelData, 6614); #elif defined(PCBX9D) || defined(PCBX9DP) - CHKSIZE(RadioData, 880); - CHKSIZE(ModelData, 6601); + CHKSIZE(RadioData, 898); + CHKSIZE(ModelData, 6604); #elif defined(PCBSKY9X) CHKSIZE(RadioData, 735); CHKSIZE(ModelData, 5301); diff --git a/radio/src/targets/taranis/board_preinit.cpp b/radio/src/debounce.h similarity index 56% rename from radio/src/targets/taranis/board_preinit.cpp rename to radio/src/debounce.h index 743dff65f..f7b1559bc 100644 --- a/radio/src/targets/taranis/board_preinit.cpp +++ b/radio/src/debounce.h @@ -18,20 +18,38 @@ * GNU General Public License for more details. */ +#ifndef _DEBOUNCE_H_ +#define _DEBOUNCE_H_ + #include "board.h" -void boardPreInit() +template +class Debounce { -#if defined(INTMODULE_BOOTCMD_GPIO) - GPIO_InitTypeDef GPIO_InitStructure; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; + public: + T debounce(T state) + { + if (state == lastState) + debouncedState = state; + else + lastState = state; + return debouncedState; + } + private: + T lastState; + T debouncedState; +}; - GPIO_SetBits(INTMODULE_BOOTCMD_GPIO, INTMODULE_BOOTCMD_GPIO_PIN); - GPIO_InitStructure.GPIO_Pin = INTMODULE_BOOTCMD_GPIO_PIN; - GPIO_Init(INTMODULE_BOOTCMD_GPIO, &GPIO_InitStructure); +#if defined(STM32) +class PinDebounce: public Debounce +{ + public: + uint8_t debounce(GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin) + { + return Debounce::debounce(GPIO_ReadInputDataBit(GPIOx, GPIO_Pin)); + } +}; #endif -} + +#endif // _DEBOUNCE_H_ diff --git a/radio/src/debug.h b/radio/src/debug.h index 2fee847ee..3a5303ef3 100644 --- a/radio/src/debug.h +++ b/radio/src/debug.h @@ -45,7 +45,7 @@ uint8_t auxSerialTracesEnabled(); #define debugPrintf(...) printf(__VA_ARGS__) #elif defined(DEBUG) && defined(CLI) #define debugPrintf(...) do { if (cliTracesEnabled) serialPrintf(__VA_ARGS__); } while(0) -#elif defined(DEBUG) && defined(AUX_SERIAL) +#elif defined(DEBUG) #define debugPrintf(...) do { serialPrintf(__VA_ARGS__); } while(0) #else #define debugPrintf(...) diff --git a/radio/src/definitions.h b/radio/src/definitions.h index 8b5f5391e..4a7244faa 100644 --- a/radio/src/definitions.h +++ b/radio/src/definitions.h @@ -67,4 +67,8 @@ #define CONVERT_UINT_PTR(x) ((uint32_t *)(x)) #endif +#if !defined(DIM) + #define DIM(__arr) (sizeof((__arr)) / sizeof((__arr)[0])) +#endif + #endif // _DEFINITIONS_H_ diff --git a/radio/src/dump.cpp b/radio/src/dump.cpp index c189444db..60152a3af 100644 --- a/radio/src/dump.cpp +++ b/radio/src/dump.cpp @@ -34,10 +34,10 @@ void dumpStart(unsigned int size) dumpPosition = 0; } -void dumpBody(const uint8_t *data, unsigned int size) +void dumpBody(const void *data, unsigned int size) { for (unsigned int i=0; i= 0 && x < LCD_W) { uint8_t b[5] = { 0 }; if (i==0) { if (x==0 || !inv) { @@ -452,12 +452,12 @@ void lcdDraw8bitsNumber(coord_t x, coord_t y, int8_t val) lcdDrawNumber(x, y, val); } -void lcdDrawNumber(coord_t x, coord_t y, lcdint_t val, LcdFlags flags) +void lcdDrawNumber(coord_t x, coord_t y, int val, LcdFlags flags) { lcdDrawNumber(x, y, val, flags, 0); } -void lcdDrawNumber(coord_t x, coord_t y, lcdint_t val, LcdFlags flags, uint8_t len) +void lcdDrawNumber(coord_t x, coord_t y, int val, LcdFlags flags, uint8_t len) { char str[16+1]; char *s = str+16; @@ -540,7 +540,7 @@ void lcdDrawLine(coord_t x1, coord_t y1, coord_t x2, coord_t y2, uint8_t pat, Lc #endif -void lcdDrawVerticalLine(coord_t x, scoord_t y, scoord_t h, uint8_t pat, LcdFlags att) +void lcdDrawVerticalLine(coord_t x, coord_t y, coord_t h, uint8_t pat, LcdFlags att) { if (x >= LCD_W) return; // should never happen on 9X @@ -576,7 +576,7 @@ void lcdDrawVerticalLine(coord_t x, scoord_t y, scoord_t h, uint8_t pat, LcdFlag } } -void lcdDrawSolidVerticalLine(coord_t x, scoord_t y, scoord_t h, LcdFlags att) +void lcdDrawSolidVerticalLine(coord_t x, coord_t y, coord_t h, LcdFlags att) { lcdDrawVerticalLine(x, y, h, SOLID, att); } @@ -591,9 +591,9 @@ void lcdDrawRect(coord_t x, coord_t y, coord_t w, coord_t h, uint8_t pat, LcdFla } #if !defined(BOOT) -void lcdDrawFilledRect(coord_t x, scoord_t y, coord_t w, coord_t h, uint8_t pat, LcdFlags att) +void lcdDrawFilledRect(coord_t x, coord_t y, coord_t w, coord_t h, uint8_t pat, LcdFlags att) { - for (scoord_t i=y; i<(scoord_t)(y+h); i++) { // cast to scoord_t needed otherwise (y+h) is promoted to int (see #5055) + for (coord_t i=y; i= 0) { if (mode < TMRMODE_COUNT) @@ -841,7 +841,7 @@ void drawShortTrimMode(coord_t x, coord_t y, uint8_t fm, uint8_t idx, LcdFlags a } } -void drawValueWithUnit(coord_t x, coord_t y, lcdint_t val, uint8_t unit, LcdFlags att) +void drawValueWithUnit(coord_t x, coord_t y, int val, uint8_t unit, LcdFlags att) { // convertUnit(val, unit); lcdDrawNumber(x, y, val, att & (~NO_UNIT)); diff --git a/radio/src/gui/128x64/lcd.h b/radio/src/gui/128x64/lcd.h index e94fc8270..06ad69728 100644 --- a/radio/src/gui/128x64/lcd.h +++ b/radio/src/gui/128x64/lcd.h @@ -23,15 +23,14 @@ #include +typedef int coord_t; +typedef uint32_t LcdFlags; +typedef uint8_t display_t; + #define BOX_WIDTH 23 -#define coord_t uint8_t -#define scoord_t int8_t #define CENTER #define CENTER_OFS 0 - typedef int32_t lcdint_t; - typedef uint32_t lcduint_t; - #define FW 6 #define FWNUM 5 #define FH 8 @@ -89,9 +88,6 @@ #define TIMEHOUR 0x2000 #define STREXPANDED 0x4000 -typedef uint32_t LcdFlags; - -#define display_t uint8_t #define DISPLAY_BUFFER_SIZE (LCD_W*((LCD_H+7)/8)) extern display_t displayBuf[DISPLAY_BUFFER_SIZE]; @@ -122,19 +118,17 @@ void lcdDrawTextAlignedLeft(coord_t y, const char * s); void lcdDrawHexNumber(coord_t x, coord_t y, uint32_t val, LcdFlags mode=0); void lcdDrawHexChar(coord_t x, coord_t y, uint8_t val, LcdFlags flags=0); -void lcdDrawNumber(coord_t x, coord_t y, lcdint_t val, LcdFlags mode, uint8_t len); -void lcdDrawNumber(coord_t x, coord_t y, lcdint_t val, LcdFlags mode=0); +void lcdDrawNumber(coord_t x, coord_t y, int val, LcdFlags mode, uint8_t len); +void lcdDrawNumber(coord_t x, coord_t y, int val, LcdFlags mode=0); void lcdDraw8bitsNumber(coord_t x, coord_t y, int8_t val); -void drawStringWithIndex(coord_t x, coord_t y, const char * str, uint8_t idx, LcdFlags att=0); void putsModelName(coord_t x, coord_t y, char * name, uint8_t id, LcdFlags att); -void drawPower(coord_t x, coord_t y, int8_t dBm, LcdFlags att = 0); #if !defined(BOOT) // TODO not here ... void drawSwitch(coord_t x, coord_t y, swsrc_t swtch, LcdFlags att=0); void drawSource(coord_t x, coord_t y, mixsrc_t idx, LcdFlags att=0); #endif void drawCurveName(coord_t x, coord_t y, int8_t idx, LcdFlags att=0); -void drawTimerMode(coord_t x, coord_t y, int8_t mode, LcdFlags att=0); +void drawTimerMode(coord_t x, coord_t y, swsrc_t mode, LcdFlags att=0); void drawTrimMode(coord_t x, coord_t y, uint8_t phase, uint8_t idx, LcdFlags att); void drawShortTrimMode(coord_t x, coord_t y, uint8_t mode, uint8_t idx, LcdFlags att); @@ -145,18 +139,6 @@ void putsChnLetter(coord_t x, coord_t y, uint8_t idx, LcdFlags attr); void putsVolts(coord_t x, coord_t y, uint16_t volts, LcdFlags att); void putsVBat(coord_t x, coord_t y, LcdFlags att); - - #define putstime_t int32_t - #define FlightModesType uint16_t - -void drawRtcTime(coord_t x, coord_t y, LcdFlags att); -void drawTimer(coord_t x, coord_t y, putstime_t tme, LcdFlags att, LcdFlags att2); -void drawReceiverName(coord_t x, coord_t y, uint8_t moduleIdx, uint8_t receiverIdx, LcdFlags flags=0); -inline void drawTimer(coord_t x, coord_t y, putstime_t tme, LcdFlags att) -{ - drawTimer(x, y, tme, att, att); -} - #define SOLID 0xff #define DOTTED 0x55 @@ -164,13 +146,11 @@ void lcdDrawPoint(coord_t x, coord_t y, LcdFlags att=0); void lcdMaskPoint(uint8_t *p, uint8_t mask, LcdFlags att=0); void lcdDrawSolidHorizontalLine(coord_t x, coord_t y, coord_t w, LcdFlags att=0); void lcdDrawHorizontalLine(coord_t x, coord_t y, coord_t w, uint8_t pat, LcdFlags att=0); - void lcdDrawSolidVerticalLine(coord_t x, scoord_t y, scoord_t h, LcdFlags att=0); - void lcdDrawVerticalLine(coord_t x, scoord_t y, scoord_t h, uint8_t pat, LcdFlags att=0); - - void lcdDrawLine(coord_t x1, coord_t y1, coord_t x2, coord_t y2, uint8_t pat=SOLID, LcdFlags att=0); - -void lcdDrawFilledRect(coord_t x, scoord_t y, coord_t w, coord_t h, uint8_t pat=SOLID, LcdFlags att=0); -inline void lcdDrawSolidFilledRect(coord_t x, scoord_t y, coord_t w, coord_t h, LcdFlags att=0) +void lcdDrawSolidVerticalLine(coord_t x, coord_t y, coord_t h, LcdFlags att=0); +void lcdDrawVerticalLine(coord_t x, coord_t y, coord_t h, uint8_t pat, LcdFlags att=0); +void lcdDrawLine(coord_t x1, coord_t y1, coord_t x2, coord_t y2, uint8_t pat=SOLID, LcdFlags att=0); +void lcdDrawFilledRect(coord_t x, coord_t y, coord_t w, coord_t h, uint8_t pat=SOLID, LcdFlags att=0); +inline void lcdDrawSolidFilledRect(coord_t x, coord_t y, coord_t w, coord_t h, LcdFlags att=0) { lcdDrawFilledRect(x, y, w, h, SOLID, att); } @@ -178,7 +158,10 @@ void lcdDrawRect(coord_t x, coord_t y, coord_t w, coord_t h, uint8_t pat=SOLID, void lcdInvertLine(int8_t line); #define lcdInvertLastLine() lcdInvertLine(LCD_LINES-1) -inline void lcdDrawSquare(coord_t x, coord_t y, coord_t w, LcdFlags att=0) { lcdDrawRect(x, y, w, w, SOLID, att); } +inline void lcdDrawSquare(coord_t x, coord_t y, coord_t w, LcdFlags att=0) +{ + lcdDrawRect(x, y, w, w, SOLID, att); +} void drawTelemetryTopBar(); @@ -188,7 +171,7 @@ void drawTelemetryTopBar(); lcdDrawSolidVerticalLine(xx+1,yy-ll,ll) -void lcdClear(void); +void lcdClear(); void lcdDraw1bitBitmap(coord_t x, coord_t y, const unsigned char * img, uint8_t idx, LcdFlags att=0); inline void lcdDrawBitmap(coord_t x, coord_t y, const uint8_t * bitmap) { @@ -216,8 +199,6 @@ inline display_t getPixel(uint8_t x, uint8_t y) const char * writeScreenshot(); -void drawShutdownAnimation(uint32_t index, const char * message); - uint8_t getTextWidth(const char * s, uint8_t len=0, LcdFlags flags=0); #endif // _LCD_H_ diff --git a/radio/src/gui/128x64/menus.h b/radio/src/gui/128x64/menus.h index 39fdf6acd..94f21a27c 100644 --- a/radio/src/gui/128x64/menus.h +++ b/radio/src/gui/128x64/menus.h @@ -52,7 +52,7 @@ enum MenuRadioIndexes { MENU_RADIO_SETUP, CASE_SDCARD(MENU_RADIO_SD_MANAGER) -#if defined(PXX2) +#if defined(LUA) || defined(PXX2) MENU_RADIO_TOOLS, #endif MENU_RADIO_SPECIAL_FUNCTIONS, @@ -78,7 +78,7 @@ void menuRadioCalibration(event_t event); static const MenuHandlerFunc menuTabGeneral[MENU_RADIO_PAGES_COUNT] = { menuRadioSetup, CASE_SDCARD(menuRadioSdManager) -#if defined(PXX2) +#if defined(LUA) || defined(PXX2) menuRadioTools, #endif menuRadioSpecialFunctions, diff --git a/radio/src/gui/128x64/model_display.cpp b/radio/src/gui/128x64/model_display.cpp index 3928c44ef..b9fe1b662 100644 --- a/radio/src/gui/128x64/model_display.cpp +++ b/radio/src/gui/128x64/model_display.cpp @@ -237,11 +237,11 @@ void menuModelDisplay(event_t event) else { for (int c=0; c0) { - value = checkIncDec(event, value, 0, MIXSRC_LAST_TELEM, EE_MODEL|INCDEC_SOURCE|NO_INCDEC_MARKS, isSourceAvailable); + *value = checkIncDec(event, *value, 0, MIXSRC_LAST_TELEM, EE_MODEL|INCDEC_SOURCE|NO_INCDEC_MARKS, isSourceAvailable); } } if (attr && menuHorizontalPosition == NUM_LINE_ITEMS) { diff --git a/radio/src/gui/128x64/model_failsafe.cpp b/radio/src/gui/128x64/model_failsafe.cpp index 8bfb1e43a..d3db3115b 100644 --- a/radio/src/gui/128x64/model_failsafe.cpp +++ b/radio/src/gui/128x64/model_failsafe.cpp @@ -25,17 +25,17 @@ extern uint8_t g_moduleIdx; void onFailsafeMenu(const char * result) { uint8_t sub = menuVerticalPosition; - int16_t & failsafe = g_model.failsafeChannels[sub]; + int16_t * failsafe = &g_model.failsafeChannels[sub]; int32_t channelValue = channelOutputs[sub]; if (result == STR_NONE) { - failsafe = FAILSAFE_CHANNEL_NOPULSE; + *failsafe = FAILSAFE_CHANNEL_NOPULSE; } else if (result == STR_HOLD) { - failsafe = FAILSAFE_CHANNEL_HOLD; + *failsafe = FAILSAFE_CHANNEL_HOLD; } else if (result == STR_CHANNEL2FAILSAFE) { - failsafe = channelValue; + *failsafe = channelValue; } else if (result == STR_CHANNELS2FAILSAFE) { setCustomFailsafe(g_moduleIdx); diff --git a/radio/src/gui/128x64/model_gvars.cpp b/radio/src/gui/128x64/model_gvars.cpp index 5e80cf582..4299469fe 100644 --- a/radio/src/gui/128x64/model_gvars.cpp +++ b/radio/src/gui/128x64/model_gvars.cpp @@ -23,28 +23,28 @@ void editGVarValue(coord_t x, coord_t y, event_t event, uint8_t gvar, uint8_t flightMode, LcdFlags flags) { FlightModeData * fm = &g_model.flightModeData[flightMode]; - gvar_t & v = fm->gvars[gvar]; + gvar_t * v = &fm->gvars[gvar]; int16_t vmin, vmax; - if (v > GVAR_MAX) { - uint8_t fm = v - GVAR_MAX - 1; + if (*v > GVAR_MAX) { + uint8_t fm = *v - GVAR_MAX - 1; if (fm >= flightMode) fm++; drawFlightMode(x, y, fm + 1, flags&(~LEFT)); vmin = GVAR_MAX + 1; vmax = GVAR_MAX + MAX_FLIGHT_MODES - 1; } else { - drawGVarValue(x, y, gvar, v, flags); + drawGVarValue(x, y, gvar, *v, flags); vmin = GVAR_MIN + g_model.gvars[gvar].min; vmax = GVAR_MAX - g_model.gvars[gvar].max; } if (flags & INVERS) { if (event == EVT_KEY_LONG(KEY_ENTER) && flightMode > 0) { - v = (v > GVAR_MAX ? 0 : GVAR_MAX+1); + *v = (*v > GVAR_MAX ? 0 : GVAR_MAX+1); storageDirty(EE_MODEL); } else if (s_editMode > 0) { - v = checkIncDec(event, v, vmin, vmax, EE_MODEL); + *v = checkIncDec(event, *v, vmin, vmax, EE_MODEL); } } } diff --git a/radio/src/gui/128x64/model_input_edit.cpp b/radio/src/gui/128x64/model_input_edit.cpp index a36a9fc4c..c2e27f738 100644 --- a/radio/src/gui/128x64/model_input_edit.cpp +++ b/radio/src/gui/128x64/model_input_edit.cpp @@ -100,7 +100,7 @@ void menuModelExpoOne(event_t event) break; case EXPO_FIELD_SOURCE: - lcdDrawTextAlignedLeft(y, NO_INDENT(STR_SOURCE)); + lcdDrawTextAlignedLeft(y, STR_SOURCE); drawSource(EXPO_ONE_2ND_COLUMN, y, ed->srcRaw, RIGHT|STREXPANDED|attr); if (attr) ed->srcRaw = checkIncDec(event, ed->srcRaw, INPUTSRC_FIRST, INPUTSRC_LAST, EE_MODEL|INCDEC_SOURCE|NO_INCDEC_MARKS, isInputSourceAvailable); break; @@ -117,7 +117,7 @@ void menuModelExpoOne(event_t event) break; case EXPO_FIELD_OFFSET: - lcdDrawTextAlignedLeft(y, NO_INDENT(STR_OFFSET)); + lcdDrawTextAlignedLeft(y, STR_OFFSET); ed->offset = GVAR_MENU_ITEM(EXPO_ONE_2ND_COLUMN, y, ed->offset, -100, 100, RIGHT | attr, 0, event); break; diff --git a/radio/src/gui/128x64/model_inputs_mixes.cpp b/radio/src/gui/128x64/model_inputs_mixes.cpp index 7fc9d5a44..7a49d67c2 100644 --- a/radio/src/gui/128x64/model_inputs_mixes.cpp +++ b/radio/src/gui/128x64/model_inputs_mixes.cpp @@ -114,7 +114,7 @@ void insertExpoMix(uint8_t expo, uint8_t idx) memmove(mix+1, mix, (MAX_MIXERS-(idx+1))*sizeof(MixData)); memclear(mix, sizeof(MixData)); mix->destCh = s_currCh-1; - mix->srcRaw = (s_currCh > 4 ? MIXSRC_Rud - 1 + s_currCh : MIXSRC_Rud - 1 + channel_order(s_currCh)); + mix->srcRaw = (s_currCh > 4 ? MIXSRC_Rud - 1 + s_currCh : MIXSRC_Rud - 1 + channelOrder(s_currCh)); mix->weight = 100; } resumeMixerCalculations(); @@ -397,7 +397,7 @@ void menuModelMixOne(event_t event) editSingleName(COLUMN_X+MIXES_2ND_COLUMN, y, STR_MIXNAME, md2->name, sizeof(md2->name), event, attr); break; case MIX_FIELD_SOURCE: - drawFieldLabel(COLUMN_X, y, NO_INDENT(STR_SOURCE)); + drawFieldLabel(COLUMN_X, y, STR_SOURCE); drawSource(COLUMN_X+MIXES_2ND_COLUMN, y, md2->srcRaw, STREXPANDED|attr); if (attr) CHECK_INCDEC_MODELSOURCE(event, md2->srcRaw, 1, MIXSRC_LAST); break; @@ -407,7 +407,7 @@ void menuModelMixOne(event_t event) break; case MIX_FIELD_OFFSET: { - drawFieldLabel(COLUMN_X, y, NO_INDENT(STR_OFFSET)); + drawFieldLabel(COLUMN_X, y, STR_OFFSET); u_int8int16_t offset; MD_OFFSET_TO_UNION(md2, offset); offset.word = GVAR_MENU_ITEM(COLUMN_X+MIXES_2ND_COLUMN, y, offset.word, GV_RANGELARGE_OFFSET_NEG, GV_RANGELARGE_OFFSET, attr|LEFT, 0, event); diff --git a/radio/src/gui/128x64/model_mix_edit.cpp b/radio/src/gui/128x64/model_mix_edit.cpp index 7f4aeee03..2a87faa7d 100644 --- a/radio/src/gui/128x64/model_mix_edit.cpp +++ b/radio/src/gui/128x64/model_mix_edit.cpp @@ -110,7 +110,7 @@ void menuModelMixOne(event_t event) break; case MIX_FIELD_SOURCE: - lcdDrawTextAlignedLeft(y, NO_INDENT(STR_SOURCE)); + lcdDrawTextAlignedLeft(y, STR_SOURCE); drawSource(MIXES_2ND_COLUMN, y, md2->srcRaw, STREXPANDED|attr); if (attr) CHECK_INCDEC_MODELSOURCE(event, md2->srcRaw, 1, MIXSRC_LAST); break; @@ -122,7 +122,7 @@ void menuModelMixOne(event_t event) case MIX_FIELD_OFFSET: { - lcdDrawTextAlignedLeft(y, NO_INDENT(STR_OFFSET)); + lcdDrawTextAlignedLeft(y, STR_OFFSET); u_int8int16_t offset; MD_OFFSET_TO_UNION(md2, offset); offset.word = GVAR_MENU_ITEM(MIXES_2ND_COLUMN, y, offset.word, GV_RANGELARGE_OFFSET_NEG, GV_RANGELARGE_OFFSET, attr|LEFT, 0, event); diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index ff9a5378f..04d253064 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -102,6 +102,9 @@ enum MenuModelSetupItems { ITEM_MODEL_SETUP_EXTERNAL_MODULE_TYPE, #if defined(MULTIMODULE) ITEM_MODEL_SETUP_EXTERNAL_MODULE_SUBTYPE, +#endif + ITEM_MODEL_SETUP_EXTERNAL_MODULE_POWER, +#if defined(MULTIMODULE) ITEM_MODEL_SETUP_EXTERNAL_MODULE_STATUS, ITEM_MODEL_SETUP_EXTERNAL_MODULE_SYNCSTATUS, #endif @@ -115,7 +118,6 @@ enum MenuModelSetupItems { #if defined(MULTIMODULE) ITEM_MODEL_SETUP_EXTERNAL_MODULE_AUTOBIND, #endif - ITEM_MODEL_SETUP_EXTERNAL_MODULE_POWER, ITEM_MODEL_SETUP_EXTERNAL_MODULE_FAILSAFE, ITEM_MODEL_SETUP_EXTERNAL_MODULE_PXX2_REGISTER_RANGE, ITEM_MODEL_SETUP_EXTERNAL_MODULE_PXX2_OPTIONS, @@ -132,17 +134,11 @@ enum MenuModelSetupItems { #if defined(PCBTARANIS) ITEM_MODEL_SETUP_TRAINER_LABEL, ITEM_MODEL_SETUP_TRAINER_MODE, -#endif -#if defined(PCBX7) || defined(PCBX9LITE) #if defined(BLUETOOTH) ITEM_MODEL_SETUP_TRAINER_BLUETOOTH, #endif ITEM_MODEL_SETUP_TRAINER_CHANNELS, - ITEM_MODEL_SETUP_TRAINER_PARAMS, -#elif defined(PCBXLITE) - ITEM_MODEL_SETUP_TRAINER_BLUETOOTH, - ITEM_MODEL_SETUP_TRAINER_CHANNELS, - ITEM_MODEL_SETUP_TRAINER_PARAMS, + ITEM_MODEL_SETUP_TRAINER_PPM_PARAMS, #endif ITEM_MODEL_SETUP_LINES_COUNT }; @@ -189,8 +185,6 @@ enum MenuModelSetupItems { #define INTERNAL_MODULE_TYPE_ROWS (0) // Module type + RF protocols #endif -#define EXTERNAL_MODULE_BIND_ROWS ((isModuleXJT(EXTERNAL_MODULE) && IS_D8_RX(EXTERNAL_MODULE)) || isModuleSBUS(EXTERNAL_MODULE)) ? (uint8_t)1 : (isModulePPM(EXTERNAL_MODULE) || isModulePXX(EXTERNAL_MODULE) || isModulePXX2(EXTERNAL_MODULE) || isModuleDSM2(EXTERNAL_MODULE) || isModuleMultimodule(EXTERNAL_MODULE)) ? (uint8_t)2 : HIDDEN_ROW - #if defined(PCBSKY9X) && defined(REVX) #define OUTPUT_TYPE_ROW (isModulePPM(EXTERNAL_MODULE) ? (uint8_t)0 : HIDDEN_ROW), #elif defined(PCBSKY9X) @@ -198,7 +192,7 @@ enum MenuModelSetupItems { #endif #define PORT_CHANNELS_ROWS(x) (x==EXTERNAL_MODULE ? EXTERNAL_MODULE_CHANNELS_ROWS : 0) -#define EXTERNAL_MODULE_TYPE_ROWS (isModulePXX(EXTERNAL_MODULE) || isModulePXX2(EXTERNAL_MODULE) || isModuleDSM2(EXTERNAL_MODULE) || isModuleMultimodule(EXTERNAL_MODULE)) ? (uint8_t)1 : (uint8_t)0 +#define EXTERNAL_MODULE_TYPE_ROWS (isModulePXX1(EXTERNAL_MODULE) || isModulePXX2(EXTERNAL_MODULE) || isModuleDSM2(EXTERNAL_MODULE) || isModuleMultimodule(EXTERNAL_MODULE)) ? (uint8_t)1 : (uint8_t)0 #define POT_WARN_ROWS ((g_model.potsWarnMode) ? (uint8_t)(NUM_POTS+NUM_SLIDERS) : (uint8_t)0) #define TIMER_ROWS 2, 0, 0, 0, 0 @@ -209,35 +203,30 @@ enum MenuModelSetupItems { #define EXTRA_MODULE_ROWS #endif +#define TRAINER_CHANNELS_ROW (IS_SLAVE_TRAINER() ? (IS_BLUETOOTH_TRAINER() ? (uint8_t)0 : (uint8_t)1) : HIDDEN_ROW) +#define TRAINER_PPM_PARAMS_ROW (g_model.trainerData.mode == TRAINER_MODE_SLAVE ? (uint8_t)2 : HIDDEN_ROW) +#define TRAINER_BLUETOOTH_M_ROW ((bluetooth.distantAddr[0] == '\0' || bluetooth.state == BLUETOOTH_STATE_CONNECTED) ? (uint8_t)0 : (uint8_t)1) +#define TRAINER_BLUETOOTH_S_ROW (bluetooth.distantAddr[0] == '\0' ? HIDDEN_ROW : LABEL()) +#define IF_BT_TRAINER_ON(x) (g_eeGeneral.bluetoothMode == BLUETOOTH_TRAINER ? (uint8_t)(x) : HIDDEN_ROW) + #if defined(PCBX7) || defined(PCBX9LITE) #define ANTENNA_ROW #if defined(BLUETOOTH) - #define TRAINER_BLUETOOTH_M_ROW ((bluetooth.distantAddr[0] == '\0' || bluetooth.state == BLUETOOTH_STATE_CONNECTED) ? (uint8_t)0 : (uint8_t)1) - #define TRAINER_BLUETOOTH_S_ROW (bluetooth.distantAddr[0] == '\0' ? HIDDEN_ROW : LABEL()) #define TRAINER_BLUETOOTH_ROW (g_model.trainerData.mode == TRAINER_MODE_MASTER_BLUETOOTH ? TRAINER_BLUETOOTH_M_ROW : (g_model.trainerData.mode == TRAINER_MODE_SLAVE_BLUETOOTH ? TRAINER_BLUETOOTH_S_ROW : HIDDEN_ROW)), #else #define TRAINER_BLUETOOTH_ROW #endif - #define TRAINER_CHANNELS_ROW (IS_SLAVE_TRAINER() ? (uint8_t)1 : HIDDEN_ROW) - #define TRAINER_PARAMS_ROW (IS_SLAVE_TRAINER() ? (uint8_t)2 : HIDDEN_ROW) - #define TRAINER_ROWS LABEL(Trainer), 0, TRAINER_BLUETOOTH_ROW TRAINER_CHANNELS_ROW, TRAINER_PARAMS_ROW + #define TRAINER_PPM_PARAMS_ROW (g_model.trainerData.mode == TRAINER_MODE_SLAVE ? (uint8_t)2 : HIDDEN_ROW) + #define TRAINER_ROWS LABEL(Trainer), 0, TRAINER_BLUETOOTH_ROW TRAINER_CHANNELS_ROW, TRAINER_PPM_PARAMS_ROW #elif defined(PCBXLITES) #define ANTENNA_ROW IF_NOT_PXX2_MODULE(INTERNAL_MODULE, IF_INTERNAL_MODULE_ON(0)), - #define IF_BT_TRAINER_ON(x) (g_eeGeneral.bluetoothMode == BLUETOOTH_TRAINER ? (uint8_t)(x) : HIDDEN_ROW) - #define TRAINER_BLUETOOTH_M_ROW ((bluetooth.distantAddr[0] == '\0' || bluetooth.state == BLUETOOTH_STATE_CONNECTED) ? (uint8_t)0 : (uint8_t)1) - #define TRAINER_BLUETOOTH_S_ROW (bluetooth.distantAddr[0] == '\0' ? HIDDEN_ROW : LABEL()) #define TRAINER_BLUETOOTH_ROW (g_model.trainerData.mode == TRAINER_MODE_MASTER_BLUETOOTH ? TRAINER_BLUETOOTH_M_ROW : (g_model.trainerData.mode == TRAINER_MODE_SLAVE_BLUETOOTH ? TRAINER_BLUETOOTH_S_ROW : HIDDEN_ROW)) - #define TRAINER_CHANNELS_ROW (IS_SLAVE_TRAINER() ? (uint8_t)1 : HIDDEN_ROW) - #define TRAINER_PARAMS_ROW (IS_SLAVE_TRAINER() ? (uint8_t)2 : HIDDEN_ROW) - #define TRAINER_ROWS LABEL(Trainer), 0, IF_BT_TRAINER_ON(TRAINER_BLUETOOTH_ROW), TRAINER_CHANNELS_ROW, TRAINER_PARAMS_ROW + #define TRAINER_PPM_PARAMS_ROW (g_model.trainerData.mode == TRAINER_MODE_SLAVE ? (uint8_t)2 : HIDDEN_ROW) + #define TRAINER_ROWS LABEL(Trainer), 0, IF_BT_TRAINER_ON(TRAINER_BLUETOOTH_ROW), TRAINER_CHANNELS_ROW, TRAINER_PPM_PARAMS_ROW #elif defined(PCBXLITE) #define ANTENNA_ROW IF_NOT_PXX2_MODULE(INTERNAL_MODULE, IF_INTERNAL_MODULE_ON(0)), - #define IF_BT_TRAINER_ON(x) (g_eeGeneral.bluetoothMode == BLUETOOTH_TRAINER ? (uint8_t)(x) : HIDDEN_ROW) - #define TRAINER_BLUETOOTH_M_ROW ((bluetooth.distantAddr[0] == '\0' || bluetooth.state == BLUETOOTH_STATE_CONNECTED) ? (uint8_t)0 : (uint8_t)1) - #define TRAINER_BLUETOOTH_S_ROW (bluetooth.distantAddr[0] == '\0' ? HIDDEN_ROW : LABEL()) #define TRAINER_BLUETOOTH_ROW (g_model.trainerData.mode == TRAINER_MODE_MASTER_BLUETOOTH ? TRAINER_BLUETOOTH_M_ROW : (g_model.trainerData.mode == TRAINER_MODE_SLAVE_BLUETOOTH ? TRAINER_BLUETOOTH_S_ROW : HIDDEN_ROW)) - #define TRAINER_CHANNELS_ROW (IS_SLAVE_TRAINER() ? (uint8_t)1 : HIDDEN_ROW) - #define TRAINER_ROWS IF_BT_TRAINER_ON(LABEL(Trainer)), IF_BT_TRAINER_ON(0), IF_BT_TRAINER_ON(TRAINER_BLUETOOTH_ROW), IF_BT_TRAINER_ON(TRAINER_CHANNELS_ROW) + #define TRAINER_ROWS IF_BT_TRAINER_ON(LABEL(Trainer)), IF_BT_TRAINER_ON(0), IF_BT_TRAINER_ON(TRAINER_BLUETOOTH_ROW), IF_BT_TRAINER_ON(TRAINER_CHANNELS_ROW), HIDDEN_ROW /* xlite has only BT trainer, so never PPM */ #else #define TRAINER_ROWS #endif @@ -268,7 +257,7 @@ void onBluetoothConnectMenu(const char * result) LABEL(InternalModule), \ INTERNAL_MODULE_TYPE_ROWS, \ INTERNAL_MODULE_CHANNELS_ROWS, \ - IF_NOT_ACCESS_MODULE_RF(INTERNAL_MODULE, IF_INTERNAL_MODULE_ON(HAS_RF_PROTOCOL_MODELINDEX(g_model.moduleData[INTERNAL_MODULE].rfProtocol) ? (uint8_t)2 : (uint8_t)1)), \ + IF_NOT_ACCESS_MODULE_RF(INTERNAL_MODULE, IF_INTERNAL_MODULE_ON(isModuleRxNumAvailable(INTERNAL_MODULE) ? (uint8_t)2 : (uint8_t)1)), \ IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 0), /* RxNum */ \ ANTENNA_ROW \ IF_INTERNAL_MODULE_ON(FAILSAFE_ROWS(INTERNAL_MODULE)), /* Failsafe */ \ @@ -281,16 +270,18 @@ void onBluetoothConnectMenu(const char * result) #define INTERNAL_MODULE_ROWS #endif -void menuModelSetup(event_t event) -{ #if defined(EXTERNAL_ANTENNA) - // Switch to external antenna confirmation - if (warningResult) { - warningResult = 0; +void onAntennaSwitchConfirm(const char * result) +{ + if (result == STR_OK) { + // Switch to external antenna confirmation g_model.moduleData[INTERNAL_MODULE].pxx.external_antenna = XJT_EXTERNAL_ANTENNA; } +} #endif +void menuModelSetup(event_t event) +{ int8_t old_editMode = s_editMode; #if defined(PCBTARANIS) @@ -326,13 +317,13 @@ void menuModelSetup(event_t event) LABEL(ExternalModule), EXTERNAL_MODULE_TYPE_ROWS, MULTIMODULE_SUBTYPE_ROWS(EXTERNAL_MODULE) + EXTERNAL_MODULE_POWER_ROW, MULTIMODULE_STATUS_ROWS EXTERNAL_MODULE_CHANNELS_ROWS, IF_NOT_ACCESS_MODULE_RF(EXTERNAL_MODULE, EXTERNAL_MODULE_BIND_ROWS), // line reused for PPM: PPM settings IF_ACCESS_MODULE_RF(EXTERNAL_MODULE, 0), // RxNum IF_NOT_PXX2_MODULE(EXTERNAL_MODULE, EXTERNAL_MODULE_OPTION_ROW), MULTIMODULE_MODULE_ROWS - EXTERNAL_MODULE_POWER_ROW, FAILSAFE_ROWS(EXTERNAL_MODULE), IF_ACCESS_MODULE_RF(EXTERNAL_MODULE, 1), // Range check and Register buttons IF_PXX2_MODULE(EXTERNAL_MODULE, 0), // Module options @@ -363,7 +354,8 @@ void menuModelSetup(event_t event) MENU_CHECK(menuTabModel, MENU_MODEL_SETUP, HEADER_LINE + ITEM_MODEL_SETUP_LINES_COUNT); title(STR_MENUSETUP); - if (event == EVT_ENTRY) { + if (event == EVT_ENTRY || event == EVT_ENTRY_UP) { + memclear(&reusableBuffer.moduleSetup, sizeof(reusableBuffer.moduleSetup)); reusableBuffer.moduleSetup.r9mPower = g_model.moduleData[EXTERNAL_MODULE].pxx.power; } @@ -412,10 +404,12 @@ void menuModelSetup(event_t event) switch (menuHorizontalPosition) { case 0: { - int8_t timerMode = timer->mode; - if (timerMode < 0) timerMode -= TMRMODE_COUNT-1; + swsrc_t timerMode = timer->mode; + if (timerMode < 0) + timerMode -= TMRMODE_COUNT-1; CHECK_INCDEC_MODELVAR_CHECK(event, timerMode, -TMRMODE_COUNT-SWSRC_LAST+1, TMRMODE_COUNT+SWSRC_LAST-1, isSwitchAvailableInTimers); - if (timerMode < 0) timerMode += TMRMODE_COUNT-1; + if (timerMode < 0) + timerMode += TMRMODE_COUNT-1; timer->mode = timerMode; #if defined(AUTOSWITCH) if (s_editMode>0) { @@ -449,7 +443,7 @@ void menuModelSetup(event_t event) case ITEM_MODEL_SETUP_TIMER3_NAME: { TimerData * timer = &g_model.timers[k>=ITEM_MODEL_SETUP_TIMER3 ? 2 : (k>=ITEM_MODEL_SETUP_TIMER2 ? 1 : 0)]; - editSingleName(MODEL_SETUP_2ND_COLUMN, y, STR_TIMER_NAME, timer->name, sizeof(timer->name), event, attr); + editSingleName(MODEL_SETUP_2ND_COLUMN, y, INDENT TR_NAME, timer->name, sizeof(timer->name), event, attr); break; } @@ -458,7 +452,7 @@ void menuModelSetup(event_t event) case ITEM_MODEL_SETUP_TIMER3_MINUTE_BEEP: { TimerData * timer = &g_model.timers[k>=ITEM_MODEL_SETUP_TIMER3 ? 2 : (k>=ITEM_MODEL_SETUP_TIMER2 ? 1 : 0)]; - timer->minuteBeep = editCheckBox(timer->minuteBeep, MODEL_SETUP_2ND_COLUMN, y, STR_MINUTEBEEP, attr, event); + timer->minuteBeep = editCheckBox(timer->minuteBeep, MODEL_SETUP_2ND_COLUMN, y, INDENT TR_MINUTEBEEP, attr, event); break; } @@ -759,13 +753,13 @@ void menuModelSetup(event_t event) case ITEM_MODEL_SETUP_INTERNAL_MODULE_TYPE: { - lcdDrawTextAlignedLeft(y, STR_MODE); + lcdDrawTextAlignedLeft(y, INDENT TR_MODE); #if defined(INTERNAL_MODULE_PXX1) lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_INTERNAL_MODULE_PROTOCOLS, g_model.moduleData[INTERNAL_MODULE].type, menuHorizontalPosition==0 ? attr : 0); if (isModuleXJT(INTERNAL_MODULE)) - lcdDrawTextAtIndex(lcdNextPos + 3, y, STR_ACCST_RF_PROTOCOLS, 1+g_model.moduleData[INTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0); - else if (isModuleXJT2(INTERNAL_MODULE)) - lcdDrawTextAtIndex(lcdNextPos + 3, y, STR_ISRM_PXX2_RF_PROTOCOLS, g_model.moduleData[INTERNAL_MODULE].subType, menuHorizontalPosition==1 ? attr : 0); + lcdDrawTextAtIndex(lcdNextPos + 3, y, STR_XJT_ACCST_RF_PROTOCOLS, 1+g_model.moduleData[INTERNAL_MODULE].subType, menuHorizontalPosition==1 ? attr : 0); + else if (isModuleISRM(INTERNAL_MODULE)) + lcdDrawTextAtIndex(lcdNextPos + 3, y, STR_ISRM_RF_PROTOCOLS, g_model.moduleData[INTERNAL_MODULE].subType, menuHorizontalPosition==1 ? attr : 0); if (attr) { if (menuHorizontalPosition == 0) { uint8_t moduleType = checkIncDec(event, g_model.moduleData[INTERNAL_MODULE].type, MODULE_TYPE_NONE, MODULE_TYPE_MAX, EE_MODEL, isInternalModuleAvailable); @@ -777,7 +771,7 @@ void menuModelSetup(event_t event) } } else if (isModuleXJT(INTERNAL_MODULE)) { - g_model.moduleData[INTERNAL_MODULE].rfProtocol = checkIncDec(event, g_model.moduleData[INTERNAL_MODULE].rfProtocol, 0, MODULE_SUBTYPE_PXX1_LAST, EE_MODEL, isRfProtocolAvailable); + g_model.moduleData[INTERNAL_MODULE].subType = checkIncDec(event, g_model.moduleData[INTERNAL_MODULE].subType, 0, MODULE_SUBTYPE_PXX1_LAST, EE_MODEL, isRfProtocolAvailable); if (checkIncDec_Ret) { g_model.moduleData[0].type = MODULE_TYPE_XJT_PXX1; g_model.moduleData[0].channelsStart = 0; @@ -785,7 +779,7 @@ void menuModelSetup(event_t event) } } else if (isModulePXX2(INTERNAL_MODULE)) { - g_model.moduleData[INTERNAL_MODULE].subType = checkIncDec(event, g_model.moduleData[INTERNAL_MODULE].subType, 0, MODULE_SUBTYPE_ISRM_PXX2_LAST, EE_MODEL, isRfProtocolAvailable); + g_model.moduleData[INTERNAL_MODULE].subType = checkIncDec(event, g_model.moduleData[INTERNAL_MODULE].subType, 0, MODULE_SUBTYPE_ISRM_PXX2_ACCST_D16, EE_MODEL, isRfProtocolAvailable); } } #else @@ -793,9 +787,9 @@ void menuModelSetup(event_t event) if (g_model.moduleData[INTERNAL_MODULE].type == MODULE_TYPE_ISRM_PXX2) { index = 1 + g_model.moduleData[INTERNAL_MODULE].subType; } - lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_ISRM_PXX2_RF_PROTOCOLS, index, attr); + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_ISRM_RF_PROTOCOLS, index, attr); if (attr) { - index = checkIncDec(event, index, 0, MODULE_SUBTYPE_ISRM_PXX2_LAST + 1 /* because of --- */, EE_MODEL); + index = checkIncDec(event, index, 0, MODULE_SUBTYPE_ISRM_PXX2_ACCST_D16 + 1 /* because of --- */, EE_MODEL); if (checkIncDec_Ret) { memclear(&g_model.moduleData[INTERNAL_MODULE], sizeof(ModuleData)); if (index > 0) { @@ -821,13 +815,13 @@ void menuModelSetup(event_t event) break; case ITEM_MODEL_SETUP_EXTERNAL_MODULE_TYPE: - lcdDrawTextAlignedLeft(y, STR_MODE); + lcdDrawTextAlignedLeft(y, INDENT TR_MODE); lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_EXTERNAL_MODULE_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].type, menuHorizontalPosition==0 ? attr : 0); if (isModuleXJT(EXTERNAL_MODULE)) - lcdDrawTextAtIndex(lcdNextPos + 3, y, STR_ACCST_RF_PROTOCOLS, 1+g_model.moduleData[EXTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0); + lcdDrawTextAtIndex(lcdNextPos + 3, y, STR_XJT_ACCST_RF_PROTOCOLS, 1+g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition==1 ? attr : 0); else if (isModuleDSM2(EXTERNAL_MODULE)) lcdDrawTextAtIndex(lcdNextPos + 3, y, STR_DSM_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0); - else if (isModuleR9M(EXTERNAL_MODULE)) + else if (isModuleR9MNonAccess(EXTERNAL_MODULE)) lcdDrawTextAtIndex(lcdNextPos + 3, y, STR_R9M_REGION, g_model.moduleData[EXTERNAL_MODULE].subType, (menuHorizontalPosition==1 ? attr : 0)); #if defined(MULTIMODULE) else if (isModuleMultimodule(EXTERNAL_MODULE)) { @@ -841,7 +835,8 @@ void menuModelSetup(event_t event) if (attr) { if (s_editMode > 0) { switch (menuHorizontalPosition) { - case 0: { + case 0: + { uint8_t moduleType = checkIncDec(event, g_model.moduleData[EXTERNAL_MODULE].type, MODULE_TYPE_NONE, @@ -866,13 +861,18 @@ void menuModelSetup(event_t event) if (isModuleDSM2(EXTERNAL_MODULE)) { CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, DSM2_PROTO_LP45, DSM2_PROTO_DSMX); } - else if (isModuleR9M(EXTERNAL_MODULE)) { + else if (isModuleR9MNonAccess(EXTERNAL_MODULE)) { g_model.moduleData[EXTERNAL_MODULE].subType = checkIncDec(event, g_model.moduleData[EXTERNAL_MODULE].subType, MODULE_SUBTYPE_R9M_FCC, MODULE_SUBTYPE_R9M_LAST, EE_MODEL, isR9MModeAvailable); + if (checkIncDec_Ret) { + g_model.moduleData[EXTERNAL_MODULE].pxx.power = 0; + g_model.moduleData[EXTERNAL_MODULE].channelsStart = 0; + g_model.moduleData[EXTERNAL_MODULE].channelsCount = defaultModuleChannels_M8(EXTERNAL_MODULE); + } } #if defined(MULTIMODULE) @@ -896,7 +896,7 @@ void menuModelSetup(event_t event) } #endif else { - CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, 0, MODULE_SUBTYPE_PXX1_LAST); + CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, MODULE_SUBTYPE_PXX1_LAST); } if (checkIncDec_Ret) { @@ -905,22 +905,26 @@ void menuModelSetup(event_t event) } } } +#if POPUP_LEVEL > 1 else if (old_editMode > 0) { - if (isModuleR9M(EXTERNAL_MODULE)) { + if (isModuleR9MNonAccess(EXTERNAL_MODULE)) { if (g_model.moduleData[EXTERNAL_MODULE].subType > MODULE_SUBTYPE_R9M_EU) { - POPUP_WARNING(STR_R9M_PROTO_FLEX_WARN1); - SET_WARNING_INFO(STR_R9M_PROTO_WARN2, sizeof(TR_R9M_PROTO_WARN2), 0); + POPUP_WARNING(STR_R9M_PROTO_FLEX_WARN_LINE1); + SET_WARNING_INFO(STR_R9M_PROTO_WARN_LINE2, sizeof(TR_R9M_PROTO_WARN_LINE2) - 1, 0); } +#if POPUP_LEVEL >= 3 else if (g_model.moduleData[EXTERNAL_MODULE].subType == MODULE_SUBTYPE_R9M_EU) { - POPUP_WARNING(STR_R9M_PROTO_EU_WARN1); - SET_WARNING_INFO(STR_R9M_PROTO_WARN2, sizeof(TR_R9M_PROTO_WARN2), 0); + POPUP_WARNING(STR_R9M_PROTO_EU_WARN_LINE1); + SET_WARNING_INFO(STR_R9M_PROTO_WARN_LINE2, sizeof(TR_R9M_PROTO_WARN_LINE2) - 1, 0); } else { - POPUP_WARNING(STR_R9M_PROTO_FCC_WARN1); - SET_WARNING_INFO(STR_R9M_PROTO_WARN2, sizeof(TR_R9M_PROTO_WARN2), 0); + POPUP_WARNING(STR_R9M_PROTO_FCC_WARN_LINE1); + SET_WARNING_INFO(STR_R9M_PROTO_WARN_LINE2, sizeof(TR_R9M_PROTO_WARN_LINE2) - 1, 0); } +#endif } } +#endif } break; @@ -932,8 +936,8 @@ void menuModelSetup(event_t event) const mm_protocol_definition * pdef = getMultiProtocolDefinition(multi_rfProto); if (multi_rfProto == MM_RF_CUSTOM_SELECTED) { - lcdDrawNumber(MODEL_SETUP_2ND_COLUMN + 3 * FW, y, g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false), RIGHT | (menuHorizontalPosition == 0 ? attr : 0), 2); - lcdDrawNumber(MODEL_SETUP_2ND_COLUMN + 5 * FW, y, g_model.moduleData[EXTERNAL_MODULE].subType, RIGHT | (menuHorizontalPosition == 1 ? attr : 0), 2); + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false), (menuHorizontalPosition == 0 ? attr : 0), 2); + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN + 3 * FW, y, g_model.moduleData[EXTERNAL_MODULE].subType, (menuHorizontalPosition == 1 ? attr : 0), 2); } else { if (pdef->subTypeString != nullptr) @@ -963,14 +967,14 @@ void menuModelSetup(event_t event) break; case ITEM_MODEL_SETUP_TRAINER_MODE: - lcdDrawTextAlignedLeft(y, STR_MODE); + lcdDrawTextAlignedLeft(y, INDENT TR_MODE); lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_VTRAINERMODES, g_model.trainerData.mode, attr); if (attr) { g_model.trainerData.mode = checkIncDec(event, g_model.trainerData.mode, 0, TRAINER_MODE_MAX(), EE_MODEL, isTrainerModeAvailable); #if defined(BLUETOOTH) if (checkIncDec_Ret) { bluetooth.state = BLUETOOTH_STATE_OFF; - bluetooth.distantAddr[0] = 0; + bluetooth.distantAddr[0] = '\0'; } #endif } @@ -1063,6 +1067,9 @@ void menuModelSetup(event_t event) lcdDrawNumber(lcdLastRightPos, y, moduleData.channelsStart+1, LEFT | (menuHorizontalPosition==0 ? attr : 0)); lcdDrawChar(lcdLastRightPos, y, '-'); lcdDrawNumber(lcdLastRightPos + FW+1, y, moduleData.channelsStart+sentModuleChannels(moduleIdx), LEFT | (menuHorizontalPosition==1 ? attr : 0)); + const char * delay = getModuleDelay(moduleIdx); + if (delay) + lcdDrawText(lcdLastRightPos+4, y, delay, SMLSIZE); if (attr && s_editMode > 0) { switch (menuHorizontalPosition) { case 0: @@ -1070,7 +1077,7 @@ void menuModelSetup(event_t event) break; case 1: CHECK_INCDEC_MODELVAR_CHECK(event, moduleData.channelsCount, -4, min(maxModuleChannels_M8(moduleIdx), 32-8-moduleData.channelsStart), moduleData.type == MODULE_TYPE_ISRM_PXX2 ? isPxx2IsrmChannelsCountAllowed : nullptr); - if (k == ITEM_MODEL_SETUP_EXTERNAL_MODULE_CHANNELS && g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_PPM) { + if (checkIncDec_Ret && moduleData.type == MODULE_TYPE_PPM) { SET_DEFAULT_PPM_FRAME_LENGTH(moduleIdx); } break; @@ -1081,7 +1088,7 @@ void menuModelSetup(event_t event) } #if defined(PCBX7) || defined(PCBX9LITE) || defined(PCBXLITE) - case ITEM_MODEL_SETUP_TRAINER_PARAMS: + case ITEM_MODEL_SETUP_TRAINER_PPM_PARAMS: lcdDrawTextAlignedLeft(y, STR_PPMFRAME); lcdDrawText(MODEL_SETUP_2ND_COLUMN+3*FW, y, STR_MS); lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, (int16_t)g_model.trainerData.frameLength*5 + 225, (menuHorizontalPosition<=0 ? attr : 0) | PREC1|LEFT); @@ -1117,10 +1124,10 @@ void menuModelSetup(event_t event) case ITEM_MODEL_SETUP_EXTERNAL_MODULE_PXX2_MODEL_NUM: { uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); - lcdDrawTextAlignedLeft(y, STR_RECEIVER_NUM); + lcdDrawText(INDENT_WIDTH, y, STR_RECEIVER_NUM); lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.header.modelId[moduleIdx], attr | LEADING0 | LEFT, 2); if (attr) { - CHECK_INCDEC_MODELVAR_ZERO(event, g_model.header.modelId[moduleIdx], MAX_RX_NUM(moduleIdx)); + CHECK_INCDEC_MODELVAR_ZERO(event, g_model.header.modelId[moduleIdx], getMaxRxNum(moduleIdx)); if (checkIncDec_Ret) { modelHeaders[g_eeGeneral.currModel].modelId[moduleIdx] = g_model.header.modelId[moduleIdx]; } @@ -1132,7 +1139,7 @@ void menuModelSetup(event_t event) case ITEM_MODEL_SETUP_EXTERNAL_MODULE_PXX2_REGISTER_RANGE: { uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); - lcdDrawTextAlignedLeft(y, STR_MODULE); + lcdDrawTextAlignedLeft(y, INDENT TR_MODULE); lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, BUTTON(TR_REGISTER), (menuHorizontalPosition == 0 ? attr : 0)); lcdDrawText(lcdLastRightPos + 3, y, STR_MODULE_RANGE, (menuHorizontalPosition == 1 ? attr : 0)); if (attr) { @@ -1171,78 +1178,8 @@ void menuModelSetup(event_t event) case ITEM_MODEL_SETUP_EXTERNAL_MODULE_PXX2_RECEIVER_1: case ITEM_MODEL_SETUP_EXTERNAL_MODULE_PXX2_RECEIVER_2: case ITEM_MODEL_SETUP_EXTERNAL_MODULE_PXX2_RECEIVER_3: - { - uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); - uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(k); - ModuleInformation & moduleInformation = reusableBuffer.moduleSetup.pxx2.moduleInformation; - - drawStringWithIndex(INDENT_WIDTH, y, STR_RECEIVER, receiverIdx + 1); - - if (!(g_model.moduleData[moduleIdx].pxx2.receivers & (1 << receiverIdx))) { - lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_MODULE_BIND, attr); - if (attr && s_editMode > 0) { - s_editMode = 0; - killEvents(event); - g_model.moduleData[moduleIdx].pxx2.receivers |= (1 << receiverIdx); - memclear(g_model.moduleData[moduleIdx].pxx2.receiverName[receiverIdx], PXX2_LEN_RX_NAME); - storageDirty(EE_MODEL); - } - else { - break; - } - } - - drawReceiverName(MODEL_SETUP_2ND_COLUMN, y, moduleIdx, receiverIdx, attr); - - if (s_editMode && isModuleR9M2(moduleIdx) && moduleState[moduleIdx].mode == MODULE_MODE_NORMAL && moduleInformation.information.modelID) { - moduleInformation.information.modelID = 0; - moduleState[moduleIdx].startBind(&reusableBuffer.moduleSetup.bindInformation); - } - - if (attr && (moduleState[moduleIdx].mode == 0 || s_editMode == 0)) { - if (moduleState[moduleIdx].mode) { - moduleState[moduleIdx].mode = 0; - removePXX2ReceiverIfEmpty(moduleIdx, receiverIdx); - killEvents(event); // we stopped BIND / SHARE, we don't want to re-open the menu - event = 0; - CLEAR_POPUP(); - } - s_editMode = 0; - } - - if (moduleState[moduleIdx].mode == MODULE_MODE_BIND) { - if (reusableBuffer.moduleSetup.bindInformation.step == BIND_INIT) { - if (reusableBuffer.moduleSetup.bindInformation.candidateReceiversCount > 0) { - popupMenuItemsCount = min(reusableBuffer.moduleSetup.bindInformation.candidateReceiversCount, PXX2_MAX_RECEIVERS_PER_MODULE); - for (uint8_t i = 0; i < popupMenuItemsCount; i++) { - popupMenuItems[i] = reusableBuffer.moduleSetup.bindInformation.candidateReceiversNames[i]; - } - popupMenuTitle = STR_PXX2_SELECT_RX; - CLEAR_POPUP(); - POPUP_MENU_START(onPXX2BindMenu); - } - else { - POPUP_WAIT(STR_WAITING_FOR_RX); - } - } - } - - if (attr && EVT_KEY_MASK(event) == KEY_ENTER) { - killEvents(event); - if (!isSimu() && isPXX2ReceiverEmpty(moduleIdx, receiverIdx)) { - onPXX2ReceiverMenu(STR_BIND); - } - else { - POPUP_MENU_ADD_ITEM(STR_BIND); - POPUP_MENU_ADD_ITEM(STR_OPTIONS); - POPUP_MENU_ADD_ITEM(STR_SHARE); - POPUP_MENU_ADD_ITEM(STR_DELETE); - POPUP_MENU_ADD_ITEM(STR_RESET); - } - POPUP_MENU_START(onPXX2ReceiverMenu); - } - } - break; + modelSetupModulePxx2ReceiverLine(CURRENT_MODULE_EDITED(k), CURRENT_RECEIVER_EDITED(k), y, event, attr); + break; #endif #if defined(PCBSKY9X) @@ -1298,20 +1235,20 @@ void menuModelSetup(event_t event) else { horzpos_t l_posHorz = menuHorizontalPosition; coord_t xOffsetBind = MODEL_SETUP_BIND_OFS; - if (isModuleXJT(moduleIdx) && IS_D8_RX(moduleIdx)) { + if (!isModuleRxNumAvailable(moduleIdx)) { xOffsetBind = 0; lcdDrawText(INDENT_WIDTH, y, STR_RECEIVER); if (attr) l_posHorz += 1; } else { - lcdDrawTextAlignedLeft(y, STR_RECEIVER_NUM); + lcdDrawText(INDENT_WIDTH, y, STR_RECEIVER_NUM); } - if (isModulePXX2(moduleIdx) || isModulePXX(moduleIdx) || isModuleDSM2(moduleIdx) || isModuleMultimodule(moduleIdx)) { + if (isModuleBindRangeAvailable(moduleIdx)) { if (xOffsetBind) lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.header.modelId[moduleIdx], (l_posHorz==0 ? attr : 0) | LEADING0|LEFT, 2); if (attr && l_posHorz == 0) { if (s_editMode > 0) { - CHECK_INCDEC_MODELVAR_ZERO(event, g_model.header.modelId[moduleIdx], MAX_RX_NUM(moduleIdx)); + CHECK_INCDEC_MODELVAR_ZERO(event, g_model.header.modelId[moduleIdx], getMaxRxNum(moduleIdx)); if (checkIncDec_Ret) { modelHeaders[g_eeGeneral.currModel].modelId[moduleIdx] = g_model.header.modelId[moduleIdx]; } @@ -1338,7 +1275,7 @@ void menuModelSetup(event_t event) if (attr && l_posHorz > 0) { if (s_editMode > 0) { if (l_posHorz == 1) { - if (isModuleR9M(moduleIdx) || (isModuleXJT(moduleIdx) && g_model.moduleData[moduleIdx].rfProtocol == MODULE_SUBTYPE_PXX1_ACCST_D16) || (isModuleXJT2(moduleIdx) && g_model.moduleData[moduleIdx].subType == MODULE_SUBTYPE_ISRM_PXX2_ACCST_D16) || (isModuleR9M2(moduleIdx) && g_model.moduleData[moduleIdx].subType != MODULE_SUBTYPE_R9M_PXX2_ACCESS)) { + if (isModuleR9MNonAccess(moduleIdx) || isModuleD16(moduleIdx)) { #if defined(PCBXLITE) if (EVT_KEY_MASK(event) == KEY_ENTER) { #elif defined(PCBSKY9X) || defined(PCBAR9X) @@ -1347,27 +1284,7 @@ void menuModelSetup(event_t event) if (event == EVT_KEY_BREAK(KEY_ENTER)) { #endif killEvents(event); - uint8_t default_selection = 0; // R9M_LBT should default to 0 as available options are variables - if (isModuleR9M_LBT(moduleIdx)) { - if (BIND_TELEM_ALLOWED(moduleIdx)) - POPUP_MENU_ADD_ITEM(STR_BINDING_1_8_TELEM_ON); - POPUP_MENU_ADD_ITEM(STR_BINDING_1_8_TELEM_OFF); - if (BIND_TELEM_ALLOWED(moduleIdx) && BIND_CH9TO16_ALLOWED(moduleIdx)) - POPUP_MENU_ADD_ITEM(STR_BINDING_9_16_TELEM_ON); - if (BIND_CH9TO16_ALLOWED(moduleIdx)) - POPUP_MENU_ADD_ITEM(STR_BINDING_9_16_TELEM_OFF); - } - else { - if (BIND_TELEM_ALLOWED(moduleIdx)) - POPUP_MENU_ADD_ITEM(STR_BINDING_1_8_TELEM_ON); - POPUP_MENU_ADD_ITEM(STR_BINDING_1_8_TELEM_OFF); - if (BIND_TELEM_ALLOWED(moduleIdx)) - POPUP_MENU_ADD_ITEM(STR_BINDING_9_16_TELEM_ON); - POPUP_MENU_ADD_ITEM(STR_BINDING_9_16_TELEM_OFF); - default_selection = g_model.moduleData[moduleIdx].pxx.receiver_telem_off + (g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 << 1); - } - POPUP_MENU_SELECT_ITEM(default_selection); - POPUP_MENU_START(onBindMenu); + startBindMenu(moduleIdx); continue; } if (moduleState[moduleIdx].mode == MODULE_MODE_BIND) { @@ -1434,8 +1351,9 @@ void menuModelSetup(event_t event) menuHorizontalPosition = 0; if (menuHorizontalPosition == 0) { if (s_editMode > 0) { - CHECK_INCDEC_MODELVAR_ZERO(event, moduleData.failsafeMode, FAILSAFE_LAST); - if (checkIncDec_Ret) SEND_FAILSAFE_NOW(moduleIdx); + CHECK_INCDEC_MODELVAR_ZERO(event, moduleData.failsafeMode, isModuleR9M(moduleIdx) ? FAILSAFE_NOPULSES : FAILSAFE_LAST); + if (checkIncDec_Ret) + SEND_FAILSAFE_NOW(moduleIdx); } } else if (menuHorizontalPosition == 1) { @@ -1461,12 +1379,12 @@ void menuModelSetup(event_t event) } break; -#if defined(PCBXLITE) +#if defined(EXTERNAL_ANTENNA) case ITEM_MODEL_SETUP_INTERNAL_MODULE_ANTENNA: { uint8_t newAntennaSel = editChoice(MODEL_SETUP_2ND_COLUMN, y, STR_ANTENNASELECTION, STR_VANTENNATYPES, g_model.moduleData[INTERNAL_MODULE].pxx.external_antenna, 0, 1, attr, event); if (newAntennaSel != g_model.moduleData[INTERNAL_MODULE].pxx.external_antenna && newAntennaSel == XJT_EXTERNAL_ANTENNA) { - POPUP_CONFIRMATION(STR_ANTENNACONFIRM1, nullptr); + POPUP_CONFIRMATION(STR_ANTENNACONFIRM1, onAntennaSwitchConfirm); const char * w = STR_ANTENNACONFIRM2; SET_WARNING_INFO(w, strlen(w), 0); } @@ -1476,6 +1394,7 @@ void menuModelSetup(event_t event) break; } #endif + case ITEM_MODEL_SETUP_EXTERNAL_MODULE_OPTIONS: { uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); @@ -1486,7 +1405,7 @@ void menuModelSetup(event_t event) const uint8_t multi_proto = g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true); const mm_protocol_definition * pdef = getMultiProtocolDefinition(multi_proto); if (pdef->optionsstr) - lcdDrawTextAlignedLeft(y, pdef->optionsstr); + lcdDrawText(INDENT_WIDTH, y, pdef->optionsstr); if (multi_proto == MODULE_SUBTYPE_MULTI_FS_AFHDS2A) optionValue = 50 + 5 * optionValue; @@ -1505,14 +1424,12 @@ void menuModelSetup(event_t event) } } #endif - if (isModuleR9M(moduleIdx)) { + if (isModuleR9MNonAccess(moduleIdx)) { lcdDrawTextAlignedLeft(y, STR_MODULE_TELEMETRY); - if (IS_TELEMETRY_INTERNAL_MODULE()) { + if (isSportLineUsedByInternalModule()) lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_DISABLE_INTERNAL); - } - else { + else lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_MODULE_TELEM_ON); - } } else if (isModuleSBUS(moduleIdx)) { lcdDrawTextAlignedLeft(y, STR_WARN_BATTVOLTAGE); @@ -1524,51 +1441,70 @@ void menuModelSetup(event_t event) case ITEM_MODEL_SETUP_EXTERNAL_MODULE_POWER: { uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); - if (isModuleR9M(moduleIdx)) { - lcdDrawTextAlignedLeft(y, TR_MULTI_RFPOWER); + auto & module = g_model.moduleData[moduleIdx]; + // Lite FCC / Lite FLEX / Lite Pro Flex + if (isModuleTypeR9MNonAccess(module.type)) { + lcdDrawTextAlignedLeft(y, STR_RFPOWER); if (isModuleR9M_FCC_VARIANT(moduleIdx)) { - g_model.moduleData[moduleIdx].pxx.power = min((uint8_t)g_model.moduleData[moduleIdx].pxx.power, (uint8_t)R9M_FCC_POWER_MAX); // Lite FCC has only one setting - if (g_model.moduleData[moduleIdx].type == MODULE_TYPE_R9M_LITE_PXX1) { // R9M lite FCC has only one power value, so displayed for info only - lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_R9M_LITE_FCC_POWER_VALUES, g_model.moduleData[moduleIdx].pxx.power, LEFT); - if (attr) + // FCC and FLEX modes ... + if (isModuleTypeR9MLiteNonPro(module.type)) { // R9M lite FCC has only one power value, so displayed for info only + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_R9M_LITE_FCC_POWER_VALUES, 0, LEFT); + if (attr) { REPEAT_LAST_CURSOR_MOVE(); + } } else { - lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_R9M_FCC_POWER_VALUES, g_model.moduleData[moduleIdx].pxx.power, LEFT | attr); - if (attr) - CHECK_INCDEC_MODELVAR_ZERO(event, g_model.moduleData[moduleIdx].pxx.power, R9M_FCC_POWER_MAX); + module.pxx.power = min(module.pxx.power, R9M_FCC_POWER_MAX); // Sanitize + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_R9M_FCC_POWER_VALUES, module.pxx.power, LEFT | attr); + if (attr) { + CHECK_INCDEC_MODELVAR_ZERO(event, module.pxx.power, R9M_FCC_POWER_MAX); + if (s_editMode == 0 && reusableBuffer.moduleSetup.r9mPower != module.pxx.power) { + module.channelsStart = 0; + module.channelsCount = maxModuleChannels_M8(moduleIdx); + } + } } } - else if (g_model.moduleData[moduleIdx].type == MODULE_TYPE_R9M_LITE_PXX1) { - g_model.moduleData[moduleIdx].pxx.power = min((uint8_t)g_model.moduleData[moduleIdx].pxx.power, (uint8_t)R9M_LITE_LBT_POWER_MAX); - lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_R9M_LITE_LBT_POWER_VALUES, g_model.moduleData[moduleIdx].pxx.power, LEFT | attr); - if (attr) { - CHECK_INCDEC_MODELVAR_ZERO(event, g_model.moduleData[moduleIdx].pxx.power, R9M_LITE_LBT_POWER_MAX); - } - if (attr && s_editMode == 0 && reusableBuffer.moduleSetup.r9mPower != g_model.moduleData[moduleIdx].pxx.power) { - if (reusableBuffer.moduleSetup.r9mPower + g_model.moduleData[moduleIdx].pxx.power < 5) { //switching between mode 2 and 3 does not require rebind - POPUP_WARNING(STR_REBIND); + else { + // EU-LBT mode ... + if (isModuleTypeR9MLiteNonPro(module.type)) { + // R9M Lite in EU-LBT mode ... + module.pxx.power = min(module.pxx.power, R9M_LITE_LBT_POWER_MAX); // Sanitize + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_R9M_LITE_LBT_POWER_VALUES, module.pxx.power, LEFT | attr); + if (attr) { + CHECK_INCDEC_MODELVAR_ZERO(event, module.pxx.power, R9M_LITE_LBT_POWER_MAX); + if (s_editMode == 0 && reusableBuffer.moduleSetup.r9mPower != module.pxx.power) { + module.channelsStart = 0; + module.channelsCount = maxModuleChannels_M8(moduleIdx); + if (reusableBuffer.moduleSetup.r9mPower + module.pxx.power < 5) { // switching between mode 2 and 3 does not require rebind + POPUP_WARNING(STR_REBIND); + } + reusableBuffer.moduleSetup.r9mPower = module.pxx.power; + } } - reusableBuffer.moduleSetup.r9mPower = g_model.moduleData[moduleIdx].pxx.power; } - } - else if (g_model.moduleData[moduleIdx].type == MODULE_TYPE_R9M_PXX1) { - g_model.moduleData[moduleIdx].pxx.power = min((uint8_t)g_model.moduleData[moduleIdx].pxx.power, (uint8_t)R9M_LBT_POWER_MAX); - lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_R9M_LBT_POWER_VALUES, g_model.moduleData[moduleIdx].pxx.power, LEFT | attr); - if (attr) { - CHECK_INCDEC_MODELVAR_ZERO(event, g_model.moduleData[moduleIdx].pxx.power, R9M_LBT_POWER_MAX); - } - if (attr && s_editMode == 0 && reusableBuffer.moduleSetup.r9mPower != g_model.moduleData[moduleIdx].pxx.power) { - if (reusableBuffer.moduleSetup.r9mPower + g_model.moduleData[moduleIdx].pxx.power < 5) { //switching between mode 2 and 3 does not require rebind - POPUP_WARNING(STR_REBIND); + else { + // R9M (full size) or R9M Lite Pro in EU-LBT mode ... + module.pxx.power = min((uint8_t) module.pxx.power, (uint8_t) R9M_LBT_POWER_MAX); // Sanitize + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_R9M_LBT_POWER_VALUES, module.pxx.power, LEFT | attr); + if (attr) { + CHECK_INCDEC_MODELVAR_ZERO(event, module.pxx.power, R9M_LBT_POWER_MAX); + if (s_editMode == 0 && reusableBuffer.moduleSetup.r9mPower != module.pxx.power) { + TRACE("ON Y PASSE"); + module.channelsStart = 0; + module.channelsCount = maxModuleChannels_M8(moduleIdx); + if (reusableBuffer.moduleSetup.r9mPower + module.pxx.power < 5) { //switching between mode 2 and 3 does not require rebind + POPUP_WARNING(STR_REBIND); + } + reusableBuffer.moduleSetup.r9mPower = module.pxx.power; + } } - reusableBuffer.moduleSetup.r9mPower = g_model.moduleData[moduleIdx].pxx.power; } } } #if defined(MULTIMODULE) else if (isModuleMultimodule(moduleIdx)) { - g_model.moduleData[EXTERNAL_MODULE].multi.lowPowerMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.lowPowerMode, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_LOWPOWER, attr, event); + module.multi.lowPowerMode = editCheckBox(module.multi.lowPowerMode, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_LOWPOWER, attr, event); } #endif diff --git a/radio/src/gui/128x64/model_special_functions.cpp b/radio/src/gui/128x64/model_special_functions.cpp index a6b18ddf3..51313dd8d 100644 --- a/radio/src/gui/128x64/model_special_functions.cpp +++ b/radio/src/gui/128x64/model_special_functions.cpp @@ -446,7 +446,7 @@ void menuSpecialFunctions(event_t event, CustomFunctionData * functions, CustomF void menuModelSpecialFunctions(event_t event) { -#if defined(PCBX7) || defined(PCBX9LITE) +#if defined(NAVIGATION_X7) const CustomFunctionData * cfn = &g_model.customFn[menuVerticalPosition]; if (!CFN_SWITCH(cfn) && menuHorizontalPosition < 0 && event==EVT_KEY_BREAK(KEY_ENTER)) { menuHorizontalPosition = 0; @@ -456,7 +456,7 @@ void menuModelSpecialFunctions(event_t event) menuSpecialFunctions(event, g_model.customFn, &modelFunctionsContext); -#if defined(PCBX7) || defined(PCBX9LITE) +#if defined(NAVIGATION_X7) if (!CFN_SWITCH(cfn) && menuHorizontalPosition == 0 && s_editMode <= 0) { menuHorizontalPosition = -1; } diff --git a/radio/src/gui/128x64/model_telemetry.cpp b/radio/src/gui/128x64/model_telemetry.cpp index 846168ba5..3b98cad70 100644 --- a/radio/src/gui/128x64/model_telemetry.cpp +++ b/radio/src/gui/128x64/model_telemetry.cpp @@ -250,7 +250,7 @@ void menuModelTelemetryFrsky(event_t event) break; case ITEM_TELEMETRY_RSSI_SOURCE: { - lcdDrawTextAlignedLeft(y, STR_SOURCE); + lcdDrawTextAlignedLeft(y, INDENT TR_SOURCE); drawSource(TELEM_COL2, y, g_model.rssiSource ? MIXSRC_FIRST_TELEM + 3 * (g_model.rssiSource - 1) : 0, attr); if (g_model.rssiSource) { TelemetrySensor * sensor = &g_model.telemetrySensors[g_model.rssiSource - 1]; @@ -288,7 +288,7 @@ void menuModelTelemetryFrsky(event_t event) break; case ITEM_TELEMETRY_VARIO_SOURCE: - lcdDrawTextAlignedLeft(y, STR_SOURCE); + lcdDrawTextAlignedLeft(y, INDENT TR_SOURCE); drawSource(TELEM_COL2, y, g_model.varioData.source ? MIXSRC_FIRST_TELEM+3*(g_model.varioData.source-1) : 0, attr); if (attr) { g_model.varioData.source = checkIncDec(event, g_model.varioData.source, 0, MAX_TELEMETRY_SENSORS, EE_MODEL|NO_INCDEC_MARKS, isSensorAvailable); diff --git a/radio/src/gui/128x64/model_telemetry_sensor.cpp b/radio/src/gui/128x64/model_telemetry_sensor.cpp index 8aa4acfe6..c14ad3652 100644 --- a/radio/src/gui/128x64/model_telemetry_sensor.cpp +++ b/radio/src/gui/128x64/model_telemetry_sensor.cpp @@ -234,7 +234,7 @@ void menuModelSensor(event_t event) break; } else { - lcdDrawTextAlignedLeft(y, NO_INDENT(STR_OFFSET)); + lcdDrawTextAlignedLeft(y, STR_OFFSET); if (attr) CHECK_INCDEC_MODELVAR(event, sensor->custom.offset, -30000, +30000); if (sensor->prec > 0) attr |= (sensor->prec == 2 ? PREC2 : PREC1); lcdDrawNumber(SENSOR_2ND_COLUMN, y, sensor->custom.offset, LEFT|attr); @@ -247,17 +247,17 @@ void menuModelSensor(event_t event) case SENSOR_FIELD_PARAM4: { - drawStringWithIndex(0, y, NO_INDENT(STR_SOURCE), k-SENSOR_FIELD_PARAM1+1); - int8_t & source = sensor->calc.sources[k-SENSOR_FIELD_PARAM1]; + drawStringWithIndex(0, y, STR_SOURCE, k-SENSOR_FIELD_PARAM1+1); + int8_t * source = &sensor->calc.sources[k-SENSOR_FIELD_PARAM1]; if (attr) { - source = checkIncDec(event, source, -MAX_TELEMETRY_SENSORS, MAX_TELEMETRY_SENSORS, EE_MODEL|NO_INCDEC_MARKS, isSensorAvailable); + *source = checkIncDec(event, *source, -MAX_TELEMETRY_SENSORS, MAX_TELEMETRY_SENSORS, EE_MODEL|NO_INCDEC_MARKS, isSensorAvailable); } - if (source < 0) { + if (*source < 0) { lcdDrawChar(SENSOR_2ND_COLUMN, y, '-', attr); - drawSource(lcdNextPos, y, MIXSRC_FIRST_TELEM+3*(-1-source), attr); + drawSource(lcdNextPos, y, MIXSRC_FIRST_TELEM+3*(-1-*source), attr); } else { - drawSource(SENSOR_2ND_COLUMN, y, source ? MIXSRC_FIRST_TELEM+3*(source-1) : 0, attr); + drawSource(SENSOR_2ND_COLUMN, y, *source ? MIXSRC_FIRST_TELEM+3*(*source-1) : 0, attr); } break; } diff --git a/radio/src/gui/128x64/radio_calibration.cpp b/radio/src/gui/128x64/radio_calibration.cpp index 5cf0159d8..a8004c7a2 100644 --- a/radio/src/gui/128x64/radio_calibration.cpp +++ b/radio/src/gui/128x64/radio_calibration.cpp @@ -23,14 +23,6 @@ #define XPOT_DELTA 10 #define XPOT_DELAY 10 /* cycles */ -enum CalibrationState { - CALIB_START = 0, - CALIB_SET_MIDPOINT, - CALIB_MOVE_STICKS, - CALIB_STORE, - CALIB_FINISHED -}; - void menuCommonCalib(event_t event) { for (uint8_t i=0; i0) && (event==EVT_KEY_FIRST(KEY_ENTER) || event==EVT_KEY_FIRST(KEY_EXIT) || IS_ROTARY_BREAK(event) || IS_ROTARY_LONG(event))) { // set the date and time into RTC chip @@ -135,7 +134,7 @@ void menuRadioSetup(event_t event) } #endif - MENU(STR_MENURADIOSETUP, menuTabGeneral, MENU_RADIO_SETUP, HEADER_LINE+ITEM_SETUP_MAX, { + MENU(STR_MENURADIOSETUP, menuTabGeneral, MENU_RADIO_SETUP, HEADER_LINE+ITEM_RADIO_SETUP_MAX, { HEADER_LINE_COLUMNS CASE_RTCLOCK(2) CASE_RTCLOCK(2) CASE_BATTGRAPH(1) LABEL(SOUND), CASE_AUDIO(0) CASE_BUZZER(0) @@ -153,13 +152,13 @@ void menuRadioSetup(event_t event) CASE_GYRO(0) CASE_GYRO(0) 0, LABEL(ALARMS), 0, CASE_CAPACITY(0) - CASE_PCBSKY9X(0) 0, 0, 0, 0, LABEL(BACKLIGHT), 0, 0, 0, CASE_PWM_BACKLIGHT(0) CASE_PWM_BACKLIGHT(0) 0, CASE_SPLASH_PARAM(0) - + CASE_PWR_BUTTON_PRESS(0) + CASE_PWR_BUTTON_PRESS(0) CASE_PXX2(0) /* owner registration ID */ CASE_GPS(0) @@ -185,7 +184,7 @@ void menuRadioSetup(event_t event) switch (k) { #if defined(RTCLOCK) - case ITEM_SETUP_DATE: + case ITEM_RADIO_SETUP_DATE: lcdDrawTextAlignedLeft(y, STR_DATE); for (uint8_t j=0; j<3; j++) { uint8_t rowattr = (menuHorizontalPosition==j ? attr : 0); @@ -217,7 +216,7 @@ void menuRadioSetup(event_t event) } break; - case ITEM_SETUP_TIME: + case ITEM_RADIO_SETUP_TIME: lcdDrawTextAlignedLeft(y, STR_TIME); for (uint8_t j=0; j<3; j++) { uint8_t rowattr = (menuHorizontalPosition==j ? attr : 0); @@ -245,7 +244,7 @@ void menuRadioSetup(event_t event) #endif #if defined(BATTGRAPH) - case ITEM_SETUP_BATT_RANGE: + case ITEM_RADIO_SETUP_BATT_RANGE: lcdDrawTextAlignedLeft(y, STR_BATTERY_RANGE); putsVolts(RADIO_SETUP_2ND_COLUMN, y, 90+g_eeGeneral.vBatMin, (menuHorizontalPosition==0 ? attr : 0)|LEFT|NO_UNIT); lcdDrawChar(lcdLastRightPos, y, '-'); @@ -259,28 +258,28 @@ void menuRadioSetup(event_t event) break; #endif - case ITEM_SETUP_SOUND_LABEL: + case ITEM_RADIO_SETUP_SOUND_LABEL: lcdDrawTextAlignedLeft(y, STR_SOUND_LABEL); break; #if defined(AUDIO) - case ITEM_SETUP_BEEP_MODE: + case ITEM_RADIO_SETUP_BEEP_MODE: g_eeGeneral.beepMode = editChoice(RADIO_SETUP_2ND_COLUMN, y, STR_SPEAKER, STR_VBEEPMODE, g_eeGeneral.beepMode, -2, 1, attr, event); break; #if defined(BUZZER) // AUDIO + BUZZER - case ITEM_SETUP_BUZZER_MODE: + case ITEM_RADIO_SETUP_BUZZER_MODE: g_eeGeneral.buzzerMode = editChoice(RADIO_SETUP_2ND_COLUMN, y, STR_BUZZER, STR_VBEEPMODE, g_eeGeneral.buzzerMode, -2, 1, attr, event); break; #endif #elif defined(BUZZER) // BUZZER only - case ITEM_SETUP_BUZZER_MODE: + case ITEM_RADIO_SETUP_BUZZER_MODE: g_eeGeneral.beepMode = editChoice(RADIO_SETUP_2ND_COLUMN, y, STR_SPEAKER, STR_VBEEPMODE, g_eeGeneral.beepMode, -2, 1, attr, event); break; #endif #if defined(VOICE) - case ITEM_SETUP_SPEAKER_VOLUME: + case ITEM_RADIO_SETUP_SPEAKER_VOLUME: { lcdDrawTextAlignedLeft(y, STR_SPEAKER_VOLUME); uint8_t b = g_eeGeneral.speakerVolume+VOLUME_LEVEL_DEF; @@ -295,22 +294,22 @@ void menuRadioSetup(event_t event) } #endif - case ITEM_SETUP_BEEP_VOLUME: + case ITEM_RADIO_SETUP_BEEP_VOLUME: SLIDER_5POS(y, g_eeGeneral.beepVolume, STR_BEEP_VOLUME, event, attr); break; - case ITEM_SETUP_WAV_VOLUME: + case ITEM_RADIO_SETUP_WAV_VOLUME: SLIDER_5POS(y, g_eeGeneral.wavVolume, STR_WAV_VOLUME, event, attr); break; - case ITEM_SETUP_BACKGROUND_VOLUME: + case ITEM_RADIO_SETUP_BACKGROUND_VOLUME: SLIDER_5POS(y, g_eeGeneral.backgroundVolume, STR_BG_VOLUME, event, attr); break; - case ITEM_SETUP_BEEP_LENGTH: + case ITEM_RADIO_SETUP_BEEP_LENGTH: SLIDER_5POS(y, g_eeGeneral.beepLength, STR_BEEP_LENGTH, event, attr); break; #if defined(AUDIO) - case ITEM_SETUP_SPEAKER_PITCH: + case ITEM_RADIO_SETUP_SPEAKER_PITCH: lcdDrawTextAlignedLeft( y, STR_SPKRPITCH); lcdDrawChar(RADIO_SETUP_2ND_COLUMN, y, '+', attr); lcdDrawNumber(RADIO_SETUP_2ND_COLUMN+FW, y, g_eeGeneral.speakerPitch*15, attr|LEFT); @@ -322,25 +321,25 @@ void menuRadioSetup(event_t event) #endif #if defined(VARIO) - case ITEM_SETUP_VARIO_LABEL: + case ITEM_RADIO_SETUP_VARIO_LABEL: lcdDrawTextAlignedLeft(y, STR_VARIO); break; - case ITEM_SETUP_VARIO_VOLUME: + case ITEM_RADIO_SETUP_VARIO_VOLUME: SLIDER_5POS(y, g_eeGeneral.varioVolume, TR_SPEAKER_VOLUME, event, attr); break; - case ITEM_SETUP_VARIO_PITCH: + case ITEM_RADIO_SETUP_VARIO_PITCH: lcdDrawTextAlignedLeft(y, STR_PITCH_AT_ZERO); lcdDrawNumber(RADIO_SETUP_2ND_COLUMN, y, VARIO_FREQUENCY_ZERO+(g_eeGeneral.varioPitch*10), attr|LEFT); lcdDrawText(lcdLastRightPos, y, "Hz", attr); if (attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.varioPitch, -40, 40); break; - case ITEM_SETUP_VARIO_RANGE: + case ITEM_RADIO_SETUP_VARIO_RANGE: lcdDrawTextAlignedLeft(y, STR_PITCH_AT_MAX); lcdDrawNumber(RADIO_SETUP_2ND_COLUMN, y, VARIO_FREQUENCY_ZERO+(g_eeGeneral.varioPitch*10)+VARIO_FREQUENCY_RANGE+(g_eeGeneral.varioRange*10), attr|LEFT); lcdDrawText(lcdLastRightPos, y, "Hz", attr); if (attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.varioRange, -80, 80); break; - case ITEM_SETUP_VARIO_REPEAT: + case ITEM_RADIO_SETUP_VARIO_REPEAT: lcdDrawTextAlignedLeft(y, STR_REPEAT_AT_ZERO); lcdDrawNumber(RADIO_SETUP_2ND_COLUMN, y, VARIO_REPEAT_ZERO+(g_eeGeneral.varioRepeat*10), attr|LEFT); lcdDrawText(lcdLastRightPos, y, STR_MS, attr); @@ -349,29 +348,29 @@ void menuRadioSetup(event_t event) #endif #if defined(HAPTIC) - case ITEM_SETUP_HAPTIC_LABEL: + case ITEM_RADIO_SETUP_HAPTIC_LABEL: lcdDrawTextAlignedLeft(y, STR_HAPTIC_LABEL); break; - case ITEM_SETUP_HAPTIC_MODE: - g_eeGeneral.hapticMode = editChoice(RADIO_SETUP_2ND_COLUMN, y, STR_MODE, STR_VBEEPMODE, g_eeGeneral.hapticMode, -2, 1, attr, event); + case ITEM_RADIO_SETUP_HAPTIC_MODE: + g_eeGeneral.hapticMode = editChoice(RADIO_SETUP_2ND_COLUMN, y, INDENT TR_MODE, STR_VBEEPMODE, g_eeGeneral.hapticMode, -2, 1, attr, event); break; - case ITEM_SETUP_HAPTIC_LENGTH: + case ITEM_RADIO_SETUP_HAPTIC_LENGTH: SLIDER_5POS(y, g_eeGeneral.hapticLength, STR_LENGTH, event, attr); break; - case ITEM_SETUP_HAPTIC_STRENGTH: + case ITEM_RADIO_SETUP_HAPTIC_STRENGTH: SLIDER_5POS(y, g_eeGeneral.hapticStrength, STR_HAPTICSTRENGTH, event, attr); break; #endif #if defined(GYRO) - case ITEM_SETUP_GYRO_LABEL: + case ITEM_RADIO_SETUP_GYRO_LABEL: lcdDrawTextAlignedLeft(y, STR_GYRO_LABEL); break; - case ITEM_SETUP_GYRO_MAX: + case ITEM_RADIO_SETUP_GYRO_MAX: lcdDrawText(INDENT_WIDTH, y, STR_GYRO_MAX); lcdDrawNumber(RADIO_SETUP_2ND_COLUMN, y, GYRO_MAX_DEFAULT + g_eeGeneral.gyroMax, attr|LEFT); lcdDrawChar(lcdLastRightPos, y, '@', attr); @@ -383,7 +382,7 @@ void menuRadioSetup(event_t event) } break; - case ITEM_SETUP_GYRO_OFFSET: + case ITEM_RADIO_SETUP_GYRO_OFFSET: lcdDrawText(INDENT_WIDTH, y, STR_GYRO_OFFSET); lcdDrawNumber(RADIO_SETUP_2ND_COLUMN, y, g_eeGeneral.gyroOffset, attr|LEFT); lcdDrawChar(lcdLastRightPos, y, '@', attr); @@ -396,7 +395,7 @@ void menuRadioSetup(event_t event) break; #endif - case ITEM_SETUP_CONTRAST: + case ITEM_RADIO_SETUP_CONTRAST: lcdDrawTextAlignedLeft(y, STR_CONTRAST); lcdDrawNumber(RADIO_SETUP_2ND_COLUMN, y, g_eeGeneral.contrast, attr|LEFT); if (attr) { @@ -405,31 +404,31 @@ void menuRadioSetup(event_t event) } break; - case ITEM_SETUP_ALARMS_LABEL: + case ITEM_RADIO_SETUP_ALARMS_LABEL: lcdDrawTextAlignedLeft(y, STR_ALARMS_LABEL); break; - case ITEM_SETUP_BATTERY_WARNING: + case ITEM_RADIO_SETUP_BATTERY_WARNING: lcdDrawTextAlignedLeft(y, STR_BATTERYWARNING); putsVolts(RADIO_SETUP_2ND_COLUMN, y, g_eeGeneral.vBatWarn, attr|LEFT); if(attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.vBatWarn, 40, 120); //4-12V break; - case ITEM_SETUP_MEMORY_WARNING: + case ITEM_RADIO_SETUP_MEMORY_WARNING: { uint8_t b = 1-g_eeGeneral.disableMemoryWarning; g_eeGeneral.disableMemoryWarning = 1 - editCheckBox(b, RADIO_SETUP_2ND_COLUMN, y, STR_MEMORYWARNING, attr, event); break; } - case ITEM_SETUP_ALARM_WARNING: + case ITEM_RADIO_SETUP_ALARM_WARNING: { uint8_t b = 1 - g_eeGeneral.disableAlarmWarning; g_eeGeneral.disableAlarmWarning = 1 - editCheckBox(b, RADIO_SETUP_2ND_COLUMN, y, STR_ALARMWARNING, attr, event); break; } - case ITEM_SETUP_RSSI_POWEROFF_ALARM: + case ITEM_RADIO_SETUP_RSSI_POWEROFF_ALARM: { uint8_t b = 1 - g_eeGeneral.disableRssiPoweroffAlarm; g_eeGeneral.disableRssiPoweroffAlarm = 1 - editCheckBox(b, RADIO_SETUP_2ND_COLUMN, y, STR_RSSISHUTDOWNALARM, attr, event); @@ -437,48 +436,40 @@ void menuRadioSetup(event_t event) } #if defined(TX_CAPACITY_MEASUREMENT) - case ITEM_SETUP_CAPACITY_WARNING: + case ITEM_RADIO_SETUP_CAPACITY_WARNING: lcdDrawTextAlignedLeft(y, STR_CAPAWARNING); drawValueWithUnit(RADIO_SETUP_2ND_COLUMN, y, g_eeGeneral.mAhWarn*50, UNIT_MAH, attr|LEFT) ; if(attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.mAhWarn, 0, 100); break; #endif -#if defined(PCBSKY9X) - case ITEM_SETUP_TEMPERATURE_WARNING: - lcdDrawTextAlignedLeft(y, STR_TEMPWARNING); - drawValueWithUnit(RADIO_SETUP_2ND_COLUMN, y, g_eeGeneral.temperatureWarn, UNIT_TEMPERATURE, attr|LEFT) ; - if(attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.temperatureWarn, 0, 120); // 0 means no alarm - break; -#endif - - case ITEM_SETUP_INACTIVITY_ALARM: + case ITEM_RADIO_SETUP_INACTIVITY_ALARM: lcdDrawTextAlignedLeft(y, STR_INACTIVITYALARM); lcdDrawNumber(RADIO_SETUP_2ND_COLUMN, y, g_eeGeneral.inactivityTimer, attr|LEFT); lcdDrawChar(lcdLastRightPos, y, 'm'); if(attr) g_eeGeneral.inactivityTimer = checkIncDec(event, g_eeGeneral.inactivityTimer, 0, 250, EE_GENERAL); //0..250minutes break; - case ITEM_SETUP_BACKLIGHT_LABEL: + case ITEM_RADIO_SETUP_BACKLIGHT_LABEL: lcdDrawTextAlignedLeft(y, STR_BACKLIGHT_LABEL); break; - case ITEM_SETUP_BACKLIGHT_MODE: - g_eeGeneral.backlightMode = editChoice(RADIO_SETUP_2ND_COLUMN, y, STR_MODE, STR_VBLMODE, g_eeGeneral.backlightMode, e_backlight_mode_off, e_backlight_mode_on, attr, event); + case ITEM_RADIO_SETUP_BACKLIGHT_MODE: + g_eeGeneral.backlightMode = editChoice(RADIO_SETUP_2ND_COLUMN, y, INDENT TR_MODE, STR_VBLMODE, g_eeGeneral.backlightMode, e_backlight_mode_off, e_backlight_mode_on, attr, event); break; - case ITEM_SETUP_FLASH_BEEP: + case ITEM_RADIO_SETUP_FLASH_BEEP: g_eeGeneral.alarmsFlash = editCheckBox(g_eeGeneral.alarmsFlash, RADIO_SETUP_2ND_COLUMN, y, STR_ALARM, attr, event ) ; break; - case ITEM_SETUP_BACKLIGHT_DELAY: + case ITEM_RADIO_SETUP_BACKLIGHT_DELAY: lcdDrawTextAlignedLeft(y, STR_BLDELAY); lcdDrawNumber(RADIO_SETUP_2ND_COLUMN, y, g_eeGeneral.lightAutoOff*5, attr|LEFT); lcdDrawChar(lcdLastRightPos, y, 's'); if (attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.lightAutoOff, 0, 600/5); break; - case ITEM_SETUP_BRIGHTNESS: + case ITEM_RADIO_SETUP_BRIGHTNESS: lcdDrawTextAlignedLeft(y, STR_BRIGHTNESS); lcdDrawNumber(RADIO_SETUP_2ND_COLUMN, y, 100-g_eeGeneral.backlightBright, attr|LEFT) ; if (attr) { @@ -489,13 +480,13 @@ void menuRadioSetup(event_t event) break; #if defined(PWM_BACKLIGHT) - case ITEM_SETUP_BACKLIGHT_BRIGHTNESS_OFF: + case ITEM_RADIO_SETUP_BACKLIGHT_BRIGHTNESS_OFF: lcdDrawTextAlignedLeft(y, STR_BLOFFBRIGHTNESS); lcdDrawNumber(RADIO_SETUP_2ND_COLUMN, y, g_eeGeneral.blOffBright, attr|LEFT); if (attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.blOffBright, 0, 15); break; - case ITEM_SETUP_BACKLIGHT_BRIGHTNESS_ON: + case ITEM_RADIO_SETUP_BACKLIGHT_BRIGHTNESS_ON: lcdDrawTextAlignedLeft(y, STR_BLONBRIGHTNESS); lcdDrawNumber(RADIO_SETUP_2ND_COLUMN, y, 15-g_eeGeneral.blOnBright, attr|LEFT); if (attr) g_eeGeneral.blOnBright = 15 - checkIncDecGen(event, 15-g_eeGeneral.blOnBright, 0, 15); @@ -503,7 +494,7 @@ void menuRadioSetup(event_t event) #endif #if defined(SPLASH) - case ITEM_SETUP_DISABLE_SPLASH: + case ITEM_RADIO_SETUP_DISABLE_SPLASH: { lcdDrawTextAlignedLeft(y, STR_SPLASHSCREEN); if (SPLASH_NEEDED()) { @@ -518,35 +509,49 @@ void menuRadioSetup(event_t event) } #endif +#if defined(PWR_BUTTON_PRESS) + case ITEM_RADIO_SETUP_PWR_ON_SPEED: + lcdDrawTextAlignedLeft(y, STR_PWR_ON_SPEED); + drawSlider(RADIO_SETUP_2ND_COLUMN, y, LCD_W - 2 - RADIO_SETUP_2ND_COLUMN, g_eeGeneral.pwrOnSpeed +1, 3, attr); + if (attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.pwrOnSpeed, -1, 2); + break; + + case ITEM_RADIO_SETUP_PWR_OFF_SPEED: + lcdDrawTextAlignedLeft(y, STR_PWR_OFF_SPEED); + drawSlider(RADIO_SETUP_2ND_COLUMN, y, LCD_W - 2 - RADIO_SETUP_2ND_COLUMN, g_eeGeneral.pwrOffSpeed +1, 3, attr); + if (attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.pwrOffSpeed, -1, 2); + break; +#endif + #if defined(PXX2) - case ITEM_RADIO_OWNER_ID: + case ITEM_RADIO_SETUP_OWNER_ID: editSingleName(RADIO_SETUP_2ND_COLUMN, y, STR_OWNER_ID, g_eeGeneral.ownerRegistrationID, PXX2_LEN_REGISTRATION_ID, event, attr); break; #endif #if defined(TELEMETRY_FRSKY) && defined(GPS) - case ITEM_SETUP_TIMEZONE: + case ITEM_RADIO_SETUP_TIMEZONE: lcdDrawTextAlignedLeft(y, STR_TIMEZONE); lcdDrawNumber(RADIO_SETUP_2ND_COLUMN, y, g_eeGeneral.timezone, attr|LEFT); if (attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.timezone, -12, 12); break; - case ITEM_SETUP_ADJUST_RTC: + case ITEM_RADIO_SETUP_ADJUST_RTC: g_eeGeneral.adjustRTC = editCheckBox(g_eeGeneral.adjustRTC, RADIO_SETUP_2ND_COLUMN, y, STR_ADJUST_RTC, attr, event); break; - case ITEM_SETUP_GPSFORMAT: + case ITEM_RADIO_SETUP_GPSFORMAT: g_eeGeneral.gpsFormat = editChoice(RADIO_SETUP_2ND_COLUMN, y, STR_GPSCOORD, STR_GPSFORMAT, g_eeGeneral.gpsFormat, 0, 1, attr, event); break; #endif -#if defined(PXX) - case ITEM_SETUP_COUNTRYCODE: +#if defined(PXX1) + case ITEM_RADIO_SETUP_COUNTRYCODE: g_eeGeneral.countryCode = editChoice(RADIO_SETUP_2ND_COLUMN, y, STR_COUNTRYCODE, STR_COUNTRYCODES, g_eeGeneral.countryCode, 0, 2, attr, event); break; #endif - case ITEM_SETUP_LANGUAGE: + case ITEM_RADIO_SETUP_LANGUAGE: lcdDrawTextAlignedLeft(y, STR_VOICELANG); lcdDrawText(RADIO_SETUP_2ND_COLUMN, y, currentLanguagePack->name, attr); if (attr) { @@ -558,12 +563,12 @@ void menuRadioSetup(event_t event) } break; - case ITEM_SETUP_IMPERIAL: + case ITEM_RADIO_SETUP_IMPERIAL: g_eeGeneral.imperial = editChoice(RADIO_SETUP_2ND_COLUMN, y, STR_UNITSSYSTEM, STR_VUNITSSYSTEM, g_eeGeneral.imperial, 0, 1, attr, event); break; #if defined(FAI_CHOICE) - case ITEM_SETUP_FAI: + case ITEM_RADIO_SETUP_FAI: editCheckBox(g_eeGeneral.fai, RADIO_SETUP_2ND_COLUMN, y, "FAI Mode", attr, event); if (attr && checkIncDec_Ret) { if (g_eeGeneral.fai) @@ -575,7 +580,7 @@ void menuRadioSetup(event_t event) #endif - case ITEM_SETUP_SWITCHES_DELAY: + case ITEM_RADIO_SETUP_SWITCHES_DELAY: lcdDrawTextAlignedLeft(y, STR_SWITCHES_DELAY); lcdDrawNumber(RADIO_SETUP_2ND_COLUMN, y, 10*SWITCHES_DELAY(), attr|LEFT); lcdDrawText(lcdLastRightPos, y, STR_MS, attr); @@ -583,27 +588,27 @@ void menuRadioSetup(event_t event) break; #if defined(STM32) - case ITEM_SETUP_USB_MODE: + case ITEM_RADIO_SETUP_USB_MODE: g_eeGeneral.USBMode = editChoice(RADIO_SETUP_2ND_COLUMN, y, STR_USBMODE, STR_USBMODES, g_eeGeneral.USBMode, USB_UNSELECTED_MODE, USB_MAX_MODE, attr, event); break; #endif #if defined(JACK_DETECT_GPIO) - case ITEM_SETUP_JACK_MODE: + case ITEM_RADIO_SETUP_JACK_MODE: g_eeGeneral.jackMode = editChoice(RADIO_SETUP_2ND_COLUMN, y, STR_JACKMODE, STR_JACKMODES, g_eeGeneral.jackMode, JACK_UNSELECTED_MODE, JACK_MAX_MODE, attr, event); break; #endif - case ITEM_SETUP_RX_CHANNEL_ORD: + case ITEM_RADIO_SETUP_RX_CHANNEL_ORD: lcdDrawTextAlignedLeft(y, STR_RXCHANNELORD); // RAET->AETR for (uint8_t i=1; i<=4; i++) { - putsChnLetter(RADIO_SETUP_2ND_COLUMN - FW + i*FW, y, channel_order(i), attr); + putsChnLetter(RADIO_SETUP_2ND_COLUMN - FW + i*FW, y, channelOrder(i), attr); } if (attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.templateSetup, 0, 23); break; - case ITEM_SETUP_STICK_MODE_LABELS: - lcdDrawTextAlignedLeft(y, NO_INDENT(STR_MODE)); + case ITEM_RADIO_SETUP_STICK_MODE_LABELS: + lcdDrawTextAlignedLeft(y, STR_MODE); for (uint8_t i=0; i<4; i++) { lcdDraw1bitBitmap(5*FW+i*(4*FW+2), y, sticks, i, 0); #if defined(FRSKY_STICKS) && !defined(PCBTARANIS) @@ -621,7 +626,7 @@ void menuRadioSetup(event_t event) #endif break; - case ITEM_SETUP_STICK_MODE: + case ITEM_RADIO_SETUP_STICK_MODE: lcdDrawChar(2*FW, y, '1'+reusableBuffer.generalSettings.stickMode, attr); for (uint8_t i=0; i0) ? BLINK|INVERS : INVERS); - - lcdDrawText(3*FW, MENU_HEADER_HEIGHT+1, STR_MODESRC); - - y = MENU_HEADER_HEIGHT + 1 + FH; - - for (uint8_t i=HEADER_LINE; imode, attr); - if (attr&BLINK) CHECK_INCDEC_GENVAR(event, td->mode, 0, 2); - break; - - case 1: - lcdDrawNumber(11*FW, y, td->studWeight, attr|RIGHT); - if (attr&BLINK) CHECK_INCDEC_GENVAR(event, td->studWeight, -125, 125); - break; - - case 2: - lcdDrawTextAtIndex(12*FW, y, STR_TRNCHN, td->srcChn, attr); - if (attr&BLINK) CHECK_INCDEC_GENVAR(event, td->srcChn, 0, 3); - break; - } - } - y += FH; - } - - attr = (menuVerticalPosition==HEADER_LINE+4) ? blink : 0; - lcdDrawTextAlignedLeft(MENU_HEADER_HEIGHT+1+5*FH, STR_MULTIPLIER); - lcdDrawNumber(LEN_MULTIPLIER*FW+3*FW, MENU_HEADER_HEIGHT+1+5*FH, g_eeGeneral.PPM_Multiplier+10, attr|PREC1|RIGHT); - if (attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.PPM_Multiplier, -10, 40); - - attr = (menuVerticalPosition==HEADER_LINE+5) ? INVERS : 0; - lcdDrawText(0*FW, MENU_HEADER_HEIGHT+1+6*FH, STR_CAL, attr); - for (uint8_t i=0; i<4; i++) { - uint8_t x = (i*8+16)*FW/2; - lcdDrawNumber(x, MENU_HEADER_HEIGHT+1+6*FH, (ppmInput[i]-g_eeGeneral.trainer.calib[i])/5, RIGHT); - } - - if (attr) { - s_editMode = 0; - if (event==EVT_KEY_LONG(KEY_ENTER)){ - memcpy(g_eeGeneral.trainer.calib, ppmInput, sizeof(g_eeGeneral.trainer.calib)); - storageDirty(EE_GENERAL); - AUDIO_WARNING1(); - } - } - } -} diff --git a/radio/src/gui/128x64/startup_shutdown.cpp b/radio/src/gui/128x64/startup_shutdown.cpp new file mode 100644 index 000000000..96f9dbaea --- /dev/null +++ b/radio/src/gui/128x64/startup_shutdown.cpp @@ -0,0 +1,85 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include "opentx.h" + + +#define SLEEP_BITMAP_WIDTH 60 +#define SLEEP_BITMAP_HEIGHT 60 + +const unsigned char bmp_sleep[] = { +#include "sleep.lbm" +}; + +void drawStartupAnimation(uint32_t duration, uint32_t totalDuration) +{ + if (totalDuration == 0) + return; + + uint8_t index = limit(0, duration / (totalDuration / 5), 4); + + lcdRefreshWait(); + lcdClear(); + + for (uint8_t i = 0; i < 4; i++) { + if (index > i) { + lcdDrawFilledRect(LCD_W / 2 - 18 + 10 * i, LCD_H / 2 - 3, 6, 6, SOLID, 0); + } + } + + lcdRefresh(); + lcdRefreshWait(); +} + +void drawShutdownAnimation(uint32_t duration, uint32_t totalDuration, const char * message) +{ + if (totalDuration == 0) + return; + + uint8_t index = limit(0, duration / (totalDuration / 5), 4); + + lcdRefreshWait(); + lcdClear(); + + for (uint8_t i = 0; i < 4; i++) { + if (4 - index > i) { + lcdDrawFilledRect(LCD_W / 2 - 18 + 10 * i, LCD_H / 2 - 3, 6, 6, SOLID, 0); + } + } + if (message) { + lcdDrawText((LCD_W - getTextWidth(message)) / 2, LCD_H-2*FH, message); + } + + lcdRefresh(); + lcdRefreshWait(); +} + +void drawSleepBitmap() +{ + lcdRefreshWait(); + lcdClear(); + + lcdDraw1bitBitmap((LCD_W - SLEEP_BITMAP_WIDTH) / 2, (LCD_H - SLEEP_BITMAP_HEIGHT) / 2, bmp_sleep, 0); + + lcdRefresh(); + lcdRefreshWait(); +} + + diff --git a/radio/src/gui/128x64/view_main.cpp b/radio/src/gui/128x64/view_main.cpp index e17aebc9e..653db74b7 100644 --- a/radio/src/gui/128x64/view_main.cpp +++ b/radio/src/gui/128x64/view_main.cpp @@ -198,7 +198,7 @@ void displayBattVoltage() putsVBat(VBATT_X-8, VBATT_Y+1, RIGHT); lcdDrawSolidFilledRect(VBATT_X-25, VBATT_Y+9, 21, 5); lcdDrawSolidVerticalLine(VBATT_X-4, VBATT_Y+10, 3); - uint8_t count = GET_TXBATT_BARS(); + uint8_t count = GET_TXBATT_BARS(20); for (uint8_t i=0; i= g_eeGeneral.temperatureWarn) { - drawValueWithUnit(6*FW-1, 2*FH, getTemperature(), UNIT_TEMPERATURE, BLINK|INVERS|DBLSIZE|RIGHT); - } - else if (g_eeGeneral.mAhWarn && (g_eeGeneral.mAhUsed + Current_used * (488 + g_eeGeneral.txCurrentCalibration)/8192/36) / 500 >= g_eeGeneral.mAhWarn) { + if (g_eeGeneral.mAhWarn && (g_eeGeneral.mAhUsed + Current_used * (488 + g_eeGeneral.txCurrentCalibration)/8192/36) / 500 >= g_eeGeneral.mAhWarn) { drawValueWithUnit(7*FW-1, 2*FH, (g_eeGeneral.mAhUsed + Current_used*(488 + g_eeGeneral.txCurrentCalibration)/8192/36)/10, UNIT_MAH, BLINK|INVERS|DBLSIZE|RIGHT); } else { @@ -551,13 +548,9 @@ void menuMainView(event_t event) } // And ! in case of unexpected shutdown -#if defined(LOG_TELEMETRY) || defined(WATCHDOG_DISABLED) || defined(DEBUG_LATENCY) - lcdDrawChar(REBOOT_X, 0*FH, '!', INVERS); -#else - if (unexpectedShutdown) { - lcdDrawChar(REBOOT_X, 0*FH, '!', INVERS); + if (isAsteriskDisplayed()) { + lcdDrawChar(REBOOT_X, 0 * FH, '!', INVERS); } -#endif #if defined(GVARS) if (gvarDisplayTimer > 0) { diff --git a/radio/src/gui/128x64/view_statistics.cpp b/radio/src/gui/128x64/view_statistics.cpp index b5ff4174c..163a99743 100644 --- a/radio/src/gui/128x64/view_statistics.cpp +++ b/radio/src/gui/128x64/view_statistics.cpp @@ -57,6 +57,7 @@ void menuStatisticsView(event_t event) storageDirty(EE_GENERAL); sessionTimer = 0; break; + case EVT_KEY_FIRST(KEY_EXIT): chainMenu(menuMainView); break; @@ -64,15 +65,15 @@ void menuStatisticsView(event_t event) // Session and Total timers lcdDrawText(STATS_1ST_COLUMN, FH*1+1, "SES", BOLD); - drawTimer(STATS_1ST_COLUMN + STATS_LABEL_WIDTH, FH*1+1, sessionTimer, 0, 0); + drawTimer(STATS_1ST_COLUMN + STATS_LABEL_WIDTH, FH*1+1, sessionTimer); lcdDrawText(STATS_1ST_COLUMN, FH*2+1, "TOT", BOLD); drawTimer(STATS_1ST_COLUMN + STATS_LABEL_WIDTH, FH*2+1, g_eeGeneral.globalTimer + sessionTimer, TIMEHOUR, 0); // Throttle special timers lcdDrawText(STATS_2ND_COLUMN, FH*0+1, "THR", BOLD); - drawTimer(STATS_2ND_COLUMN + STATS_LABEL_WIDTH, FH*0+1, s_timeCumThr, 0, 0); + drawTimer(STATS_2ND_COLUMN + STATS_LABEL_WIDTH, FH*0+1, s_timeCumThr); lcdDrawText(STATS_2ND_COLUMN, FH*1+1, "TH%", BOLD); - drawTimer(STATS_2ND_COLUMN + STATS_LABEL_WIDTH, FH*1+1, s_timeCum16ThrP/16, 0, 0); + drawTimer(STATS_2ND_COLUMN + STATS_LABEL_WIDTH, FH*1+1, s_timeCum16ThrP/16); // Timers for (int i=0; i 3600) drawTimer(STATS_3RD_COLUMN + STATS_LABEL_WIDTH, FH*i+1, timersStates[i].val, TIMEHOUR, 0); else - drawTimer(STATS_3RD_COLUMN + STATS_LABEL_WIDTH, FH*i+1, timersStates[i].val, 0, 0); + drawTimer(STATS_3RD_COLUMN + STATS_LABEL_WIDTH, FH*i+1, timersStates[i].val); } #if defined(THRTRACE) @@ -108,6 +109,11 @@ void menuStatisticsDebug(event_t event) title(STR_MENUDEBUG); switch (event) { + case EVT_ENTRY: + case EVT_ENTRY_UP: + enableVBatBridge(); + break; + case EVT_KEY_LONG(KEY_ENTER): #if defined(PCBSKY9X) g_eeGeneral.mAhUsed = 0; @@ -120,14 +126,19 @@ void menuStatisticsDebug(event_t event) break; case EVT_KEY_FIRST(KEY_ENTER): +#if defined(LUA) + maxLuaInterval = 0; + maxLuaDuration = 0; +#endif maxMixerDuration = 0; break; case EVT_KEY_FIRST(KEY_UP): #if defined(NAVIGATION_X7) case EVT_KEY_BREAK(KEY_PAGE): + disableVBatBridge(); chainMenu(menuStatisticsDebug2); - return; + break; #endif case EVT_KEY_FIRST(KEY_DOWN): @@ -135,16 +146,18 @@ void menuStatisticsDebug(event_t event) case EVT_KEY_LONG(KEY_PAGE): #endif killEvents(event); + disableVBatBridge(); chainMenu(menuStatisticsView); break; case EVT_KEY_FIRST(KEY_EXIT): + disableVBatBridge(); chainMenu(menuMainView); break; } #if defined(PCBSKY9X) - if ((ResetReason&RSTC_SR_RSTTYP) == (2<<8)) { + if (IS_RESET_REASON_WATCHDOG()) { lcdDrawText(LCD_W-8*FW, 0, "WATCHDOG"); } else if (unexpectedShutdown) { @@ -169,14 +182,6 @@ void menuStatisticsDebug(event_t event) y += FH; #endif -#if defined(PCBSKY9X) - lcdDrawTextAlignedLeft(y, STR_CPU_TEMP); - drawValueWithUnit(MENU_DEBUG_COL1_OFS, y, getTemperature(), UNIT_TEMPERATURE, LEFT); - lcdDrawChar(MENU_DEBUG_COL2_OFS, y, '>'); - drawValueWithUnit(MENU_DEBUG_COL2_OFS+FW+1, y, maxTemperature+g_eeGeneral.temperatureCalib, UNIT_TEMPERATURE, LEFT); - y += FH; -#endif - #if defined(COPROCESSOR) lcdDrawTextAlignedLeft(y, STR_COPROC_TEMP); if (Coproc_read==0) { @@ -237,7 +242,7 @@ void menuStatisticsDebug(event_t event) y += FH; #if defined(DEBUG_LATENCY) - lcdDrawTextAlignedLeft(y, "Hearbeat"); + lcdDrawTextAlignedLeft(y, "Heartbeat"); if (heartbeatCapture.valid) lcdDrawNumber(MENU_DEBUG_COL1_OFS, y, heartbeatCapture.count, LEFT); else @@ -245,7 +250,7 @@ void menuStatisticsDebug(event_t event) y += FH; #endif - lcdDrawText(4*FW, 7*FH+1, STR_MENUTORESET); + lcdDrawText(LCD_W/2, 7*FH+1, STR_MENUTORESET, CENTERED); lcdInvertLastLine(); } @@ -254,7 +259,7 @@ void menuStatisticsDebug2(event_t event) { title(STR_MENUDEBUG); - switch (event) { + switch(event) { case EVT_KEY_FIRST(KEY_ENTER): telemetryErrors = 0; break; @@ -291,7 +296,7 @@ void menuStatisticsDebug2(event_t event) y += FH; #endif - lcdDrawText(4*FW, 7*FH+1, STR_MENUTORESET); + lcdDrawText(LCD_W/2, 7*FH+1, STR_MENUTORESET, CENTERED); lcdInvertLastLine(); } #endif diff --git a/radio/src/gui/128x64/view_telemetry.cpp b/radio/src/gui/128x64/view_telemetry.cpp index 6671cbe81..b840a622e 100644 --- a/radio/src/gui/128x64/view_telemetry.cpp +++ b/radio/src/gui/128x64/view_telemetry.cpp @@ -21,7 +21,6 @@ #include "opentx.h" #define STATUS_BAR_Y (7*FH+1) -#define TELEM_2ND_COLUMN (10*FW) uint8_t s_frsky_view = 0; @@ -219,7 +218,7 @@ enum NavigationDirection { #if defined(NAVIGATION_XLITE) #define EVT_KEY_PREVIOUS_VIEW EVT_KEY_LONG(KEY_LEFT) #define EVT_KEY_NEXT_VIEW EVT_KEY_LONG(KEY_RIGHT) -#elif defined(RADIO_X7) +#elif defined(NAVIGATION_X7) #define EVT_KEY_PREVIOUS_VIEW EVT_KEY_LONG(KEY_PAGE) #define EVT_KEY_NEXT_VIEW EVT_KEY_BREAK(KEY_PAGE) #else diff --git a/radio/src/gui/128x64/widgets.cpp b/radio/src/gui/128x64/widgets.cpp index 8aeef5c8b..e304f0032 100644 --- a/radio/src/gui/128x64/widgets.cpp +++ b/radio/src/gui/128x64/widgets.cpp @@ -235,17 +235,3 @@ void drawStatusLine() } } #endif - -const unsigned char SLEEP_BITMAP[] = { -#include "sleep.lbm" -}; - -#define SLEEP_BITMAP_WIDTH 60 -#define SLEEP_BITMAP_HEIGHT 60 - -void drawSleepBitmap() -{ - lcdClear(); - lcdDraw1bitBitmap((LCD_W-SLEEP_BITMAP_WIDTH)/2, (LCD_H-SLEEP_BITMAP_HEIGHT)/2, SLEEP_BITMAP, 0); - lcdRefresh(); -} diff --git a/radio/src/gui/212x64/CMakeLists.txt b/radio/src/gui/212x64/CMakeLists.txt new file mode 100644 index 000000000..0c7549fda --- /dev/null +++ b/radio/src/gui/212x64/CMakeLists.txt @@ -0,0 +1,45 @@ +set(GUI_SRC + ${GUI_SRC} + lcd.cpp + splash.cpp + fonts.cpp + popups.cpp + widgets.cpp + startup_shutdown.cpp + menu_model.cpp + model_select.cpp + model_setup.cpp + model_failsafe.cpp + model_logical_switches.cpp + model_special_functions.cpp + model_outputs.cpp + model_telemetry.cpp + model_telemetry_sensor.cpp + menu_radio.cpp + radio_setup.cpp + radio_calibration.cpp + view_main.cpp + view_statistics.cpp + ) + +set(SRC + ${SRC} + gui/common/widgets.cpp + gui/common/arm/widgets.cpp + ) + +if(FLIGHT_MODES) + set(GUI_SRC + ${GUI_SRC} + model_flightmodes.cpp + ) +endif() + +if(LUA STREQUAL YES) + set(GUI_SRC + ${GUI_SRC} + model_custom_scripts.cpp + ) +endif() + +include(gui/common/stdlcd/CMakeLists.txt) diff --git a/radio/src/gui/212x64/gui.h b/radio/src/gui/212x64/gui.h index 2d131eff0..14d9c6978 100644 --- a/radio/src/gui/212x64/gui.h +++ b/radio/src/gui/212x64/gui.h @@ -25,6 +25,7 @@ #include "lcd.h" #include "menus.h" #include "popups.h" +#include "common/stdlcd/draw_functions.h" #define HEADER_LINE 0 #define HEADER_LINE_COLUMNS @@ -74,8 +75,6 @@ void showAlertBox(const char * title, const char * text, const char * action, ui void doMainScreenGraphics(); -typedef uint16_t FlightModesType; - extern int8_t checkIncDec_Ret; // global helper vars #define EDIT_SELECT_FIELD 0 @@ -96,11 +95,6 @@ extern int8_t s_editMode; // global editmode #define INCDEC_ENABLE_CHECK(fn) isValueAvailable = fn #define CHECK_INCDEC_PARAM(event, var, min, max) checkIncDec(event, var, min, max, incdecFlag, isValueAvailable) -// mawrow special values -#define READONLY_ROW ((uint8_t)-1) -#define TITLE_ROW READONLY_ROW -#define HIDDEN_ROW ((uint8_t)-2) - struct CheckIncDecStops { const int count; @@ -222,7 +216,6 @@ swsrc_t editSwitch(coord_t x, coord_t y, swsrc_t value, LcdFlags attr, event_t e #define ON_OFF_MENU_ITEM(value, x, y, label, attr, event) value = editCheckBox(value, x, y, label, attr, event) #if defined(GVARS) - void drawGVarName(coord_t x, coord_t y, int8_t index, LcdFlags flags=0); void drawGVarValue(coord_t x, coord_t y, uint8_t gvar, gvar_t value, LcdFlags flags=0); int16_t editGVarFieldValue(coord_t x, coord_t y, int16_t value, int16_t min, int16_t max, LcdFlags attr, uint8_t editflags, event_t event); #define GVAR_MENU_ITEM(x, y, v, min, max, lcdattr, editflags, event) editGVarFieldValue(x, y, v, min, max, lcdattr, editflags, event) @@ -233,9 +226,6 @@ swsrc_t editSwitch(coord_t x, coord_t y, swsrc_t value, LcdFlags attr, event_t e #define displayGVar(x, y, v, min, max) lcdDrawNumber(x, y, v) #endif -void drawPower(coord_t x, coord_t y, int8_t dBm, LcdFlags att = 0); -void drawReceiverName(coord_t x, coord_t y, uint8_t moduleIdx, uint8_t receiverIdx, LcdFlags flags=0); - void gvarWeightItem(coord_t x, coord_t y, MixData * md, LcdFlags attr, event_t event); extern uint8_t s_curveChan; diff --git a/radio/src/gui/212x64/lcd.cpp b/radio/src/gui/212x64/lcd.cpp index 9aa14fe35..56492e5c5 100644 --- a/radio/src/gui/212x64/lcd.cpp +++ b/radio/src/gui/212x64/lcd.cpp @@ -477,7 +477,7 @@ void lcdDrawLine(coord_t x1, coord_t y1, coord_t x2, coord_t y2, uint8_t pat, Lc } #endif -void lcdDrawSolidVerticalLine(coord_t x, scoord_t y, scoord_t h, LcdFlags att) +void lcdDrawSolidVerticalLine(coord_t x, coord_t y, coord_t h, LcdFlags att) { lcdDrawVerticalLine(x, y, h, SOLID, att); } @@ -492,9 +492,9 @@ void lcdDrawRect(coord_t x, coord_t y, coord_t w, coord_t h, uint8_t pat, LcdFla } #if !defined(BOOT) -void lcdDrawFilledRect(coord_t x, scoord_t y, coord_t w, coord_t h, uint8_t pat, LcdFlags att) +void lcdDrawFilledRect(coord_t x, coord_t y, coord_t w, coord_t h, uint8_t pat, LcdFlags att) { - for (scoord_t i=y; i<(scoord_t)(y+h); i++) { + for (coord_t i=y; i= MIXSRC_FIRST_SWITCH && idx <= MIXSRC_LAST_SWITCH) { - idx = idx-MIXSRC_FIRST_SWITCH; + idx = idx - MIXSRC_FIRST_SWITCH; if (ZEXIST(g_eeGeneral.switchNames[idx])) { lcdDrawChar(x, y, '\312', att); //switch symbol lcdDrawSizedText(lcdNextPos, y, g_eeGeneral.switchNames[idx], LEN_SWITCH_NAME, ZCHAR|att); } - else - lcdDrawTextAtIndex(x, y, STR_VSRCRAW, idx+MIXSRC_FIRST_SWITCH-MIXSRC_Rud+1, att); + else { + lcdDrawTextAtIndex(x, y, STR_VSRCRAW, idx + MIXSRC_FIRST_SWITCH - MIXSRC_Rud + 1, att); + } } else if (idx < MIXSRC_SW1) lcdDrawTextAtIndex(x, y, STR_VSRCRAW, idx-MIXSRC_Rud+1, att); @@ -695,7 +696,7 @@ void putsModelName(coord_t x, coord_t y, char *name, uint8_t id, LcdFlags att) void drawSwitch(coord_t x, coord_t y, int32_t idx, LcdFlags flags) { char s[8]; - getSwitchString(s, idx); + getSwitchPositionName(s, idx); lcdDrawText(x, y, s, flags); } @@ -706,7 +707,7 @@ void drawCurveName(coord_t x, coord_t y, int8_t idx, LcdFlags flags) lcdDrawText(x, y, s, flags); } -void drawTimerMode(coord_t x, coord_t y, int32_t mode, LcdFlags att) +void drawTimerMode(coord_t x, coord_t y, swsrc_t mode, LcdFlags att) { if (mode >= 0) { if (mode < TMRMODE_COUNT) @@ -735,7 +736,7 @@ void drawTrimMode(coord_t x, coord_t y, uint8_t phase, uint8_t idx, LcdFlags att } } -void drawValueWithUnit(coord_t x, coord_t y, int32_t val, uint8_t unit, LcdFlags att) +void drawValueWithUnit(coord_t x, coord_t y, int val, uint8_t unit, LcdFlags att) { // convertUnit(val, unit); lcdDrawNumber(x, y, val, att & (~NO_UNIT)); @@ -887,7 +888,7 @@ void lcdDrawHorizontalLine(coord_t x, coord_t y, coord_t w, uint8_t pat, LcdFlag } } -void lcdDrawVerticalLine(coord_t x, scoord_t y, scoord_t h, uint8_t pat, LcdFlags att) +void lcdDrawVerticalLine(coord_t x, coord_t y, coord_t h, uint8_t pat, LcdFlags att) { if (x >= LCD_W) return; if (y >= LCD_H) return; diff --git a/radio/src/gui/212x64/lcd.h b/radio/src/gui/212x64/lcd.h index cb8ce9476..382bc85ae 100644 --- a/radio/src/gui/212x64/lcd.h +++ b/radio/src/gui/212x64/lcd.h @@ -21,14 +21,14 @@ #ifndef _LCD_H_ #define _LCD_H_ +typedef int coord_t; +typedef uint32_t LcdFlags; +typedef uint8_t display_t; + #define BOX_WIDTH 31 -#define coord_t int -#define scoord_t int #define CENTER "\015" #define CENTER_OFS (7*FW-FW/2) -#define lcdint_t int32_t - #define FW 6 #define FWNUM 5 #define FH 8 @@ -84,9 +84,6 @@ #define GREY_DEFAULT GREY(11) #define COLOUR_MASK(x) ((x) & 0x0F0000) -#define LcdFlags uint32_t - -#define display_t uint8_t #define DISPLAY_BUFFER_SIZE (LCD_W*LCD_H*4/8) #if (defined(PCBX9E) || defined(PCBX9DP)) && defined(LCD_DUAL_BUFFER) @@ -120,13 +117,12 @@ void lcdDrawHexNumber(coord_t x, coord_t y, uint32_t val, LcdFlags mode=0); void lcdDrawNumber(coord_t x, coord_t y, int32_t val, LcdFlags mode, uint8_t len); void lcdDrawNumber(coord_t x, coord_t y, int32_t val, LcdFlags mode=0); -void drawStringWithIndex(coord_t x, coord_t y, const char *str, uint8_t idx, LcdFlags att=0); void putsModelName(coord_t x, coord_t y, char *name, uint8_t id, LcdFlags att); void drawSwitch(coord_t x, coord_t y, int32_t swtch, LcdFlags att=0); void putsStickName(coord_t x, coord_t y, uint8_t idx, LcdFlags att=0); void drawSource(coord_t x, coord_t y, uint32_t idx, LcdFlags att=0); void drawCurveName(coord_t x, coord_t y, int8_t idx, LcdFlags att=0); -void drawTimerMode(coord_t x, coord_t y, int32_t mode, LcdFlags att=0); +void drawTimerMode(coord_t x, coord_t y, swsrc_t mode, LcdFlags att=0); void drawTrimMode(coord_t x, coord_t y, uint8_t phase, uint8_t idx, LcdFlags att); #define putsChn(x, y, idx, att) drawSource(x, y, MIXSRC_CH1+idx-1, att) @@ -135,15 +131,6 @@ void putsChnLetter(coord_t x, coord_t y, uint8_t idx, LcdFlags attr); void putsVolts(coord_t x, coord_t y, uint16_t volts, LcdFlags att); void putsVBat(coord_t x, coord_t y, LcdFlags att); -#define putstime_t int32_t - -void drawRtcTime(coord_t x, coord_t y, LcdFlags att); -void drawTimer(coord_t x, coord_t y, putstime_t tme, LcdFlags att, LcdFlags att2); -inline void drawTimer(coord_t x, coord_t y, putstime_t tme, LcdFlags att) -{ - drawTimer(x, y, tme, att, att); -} - #define SOLID 0xff #define DOTTED 0x55 @@ -151,11 +138,11 @@ void lcdDrawPoint(coord_t x, coord_t y, LcdFlags att=0); void lcdMaskPoint(uint8_t *p, uint8_t mask, LcdFlags att=0); void lcdDrawSolidHorizontalLine(coord_t x, coord_t y, coord_t w, LcdFlags att=0); void lcdDrawHorizontalLine(coord_t x, coord_t y, coord_t w, uint8_t pat, LcdFlags att=0); -void lcdDrawSolidVerticalLine(coord_t x, scoord_t y, scoord_t h, LcdFlags att=0); -void lcdDrawVerticalLine(coord_t x, scoord_t y, scoord_t h, uint8_t pat, LcdFlags att=0); +void lcdDrawSolidVerticalLine(coord_t x, coord_t y, coord_t h, LcdFlags att=0); +void lcdDrawVerticalLine(coord_t x, coord_t y, coord_t h, uint8_t pat, LcdFlags att=0); void lcdDrawLine(coord_t x1, coord_t y1, coord_t x2, coord_t y2, uint8_t pat=SOLID, LcdFlags att=0); -void lcdDrawFilledRect(coord_t x, scoord_t y, coord_t w, coord_t h, uint8_t pat=SOLID, LcdFlags att=0); -inline void lcdDrawSolidFilledRect(coord_t x, scoord_t y, coord_t w, coord_t h, LcdFlags att=0) +void lcdDrawFilledRect(coord_t x, coord_t y, coord_t w, coord_t h, uint8_t pat=SOLID, LcdFlags att=0); +inline void lcdDrawSolidFilledRect(coord_t x, coord_t y, coord_t w, coord_t h, LcdFlags att=0) { lcdDrawFilledRect(x, y, w, h, SOLID, att); } @@ -168,8 +155,6 @@ inline void lcdDrawSquare(coord_t x, coord_t y, coord_t w, LcdFlags att=0) void lcdInvertLine(int8_t line); #define lcdInvertLastLine() lcdInvertLine(LCD_LINES-1) -void drawShutdownAnimation(uint32_t index, const char * message); -void drawSleepBitmap(); void drawTelemetryTopBar(); #define V_BAR(xx, yy, ll) \ diff --git a/radio/src/gui/212x64/menu_radio.cpp b/radio/src/gui/212x64/menu_radio.cpp index 89efdb94d..082424e07 100644 --- a/radio/src/gui/212x64/menu_radio.cpp +++ b/radio/src/gui/212x64/menu_radio.cpp @@ -23,7 +23,7 @@ const MenuHandlerFunc menuTabGeneral[MENU_RADIO_PAGES_COUNT] = { menuRadioSetup, menuRadioSdManager, -#if defined(PXX2) +#if defined(LUA) || defined(PXX2) menuRadioTools, #endif menuRadioSpecialFunctions, diff --git a/radio/src/gui/212x64/menus.h b/radio/src/gui/212x64/menus.h index 38a993b27..2bbba412f 100644 --- a/radio/src/gui/212x64/menus.h +++ b/radio/src/gui/212x64/menus.h @@ -54,7 +54,7 @@ void menuTraceBuffer(event_t event); enum MenuRadioIndexes { MENU_RADIO_SETUP, MENU_RADIO_SD_MANAGER, -#if defined(PXX2) +#if defined(LUA) || defined(PXX2) MENU_RADIO_TOOLS, #endif MENU_RADIO_SPECIAL_FUNCTIONS, diff --git a/radio/src/gui/212x64/model_display.cpp b/radio/src/gui/212x64/model_display.cpp index a7ffa120c..857f9a7de 100644 --- a/radio/src/gui/212x64/model_display.cpp +++ b/radio/src/gui/212x64/model_display.cpp @@ -239,11 +239,11 @@ void menuModelDisplay(event_t event) else { for (int c=0; c0) { - value = checkIncDec(event, value, 0, MIXSRC_LAST_TELEM, EE_MODEL|INCDEC_SOURCE|NO_INCDEC_MARKS, isSourceAvailable); + *value = checkIncDec(event, *value, 0, MIXSRC_LAST_TELEM, EE_MODEL|INCDEC_SOURCE|NO_INCDEC_MARKS, isSourceAvailable); } } if (attr && menuHorizontalPosition == NUM_LINE_ITEMS) { diff --git a/radio/src/gui/212x64/model_failsafe.cpp b/radio/src/gui/212x64/model_failsafe.cpp index 2ee301842..60c9c6177 100644 --- a/radio/src/gui/212x64/model_failsafe.cpp +++ b/radio/src/gui/212x64/model_failsafe.cpp @@ -47,13 +47,13 @@ void menuModelFailsafe(event_t event) s_editMode = 0; } else { - int16_t & failsafe = g_model.failsafeChannels[menuVerticalPosition]; - if (failsafe < FAILSAFE_CHANNEL_HOLD) - failsafe = FAILSAFE_CHANNEL_HOLD; - else if (failsafe == FAILSAFE_CHANNEL_HOLD) - failsafe = FAILSAFE_CHANNEL_NOPULSE; + int16_t * failsafe = &g_model.failsafeChannels[menuVerticalPosition]; + if (*failsafe < FAILSAFE_CHANNEL_HOLD) + *failsafe = FAILSAFE_CHANNEL_HOLD; + else if (*failsafe == FAILSAFE_CHANNEL_HOLD) + *failsafe = FAILSAFE_CHANNEL_NOPULSE; else - failsafe = 0; + *failsafe = 0; } } else { @@ -129,11 +129,11 @@ void menuModelFailsafe(event_t event) const coord_t xValue = x - barW; if (failsafeValue == FAILSAFE_CHANNEL_HOLD) { - lcdDrawText(xValue, y, STR_HOLD, RIGHT|flags); + lcdDrawText(xValue, y, STR_HOLD_UPPERCASE, RIGHT|flags); failsafeValue = 0; } else if (failsafeValue == FAILSAFE_CHANNEL_NOPULSE) { - lcdDrawText(xValue, y, STR_NONE, RIGHT|flags); + lcdDrawText(xValue, y, STR_NONE_UPPERCASE, RIGHT|flags); failsafeValue = 0; } else { diff --git a/radio/src/gui/212x64/model_gvars.cpp b/radio/src/gui/212x64/model_gvars.cpp index c77e0db69..b3b83fcff 100644 --- a/radio/src/gui/212x64/model_gvars.cpp +++ b/radio/src/gui/212x64/model_gvars.cpp @@ -23,28 +23,28 @@ void editGVarValue(coord_t x, coord_t y, event_t event, uint8_t gvar, uint8_t flightMode, LcdFlags flags) { FlightModeData * fm = &g_model.flightModeData[flightMode]; - gvar_t & v = fm->gvars[gvar]; + gvar_t * v = &fm->gvars[gvar]; int16_t vmin, vmax; - if (v > GVAR_MAX) { - uint8_t fm = v - GVAR_MAX - 1; + if (*v > GVAR_MAX) { + uint8_t fm = *v - GVAR_MAX - 1; if (fm >= flightMode) fm++; drawFlightMode(x, y, fm + 1, flags&(~LEFT)); vmin = GVAR_MAX + 1; vmax = GVAR_MAX + MAX_FLIGHT_MODES - 1; } else { - drawGVarValue(x, y, gvar, v, flags); + drawGVarValue(x, y, gvar, *v, flags); vmin = GVAR_MIN + g_model.gvars[gvar].min; vmax = GVAR_MAX - g_model.gvars[gvar].max; } if (flags & INVERS) { if (event == EVT_KEY_LONG(KEY_ENTER) && flightMode > 0) { - v = (v > GVAR_MAX ? 0 : GVAR_MAX+1); + *v = (*v > GVAR_MAX ? 0 : GVAR_MAX+1); storageDirty(EE_MODEL); } else if (s_editMode > 0) { - v = checkIncDec(event, v, vmin, vmax, EE_MODEL); + *v = checkIncDec(event, *v, vmin, vmax, EE_MODEL); } } } diff --git a/radio/src/gui/212x64/model_input_edit.cpp b/radio/src/gui/212x64/model_input_edit.cpp index 28233fd07..715393cc4 100644 --- a/radio/src/gui/212x64/model_input_edit.cpp +++ b/radio/src/gui/212x64/model_input_edit.cpp @@ -107,7 +107,7 @@ void menuModelExpoOne(event_t event) break; case EXPO_FIELD_SOURCE: - lcdDrawTextAlignedLeft(y, NO_INDENT(STR_SOURCE)); + lcdDrawTextAlignedLeft(y, STR_SOURCE); drawSource(EXPO_ONE_2ND_COLUMN, y, ed->srcRaw, STREXPANDED|attr); if (attr) ed->srcRaw = checkIncDec(event, ed->srcRaw, INPUTSRC_FIRST, INPUTSRC_LAST, EE_MODEL|INCDEC_SOURCE|NO_INCDEC_MARKS, isInputSourceAvailable); break; @@ -124,7 +124,7 @@ void menuModelExpoOne(event_t event) break; case EXPO_FIELD_OFFSET: - lcdDrawTextAlignedLeft(y, NO_INDENT(STR_OFFSET)); + lcdDrawTextAlignedLeft(y, STR_OFFSET); ed->offset = GVAR_MENU_ITEM(EXPO_ONE_2ND_COLUMN, y, ed->offset, -100, 100, LEFT|attr, 0, event); break; diff --git a/radio/src/gui/212x64/model_mix_edit.cpp b/radio/src/gui/212x64/model_mix_edit.cpp index cd54823e7..1d0dcf9eb 100644 --- a/radio/src/gui/212x64/model_mix_edit.cpp +++ b/radio/src/gui/212x64/model_mix_edit.cpp @@ -109,7 +109,7 @@ void menuModelMixOne(event_t event) break; case MIX_FIELD_SOURCE: - lcdDrawTextAlignedLeft(y, NO_INDENT(STR_SOURCE)); + lcdDrawTextAlignedLeft(y, STR_SOURCE); drawSource(MIXES_2ND_COLUMN, y, md2->srcRaw, STREXPANDED|attr); if (attr) CHECK_INCDEC_MODELSOURCE(event, md2->srcRaw, 1, MIXSRC_LAST); break; @@ -121,7 +121,7 @@ void menuModelMixOne(event_t event) case MIX_FIELD_OFFSET: { - lcdDrawTextAlignedLeft(y, NO_INDENT(STR_OFFSET)); + lcdDrawTextAlignedLeft(y, STR_OFFSET); u_int8int16_t offset; MD_OFFSET_TO_UNION(md2, offset); offset.word = GVAR_MENU_ITEM(MIXES_2ND_COLUMN, y, offset.word, GV_RANGELARGE_OFFSET_NEG, GV_RANGELARGE_OFFSET, attr|LEFT, 0, event); diff --git a/radio/src/gui/212x64/model_module_options.cpp b/radio/src/gui/212x64/model_module_options.cpp deleted file mode 100644 index f72d3594f..000000000 --- a/radio/src/gui/212x64/model_module_options.cpp +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright (C) OpenTX - * - * Based on code named - * th9x - http://code.google.com/p/th9x - * er9x - http://code.google.com/p/er9x - * gruvin9x - http://code.google.com/p/gruvin9x - * - * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include diff --git a/radio/src/gui/212x64/model_receiver_options.cpp b/radio/src/gui/212x64/model_receiver_options.cpp deleted file mode 100644 index f72d3594f..000000000 --- a/radio/src/gui/212x64/model_receiver_options.cpp +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright (C) OpenTX - * - * Based on code named - * th9x - http://code.google.com/p/th9x - * er9x - http://code.google.com/p/er9x - * gruvin9x - http://code.google.com/p/gruvin9x - * - * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include diff --git a/radio/src/gui/212x64/model_setup.cpp b/radio/src/gui/212x64/model_setup.cpp index 38b7cf864..e7ac64a91 100644 --- a/radio/src/gui/212x64/model_setup.cpp +++ b/radio/src/gui/212x64/model_setup.cpp @@ -118,8 +118,11 @@ enum MenuModelSetupItems { ITEM_MODEL_SETUP_TRAINER_LABEL, ITEM_MODEL_SETUP_TRAINER_MODE, - ITEM_MODEL_SETUP_TRAINER_LINE1, - ITEM_MODEL_SETUP_TRAINER_LINE2, +#if defined(BLUETOOTH) + ITEM_MODEL_SETUP_TRAINER_BLUETOOTH, +#endif + ITEM_MODEL_SETUP_TRAINER_CHANNELS, + ITEM_MODEL_SETUP_TRAINER_PPM_PARAMS, ITEM_MODEL_SETUP_LINES_COUNT }; @@ -229,18 +232,32 @@ void editTimerCountdown(int timerIdx, coord_t y, LcdFlags attr, event_t event) #define PORT_CHANNELS_ROWS(x) (x==INTERNAL_MODULE ? INTERNAL_MODULE_CHANNELS_ROWS : (x==EXTERNAL_MODULE ? EXTERNAL_MODULE_CHANNELS_ROWS : 1)) -#if defined(BLUETOOTH) && defined(USEHORUSBT) - #define TRAINER_LINE1_BLUETOOTH_M_ROWS ((bluetooth.distantAddr[0] == 0 || bluetooth.state == BLUETOOTH_STATE_CONNECTED) ? (uint8_t)0 : (uint8_t)1) - #define TRAINER_LINE1_ROWS (g_model.trainerData.mode == TRAINER_MODE_SLAVE ? (uint8_t)1 : (g_model.trainerData.mode == TRAINER_MODE_MASTER_BLUETOOTH ? TRAINER_LINE1_BLUETOOTH_M_ROWS : (g_model.trainerData.mode == TRAINER_MODE_SLAVE_BLUETOOTH ? (uint8_t)1 : HIDDEN_ROW))) - #define TRAINER_LINE2_ROWS (g_model.trainerData.mode == TRAINER_MODE_SLAVE ? (uint8_t)2 : HIDDEN_ROW) +#define TRAINER_CHANNELS_ROW (IS_SLAVE_TRAINER() ? (uint8_t)1 : HIDDEN_ROW) +#define TRAINER_PPM_PARAMS_ROW (g_model.trainerData.mode == TRAINER_MODE_SLAVE ? (uint8_t)2 : HIDDEN_ROW) +#define TRAINER_BLUETOOTH_M_ROW ((bluetooth.distantAddr[0] == '\0' || bluetooth.state == BLUETOOTH_STATE_CONNECTED) ? (uint8_t)0 : (uint8_t)1) +#define TRAINER_BLUETOOTH_S_ROW (bluetooth.distantAddr[0] == '\0' ? HIDDEN_ROW : LABEL()) +#define IF_BT_TRAINER_ON(x) (g_eeGeneral.bluetoothMode == BLUETOOTH_TRAINER ? (uint8_t)(x) : HIDDEN_ROW) +#define TRAINER_BLUETOOTH_ROW (g_model.trainerData.mode == TRAINER_MODE_MASTER_BLUETOOTH ? TRAINER_BLUETOOTH_M_ROW : (g_model.trainerData.mode == TRAINER_MODE_SLAVE_BLUETOOTH ? TRAINER_BLUETOOTH_S_ROW : HIDDEN_ROW)) +#if defined(BLUETOOTH) +#define TRAINER_ROWS LABEL(Trainer), 0, IF_BT_TRAINER_ON(TRAINER_BLUETOOTH_ROW), TRAINER_CHANNELS_ROW, TRAINER_PPM_PARAMS_ROW #else - #define TRAINER_LINE1_ROWS (g_model.trainerData.mode == TRAINER_MODE_SLAVE ? (uint8_t)1 : HIDDEN_ROW) - #define TRAINER_LINE2_ROWS (g_model.trainerData.mode == TRAINER_MODE_SLAVE ? (uint8_t)2 : HIDDEN_ROW) +#define TRAINER_ROWS LABEL(Trainer), 0, TRAINER_CHANNELS_ROW, TRAINER_PPM_PARAMS_ROW #endif #define TIMER_ROWS(x) 2|NAVIGATION_LINE_BY_LINE, 0, 0, 0, g_model.timers[x].countdownBeep != COUNTDOWN_SILENT ? (uint8_t) 1 : (uint8_t)0 -#define EXTERNAL_MODULE_MODE_ROWS (isModuleXJT(EXTERNAL_MODULE) || isModuleR9M(EXTERNAL_MODULE) || isModuleDSM2(EXTERNAL_MODULE) || isModuleMultimodule(EXTERNAL_MODULE)) ? (uint8_t)1 : (uint8_t)0 +inline uint8_t EXTERNAL_MODULE_MODE_ROW() +{ + if (isModuleXJT(EXTERNAL_MODULE) || isModuleR9MNonAccess(EXTERNAL_MODULE) || isModuleDSM2(EXTERNAL_MODULE)) + return 1; +#if defined(MULTIMODULE) + else if (isModuleMultimodule(EXTERNAL_MODULE)) { + return 2 + MULTIMODULE_RFPROTO_COLUMNS(EXTERNAL_MODULE); + } +#endif + else + return 0; +} #if TIMERS == 1 #define TIMERS_ROWS TIMER_ROWS(0) @@ -273,6 +290,21 @@ void editTimerCountdown(int timerIdx, coord_t y, LcdFlags attr, event_t event) #define CURRENT_MODULE_EDITED(k) (k >= ITEM_MODEL_SETUP_EXTERNAL_MODULE_LABEL ? EXTERNAL_MODULE : INTERNAL_MODULE) #define CURRENT_RECEIVER_EDITED(k) (k - (k >= ITEM_MODEL_SETUP_EXTERNAL_MODULE_LABEL ? ITEM_MODEL_SETUP_EXTERNAL_MODULE_PXX2_RECEIVER_1 : ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_RECEIVER_1)) +#if defined(BLUETOOTH) +void onBluetoothConnectMenu(const char * result) +{ + if (result != STR_EXIT) { + uint8_t index = (result - reusableBuffer.moduleSetup.bt.devices[0]) / sizeof(reusableBuffer.moduleSetup.bt.devices[0]); + strncpy(bluetooth.distantAddr, reusableBuffer.moduleSetup.bt.devices[index], LEN_BLUETOOTH_ADDR); + bluetooth.state = BLUETOOTH_STATE_BIND_REQUESTED; + } + else { + reusableBuffer.moduleSetup.bt.devicesCount = 0; + bluetooth.state = BLUETOOTH_STATE_DISCOVER_END; + } +} +#endif + #include "common/stdlcd/model_setup_pxx1.cpp" #if defined(PXX2) @@ -321,8 +353,8 @@ void menuModelSetup(event_t event) LABEL(InternalModule), INTERNAL_MODULE_TYPE_ROWS, INTERNAL_MODULE_CHANNELS_ROWS, - IF_NOT_ACCESS_MODULE_RF(INTERNAL_MODULE, IF_INTERNAL_MODULE_ON(HAS_RF_PROTOCOL_MODELINDEX(g_model.moduleData[INTERNAL_MODULE].rfProtocol) ? (uint8_t)2 : (uint8_t)1)), - IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 0), // RxNum + IF_NOT_ACCESS_MODULE_RF(INTERNAL_MODULE, IF_INTERNAL_MODULE_ON(isModuleFailsafeAvailable(INTERNAL_MODULE) ? (uint8_t)2 : (uint8_t)1)), + IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 0), // RxNum for ACCESS IF_INTERNAL_MODULE_ON(FAILSAFE_ROWS(INTERNAL_MODULE)), // Failsafe IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 1), // Range check and Register buttons IF_PXX2_MODULE(INTERNAL_MODULE, 0), // Module options @@ -331,11 +363,11 @@ void menuModelSetup(event_t event) IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 0), // Receiver 3 LABEL(ExternalModule), - EXTERNAL_MODULE_MODE_ROWS, + EXTERNAL_MODULE_MODE_ROW(), MULTIMODULE_STATUS_ROWS EXTERNAL_MODULE_CHANNELS_ROWS, - IF_NOT_ACCESS_MODULE_RF(EXTERNAL_MODULE, ((isModuleXJT(EXTERNAL_MODULE) && !HAS_RF_PROTOCOL_FAILSAFE(g_model.moduleData[EXTERNAL_MODULE].rfProtocol)) || isModuleSBUS(EXTERNAL_MODULE)) ? (uint8_t)1 : (isModulePPM(EXTERNAL_MODULE) || isModulePXX(EXTERNAL_MODULE) || isModuleDSM2(EXTERNAL_MODULE) || isModuleMultimodule(EXTERNAL_MODULE)) ? (uint8_t)2 : HIDDEN_ROW), - IF_ACCESS_MODULE_RF(EXTERNAL_MODULE, 0), // RxNum + IF_NOT_ACCESS_MODULE_RF(EXTERNAL_MODULE, EXTERNAL_MODULE_BIND_ROWS), + IF_ACCESS_MODULE_RF(EXTERNAL_MODULE, 0), // RxNum for ACCESS IF_NOT_PXX2_MODULE(EXTERNAL_MODULE, EXTERNAL_MODULE_OPTION_ROW), MULTIMODULE_MODULE_ROWS EXTERNAL_MODULE_POWER_ROW, @@ -346,10 +378,7 @@ void menuModelSetup(event_t event) IF_ACCESS_MODULE_RF(EXTERNAL_MODULE, 0), // Receiver 2 IF_ACCESS_MODULE_RF(EXTERNAL_MODULE, 0), // Receiver 3 - LABEL(Trainer), - 0, - TRAINER_LINE1_ROWS, - TRAINER_LINE2_ROWS + TRAINER_ROWS }); MENU_CHECK(menuTabModel, MENU_MODEL_SETUP, ITEM_MODEL_SETUP_LINES_COUNT); @@ -407,11 +436,11 @@ void menuModelSetup(event_t event) break; case ITEM_MODEL_SETUP_TIMER1_NAME: - editSingleName(MODEL_SETUP_2ND_COLUMN, y, STR_TIMER_NAME, g_model.timers[0].name, LEN_TIMER_NAME, event, attr); + editSingleName(MODEL_SETUP_2ND_COLUMN, y, INDENT TR_NAME, g_model.timers[0].name, LEN_TIMER_NAME, event, attr); break; case ITEM_MODEL_SETUP_TIMER1_MINUTE_BEEP: - g_model.timers[0].minuteBeep = editCheckBox(g_model.timers[0].minuteBeep, MODEL_SETUP_2ND_COLUMN, y, STR_MINUTEBEEP, attr, event); + g_model.timers[0].minuteBeep = editCheckBox(g_model.timers[0].minuteBeep, MODEL_SETUP_2ND_COLUMN, y, INDENT TR_MINUTEBEEP, attr, event); break; case ITEM_MODEL_SETUP_TIMER1_COUNTDOWN_BEEP: @@ -428,11 +457,11 @@ void menuModelSetup(event_t event) break; case ITEM_MODEL_SETUP_TIMER2_NAME: - editSingleName(MODEL_SETUP_2ND_COLUMN, y, STR_TIMER_NAME, g_model.timers[1].name, LEN_TIMER_NAME, event, attr); + editSingleName(MODEL_SETUP_2ND_COLUMN, y, INDENT TR_NAME, g_model.timers[1].name, LEN_TIMER_NAME, event, attr); break; case ITEM_MODEL_SETUP_TIMER2_MINUTE_BEEP: - g_model.timers[1].minuteBeep = editCheckBox(g_model.timers[1].minuteBeep, MODEL_SETUP_2ND_COLUMN, y, STR_MINUTEBEEP, attr, event); + g_model.timers[1].minuteBeep = editCheckBox(g_model.timers[1].minuteBeep, MODEL_SETUP_2ND_COLUMN, y, INDENT TR_MINUTEBEEP, attr, event); break; case ITEM_MODEL_SETUP_TIMER2_COUNTDOWN_BEEP: @@ -450,11 +479,11 @@ void menuModelSetup(event_t event) break; case ITEM_MODEL_SETUP_TIMER3_NAME: - editSingleName(MODEL_SETUP_2ND_COLUMN, y, STR_TIMER_NAME, g_model.timers[2].name, LEN_TIMER_NAME, event, attr); + editSingleName(MODEL_SETUP_2ND_COLUMN, y, INDENT TR_NAME, g_model.timers[2].name, LEN_TIMER_NAME, event, attr); break; case ITEM_MODEL_SETUP_TIMER3_MINUTE_BEEP: - g_model.timers[2].minuteBeep = editCheckBox(g_model.timers[2].minuteBeep, MODEL_SETUP_2ND_COLUMN, y, STR_MINUTEBEEP, attr, event); + g_model.timers[2].minuteBeep = editCheckBox(g_model.timers[2].minuteBeep, MODEL_SETUP_2ND_COLUMN, y, INDENT TR_MINUTEBEEP, attr, event); break; case ITEM_MODEL_SETUP_TIMER3_COUNTDOWN_BEEP: @@ -723,13 +752,13 @@ void menuModelSetup(event_t event) case ITEM_MODEL_SETUP_INTERNAL_MODULE_TYPE: { - lcdDrawTextAlignedLeft(y, STR_MODE); + lcdDrawTextAlignedLeft(y, INDENT TR_MODE); #if defined(INTERNAL_MODULE_PXX1) lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_INTERNAL_MODULE_PROTOCOLS, g_model.moduleData[INTERNAL_MODULE].type, menuHorizontalPosition==0 ? attr : 0); if (isModuleXJT(INTERNAL_MODULE)) - lcdDrawTextAtIndex(lcdNextPos + 3, y, STR_ACCST_RF_PROTOCOLS, 1+g_model.moduleData[INTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0); - else if (isModuleXJT2(INTERNAL_MODULE)) - lcdDrawTextAtIndex(lcdNextPos + 3, y, STR_ISRM_PXX2_RF_PROTOCOLS, g_model.moduleData[INTERNAL_MODULE].subType, menuHorizontalPosition==1 ? attr : 0); + lcdDrawTextAtIndex(lcdNextPos + 3, y, STR_XJT_ACCST_RF_PROTOCOLS, 1 + g_model.moduleData[INTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0); + else if (isModuleISRM(INTERNAL_MODULE)) + lcdDrawTextAtIndex(lcdNextPos + 3, y, STR_ISRM_RF_PROTOCOLS, 1 + g_model.moduleData[INTERNAL_MODULE].subType, menuHorizontalPosition==1 ? attr : 0); if (attr) { if (menuHorizontalPosition == 0) { uint8_t moduleType = checkIncDec(event, g_model.moduleData[INTERNAL_MODULE].type, MODULE_TYPE_NONE, MODULE_TYPE_MAX, EE_MODEL, isInternalModuleAvailable); @@ -741,7 +770,7 @@ void menuModelSetup(event_t event) } } else if (isModuleXJT(INTERNAL_MODULE)) { - g_model.moduleData[INTERNAL_MODULE].rfProtocol = checkIncDec(event, g_model.moduleData[INTERNAL_MODULE].rfProtocol, 0, MODULE_SUBTYPE_PXX1_LAST, EE_MODEL, isRfProtocolAvailable); + g_model.moduleData[INTERNAL_MODULE].subType = checkIncDec(event, g_model.moduleData[INTERNAL_MODULE].subType, 0, MODULE_SUBTYPE_PXX1_LAST, EE_MODEL, isRfProtocolAvailable); if (checkIncDec_Ret) { g_model.moduleData[0].type = MODULE_TYPE_XJT_PXX1; g_model.moduleData[0].channelsStart = 0; @@ -749,7 +778,7 @@ void menuModelSetup(event_t event) } } else if (isModulePXX2(INTERNAL_MODULE)) { - g_model.moduleData[INTERNAL_MODULE].subType = checkIncDec(event, g_model.moduleData[INTERNAL_MODULE].subType, 0, MODULE_SUBTYPE_ISRM_PXX2_LAST, EE_MODEL, isRfProtocolAvailable); + g_model.moduleData[INTERNAL_MODULE].subType = checkIncDec(event, g_model.moduleData[INTERNAL_MODULE].subType, 0, MODULE_SUBTYPE_ISRM_PXX2_ACCST_LR12, EE_MODEL, isRfProtocolAvailable); } } #else @@ -757,7 +786,7 @@ void menuModelSetup(event_t event) if (g_model.moduleData[INTERNAL_MODULE].type == MODULE_TYPE_ISRM_PXX2) { index = 1 + g_model.moduleData[INTERNAL_MODULE].subType; } - lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_ISRM_PXX2_RF_PROTOCOLS, index, attr); + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_ISRM_RF_PROTOCOLS, index, attr); if (attr) { index = checkIncDec(event, index, 0, 3, EE_MODEL); if (checkIncDec_Ret) { @@ -773,32 +802,18 @@ void menuModelSetup(event_t event) break; } - case ITEM_MODEL_SETUP_TRAINER_MODE: - lcdDrawTextAlignedLeft(y, STR_MODE); - lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_VTRAINERMODES, g_model.trainerData.mode, attr); - if (attr) { - g_model.trainerData.mode = checkIncDec(event, g_model.trainerData.mode, 0, TRAINER_MODE_MAX(), EE_MODEL, isTrainerModeAvailable); - } -#if defined(BLUETOOTH) && defined(USEHORUSBT) - if (attr && checkIncDec_Ret) { - bluetooth.state = BLUETOOTH_STATE_OFF; - bluetooth.distantAddr[0] = 0; - } -#endif - break; - case ITEM_MODEL_SETUP_EXTERNAL_MODULE_LABEL: lcdDrawTextAlignedLeft(y, STR_EXTERNALRF); break; case ITEM_MODEL_SETUP_EXTERNAL_MODULE_TYPE: - lcdDrawTextAlignedLeft(y, STR_MODE); + lcdDrawTextAlignedLeft(y, INDENT TR_MODE); lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_EXTERNAL_MODULE_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].type, menuHorizontalPosition==0 ? attr : 0); if (isModuleXJT(EXTERNAL_MODULE)) - lcdDrawTextAtIndex(lcdNextPos + 3, y, STR_ACCST_RF_PROTOCOLS, 1+g_model.moduleData[EXTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0); + lcdDrawTextAtIndex(lcdNextPos + 3, y, STR_XJT_ACCST_RF_PROTOCOLS, 1+g_model.moduleData[EXTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0); else if (isModuleDSM2(EXTERNAL_MODULE)) lcdDrawTextAtIndex(lcdNextPos + 3, y, STR_DSM_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0); - else if (isModuleR9M(EXTERNAL_MODULE)) + else if (isModuleR9MNonAccess(EXTERNAL_MODULE)) lcdDrawTextAtIndex(lcdNextPos + 3, y, STR_R9M_REGION, g_model.moduleData[EXTERNAL_MODULE].subType, (menuHorizontalPosition==1 ? attr : 0)); #if defined(MULTIMODULE) else if (isModuleMultimodule(EXTERNAL_MODULE)) { @@ -806,15 +821,15 @@ void menuModelSetup(event_t event) // Do not use MODEL_SETUP_3RD_COLUMN here since some the protocol string are so long that we cannot afford the 2 spaces (+6) here if (g_model.moduleData[EXTERNAL_MODULE].multi.customProto) { - lcdDrawText(MODEL_SETUP_2ND_COLUMN + 5 * FW, y, STR_MULTI_CUSTOM, menuHorizontalPosition == 1 ? attr : 0); - lcdDrawNumber(MODEL_SETUP_2ND_COLUMN + 14 * FW, y, g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false), menuHorizontalPosition == 2 ? attr : 0, 2); - lcdDrawNumber(MODEL_SETUP_2ND_COLUMN + 16 * FW, y, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition == 3 ? attr : 0, 2); + lcdDrawText(lcdNextPos + FW, y, STR_MULTI_CUSTOM, menuHorizontalPosition == 1 ? attr : 0); + lcdDrawNumber(lcdNextPos + FW, y, g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false), menuHorizontalPosition == 2 ? attr : 0, 2); + lcdDrawNumber(lcdNextPos + FW, y, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition == 3 ? attr : 0, 2); } else { - lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_MULTI_PROTOCOLS, multi_rfProto, menuHorizontalPosition==1 ? attr : 0); - const mm_protocol_definition *pdef = getMultiProtocolDefinition(multi_rfProto); - if (pdef->subTypeString != nullptr) { - lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+11*FW, y, pdef->subTypeString, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition==2 ? attr : 0); + lcdDrawTextAtIndex(lcdNextPos + FW, y, STR_MULTI_PROTOCOLS, multi_rfProto, menuHorizontalPosition==1 ? attr : 0); + const mm_protocol_definition * pdef = getMultiProtocolDefinition(multi_rfProto); + if (pdef->subTypeString) { + lcdDrawTextAtIndex(lcdNextPos + FW, y, pdef->subTypeString, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition==2 ? attr : 0); } } } @@ -859,7 +874,7 @@ void menuModelSetup(event_t event) } } #endif - else if (isModuleR9M(EXTERNAL_MODULE)) { + else if (isModuleR9MNonAccess(EXTERNAL_MODULE)) { g_model.moduleData[EXTERNAL_MODULE].subType = checkIncDec(event, g_model.moduleData[EXTERNAL_MODULE].subType, MODULE_SUBTYPE_R9M_FCC, MODULE_SUBTYPE_R9M_LAST, EE_MODEL, isR9MModeAvailable); @@ -895,22 +910,26 @@ void menuModelSetup(event_t event) #endif } } +#if POPUP_LEVEL > 1 else if (old_editMode > 0) { - if (isModuleR9M(EXTERNAL_MODULE)) { + if (isModuleR9MNonAccess(EXTERNAL_MODULE)) { if (g_model.moduleData[EXTERNAL_MODULE].subType > MODULE_SUBTYPE_R9M_EU) { - POPUP_WARNING(STR_R9M_PROTO_FLEX_WARN1); - SET_WARNING_INFO(STR_R9M_PROTO_WARN2, sizeof(TR_R9M_PROTO_WARN2), 0); + POPUP_WARNING(STR_R9M_PROTO_FLEX_WARN_LINE1); + SET_WARNING_INFO(STR_R9M_PROTO_WARN_LINE2, sizeof(TR_R9M_PROTO_WARN_LINE2) - 1, 0); } +#if POPUP_LEVEL >= 3 else if (g_model.moduleData[EXTERNAL_MODULE].subType == MODULE_SUBTYPE_R9M_EU) { - POPUP_WARNING(STR_R9M_PROTO_EU_WARN1); - SET_WARNING_INFO(STR_R9M_PROTO_WARN2, sizeof(TR_R9M_PROTO_WARN2), 0); + POPUP_WARNING(STR_R9M_PROTO_EU_WARN_LINE1); + SET_WARNING_INFO(STR_R9M_PROTO_WARN_LINE2, sizeof(TR_R9M_PROTO_WARN_LINE2) - 1, 0); } else { - POPUP_WARNING(STR_R9M_PROTO_FCC_WARN1); - SET_WARNING_INFO(STR_R9M_PROTO_WARN2, sizeof(TR_R9M_PROTO_WARN2), 0); + POPUP_WARNING(STR_R9M_PROTO_FCC_WARN_LINE1); + SET_WARNING_INFO(STR_R9M_PROTO_WARN_LINE2, sizeof(TR_R9M_PROTO_WARN_LINE2) - 1, 0); } +#endif } } +#endif } break; @@ -918,49 +937,71 @@ void menuModelSetup(event_t event) lcdDrawTextAlignedLeft(y, STR_TRAINER); break; -#if defined(BLUETOOTH) && defined(USEHORUSBT) - case ITEM_MODEL_SETUP_TRAINER_LINE1: - if (g_model.trainerData.mode == TRAINER_MODE_MASTER_BLUETOOTH) { + case ITEM_MODEL_SETUP_TRAINER_MODE: + lcdDrawTextAlignedLeft(y, INDENT TR_MODE); + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_VTRAINERMODES, g_model.trainerData.mode, attr); if (attr) { - s_editMode = 0; + g_model.trainerData.mode = checkIncDec(event, g_model.trainerData.mode, 0, TRAINER_MODE_MAX(), EE_MODEL, isTrainerModeAvailable); +#if defined(BLUETOOTH) + if (checkIncDec_Ret) { + bluetooth.state = BLUETOOTH_STATE_OFF; + bluetooth.distantAddr[0] = '\0'; + } +#endif } - if (bluetooth.distantAddr[0]) { - lcdDrawText(INDENT_WIDTH, y+1, bluetooth.distantAddr, TINSIZE); - if (bluetooth.state != BLUETOOTH_STATE_CONNECTED) { - lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, BUTTON("Bind"), menuHorizontalPosition == 0 ? attr : 0); - lcdDrawText(MODEL_SETUP_2ND_COLUMN+5*FW, y, BUTTON("Clear"), menuHorizontalPosition == 1 ? attr : 0); + break; + +#if defined(BLUETOOTH) + case ITEM_MODEL_SETUP_TRAINER_BLUETOOTH: + if (g_model.trainerData.mode == TRAINER_MODE_MASTER_BLUETOOTH) { + if (attr) { + s_editMode = 0; + } + if (bluetooth.distantAddr[0]) { + lcdDrawText(INDENT_WIDTH, y+1, bluetooth.distantAddr, TINSIZE); + lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, BUTTON(TR_CLEAR), attr); + if (attr && event == EVT_KEY_BREAK(KEY_ENTER)) { + bluetooth.state = BLUETOOTH_STATE_CLEAR_REQUESTED; + memclear(bluetooth.distantAddr, sizeof(bluetooth.distantAddr)); + } } else { - lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, BUTTON("Clear"), attr); - } - if (attr && event == EVT_KEY_FIRST(KEY_ENTER)) { - if (bluetooth.state == BLUETOOTH_STATE_CONNECTED || menuHorizontalPosition == 1) { - bluetooth.state = BLUETOOTH_STATE_OFF; - bluetooth.distantAddr[0] = 0; + lcdDrawText(INDENT_WIDTH, y, "---"); + if (bluetooth.state < BLUETOOTH_STATE_IDLE) + lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_BUTTON_INIT, attr); + else + lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, BUTTON(TR_DISCOVER), attr); + if (attr && event == EVT_KEY_BREAK(KEY_ENTER)) { + if (bluetooth.state < BLUETOOTH_STATE_IDLE) { + bluetooth.state = BLUETOOTH_STATE_OFF; + } + else { + reusableBuffer.moduleSetup.bt.devicesCount = 0; + bluetooth.state = BLUETOOTH_STATE_DISCOVER_REQUESTED; + } } - else { - bluetooth.state = BLUETOOTH_STATE_BIND_REQUESTED; + + if (bluetooth.state == BLUETOOTH_STATE_DISCOVER_START && reusableBuffer.moduleSetup.bt.devicesCount > 0) { + popupMenuItemsCount = min(reusableBuffer.moduleSetup.bt.devicesCount, 6); + for (uint8_t i=0; i 8) - lcdDrawText(lcdLastRightPos+5, y, "(18ms)"); - else - lcdDrawText(lcdLastRightPos+5, y, "(9ms)"); - } + const char * delay = getModuleDelay(moduleIdx); + if (delay) + lcdDrawText(lcdLastRightPos+5, y, delay); if (attr && s_editMode>0) { switch (menuHorizontalPosition) { case 0: CHECK_INCDEC_MODELVAR_ZERO(event, moduleData.channelsStart, 32-8-moduleData.channelsCount); break; case 1: - CHECK_INCDEC_MODELVAR(event, moduleData.channelsCount, -4, min(maxModuleChannels_M8(moduleIdx), 32-8-moduleData.channelsStart)); -#if defined(INTERNAL_MODULE_PPM) - if ((k == ITEM_MODEL_SETUP_EXTERNAL_MODULE_CHANNELS && g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_PPM) || (k == ITEM_MODEL_SETUP_INTERNAL_MODULE_CHANNELS && g_model.moduleData[INTERNAL_MODULE].type == MODULE_TYPE_PPM) || (k == ITEM_MODEL_SETUP_TRAINER_LINE1)) { + CHECK_INCDEC_MODELVAR_CHECK(event, moduleData.channelsCount, -4, min(maxModuleChannels_M8(moduleIdx), 32-8-moduleData.channelsStart), moduleData.type == MODULE_TYPE_ISRM_PXX2 ? isPxx2IsrmChannelsCountAllowed : nullptr); + if (checkIncDec_Ret && moduleData.type == MODULE_TYPE_PPM) { SET_DEFAULT_PPM_FRAME_LENGTH(moduleIdx); } -#else - if ((k == ITEM_MODEL_SETUP_EXTERNAL_MODULE_CHANNELS && g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_PPM) || (k == ITEM_MODEL_SETUP_TRAINER_LINE1)) { - SET_DEFAULT_PPM_FRAME_LENGTH(moduleIdx); - } -#endif break; } } @@ -1019,7 +1050,7 @@ void menuModelSetup(event_t event) break; } - case ITEM_MODEL_SETUP_TRAINER_LINE2: + case ITEM_MODEL_SETUP_TRAINER_PPM_PARAMS: lcdDrawTextAlignedLeft(y, STR_PPMFRAME); lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, (int16_t)g_model.trainerData.frameLength*5 + 225, (menuHorizontalPosition<=0 ? attr : 0) | PREC1|LEFT); lcdDrawText(lcdLastRightPos, y, STR_MS); @@ -1088,20 +1119,20 @@ void menuModelSetup(event_t event) else { horzpos_t l_posHorz = menuHorizontalPosition; coord_t xOffsetBind = MODEL_SETUP_BIND_OFS; - if (isModuleXJT(moduleIdx) && IS_D8_RX(MODULE_SUBTYPE_PXX1_ACCST_D8)) { + if (!isModuleRxNumAvailable(moduleIdx)) { xOffsetBind = 0; - lcdDrawTextAlignedLeft(y, STR_RECEIVER); + lcdDrawText(INDENT_WIDTH, y, STR_RECEIVER); if (attr) l_posHorz += 1; } else { - lcdDrawTextAlignedLeft(y, STR_RECEIVER_NUM); + lcdDrawText(INDENT_WIDTH, y, STR_RECEIVER_NUM); } - if (isModulePXX2(moduleIdx) || isModulePXX(moduleIdx) || isModuleDSM2(moduleIdx) || isModuleMultimodule(moduleIdx)) { + if (isModuleBindRangeAvailable(moduleIdx)) { if (xOffsetBind) lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.header.modelId[moduleIdx], (l_posHorz==0 ? attr : 0) | LEADING0|LEFT, 2); if (attr && l_posHorz==0) { if (s_editMode>0) { - CHECK_INCDEC_MODELVAR_ZERO(event, g_model.header.modelId[moduleIdx], MAX_RX_NUM(moduleIdx)); + CHECK_INCDEC_MODELVAR_ZERO(event, g_model.header.modelId[moduleIdx], getMaxRxNum(moduleIdx)); if (checkIncDec_Ret) { modelHeaders[g_eeGeneral.currModel].modelId[moduleIdx] = g_model.header.modelId[moduleIdx]; } @@ -1127,29 +1158,9 @@ void menuModelSetup(event_t event) if (attr && l_posHorz>0) { if (s_editMode>0) { if (l_posHorz == 1) { - if (isModuleR9M(moduleIdx) || (isModuleXJT(moduleIdx) && g_model.moduleData[moduleIdx].rfProtocol == MODULE_SUBTYPE_PXX1_ACCST_D16)) { + if (isModuleR9MNonAccess(moduleIdx) || isModuleD16(moduleIdx)) { if (event == EVT_KEY_BREAK(KEY_ENTER)) { - uint8_t default_selection = 0; // R9M_LBT should default to 0 as available options are variables - if (isModuleR9M_LBT(moduleIdx)) { - if (BIND_TELEM_ALLOWED(moduleIdx)) - POPUP_MENU_ADD_ITEM(STR_BINDING_1_8_TELEM_ON); - POPUP_MENU_ADD_ITEM(STR_BINDING_1_8_TELEM_OFF); - if (BIND_TELEM_ALLOWED(moduleIdx) && BIND_CH9TO16_ALLOWED(moduleIdx)) - POPUP_MENU_ADD_ITEM(STR_BINDING_9_16_TELEM_ON); - if (BIND_CH9TO16_ALLOWED(moduleIdx)) - POPUP_MENU_ADD_ITEM(STR_BINDING_9_16_TELEM_OFF); - } - else { - if (BIND_TELEM_ALLOWED(moduleIdx)) - POPUP_MENU_ADD_ITEM(STR_BINDING_1_8_TELEM_ON); - POPUP_MENU_ADD_ITEM(STR_BINDING_1_8_TELEM_OFF); - if (BIND_TELEM_ALLOWED(moduleIdx)) - POPUP_MENU_ADD_ITEM(STR_BINDING_9_16_TELEM_ON); - POPUP_MENU_ADD_ITEM(STR_BINDING_9_16_TELEM_OFF); - default_selection = g_model.moduleData[moduleIdx].pxx.receiver_telem_off + (g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 << 1); - } - POPUP_MENU_SELECT_ITEM(default_selection); - POPUP_MENU_START(onBindMenu); + startBindMenu(moduleIdx); continue; } if (moduleState[moduleIdx].mode == MODULE_MODE_BIND) { @@ -1194,7 +1205,7 @@ void menuModelSetup(event_t event) } if (menuHorizontalPosition == 0) { if (s_editMode > 0) { - CHECK_INCDEC_MODELVAR_ZERO(event, moduleData.failsafeMode, FAILSAFE_LAST); + CHECK_INCDEC_MODELVAR_ZERO(event, moduleData.failsafeMode, isModuleR9M(moduleIdx) ? FAILSAFE_NOPULSES : FAILSAFE_LAST); if (checkIncDec_Ret) SEND_FAILSAFE_NOW(moduleIdx); } } @@ -1252,9 +1263,9 @@ void menuModelSetup(event_t event) } } #endif - if (isModuleR9M(moduleIdx)) { + if (isModuleR9MNonAccess(moduleIdx)) { lcdDrawTextAlignedLeft(y, STR_MODULE_TELEMETRY); - if (IS_TELEMETRY_INTERNAL_MODULE()) { + if (isSportLineUsedByInternalModule()) { lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_DISABLE_INTERNAL); } else { @@ -1271,8 +1282,8 @@ void menuModelSetup(event_t event) case ITEM_MODEL_SETUP_EXTERNAL_MODULE_POWER: { uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); - if (isModuleR9M(moduleIdx)) { - lcdDrawTextAlignedLeft(y, TR_MULTI_RFPOWER); + if (isModuleR9MNonAccess(moduleIdx)) { + lcdDrawTextAlignedLeft(y, TR_RFPOWER); if (isModuleR9M_FCC_VARIANT(moduleIdx)) { lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_R9M_FCC_POWER_VALUES, g_model.moduleData[moduleIdx].pxx.power, LEFT | attr); if (attr) @@ -1337,10 +1348,10 @@ void menuModelSetup(event_t event) case ITEM_MODEL_SETUP_EXTERNAL_MODULE_PXX2_MODEL_NUM: { uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); - lcdDrawTextAlignedLeft(y, STR_RECEIVER_NUM); + lcdDrawText(INDENT_WIDTH, y, STR_RECEIVER_NUM); lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.header.modelId[moduleIdx], attr | LEADING0 | LEFT, 2); if (attr) { - CHECK_INCDEC_MODELVAR_ZERO(event, g_model.header.modelId[moduleIdx], MAX_RX_NUM(moduleIdx)); + CHECK_INCDEC_MODELVAR_ZERO(event, g_model.header.modelId[moduleIdx], getMaxRxNum(moduleIdx)); if (checkIncDec_Ret) { modelHeaders[g_eeGeneral.currModel].modelId[moduleIdx] = g_model.header.modelId[moduleIdx]; } @@ -1352,7 +1363,7 @@ void menuModelSetup(event_t event) case ITEM_MODEL_SETUP_EXTERNAL_MODULE_PXX2_REGISTER_RANGE: { uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); - lcdDrawTextAlignedLeft(y, STR_MODULE); + lcdDrawTextAlignedLeft(y, INDENT TR_MODULE); lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, BUTTON(TR_REGISTER), (menuHorizontalPosition == 0 ? attr : 0)); lcdDrawText(lcdLastRightPos + 3, y, STR_MODULE_RANGE, (menuHorizontalPosition == 1 ? attr : 0)); if (attr) { @@ -1391,80 +1402,9 @@ void menuModelSetup(event_t event) case ITEM_MODEL_SETUP_EXTERNAL_MODULE_PXX2_RECEIVER_1: case ITEM_MODEL_SETUP_EXTERNAL_MODULE_PXX2_RECEIVER_2: case ITEM_MODEL_SETUP_EXTERNAL_MODULE_PXX2_RECEIVER_3: - { - uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); - uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(k); - ModuleInformation & moduleInformation = reusableBuffer.moduleSetup.pxx2.moduleInformation; - - drawStringWithIndex(INDENT_WIDTH, y, STR_RECEIVER, receiverIdx + 1); - - if (!(g_model.moduleData[moduleIdx].pxx2.receivers & (1 << receiverIdx))) { - lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_MODULE_BIND, attr); - if (attr && s_editMode > 0) { - s_editMode = 0; - killEvents(event); - g_model.moduleData[moduleIdx].pxx2.receivers |= (1 << receiverIdx); - memclear(g_model.moduleData[moduleIdx].pxx2.receiverName[receiverIdx], PXX2_LEN_RX_NAME); - storageDirty(EE_MODEL); - } - else { - break; - } - } - - drawReceiverName(MODEL_SETUP_2ND_COLUMN, y, moduleIdx, receiverIdx, attr); - - if (s_editMode && isModuleR9M2(moduleIdx) && moduleState[moduleIdx].mode == MODULE_MODE_NORMAL && moduleInformation.information.modelID) { - moduleInformation.information.modelID = 0; - moduleState[moduleIdx].startBind(&reusableBuffer.moduleSetup.bindInformation); - } - - if (attr && (moduleState[moduleIdx].mode == 0 || s_editMode == 0)) { - if (moduleState[moduleIdx].mode) { - moduleState[moduleIdx].mode = 0; - removePXX2ReceiverIfEmpty(moduleIdx, receiverIdx); - killEvents(event); // we stopped BIND / SHARE, we don't want to re-open the menu - event = 0; - CLEAR_POPUP(); - } - s_editMode = 0; - } - - if (moduleState[moduleIdx].mode == MODULE_MODE_BIND) { - if (reusableBuffer.moduleSetup.bindInformation.step == BIND_INIT) { - if (reusableBuffer.moduleSetup.bindInformation.candidateReceiversCount > 0) { - popupMenuItemsCount = min(reusableBuffer.moduleSetup.bindInformation.candidateReceiversCount, PXX2_MAX_RECEIVERS_PER_MODULE); - for (uint8_t i = 0; i < popupMenuItemsCount; i++) { - popupMenuItems[i] = reusableBuffer.moduleSetup.bindInformation.candidateReceiversNames[i]; - } - popupMenuTitle = STR_PXX2_SELECT_RX; - CLEAR_POPUP(); - POPUP_MENU_START(onPXX2BindMenu); - } - else { - POPUP_WAIT(STR_WAITING_FOR_RX); - } - } - } - - if (attr && EVT_KEY_MASK(event) == KEY_ENTER) { - killEvents(event); - if (!isSimu() && isPXX2ReceiverEmpty(moduleIdx, receiverIdx)) { - onPXX2ReceiverMenu(STR_BIND); - } - else { - POPUP_MENU_ADD_ITEM(STR_BIND); - POPUP_MENU_ADD_ITEM(STR_OPTIONS); - POPUP_MENU_ADD_ITEM(STR_SHARE); - POPUP_MENU_ADD_ITEM(STR_DELETE); - POPUP_MENU_ADD_ITEM(STR_RESET); - } - POPUP_MENU_START(onPXX2ReceiverMenu); - } - } - break; + modelSetupModulePxx2ReceiverLine(CURRENT_MODULE_EDITED(k), CURRENT_RECEIVER_EDITED(k), y, event, attr); + break; #endif - } } diff --git a/radio/src/gui/212x64/model_telemetry.cpp b/radio/src/gui/212x64/model_telemetry.cpp index d952497da..fa1cb87b5 100644 --- a/radio/src/gui/212x64/model_telemetry.cpp +++ b/radio/src/gui/212x64/model_telemetry.cpp @@ -246,7 +246,7 @@ void menuModelTelemetryFrsky(event_t event) break; case ITEM_TELEMETRY_VARIO_SOURCE: - lcdDrawTextAlignedLeft(y, STR_SOURCE); + lcdDrawTextAlignedLeft(y, INDENT TR_SOURCE); drawSource(TELEM_COL2, y, g_model.varioData.source ? MIXSRC_FIRST_TELEM+3*(g_model.varioData.source-1) : 0, attr); if (attr) { g_model.varioData.source = checkIncDec(event, g_model.varioData.source, 0, MAX_TELEMETRY_SENSORS, EE_MODEL|NO_INCDEC_MARKS, isSensorAvailable); diff --git a/radio/src/gui/212x64/model_telemetry_sensor.cpp b/radio/src/gui/212x64/model_telemetry_sensor.cpp index 5ebfe5ae2..2daa516cb 100644 --- a/radio/src/gui/212x64/model_telemetry_sensor.cpp +++ b/radio/src/gui/212x64/model_telemetry_sensor.cpp @@ -178,7 +178,7 @@ void menuModelSensor(event_t event) break; } else if (sensor->formula == TELEM_FORMULA_TOTALIZE) { - lcdDrawTextAlignedLeft(y, NO_INDENT(STR_SOURCE)); + lcdDrawTextAlignedLeft(y, STR_SOURCE); drawSource(SENSOR_2ND_COLUMN, y, sensor->consumption.source ? MIXSRC_FIRST_TELEM+3*(sensor->consumption.source-1) : 0, attr); if (attr) { sensor->consumption.source = checkIncDec(event, sensor->consumption.source, 0, MAX_TELEMETRY_SENSORS, EE_MODEL|NO_INCDEC_MARKS, isSensorAvailable); @@ -227,7 +227,7 @@ void menuModelSensor(event_t event) break; } else { - lcdDrawTextAlignedLeft(y, NO_INDENT(STR_OFFSET)); + lcdDrawTextAlignedLeft(y, STR_OFFSET); if (attr) sensor->custom.offset = checkIncDec(event, sensor->custom.offset, -30000, +30000, EE_MODEL|NO_INCDEC_MARKS|INCDEC_REP10); if (sensor->prec > 0) attr |= (sensor->prec == 2 ? PREC2 : PREC1); lcdDrawNumber(SENSOR_2ND_COLUMN, y, sensor->custom.offset, LEFT|attr); @@ -240,17 +240,17 @@ void menuModelSensor(event_t event) case SENSOR_FIELD_PARAM4: { - drawStringWithIndex(0, y, NO_INDENT(STR_SOURCE), k-SENSOR_FIELD_PARAM1+1); - int8_t & source = sensor->calc.sources[k-SENSOR_FIELD_PARAM1]; + drawStringWithIndex(0, y, STR_SOURCE, k-SENSOR_FIELD_PARAM1+1); + int8_t * source = &sensor->calc.sources[k-SENSOR_FIELD_PARAM1]; if (attr) { - source = checkIncDec(event, source, -MAX_TELEMETRY_SENSORS, MAX_TELEMETRY_SENSORS, EE_MODEL|NO_INCDEC_MARKS, isSensorAvailable); + *source = checkIncDec(event, *source, -MAX_TELEMETRY_SENSORS, MAX_TELEMETRY_SENSORS, EE_MODEL|NO_INCDEC_MARKS, isSensorAvailable); } - if (source < 0) { + if (*source < 0) { lcdDrawChar(SENSOR_2ND_COLUMN, y, '-', attr); - drawSource(lcdNextPos, y, MIXSRC_FIRST_TELEM+3*(-1-source), attr); + drawSource(lcdNextPos, y, MIXSRC_FIRST_TELEM+3*(-1-*source), attr); } else { - drawSource(SENSOR_2ND_COLUMN, y, source ? MIXSRC_FIRST_TELEM+3*(source-1) : 0, attr); + drawSource(SENSOR_2ND_COLUMN, y, *source ? MIXSRC_FIRST_TELEM+3*(*source-1) : 0, attr); } break; } diff --git a/radio/src/gui/212x64/radio_calibration.cpp b/radio/src/gui/212x64/radio_calibration.cpp index d12bfbf12..bf4c829c3 100644 --- a/radio/src/gui/212x64/radio_calibration.cpp +++ b/radio/src/gui/212x64/radio_calibration.cpp @@ -25,14 +25,6 @@ #define BAR_SPACING 12 #define BAR_HEIGHT 22 -enum CalibrationState { - CALIB_START = 0, - CALIB_SET_MIDPOINT, - CALIB_MOVE_STICKS, - CALIB_STORE, - CALIB_FINISHED -}; - void drawPotsBars() { // Optimization by Mike Blandford diff --git a/radio/src/gui/212x64/radio_diaganas.cpp b/radio/src/gui/212x64/radio_diaganas.cpp index 3827d959a..bea4089a4 100644 --- a/radio/src/gui/212x64/radio_diaganas.cpp +++ b/radio/src/gui/212x64/radio_diaganas.cpp @@ -40,11 +40,10 @@ void menuRadioDiagAnalogs(event_t event) } // RAS - if((isModuleXJT(INTERNAL_MODULE) && IS_INTERNAL_MODULE_ON()) || (isModulePXX(EXTERNAL_MODULE) && !IS_INTERNAL_MODULE_ON())) { + if ((isModuleXJT(INTERNAL_MODULE) && IS_INTERNAL_MODULE_ON()) || (isModulePXX1(EXTERNAL_MODULE) && !IS_INTERNAL_MODULE_ON())) { lcdDrawTextAlignedLeft(MENU_HEADER_HEIGHT+6*FH, "RAS"); - lcdDrawNumber(10*FW-1, MENU_HEADER_HEIGHT+6*FH, telemetryData.swrInternal.value, RIGHT); + lcdDrawNumber(10*FW-1, MENU_HEADER_HEIGHT+6*FH, telemetryData.swrInternal.value(), RIGHT); lcdDrawText(LCD_W/2, MENU_HEADER_HEIGHT+6*FH, "XJTVER"); lcdDrawNumber(LCD_W/2 + 10*FW-1, MENU_HEADER_HEIGHT+6*FH, telemetryData.xjtVersion, RIGHT); - } } diff --git a/radio/src/gui/212x64/radio_diagkeys.cpp b/radio/src/gui/212x64/radio_diagkeys.cpp index c6e48b57e..7a9f42499 100644 --- a/radio/src/gui/212x64/radio_diagkeys.cpp +++ b/radio/src/gui/212x64/radio_diagkeys.cpp @@ -22,7 +22,7 @@ void displayKeyState(uint8_t x, uint8_t y, uint8_t key) { - uint8_t t = keyState(key); + uint8_t t = keys[key].state(); lcdDrawChar(x, y, t+'0', t ? INVERS : 0); } @@ -30,30 +30,29 @@ void menuRadioDiagKeys(event_t event) { SIMPLE_SUBMENU(STR_MENU_RADIO_SWITCHES, 1); - lcdDrawText(14*FW, MENU_HEADER_HEIGHT + 1, STR_VTRIM); + lcdDrawText(24*FW, MENU_HEADER_HEIGHT + 1, STR_VTRIM); - for (uint8_t i=0; i<9; i++) { - coord_t y; + for (uint8_t i = 0; i < NUM_TRIMS_KEYS; i++) { + coord_t y = MENU_HEADER_HEIGHT + 1 + FH + FH * (i / 2); + if (i & 1) + lcdDraw1bitBitmap(24 * FW, y, sticks, i / 2, 0); + displayKeyState(i & 1 ? 30 * FW : 28 * FW, y, TRM_BASE + i); + } - if (i < NUM_TRIMS_KEYS) { - y = MENU_HEADER_HEIGHT + 1 + FH + FH*(i/2); - if (i&1) lcdDraw1bitBitmap(14*FW, y, sticks, i/2, 0); - displayKeyState(i&1? 20*FW : 18*FW, y, TRM_BASE+i); - } + for (uint8_t i = 0; i <= KEY_MAX; i++) { + coord_t y = MENU_HEADER_HEIGHT + 1 + FH * i; + lcdDrawTextAtIndex(0, y, STR_VKEYS, (i), 0); + displayKeyState(5 * FW + 2, y, i); + } - if (i <= KEY_MAX) { - y = MENU_HEADER_HEIGHT + 1 + FH*i; - lcdDrawTextAtIndex(0, y, STR_VKEYS, (5-i), 0); - displayKeyState(5*FW+2, y, i); - } - - if (i < NUM_SWITCHES) { - if (SWITCH_EXISTS(i)) { - y = MENU_HEADER_HEIGHT + 1 + FH*i; - getvalue_t val = getValue(MIXSRC_FIRST_SWITCH+i); - getvalue_t sw = ((val < 0) ? 3*i+1 : ((val == 0) ? 3*i+2 : 3*i+3)); - drawSwitch(8*FW+4, y, sw, 0); - } + for (uint8_t i = 0, cnt = 0; i <= NUM_SWITCHES; i++) { + if (SWITCH_EXISTS(i)) { + div_t qr = div(cnt++, 6); + coord_t x = 4 * FH * qr.quot; + coord_t y = MENU_HEADER_HEIGHT + 1 + FH * qr.rem; + getvalue_t val = getValue(MIXSRC_FIRST_SWITCH + i); + getvalue_t sw = ((val < 0) ? 3 * i + 1 : ((val == 0) ? 3 * i + 2 : 3 * i + 3)); + drawSwitch(8 * FW + x, y, sw, 0); } } diff --git a/radio/src/gui/212x64/radio_hardware.cpp b/radio/src/gui/212x64/radio_hardware.cpp deleted file mode 100644 index 16868612d..000000000 --- a/radio/src/gui/212x64/radio_hardware.cpp +++ /dev/null @@ -1,266 +0,0 @@ -/* - * Copyright (C) OpenTX - * - * Based on code named - * th9x - http://code.google.com/p/th9x - * er9x - http://code.google.com/p/er9x - * gruvin9x - http://code.google.com/p/gruvin9x - * - * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "opentx.h" - -enum menuRadioHwItems { - ITEM_RADIO_HARDWARE_LABEL_STICKS, - ITEM_RADIO_HARDWARE_STICK1, - ITEM_RADIO_HARDWARE_STICK2, - ITEM_RADIO_HARDWARE_STICK3, - ITEM_RADIO_HARDWARE_STICK4, - ITEM_RADIO_HARDWARE_LABEL_POTS, - ITEM_RADIO_HARDWARE_POT1, - ITEM_RADIO_HARDWARE_POT2, - CASE_PCBX9E_PCBX9DP(ITEM_RADIO_HARDWARE_POT3) - CASE_PCBX9E(ITEM_RADIO_HARDWARE_POT4) - ITEM_RADIO_HARDWARE_LS, - ITEM_RADIO_HARDWARE_RS, - CASE_PCBX9E(ITEM_RADIO_HARDWARE_LS2) - CASE_PCBX9E(ITEM_RADIO_HARDWARE_RS2) - ITEM_RADIO_HARDWARE_LABEL_SWITCHES, - ITEM_RADIO_HARDWARE_SA, - ITEM_RADIO_HARDWARE_SB, - ITEM_RADIO_HARDWARE_SC, - ITEM_RADIO_HARDWARE_SD, - ITEM_RADIO_HARDWARE_SE, - ITEM_RADIO_HARDWARE_SF, - ITEM_RADIO_HARDWARE_SG, - ITEM_RADIO_HARDWARE_SH, - CASE_PCBX9E(ITEM_RADIO_HARDWARE_SI) - CASE_PCBX9E(ITEM_RADIO_HARDWARE_SJ) - CASE_PCBX9E(ITEM_RADIO_HARDWARE_SK) - CASE_PCBX9E(ITEM_RADIO_HARDWARE_SL) - CASE_PCBX9E(ITEM_RADIO_HARDWARE_SM) - CASE_PCBX9E(ITEM_RADIO_HARDWARE_SN) - CASE_PCBX9E(ITEM_RADIO_HARDWARE_SO) - CASE_PCBX9E(ITEM_RADIO_HARDWARE_SP) - CASE_PCBX9E(ITEM_RADIO_HARDWARE_SQ) - CASE_PCBX9E(ITEM_RADIO_HARDWARE_SR) - CASE_BLUETOOTH(ITEM_RADIO_HARDWARE_BLUETOOTH_MODE) -#if defined(USEHORUSBT) - CASE_BLUETOOTH(ITEM_RADIO_HARDWARE_BLUETOOTH_NAME) -#endif -#if defined(AUX_SERIAL) - ITEM_RADIO_HARDWARE_UART3_MODE, -#endif - ITEM_RADIO_HARDWARE_JITTER_FILTER, - ITEM_RADIO_HARDWARE_DEBUG, - ITEM_RADIO_HARDWARE_MAX -}; - -#if defined(AUX_SERIAL) - #define AUX_SERIAL_ROWS 0, -#else - #define AUX_SERIAL_ROWS -#endif - -#define HW_SETTINGS_COLUMN 15*FW - -#if defined(PCBX9E) - #define POTS_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1 -#elif defined(PCBX9DP) - #define POTS_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1 -#else - #define POTS_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1 -#endif - -#if defined(PCBX9E) - #define SWITCHES_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1 -#else - #define SWITCHES_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1 -#endif - -#if defined(BLUETOOTH) && defined(USEHORUSBT) - #define BLUETOOTH_ROWS 0, uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_OFF ? -1 : 0), -#else - #define BLUETOOTH_ROWS (uint8_t)0, -#endif - -#define SWITCH_TYPE_MAX(sw) ((MIXSRC_SF-MIXSRC_FIRST_SWITCH == sw || MIXSRC_SH-MIXSRC_FIRST_SWITCH == sw) ? SWITCH_2POS : SWITCH_3POS) - - -void menuRadioHardware(event_t event) -{ - MENU(STR_HARDWARE, menuTabGeneral, MENU_RADIO_HARDWARE, ITEM_RADIO_HARDWARE_MAX, { 0, 0, 0, 0, 0, LABEL(Pots), POTS_ROWS, LABEL(Switches), SWITCHES_ROWS, BLUETOOTH_ROWS AUX_SERIAL_ROWS 1 }); - - uint8_t sub = menuVerticalPosition; - - for (int i=0; i0) ? BLINK|INVERS : INVERS) : 0); - switch (k) { - case ITEM_RADIO_HARDWARE_LABEL_STICKS: - lcdDrawTextAlignedLeft(y, STR_STICKS); - lcdDrawText(HW_SETTINGS_COLUMN, y, BUTTON(TR_CALIBRATION), attr); - if (attr && event == EVT_KEY_FIRST(KEY_ENTER)) { - pushMenu(menuRadioCalibration); - } - break; - case ITEM_RADIO_HARDWARE_STICK1: - case ITEM_RADIO_HARDWARE_STICK2: - case ITEM_RADIO_HARDWARE_STICK3: - case ITEM_RADIO_HARDWARE_STICK4: - editStickHardwareSettings(HW_SETTINGS_COLUMN, y, k - ITEM_RADIO_HARDWARE_STICK1, event, attr); - break; - - case ITEM_RADIO_HARDWARE_LS: - case ITEM_RADIO_HARDWARE_RS: -#if defined(PCBX9E) - case ITEM_RADIO_HARDWARE_LS2: - case ITEM_RADIO_HARDWARE_RS2: -#endif - { - int idx = k - ITEM_RADIO_HARDWARE_LS; - lcdDrawTextAtIndex(INDENT_WIDTH, y, STR_VSRCRAW, NUM_STICKS+NUM_POTS+idx+1, menuHorizontalPosition < 0 ? attr : 0); - if (ZEXIST(g_eeGeneral.anaNames[NUM_STICKS+NUM_POTS+idx]) || (attr && menuHorizontalPosition == 0 && s_editMode > 0)) - editName(HW_SETTINGS_COLUMN, y, g_eeGeneral.anaNames[NUM_STICKS+NUM_POTS+idx], LEN_ANA_NAME, event, attr && menuHorizontalPosition == 0); - else - lcdDrawMMM(HW_SETTINGS_COLUMN, y, menuHorizontalPosition == 0 ? attr : 0); - uint8_t mask = (0x01 << idx); - uint8_t potType = (g_eeGeneral.slidersConfig & mask) >> idx; - potType = editChoice(HW_SETTINGS_COLUMN+5*FW, y, "", STR_SLIDERTYPES, potType, SLIDER_NONE, SLIDER_WITH_DETENT, menuHorizontalPosition == 1 ? attr : 0, event); - g_eeGeneral.slidersConfig &= ~mask; - g_eeGeneral.slidersConfig |= (potType << idx); - break; - } - - case ITEM_RADIO_HARDWARE_LABEL_POTS: - lcdDrawTextAlignedLeft(y, STR_POTS); - break; - case ITEM_RADIO_HARDWARE_POT1: - case ITEM_RADIO_HARDWARE_POT2: -#if defined(PCBX9DP) || defined(PCBX9E) - case ITEM_RADIO_HARDWARE_POT3: -#endif -#if defined(PCBX9E) - case ITEM_RADIO_HARDWARE_POT4: -#endif - { - int idx = k - ITEM_RADIO_HARDWARE_POT1; - uint8_t shift = (2*idx); - uint8_t mask = (0x03 << shift); - lcdDrawTextAtIndex(INDENT_WIDTH, y, STR_VSRCRAW, NUM_STICKS+idx+1, menuHorizontalPosition < 0 ? attr : 0); - if (ZEXIST(g_eeGeneral.anaNames[NUM_STICKS+idx]) || (attr && menuHorizontalPosition == 0 && s_editMode > 0)) - editName(HW_SETTINGS_COLUMN, y, g_eeGeneral.anaNames[NUM_STICKS+idx], LEN_ANA_NAME, event, attr && menuHorizontalPosition == 0); - else - lcdDrawMMM(HW_SETTINGS_COLUMN, y, menuHorizontalPosition == 0 ? attr : 0); - uint8_t potType = (g_eeGeneral.potsConfig & mask) >> shift; - potType = editChoice(HW_SETTINGS_COLUMN+5*FW, y, "", STR_POTTYPES, potType, POT_NONE, POT_WITHOUT_DETENT, menuHorizontalPosition == 1 ? attr : 0, event); - g_eeGeneral.potsConfig &= ~mask; - g_eeGeneral.potsConfig |= (potType << shift); - break; - } - - case ITEM_RADIO_HARDWARE_LABEL_SWITCHES: - lcdDrawTextAlignedLeft(y, STR_SWITCHES); - break; - case ITEM_RADIO_HARDWARE_SA: - case ITEM_RADIO_HARDWARE_SB: - case ITEM_RADIO_HARDWARE_SC: - case ITEM_RADIO_HARDWARE_SD: - case ITEM_RADIO_HARDWARE_SE: - case ITEM_RADIO_HARDWARE_SF: - case ITEM_RADIO_HARDWARE_SG: - case ITEM_RADIO_HARDWARE_SH: -#if defined(PCBX9E) - case ITEM_RADIO_HARDWARE_SI: - case ITEM_RADIO_HARDWARE_SJ: - case ITEM_RADIO_HARDWARE_SK: - case ITEM_RADIO_HARDWARE_SL: - case ITEM_RADIO_HARDWARE_SM: - case ITEM_RADIO_HARDWARE_SN: - case ITEM_RADIO_HARDWARE_SO: - case ITEM_RADIO_HARDWARE_SP: - case ITEM_RADIO_HARDWARE_SQ: - case ITEM_RADIO_HARDWARE_SR: -#endif - { - int index = k-ITEM_RADIO_HARDWARE_SA; - int config = SWITCH_CONFIG(index); - lcdDrawTextAtIndex(INDENT_WIDTH, y, STR_VSRCRAW, MIXSRC_FIRST_SWITCH-MIXSRC_Rud+index+1, menuHorizontalPosition < 0 ? attr : 0); - if (ZEXIST(g_eeGeneral.switchNames[index]) || (attr && menuHorizontalPosition == 0 && s_editMode > 0)) - editName(HW_SETTINGS_COLUMN, y, g_eeGeneral.switchNames[index], LEN_SWITCH_NAME, event, menuHorizontalPosition == 0 ? attr : 0); - else - lcdDrawMMM(HW_SETTINGS_COLUMN, y, menuHorizontalPosition == 0 ? attr : 0); - config = editChoice(HW_SETTINGS_COLUMN+5*FW, y, "", STR_SWTYPES, config, SWITCH_NONE, SWITCH_TYPE_MAX(index), menuHorizontalPosition == 1 ? attr : 0, event); - if (attr && checkIncDec_Ret) { - swconfig_t mask = (swconfig_t)0x03 << (2*index); - g_eeGeneral.switchConfig = (g_eeGeneral.switchConfig & ~mask) | ((swconfig_t(config) & 0x03) << (2*index)); - } - break; - } - -#if defined(BLUETOOTH) - case ITEM_RADIO_HARDWARE_BLUETOOTH_MODE: - lcdDrawText(INDENT_WIDTH, y, STR_BLUETOOTH); - lcdDrawTextAtIndex(HW_SETTINGS_COLUMN, y, STR_BLUETOOTH_MODES, g_eeGeneral.bluetoothMode, attr); - if (attr) { -#if defined(USEHORUSBT) - g_eeGeneral.bluetoothMode = checkIncDecGen(event, g_eeGeneral.bluetoothMode, BLUETOOTH_OFF, BLUETOOTH_TRAINER); -#else - g_eeGeneral.bluetoothMode = checkIncDecGen(event, g_eeGeneral.bluetoothMode, BLUETOOTH_OFF, BLUETOOTH_TELEMETRY); -#endif - } - break; -#if defined(USEHORUSBT) - case ITEM_RADIO_HARDWARE_BLUETOOTH_NAME: - lcdDrawText(INDENT_WIDTH, y, STR_NAME); - editName(HW_SETTINGS_COLUMN, y, g_eeGeneral.bluetoothName, LEN_BLUETOOTH_NAME, event, attr); - break; -#endif -#endif - -#if defined(AUX_SERIAL) - case ITEM_RADIO_HARDWARE_UART3_MODE: - g_eeGeneral.auxSerialMode = editChoice(HW_SETTINGS_COLUMN, y, STR_UART3MODE, STR_UART3MODES, g_eeGeneral.auxSerialMode, 0, UART_MODE_MAX, attr, event); - if (attr && checkIncDec_Ret) { - auxSerialInit(g_eeGeneral.auxSerialMode, modelTelemetryProtocol()); - } - break; -#endif - - case ITEM_RADIO_HARDWARE_JITTER_FILTER: - { - uint8_t b = 1-g_eeGeneral.jitterFilter; - g_eeGeneral.jitterFilter = 1 - editCheckBox(b, HW_SETTINGS_COLUMN, y, STR_JITTER_FILTER, attr, event); - break; - } - - case ITEM_RADIO_HARDWARE_DEBUG: - lcdDrawTextAlignedLeft(y, STR_DEBUG); - lcdDrawText(HW_SETTINGS_COLUMN - , y, STR_ANALOGS_BTN, menuHorizontalPosition == 0 ? attr : 0); - lcdDrawText(lcdLastRightPos + 2, y, STR_KEYS_BTN, menuHorizontalPosition == 1 ? attr : 0); - if (attr && event == EVT_KEY_FIRST(KEY_ENTER)) { - if (menuHorizontalPosition == 0) - pushMenu(menuRadioDiagAnalogs); - else - pushMenu(menuRadioDiagKeys); - } - break; - } - } -} diff --git a/radio/src/gui/212x64/radio_setup.cpp b/radio/src/gui/212x64/radio_setup.cpp index ca81fb18b..27fe53f2b 100644 --- a/radio/src/gui/212x64/radio_setup.cpp +++ b/radio/src/gui/212x64/radio_setup.cpp @@ -43,55 +43,60 @@ const unsigned char sticks[] = { #endif enum MenuRadioSetupItems { - CASE_RTCLOCK(ITEM_SETUP_DATE) - CASE_RTCLOCK(ITEM_SETUP_TIME) - ITEM_SETUP_BATTERY_CALIB, - ITEM_SETUP_BATTERY_RANGE, - ITEM_SETUP_SOUND_LABEL, - ITEM_SETUP_BEEP_MODE, - ITEM_SETUP_GENERAL_VOLUME, - ITEM_SETUP_BEEP_VOLUME, - ITEM_SETUP_BEEP_LENGTH, - ITEM_SETUP_SPEAKER_PITCH, - ITEM_SETUP_WAV_VOLUME, - ITEM_SETUP_BACKGROUND_VOLUME, - CASE_VARIO(ITEM_SETUP_VARIO_LABEL) - CASE_VARIO(ITEM_SETUP_VARIO_VOLUME) - CASE_VARIO(ITEM_SETUP_VARIO_PITCH) - CASE_VARIO(ITEM_SETUP_VARIO_RANGE) - CASE_VARIO(ITEM_SETUP_VARIO_REPEAT) - CASE_HAPTIC(ITEM_SETUP_HAPTIC_LABEL) - CASE_HAPTIC(ITEM_SETUP_HAPTIC_MODE) - CASE_HAPTIC(ITEM_SETUP_HAPTIC_LENGTH) - CASE_HAPTIC(ITEM_SETUP_HAPTIC_STRENGTH) - ITEM_SETUP_CONTRAST, - ITEM_SETUP_ALARMS_LABEL, - ITEM_SETUP_BATTERY_WARNING, - ITEM_SETUP_INACTIVITY_ALARM, - ITEM_SETUP_MEMORY_WARNING, - ITEM_SETUP_ALARM_WARNING, - ITEM_SETUP_RSSI_POWEROFF_ALARM, - ITEM_SETUP_BACKLIGHT_LABEL, - ITEM_SETUP_BACKLIGHT_MODE, - ITEM_SETUP_BACKLIGHT_DELAY, - ITEM_SETUP_BRIGHTNESS, - CASE_PCBX9E_PCBX9DP(ITEM_SETUP_BACKLIGHT_COLOR) - ITEM_SETUP_FLASH_BEEP, - CASE_SPLASH_PARAM(ITEM_SETUP_DISABLE_SPLASH) - CASE_GPS(ITEM_SETUP_LABEL_GPS) - CASE_GPS(ITEM_SETUP_TIMEZONE) - CASE_GPS(ITEM_SETUP_ADJUST_RTC) - CASE_GPS(ITEM_SETUP_GPSFORMAT) - CASE_PXX1(ITEM_SETUP_COUNTRYCODE) - ITEM_SETUP_LANGUAGE, - ITEM_SETUP_IMPERIAL, - IF_FAI_CHOICE(ITEM_SETUP_FAI) - ITEM_SETUP_SWITCHES_DELAY, - ITEM_SETUP_USB_MODE, - ITEM_SETUP_RX_CHANNEL_ORD, - ITEM_SETUP_STICK_MODE_LABELS, - ITEM_SETUP_STICK_MODE, - ITEM_SETUP_MAX + CASE_RTCLOCK(ITEM_RADIO_SETUP_DATE) + CASE_RTCLOCK(ITEM_RADIO_SETUP_TIME) + ITEM_RADIO_SETUP_BATTERY_CALIB, + ITEM_RADIO_SETUP_BATTERY_RANGE, + ITEM_RADIO_SETUP_SOUND_LABEL, + ITEM_RADIO_SETUP_BEEP_MODE, + ITEM_RADIO_SETUP_GENERAL_VOLUME, + ITEM_RADIO_SETUP_BEEP_VOLUME, + ITEM_RADIO_SETUP_BEEP_LENGTH, + ITEM_RADIO_SETUP_SPEAKER_PITCH, + ITEM_RADIO_SETUP_WAV_VOLUME, + ITEM_RADIO_SETUP_BACKGROUND_VOLUME, + CASE_VARIO(ITEM_RADIO_SETUP_VARIO_LABEL) + CASE_VARIO(ITEM_RADIO_SETUP_VARIO_VOLUME) + CASE_VARIO(ITEM_RADIO_SETUP_VARIO_PITCH) + CASE_VARIO(ITEM_RADIO_SETUP_VARIO_RANGE) + CASE_VARIO(ITEM_RADIO_SETUP_VARIO_REPEAT) + CASE_HAPTIC(ITEM_RADIO_SETUP_HAPTIC_LABEL) + CASE_HAPTIC(ITEM_RADIO_SETUP_HAPTIC_MODE) + CASE_HAPTIC(ITEM_RADIO_SETUP_HAPTIC_LENGTH) + CASE_HAPTIC(ITEM_RADIO_SETUP_HAPTIC_STRENGTH) + ITEM_RADIO_SETUP_CONTRAST, + ITEM_RADIO_SETUP_ALARMS_LABEL, + ITEM_RADIO_SETUP_BATTERY_WARNING, + ITEM_RADIO_SETUP_INACTIVITY_ALARM, + ITEM_RADIO_SETUP_MEMORY_WARNING, + ITEM_RADIO_SETUP_ALARM_WARNING, + ITEM_RADIO_SETUP_RSSI_POWEROFF_ALARM, + ITEM_RADIO_SETUP_BACKLIGHT_LABEL, + ITEM_RADIO_SETUP_BACKLIGHT_MODE, + ITEM_RADIO_SETUP_BACKLIGHT_DELAY, + ITEM_RADIO_SETUP_BRIGHTNESS, + CASE_PCBX9E_PCBX9DP(ITEM_RADIO_SETUP_BACKLIGHT_COLOR) + ITEM_RADIO_SETUP_FLASH_BEEP, + CASE_SPLASH_PARAM(ITEM_RADIO_SETUP_DISABLE_SPLASH) + CASE_PWR_BUTTON_PRESS(ITEM_RADIO_SETUP_PWR_ON_SPEED) + CASE_PWR_BUTTON_PRESS(ITEM_RADIO_SETUP_PWR_OFF_SPEED) +#if defined(PXX2) + ITEM_RADIO_SETUP_OWNER_ID, +#endif + CASE_GPS(ITEM_RADIO_SETUP_LABEL_GPS) + CASE_GPS(ITEM_RADIO_SETUP_TIMEZONE) + CASE_GPS(ITEM_RADIO_SETUP_ADJUST_RTC) + CASE_GPS(ITEM_RADIO_SETUP_GPSFORMAT) + CASE_PXX1(ITEM_RADIO_SETUP_COUNTRYCODE) + ITEM_RADIO_SETUP_LANGUAGE, + ITEM_RADIO_SETUP_IMPERIAL, + IF_FAI_CHOICE(ITEM_RADIO_SETUP_FAI) + ITEM_RADIO_SETUP_SWITCHES_DELAY, + ITEM_RADIO_SETUP_USB_MODE, + ITEM_RADIO_SETUP_RX_CHANNEL_ORD, + ITEM_RADIO_SETUP_STICK_MODE_LABELS, + ITEM_RADIO_SETUP_STICK_MODE, + ITEM_RADIO_SETUP_MAX }; void menuRadioSetup(event_t event) @@ -100,7 +105,7 @@ void menuRadioSetup(event_t event) struct gtm t; gettime(&t); - if ((menuVerticalPosition==ITEM_SETUP_DATE || menuVerticalPosition==ITEM_SETUP_TIME) && + if ((menuVerticalPosition==ITEM_RADIO_SETUP_DATE || menuVerticalPosition==ITEM_RADIO_SETUP_TIME) && (s_editMode>0) && (event==EVT_KEY_FIRST(KEY_ENTER) || event==EVT_KEY_BREAK(KEY_ENTER) || event==EVT_KEY_LONG(KEY_ENTER) || event==EVT_KEY_FIRST(KEY_EXIT))) { // set the date and time into RTC chip @@ -116,7 +121,60 @@ void menuRadioSetup(event_t event) } #endif - MENU(STR_MENURADIOSETUP, menuTabGeneral, MENU_RADIO_SETUP, ITEM_SETUP_MAX, { 2, 2, 0, 1, LABEL(SOUND), 0, 0, 0, 0, 0, 0, 0, CASE_VARIO(LABEL(VARIO)) CASE_VARIO(0) CASE_VARIO(0) CASE_VARIO(0) CASE_VARIO(0) CASE_HAPTIC(LABEL(HAPTIC)) CASE_HAPTIC(0) CASE_HAPTIC(0) CASE_HAPTIC(0) 0, LABEL(ALARMS), 0, 0, 0, 0, 0, LABEL(BACKLIGHT), 0, 0, 0, CASE_PCBX9E_PCBX9DP(0) 0, CASE_SPLASH_PARAM(0) CASE_GPS(LABEL(GPS)) CASE_GPS(0) CASE_GPS(0) CASE_GPS(0) CASE_PXX1(0) 0, 0, IF_FAI_CHOICE(0) 0, 0, 0, LABEL(TX_MODE), 0, 1/*to force edit mode*/ }); + MENU(STR_MENURADIOSETUP, menuTabGeneral, MENU_RADIO_SETUP, ITEM_RADIO_SETUP_MAX, { + 2, // date + 2, // time + 0, // battery calibration + 1, // battery range + LABEL(SOUND), + 0, // beep mode + 0, // general volume + 0, // beep volume + 0, // beep length + 0, // speaker piutch + 0, // wav volume + 0, // background volume + CASE_VARIO(LABEL(VARIO)) + CASE_VARIO(0) + CASE_VARIO(0) + CASE_VARIO(0) + CASE_VARIO(0) + CASE_HAPTIC(LABEL(HAPTIC)) + CASE_HAPTIC(0) // haptic mode + CASE_HAPTIC(0) // haptic length + CASE_HAPTIC(0) // haptic strength + 0, // contrast + LABEL(ALARMS), + 0, // battery warning + 0, // inactivity warning + 0, // memory warning + 0, // alarm warning + 0, // RSSI power off alarm + LABEL(BACKLIGHT), + 0, // backlight mode + 0, // backlight delay + 0, // brightness + CASE_PCBX9E_PCBX9DP(0) // backlight color + 0, // flash beep + CASE_SPLASH_PARAM(0) // disable splash + CASE_PWR_BUTTON_PRESS(0) // pwr on speed + CASE_PWR_BUTTON_PRESS(0) // pwr off speed + CASE_PXX2(0) + CASE_GPS(LABEL(GPS)) + CASE_GPS(0) // timezone + CASE_GPS(0) // adjust RTC + CASE_GPS(0) // GPS format + CASE_PXX1(0) // country code + 0, // language + 0, // imperial + IF_FAI_CHOICE(0) + 0, // switches delay + 0, // USB mode + 0, // RX channels order + LABEL(TX_MODE), + 0, // sticks mode + 1 /*to force edit mode*/ + }); if (event == EVT_ENTRY) { reusableBuffer.generalSettings.stickMode = g_eeGeneral.stickMode; @@ -131,7 +189,7 @@ void menuRadioSetup(event_t event) uint8_t attr = (sub == k ? blink : 0); switch (k) { - case ITEM_SETUP_DATE: + case ITEM_RADIO_SETUP_DATE: lcdDrawTextAlignedLeft(y, STR_DATE); lcdDrawChar(RADIO_SETUP_DATE_COLUMN, y, '-'); lcdDrawChar(RADIO_SETUP_DATE_COLUMN+3*FW-2, y, '-'); for (uint8_t j=0; j<3; j++) { @@ -163,7 +221,7 @@ void menuRadioSetup(event_t event) } break; - case ITEM_SETUP_TIME: + case ITEM_RADIO_SETUP_TIME: lcdDrawTextAlignedLeft(y, STR_TIME); lcdDrawChar(RADIO_SETUP_TIME_COLUMN+1, y, ':'); lcdDrawChar(RADIO_SETUP_TIME_COLUMN+3*FW-2, y, ':'); for (uint8_t j=0; j<3; j++) { @@ -189,7 +247,7 @@ void menuRadioSetup(event_t event) } break; - case ITEM_SETUP_BATTERY_CALIB: + case ITEM_RADIO_SETUP_BATTERY_CALIB: lcdDrawTextAlignedLeft(y, STR_BATT_CALIB); putsVolts(RADIO_SETUP_2ND_COLUMN, y, getBatteryVoltage(), attr | PREC2 | LEFT); if (attr && s_editMode > 0) { @@ -197,7 +255,7 @@ void menuRadioSetup(event_t event) } break; - case ITEM_SETUP_BATTERY_RANGE: + case ITEM_RADIO_SETUP_BATTERY_RANGE: lcdDrawTextAlignedLeft(y, STR_BATTERY_RANGE); putsVolts(RADIO_SETUP_2ND_COLUMN, y, 90+g_eeGeneral.vBatMin, (menuHorizontalPosition==0 ? attr : 0)|LEFT|NO_UNIT); lcdDrawChar(lcdLastRightPos, y, '-'); @@ -211,15 +269,15 @@ void menuRadioSetup(event_t event) } break; - case ITEM_SETUP_SOUND_LABEL: + case ITEM_RADIO_SETUP_SOUND_LABEL: lcdDrawTextAlignedLeft(y, STR_SOUND_LABEL); break; - case ITEM_SETUP_BEEP_MODE: + case ITEM_RADIO_SETUP_BEEP_MODE: g_eeGeneral.beepMode = editChoice(RADIO_SETUP_2ND_COLUMN, y, STR_SPEAKER, STR_VBEEPMODE, g_eeGeneral.beepMode, -2, 1, attr, event); break; - case ITEM_SETUP_GENERAL_VOLUME: + case ITEM_RADIO_SETUP_GENERAL_VOLUME: { lcdDrawTextAlignedLeft(y, STR_SPEAKER_VOLUME); uint8_t b = g_eeGeneral.speakerVolume+VOLUME_LEVEL_DEF; @@ -233,23 +291,23 @@ void menuRadioSetup(event_t event) break; } - case ITEM_SETUP_BEEP_VOLUME: + case ITEM_RADIO_SETUP_BEEP_VOLUME: SLIDER_5POS(y, g_eeGeneral.beepVolume, STR_BEEP_VOLUME, event, attr); break; - case ITEM_SETUP_WAV_VOLUME: + case ITEM_RADIO_SETUP_WAV_VOLUME: SLIDER_5POS(y, g_eeGeneral.wavVolume, STR_WAV_VOLUME, event, attr); break; - case ITEM_SETUP_BACKGROUND_VOLUME: + case ITEM_RADIO_SETUP_BACKGROUND_VOLUME: SLIDER_5POS(y, g_eeGeneral.backgroundVolume, STR_BG_VOLUME, event, attr); break; - case ITEM_SETUP_BEEP_LENGTH: + case ITEM_RADIO_SETUP_BEEP_LENGTH: SLIDER_5POS(y, g_eeGeneral.beepLength, STR_BEEP_LENGTH, event, attr); break; - case ITEM_SETUP_SPEAKER_PITCH: + case ITEM_RADIO_SETUP_SPEAKER_PITCH: lcdDrawTextAlignedLeft( y, STR_SPKRPITCH); lcdDrawChar(RADIO_SETUP_2ND_COLUMN, y, '+', attr); lcdDrawNumber(RADIO_SETUP_2ND_COLUMN+FW, y, g_eeGeneral.speakerPitch*15, attr|LEFT); @@ -260,29 +318,29 @@ void menuRadioSetup(event_t event) break; #if defined(VARIO) - case ITEM_SETUP_VARIO_LABEL: + case ITEM_RADIO_SETUP_VARIO_LABEL: lcdDrawTextAlignedLeft(y, STR_VARIO); break; - case ITEM_SETUP_VARIO_VOLUME: + case ITEM_RADIO_SETUP_VARIO_VOLUME: SLIDER_5POS(y, g_eeGeneral.varioVolume, TR_SPEAKER_VOLUME, event, attr); break; - case ITEM_SETUP_VARIO_PITCH: + case ITEM_RADIO_SETUP_VARIO_PITCH: lcdDrawTextAlignedLeft(y, STR_PITCH_AT_ZERO); lcdDrawNumber(RADIO_SETUP_2ND_COLUMN, y, VARIO_FREQUENCY_ZERO+(g_eeGeneral.varioPitch*10), attr|LEFT); lcdDrawText(lcdLastRightPos, y, "Hz", attr); if (attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.varioPitch, -40, 40); break; - case ITEM_SETUP_VARIO_RANGE: + case ITEM_RADIO_SETUP_VARIO_RANGE: lcdDrawTextAlignedLeft(y, STR_PITCH_AT_MAX); lcdDrawNumber(RADIO_SETUP_2ND_COLUMN, y, VARIO_FREQUENCY_ZERO+(g_eeGeneral.varioPitch*10)+VARIO_FREQUENCY_RANGE+(g_eeGeneral.varioRange*10), attr|LEFT); lcdDrawText(lcdLastRightPos, y, "Hz", attr); if (attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.varioRange, -80, 80); break; - case ITEM_SETUP_VARIO_REPEAT: + case ITEM_RADIO_SETUP_VARIO_REPEAT: lcdDrawTextAlignedLeft(y, STR_REPEAT_AT_ZERO); lcdDrawNumber(RADIO_SETUP_2ND_COLUMN, y, VARIO_REPEAT_ZERO+(g_eeGeneral.varioRepeat*10), attr|LEFT); lcdDrawText(lcdLastRightPos, y, STR_MS, attr); @@ -291,24 +349,24 @@ void menuRadioSetup(event_t event) #endif #if defined(HAPTIC) - case ITEM_SETUP_HAPTIC_LABEL: + case ITEM_RADIO_SETUP_HAPTIC_LABEL: lcdDrawTextAlignedLeft(y, STR_HAPTIC_LABEL); break; - case ITEM_SETUP_HAPTIC_MODE: - g_eeGeneral.hapticMode = editChoice(RADIO_SETUP_2ND_COLUMN, y, STR_MODE, STR_VBEEPMODE, g_eeGeneral.hapticMode, -2, 1, attr, event); + case ITEM_RADIO_SETUP_HAPTIC_MODE: + g_eeGeneral.hapticMode = editChoice(RADIO_SETUP_2ND_COLUMN, y, INDENT TR_MODE, STR_VBEEPMODE, g_eeGeneral.hapticMode, -2, 1, attr, event); break; - case ITEM_SETUP_HAPTIC_LENGTH: + case ITEM_RADIO_SETUP_HAPTIC_LENGTH: SLIDER_5POS(y, g_eeGeneral.hapticLength, STR_LENGTH, event, attr); break; - case ITEM_SETUP_HAPTIC_STRENGTH: + case ITEM_RADIO_SETUP_HAPTIC_STRENGTH: SLIDER_5POS(y, g_eeGeneral.hapticStrength, STR_HAPTICSTRENGTH, event, attr); break; #endif - case ITEM_SETUP_CONTRAST: + case ITEM_RADIO_SETUP_CONTRAST: lcdDrawTextAlignedLeft(y, STR_CONTRAST); lcdDrawNumber(RADIO_SETUP_2ND_COLUMN, y, g_eeGeneral.contrast, attr|LEFT); if (attr) { @@ -317,64 +375,70 @@ void menuRadioSetup(event_t event) } break; - case ITEM_SETUP_ALARMS_LABEL: + case ITEM_RADIO_SETUP_ALARMS_LABEL: lcdDrawTextAlignedLeft(y, STR_ALARMS_LABEL); break; - case ITEM_SETUP_BATTERY_WARNING: + case ITEM_RADIO_SETUP_BATTERY_WARNING: lcdDrawTextAlignedLeft(y, STR_BATTERYWARNING); putsVolts(RADIO_SETUP_2ND_COLUMN, y, g_eeGeneral.vBatWarn, attr|LEFT); if (attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.vBatWarn, 40, 120); // 4-12V break; - case ITEM_SETUP_MEMORY_WARNING: + case ITEM_RADIO_SETUP_MEMORY_WARNING: { uint8_t b = 1 - g_eeGeneral.disableMemoryWarning; g_eeGeneral.disableMemoryWarning = 1 - editCheckBox(b, RADIO_SETUP_2ND_COLUMN, y, STR_MEMORYWARNING, attr, event); break; } - case ITEM_SETUP_ALARM_WARNING: + case ITEM_RADIO_SETUP_ALARM_WARNING: { uint8_t b = 1 - g_eeGeneral.disableAlarmWarning; g_eeGeneral.disableAlarmWarning = 1 - editCheckBox(b, RADIO_SETUP_2ND_COLUMN, y, STR_ALARMWARNING, attr, event); break; } - case ITEM_SETUP_RSSI_POWEROFF_ALARM: + case ITEM_RADIO_SETUP_RSSI_POWEROFF_ALARM: { uint8_t b = 1 - g_eeGeneral.disableRssiPoweroffAlarm; g_eeGeneral.disableRssiPoweroffAlarm = 1 - editCheckBox(b, RADIO_SETUP_2ND_COLUMN, y, STR_RSSISHUTDOWNALARM, attr, event); break; } - case ITEM_SETUP_INACTIVITY_ALARM: + case ITEM_RADIO_SETUP_INACTIVITY_ALARM: lcdDrawTextAlignedLeft(y, STR_INACTIVITYALARM); lcdDrawNumber(RADIO_SETUP_2ND_COLUMN, y, g_eeGeneral.inactivityTimer, attr|LEFT); lcdDrawChar(lcdLastRightPos, y, 'm'); if(attr) g_eeGeneral.inactivityTimer = checkIncDec(event, g_eeGeneral.inactivityTimer, 0, 250, EE_GENERAL); //0..250minutes break; - case ITEM_SETUP_BACKLIGHT_LABEL: + case ITEM_RADIO_SETUP_BACKLIGHT_LABEL: lcdDrawTextAlignedLeft(y, STR_BACKLIGHT_LABEL); break; - case ITEM_SETUP_BACKLIGHT_MODE: - g_eeGeneral.backlightMode = editChoice(RADIO_SETUP_2ND_COLUMN, y, STR_MODE, STR_VBLMODE, g_eeGeneral.backlightMode, e_backlight_mode_off, e_backlight_mode_on, attr, event); + case ITEM_RADIO_SETUP_BACKLIGHT_MODE: + g_eeGeneral.backlightMode = editChoice(RADIO_SETUP_2ND_COLUMN, y, INDENT TR_MODE, STR_VBLMODE, g_eeGeneral.backlightMode, e_backlight_mode_off, e_backlight_mode_on, attr, event); break; - case ITEM_SETUP_FLASH_BEEP: + case ITEM_RADIO_SETUP_FLASH_BEEP: g_eeGeneral.alarmsFlash = editCheckBox(g_eeGeneral.alarmsFlash, RADIO_SETUP_2ND_COLUMN, y, STR_ALARM, attr, event ) ; break; - case ITEM_SETUP_BACKLIGHT_DELAY: +#if defined(PXX2) + case ITEM_RADIO_SETUP_OWNER_ID: + editSingleName(RADIO_SETUP_2ND_COLUMN, y, STR_OWNER_ID, g_eeGeneral.ownerRegistrationID, PXX2_LEN_REGISTRATION_ID, event, attr); + break; +#endif + + case ITEM_RADIO_SETUP_BACKLIGHT_DELAY: lcdDrawTextAlignedLeft(y, STR_BLDELAY); lcdDrawNumber(RADIO_SETUP_2ND_COLUMN, y, g_eeGeneral.lightAutoOff*5, attr|LEFT); lcdDrawChar(lcdLastRightPos, y, 's'); if (attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.lightAutoOff, 0, 600/5); break; - case ITEM_SETUP_BRIGHTNESS: + case ITEM_RADIO_SETUP_BRIGHTNESS: lcdDrawTextAlignedLeft(y, STR_BRIGHTNESS); lcdDrawNumber(RADIO_SETUP_2ND_COLUMN, y, 100-g_eeGeneral.backlightBright, attr|LEFT) ; if (attr) { @@ -385,7 +449,7 @@ void menuRadioSetup(event_t event) break; #if defined(PCBX9DP) || defined(PCBX9E) - case ITEM_SETUP_BACKLIGHT_COLOR: + case ITEM_RADIO_SETUP_BACKLIGHT_COLOR: lcdDrawTextAlignedLeft(y, STR_BLCOLOR); drawSlider(RADIO_SETUP_2ND_COLUMN, y, g_eeGeneral.backlightColor, 20, attr); if (attr) g_eeGeneral.backlightColor = checkIncDec(event, g_eeGeneral.backlightColor, 0, 20, EE_GENERAL | NO_INCDEC_MARKS); @@ -393,8 +457,7 @@ void menuRadioSetup(event_t event) #endif #if defined(SPLASH) - case ITEM_SETUP_DISABLE_SPLASH: - { + case ITEM_RADIO_SETUP_DISABLE_SPLASH: lcdDrawTextAlignedLeft(y, STR_SPLASHSCREEN); if (SPLASH_NEEDED()) { lcdDrawNumber(RADIO_SETUP_2ND_COLUMN, y, SPLASH_TIMEOUT/100, attr|LEFT); @@ -405,36 +468,49 @@ void menuRadioSetup(event_t event) } if (attr) g_eeGeneral.splashMode = -checkIncDecGen(event, -g_eeGeneral.splashMode, -3, 4); break; - } +#endif + +#if defined(PWR_BUTTON_PRESS) + case ITEM_RADIO_SETUP_PWR_ON_SPEED: + lcdDrawTextAlignedLeft(y, STR_PWR_ON_SPEED); + drawSlider(RADIO_SETUP_2ND_COLUMN, y, g_eeGeneral.pwrOnSpeed +1, 3, attr); + if (attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.pwrOnSpeed, -1, 2); + break; + + case ITEM_RADIO_SETUP_PWR_OFF_SPEED: + lcdDrawTextAlignedLeft(y, STR_PWR_OFF_SPEED); + drawSlider(RADIO_SETUP_2ND_COLUMN, y, g_eeGeneral.pwrOffSpeed +1, 3, attr); + if (attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.pwrOffSpeed, -1, 2); + break; #endif #if defined(TELEMETRY_FRSKY) && defined(GPS) - case ITEM_SETUP_LABEL_GPS: + case ITEM_RADIO_SETUP_LABEL_GPS: lcdDrawTextAlignedLeft(y, STR_GPS); break; - case ITEM_SETUP_TIMEZONE: + case ITEM_RADIO_SETUP_TIMEZONE: lcdDrawTextAlignedLeft(y, STR_TIMEZONE); lcdDrawNumber(RADIO_SETUP_2ND_COLUMN, y, g_eeGeneral.timezone, attr|LEFT); if (attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.timezone, -12, 12); break; - case ITEM_SETUP_ADJUST_RTC: + case ITEM_RADIO_SETUP_ADJUST_RTC: g_eeGeneral.adjustRTC = editCheckBox(g_eeGeneral.adjustRTC, RADIO_SETUP_2ND_COLUMN, y, STR_ADJUST_RTC, attr, event); break; - case ITEM_SETUP_GPSFORMAT: + case ITEM_RADIO_SETUP_GPSFORMAT: g_eeGeneral.gpsFormat = editChoice(RADIO_SETUP_2ND_COLUMN, y, STR_GPSCOORD, STR_GPSFORMAT, g_eeGeneral.gpsFormat, 0, 1, attr, event); break; #endif -#if defined(PXX) - case ITEM_SETUP_COUNTRYCODE: +#if defined(PXX1) + case ITEM_RADIO_SETUP_COUNTRYCODE: g_eeGeneral.countryCode = editChoice(RADIO_SETUP_2ND_COLUMN, y, STR_COUNTRYCODE, STR_COUNTRYCODES, g_eeGeneral.countryCode, 0, 2, attr, event); break; #endif - case ITEM_SETUP_LANGUAGE: + case ITEM_RADIO_SETUP_LANGUAGE: lcdDrawTextAlignedLeft(y, STR_VOICELANG); lcdDrawText(RADIO_SETUP_2ND_COLUMN, y, currentLanguagePack->name, attr); if (attr) { @@ -446,12 +522,12 @@ void menuRadioSetup(event_t event) } break; - case ITEM_SETUP_IMPERIAL: + case ITEM_RADIO_SETUP_IMPERIAL: g_eeGeneral.imperial = editChoice(RADIO_SETUP_2ND_COLUMN, y, STR_UNITSSYSTEM, STR_VUNITSSYSTEM, g_eeGeneral.imperial, 0, 1, attr, event); break; #if defined(FAI_CHOICE) - case ITEM_SETUP_FAI: + case ITEM_RADIO_SETUP_FAI: editCheckBox(g_eeGeneral.fai, RADIO_SETUP_2ND_COLUMN, y, "FAI Mode"), attr, event; if (attr && checkIncDec_Ret) { if (g_eeGeneral.fai) @@ -463,33 +539,33 @@ void menuRadioSetup(event_t event) #endif - case ITEM_SETUP_SWITCHES_DELAY: + case ITEM_RADIO_SETUP_SWITCHES_DELAY: lcdDrawTextAlignedLeft(y, STR_SWITCHES_DELAY); lcdDrawNumber(RADIO_SETUP_2ND_COLUMN, y, 10*SWITCHES_DELAY(), attr|LEFT); lcdDrawText(lcdLastRightPos, y, STR_MS, attr); if (attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.switchesDelay, -15, 100-15); break; - case ITEM_SETUP_USB_MODE: + case ITEM_RADIO_SETUP_USB_MODE: g_eeGeneral.USBMode = editChoice(RADIO_SETUP_2ND_COLUMN, y, STR_USBMODE, STR_USBMODES, g_eeGeneral.USBMode, USB_UNSELECTED_MODE, USB_MAX_MODE, attr, event); break; - case ITEM_SETUP_RX_CHANNEL_ORD: + case ITEM_RADIO_SETUP_RX_CHANNEL_ORD: lcdDrawTextAlignedLeft(y, STR_RXCHANNELORD); // RAET->AETR for (uint8_t i=1; i<=4; i++) { - putsChnLetter(RADIO_SETUP_2ND_COLUMN - FW + i*FW, y, channel_order(i), attr); + putsChnLetter(RADIO_SETUP_2ND_COLUMN - FW + i*FW, y, channelOrder(i), attr); } if (attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.templateSetup, 0, 23); break; - case ITEM_SETUP_STICK_MODE_LABELS: - lcdDrawTextAlignedLeft(y, NO_INDENT(STR_MODE)); + case ITEM_RADIO_SETUP_STICK_MODE_LABELS: + lcdDrawTextAlignedLeft(y, STR_MODE); for (uint8_t i=0; i<4; i++) { lcdDraw1bitBitmap((6+4*i)*FW, y, sticks, i, 0); } break; - case ITEM_SETUP_STICK_MODE: + case ITEM_RADIO_SETUP_STICK_MODE: lcdDrawChar(2*FW, y, '1'+reusableBuffer.generalSettings.stickMode, attr); for (uint8_t i=0; i<4; i++) { putsStickName((6+4*i)*FW, y, *(modn12x3 + 4*reusableBuffer.generalSettings.stickMode + i), 0); @@ -500,7 +576,7 @@ void menuRadioSetup(event_t event) else if (reusableBuffer.generalSettings.stickMode != g_eeGeneral.stickMode) { pausePulses(); g_eeGeneral.stickMode = reusableBuffer.generalSettings.stickMode; - checkTHR(); + checkThrottleStick(); resumePulses(); waitKeysReleased(); } diff --git a/radio/src/gui/212x64/radio_version.cpp b/radio/src/gui/212x64/radio_version.cpp deleted file mode 100644 index b3fbaca32..000000000 --- a/radio/src/gui/212x64/radio_version.cpp +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (C) OpenTX - * - * Based on code named - * th9x - http://code.google.com/p/th9x - * er9x - http://code.google.com/p/er9x - * gruvin9x - http://code.google.com/p/gruvin9x - * - * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "opentx.h" - -void menuRadioVersion(event_t event) -{ - char id[27]; - if (warningResult) { - warningResult = 0; - showMessageBox(STR_STORAGE_FORMAT); - storageEraseAll(false); - NVIC_SystemReset(); - } - - getCPUUniqueID(id); - - SIMPLE_MENU(STR_MENUVERSION, menuTabGeneral, MENU_RADIO_VERSION, 1); - - lcdDrawTextAlignedLeft(MENU_HEADER_HEIGHT+1, vers_stamp); - lcdDrawTextAlignedLeft(MENU_HEADER_HEIGHT+4*FH+1, "UID\037\033:"); - lcdDrawText(5*FW+3, MENU_HEADER_HEIGHT+4*FH+1, id); - - lcdDrawText(INDENT_WIDTH, MENU_HEADER_HEIGHT+5*FH+1, "[ENTER Long] " STR_EEBACKUP); - lcdDrawText(INDENT_WIDTH, MENU_HEADER_HEIGHT+6*FH+1, "[MENU Long] " STR_FACTORYRESET); - lcdDrawFilledRect(0, MENU_HEADER_HEIGHT+5*FH, LCD_W, 2*FH+1, SOLID); - - if (event == EVT_KEY_LONG(KEY_ENTER)) { - eepromBackup(); - } - else if (event == EVT_KEY_LONG(KEY_MENU)) { - POPUP_CONFIRMATION(STR_CONFIRMRESET, nullptr); - } -} diff --git a/radio/src/gui/212x64/startup_shutdown.cpp b/radio/src/gui/212x64/startup_shutdown.cpp new file mode 100644 index 000000000..6b039ed71 --- /dev/null +++ b/radio/src/gui/212x64/startup_shutdown.cpp @@ -0,0 +1,86 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include "opentx.h" + + +#define ANIMATIONS_BITMAP_WIDTH 60 +#define ANIMATIONS_BITMAP_HEIGHT 60 + +const unsigned char bmp_startup[] = { +#include "startup.lbm" +}; + +const unsigned char bmp_lock[] = { +#include "lock.lbm" +}; + +const unsigned char bmp_shutdown[] = { +#include "shutdown.lbm" +}; + +const unsigned char bmp_sleep[] = { +#include "sleep.lbm" +}; + +void drawStartupAnimation(uint32_t duration, uint32_t totalDuration) +{ + if (totalDuration == 0) + return; + + uint8_t index = limit(0, duration / (totalDuration / 5), 4); + + lcdRefreshWait(); + lcdClear(); + + if (index == 0) + lcdDrawBitmap((LCD_W - ANIMATIONS_BITMAP_WIDTH) / 2, (LCD_H - ANIMATIONS_BITMAP_HEIGHT) / 2, bmp_lock, 0, ANIMATIONS_BITMAP_WIDTH); + else + lcdDrawBitmap((LCD_W - ANIMATIONS_BITMAP_WIDTH) / 2, (LCD_H - ANIMATIONS_BITMAP_HEIGHT) / 2, bmp_startup, (index - 1) * ANIMATIONS_BITMAP_WIDTH, ANIMATIONS_BITMAP_WIDTH); + + lcdRefresh(); +} + +void drawShutdownAnimation(uint32_t duration, uint32_t totalDuration, const char * message) +{ + if (totalDuration == 0) + return; + + uint8_t index = limit(0, duration / (totalDuration / 4), 3); + + lcdRefreshWait(); + lcdClear(); + + lcdDrawBitmap((LCD_W - ANIMATIONS_BITMAP_WIDTH) / 2, (LCD_H - ANIMATIONS_BITMAP_HEIGHT) / 2, bmp_shutdown, (3 - index) * ANIMATIONS_BITMAP_WIDTH, ANIMATIONS_BITMAP_WIDTH); + if (message) { + lcdDrawText((LCD_W - getTextWidth(message)) / 2, LCD_H - 2*FH, message); + } + + lcdRefresh(); +} + +void drawSleepBitmap() +{ + lcdRefreshWait(); + lcdClear(); + lcdDrawBitmap((LCD_W - ANIMATIONS_BITMAP_WIDTH) / 2, (LCD_H - ANIMATIONS_BITMAP_HEIGHT) / 2, bmp_sleep, 0); + lcdRefresh(); + lcdRefreshWait(); +} diff --git a/radio/src/gui/212x64/view_main.cpp b/radio/src/gui/212x64/view_main.cpp index aed354a10..dd6900206 100644 --- a/radio/src/gui/212x64/view_main.cpp +++ b/radio/src/gui/212x64/view_main.cpp @@ -249,15 +249,10 @@ void displayTopBar() /* Notifs icons */ coord_t x = BAR_NOTIFS_X; -#if defined(LOG_TELEMETRY) || defined(WATCHDOG_DISABLED) - LCD_NOTIF_ICON(x, ICON_REBOOT); - x -= 12; -#else - if (unexpectedShutdown) { + if (isAsteriskDisplayed()) { LCD_NOTIF_ICON(x, ICON_REBOOT); x -= 12; } -#endif if (usbPlugged()) { LCD_NOTIF_ICON(x, ICON_USB); @@ -299,7 +294,7 @@ void displayTopBar() lcdDrawFilledRect(BAR_X, BAR_Y, BAR_W, BAR_H, SOLID, FILL_WHITE|GREY(12)|ROUND); /* The inside of the Batt gauge */ - displayTopBarGauge(batt_icon_x+FW, GET_TXBATT_BARS(), IS_TXBATT_WARNING()); + displayTopBarGauge(batt_icon_x+FW, GET_TXBATT_BARS(10), IS_TXBATT_WARNING()); /* The inside of the RSSI gauge */ if (TELEMETRY_RSSI() > 0) { diff --git a/radio/src/gui/212x64/view_statistics.cpp b/radio/src/gui/212x64/view_statistics.cpp index 3b7f04a49..ecc20b793 100644 --- a/radio/src/gui/212x64/view_statistics.cpp +++ b/radio/src/gui/212x64/view_statistics.cpp @@ -29,8 +29,7 @@ void menuStatisticsView(event_t event) { title(STR_MENUSTAT); - switch(event) - { + switch(event) { case EVT_KEY_FIRST(KEY_UP): case EVT_KEY_BREAK(KEY_PAGE): chainMenu(menuStatisticsDebug); @@ -46,7 +45,7 @@ void menuStatisticsView(event_t event) #endif break; - case EVT_KEY_LONG(KEY_MENU): // historical + case EVT_KEY_LONG(KEY_MENU): // historical case EVT_KEY_LONG(KEY_ENTER): g_eeGeneral.globalTimer = 0; storageDirty(EE_GENERAL); @@ -60,15 +59,15 @@ void menuStatisticsView(event_t event) // Session and Total timers lcdDrawText(STATS_1ST_COLUMN, FH*1+1, "SES", BOLD); - drawTimer(STATS_1ST_COLUMN + STATS_LABEL_WIDTH, FH*1+1, sessionTimer, 0, 0); + drawTimer(STATS_1ST_COLUMN + STATS_LABEL_WIDTH, FH*1+1, sessionTimer); lcdDrawText(STATS_1ST_COLUMN, FH*2+1, "TOT", BOLD); drawTimer(STATS_1ST_COLUMN + STATS_LABEL_WIDTH, FH*2+1, g_eeGeneral.globalTimer + sessionTimer, TIMEHOUR, 0); // Throttle special timers lcdDrawText(STATS_2ND_COLUMN, FH*0+1, "THR", BOLD); - drawTimer(STATS_2ND_COLUMN + STATS_LABEL_WIDTH, FH*0+1, s_timeCumThr, 0, 0); + drawTimer(STATS_2ND_COLUMN + STATS_LABEL_WIDTH, FH*0+1, s_timeCumThr); lcdDrawText(STATS_2ND_COLUMN, FH*1+1, "TH%", BOLD); - drawTimer(STATS_2ND_COLUMN + STATS_LABEL_WIDTH, FH*1+1, s_timeCum16ThrP/16, 0, 0); + drawTimer(STATS_2ND_COLUMN + STATS_LABEL_WIDTH, FH*1+1, s_timeCum16ThrP/16); // Timers for (int i=0; i 3600) drawTimer(STATS_3RD_COLUMN + STATS_LABEL_WIDTH, FH*i+1, timersStates[i].val, TIMEHOUR, 0); else - drawTimer(STATS_3RD_COLUMN + STATS_LABEL_WIDTH, FH*i+1, timersStates[i].val, 0, 0); + drawTimer(STATS_3RD_COLUMN + STATS_LABEL_WIDTH, FH*i+1, timersStates[i].val); } #if defined(THRTRACE) @@ -116,14 +115,19 @@ void menuStatisticsDebug(event_t event) } #endif - switch(event) - { + switch(event) { + case EVT_ENTRY: + case EVT_ENTRY_UP: + enableVBatBridge(); + break; + case EVT_KEY_LONG(KEY_ENTER): g_eeGeneral.globalTimer = 0; - storageDirty(EE_GENERAL); sessionTimer = 0; + storageDirty(EE_GENERAL); killEvents(event); break; + case EVT_KEY_FIRST(KEY_ENTER): #if defined(LUA) maxLuaInterval = 0; @@ -132,20 +136,24 @@ void menuStatisticsDebug(event_t event) maxMixerDuration = 0; break; - case EVT_KEY_FIRST(KEY_DOWN): - case EVT_KEY_LONG(KEY_PAGE): - killEvents(event); - chainMenu(menuStatisticsView); - break; - case EVT_KEY_FIRST(KEY_UP): case EVT_KEY_BREAK(KEY_PAGE): + disableVBatBridge(); chainMenu(menuStatisticsDebug2); break; + case EVT_KEY_FIRST(KEY_DOWN): + case EVT_KEY_LONG(KEY_PAGE): + killEvents(event); + disableVBatBridge(); + chainMenu(menuStatisticsView); + break; + case EVT_KEY_FIRST(KEY_EXIT): + disableVBatBridge(); chainMenu(menuMainView); break; + #if defined(WATCHDOG_TEST) case EVT_KEY_LONG(KEY_MENU): { @@ -157,44 +165,62 @@ void menuStatisticsDebug(event_t event) #endif } - lcdDrawTextAlignedLeft(MENU_DEBUG_ROW3, "Free Mem"); - lcdDrawNumber(MENU_DEBUG_COL1_OFS, MENU_DEBUG_ROW3, availableMemory(), LEFT); - lcdDrawText(lcdLastRightPos, MENU_DEBUG_ROW3, "b"); + uint8_t y = FH + 1; + +#if defined(STM32) && !defined(SIMU) && defined(DEBUG) + lcdDrawTextAlignedLeft(y, "Usb"); + lcdDrawNumber(MENU_DEBUG_COL1_OFS, y, charsWritten, LEFT); + lcdDrawText(lcdLastRightPos, y, " "); + lcdDrawNumber(lcdLastRightPos, y, APP_Rx_ptr_in, LEFT); + lcdDrawText(lcdLastRightPos, y, " "); + lcdDrawNumber(lcdLastRightPos, y, APP_Rx_ptr_out, LEFT); + lcdDrawText(lcdLastRightPos, y, " "); + lcdDrawNumber(lcdLastRightPos, y, usbWraps, LEFT); + y += FH; +#endif + +#if defined(STM32) + lcdDrawTextAlignedLeft(y, "Free Mem"); + lcdDrawNumber(MENU_DEBUG_COL1_OFS, y, availableMemory(), LEFT); + lcdDrawText(lcdLastRightPos, y, "b"); + y += FH; +#endif #if defined(LUA) - lcdDrawTextAlignedLeft(MENU_DEBUG_ROW2, "Lua scripts"); - lcdDrawText(MENU_DEBUG_COL1_OFS, MENU_DEBUG_ROW2+1, "[Duration]", SMLSIZE); - lcdDrawNumber(lcdLastRightPos, MENU_DEBUG_ROW2, 10*maxLuaDuration, LEFT); - lcdDrawText(lcdLastRightPos+2, MENU_DEBUG_ROW2+1, "[Interval]", SMLSIZE); - lcdDrawNumber(lcdLastRightPos, MENU_DEBUG_ROW2, 10*maxLuaInterval, LEFT); + lcdDrawTextAlignedLeft(y, "Lua scripts"); + lcdDrawText(MENU_DEBUG_COL1_OFS, y+1, "[Duration]", SMLSIZE); + lcdDrawNumber(lcdLastRightPos, y, 10*maxLuaDuration, LEFT); + lcdDrawText(lcdLastRightPos+2, y+1, "[Interval]", SMLSIZE); + lcdDrawNumber(lcdLastRightPos, y, 10*maxLuaInterval, LEFT); + y += FH; #endif - lcdDrawTextAlignedLeft(MENU_DEBUG_ROW1, STR_TMIXMAXMS); - lcdDrawNumber(MENU_DEBUG_COL1_OFS, MENU_DEBUG_ROW1, DURATION_MS_PREC2(maxMixerDuration), PREC2|LEFT); - lcdDrawText(lcdLastRightPos, MENU_DEBUG_ROW1, "ms"); + lcdDrawTextAlignedLeft(y, STR_TMIXMAXMS); + lcdDrawNumber(MENU_DEBUG_COL1_OFS, y, DURATION_MS_PREC2(maxMixerDuration), PREC2|LEFT); + lcdDrawText(lcdLastRightPos, y, "ms"); + y += FH; -#if !defined(SIMU) && defined(DEBUG) - lcdDrawTextAlignedLeft(MENU_DEBUG_ROW4, "Usb"); - lcdDrawNumber(MENU_DEBUG_COL1_OFS, MENU_DEBUG_ROW4, charsWritten, LEFT); - lcdDrawText(lcdLastRightPos, MENU_DEBUG_ROW4, " "); - lcdDrawNumber(lcdLastRightPos, MENU_DEBUG_ROW4, APP_Rx_ptr_in, LEFT); - lcdDrawText(lcdLastRightPos, MENU_DEBUG_ROW4, " "); - lcdDrawNumber(lcdLastRightPos, MENU_DEBUG_ROW4, APP_Rx_ptr_out, LEFT); - lcdDrawText(lcdLastRightPos, MENU_DEBUG_ROW4, " "); - lcdDrawNumber(lcdLastRightPos, MENU_DEBUG_ROW4, usbWraps, LEFT); + lcdDrawTextAlignedLeft(y, STR_FREE_STACK); + lcdDrawText(MENU_DEBUG_COL1_OFS, y+1, "[M]", SMLSIZE); + lcdDrawNumber(lcdLastRightPos, y, menusStack.available(), LEFT); + lcdDrawText(lcdLastRightPos+2, y+1, "[X]", SMLSIZE); + lcdDrawNumber(lcdLastRightPos, y, mixerStack.available(), LEFT); + lcdDrawText(lcdLastRightPos+2, y+1, "[A]", SMLSIZE); + lcdDrawNumber(lcdLastRightPos, y, audioStack.available(), LEFT); + lcdDrawText(lcdLastRightPos+2, y+1, "[I]", SMLSIZE); + lcdDrawNumber(lcdLastRightPos, y, stackAvailable(), LEFT); + y += FH; + +#if defined(DEBUG_LATENCY) + lcdDrawTextAlignedLeft(y, "Heartbeat"); + if (heartbeatCapture.valid) + lcdDrawNumber(MENU_DEBUG_COL1_OFS, y, heartbeatCapture.count, LEFT); + else + lcdDrawText(MENU_DEBUG_COL1_OFS, y, "---"); + y += FH; #endif - lcdDrawTextAlignedLeft(MENU_DEBUG_ROW5, STR_FREE_STACK); - lcdDrawText(MENU_DEBUG_COL1_OFS, MENU_DEBUG_ROW5+1, "[M]", SMLSIZE); - lcdDrawNumber(lcdLastRightPos, MENU_DEBUG_ROW5, menusStack.available(), LEFT); - lcdDrawText(lcdLastRightPos+2, MENU_DEBUG_ROW5+1, "[X]", SMLSIZE); - lcdDrawNumber(lcdLastRightPos, MENU_DEBUG_ROW5, mixerStack.available(), LEFT); - lcdDrawText(lcdLastRightPos+2, MENU_DEBUG_ROW5+1, "[A]", SMLSIZE); - lcdDrawNumber(lcdLastRightPos, MENU_DEBUG_ROW5, audioStack.available(), LEFT); - lcdDrawText(lcdLastRightPos+2, MENU_DEBUG_ROW5+1, "[I]", SMLSIZE); - lcdDrawNumber(lcdLastRightPos, MENU_DEBUG_ROW5, stackAvailable(), LEFT); - - lcdDrawText(3*FW, 7*FH+1, STR_MENUTORESET); + lcdDrawText(LCD_W/2, 7*FH+1, STR_MENUTORESET, CENTERED); lcdInvertLastLine(); } @@ -202,11 +228,7 @@ void menuStatisticsDebug2(event_t event) { title(STR_MENUDEBUG); - switch(event) - { - - - + switch(event) { case EVT_KEY_FIRST(KEY_UP): case EVT_KEY_BREAK(KEY_PAGE): #if defined(DEBUG_TRACE_BUFFER) @@ -222,7 +244,6 @@ void menuStatisticsDebug2(event_t event) chainMenu(menuStatisticsDebug); break; - case EVT_KEY_FIRST(KEY_EXIT): chainMenu(menuMainView); break; @@ -237,7 +258,7 @@ void menuStatisticsDebug2(event_t event) lcdDrawNumber(MENU_DEBUG_COL1_OFS, MENU_DEBUG_ROW1, telemetryErrors, RIGHT); - lcdDrawText(3*FW, 7*FH+1, STR_MENUTORESET); + lcdDrawText(LCD_W/2, 7*FH+1, STR_MENUTORESET, CENTERED); lcdInvertLastLine(); } @@ -286,7 +307,7 @@ void menuTraceBuffer(event_t event) const struct TraceElement * te = getTraceElement(k); if (te) { //time - putstime_t tme = te->time % SECS_PER_DAY; + int32_t tme = te->time % SECS_PER_DAY; drawTimer(4*FW, y, tme, TIMEHOUR|LEFT, TIMEHOUR|LEFT); //event lcdDrawNumber(14*FW, y, te->event, LEADING0|LEFT, 3); diff --git a/radio/src/gui/212x64/view_telemetry.cpp b/radio/src/gui/212x64/view_telemetry.cpp index 2d6b759c6..04dc411c5 100644 --- a/radio/src/gui/212x64/view_telemetry.cpp +++ b/radio/src/gui/212x64/view_telemetry.cpp @@ -21,7 +21,6 @@ #include "opentx.h" #define STATUS_BAR_Y (7*FH+1) -#define TELEM_2ND_COLUMN (11*FW) uint8_t s_frsky_view = 0; diff --git a/radio/src/gui/212x64/widgets.cpp b/radio/src/gui/212x64/widgets.cpp index 7251f201d..424b9aade 100644 --- a/radio/src/gui/212x64/widgets.cpp +++ b/radio/src/gui/212x64/widgets.cpp @@ -20,19 +20,6 @@ #include "opentx.h" -const unsigned char SLEEP_BITMAP[] = { - #include "../../bitmaps/212x64/sleep.lbm" -}; - -#define SLEEP_BITMAP_WIDTH 60 -#define SLEEP_BITMAP_HEIGHT 60 -void drawSleepBitmap() -{ - lcdClear(); - lcdDrawBitmap((LCD_W-SLEEP_BITMAP_WIDTH)/2, (LCD_H-SLEEP_BITMAP_HEIGHT)/2, SLEEP_BITMAP, 0, SLEEP_BITMAP_WIDTH); - lcdRefresh(); -} - void drawStick(coord_t centrex, int16_t xval, int16_t yval) { #define BOX_CENTERY (LCD_H-BOX_WIDTH/2-10) diff --git a/radio/src/gui/480x272/CMakeLists.txt b/radio/src/gui/480x272/CMakeLists.txt new file mode 100644 index 000000000..de19e4b6a --- /dev/null +++ b/radio/src/gui/480x272/CMakeLists.txt @@ -0,0 +1,49 @@ +set(GUI_SRC + ${GUI_SRC} + lcd.cpp + splash.cpp + fonts.cpp + popups.cpp + widgets.cpp + menu_model.cpp + model_select.cpp + model_setup.cpp + model_module_options.cpp + model_receiver_options.cpp + model_failsafe.cpp + model_logical_switches.cpp + model_special_functions.cpp + model_outputs.cpp + model_telemetry.cpp + model_telemetry_sensor.cpp + menu_radio.cpp + radio_setup.cpp + radio_trainer.cpp + radio_version.cpp + radio_hardware.cpp + radio_calibration.cpp + view_main.cpp + view_statistics.cpp + ) + +set(SRC + ${SRC} + gui/common/widgets.cpp + gui/common/arm/widgets.cpp + ) + +if(FLIGHT_MODES) + set(GUI_SRC + ${GUI_SRC} + model_flightmodes.cpp + ) +endif() + +if(LUA STREQUAL YES) + set(GUI_SRC + ${GUI_SRC} + model_custom_scripts.cpp + ) +endif() + +include(gui/common/colorlcd/CMakeLists.txt) diff --git a/radio/src/gui/480x272/gui.h b/radio/src/gui/480x272/gui.h index faceac2b9..a096fabf6 100644 --- a/radio/src/gui/480x272/gui.h +++ b/radio/src/gui/480x272/gui.h @@ -28,6 +28,8 @@ #include "bitmaps.h" #include "theme.h" +#define HEADER_LINE 0 + #define MENU_TOOLTIPS #define MENU_HEADER_HEIGHT 45 #define MENU_TITLE_TOP 48 diff --git a/radio/src/gui/480x272/lcd.cpp b/radio/src/gui/480x272/lcd.cpp index a9f9075ab..c260bf54b 100644 --- a/radio/src/gui/480x272/lcd.cpp +++ b/radio/src/gui/480x272/lcd.cpp @@ -250,7 +250,7 @@ void drawRtcTime(coord_t x, coord_t y, LcdFlags flags) drawTimer(x, y, getValue(MIXSRC_TX_TIME), flags); } -void drawTimer(coord_t x, coord_t y, putstime_t tme, LcdFlags flags) +void drawTimer(coord_t x, coord_t y, int32_t tme, LcdFlags flags) { char str[LEN_TIMER_STRING]; getTimerString(str, tme, (flags & TIMEHOUR) != 0); @@ -290,7 +290,7 @@ void putsModelName(coord_t x, coord_t y, char * name, uint8_t id, LcdFlags att) void drawSwitch(coord_t x, coord_t y, swsrc_t idx, LcdFlags flags) { char s[8]; - getSwitchString(s, idx); + getSwitchPositionName(s, idx); lcdDrawText(x, y, s, flags); } @@ -301,7 +301,7 @@ void drawCurveName(coord_t x, coord_t y, int8_t idx, LcdFlags flags) lcdDrawText(x, y, s, flags); } -void drawTimerMode(coord_t x, coord_t y, int32_t mode, LcdFlags att) +void drawTimerMode(coord_t x, coord_t y, swsrc_t mode, LcdFlags att) { if (mode >= 0) { if (mode < TMRMODE_COUNT) { diff --git a/radio/src/gui/480x272/lcd.h b/radio/src/gui/480x272/lcd.h index e5529ac3c..adce60fbb 100644 --- a/radio/src/gui/480x272/lcd.h +++ b/radio/src/gui/480x272/lcd.h @@ -32,8 +32,6 @@ #define CENTER -#define lcdint_t int32_t - /* lcd common flags */ #define BLINK 0x01 @@ -144,24 +142,19 @@ void lcdDrawHexNumber(coord_t x, coord_t y, uint32_t val, LcdFlags mode=0); void lcdDrawNumber(coord_t x, coord_t y, int32_t val, LcdFlags flags=0, uint8_t len=0, const char * prefix=NULL, const char * suffix=NULL); #if !defined(BOOT) - -#define putstime_t int32_t - void drawRtcTime(coord_t x, coord_t y, LcdFlags att=0); -void drawTimer(coord_t x, coord_t y, putstime_t tme, LcdFlags att=0); -void drawReceiverName(coord_t x, coord_t y, uint8_t moduleIdx, uint8_t receiverIdx, LcdFlags flags=0); +void drawTimer(coord_t x, coord_t y, int32_t tme, LcdFlags att=0); void putsModelName(coord_t x, coord_t y, char *name, uint8_t id, LcdFlags att); void putsStickName(coord_t x, coord_t y, uint8_t idx, LcdFlags att=0); void drawSwitch(coord_t x, coord_t y, swsrc_t swtch, LcdFlags flags=0); void drawSource(coord_t x, coord_t y, mixsrc_t idx, LcdFlags att=0); void drawCurveName(coord_t x, coord_t y, int8_t idx, LcdFlags att=0); -void drawTimerMode(coord_t x, coord_t y, int32_t mode, LcdFlags att=0); +void drawTimerMode(coord_t x, coord_t y, swsrc_t mode, LcdFlags att=0); void drawTrimMode(coord_t x, coord_t y, uint8_t phase, uint8_t idx, LcdFlags att); #define putsChn(x, y, idx, att) drawSource(x, y, MIXSRC_CH1+idx-1, att) void putsChnLetter(coord_t x, coord_t y, uint8_t idx, LcdFlags attr); - #endif // !BOOT #define SOLID 0xff diff --git a/radio/src/gui/480x272/menu_radio.cpp b/radio/src/gui/480x272/menu_radio.cpp index d39b0f7ef..42327fc6f 100644 --- a/radio/src/gui/480x272/menu_radio.cpp +++ b/radio/src/gui/480x272/menu_radio.cpp @@ -23,6 +23,9 @@ const MenuHandlerFunc menuTabGeneral[MENU_RADIO_PAGES_COUNT] = { menuRadioSetup, menuRadioSdManager, +#if defined(LUA) || defined(PXX2) + menuRadioTools, +#endif menuRadioSpecialFunctions, menuRadioTrainer, menuRadioHardware, diff --git a/radio/src/gui/480x272/menus.h b/radio/src/gui/480x272/menus.h index 67e309ae9..708417b76 100644 --- a/radio/src/gui/480x272/menus.h +++ b/radio/src/gui/480x272/menus.h @@ -67,7 +67,8 @@ enum MenuIcons { ICON_OPENTX, ICON_RADIO, ICON_RADIO_SETUP, - ICON_RADIO_SD_BROWSER, + ICON_RADIO_SD_MANAGER, + ICON_RADIO_TOOLS, ICON_RADIO_GLOBAL_FUNCTIONS, ICON_RADIO_TRAINER, ICON_RADIO_HARDWARE, @@ -179,12 +180,17 @@ bool menuModelCustomScripts(event_t event); bool menuModelTelemetryFrsky(event_t event); bool menuModelSensor(event_t event); bool menuModelExpoOne(event_t event); +bool menuModelModuleOptions(event_t event); +bool menuModelReceiverOptions(event_t event); extern const MenuHandlerFunc menuTabModel[MENU_MODEL_PAGES_COUNT]; enum EnumTabRadio { MENU_RADIO_SETUP, MENU_RADIO_SD_MANAGER, +#if defined(LUA) || defined(PXX2) + MENU_RADIO_TOOLS, +#endif MENU_RADIO_SPECIAL_FUNCTIONS, MENU_RADIO_TRAINER, MENU_RADIO_HARDWARE, @@ -195,7 +201,10 @@ enum EnumTabRadio { const uint8_t RADIO_ICONS[MENU_RADIO_PAGES_COUNT + 1] = { ICON_RADIO, ICON_RADIO_SETUP, - ICON_RADIO_SD_BROWSER, + ICON_RADIO_SD_MANAGER, +#if defined(LUA) || defined(PXX2) + ICON_RADIO_TOOLS, +#endif ICON_RADIO_GLOBAL_FUNCTIONS, ICON_RADIO_TRAINER, ICON_RADIO_HARDWARE, @@ -210,6 +219,8 @@ bool menuRadioTrainer(event_t event); bool menuRadioVersion(event_t event); bool menuRadioHardware(event_t event); bool menuRadioCalibration(event_t event); +bool menuRadioSpectrumAnalyser(event_t event); +bool menuRadioPowerMeter(event_t event); extern const MenuHandlerFunc menuTabGeneral[MENU_RADIO_PAGES_COUNT]; @@ -263,10 +274,6 @@ bool menuAboutView(event_t event); bool menuMainViewChannelsMonitor(event_t event); bool menuTextView(event_t event); bool menuScreensTheme(event_t event); -bool menuRadioSpectrumAnalyser(event_t event); -bool menuRadioPowerMeter(event_t event); - -typedef uint16_t FlightModesType; extern int8_t checkIncDec_Ret; // global helper vars @@ -285,10 +292,7 @@ extern int8_t s_editMode; // global editmode #define NO_DBLKEYS 0x80 // mawrow special values -#define READONLY_ROW ((uint8_t)-1) -#define TITLE_ROW READONLY_ROW -#define ORPHAN_ROW ((uint8_t)-2) -#define HIDDEN_ROW ((uint8_t)-3) +#define ORPHAN_ROW ((uint8_t)-3) #define NAVIGATION_LINE_BY_LINE 0x40 #define CURSOR_ON_LINE() (menuHorizontalPosition<0) @@ -477,14 +481,14 @@ void insertMix(uint8_t idx); void copySelection(char * dst, const char * src, uint8_t size); +void drawPopupBackgroundAndBorder(coord_t x, coord_t y, coord_t w, coord_t h); void showMessageBox(const char * title); void runPopupWarning(event_t event); extern void (* popupFunc)(event_t event); extern uint8_t warningInfoFlags; -#define DISPLAY_WARNING (*popupFunc) - +#define DISPLAY_WARNING(evt) (*popupFunc)(evt) #define POPUP_INFORMATION(s) (warningText = s, warningType = WARNING_TYPE_INFO, warningInfoText = 0, popupFunc = runPopupWarning) #define POPUP_WARNING(s) (warningType = WARNING_TYPE_ASTERISK, warningText = s, warningInfoText = 0, popupFunc = runPopupWarning) #define POPUP_INPUT(s, func) (warningText = s, popupFunc = func) diff --git a/radio/src/gui/480x272/model_failsafe.cpp b/radio/src/gui/480x272/model_failsafe.cpp index 0a720aad0..16494ccfc 100644 --- a/radio/src/gui/480x272/model_failsafe.cpp +++ b/radio/src/gui/480x272/model_failsafe.cpp @@ -40,13 +40,13 @@ bool menuModelFailsafe(event_t event) s_editMode = 0; } else { - int16_t & failsafe = g_model.failsafeChannels[menuVerticalPosition]; - if (failsafe < FAILSAFE_CHANNEL_HOLD) - failsafe = FAILSAFE_CHANNEL_HOLD; - else if (failsafe == FAILSAFE_CHANNEL_HOLD) - failsafe = FAILSAFE_CHANNEL_NOPULSE; + int16_t * failsafe = &g_model.failsafeChannels[menuVerticalPosition]; + if (*failsafe < FAILSAFE_CHANNEL_HOLD) + *failsafe = FAILSAFE_CHANNEL_HOLD; + else if (*failsafe == FAILSAFE_CHANNEL_HOLD) + *failsafe = FAILSAFE_CHANNEL_NOPULSE; else - failsafe = 0; + *failsafe = 0; } } else { diff --git a/radio/src/gui/480x272/model_gvars.cpp b/radio/src/gui/480x272/model_gvars.cpp index 27e005fc1..202647e08 100644 --- a/radio/src/gui/480x272/model_gvars.cpp +++ b/radio/src/gui/480x272/model_gvars.cpp @@ -23,28 +23,28 @@ void editGVarValue(coord_t x, coord_t y, event_t event, uint8_t gvar, uint8_t flightMode, LcdFlags flags) { FlightModeData * fm = &g_model.flightModeData[flightMode]; - gvar_t & v = fm->gvars[gvar]; + gvar_t * v = &fm->gvars[gvar]; int16_t vmin, vmax; - if (v > GVAR_MAX) { - uint8_t fm = v - GVAR_MAX - 1; + if (*v > GVAR_MAX) { + uint8_t fm = *v - GVAR_MAX - 1; if (fm >= flightMode) fm++; drawFlightMode(x, y, fm + 1, flags&(~LEFT)); vmin = GVAR_MAX + 1; vmax = GVAR_MAX + MAX_FLIGHT_MODES - 1; } else { - drawGVarValue(x, y, gvar, v, flags); + drawGVarValue(x, y, gvar, *v, flags); vmin = GVAR_MIN + g_model.gvars[gvar].min; vmax = GVAR_MAX - g_model.gvars[gvar].max; } if (flags & INVERS) { if (event == EVT_KEY_LONG(KEY_ENTER) && flightMode > 0) { - v = (v > GVAR_MAX ? 0 : GVAR_MAX+1); + *v = (*v > GVAR_MAX ? 0 : GVAR_MAX+1); storageDirty(EE_MODEL); } else if (s_editMode > 0) { - v = checkIncDec(event, v, vmin, vmax, EE_MODEL); + *v = checkIncDec(event, *v, vmin, vmax, EE_MODEL); } } } diff --git a/radio/src/gui/480x272/model_inputs.cpp b/radio/src/gui/480x272/model_inputs.cpp index 3ee84c047..7f7346b03 100644 --- a/radio/src/gui/480x272/model_inputs.cpp +++ b/radio/src/gui/480x272/model_inputs.cpp @@ -95,7 +95,7 @@ void insertExpo(uint8_t idx) ExpoData * expo = expoAddress(idx); memmove(expo+1, expo, (MAX_EXPOS-(idx+1))*sizeof(ExpoData)); memclear(expo, sizeof(ExpoData)); - expo->srcRaw = (s_currCh > 4 ? MIXSRC_Rud - 1 + s_currCh : MIXSRC_Rud - 1 + channel_order(s_currCh)); + expo->srcRaw = (s_currCh > 4 ? MIXSRC_Rud - 1 + s_currCh : MIXSRC_Rud - 1 + channelOrder(s_currCh)); expo->curve.type = CURVE_REF_EXPO; expo->mode = 3; // pos+neg expo->chn = s_currCh - 1; @@ -239,7 +239,7 @@ bool menuModelExpoOne(event_t event) break; case EXPO_FIELD_SOURCE: - lcdDrawText(MENUS_MARGIN_LEFT, y, NO_INDENT(STR_SOURCE)); + lcdDrawText(MENUS_MARGIN_LEFT, y, STR_SOURCE); drawSource(EXPO_ONE_2ND_COLUMN, y, ed->srcRaw, menuHorizontalPosition==0 ? attr : 0); if (attr && menuHorizontalPosition==0) ed->srcRaw = checkIncDec(event, ed->srcRaw, INPUTSRC_FIRST, INPUTSRC_LAST, EE_MODEL|INCDEC_SOURCE|NO_INCDEC_MARKS, isInputSourceAvailable); if (ed->srcRaw >= MIXSRC_FIRST_TELEM) { @@ -263,7 +263,7 @@ bool menuModelExpoOne(event_t event) break; case EXPO_FIELD_OFFSET: - lcdDrawText(MENUS_MARGIN_LEFT, y, NO_INDENT(STR_OFFSET)); + lcdDrawText(MENUS_MARGIN_LEFT, y, STR_OFFSET); ed->offset = GVAR_MENU_ITEM(EXPO_ONE_2ND_COLUMN, y, ed->offset, -100, 100, LEFT|attr, 0, event); break; diff --git a/radio/src/gui/480x272/model_mixes.cpp b/radio/src/gui/480x272/model_mixes.cpp index 1672308bd..1502b99ec 100644 --- a/radio/src/gui/480x272/model_mixes.cpp +++ b/radio/src/gui/480x272/model_mixes.cpp @@ -84,7 +84,7 @@ void insertMix(uint8_t idx) mix->destCh = s_currCh-1; mix->srcRaw = s_currCh; if (!isSourceAvailable(mix->srcRaw)) { - mix->srcRaw = (s_currCh > 4 ? MIXSRC_Rud - 1 + s_currCh : MIXSRC_Rud - 1 + channel_order(s_currCh)); + mix->srcRaw = (s_currCh > 4 ? MIXSRC_Rud - 1 + s_currCh : MIXSRC_Rud - 1 + channelOrder(s_currCh)); while (!isSourceAvailable(mix->srcRaw)) { mix->srcRaw += 1; } @@ -203,7 +203,7 @@ bool menuModelMixOne(event_t event) editName(MIXES_2ND_COLUMN, y, md2->name, sizeof(md2->name), event, attr); break; case MIX_FIELD_SOURCE: - lcdDrawText(MENUS_MARGIN_LEFT, y, NO_INDENT(STR_SOURCE)); + lcdDrawText(MENUS_MARGIN_LEFT, y, STR_SOURCE); drawSource(MIXES_2ND_COLUMN, y, md2->srcRaw, attr); if (attr) CHECK_INCDEC_MODELSOURCE(event, md2->srcRaw, 1, MIXSRC_LAST); break; @@ -213,7 +213,7 @@ bool menuModelMixOne(event_t event) break; case MIX_FIELD_OFFSET: { - lcdDrawText(MENUS_MARGIN_LEFT, y, NO_INDENT(STR_OFFSET)); + lcdDrawText(MENUS_MARGIN_LEFT, y, STR_OFFSET); u_int8int16_t offset; MD_OFFSET_TO_UNION(md2, offset); offset.word = GVAR_MENU_ITEM(MIXES_2ND_COLUMN, y, offset.word, GV_RANGELARGE_OFFSET_NEG, GV_RANGELARGE_OFFSET, attr|LEFT, 0, event); diff --git a/radio/src/gui/480x272/model_module_options.cpp b/radio/src/gui/480x272/model_module_options.cpp new file mode 100644 index 000000000..4d21f6b3b --- /dev/null +++ b/radio/src/gui/480x272/model_module_options.cpp @@ -0,0 +1,210 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include +#include + +#define RECEIVER_OPTIONS_2ND_COLUMN 200 + +extern uint8_t g_moduleIdx; + +enum { + MODULE_SETTINGS_OK = 0, + MODULE_SETTINGS_DIRTY = 1, + MODULE_SETTINGS_REBIND = 2, + MODULE_SETTINGS_WRITING = 4, +}; + +void onTxOptionsUpdateConfirm(const char * result) +{ + if (result == STR_OK) { + reusableBuffer.hardwareAndSettings.moduleSettings.dirty = MODULE_SETTINGS_WRITING; + moduleState[g_moduleIdx].writeModuleSettings(&reusableBuffer.hardwareAndSettings.moduleSettings); + } + else { + popMenu(); + } +} + +bool isTelemetryAvailable() +{ + return reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].information.variant != PXX2_VARIANT_EU || + reusableBuffer.hardwareAndSettings.moduleSettings.txPower <= 14; +} + +enum { + ITEM_MODULE_SETTINGS_EXTERNAL_ANTENNA, + ITEM_MODULE_SETTINGS_POWER, + ITEM_MODULE_SETTINGS_TELEMETRY, + ITEM_MODULE_SETTINGS_COUNT +}; + +#define IF_MODULE_OPTIONS(option, count) uint8_t(isPXX2ModuleOptionAvailable(modelId, option) ? count : HIDDEN_ROW) + +bool isPowerAvailable(int value) +{ + uint8_t modelId = reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].information.modelID; + uint8_t variant = reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].information.variant; + + if (modelId == PXX2_MODULE_R9M_LITE) { + if (variant == PXX2_VARIANT_EU) + return (value == 14 /* 25 mW with telemetry */ || + value == 20 /* 100 mW without telemetry */); + else + return value == 20; /* 100 mW */ + } + else if (modelId == PXX2_MODULE_R9M || modelId == PXX2_MODULE_R9M_LITE_PRO) { + if (variant == PXX2_VARIANT_EU) + return (value == 14 /* 25 mW */ || + value == 23 /* 200 mW */ || + value == 27 /* 500 mW */); + else + return (value == 10 /* 10 mW */ || + value == 20 /* 100 mW */ || + value == 27 /* 500 mW */ || + value == 30 /* 1000 mW */); + } + else { + return (value <= 20); /* 100 mW max for XJTs */ + } +} + +bool menuModelModuleOptions(event_t event) +{ + if (event == EVT_ENTRY) { + memclear(&reusableBuffer.hardwareAndSettings, sizeof(reusableBuffer.hardwareAndSettings)); +#if defined(SIMU) + reusableBuffer.hardwareAndSettings.moduleSettings.state = PXX2_SETTINGS_OK; +#endif + } + + uint8_t modelId = reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].information.modelID; + // uint8_t variant = reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].information.variant; + uint8_t optionsAvailable = getPXX2ModuleOptions(modelId) & ((1 << MODULE_OPTION_EXTERNAL_ANTENNA) | (1 << MODULE_OPTION_POWER)); + + SUBMENU(STR_MODULE_OPTIONS, ICON_MODEL_SETUP, ITEM_MODULE_SETTINGS_COUNT, { + !optionsAvailable ? (uint8_t)0 : IF_MODULE_OPTIONS(MODULE_OPTION_EXTERNAL_ANTENNA, 0), + IF_MODULE_OPTIONS(MODULE_OPTION_POWER, 0), + IF_MODULE_OPTIONS(MODULE_OPTION_POWER, isTelemetryAvailable() ? HIDDEN_ROW : READONLY_ROW) + }); + + lcdDrawText(50, 3 + FH, getPXX2ModuleName(modelId), MENU_TITLE_COLOR); + + if (reusableBuffer.hardwareAndSettings.moduleSettings.state == PXX2_HARDWARE_INFO && moduleState[g_moduleIdx].mode == MODULE_MODE_NORMAL) { + if (!modelId) + moduleState[g_moduleIdx].readModuleInformation(&reusableBuffer.hardwareAndSettings.modules[g_moduleIdx], PXX2_HW_INFO_TX_ID, PXX2_HW_INFO_TX_ID); + else + moduleState[g_moduleIdx].readModuleSettings(&reusableBuffer.hardwareAndSettings.moduleSettings); + } + + if (menuEvent) { + killEvents(KEY_EXIT); + moduleState[g_moduleIdx].mode = MODULE_MODE_NORMAL; + if (reusableBuffer.hardwareAndSettings.moduleSettings.dirty) { + abortPopMenu(); + POPUP_CONFIRMATION(STR_UPDATE_TX_OPTIONS, onTxOptionsUpdateConfirm); + } + else { + return false; + } + } + + if (event == EVT_KEY_LONG(KEY_ENTER) && reusableBuffer.hardwareAndSettings.moduleSettings.dirty) { + killEvents(event); + reusableBuffer.hardwareAndSettings.moduleSettings.dirty = MODULE_SETTINGS_OK; + moduleState[g_moduleIdx].writeModuleSettings(&reusableBuffer.hardwareAndSettings.moduleSettings); + } + + if (reusableBuffer.hardwareAndSettings.moduleSettings.dirty == MODULE_SETTINGS_WRITING && reusableBuffer.hardwareAndSettings.moduleSettings.state == PXX2_SETTINGS_OK) { + popMenu(); + return false; + } + + if (modelId != 0 && mstate_tab[menuVerticalPosition] == HIDDEN_ROW) { + menuVerticalPosition = 0; + while (menuVerticalPosition < ITEM_MODULE_SETTINGS_COUNT && mstate_tab[menuVerticalPosition] == HIDDEN_ROW) { + ++menuVerticalPosition; + } + } + + int8_t sub = menuVerticalPosition; + + if (reusableBuffer.hardwareAndSettings.moduleSettings.state == PXX2_SETTINGS_OK) { + if (optionsAvailable) { + for (uint8_t k=0; k0 ? BLINK|INVERS : INVERS) : 0); + + switch (i) { + case ITEM_MODULE_SETTINGS_EXTERNAL_ANTENNA: + lcdDrawText(MENUS_MARGIN_LEFT, y, STR_EXT_ANTENNA); + reusableBuffer.hardwareAndSettings.moduleSettings.externalAntenna = editCheckBox(reusableBuffer.hardwareAndSettings.moduleSettings.externalAntenna, RECEIVER_OPTIONS_2ND_COLUMN, y, attr, event); + if (attr && checkIncDec_Ret) { + reusableBuffer.hardwareAndSettings.moduleSettings.dirty = MODULE_SETTINGS_DIRTY; + } + break; + + case ITEM_MODULE_SETTINGS_POWER: + lcdDrawText(MENUS_MARGIN_LEFT, y, STR_POWER); + lcdDrawNumber(RECEIVER_OPTIONS_2ND_COLUMN, y, reusableBuffer.hardwareAndSettings.moduleSettings.txPower, attr); + lcdDrawText(lcdNextPos, y, "dBm("); + drawPower(lcdNextPos, y, reusableBuffer.hardwareAndSettings.moduleSettings.txPower); + lcdDrawText(lcdNextPos, y, ")"); + if (attr) { + bool previousTelemetry = isTelemetryAvailable(); + reusableBuffer.hardwareAndSettings.moduleSettings.txPower = checkIncDec(event, reusableBuffer.hardwareAndSettings.moduleSettings.txPower, 0, 30, 0, &isPowerAvailable); + if (checkIncDec_Ret) { + reusableBuffer.hardwareAndSettings.moduleSettings.dirty = MODULE_SETTINGS_DIRTY; + if (previousTelemetry != isTelemetryAvailable()) { + reusableBuffer.hardwareAndSettings.moduleSettings.dirty |= MODULE_SETTINGS_REBIND; + } + } + if (s_editMode == 0 && (reusableBuffer.hardwareAndSettings.moduleSettings.dirty & MODULE_SETTINGS_REBIND)) { + reusableBuffer.hardwareAndSettings.moduleSettings.dirty &= ~MODULE_SETTINGS_REBIND; + POPUP_WARNING(STR_REBIND); + } + } + break; + + case ITEM_MODULE_SETTINGS_TELEMETRY: + // only displayed in EU mode when TX power > 25mW + lcdDrawText(RECEIVER_OPTIONS_2ND_COLUMN, y, "Telem OFF", attr | SMLSIZE); + break; + } + } + } + else { + lcdDrawCenteredText(LCD_H/2, STR_NO_TX_OPTIONS); + s_editMode = 0; + } + } + else { + lcdDrawCenteredText(LCD_H/2, STR_WAITING_FOR_TX); + s_editMode = 0; + } + + return true; +} diff --git a/radio/src/gui/480x272/model_receiver_options.cpp b/radio/src/gui/480x272/model_receiver_options.cpp new file mode 100644 index 000000000..b1ab35036 --- /dev/null +++ b/radio/src/gui/480x272/model_receiver_options.cpp @@ -0,0 +1,211 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include "opentx.h" + +#define RECEIVER_OPTIONS_2ND_COLUMN 200 + +extern uint8_t g_moduleIdx; + +enum { + RECEIVER_SETTINGS_OK = 0, + RECEIVER_SETTINGS_DIRTY = 1, + RECEIVER_SETTINGS_WRITING = 2, +}; + +void onRxOptionsUpdateConfirm(const char * result) +{ + if (result == STR_OK) { + reusableBuffer.hardwareAndSettings.receiverSettings.state = PXX2_SETTINGS_WRITE; + reusableBuffer.hardwareAndSettings.receiverSettings.dirty = RECEIVER_SETTINGS_WRITING; + reusableBuffer.hardwareAndSettings.receiverSettings.timeout = 0; + moduleState[g_moduleIdx].mode = MODULE_MODE_RECEIVER_SETTINGS; + } + else { + popMenu(); + } +} + +enum { + ITEM_RECEIVER_SETTINGS_PWM_RATE, + ITEM_RECEIVER_SETTINGS_TELEMETRY, + ITEM_RECEIVER_SETTINGS_SPORT_FPORT, + ITEM_RECEIVER_SETTINGS_CAPABILITY_NOT_SUPPORTED1, + ITEM_RECEIVER_SETTINGS_CAPABILITY_NOT_SUPPORTED2, + ITEM_RECEIVER_SETTINGS_PINMAP_FIRST +}; + + +#define IF_RECEIVER_CAPABILITY(capability, count) uint8_t((reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].receivers[receiverId].information.capabilities & (1 << capability)) ? count : HIDDEN_ROW) + +bool menuModelReceiverOptions(event_t event) +{ + const int lim = (g_model.extendedLimits ? (512 * LIMIT_EXT_PERCENT / 100) : 512) * 2; + uint8_t wbar = LCD_W / 2 - 20; + auto outputsCount = min(16, reusableBuffer.hardwareAndSettings.receiverSettings.outputsCount); + + if (event == EVT_ENTRY) { + // reusableBuffer.hardwareSettings should have been cleared before calling this menu +#if defined(SIMU) + reusableBuffer.hardwareAndSettings.receiverSettings.state = PXX2_SETTINGS_OK; + reusableBuffer.hardwareAndSettings.receiverSettings.outputsCount = 16; +#endif + } + + uint8_t receiverId = reusableBuffer.hardwareAndSettings.receiverSettings.receiverId; + uint8_t receiverModelId = reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].receivers[receiverId].information.modelID; + uint8_t receiverVariant = reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].receivers[receiverId].information.variant; + + SUBMENU(STR_RECEIVER_OPTIONS, ICON_MODEL_SETUP, ITEM_RECEIVER_SETTINGS_PINMAP_FIRST + outputsCount, { + 0, // PWM rate + isModuleR9MAccess(g_moduleIdx) && receiverVariant == PXX2_VARIANT_EU && reusableBuffer.hardwareAndSettings.moduleSettings.txPower > 14 /*25mW*/ ? READONLY_ROW : (uint8_t)0, // Telemetry + IF_RECEIVER_CAPABILITY(RECEIVER_CAPABILITY_FPORT, 0), + uint8_t(reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].receivers[receiverId].information.capabilityNotSupported ? READONLY_ROW : HIDDEN_ROW), + uint8_t(reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].receivers[receiverId].information.capabilityNotSupported ? READONLY_ROW : HIDDEN_ROW), + 0 // channels ... + }); + + if (g_model.moduleData[g_moduleIdx].pxx2.receiverName[receiverId][0] != '\0') + lcdDrawSizedText(50, 3 + FH, g_model.moduleData[g_moduleIdx].pxx2.receiverName[receiverId], effectiveLen(g_model.moduleData[g_moduleIdx].pxx2.receiverName[receiverId], PXX2_LEN_RX_NAME), MENU_TITLE_COLOR); + else + lcdDrawText(50, 3 + FH, "---", MENU_TITLE_COLOR); + + if (menuEvent) { + killEvents(KEY_EXIT); + moduleState[g_moduleIdx].mode = MODULE_MODE_NORMAL; + if (reusableBuffer.hardwareAndSettings.receiverSettings.dirty) { + abortPopMenu(); + POPUP_CONFIRMATION(STR_UPDATE_RX_OPTIONS, onRxOptionsUpdateConfirm); + } + else { + return false; + } + } + + if (reusableBuffer.hardwareAndSettings.receiverSettings.state == PXX2_HARDWARE_INFO && moduleState[g_moduleIdx].mode == MODULE_MODE_NORMAL) { + if (!receiverModelId) + moduleState[g_moduleIdx].readModuleInformation(&reusableBuffer.hardwareAndSettings.modules[g_moduleIdx], receiverId, receiverId); + else if (isModuleR9MAccess(g_moduleIdx) && receiverVariant == PXX2_VARIANT_EU && !reusableBuffer.hardwareAndSettings.moduleSettings.txPower) + moduleState[g_moduleIdx].readModuleSettings(&reusableBuffer.hardwareAndSettings.moduleSettings); + else + moduleState[g_moduleIdx].readReceiverSettings(&reusableBuffer.hardwareAndSettings.receiverSettings); + } + + if (event == EVT_KEY_LONG(KEY_ENTER) && reusableBuffer.hardwareAndSettings.receiverSettings.dirty) { + killEvents(event); + reusableBuffer.hardwareAndSettings.receiverSettings.dirty = RECEIVER_SETTINGS_OK; + moduleState[g_moduleIdx].writeReceiverSettings(&reusableBuffer.hardwareAndSettings.receiverSettings); + } + + if (reusableBuffer.hardwareAndSettings.receiverSettings.dirty == RECEIVER_SETTINGS_WRITING && reusableBuffer.hardwareAndSettings.receiverSettings.state == PXX2_SETTINGS_OK) { + popMenu(); + return false; + } + + if (receiverModelId && mstate_tab[menuVerticalPosition] == HIDDEN_ROW) { + menuVerticalPosition = 0; + while (menuVerticalPosition < ITEM_RECEIVER_SETTINGS_PINMAP_FIRST && mstate_tab[menuVerticalPosition] == HIDDEN_ROW) { + ++menuVerticalPosition; + } + } + + int8_t sub = menuVerticalPosition; + + if (reusableBuffer.hardwareAndSettings.receiverSettings.state == PXX2_SETTINGS_OK) { + for (uint8_t k=0; k0 ? BLINK|INVERS : INVERS) : 0); + + switch (i) { + case ITEM_RECEIVER_SETTINGS_PWM_RATE: + lcdDrawText(MENUS_MARGIN_LEFT, y, isModuleR9MAccess(g_moduleIdx) ? "6.67ms PWM": "9ms PWM"); + reusableBuffer.hardwareAndSettings.receiverSettings.pwmRate = editCheckBox(reusableBuffer.hardwareAndSettings.receiverSettings.pwmRate, RECEIVER_OPTIONS_2ND_COLUMN, y, attr, event); + if (attr && checkIncDec_Ret) { + reusableBuffer.hardwareAndSettings.receiverSettings.dirty = RECEIVER_SETTINGS_DIRTY; + } + break; + + case ITEM_RECEIVER_SETTINGS_TELEMETRY: + lcdDrawText(MENUS_MARGIN_LEFT, y, STR_TELEMETRY_DISABLED); + reusableBuffer.hardwareAndSettings.receiverSettings.telemetryDisabled = editCheckBox(reusableBuffer.hardwareAndSettings.receiverSettings.telemetryDisabled, RECEIVER_OPTIONS_2ND_COLUMN, y, attr, event); + if (attr && checkIncDec_Ret) { + reusableBuffer.hardwareAndSettings.receiverSettings.dirty = RECEIVER_SETTINGS_DIRTY; + } + break; + + case ITEM_RECEIVER_SETTINGS_SPORT_FPORT: + lcdDrawText(MENUS_MARGIN_LEFT, y, "F.Port"); + reusableBuffer.hardwareAndSettings.receiverSettings.fport = editCheckBox(reusableBuffer.hardwareAndSettings.receiverSettings.fport, RECEIVER_OPTIONS_2ND_COLUMN, y, attr, event); + if (attr && checkIncDec_Ret) { + reusableBuffer.hardwareAndSettings.receiverSettings.dirty = RECEIVER_SETTINGS_DIRTY; + } + break; + + case ITEM_RECEIVER_SETTINGS_CAPABILITY_NOT_SUPPORTED1: + lcdDrawText(LCD_W/2, y+1, STR_MORE_OPTIONS_AVAILABLE, SMLSIZE|CENTERED); + break; + + case ITEM_RECEIVER_SETTINGS_CAPABILITY_NOT_SUPPORTED2: + lcdDrawText(LCD_W/2, y+1, STR_OPENTX_UPGRADE_REQUIRED, SMLSIZE|CENTERED); + break; + + default: + // Pin + { + uint8_t pin = i - ITEM_RECEIVER_SETTINGS_PINMAP_FIRST; + if (pin < reusableBuffer.hardwareAndSettings.receiverSettings.outputsCount) { + uint8_t & mapping = reusableBuffer.hardwareAndSettings.receiverSettings.outputsMapping[pin]; + uint8_t channel = g_model.moduleData[g_moduleIdx].channelsStart + mapping; + int32_t channelValue = channelOutputs[channel]; + lcdDrawText(MENUS_MARGIN_LEFT, y, STR_PIN); + lcdDrawNumber(lcdNextPos + 1, y, pin + 1); + putsChn(100, y, channel + 1, attr); + + // Channel + if (attr) { + mapping = checkIncDec(event, mapping, 0, sentModuleChannels(g_moduleIdx) - 1); + if (checkIncDec_Ret) { + reusableBuffer.hardwareAndSettings.receiverSettings.dirty = RECEIVER_SETTINGS_DIRTY; + } + } + + // Bargraph + lcdDrawRect(RECEIVER_OPTIONS_2ND_COLUMN, y + 4, wbar + 1, 10); + const uint8_t lenChannel = limit(1, (abs(channelValue) * wbar / 2 + lim / 2) / lim, wbar / 2); + const coord_t xChannel = (channelValue > 0) ? RECEIVER_OPTIONS_2ND_COLUMN + wbar / 2 : RECEIVER_OPTIONS_2ND_COLUMN + wbar / 2 + 1 - lenChannel; + lcdDrawSolidFilledRect(xChannel, y + 5, lenChannel, 8, TEXT_INVERTED_BGCOLOR); + } + break; + } + } + } + } + else { + lcdDrawCenteredText(LCD_H/2, STR_WAITING_FOR_RX); + } + + return true; +} diff --git a/radio/src/gui/480x272/model_setup.cpp b/radio/src/gui/480x272/model_setup.cpp index f512a6859..6a99fd560 100644 --- a/radio/src/gui/480x272/model_setup.cpp +++ b/radio/src/gui/480x272/model_setup.cpp @@ -24,68 +24,92 @@ uint8_t g_moduleIdx; enum MenuModelSetupItems { - ITEM_MODEL_NAME, - ITEM_MODEL_BITMAP, - ITEM_MODEL_TIMER1, - ITEM_MODEL_TIMER1_NAME, - ITEM_MODEL_TIMER1_PERSISTENT, - ITEM_MODEL_TIMER1_MINUTE_BEEP, - ITEM_MODEL_TIMER1_COUNTDOWN_BEEP, + ITEM_MODEL_SETUP_NAME, + ITEM_MODEL_SETUP_BITMAP, + ITEM_MODEL_SETUP_TIMER1, + ITEM_MODEL_SETUP_TIMER1_NAME, + ITEM_MODEL_SETUP_TIMER1_PERSISTENT, + ITEM_MODEL_SETUP_TIMER1_MINUTE_BEEP, + ITEM_MODEL_SETUP_TIMER1_COUNTDOWN_BEEP, #if TIMERS > 1 - ITEM_MODEL_TIMER2, - ITEM_MODEL_TIMER2_NAME, - ITEM_MODEL_TIMER2_PERSISTENT, - ITEM_MODEL_TIMER2_MINUTE_BEEP, - ITEM_MODEL_TIMER2_COUNTDOWN_BEEP, + ITEM_MODEL_SETUP_TIMER2, + ITEM_MODEL_SETUP_TIMER2_NAME, + ITEM_MODEL_SETUP_TIMER2_PERSISTENT, + ITEM_MODEL_SETUP_TIMER2_MINUTE_BEEP, + ITEM_MODEL_SETUP_TIMER2_COUNTDOWN_BEEP, #endif #if TIMERS > 2 - ITEM_MODEL_TIMER3, - ITEM_MODEL_TIMER3_NAME, - ITEM_MODEL_TIMER3_PERSISTENT, - ITEM_MODEL_TIMER3_MINUTE_BEEP, - ITEM_MODEL_TIMER3_COUNTDOWN_BEEP, + ITEM_MODEL_SETUP_TIMER3, + ITEM_MODEL_SETUP_TIMER3_NAME, + ITEM_MODEL_SETUP_TIMER3_PERSISTENT, + ITEM_MODEL_SETUP_TIMER3_MINUTE_BEEP, + ITEM_MODEL_SETUP_TIMER3_COUNTDOWN_BEEP, #endif - ITEM_MODEL_EXTENDED_LIMITS, - ITEM_MODEL_EXTENDED_TRIMS, - ITEM_MODEL_DISPLAY_TRIMS, - ITEM_MODEL_TRIM_INC, - ITEM_MODEL_THROTTLE_LABEL, - ITEM_MODEL_THROTTLE_REVERSED, - ITEM_MODEL_THROTTLE_TRACE, - ITEM_MODEL_THROTTLE_TRIM, - ITEM_MODEL_PREFLIGHT_LABEL, - ITEM_MODEL_CHECKLIST_DISPLAY, - ITEM_MODEL_THROTTLE_WARNING, - ITEM_MODEL_SWITCHES_WARNING, - ITEM_MODEL_SLIDPOT_WARNING_STATE, - ITEM_MODEL_POTS_WARNING, - ITEM_MODEL_SLIDERS_WARNING, - ITEM_MODEL_BEEP_CENTER, - ITEM_MODEL_USE_GLOBAL_FUNCTIONS, - ITEM_MODEL_INTERNAL_MODULE_LABEL, - ITEM_MODEL_INTERNAL_MODULE_MODE, - ITEM_MODEL_INTERNAL_MODULE_CHANNELS, - ITEM_MODEL_INTERNAL_MODULE_BIND, - ITEM_MODEL_INTERNAL_MODULE_FAILSAFE, - ITEM_MODEL_INTERNAL_MODULE_ANTENNA, - ITEM_MODEL_EXTERNAL_MODULE_LABEL, - ITEM_MODEL_EXTERNAL_MODULE_MODE, + ITEM_MODEL_SETUP_EXTENDED_LIMITS, + ITEM_MODEL_SETUP_EXTENDED_TRIMS, + ITEM_MODEL_SETUP_DISPLAY_TRIMS, + ITEM_MODEL_SETUP_TRIM_INC, + ITEM_MODEL_SETUP_THROTTLE_LABEL, + ITEM_MODEL_SETUP_THROTTLE_REVERSED, + ITEM_MODEL_SETUP_THROTTLE_TRACE, + ITEM_MODEL_SETUP_THROTTLE_TRIM, + ITEM_MODEL_SETUP_PREFLIGHT_LABEL, + ITEM_MODEL_SETUP_CHECKLIST_DISPLAY, + ITEM_MODEL_SETUP_THROTTLE_WARNING, + ITEM_MODEL_SETUP_SWITCHES_WARNING, + ITEM_MODEL_SETUP_POTS_SLIDERS_WARNING_STATE, + ITEM_MODEL_SETUP_POTS_WARNING, + ITEM_MODEL_SETUP_SLIDERS_WARNING, + ITEM_MODEL_SETUP_BEEP_CENTER, + ITEM_MODEL_SETUP_USE_GLOBAL_FUNCTIONS, + +#if defined(PXX2) + ITEM_MODEL_SETUP_REGISTRATION_ID, +#endif + + ITEM_MODEL_SETUP_INTERNAL_MODULE_LABEL, + ITEM_MODEL_SETUP_INTERNAL_MODULE_TYPE, + ITEM_MODEL_SETUP_INTERNAL_MODULE_CHANNELS, + ITEM_MODEL_SETUP_INTERNAL_MODULE_NOT_ACCESS_BIND, + ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_MODEL_NUM, +#if defined(EXTERNAL_ANTENNA) + ITEM_MODEL_SETUP_INTERNAL_MODULE_ANTENNA, +#endif + ITEM_MODEL_SETUP_INTERNAL_MODULE_FAILSAFE, + ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_REGISTER_RANGE, + ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_OPTIONS, + ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_RECEIVER_1, + ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_RECEIVER_2, + ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_RECEIVER_3, + + ITEM_MODEL_SETUP_EXTERNAL_MODULE_LABEL, + ITEM_MODEL_SETUP_EXTERNAL_MODULE_TYPE, #if defined(MULTIMODULE) - ITEM_MODEL_EXTERNAL_MODULE_STATUS, - ITEM_MODEL_EXTERNAL_MODULE_SYNCSTATUS, + ITEM_MODEL_SETUP_EXTERNAL_MODULE_STATUS, + ITEM_MODEL_SETUP_EXTERNAL_MODULE_SYNCSTATUS, #endif - ITEM_MODEL_EXTERNAL_MODULE_CHANNELS, - ITEM_MODEL_EXTERNAL_MODULE_BIND, - ITEM_MODEL_EXTERNAL_MODULE_FAILSAFE, - ITEM_MODEL_EXTERNAL_MODULE_OPTIONS, + ITEM_MODEL_SETUP_EXTERNAL_MODULE_CHANNELS, + ITEM_MODEL_SETUP_EXTERNAL_MODULE_NOT_ACCESS_BIND, + ITEM_MODEL_SETUP_EXTERNAL_MODULE_PXX2_MODEL_NUM, + ITEM_MODEL_SETUP_EXTERNAL_MODULE_OPTIONS, #if defined(MULTIMODULE) - ITEM_MODEL_EXTERNAL_MODULE_AUTOBIND, + ITEM_MODEL_SETUP_EXTERNAL_MODULE_AUTOBIND, #endif - ITEM_MODEL_EXTERNAL_MODULE_POWER, - ITEM_MODEL_TRAINER_LABEL, - ITEM_MODEL_TRAINER_MODE, - ITEM_MODEL_TRAINER_LINE1, - ITEM_MODEL_TRAINER_LINE2, + ITEM_MODEL_SETUP_EXTERNAL_MODULE_POWER, + ITEM_MODEL_SETUP_EXTERNAL_MODULE_FAILSAFE, + ITEM_MODEL_SETUP_EXTERNAL_MODULE_PXX2_REGISTER_RANGE, + ITEM_MODEL_SETUP_EXTERNAL_MODULE_PXX2_OPTIONS, + ITEM_MODEL_SETUP_EXTERNAL_MODULE_PXX2_RECEIVER_1, + ITEM_MODEL_SETUP_EXTERNAL_MODULE_PXX2_RECEIVER_2, + ITEM_MODEL_SETUP_EXTERNAL_MODULE_PXX2_RECEIVER_3, + + ITEM_MODEL_SETUP_TRAINER_LABEL, + ITEM_MODEL_SETUP_TRAINER_MODE, +#if defined(BLUETOOTH) + ITEM_MODEL_SETUP_TRAINER_BLUETOOTH, +#endif + ITEM_MODEL_SETUP_TRAINER_CHANNELS, + ITEM_MODEL_SETUP_TRAINER_PPM_PARAMS, ITEM_MODEL_SETUP_MAX }; @@ -97,14 +121,271 @@ enum MenuModelSetupItems { #define MODEL_SETUP_SET_FAILSAFE_OFS 100 #define MODEL_SETUP_SLIDPOT_SPACING 45 -#define CURRENT_MODULE_EDITED(k) (k >= ITEM_MODEL_EXTERNAL_MODULE_LABEL ? EXTERNAL_MODULE : INTERNAL_MODULE) +#define CURRENT_MODULE_EDITED(k) (k >= ITEM_MODEL_SETUP_EXTERNAL_MODULE_LABEL ? EXTERNAL_MODULE : INTERNAL_MODULE) +#define CURRENT_RECEIVER_EDITED(k) (k - (k >= ITEM_MODEL_SETUP_EXTERNAL_MODULE_LABEL ? k : ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_RECEIVER_1)) + +#include "common/stdlcd/model_setup_pxx1.cpp" + +bool isPXX2ReceiverEmpty(uint8_t moduleIdx, uint8_t receiverIdx) +{ + return is_memclear(g_model.moduleData[moduleIdx].pxx2.receiverName[receiverIdx], PXX2_LEN_RX_NAME); +} + +void removePXX2Receiver(uint8_t moduleIdx, uint8_t receiverIdx) +{ + memclear(g_model.moduleData[moduleIdx].pxx2.receiverName[receiverIdx], PXX2_LEN_RX_NAME); + g_model.moduleData[moduleIdx].pxx2.receivers &= ~(1 << receiverIdx); + storageDirty(EE_MODEL); +} + +void removePXX2ReceiverIfEmpty(uint8_t moduleIdx, uint8_t receiverIdx) +{ + if (isPXX2ReceiverEmpty(moduleIdx, receiverIdx)) { + removePXX2Receiver(moduleIdx, receiverIdx); + } +} + +const char * STR_BIND_8CH_WITH_TELEM = TR("8CH with telem.", "8CH with telemetry"); +const char * STR_BIND_16CH_WITH_TELEM = TR("16CH with telem.", "16CH with telemetry"); +const char * STR_BIND_16CH_WITHOUT_TELEM = TR("16CH without telem.", "16CH without telemetry"); +const char * STR_BIND_FLEX_868 = "Flex 868MHz"; +const char * STR_BIND_FLEX_915 = "Flex 915MHz"; + +void onPXX2R9MBindModeMenu(const char * result) +{ + if (result == STR_BIND_16CH_WITH_TELEM) { + reusableBuffer.moduleSetup.bindInformation.lbtMode = 1; + } + else if (result == STR_BIND_16CH_WITHOUT_TELEM) { + reusableBuffer.moduleSetup.bindInformation.lbtMode = 2; + } + else if (result == STR_BIND_FLEX_868) { + reusableBuffer.moduleSetup.bindInformation.flexMode = 0; + } + else if (result == STR_BIND_FLEX_915) { + reusableBuffer.moduleSetup.bindInformation.flexMode = 1; + } + else { + // the user pressed [Exit] + uint8_t moduleIdx = CURRENT_MODULE_EDITED(menuVerticalPosition); + uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(menuVerticalPosition); + moduleState[moduleIdx].mode = MODULE_MODE_NORMAL; + removePXX2ReceiverIfEmpty(moduleIdx, receiverIdx); + return; + } + +#if defined(SIMU) + uint8_t moduleIdx = CURRENT_MODULE_EDITED(menuVerticalPosition); + uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(menuVerticalPosition); + memcpy(g_model.moduleData[moduleIdx].pxx2.receiverName[receiverIdx], reusableBuffer.moduleSetup.bindInformation.candidateReceiversNames[reusableBuffer.moduleSetup.bindInformation.selectedReceiverIndex], PXX2_LEN_RX_NAME); + storageDirty(EE_MODEL); + moduleState[moduleIdx].mode = MODULE_MODE_NORMAL; + reusableBuffer.moduleSetup.bindInformation.step = BIND_OK; + POPUP_INFORMATION(STR_BIND_OK); +#else + reusableBuffer.moduleSetup.bindInformation.step = BIND_START; +#endif +} + +// TODO code duplicated + + +void onResetReceiverConfirm(const char * result) +{ + if (result == STR_OK) { + uint8_t moduleIdx = CURRENT_MODULE_EDITED(menuVerticalPosition - HEADER_LINE); + uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(menuVerticalPosition - HEADER_LINE); + moduleState[moduleIdx].mode = MODULE_MODE_RESET; + removePXX2Receiver(moduleIdx, receiverIdx); + } +} + +void onPXX2ReceiverMenu(const char * result) +{ + uint8_t moduleIdx = CURRENT_MODULE_EDITED(menuVerticalPosition - HEADER_LINE); + uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(menuVerticalPosition - HEADER_LINE); + + if (result == STR_OPTIONS) { + memclear(&reusableBuffer.hardwareAndSettings, sizeof(reusableBuffer.hardwareAndSettings)); + reusableBuffer.hardwareAndSettings.receiverSettings.receiverId = receiverIdx; + g_moduleIdx = moduleIdx; + pushMenu(menuModelReceiverOptions); + } + else if (result == STR_BIND) { + memclear(&reusableBuffer.moduleSetup.bindInformation, sizeof(BindInformation)); + reusableBuffer.moduleSetup.bindInformation.rxUid = receiverIdx; + if (isModuleR9MAccess(moduleIdx)) { + reusableBuffer.moduleSetup.bindInformation.step = BIND_MODULE_TX_INFORMATION_REQUEST; +#if defined(SIMU) + reusableBuffer.moduleSetup.pxx2.moduleInformation.information.modelID = 1; + reusableBuffer.moduleSetup.pxx2.moduleInformation.information.variant = 2; +#else + moduleState[moduleIdx].readModuleInformation(&reusableBuffer.moduleSetup.pxx2.moduleInformation, PXX2_HW_INFO_TX_ID, PXX2_HW_INFO_TX_ID); +#endif + } + else { + moduleState[moduleIdx].startBind(&reusableBuffer.moduleSetup.bindInformation); + } + s_editMode = 1; + } + else if (result == STR_SHARE) { + reusableBuffer.moduleSetup.pxx2.shareReceiverIndex = receiverIdx; + moduleState[moduleIdx].mode = MODULE_MODE_SHARE; + s_editMode = 1; + } + else if (result == STR_DELETE || result == STR_RESET) { + memclear(&reusableBuffer.moduleSetup.pxx2, sizeof(reusableBuffer.moduleSetup.pxx2)); + reusableBuffer.moduleSetup.pxx2.resetReceiverIndex = receiverIdx; + reusableBuffer.moduleSetup.pxx2.resetReceiverFlags = (result == STR_RESET ? 0xFF : 0x01); + POPUP_CONFIRMATION(result == STR_RESET ? STR_RECEIVER_RESET : STR_RECEIVER_DELETE, onResetReceiverConfirm); + } + else { + removePXX2ReceiverIfEmpty(moduleIdx, receiverIdx); + } +} + +// TODO code duplicated +void onPXX2BindMenu(const char * result) +{ + if (result != STR_EXIT) { + uint8_t moduleIdx = CURRENT_MODULE_EDITED(menuVerticalPosition - HEADER_LINE); + reusableBuffer.moduleSetup.bindInformation.selectedReceiverIndex = (result - reusableBuffer.moduleSetup.bindInformation.candidateReceiversNames[0]) / sizeof(reusableBuffer.moduleSetup.bindInformation.candidateReceiversNames[0]); + if (isModuleR9MAccess(moduleIdx) && reusableBuffer.moduleSetup.pxx2.moduleInformation.information.variant == PXX2_VARIANT_EU) { + reusableBuffer.moduleSetup.bindInformation.step = BIND_RX_NAME_SELECTED; + POPUP_MENU_ADD_ITEM(STR_16CH_WITH_TELEMETRY); + POPUP_MENU_ADD_ITEM(STR_16CH_WITHOUT_TELEMETRY); + POPUP_MENU_START(onPXX2R9MBindModeMenu); + } + else if (isModuleR9MAccess(moduleIdx) && reusableBuffer.moduleSetup.pxx2.moduleInformation.information.variant == PXX2_VARIANT_FLEX) { + reusableBuffer.moduleSetup.bindInformation.step = BIND_RX_NAME_SELECTED; + POPUP_MENU_ADD_ITEM(STR_FLEX_868); + POPUP_MENU_ADD_ITEM(STR_FLEX_915); + POPUP_MENU_START(onPXX2R9MBindModeMenu); + } + else { +#if defined(SIMU) + uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(menuVerticalPosition - HEADER_LINE); + memcpy(g_model.moduleData[moduleIdx].pxx2.receiverName[receiverIdx], result, PXX2_LEN_RX_NAME); + storageDirty(EE_MODEL); + moduleState[moduleIdx].mode = MODULE_MODE_NORMAL; + reusableBuffer.moduleSetup.bindInformation.step = BIND_OK; + POPUP_INFORMATION(STR_BIND_OK); +#else + reusableBuffer.moduleSetup.bindInformation.step = BIND_START; +#endif + } + } + else { + // the user pressed [Exit] + uint8_t moduleIdx = CURRENT_MODULE_EDITED(menuVerticalPosition - HEADER_LINE); + uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(menuVerticalPosition - HEADER_LINE); + moduleState[moduleIdx].mode = MODULE_MODE_NORMAL; + removePXX2ReceiverIfEmpty(moduleIdx, receiverIdx); + s_editMode = 0; + } +} + +enum PopupRegisterItems { + ITEM_REGISTER_PASSWORD, + ITEM_REGISTER_MODULE_INDEX, + ITEM_REGISTER_RECEIVER_NAME, + ITEM_REGISTER_BUTTONS +}; + +constexpr coord_t REGISTER_TOP = POPUP_Y + 10; +constexpr coord_t REGISTER_H = 6 * FH - 4; +constexpr coord_t REGISTER_COLUMN_1 = POPUP_X + 10; +constexpr coord_t REGISTER_COLUMN_2 = POPUP_X + 150; + +void runPopupRegister(event_t event) +{ + uint8_t backupVerticalPosition = menuVerticalPosition; + uint8_t backupHorizontalPosition = menuHorizontalPosition; + uint8_t backupVerticalOffset = menuVerticalOffset; + int8_t backupEditMode = s_editMode; + + menuVerticalPosition = reusableBuffer.moduleSetup.pxx2.registerPopupVerticalPosition; + menuHorizontalPosition = reusableBuffer.moduleSetup.pxx2.registerPopupHorizontalPosition; + s_editMode = reusableBuffer.moduleSetup.pxx2.registerPopupEditMode; + + switch (event) { + case EVT_KEY_BREAK(KEY_ENTER): + if (menuVerticalPosition != ITEM_REGISTER_BUTTONS) { + break; + } + else if (reusableBuffer.moduleSetup.pxx2.registerStep >= REGISTER_RX_NAME_RECEIVED && menuHorizontalPosition == 0) { + // [Enter] pressed + reusableBuffer.moduleSetup.pxx2.registerStep = REGISTER_RX_NAME_SELECTED; + backupEditMode = EDIT_MODIFY_FIELD; // so that the [Register] button blinks and the REGISTER process can continue + } + // no break + + case EVT_KEY_LONG(KEY_EXIT): + s_editMode = 0; + // no break; + + case EVT_KEY_BREAK(KEY_EXIT): + if (s_editMode <= 0) { + warningText = nullptr; + } + break; + } + + if (warningText) { + const uint8_t dialogRows[] = { 0, 0, uint8_t(reusableBuffer.moduleSetup.pxx2.registerStep < REGISTER_RX_NAME_RECEIVED ? READONLY_ROW : 0), uint8_t(reusableBuffer.moduleSetup.pxx2.registerStep < REGISTER_RX_NAME_RECEIVED ? 0 : 1)}; + check(event, 0, nullptr, 0, dialogRows, 3, 4); // TODO add a comment for 3 - HEADER_LINE once understood + + drawPopupBackgroundAndBorder(POPUP_X, REGISTER_TOP, POPUP_W, REGISTER_H); + // showMessageBox(warningText); + + // registration password + lcdDrawText(REGISTER_COLUMN_1, REGISTER_TOP + 8, STR_REG_ID); + editName(REGISTER_COLUMN_2, REGISTER_TOP + 8, g_model.modelRegistrationID, PXX2_LEN_REGISTRATION_ID, event, menuVerticalPosition == ITEM_REGISTER_PASSWORD); + + // loop index (will be removed in future) + lcdDrawText(REGISTER_COLUMN_1, REGISTER_TOP + 8 + FH, "UID"); + lcdDrawNumber(REGISTER_COLUMN_2, REGISTER_TOP + 8 + FH, reusableBuffer.moduleSetup.pxx2.registerLoopIndex, menuVerticalPosition == ITEM_REGISTER_MODULE_INDEX ? (s_editMode ? INVERS + BLINK : INVERS) : 0); + if (menuVerticalPosition == ITEM_REGISTER_MODULE_INDEX && s_editMode) { + CHECK_INCDEC_MODELVAR_ZERO(event, reusableBuffer.moduleSetup.pxx2.registerLoopIndex, 2); + } + + // RX name + if (reusableBuffer.moduleSetup.pxx2.registerStep < REGISTER_RX_NAME_RECEIVED) { + lcdDrawText(REGISTER_COLUMN_1, REGISTER_TOP + 8 + 2 * FH, STR_WAITING); + lcdDrawText(REGISTER_COLUMN_1, REGISTER_TOP + 8 + 4 * FH, TR_EXIT, menuVerticalPosition == ITEM_REGISTER_BUTTONS ? INVERS : 0); + } + else { + lcdDrawText(REGISTER_COLUMN_1, REGISTER_TOP + 8 + 2 * FH, STR_RX_NAME); + editName(REGISTER_COLUMN_2, REGISTER_TOP + 8 + 2 * FH, reusableBuffer.moduleSetup.pxx2.registerRxName, PXX2_LEN_RX_NAME, event, menuVerticalPosition == ITEM_REGISTER_RECEIVER_NAME); + lcdDrawText(REGISTER_COLUMN_1, REGISTER_TOP + 8 + 4 * FH, TR_ENTER, menuVerticalPosition == ITEM_REGISTER_BUTTONS && menuHorizontalPosition == 0 ? INVERS : 0); + lcdDrawText(REGISTER_COLUMN_2, REGISTER_TOP + 8 + 4 * FH, TR_EXIT, menuVerticalPosition == ITEM_REGISTER_BUTTONS && menuHorizontalPosition == 1 ? INVERS : 0); + } + + reusableBuffer.moduleSetup.pxx2.registerPopupVerticalPosition = menuVerticalPosition; + reusableBuffer.moduleSetup.pxx2.registerPopupHorizontalPosition = menuHorizontalPosition; + reusableBuffer.moduleSetup.pxx2.registerPopupEditMode = s_editMode; + } + + menuVerticalPosition = backupVerticalPosition; + menuHorizontalPosition = backupHorizontalPosition; + menuVerticalOffset = backupVerticalOffset; + s_editMode = backupEditMode; +} + +void startRegisterDialog(uint8_t module) +{ + memclear(&reusableBuffer.moduleSetup.pxx2, sizeof(reusableBuffer.moduleSetup.pxx2)); + moduleState[module].mode = MODULE_MODE_REGISTER; + s_editMode = 0; + POPUP_INPUT("", runPopupRegister); +} void checkModelIdUnique(uint8_t moduleIdx) { - if(isModulePXX(moduleIdx) && IS_D8_RX(moduleIdx)) + if (isModuleXJTD8(moduleIdx)) return; - char* warn_buf = reusableBuffer.moduleSetup.msg; + char * warn_buf = reusableBuffer.moduleSetup.msg; // cannot rely exactly on WARNING_LINE_LEN so using WARNING_LINE_LEN-2 size_t warn_buf_len = sizeof(reusableBuffer.moduleSetup.msg) - WARNING_LINE_LEN - 2; @@ -116,33 +397,6 @@ void checkModelIdUnique(uint8_t moduleIdx) } } -void onBindMenu(const char * result) -{ - uint8_t moduleIdx = (menuVerticalPosition >= ITEM_MODEL_EXTERNAL_MODULE_LABEL ? EXTERNAL_MODULE : INTERNAL_MODULE); - - if (result == STR_BINDING_1_8_TELEM_ON) { - g_model.moduleData[moduleIdx].pxx.receiver_telem_off = false; - g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = false; - } - else if (result == STR_BINDING_1_8_TELEM_OFF) { - g_model.moduleData[moduleIdx].pxx.receiver_telem_off = true; - g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = false; - } - else if (result == STR_BINDING_9_16_TELEM_ON) { - g_model.moduleData[moduleIdx].pxx.receiver_telem_off = false; - g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = true; - } - else if (result == STR_BINDING_9_16_TELEM_OFF) { - g_model.moduleData[moduleIdx].pxx.receiver_telem_off = true; - g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = true; - } - else { - return; - } - - moduleState[moduleIdx].mode = MODULE_MODE_BIND; -} - void onModelSetupBitmapMenu(const char * result) { if (result == STR_UPDATE_LIST) { @@ -230,67 +484,149 @@ int getSwitchWarningsCount() return count; } -#define IF_INTERNAL_MODULE_ON(x) (IS_INTERNAL_MODULE_ENABLED() ? (uint8_t)(x) : HIDDEN_ROW) -#define IF_EXTERNAL_MODULE_ON(x) (IS_EXTERNAL_MODULE_ENABLED() ? (uint8_t)(x) : HIDDEN_ROW) +#define IF_INTERNAL_MODULE_ON(x) (IS_INTERNAL_MODULE_ENABLED() ? (uint8_t)(x) : HIDDEN_ROW) +#define IF_EXTERNAL_MODULE_ON(x) (IS_EXTERNAL_MODULE_ENABLED() ? (uint8_t)(x) : HIDDEN_ROW) -#define INTERNAL_MODULE_MODE_ROWS (uint8_t)0 -#define PORT_CHANNELS_ROWS(x) (x==INTERNAL_MODULE ? INTERNAL_MODULE_CHANNELS_ROWS : (x==EXTERNAL_MODULE ? EXTERNAL_MODULE_CHANNELS_ROWS : 1)) +#define IF_PXX2_MODULE(module, xxx) (isModulePXX2(module) ? (uint8_t)(xxx) : HIDDEN_ROW) +#define IF_NOT_PXX2_MODULE(module, xxx) (isModulePXX2(module) ? HIDDEN_ROW : (uint8_t)(xxx)) +#define IF_ACCESS_MODULE_RF(module, xxx) (isModuleRFAccess(module) ? (uint8_t)(xxx) : HIDDEN_ROW) +#define IF_NOT_ACCESS_MODULE_RF(module, xxx) (isModuleRFAccess(module) ? HIDDEN_ROW : (uint8_t)(xxx)) -#define TIMER_ROWS(x) NAVIGATION_LINE_BY_LINE|1, 0, 0, 0, g_model.timers[x].countdownBeep != COUNTDOWN_SILENT ? (uint8_t)1 : (uint8_t)0 +#define INTERNAL_MODULE_TYPE_ROWS ((isModuleXJT(INTERNAL_MODULE) || isModulePXX2(INTERNAL_MODULE)) ? (uint8_t)1 : (uint8_t)0) // Module type + RF protocols -#define EXTERNAL_MODULE_MODE_ROWS (isModuleXJT(EXTERNAL_MODULE) || isModuleR9M(EXTERNAL_MODULE) || isModuleDSM2(EXTERNAL_MODULE) || isModuleMultimodule(EXTERNAL_MODULE)) ? (uint8_t)1 : (uint8_t)0 +#define MODULE_CHANNELS_ROWS(x) (x==INTERNAL_MODULE ? INTERNAL_MODULE_CHANNELS_ROWS : (x==EXTERNAL_MODULE ? EXTERNAL_MODULE_CHANNELS_ROWS : 1)) + +#define TIMER_ROWS(x) NAVIGATION_LINE_BY_LINE|1, 0, 0, 0, g_model.timers[x].countdownBeep != COUNTDOWN_SILENT ? (uint8_t)1 : (uint8_t)0 + +inline uint8_t EXTERNAL_MODULE_MODE_ROW() +{ + if (isModuleXJT(EXTERNAL_MODULE) || isModuleR9MNonAccess(EXTERNAL_MODULE) || isModuleDSM2(EXTERNAL_MODULE)) + return 1; +#if defined(MULTIMODULE) + else if (isModuleMultimodule(EXTERNAL_MODULE)) { + return 2 + MULTIMODULE_RFPROTO_COLUMNS(EXTERNAL_MODULE); + } +#endif + else + return 0; +} #if TIMERS == 1 -#define TIMERS_ROWS TIMER_ROWS(0) +#define TIMERS_ROWS TIMER_ROWS(0) #elif TIMERS == 2 -#define TIMERS_ROWS TIMER_ROWS(0), TIMER_ROWS(1) +#define TIMERS_ROWS TIMER_ROWS(0), TIMER_ROWS(1) #elif TIMERS == 3 -#define TIMERS_ROWS TIMER_ROWS(0), TIMER_ROWS(1), TIMER_ROWS(2) +#define TIMERS_ROWS TIMER_ROWS(0), TIMER_ROWS(1), TIMER_ROWS(2) #endif -#define SW_WARN_ITEMS() uint8_t(NAVIGATION_LINE_BY_LINE|(getSwitchWarningsCount()-1)) -#define POT_WARN_ROWS (uint8_t)0 -#define POT_WARN_ITEMS() ((g_model.potsWarnMode) ? uint8_t(NAVIGATION_LINE_BY_LINE|(NUM_POTS-1)) : (uint8_t)0) -#define SLIDER_WARN_ITEMS() ((g_model.potsWarnMode) ? uint8_t(NAVIGATION_LINE_BY_LINE|(NUM_SLIDERS-1)) : (uint8_t)0) +#define TRAINER_CHANNELS_ROW (g_model.trainerData.mode == TRAINER_MODE_SLAVE ? (uint8_t)1 : (g_model.trainerData.mode == TRAINER_MODE_SLAVE_BLUETOOTH ? (uint8_t)0 : HIDDEN_ROW)) +#define TRAINER_PPM_PARAMS_ROW (g_model.trainerData.mode == TRAINER_MODE_SLAVE ? (uint8_t)2 : HIDDEN_ROW) +#define IF_BT_TRAINER_ON(x) (g_eeGeneral.bluetoothMode == BLUETOOTH_TRAINER ? (uint8_t)(x) : HIDDEN_ROW) +#define TRAINER_BLUETOOTH_M_ROW ((bluetooth.distantAddr[0] == '\0' || bluetooth.state == BLUETOOTH_STATE_CONNECTED) ? (uint8_t)0 : (uint8_t)1) +#define TRAINER_BLUETOOTH_S_ROW (bluetooth.distantAddr[0] == '\0' ? HIDDEN_ROW : LABEL()) +#define TRAINER_BLUETOOTH_ROW (g_model.trainerData.mode == TRAINER_MODE_MASTER_BLUETOOTH ? TRAINER_BLUETOOTH_M_ROW : (g_model.trainerData.mode == TRAINER_MODE_SLAVE_BLUETOOTH ? TRAINER_BLUETOOTH_S_ROW : HIDDEN_ROW)) +#define TRAINER_ROWS LABEL(Trainer), 0, IF_BT_TRAINER_ON(TRAINER_BLUETOOTH_ROW), TRAINER_CHANNELS_ROW, TRAINER_PPM_PARAMS_ROW -#define TRAINER_LINE1_BLUETOOTH_M_ROWS ((bluetooth.distantAddr[0] == 0 || bluetooth.state == BLUETOOTH_STATE_CONNECTED) ? (uint8_t)0 : (uint8_t)1) -#define TRAINER_LINE1_ROWS (g_model.trainerData.mode == TRAINER_MODE_SLAVE ? (uint8_t)1 : (g_model.trainerData.mode == TRAINER_MODE_MASTER_BLUETOOTH ? TRAINER_LINE1_BLUETOOTH_M_ROWS : (g_model.trainerData.mode == TRAINER_MODE_SLAVE_BLUETOOTH ? (uint8_t)1 : HIDDEN_ROW))) -#define TRAINER_LINE2_ROWS (g_model.trainerData.mode == TRAINER_MODE_SLAVE ? (uint8_t)2 : HIDDEN_ROW) +#if defined(PXX2) +#define REGISTRATION_ID_ROWS uint8_t((isDefaultModelRegistrationID() || (warningText && popupFunc == runPopupRegister)) ? HIDDEN_ROW : READONLY_ROW), +#else +#define REGISTRATION_ID_ROWS +#endif + +void drawReceiverName(coord_t x, coord_t y, uint8_t moduleIdx, uint8_t receiverIdx, LcdFlags flags) +{ + if (isModulePXX2(moduleIdx)) { + if (g_model.moduleData[moduleIdx].pxx2.receiverName[receiverIdx][0] != '\0') + lcdDrawSizedText(x, y, g_model.moduleData[moduleIdx].pxx2.receiverName[receiverIdx], effectiveLen(g_model.moduleData[moduleIdx].pxx2.receiverName[receiverIdx], PXX2_LEN_RX_NAME), flags); + else + lcdDrawText(x, y, "---", flags); + } +#if defined(HARDWARE_INTERNAL_MODULE) + else if (moduleIdx == INTERNAL_MODULE) { + lcdDrawText(x, y, "Internal", flags); + } +#endif + else { + lcdDrawText(x, y, "External", flags); + } +} + +#if defined(EXTERNAL_ANTENNA) +#define ANTENNA_ROW IF_NOT_PXX2_MODULE(INTERNAL_MODULE, IF_INTERNAL_MODULE_ON(0)), // Antenna +void onAntennaSwitchConfirm(const char * result) +{ + if (result == STR_OK) { + // Switch to external antenna confirmation + g_model.moduleData[INTERNAL_MODULE].pxx.external_antenna = XJT_EXTERNAL_ANTENNA; + } +} +#else +#define ANTENNA_ROW +#endif bool menuModelSetup(event_t event) { bool CURSOR_ON_CELL = (menuHorizontalPosition >= 0); - // Switch to external antenna confirmation - if (warningResult) { - warningResult = 0; - g_model.moduleData[INTERNAL_MODULE].pxx.external_antenna = XJT_EXTERNAL_ANTENNA; - } - int8_t old_editMode = s_editMode; MENU(STR_MENUSETUP, MODEL_ICONS, menuTabModel, MENU_MODEL_SETUP, ITEM_MODEL_SETUP_MAX, - { 0, 0, TIMERS_ROWS, 0, 1, 0, 0, - LABEL(Throttle), 0, 0, 0, - LABEL(PreflightCheck), 0, 0, SW_WARN_ITEMS(), POT_WARN_ROWS, (g_model.potsWarnMode ? POT_WARN_ITEMS() : HIDDEN_ROW), (g_model.potsWarnMode ? SLIDER_WARN_ITEMS() : HIDDEN_ROW), NAVIGATION_LINE_BY_LINE|(NUM_STICKS+NUM_POTS+NUM_SLIDERS-1), 0, + { 0, // Model name + 0, // Model bitmap + TIMERS_ROWS, + 0, // Extended limits + 1, // Extended trims + 0, // Show trims + 0, // Trims step + + LABEL(Throttle), + 0, // Throttle reverse + 0, // Throttle trace source + 0, // Throttle trim + + LABEL(PreflightCheck), + 0, // Display checklist + 0, // Throttle state + uint8_t(NAVIGATION_LINE_BY_LINE|(getSwitchWarningsCount()-1)), // Switches warnings + 0, // Pots & Sliders warning mode + g_model.potsWarnMode ? uint8_t(NAVIGATION_LINE_BY_LINE|(NUM_POTS-1)) : HIDDEN_ROW, // Pots positions + g_model.potsWarnMode ? uint8_t(NAVIGATION_LINE_BY_LINE|(NUM_SLIDERS-1)) : HIDDEN_ROW, // Sliders positions + + NAVIGATION_LINE_BY_LINE|(NUM_STICKS+NUM_POTS+NUM_SLIDERS-1), // Center beeps + 0, // Global functions + + REGISTRATION_ID_ROWS + LABEL(InternalModule), - INTERNAL_MODULE_MODE_ROWS, - INTERNAL_MODULE_CHANNELS_ROWS, - IF_INTERNAL_MODULE_ON(isModuleXJT(INTERNAL_MODULE) ? (HAS_RF_PROTOCOL_MODELINDEX(g_model.moduleData[INTERNAL_MODULE].rfProtocol) ? (uint8_t)2 : (uint8_t)1) : (isModulePPM(INTERNAL_MODULE) ? (uint8_t)1 : HIDDEN_ROW)), - IF_INTERNAL_MODULE_ON((isModuleXJT(INTERNAL_MODULE)) ? FAILSAFE_ROWS(INTERNAL_MODULE) : HIDDEN_ROW), - IF_INTERNAL_MODULE_ON(0), + INTERNAL_MODULE_TYPE_ROWS, + INTERNAL_MODULE_CHANNELS_ROWS, + IF_NOT_ACCESS_MODULE_RF(INTERNAL_MODULE, IF_INTERNAL_MODULE_ON(IF_INTERNAL_MODULE_ON(isModuleRxNumAvailable(INTERNAL_MODULE) ? (uint8_t)2 : (uint8_t)1))), + IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 0), // RxNum + ANTENNA_ROW + IF_INTERNAL_MODULE_ON(FAILSAFE_ROWS(INTERNAL_MODULE)), + IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 1), /* Range check and Register buttons */ \ + IF_PXX2_MODULE(INTERNAL_MODULE, 0), /* Module options */ \ + IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 0), /* Receiver 1 */ \ + IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 0), /* Receiver 2 */ \ + IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 0), /* Receiver 3 */ + LABEL(ExternalModule), - EXTERNAL_MODULE_MODE_ROWS, - MULTIMODULE_STATUS_ROWS - EXTERNAL_MODULE_CHANNELS_ROWS, - ((isModuleXJT(EXTERNAL_MODULE) && !HAS_RF_PROTOCOL_MODELINDEX(g_model.moduleData[EXTERNAL_MODULE].rfProtocol)) || isModuleSBUS(EXTERNAL_MODULE)) ? (uint8_t)1 : (isModulePPM(EXTERNAL_MODULE) || isModulePXX(EXTERNAL_MODULE) || isModuleDSM2(EXTERNAL_MODULE) || isModuleMultimodule(EXTERNAL_MODULE)) ? (uint8_t)2 : HIDDEN_ROW, - FAILSAFE_ROWS(EXTERNAL_MODULE), - EXTERNAL_MODULE_OPTION_ROW, - MULTIMODULE_MODULE_ROWS - EXTERNAL_MODULE_POWER_ROW, - LABEL(Trainer), - 0, - TRAINER_LINE1_ROWS, - TRAINER_LINE2_ROWS }); + EXTERNAL_MODULE_MODE_ROW(), + MULTIMODULE_STATUS_ROWS + EXTERNAL_MODULE_CHANNELS_ROWS, + IF_NOT_ACCESS_MODULE_RF(EXTERNAL_MODULE, EXTERNAL_MODULE_BIND_ROWS), + IF_ACCESS_MODULE_RF(EXTERNAL_MODULE, 0), // RxNum for ACCESS + IF_NOT_PXX2_MODULE(EXTERNAL_MODULE, EXTERNAL_MODULE_OPTION_ROW), + MULTIMODULE_MODULE_ROWS + EXTERNAL_MODULE_POWER_ROW, + FAILSAFE_ROWS(EXTERNAL_MODULE), + IF_ACCESS_MODULE_RF(EXTERNAL_MODULE, 1), // Range check and Register buttons + IF_PXX2_MODULE(EXTERNAL_MODULE, 0), // Module options + IF_ACCESS_MODULE_RF(EXTERNAL_MODULE, 0), // Receiver 1 + IF_ACCESS_MODULE_RF(EXTERNAL_MODULE, 0), // Receiver 2 + IF_ACCESS_MODULE_RF(EXTERNAL_MODULE, 0), // Receiver 3 + + TRAINER_ROWS + }); if (event == EVT_ENTRY) { reusableBuffer.moduleSetup.r9mPower = g_model.moduleData[EXTERNAL_MODULE].pxx.power; @@ -315,12 +651,12 @@ bool menuModelSetup(event_t event) LcdFlags attr = (sub == k ? blink : 0); switch(k) { - case ITEM_MODEL_NAME: + case ITEM_MODEL_SETUP_NAME: lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MODELNAME); editName(MODEL_SETUP_2ND_COLUMN, y, g_model.header.name, sizeof(g_model.header.name), event, attr); break; - case ITEM_MODEL_BITMAP: + case ITEM_MODEL_SETUP_BITMAP: lcdDrawText(MENUS_MARGIN_LEFT, y, STR_BITMAP); if (ZEXIST(g_model.header.bitmap)) lcdDrawSizedText(MODEL_SETUP_2ND_COLUMN, y, g_model.header.bitmap, sizeof(g_model.header.bitmap), attr); @@ -337,85 +673,85 @@ bool menuModelSetup(event_t event) } break; - case ITEM_MODEL_TIMER1: + case ITEM_MODEL_SETUP_TIMER1: editTimerMode(0, y, attr, event); break; - case ITEM_MODEL_TIMER1_NAME: - lcdDrawText(MENUS_MARGIN_LEFT, y, STR_TIMER_NAME); + case ITEM_MODEL_SETUP_TIMER1_NAME: + lcdDrawText(MENUS_MARGIN_LEFT, y, INDENT TR_NAME); editName(MODEL_SETUP_2ND_COLUMN, y, g_model.timers[0].name, LEN_TIMER_NAME, event, attr); break; - case ITEM_MODEL_TIMER1_MINUTE_BEEP: - lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MINUTEBEEP); + case ITEM_MODEL_SETUP_TIMER1_MINUTE_BEEP: + lcdDrawText(MENUS_MARGIN_LEFT, y, INDENT TR_MINUTEBEEP); g_model.timers[0].minuteBeep = editCheckBox(g_model.timers[0].minuteBeep, MODEL_SETUP_2ND_COLUMN, y, attr, event); break; - case ITEM_MODEL_TIMER1_COUNTDOWN_BEEP: + case ITEM_MODEL_SETUP_TIMER1_COUNTDOWN_BEEP: editTimerCountdown(0, y, attr, event); break; - case ITEM_MODEL_TIMER1_PERSISTENT: + case ITEM_MODEL_SETUP_TIMER1_PERSISTENT: lcdDrawText(MENUS_MARGIN_LEFT, y, STR_PERSISTENT); g_model.timers[0].persistent = editChoice(MODEL_SETUP_2ND_COLUMN, y, STR_VPERSISTENT, g_model.timers[0].persistent, 0, 2, attr, event); break; #if TIMERS > 1 - case ITEM_MODEL_TIMER2: + case ITEM_MODEL_SETUP_TIMER2: editTimerMode(1, y, attr, event); break; - case ITEM_MODEL_TIMER2_NAME: - lcdDrawText(MENUS_MARGIN_LEFT, y, STR_TIMER_NAME); + case ITEM_MODEL_SETUP_TIMER2_NAME: + lcdDrawText(MENUS_MARGIN_LEFT, y, INDENT TR_NAME); editName(MODEL_SETUP_2ND_COLUMN, y, g_model.timers[1].name, LEN_TIMER_NAME, event, attr); break; - case ITEM_MODEL_TIMER2_MINUTE_BEEP: - lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MINUTEBEEP); + case ITEM_MODEL_SETUP_TIMER2_MINUTE_BEEP: + lcdDrawText(MENUS_MARGIN_LEFT, y, INDENT TR_MINUTEBEEP); g_model.timers[1].minuteBeep = editCheckBox(g_model.timers[1].minuteBeep, MODEL_SETUP_2ND_COLUMN, y, attr, event); break; - case ITEM_MODEL_TIMER2_COUNTDOWN_BEEP: + case ITEM_MODEL_SETUP_TIMER2_COUNTDOWN_BEEP: editTimerCountdown(1, y, attr, event); break; - case ITEM_MODEL_TIMER2_PERSISTENT: + case ITEM_MODEL_SETUP_TIMER2_PERSISTENT: lcdDrawText(MENUS_MARGIN_LEFT, y, STR_PERSISTENT); g_model.timers[1].persistent = editChoice(MODEL_SETUP_2ND_COLUMN, y, STR_VPERSISTENT, g_model.timers[1].persistent, 0, 2, attr, event); break; #endif #if TIMERS > 2 - case ITEM_MODEL_TIMER3: + case ITEM_MODEL_SETUP_TIMER3: editTimerMode(2, y, attr, event); break; - case ITEM_MODEL_TIMER3_NAME: - lcdDrawText(MENUS_MARGIN_LEFT, y, STR_TIMER_NAME); + case ITEM_MODEL_SETUP_TIMER3_NAME: + lcdDrawText(MENUS_MARGIN_LEFT, y, INDENT TR_NAME); editName(MODEL_SETUP_2ND_COLUMN, y, g_model.timers[2].name, LEN_TIMER_NAME, event, attr); break; - case ITEM_MODEL_TIMER3_MINUTE_BEEP: - lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MINUTEBEEP); + case ITEM_MODEL_SETUP_TIMER3_MINUTE_BEEP: + lcdDrawText(MENUS_MARGIN_LEFT, y, INDENT TR_MINUTEBEEP); g_model.timers[2].minuteBeep = editCheckBox(g_model.timers[2].minuteBeep, MODEL_SETUP_2ND_COLUMN, y, attr, event); break; - case ITEM_MODEL_TIMER3_COUNTDOWN_BEEP: + case ITEM_MODEL_SETUP_TIMER3_COUNTDOWN_BEEP: editTimerCountdown(2, y, attr, event); break; - case ITEM_MODEL_TIMER3_PERSISTENT: + case ITEM_MODEL_SETUP_TIMER3_PERSISTENT: lcdDrawText(MENUS_MARGIN_LEFT, y, STR_PERSISTENT); g_model.timers[2].persistent = editChoice(MODEL_SETUP_2ND_COLUMN, y, STR_VPERSISTENT, g_model.timers[2].persistent, 0, 2, attr, event); break; #endif - case ITEM_MODEL_EXTENDED_LIMITS: + case ITEM_MODEL_SETUP_EXTENDED_LIMITS: lcdDrawText(MENUS_MARGIN_LEFT, y, STR_ELIMITS); g_model.extendedLimits = editCheckBox(g_model.extendedLimits, MODEL_SETUP_2ND_COLUMN, y, attr, event); break; - case ITEM_MODEL_EXTENDED_TRIMS: + case ITEM_MODEL_SETUP_EXTENDED_TRIMS: lcdDrawText(MENUS_MARGIN_LEFT, y, STR_ETRIMS); g_model.extendedTrims = editCheckBox(g_model.extendedTrims, MODEL_SETUP_2ND_COLUMN, y, menuHorizontalPosition<=0 ? attr : 0, event==EVT_KEY_BREAK(KEY_ENTER) ? event : 0); lcdDrawText(MODEL_SETUP_2ND_COLUMN+18, y, STR_RESET_BTN, menuHorizontalPosition>0 && !NO_HIGHLIGHT() ? attr : 0); @@ -432,26 +768,26 @@ bool menuModelSetup(event_t event) } break; - case ITEM_MODEL_DISPLAY_TRIMS: + case ITEM_MODEL_SETUP_DISPLAY_TRIMS: lcdDrawText(MENUS_MARGIN_LEFT, y, STR_DISPLAY_TRIMS); g_model.displayTrims = editChoice(MODEL_SETUP_2ND_COLUMN, y, "\006No\0 ChangeYes", g_model.displayTrims, 0, 2, attr, event); break; - case ITEM_MODEL_TRIM_INC: + case ITEM_MODEL_SETUP_TRIM_INC: lcdDrawText(MENUS_MARGIN_LEFT, y, STR_TRIMINC); g_model.trimInc = editChoice(MODEL_SETUP_2ND_COLUMN, y, STR_VTRIMINC, g_model.trimInc, -2, 2, attr, event); break; - case ITEM_MODEL_THROTTLE_LABEL: + case ITEM_MODEL_SETUP_THROTTLE_LABEL: lcdDrawText(MENUS_MARGIN_LEFT, y, STR_THROTTLE_LABEL); break; - case ITEM_MODEL_THROTTLE_REVERSED: + case ITEM_MODEL_SETUP_THROTTLE_REVERSED: lcdDrawText(MENUS_MARGIN_LEFT, y, STR_THROTTLEREVERSE); g_model.throttleReversed = editCheckBox(g_model.throttleReversed, MODEL_SETUP_2ND_COLUMN, y, attr, event); break; - case ITEM_MODEL_THROTTLE_TRACE: + case ITEM_MODEL_SETUP_THROTTLE_TRACE: { lcdDrawText(MENUS_MARGIN_LEFT, y, STR_TTRACE); if (attr) CHECK_INCDEC_MODELVAR_ZERO(event, g_model.thrTraceSrc, NUM_POTS+NUM_SLIDERS+MAX_OUTPUT_CHANNELS); @@ -464,26 +800,26 @@ bool menuModelSetup(event_t event) break; } - case ITEM_MODEL_THROTTLE_TRIM: + case ITEM_MODEL_SETUP_THROTTLE_TRIM: lcdDrawText(MENUS_MARGIN_LEFT, y, STR_TTRIM); g_model.thrTrim = editCheckBox(g_model.thrTrim, MODEL_SETUP_2ND_COLUMN, y, attr, event); break; - case ITEM_MODEL_PREFLIGHT_LABEL: + case ITEM_MODEL_SETUP_PREFLIGHT_LABEL: lcdDrawText(MENUS_MARGIN_LEFT, y, STR_PREFLIGHT); break; - case ITEM_MODEL_CHECKLIST_DISPLAY: + case ITEM_MODEL_SETUP_CHECKLIST_DISPLAY: lcdDrawText(MENUS_MARGIN_LEFT, y, STR_CHECKLIST); g_model.displayChecklist = editCheckBox(g_model.displayChecklist, MODEL_SETUP_2ND_COLUMN, y, attr, event); break; - case ITEM_MODEL_THROTTLE_WARNING: + case ITEM_MODEL_SETUP_THROTTLE_WARNING: lcdDrawText(MENUS_MARGIN_LEFT, y, STR_THROTTLEWARNING); g_model.disableThrottleWarning = !editCheckBox(!g_model.disableThrottleWarning, MODEL_SETUP_2ND_COLUMN, y, attr, event); break; - case ITEM_MODEL_SWITCHES_WARNING: + case ITEM_MODEL_SETUP_SWITCHES_WARNING: { lcdDrawText(MENUS_MARGIN_LEFT, y, STR_SWITCHWARNING); if (!READ_ONLY() && attr && menuHorizontalPosition<0 && event==EVT_KEY_LONG(KEY_ENTER)) { @@ -530,7 +866,7 @@ bool menuModelSetup(event_t event) break; } - case ITEM_MODEL_SLIDPOT_WARNING_STATE: + case ITEM_MODEL_SETUP_POTS_SLIDERS_WARNING_STATE: lcdDrawText(MENUS_MARGIN_LEFT, y,STR_POTWARNINGSTATE); lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, "\004""OFF\0""Man\0""Auto", g_model.potsWarnMode, attr); if (attr) { @@ -539,7 +875,7 @@ bool menuModelSetup(event_t event) } break; - case ITEM_MODEL_POTS_WARNING: + case ITEM_MODEL_SETUP_POTS_WARNING: { lcdDrawText(MENUS_MARGIN_LEFT, y, STR_POTWARNING); if (attr) { @@ -578,7 +914,7 @@ bool menuModelSetup(event_t event) break; } - case ITEM_MODEL_SLIDERS_WARNING: + case ITEM_MODEL_SETUP_SLIDERS_WARNING: lcdDrawText(MENUS_MARGIN_LEFT, y, STR_SLIDERWARNING); if (attr) { if (!READ_ONLY() && menuHorizontalPosition+1 && event==EVT_KEY_LONG(KEY_ENTER)) { @@ -615,7 +951,7 @@ bool menuModelSetup(event_t event) } break; - case ITEM_MODEL_BEEP_CENTER: + case ITEM_MODEL_SETUP_BEEP_CENTER: lcdDrawText(MENUS_MARGIN_LEFT, y, STR_BEEPCTR); lcdNextPos = MODEL_SETUP_2ND_COLUMN - 3; for (int i=0; i 1 + else if (old_editMode > 0) { + if (isModuleR9MNonAccess(EXTERNAL_MODULE)) { + if (g_model.moduleData[EXTERNAL_MODULE].subType > MODULE_SUBTYPE_R9M_EU) { + POPUP_WARNING(STR_R9M_PROTO_FLEX_WARN_LINE1); + SET_WARNING_INFO(STR_R9M_PROTO_WARN_LINE2, sizeof(TR_R9M_PROTO_WARN_LINE2) - 1, 0); + } +#if POPUP_LEVEL >= 3 + else if (g_model.moduleData[EXTERNAL_MODULE].subType == MODULE_SUBTYPE_R9M_EU) { + POPUP_WARNING(STR_R9M_PROTO_EU_WARN_LINE1); + SET_WARNING_INFO(STR_R9M_PROTO_WARN_LINE2, sizeof(TR_R9M_PROTO_WARN_LINE2) - 1, 0); + } + else { + POPUP_WARNING(STR_R9M_PROTO_FCC_WARN_LINE1); + SET_WARNING_INFO(STR_R9M_PROTO_WARN_LINE2, sizeof(TR_R9M_PROTO_WARN_LINE2) - 1, 0); + } +#endif + } + } +#endif } break; - case ITEM_MODEL_TRAINER_LABEL: + case ITEM_MODEL_SETUP_INTERNAL_MODULE_CHANNELS: + case ITEM_MODEL_SETUP_EXTERNAL_MODULE_CHANNELS: + { + uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); + ModuleData & moduleData = g_model.moduleData[moduleIdx]; + lcdDrawText(MENUS_MARGIN_LEFT, y, STR_CHANNELRANGE); + if ((int8_t)MODULE_CHANNELS_ROWS(moduleIdx) >= 0) { + drawStringWithIndex(MODEL_SETUP_2ND_COLUMN, y, STR_CH, moduleData.channelsStart+1, menuHorizontalPosition==0 ? attr : 0); + lcdDrawText(lcdNextPos+5, y, "-"); + drawStringWithIndex(lcdNextPos+5, y, STR_CH, moduleData.channelsStart+sentModuleChannels(moduleIdx), menuHorizontalPosition==1 ? attr : 0); + const char * delay = getModuleDelay(moduleIdx); + if (delay) + lcdDrawText(lcdNextPos + 15, y, delay); + if (attr && s_editMode>0) { + switch (menuHorizontalPosition) { + case 0: + CHECK_INCDEC_MODELVAR_ZERO(event, moduleData.channelsStart, 32-8-moduleData.channelsCount); + break; + case 1: + CHECK_INCDEC_MODELVAR_CHECK(event, moduleData.channelsCount, -4, min(maxModuleChannels_M8(moduleIdx), 32-8-moduleData.channelsStart), moduleData.type == MODULE_TYPE_ISRM_PXX2 ? isPxx2IsrmChannelsCountAllowed : nullptr); + if (checkIncDec_Ret && moduleData.type == MODULE_TYPE_PPM) { + SET_DEFAULT_PPM_FRAME_LENGTH(moduleIdx); + } + break; + } + } + } + break; + } + + case ITEM_MODEL_SETUP_TRAINER_LABEL: lcdDrawText(MENUS_MARGIN_LEFT, y, STR_TRAINER); break; - case ITEM_MODEL_TRAINER_LINE1: + case ITEM_MODEL_SETUP_TRAINER_MODE: + lcdDrawText(MENUS_MARGIN_LEFT + INDENT_WIDTH, y, STR_MODE); + g_model.trainerData.mode = editChoice(MODEL_SETUP_2ND_COLUMN, y, STR_VTRAINERMODES, g_model.trainerData.mode, 0, TRAINER_MODE_MAX(), attr, event); + if (attr && checkIncDec_Ret) { + bluetooth.state = BLUETOOTH_STATE_OFF; + bluetooth.distantAddr[0] = 0; + } + break; + + case ITEM_MODEL_SETUP_TRAINER_BLUETOOTH: if (g_model.trainerData.mode == TRAINER_MODE_MASTER_BLUETOOTH) { if (attr) { s_editMode = 0; @@ -827,45 +1231,27 @@ bool menuModelSetup(event_t event) bluetooth.state = BLUETOOTH_STATE_DISCOVER_REQUESTED; } } - break; } - // no break + break; - case ITEM_MODEL_INTERNAL_MODULE_CHANNELS: - case ITEM_MODEL_EXTERNAL_MODULE_CHANNELS: - { - uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); - ModuleData & moduleData = g_model.moduleData[moduleIdx]; + case ITEM_MODEL_SETUP_TRAINER_CHANNELS: lcdDrawText(MENUS_MARGIN_LEFT, y, STR_CHANNELRANGE); - if ((int8_t)PORT_CHANNELS_ROWS(moduleIdx) >= 0) { - drawStringWithIndex(MODEL_SETUP_2ND_COLUMN, y, STR_CH, moduleData.channelsStart+1, menuHorizontalPosition==0 ? attr : 0); - lcdDrawText(lcdNextPos+5, y, "-"); - drawStringWithIndex(lcdNextPos+5, y, STR_CH, moduleData.channelsStart+sentModuleChannels(moduleIdx), menuHorizontalPosition==1 ? attr : 0); - if (IS_R9M_OR_XJTD16(moduleIdx)) { - if (sentModuleChannels(moduleIdx) > 8) - lcdDrawText(lcdNextPos + 15, y, "(18ms)"); - else - lcdDrawText(lcdNextPos + 15, y, "(9ms)"); - } - if (attr && s_editMode>0) { - switch (menuHorizontalPosition) { - case 0: - CHECK_INCDEC_MODELVAR_ZERO(event, moduleData.channelsStart, 32-8-moduleData.channelsCount); - break; - case 1: - CHECK_INCDEC_MODELVAR(event, moduleData.channelsCount, -4, min(maxModuleChannels_M8(moduleIdx), 32-8-moduleData.channelsStart)); - if ((k == ITEM_MODEL_EXTERNAL_MODULE_CHANNELS && g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_PPM) - || (k == ITEM_MODEL_TRAINER_LINE1) - ) - SET_DEFAULT_PPM_FRAME_LENGTH(moduleIdx); - break; - } + drawStringWithIndex(MODEL_SETUP_2ND_COLUMN, y, STR_CH, g_model.trainerData.channelsStart+1, menuHorizontalPosition==0 ? attr : 0); + lcdDrawText(lcdNextPos+5, y, "-"); + drawStringWithIndex(lcdNextPos+5, y, STR_CH, g_model.trainerData.channelsStart + 8 + g_model.trainerData.channelsCount, menuHorizontalPosition==1 ? attr : 0); + if (attr && s_editMode > 0) { + switch (menuHorizontalPosition) { + case 0: + CHECK_INCDEC_MODELVAR_ZERO(event, g_model.trainerData.channelsStart, 32-8-g_model.trainerData.channelsCount); + break; + case 1: + CHECK_INCDEC_MODELVAR(event, g_model.trainerData.channelsCount, -4, min(MAX_TRAINER_CHANNELS_M8, 32-8-g_model.trainerData.channelsStart)); + break; } } break; - } - case ITEM_MODEL_TRAINER_LINE2: + case ITEM_MODEL_SETUP_TRAINER_PPM_PARAMS: lcdDrawText(MENUS_MARGIN_LEFT, y, STR_PPMFRAME); lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, (int16_t)g_model.trainerData.frameLength*5 + 225, (menuHorizontalPosition<=0 ? attr : 0) | PREC1|LEFT, 0, NULL, STR_MS); lcdDrawNumber(MODEL_SETUP_2ND_COLUMN+80, y, (g_model.trainerData.delay*50)+300, (CURSOR_ON_LINE() || menuHorizontalPosition==1) ? attr|LEFT : LEFT, 0, NULL, "us"); @@ -885,8 +1271,142 @@ bool menuModelSetup(event_t event) } break; - case ITEM_MODEL_INTERNAL_MODULE_BIND: - case ITEM_MODEL_EXTERNAL_MODULE_BIND: +#if defined(PXX2) + case ITEM_MODEL_SETUP_REGISTRATION_ID: + lcdDrawText(MENUS_MARGIN_LEFT, y, STR_REG_ID); + if (isDefaultModelRegistrationID()) + lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_PXX2_DEFAULT); + else + lcdDrawSizedText(MODEL_SETUP_2ND_COLUMN, y, g_model.modelRegistrationID, PXX2_LEN_REGISTRATION_ID, ZCHAR); + break; +#endif + + case ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_MODEL_NUM: + { + uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); + lcdDrawText(MENUS_MARGIN_LEFT + INDENT_WIDTH, y, STR_RECEIVER_NUM); + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.header.modelId[moduleIdx], attr | LEADING0 | LEFT, 2); + if (attr) { + CHECK_INCDEC_MODELVAR_ZERO(event, g_model.header.modelId[moduleIdx], getMaxRxNum(moduleIdx)); + if (event == EVT_KEY_LONG(KEY_ENTER)) { + killEvents(event); + uint8_t newVal = modelslist.findNextUnusedModelId(moduleIdx); + if (newVal != g_model.header.modelId[moduleIdx]) { + g_model.header.modelId[moduleIdx] = newVal; + storageDirty(EE_MODEL); + } + } + } + } + break; + + case ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_REGISTER_RANGE: + { + uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); + lcdDrawText(MENUS_MARGIN_LEFT + INDENT_WIDTH, y, STR_MODULE); + drawButton(MODEL_SETUP_2ND_COLUMN, y, STR_REGISTER, (menuHorizontalPosition == 0 ? attr : 0)); + drawButton(MODEL_SETUP_2ND_COLUMN + MODEL_SETUP_SET_FAILSAFE_OFS, y, STR_MODULE_RANGE, (menuHorizontalPosition == 1 ? attr : 0)); + if (attr) { + if (moduleState[moduleIdx].mode == MODULE_MODE_NORMAL && s_editMode > 0) { + if (menuHorizontalPosition == 0 && event == EVT_KEY_BREAK(KEY_ENTER)) { + startRegisterDialog(moduleIdx); + } + else if (menuHorizontalPosition == 1) { + moduleState[moduleIdx].mode = MODULE_MODE_RANGECHECK; + } + } + if (s_editMode == 0 && !warningText) { + moduleState[moduleIdx].mode = MODULE_MODE_NORMAL; + } + if (moduleState[moduleIdx].mode == MODULE_MODE_NORMAL) { + // REGISTER finished + s_editMode = 0; + } + } + } + break; + + case ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_OPTIONS: + case ITEM_MODEL_SETUP_EXTERNAL_MODULE_PXX2_OPTIONS: + lcdDrawText(MENUS_MARGIN_LEFT + INDENT_WIDTH, y, STR_OPTIONS); + drawButton(MODEL_SETUP_2ND_COLUMN, y, STR_SET, attr); + if (event == EVT_KEY_BREAK(KEY_ENTER) && attr) { + g_moduleIdx = CURRENT_MODULE_EDITED(k); + pushMenu(menuModelModuleOptions); + } + break; + + case ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_RECEIVER_1: + case ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_RECEIVER_2: + case ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_RECEIVER_3: + { + uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); + uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(k); + ModuleInformation & moduleInformation = reusableBuffer.moduleSetup.pxx2.moduleInformation; + + drawStringWithIndex(MENUS_MARGIN_LEFT + INDENT_WIDTH, y, STR_RECEIVER, receiverIdx + 1); + + if (!(g_model.moduleData[moduleIdx].pxx2.receivers & (1 << receiverIdx))) { + drawButton(MODEL_SETUP_2ND_COLUMN, y, STR_MODULE_BIND, attr); + if (attr && s_editMode > 0) { + s_editMode = 0; + killEvents(event); + g_model.moduleData[moduleIdx].pxx2.receivers |= (1 << receiverIdx); + memclear(g_model.moduleData[moduleIdx].pxx2.receiverName[receiverIdx], PXX2_LEN_RX_NAME); + storageDirty(EE_MODEL); + } + else { + break; + } + } + + drawReceiverName(MODEL_SETUP_2ND_COLUMN, y, moduleIdx, receiverIdx, attr); + + if (s_editMode && isModuleR9MAccess(moduleIdx) && moduleState[moduleIdx].mode == MODULE_MODE_NORMAL && moduleInformation.information.modelID) { + moduleInformation.information.modelID = 0; + moduleState[moduleIdx].startBind(&reusableBuffer.moduleSetup.bindInformation); + } + + if (attr && (moduleState[moduleIdx].mode == 0 || s_editMode == 0)) { + if (moduleState[moduleIdx].mode) { + moduleState[moduleIdx].mode = 0; + removePXX2ReceiverIfEmpty(moduleIdx, receiverIdx); + killEvents(event); // we stopped BIND / SHARE, we don't want to re-open the menu + event = 0; + } + s_editMode = 0; + } + + if (moduleState[moduleIdx].mode == MODULE_MODE_BIND) { + if (reusableBuffer.moduleSetup.bindInformation.step == BIND_INIT && reusableBuffer.moduleSetup.bindInformation.candidateReceiversCount > 0) { + popupMenuItemsCount = min(reusableBuffer.moduleSetup.bindInformation.candidateReceiversCount, PXX2_MAX_RECEIVERS_PER_MODULE); + for (uint8_t i=0; i0) { - CHECK_INCDEC_MODELVAR_ZERO(event, g_model.header.modelId[moduleIdx], MAX_RX_NUM(moduleIdx)); + CHECK_INCDEC_MODELVAR_ZERO(event, g_model.header.modelId[moduleIdx], getMaxRxNum(moduleIdx)); if (event == EVT_KEY_LONG(KEY_ENTER)) { killEvents(event); uint8_t newVal = modelslist.findNextUnusedModelId(moduleIdx); @@ -964,29 +1484,9 @@ bool menuModelSetup(event_t event) if (attr && l_posHorz>0) { if (s_editMode>0) { if (l_posHorz == 1) { - if (isModuleR9M(moduleIdx) || (isModuleXJT(moduleIdx) && g_model.moduleData[moduleIdx].rfProtocol == MODULE_SUBTYPE_PXX1_ACCST_D16)) { + if (isModuleR9MNonAccess(moduleIdx) || isModuleD16(moduleIdx)) { if (event == EVT_KEY_BREAK(KEY_ENTER)) { - uint8_t default_selection = 0; // R9M_LBT should default to 0 as available options are variables - if (isModuleR9M_LBT(moduleIdx)) { - if (BIND_TELEM_ALLOWED(moduleIdx)) - POPUP_MENU_ADD_ITEM(STR_BINDING_1_8_TELEM_ON); - POPUP_MENU_ADD_ITEM(STR_BINDING_1_8_TELEM_OFF); - if (BIND_TELEM_ALLOWED(moduleIdx) && BIND_CH9TO16_ALLOWED(moduleIdx)) - POPUP_MENU_ADD_ITEM(STR_BINDING_9_16_TELEM_ON); - if (BIND_CH9TO16_ALLOWED(moduleIdx)) - POPUP_MENU_ADD_ITEM(STR_BINDING_9_16_TELEM_OFF); - } - else { - if (BIND_TELEM_ALLOWED(moduleIdx)) - POPUP_MENU_ADD_ITEM(STR_BINDING_1_8_TELEM_ON); - POPUP_MENU_ADD_ITEM(STR_BINDING_1_8_TELEM_OFF); - if (BIND_TELEM_ALLOWED(moduleIdx)) - POPUP_MENU_ADD_ITEM(STR_BINDING_9_16_TELEM_ON); - POPUP_MENU_ADD_ITEM(STR_BINDING_9_16_TELEM_OFF); - default_selection = g_model.moduleData[moduleIdx].pxx.receiver_telem_off + (g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 << 1); - } - POPUP_MENU_SELECT_ITEM(default_selection); - POPUP_MENU_START(onBindMenu); + startBindMenu(moduleIdx); continue; } if (moduleState[moduleIdx].mode == MODULE_MODE_BIND) { @@ -1017,8 +1517,8 @@ bool menuModelSetup(event_t event) break; } - case ITEM_MODEL_INTERNAL_MODULE_FAILSAFE: - case ITEM_MODEL_EXTERNAL_MODULE_FAILSAFE: + case ITEM_MODEL_SETUP_INTERNAL_MODULE_FAILSAFE: + case ITEM_MODEL_SETUP_EXTERNAL_MODULE_FAILSAFE: { uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); ModuleData & moduleData = g_model.moduleData[moduleIdx]; @@ -1032,7 +1532,7 @@ bool menuModelSetup(event_t event) menuHorizontalPosition = 0; if (menuHorizontalPosition==0) { if (s_editMode>0) { - CHECK_INCDEC_MODELVAR_ZERO(event, moduleData.failsafeMode, FAILSAFE_LAST); + CHECK_INCDEC_MODELVAR_ZERO(event, moduleData.failsafeMode, isModuleR9M(moduleIdx) ? FAILSAFE_NOPULSES : FAILSAFE_LAST); if (checkIncDec_Ret) SEND_FAILSAFE_NOW(moduleIdx); } } @@ -1059,7 +1559,7 @@ bool menuModelSetup(event_t event) break; } - case ITEM_MODEL_EXTERNAL_MODULE_OPTIONS: + case ITEM_MODEL_SETUP_EXTERNAL_MODULE_OPTIONS: { uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); #if defined(MULTIMODULE) @@ -1069,7 +1569,7 @@ bool menuModelSetup(event_t event) const uint8_t multi_proto = g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true); const mm_protocol_definition *pdef = getMultiProtocolDefinition(multi_proto); if (pdef->optionsstr) - lcdDrawText(MENUS_MARGIN_LEFT, y, pdef->optionsstr); + lcdDrawText(MENUS_MARGIN_LEFT + INDENT_WIDTH, y, pdef->optionsstr); if (multi_proto == MODULE_SUBTYPE_MULTI_FS_AFHDS2A) optionValue = 50 + 5 * optionValue; @@ -1088,18 +1588,25 @@ bool menuModelSetup(event_t event) } } #endif - if (isModuleSBUS(moduleIdx)) { + if (isModuleR9MNonAccess(moduleIdx)) { + lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MODULE_TELEMETRY); + if (isSportLineUsedByInternalModule()) + lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_DISABLE_INTERNAL); + else + lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_MODULE_TELEM_ON); + } + else if (isModuleSBUS(moduleIdx)) { lcdDrawText(MENUS_MARGIN_LEFT, y, STR_WARN_BATTVOLTAGE); drawValueWithUnit(MODEL_SETUP_4TH_COLUMN, y, getBatteryVoltage(), UNIT_VOLTS, attr|PREC2|LEFT); } - } break; + } - case ITEM_MODEL_EXTERNAL_MODULE_POWER: + case ITEM_MODEL_SETUP_EXTERNAL_MODULE_POWER: { uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); - if (isModuleR9M(moduleIdx)) { - lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MULTI_RFPOWER); + if (isModuleR9MNonAccess(moduleIdx)) { + lcdDrawText(MENUS_MARGIN_LEFT, y, STR_RFPOWER); if(isModuleR9M_FCC_VARIANT(moduleIdx)) { lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_R9M_FCC_POWER_VALUES, g_model.moduleData[moduleIdx].pxx.power, LEFT | attr); if (attr) @@ -1128,21 +1635,23 @@ bool menuModelSetup(event_t event) break; #if defined(MULTIMODULE) - case ITEM_MODEL_EXTERNAL_MODULE_AUTOBIND: + case ITEM_MODEL_SETUP_EXTERNAL_MODULE_AUTOBIND: if (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true) == MODULE_SUBTYPE_MULTI_DSM2) lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MULTI_DSM_AUTODTECT); else lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MULTI_AUTOBIND); g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode, MODEL_SETUP_2ND_COLUMN, y, attr, event); break; - case ITEM_MODEL_EXTERNAL_MODULE_STATUS: { + + case ITEM_MODEL_SETUP_EXTERNAL_MODULE_STATUS: { lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MODULE_STATUS); char statusText[64]; multiModuleStatus.getStatusString(statusText); lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, statusText); break; - case ITEM_MODEL_EXTERNAL_MODULE_SYNCSTATUS: { + + case ITEM_MODEL_SETUP_EXTERNAL_MODULE_SYNCSTATUS: { lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MODULE_SYNC); char statusText[64]; @@ -1164,24 +1673,23 @@ bool menuModelSetup(event_t event) if (old_editMode > 0 && s_editMode == 0) { ModelCell* mod_cell = modelslist.getCurrentModel(); if (mod_cell) { - switch(menuVerticalPosition) { - case ITEM_MODEL_NAME: + case ITEM_MODEL_SETUP_NAME: mod_cell->setModelName(g_model.header.name); break; - case ITEM_MODEL_INTERNAL_MODULE_BIND: + case ITEM_MODEL_SETUP_INTERNAL_MODULE_NOT_ACCESS_BIND: if (menuHorizontalPosition != 0) break; - case ITEM_MODEL_INTERNAL_MODULE_MODE: + case ITEM_MODEL_SETUP_INTERNAL_MODULE_TYPE: mod_cell->setRfData(&g_model); checkModelIdUnique(INTERNAL_MODULE); break; - case ITEM_MODEL_EXTERNAL_MODULE_BIND: + case ITEM_MODEL_SETUP_EXTERNAL_MODULE_NOT_ACCESS_BIND: if (menuHorizontalPosition != 0) break; - case ITEM_MODEL_EXTERNAL_MODULE_MODE: + case ITEM_MODEL_SETUP_EXTERNAL_MODULE_TYPE: mod_cell->setRfData(&g_model); if (g_model.moduleData[EXTERNAL_MODULE].type != MODULE_TYPE_NONE) checkModelIdUnique(EXTERNAL_MODULE); diff --git a/radio/src/gui/480x272/model_telemetry.cpp b/radio/src/gui/480x272/model_telemetry.cpp index ae8a8aeda..f89edcc2b 100644 --- a/radio/src/gui/480x272/model_telemetry.cpp +++ b/radio/src/gui/480x272/model_telemetry.cpp @@ -305,7 +305,7 @@ bool menuModelTelemetryFrsky(event_t event) break; case ITEM_TELEMETRY_VARIO_SOURCE: - lcdDrawText(MENUS_MARGIN_LEFT, y, STR_SOURCE); + lcdDrawText(MENUS_MARGIN_LEFT, y, INDENT TR_SOURCE); drawSource(TELEM_COL2, y, g_model.varioData.source ? MIXSRC_FIRST_TELEM+3*(g_model.varioData.source-1) : 0, attr); if (attr) { g_model.varioData.source = checkIncDec(event, g_model.varioData.source, 0, MAX_TELEMETRY_SENSORS, EE_MODEL|NO_INCDEC_MARKS, isSensorAvailable); diff --git a/radio/src/gui/480x272/model_telemetry_sensor.cpp b/radio/src/gui/480x272/model_telemetry_sensor.cpp index f50aebd95..f4d285efb 100644 --- a/radio/src/gui/480x272/model_telemetry_sensor.cpp +++ b/radio/src/gui/480x272/model_telemetry_sensor.cpp @@ -59,9 +59,9 @@ bool menuModelSensor(event_t event) SUBMENU("SENSOR", ICON_MODEL_TELEMETRY, SENSOR_FIELD_MAX, { 0, 0, sensor->type == TELEM_TYPE_CALCULATED ? (uint8_t)0 : (uint8_t)1, SENSOR_UNIT_ROWS, SENSOR_PREC_ROWS, SENSOR_PARAM1_ROWS, SENSOR_PARAM2_ROWS, SENSOR_PARAM3_ROWS, SENSOR_PARAM4_ROWS, SENSOR_AUTOOFFSET_ROWS, SENSOR_ONLYPOS_ROWS, SENSOR_FILTER_ROWS, SENSOR_PERSISTENT_ROWS, 0 }); lcdDrawNumber(lcdNextPos, 3, s_currIdx+1, MENU_TITLE_COLOR|LEFT); - drawSensorCustomValue(50, 3+FH, s_currIdx, getValue(MIXSRC_FIRST_TELEM+3*s_currIdx), MENU_TITLE_COLOR|LEFT); + drawSensorCustomValue(50, 3 + FH, s_currIdx, getValue(MIXSRC_FIRST_TELEM+3*s_currIdx), MENU_TITLE_COLOR|LEFT); - for (uint8_t i=0; iformula == TELEM_FORMULA_TOTALIZE) { - lcdDrawText(MENUS_MARGIN_LEFT, y, NO_INDENT(STR_SOURCE)); + lcdDrawText(MENUS_MARGIN_LEFT, y, STR_SOURCE); drawSource(SENSOR_2ND_COLUMN, y, sensor->consumption.source ? MIXSRC_FIRST_TELEM+3*(sensor->consumption.source-1) : 0, attr); if (attr) { sensor->consumption.source = checkIncDec(event, sensor->consumption.source, 0, MAX_TELEMETRY_SENSORS, EE_MODEL|NO_INCDEC_MARKS, isSensorAvailable); @@ -231,7 +231,7 @@ bool menuModelSensor(event_t event) break; } else { - lcdDrawText(MENUS_MARGIN_LEFT, y, NO_INDENT(STR_OFFSET)); + lcdDrawText(MENUS_MARGIN_LEFT, y, STR_OFFSET); if (attr) sensor->custom.offset = checkIncDec(event, sensor->custom.offset, -30000, +30000, EE_MODEL|NO_INCDEC_MARKS|INCDEC_REP10); if (sensor->prec > 0) attr |= (sensor->prec == 2 ? PREC2 : PREC1); lcdDrawNumber(SENSOR_2ND_COLUMN, y, sensor->custom.offset, LEFT|attr); @@ -244,17 +244,17 @@ bool menuModelSensor(event_t event) case SENSOR_FIELD_PARAM4: { - drawStringWithIndex(MENUS_MARGIN_LEFT, y, NO_INDENT(STR_SOURCE), k-SENSOR_FIELD_PARAM1+1); - int8_t & source = sensor->calc.sources[k-SENSOR_FIELD_PARAM1]; + drawStringWithIndex(MENUS_MARGIN_LEFT, y, STR_SOURCE, k-SENSOR_FIELD_PARAM1+1); + int8_t * source = &sensor->calc.sources[k-SENSOR_FIELD_PARAM1]; if (attr) { - source = checkIncDec(event, source, -MAX_TELEMETRY_SENSORS, MAX_TELEMETRY_SENSORS, EE_MODEL|NO_INCDEC_MARKS, isSensorAvailable); + *source = checkIncDec(event, *source, -MAX_TELEMETRY_SENSORS, MAX_TELEMETRY_SENSORS, EE_MODEL|NO_INCDEC_MARKS, isSensorAvailable); } - if (source < 0) { + if (*source < 0) { lcdDrawText(SENSOR_2ND_COLUMN, y, "-", attr); - drawSource(SENSOR_2ND_COLUMN+5, y, MIXSRC_FIRST_TELEM+3*(-1-source), attr); + drawSource(SENSOR_2ND_COLUMN+5, y, MIXSRC_FIRST_TELEM+3*(-1-*source), attr); } else { - drawSource(SENSOR_2ND_COLUMN, y, source ? MIXSRC_FIRST_TELEM+3*(source-1) : 0, attr); + drawSource(SENSOR_2ND_COLUMN, y, *source ? MIXSRC_FIRST_TELEM+3*(*source-1) : 0, attr); } break; } diff --git a/radio/src/gui/480x272/popups.cpp b/radio/src/gui/480x272/popups.cpp index e33ba36d0..d0773a3c7 100644 --- a/radio/src/gui/480x272/popups.cpp +++ b/radio/src/gui/480x272/popups.cpp @@ -73,22 +73,41 @@ void showMessageBox(const char * title) lcdRefresh(); } +void drawPopupBackgroundAndBorder(coord_t x, coord_t y, coord_t w, coord_t h) +{ + lcdDrawSolidFilledRect(x + 1, y + 1, w - 2, h - 2, TEXT_BGCOLOR); + lcdDrawSolidRect(x, y, w, h, 1, ALARM_COLOR); +} + void runPopupWarning(event_t event) { warningResult = false; - theme->drawMessageBox(warningText, warningInfoText, WARNING_TYPE_INFO ? STR_OK : (warningType == WARNING_TYPE_ASTERISK ? STR_EXIT : STR_POPUPS_ENTER_EXIT), warningType); + theme->drawMessageBox(warningText, warningInfoText, warningType == WARNING_TYPE_INFO ? STR_OK : (warningType == WARNING_TYPE_ASTERISK ? STR_EXIT : STR_POPUPS_ENTER_EXIT), warningType); switch (event) { case EVT_KEY_BREAK(KEY_ENTER): if (warningType == WARNING_TYPE_ASTERISK) + // key ignored, the user has to press [EXIT] break; - if (warningType != WARNING_TYPE_INFO) - warningResult = true; + + if (warningType == WARNING_TYPE_CONFIRM) { + warningType = WARNING_TYPE_ASTERISK; + warningText = nullptr; + if (popupMenuHandler) + popupMenuHandler(STR_OK); + else + warningResult = true; + break; + } // no break case EVT_KEY_BREAK(KEY_EXIT): - warningText = NULL; + if (warningType == WARNING_TYPE_CONFIRM) { + if (popupMenuHandler) + popupMenuHandler(STR_EXIT); + } + warningText = nullptr; warningType = WARNING_TYPE_ASTERISK; break; } @@ -137,9 +156,13 @@ const char * runPopupMenu(event_t event) case EVT_KEY_BREAK(KEY_ENTER): result = popupMenuItems[popupMenuSelectedItem + (popupMenuOffsetType == MENU_OFFSET_INTERNAL ? popupMenuOffset : 0)]; - // no break + popupMenuItemsCount = 0; + popupMenuSelectedItem = 0; + popupMenuOffset = 0; + break; case EVT_KEY_BREAK(KEY_EXIT): + result = STR_EXIT; popupMenuItemsCount = 0; popupMenuSelectedItem = 0; popupMenuOffset = 0; @@ -148,8 +171,7 @@ const char * runPopupMenu(event_t event) int y = (LCD_H - (display_count*(FH+1))) / 2; - lcdDrawSolidFilledRect(MENU_X, y, MENU_W, display_count * (FH+1) + 1, TEXT_BGCOLOR); - lcdDrawSolidRect(MENU_X, y, MENU_W, display_count * (FH+1) + 2, 1, ALARM_COLOR); + drawPopupBackgroundAndBorder(MENU_X, y, MENU_W, display_count * (FH+1) + 2); for (uint8_t i=0; iAETR char s[5]; for (uint8_t i=0; i<4; i++) { - s[i] = STR_RETA123[channel_order(i+1)]; + s[i] = STR_RETA123[channelOrder(i+1)]; } s[4] = '\0'; lcdDrawText(RADIO_SETUP_2ND_COLUMN, y, s, attr); @@ -467,7 +476,7 @@ bool menuRadioSetup(event_t event) case ITEM_SETUP_STICK_MODE: { - lcdDrawText(MENUS_MARGIN_LEFT, y, NO_INDENT(STR_MODE)); + lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MODE); char s[2] = " "; s[0] = '1'+reusableBuffer.generalSettings.stickMode; lcdDrawText(RADIO_SETUP_2ND_COLUMN, y, s, attr); @@ -480,7 +489,7 @@ bool menuRadioSetup(event_t event) else if (reusableBuffer.generalSettings.stickMode != g_eeGeneral.stickMode) { pausePulses(); g_eeGeneral.stickMode = reusableBuffer.generalSettings.stickMode; - checkTHR(); + checkThrottleStick(); resumePulses(); waitKeysReleased(); } diff --git a/radio/src/gui/480x272/radio_tools.cpp b/radio/src/gui/480x272/radio_tools.cpp new file mode 100644 index 000000000..d7a7a8f2b --- /dev/null +++ b/radio/src/gui/480x272/radio_tools.cpp @@ -0,0 +1,180 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include +#include "opentx.h" + +extern uint8_t g_moduleIdx; + +bool addRadioTool(uint8_t index, const char * label) +{ + int8_t sub = menuVerticalPosition - HEADER_LINE; + LcdFlags attr = (sub == index ? INVERS : 0); + coord_t y = MENU_HEADER_HEIGHT + 1 + index * FH; + lcdDrawNumber(3, y, index + 1, LEADING0|LEFT, 2); +// BSS lcdDrawText(3*FW, y, label, (sub == index ? INVERS : 0)); + if (attr && s_editMode > 0) { + s_editMode = 0; + killAllEvents(); + return true; + } + return false; +} + +void addRadioModuleTool(uint8_t index, const char * label, bool (* tool)(event_t), uint8_t module) +{ + if (addRadioTool(index, label)) { + g_moduleIdx = module; + pushMenu(tool); + } +} + +#define TOOL_NAME_MAXLEN 16 + +#if defined(LUA) +bool readToolName(const char * filename, char * name) +{ + FIL file; + char buffer[1024]; + UINT count; + + if (f_open(&file, filename, FA_READ) != FR_OK) { + return "Error opening file"; + } + + if (f_read(&file, &buffer, sizeof(buffer), &count) != FR_OK) { + f_close(&file); + return false; + } + + const char * tns = "TNS|"; + auto * start = std::search(buffer, buffer + sizeof(buffer), tns, tns + 4); + if (start >= buffer + sizeof(buffer)) + return false; + + start += 4; + + const char * tne = "|TNE"; + auto * end = std::search(buffer, buffer + sizeof(buffer), tne, tne + 4); + if (end >= buffer + sizeof(buffer) || end <= start) + return false; + + uint8_t len = end - start; + if (len > TOOL_NAME_MAXLEN) + return false; + + strncpy(name, start, len); + memclear(name + len, TOOL_NAME_MAXLEN + 1 - len); + + return true; +} + +void addRadioScriptTool(uint8_t index, const char * path) +{ + char toolName[TOOL_NAME_MAXLEN + 1]; + const char * label; + char * ext = (char *)getFileExtension(path); + if (readToolName(path, toolName)) { + label = toolName; + } + else { + *ext = '\0'; + label = getBasename(path); + } + + if (addRadioTool(index, label)) { + f_chdir("/SCRIPTS/TOOLS/"); + *ext = '.'; + luaExec(path); + } +} + +bool isRadioScriptTool(const char * filename) +{ + const char * ext = getFileExtension(filename); + return ext && !strcasecmp(ext, SCRIPT_EXT); +} +#endif + +bool menuRadioTools(event_t event) +{ + if (event == EVT_ENTRY || event == EVT_ENTRY_UP) { + memclear(&reusableBuffer.radioTools, sizeof(reusableBuffer.radioTools)); +#if defined(PXX2) + for (uint8_t module = 0; module < NUM_MODULES; module++) { + if (isModulePXX2(module) && (module == INTERNAL_MODULE ? IS_INTERNAL_MODULE_ON() : IS_EXTERNAL_MODULE_ON())) { + moduleState[module].readModuleInformation(&reusableBuffer.radioTools.modules[module], PXX2_HW_INFO_TX_ID, PXX2_HW_INFO_TX_ID); + } + } +#endif + } + + SIMPLE_MENU(STR_MENUTOOLS, RADIO_ICONS, menuTabGeneral, MENU_RADIO_TOOLS, HEADER_LINE + reusableBuffer.radioTools.linesCount); + + uint8_t index = 0; + +#if 0 // TODO BSS defined(PXX2) + if (isPXX2ModuleOptionAvailable(reusableBuffer.hardwareAndSettings.modules[INTERNAL_MODULE].information.modelID, MODULE_OPTION_SPECTRUM_ANALYSER)) + addRadioModuleTool(index++, STR_SPECTRUM_ANALYSER_INT, menuRadioSpectrumAnalyser, INTERNAL_MODULE); + + if (isPXX2ModuleOptionAvailable(reusableBuffer.hardwareAndSettings.modules[INTERNAL_MODULE].information.modelID, MODULE_OPTION_POWER_METER)) + addRadioModuleTool(index++, STR_POWER_METER_INT, menuRadioPowerMeter, INTERNAL_MODULE); + + if (isPXX2ModuleOptionAvailable(reusableBuffer.hardwareAndSettings.modules[EXTERNAL_MODULE].information.modelID, MODULE_OPTION_SPECTRUM_ANALYSER)) + addRadioModuleTool(index++, STR_SPECTRUM_ANALYSER_EXT, menuRadioSpectrumAnalyser, EXTERNAL_MODULE); + + if (isPXX2ModuleOptionAvailable(reusableBuffer.hardwareAndSettings.modules[EXTERNAL_MODULE].information.modelID, MODULE_OPTION_POWER_METER)) + addRadioModuleTool(index++, STR_POWER_METER_EXT, menuRadioPowerMeter, EXTERNAL_MODULE); +#endif + +#if defined(LUA) + FILINFO fno; + DIR dir; + +#if defined(CROSSFIRE) + if(isFileAvailable(SCRIPTS_TOOLS_PATH "/CROSSFIRE/crossfire.lua")) + addRadioScriptTool(index++, SCRIPTS_TOOLS_PATH "/CROSSFIRE/crossfire.lua"); +#endif + + FRESULT res = f_opendir(&dir, SCRIPTS_TOOLS_PATH); + if (res == FR_OK) { + for (;;) { + TCHAR path[_MAX_LFN+1] = SCRIPTS_TOOLS_PATH "/"; + res = f_readdir(&dir, &fno); /* Read a directory item */ + if (res != FR_OK || fno.fname[0] == 0) break; /* Break on error or end of dir */ + if (fno.fattrib & AM_DIR) continue; /* Skip subfolders */ + if (fno.fattrib & AM_HID) continue; /* Skip hidden files */ + if (fno.fattrib & AM_SYS) continue; /* Skip system files */ + + strcat(path, fno.fname); + if (isRadioScriptTool(fno.fname)) + addRadioScriptTool(index++, path); + } + } +#endif + + if (index == 0) { + lcdDrawCenteredText(LCD_H/2, STR_NO_TOOLS); + } + + reusableBuffer.radioTools.linesCount = index; + + return true; +} \ No newline at end of file diff --git a/radio/src/gui/480x272/radio_trainer.cpp b/radio/src/gui/480x272/radio_trainer.cpp index 1900d84b4..48c6305ef 100644 --- a/radio/src/gui/480x272/radio_trainer.cpp +++ b/radio/src/gui/480x272/radio_trainer.cpp @@ -45,10 +45,10 @@ bool menuRadioTrainer(event_t event) lcdDrawText(TRAINER_COLUMN_3, MENU_HEADER_HEIGHT+1, "Source", HEADER_COLOR); */ - y = MENU_CONTENT_TOP + FH; + y = MENU_CONTENT_TOP; for (uint8_t i=0; i LCD_W) { + lcdDrawText(lcdNextPos, y, ","); + lcdNextPos = MENUS_MARGIN_LEFT; + y += FH; + } + if (i > 0 && lcdNextPos !=MENUS_MARGIN_LEFT) + lcdDrawText(lcdNextPos, y, ", "); + lcdDrawText(lcdNextPos, y, option); + } + return true; } diff --git a/radio/src/gui/480x272/themes/darkblue.cpp b/radio/src/gui/480x272/themes/darkblue.cpp index 9d2e1cbdb..b79d9c0b4 100644 --- a/radio/src/gui/480x272/themes/darkblue.cpp +++ b/radio/src/gui/480x272/themes/darkblue.cpp @@ -83,7 +83,8 @@ class DarkblueTheme: public Theme loadMenuIcon(ICON_OPENTX, "mask_opentx.png"); loadMenuIcon(ICON_RADIO, "mask_menu_radio.png"); loadMenuIcon(ICON_RADIO_SETUP, "mask_radio_setup.png"); - loadMenuIcon(ICON_RADIO_SD_BROWSER, "mask_radio_sd_browser.png"); + loadMenuIcon(ICON_RADIO_SD_MANAGER, "mask_radio_sd_browser.png"); + loadMenuIcon(ICON_RADIO_TOOLS, "mask_radio_tools.png"); loadMenuIcon(ICON_RADIO_GLOBAL_FUNCTIONS, "mask_radio_global_functions.png"); loadMenuIcon(ICON_RADIO_TRAINER, "mask_radio_trainer.png"); loadMenuIcon(ICON_RADIO_HARDWARE, "mask_radio_hardware.png"); diff --git a/radio/src/gui/480x272/themes/default.cpp b/radio/src/gui/480x272/themes/default.cpp index 560b6728c..5172581d8 100644 --- a/radio/src/gui/480x272/themes/default.cpp +++ b/radio/src/gui/480x272/themes/default.cpp @@ -98,7 +98,8 @@ class DefaultTheme: public Theme #endif loadMenuIcon(ICON_RADIO, "mask_menu_radio.png"); loadMenuIcon(ICON_RADIO_SETUP, "mask_radio_setup.png"); - loadMenuIcon(ICON_RADIO_SD_BROWSER, "mask_radio_sd_browser.png"); + loadMenuIcon(ICON_RADIO_SD_MANAGER, "mask_radio_sd_browser.png"); + loadMenuIcon(ICON_RADIO_TOOLS, "mask_radio_tools.png"); loadMenuIcon(ICON_RADIO_GLOBAL_FUNCTIONS, "mask_radio_global_functions.png"); loadMenuIcon(ICON_RADIO_TRAINER, "mask_radio_trainer.png"); loadMenuIcon(ICON_RADIO_HARDWARE, "mask_radio_hardware.png"); diff --git a/radio/src/gui/480x272/topbar.cpp b/radio/src/gui/480x272/topbar.cpp index 8cf6cf9f0..3e54cab33 100644 --- a/radio/src/gui/480x272/topbar.cpp +++ b/radio/src/gui/480x272/topbar.cpp @@ -82,7 +82,7 @@ void drawTopBar() lcdDrawBitmapPattern(LCD_W-130, 4, LBM_TOPMENU_VOLUME_4, MENU_TITLE_COLOR); /* Tx battery */ - uint8_t bars = limit(0, 6 * (g_vbat100mV - g_eeGeneral.vBatMin - 90) / (30 + g_eeGeneral.vBatMax - g_eeGeneral.vBatMin), 5); + uint8_t bars = GET_TXBATT_BARS(5); lcdDrawBitmapPattern(LCD_W-130, 24, LBM_TOPMENU_TXBATT, MENU_TITLE_COLOR); for (unsigned int i = 0; i < 5; i++) { lcdDrawSolidFilledRect(LCD_W-122+4*i, 30, 2, 8, i >= bars ? MENU_TITLE_DISABLE_COLOR : MENU_TITLE_COLOR); diff --git a/radio/src/gui/480x272/view_channels.cpp b/radio/src/gui/480x272/view_channels.cpp index 8e164b254..ab99d3efc 100644 --- a/radio/src/gui/480x272/view_channels.cpp +++ b/radio/src/gui/480x272/view_channels.cpp @@ -20,7 +20,6 @@ #include "opentx.h" -#define RECT_OFFSET 80 #define ROW_HEIGHT 42 #define BAR_HEIGHT 13 #define COLUMN_SIZE 200 diff --git a/radio/src/gui/480x272/view_statistics.cpp b/radio/src/gui/480x272/view_statistics.cpp index 583c609fe..5d4f4a5b0 100644 --- a/radio/src/gui/480x272/view_statistics.cpp +++ b/radio/src/gui/480x272/view_statistics.cpp @@ -95,8 +95,12 @@ bool menuStatsGraph(event_t event) bool menuStatsDebug(event_t event) { - switch(event) - { + switch(event) { + case EVT_ENTRY: + case EVT_ENTRY_UP: + enableVBatBridge(); + break; + case EVT_KEY_FIRST(KEY_ENTER): maxMixerDuration = 0; #if defined(LUA) @@ -106,51 +110,86 @@ bool menuStatsDebug(event_t event) break; } - SIMPLE_MENU("Debug", STATS_ICONS, menuTabStats, e_StatsDebug, 1); + if (!check_simple(event, e_StatsDebug, menuTabStats, DIM(menuTabStats), 1)) { + disableVBatBridge(); + return false; + } - lcdDrawText(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP, "Free Mem"); - lcdDrawNumber(MENU_STATS_COLUMN1, MENU_CONTENT_TOP, availableMemory(), LEFT, 0, NULL, "b"); + drawMenuTemplate("Debug", 0, STATS_ICONS, OPTION_MENU_TITLE_BAR); - lcdDrawText(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP+FH, STR_TMIXMAXMS); - lcdDrawNumber(MENU_STATS_COLUMN1, MENU_CONTENT_TOP+FH, DURATION_MS_PREC2(maxMixerDuration), PREC2|LEFT, 0, NULL, "ms"); + coord_t y = MENU_CONTENT_TOP; - lcdDrawText(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP+2*FH, STR_FREE_STACK); - lcdDrawText(MENU_STATS_COLUMN1, MENU_CONTENT_TOP+2*FH+1, "[Menus]", HEADER_COLOR|SMLSIZE); - lcdDrawNumber(lcdNextPos+5, MENU_CONTENT_TOP+2*FH, menusStack.available(), LEFT); - lcdDrawText(lcdNextPos+20, MENU_CONTENT_TOP+2*FH+1, "[Mix]", HEADER_COLOR|SMLSIZE); - lcdDrawNumber(lcdNextPos+5, MENU_CONTENT_TOP+2*FH, mixerStack.available(), LEFT); - lcdDrawText(lcdNextPos+20, MENU_CONTENT_TOP+2*FH+1, "[Audio]", HEADER_COLOR|SMLSIZE); - lcdDrawNumber(lcdNextPos+5, MENU_CONTENT_TOP+2*FH, audioStack.available(), LEFT); - - int line = 3; - -#if defined(DISK_CACHE) - lcdDrawText(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP+line*FH, "SD cache hits"); - lcdDrawNumber(MENU_STATS_COLUMN1, MENU_CONTENT_TOP+line*FH, diskCache.getHitRate(), PREC1|LEFT, 0, NULL, "%"); - ++line; -#endif + lcdDrawText(MENUS_MARGIN_LEFT, y, "Free Mem"); + lcdDrawNumber(MENU_STATS_COLUMN1, y, availableMemory(), LEFT, 0, NULL, "b"); + y += FH; #if defined(LUA) - lcdDrawText(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP+line*FH, "Lua duration"); - lcdDrawNumber(MENU_STATS_COLUMN1, MENU_CONTENT_TOP+line*FH, 10*maxLuaDuration, LEFT, 0, NULL, "ms"); - ++line; + lcdDrawText(MENUS_MARGIN_LEFT, y, "Lua scripts"); + lcdDrawText(MENU_STATS_COLUMN1, y+1, "[Duration]", HEADER_COLOR|SMLSIZE); + lcdDrawNumber(lcdNextPos+5, y, 10*maxLuaDuration, LEFT, 0, NULL, "ms"); + lcdDrawText(lcdNextPos+20, y+1, "[Interval]", HEADER_COLOR|SMLSIZE); + lcdDrawNumber(lcdNextPos+5, y, 10*maxLuaDuration, LEFT, 0, NULL, "ms"); + y += FH; - lcdDrawText(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP+line*FH, "Lua interval"); - lcdDrawNumber(MENU_STATS_COLUMN1, MENU_CONTENT_TOP+line*FH, 10*maxLuaInterval, LEFT, 0, NULL, "ms"); - ++line; - - lcdDrawText(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP+line*FH, "Lua memory"); - lcdDrawText(MENU_STATS_COLUMN1, MENU_CONTENT_TOP+line*FH+1, "[S]", HEADER_COLOR|SMLSIZE); - lcdDrawNumber(lcdNextPos+5, MENU_CONTENT_TOP+line*FH, luaGetMemUsed(lsScripts), LEFT); - lcdDrawText(lcdNextPos+20, MENU_CONTENT_TOP+line*FH+1, "[W]", HEADER_COLOR|SMLSIZE); - lcdDrawNumber(lcdNextPos+5, MENU_CONTENT_TOP+line*FH, luaGetMemUsed(lsWidgets), LEFT); - lcdDrawText(lcdNextPos+20, MENU_CONTENT_TOP+line*FH+1, "[B]", HEADER_COLOR|SMLSIZE); - lcdDrawNumber(lcdNextPos+5, MENU_CONTENT_TOP+line*FH, luaExtraMemoryUsage, LEFT); - ++line; + // lcdDrawText(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP+line*FH, "Lua memory"); + lcdDrawText(MENU_STATS_COLUMN1, y+1, "[S]", HEADER_COLOR|SMLSIZE); + lcdDrawNumber(lcdNextPos+5, y, luaGetMemUsed(lsScripts), LEFT); + lcdDrawText(lcdNextPos+20, y+1, "[W]", HEADER_COLOR|SMLSIZE); + lcdDrawNumber(lcdNextPos+5, y, luaGetMemUsed(lsWidgets), LEFT); + lcdDrawText(lcdNextPos+20, y+1, "[B]", HEADER_COLOR|SMLSIZE); + lcdDrawNumber(lcdNextPos+5, y, luaExtraMemoryUsage, LEFT); + y += FH; #endif - lcdDrawText(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP+line*FH, "Tlm RX Errs"); - lcdDrawNumber(MENU_STATS_COLUMN1, MENU_CONTENT_TOP+line*FH, telemetryErrors, LEFT); + lcdDrawText(MENUS_MARGIN_LEFT, y, STR_TMIXMAXMS); + lcdDrawNumber(MENU_STATS_COLUMN1, y, DURATION_MS_PREC2(maxMixerDuration), PREC2|LEFT, 0, NULL, "ms"); + y += FH; + + lcdDrawText(MENUS_MARGIN_LEFT, y, STR_FREE_STACK); + lcdDrawText(MENU_STATS_COLUMN1, y+1, "[Menus]", HEADER_COLOR|SMLSIZE); + lcdDrawNumber(lcdNextPos+5, y, menusStack.available(), LEFT); + lcdDrawText(lcdNextPos+20, y+1, "[Mix]", HEADER_COLOR|SMLSIZE); + lcdDrawNumber(lcdNextPos+5, y, mixerStack.available(), LEFT); + lcdDrawText(lcdNextPos+20, y+1, "[Audio]", HEADER_COLOR|SMLSIZE); + lcdDrawNumber(lcdNextPos+5, y, audioStack.available(), LEFT); + y += FH; + +#if defined(STM32) + lcdDrawText(MENUS_MARGIN_LEFT, y, STR_RTC_BATT); + drawValueWithUnit(MENU_STATS_COLUMN1, y, getRTCBatteryVoltage(), UNIT_VOLTS, PREC2|LEFT); + y += FH; +#endif + +#if defined(DISK_CACHE) && defined(DEBUG) + lcdDrawText(MENUS_MARGIN_LEFT, y, "SD cache hits"); + lcdDrawNumber(MENU_STATS_COLUMN1, y, diskCache.getHitRate(), PREC1|LEFT, 0, NULL, "%"); + y += FH; +#endif + +#if defined(DEBUG_LATENCY) + lcdDrawText(MENUS_MARGIN_LEFT, y, "Heartbeat"); + if (heartbeatCapture.valid) + lcdDrawNumber(MENU_STATS_COLUMN1, y, heartbeatCapture.count, LEFT); + else + lcdDrawText(MENU_STATS_COLUMN1, y, "---"); + y += FH; +#endif + +#if defined(DEBUG) + lcdDrawText(MENUS_MARGIN_LEFT, y, "Telem RX Errs"); + lcdDrawNumber(MENU_STATS_COLUMN1, y, telemetryErrors, LEFT); + y += FH; +#endif + +#if defined(INTERNAL_GPS) + lcdDrawText(MENUS_MARGIN_LEFT, y, "Internal GPS"); + lcdDrawText(MENU_STATS_COLUMN1, y+1, "[Fix]", HEADER_COLOR|SMLSIZE); + lcdDrawText(lcdNextPos+2, y, (gpsData.fix ? "Yes" : "No"), LEFT); + lcdDrawText(lcdNextPos+20, y+1, "[Sats]", HEADER_COLOR|SMLSIZE); + lcdDrawNumber(lcdNextPos+5, y, gpsData.numSat, LEFT); + lcdDrawText(lcdNextPos+20, y+1, "[Hdop]", HEADER_COLOR|SMLSIZE); + lcdDrawNumber(lcdNextPos+5, y, gpsData.hdop, PREC2|LEFT); +#endif lcdDrawText(LCD_W/2, MENU_FOOTER_TOP, STR_MENUTORESET, MENU_TITLE_COLOR | CENTERED); return true; @@ -180,9 +219,9 @@ bool menuStatsAnalogs(event_t event) } // RAS - if ((isModuleXJT(INTERNAL_MODULE) && IS_INTERNAL_MODULE_ON()) || (isModulePXX(EXTERNAL_MODULE) && !IS_INTERNAL_MODULE_ON())) { + if ((isModuleXJT(INTERNAL_MODULE) && IS_INTERNAL_MODULE_ON()) || (isModulePXX1(EXTERNAL_MODULE) && !IS_INTERNAL_MODULE_ON())) { lcdDrawText(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP+7*FH, "RAS"); - lcdDrawNumber(MENUS_MARGIN_LEFT+100, MENU_CONTENT_TOP+7*FH, telemetryData.swrInternal.value); + lcdDrawNumber(MENUS_MARGIN_LEFT+100, MENU_CONTENT_TOP+7*FH, telemetryData.swrInternal.value()); lcdDrawText(MENUS_MARGIN_LEFT + LCD_W/2, MENU_CONTENT_TOP+7*FH, "XJTVER"); lcdDrawNumber(LCD_W/2 + MENUS_MARGIN_LEFT+100, MENU_CONTENT_TOP+7*FH, telemetryData.xjtVersion); } @@ -231,7 +270,7 @@ bool menuStatsTraces(event_t event) const struct TraceElement * te = getTraceElement(k); if (te) { // time - putstime_t tme = te->time % SECS_PER_DAY; + int32_t tme = te->time % SECS_PER_DAY; drawTimer(STATS_TRACES_TIME_POS, y, tme, TIMEHOUR|LEFT); // event lcdDrawNumber(STATS_TRACES_EVENT_POS, y, te->event, LEADING0|LEFT, 3); diff --git a/radio/src/gui/480x272/widgets.cpp b/radio/src/gui/480x272/widgets.cpp index f726b193b..301fe575b 100644 --- a/radio/src/gui/480x272/widgets.cpp +++ b/radio/src/gui/480x272/widgets.cpp @@ -391,20 +391,23 @@ void drawSleepBitmap() } #define SHUTDOWN_CIRCLE_DIAMETER 150 -void drawShutdownAnimation(uint32_t index, const char * message) +void drawShutdownAnimation(uint32_t duration, uint32_t totalDuration, const char * message) { - static uint32_t last_index = 0xffffffff; + if (totalDuration == 0) + return; + + static uint32_t lastDuration = 0xffffffff; static const BitmapBuffer * shutdown = BitmapBuffer::load(getThemePath("shutdown.bmp")); if (shutdown) { - if (index < last_index) { + if (duration < lastDuration) { theme->drawBackground(); lcd->drawBitmap((LCD_W-shutdown->getWidth())/2, (LCD_H-shutdown->getHeight())/2, shutdown); lcdStoreBackupBuffer(); } else { lcdRestoreBackupBuffer(); - int quarter = index / (PWR_PRESS_SHUTDOWN_DELAY / 5); + int quarter = duration / (totalDuration / 5); if (quarter >= 1) lcdDrawBitmapPattern(LCD_W/2, (LCD_H-SHUTDOWN_CIRCLE_DIAMETER)/2, LBM_SHUTDOWN_CIRCLE, TEXT_COLOR, 0, SHUTDOWN_CIRCLE_DIAMETER/2); if (quarter >= 2) lcdDrawBitmapPattern(LCD_W/2, LCD_H/2, LBM_SHUTDOWN_CIRCLE, TEXT_COLOR, SHUTDOWN_CIRCLE_DIAMETER/2, SHUTDOWN_CIRCLE_DIAMETER/2); if (quarter >= 3) lcdDrawBitmapPattern((LCD_W-SHUTDOWN_CIRCLE_DIAMETER)/2, LCD_H/2, LBM_SHUTDOWN_CIRCLE, TEXT_COLOR, SHUTDOWN_CIRCLE_DIAMETER, SHUTDOWN_CIRCLE_DIAMETER/2); @@ -413,7 +416,7 @@ void drawShutdownAnimation(uint32_t index, const char * message) } else { lcd->clear(); - int quarter = index / (PWR_PRESS_SHUTDOWN_DELAY / 5); + int quarter = duration / (totalDuration / 5); for (int i=1; i<=4; i++) { if (quarter >= i) { lcd->drawSolidFilledRect(LCD_W / 2 - 70 + 24 * i, LCD_H / 2 - 10, 20, 20, TEXT_BGCOLOR); @@ -422,5 +425,5 @@ void drawShutdownAnimation(uint32_t index, const char * message) } lcdRefresh(); - last_index = index; + lastDuration = duration; } diff --git a/radio/src/gui/480x272/widgets.h b/radio/src/gui/480x272/widgets.h index e8be64672..ebd7363b3 100644 --- a/radio/src/gui/480x272/widgets.h +++ b/radio/src/gui/480x272/widgets.h @@ -28,8 +28,6 @@ #define OPTION_MENU_TITLE_BAR 0x02 #define OPTION_MENU_NO_SCROLLBAR 0x04 -#define OPTION_SLIDER_INVERS INVERS -#define OPTION_SLIDER_BLINK BLINK #define OPTION_SLIDER_VERTICAL 0x04 #define OPTION_SLIDER_EMPTY_BAR 0x08 #define OPTION_SLIDER_DBL_COLOR 0x10 @@ -68,10 +66,10 @@ int16_t editGVarFieldValue(coord_t x, coord_t y, int16_t value, int16_t min, int #endif // Screen templates -void drawMenuTemplate(const char * title, uint8_t icon, const uint8_t * icons=NULL, uint32_t options=0); +void drawMenuTemplate(const char * title, uint8_t icon, const uint8_t * icons=nullptr, uint32_t options=0); void drawSplash(); void drawSleepBitmap(); -void drawShutdownAnimation(uint32_t index, const char * message); +void drawShutdownAnimation(uint32_t duration, uint32_t totalDuration, const char * message); // Main view standard widgets void drawTopBar(); diff --git a/radio/src/gui/CMakeLists.txt b/radio/src/gui/CMakeLists.txt index 5c13c957c..0e42d74ec 100644 --- a/radio/src/gui/CMakeLists.txt +++ b/radio/src/gui/CMakeLists.txt @@ -1,60 +1,11 @@ -set(GUI_SRC - ${GUI_SRC} - lcd.cpp - splash.cpp - fonts.cpp - popups.cpp - widgets.cpp - menu_model.cpp - model_select.cpp - model_setup.cpp - model_outputs.cpp - model_failsafe.cpp - model_logical_switches.cpp - model_special_functions.cpp - model_telemetry.cpp - model_telemetry_sensor.cpp - menu_radio.cpp - radio_setup.cpp - radio_trainer.cpp - radio_version.cpp - radio_calibration.cpp - view_main.cpp - view_statistics.cpp - ) +include(gui/${GUI_DIR}/CMakeLists.txt) +include_directories(gui gui/${GUI_DIR}) set(SRC ${SRC} - gui/common/widgets.cpp - gui/navigation/navigation_${NAVIGATION_TYPE}.cpp gui/navigation/common.cpp + gui/navigation/navigation_${NAVIGATION_TYPE}.cpp ) - string(TOUPPER ${NAVIGATION_TYPE} NAVIGATION_TYPE) add_definitions(-DNAVIGATION_${NAVIGATION_TYPE}) - -include_directories(gui gui/${GUI_DIR}) - -if(GUI_DIR STREQUAL 128x64 OR GUI_DIR STREQUAL 212x64) - include(gui/common/stdlcd/CMakeLists.txt) -endif() - -if(ARCH STREQUAL ARM) - set(SRC - ${SRC} - gui/common/arm/widgets.cpp - ) -endif() - -if(PCB STREQUAL X12S OR PCB STREQUAL X10) - if(HELI) - set(HELI_SRC gui/common/colorlcd/model_heli.cpp) - endif() - - set(SRC - ${SRC} - gui/common/colorlcd/widgets.cpp - ${HELI_SRC} - ) -endif() diff --git a/radio/src/gui/common/colorlcd/CMakeLists.txt b/radio/src/gui/common/colorlcd/CMakeLists.txt new file mode 100644 index 000000000..81271fe23 --- /dev/null +++ b/radio/src/gui/common/colorlcd/CMakeLists.txt @@ -0,0 +1,9 @@ +set(GUI_SRC + ${GUI_SRC} + ../common/colorlcd/widgets.cpp + ) + +if(HELI) + set(GUI_SRC ${GUI_SRC} ../common/colorlcd/model_heli.cpp) +endif() + diff --git a/radio/src/gui/common/colorlcd/widgets.cpp b/radio/src/gui/common/colorlcd/widgets.cpp index 1c0f801cb..373f0dafb 100644 --- a/radio/src/gui/common/colorlcd/widgets.cpp +++ b/radio/src/gui/common/colorlcd/widgets.cpp @@ -31,7 +31,7 @@ void drawStringWithIndex(coord_t x, coord_t y, const char * str, int idx, LcdFla lcdDrawText(x, y, s, flags); } -void drawValueWithUnit(coord_t x, coord_t y, int32_t val, uint8_t unit, LcdFlags att) +void drawValueWithUnit(coord_t x, coord_t y, int val, uint8_t unit, LcdFlags att) { // convertUnit(val, unit); if (!(att & NO_UNIT) && unit != UNIT_RAW) { diff --git a/radio/src/gui/common/stdlcd/CMakeLists.txt b/radio/src/gui/common/stdlcd/CMakeLists.txt index 8ae7e5d56..57aad2a20 100644 --- a/radio/src/gui/common/stdlcd/CMakeLists.txt +++ b/radio/src/gui/common/stdlcd/CMakeLists.txt @@ -12,9 +12,16 @@ set(GUI_SRC ../common/stdlcd/model_receiver_options.cpp ../common/stdlcd/model_notes.cpp ../common/stdlcd/model_curves.cpp + ../common/stdlcd/radio_hardware.cpp + ../common/stdlcd/radio_version.cpp + ../common/stdlcd/radio_trainer.cpp model_curve_edit.cpp ) +if(PXX2 OR LUA) + set(GUI_SRC ${GUI_SRC} ../common/stdlcd/radio_tools.cpp) +endif() + if(HELI) set(GUI_SRC ${GUI_SRC} ../common/stdlcd/model_heli.cpp) endif() @@ -29,7 +36,6 @@ endif() if(PXX2) set(GUI_SRC ${GUI_SRC} - ../common/stdlcd/radio_tools.cpp ../common/stdlcd/radio_spectrum_analyser.cpp ../common/stdlcd/radio_power_meter.cpp ) diff --git a/radio/src/gui/common/stdlcd/draw_functions.h b/radio/src/gui/common/stdlcd/draw_functions.h new file mode 100644 index 000000000..03ad2aaae --- /dev/null +++ b/radio/src/gui/common/stdlcd/draw_functions.h @@ -0,0 +1,43 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#ifndef _COMMON_DRAW_FUNCTIONS_H_ +#define _COMMON_DRAW_FUNCTIONS_H_ + +#include "lcd.h" + +void drawStringWithIndex(coord_t x, coord_t y, const char * str, uint8_t idx, LcdFlags att=0); + +void drawPower(coord_t x, coord_t y, int8_t dBm, LcdFlags att = 0); +void drawGVarName(coord_t x, coord_t y, int8_t index, LcdFlags flags=0); +void drawReceiverName(coord_t x, coord_t y, uint8_t moduleIdx, uint8_t receiverIdx, LcdFlags flags=0); + +void drawRtcTime(coord_t x, coord_t y, LcdFlags att); +void drawTimer(coord_t x, coord_t y, int32_t tme, LcdFlags att, LcdFlags att2); +inline void drawTimer(coord_t x, coord_t y, int32_t tme, LcdFlags att = 0) +{ + drawTimer(x, y, tme, att, att); +} + +void drawStartupAnimation(uint32_t duration, uint32_t totalDuration); +void drawShutdownAnimation(uint32_t duration, uint32_t totalDuration, const char * message); +void drawSleepBitmap(); + +#endif // _COMMON_DRAW_FUNCTIONS_H_ diff --git a/radio/src/gui/common/stdlcd/model_inputs.cpp b/radio/src/gui/common/stdlcd/model_inputs.cpp index 2e11b17d6..edf245654 100644 --- a/radio/src/gui/common/stdlcd/model_inputs.cpp +++ b/radio/src/gui/common/stdlcd/model_inputs.cpp @@ -54,7 +54,7 @@ void insertExpo(uint8_t idx) ExpoData * expo = expoAddress(idx); memmove(expo+1, expo, (MAX_EXPOS-(idx+1))*sizeof(ExpoData)); memclear(expo, sizeof(ExpoData)); - expo->srcRaw = (s_currCh > 4 ? MIXSRC_Rud - 1 + s_currCh : MIXSRC_Rud - 1 + channel_order(s_currCh)); + expo->srcRaw = (s_currCh > 4 ? MIXSRC_Rud - 1 + s_currCh : MIXSRC_Rud - 1 + channelOrder(s_currCh)); expo->curve.type = CURVE_REF_EXPO; expo->mode = 3; // pos+neg expo->chn = s_currCh - 1; diff --git a/radio/src/gui/common/stdlcd/model_mixes.cpp b/radio/src/gui/common/stdlcd/model_mixes.cpp index ec70e8f33..2a4849d6f 100644 --- a/radio/src/gui/common/stdlcd/model_mixes.cpp +++ b/radio/src/gui/common/stdlcd/model_mixes.cpp @@ -65,7 +65,7 @@ void insertMix(uint8_t idx) mix->destCh = s_currCh-1; mix->srcRaw = s_currCh; if (!isSourceAvailable(mix->srcRaw)) { - mix->srcRaw = (s_currCh > 4 ? MIXSRC_Rud - 1 + s_currCh : MIXSRC_Rud - 1 + channel_order(s_currCh)); + mix->srcRaw = (s_currCh > 4 ? MIXSRC_Rud - 1 + s_currCh : MIXSRC_Rud - 1 + channelOrder(s_currCh)); while (!isSourceAvailable(mix->srcRaw)) { mix->srcRaw += 1; } @@ -385,8 +385,8 @@ void menuModelMixAll(event_t event) break; } - lcdDrawNumber(FW*sizeof(TR_MIXER)+FW+FW/2, 0, getMixesCount(), RIGHT); - lcdDrawText(FW*sizeof(TR_MIXER)+FW+FW/2, 0, STR_MAX(MAX_MIXERS)); + lcdDrawNumber(FW*sizeof(TR_MIXER)+FW/2, 0, getMixesCount(), 0); + lcdDrawText(lcdNextPos, 0, STR_MAX(MAX_MIXERS)); // Value uint8_t index = mixAddress(s_currIdx)->destCh; diff --git a/radio/src/gui/common/stdlcd/model_module_options.cpp b/radio/src/gui/common/stdlcd/model_module_options.cpp index a33a29b98..a4181ac15 100644 --- a/radio/src/gui/common/stdlcd/model_module_options.cpp +++ b/radio/src/gui/common/stdlcd/model_module_options.cpp @@ -25,10 +25,17 @@ extern uint8_t g_moduleIdx; +enum { + MODULE_SETTINGS_OK = 0, + MODULE_SETTINGS_DIRTY = 1, + MODULE_SETTINGS_REBIND = 2, + MODULE_SETTINGS_WRITING = 4, +}; + void onTxOptionsUpdateConfirm(const char * result) { if (result == STR_OK) { - reusableBuffer.hardwareAndSettings.moduleSettingsDirty = 2; + reusableBuffer.hardwareAndSettings.moduleSettings.dirty = MODULE_SETTINGS_WRITING; moduleState[g_moduleIdx].writeModuleSettings(&reusableBuffer.hardwareAndSettings.moduleSettings); } else { @@ -36,13 +43,20 @@ void onTxOptionsUpdateConfirm(const char * result) } } +bool isTelemetryAvailable() +{ + return reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].information.variant != PXX2_VARIANT_EU || + reusableBuffer.hardwareAndSettings.moduleSettings.txPower <= 14; +} + enum { ITEM_MODULE_SETTINGS_EXTERNAL_ANTENNA, ITEM_MODULE_SETTINGS_POWER, + ITEM_MODULE_SETTINGS_TELEMETRY, ITEM_MODULE_SETTINGS_COUNT }; -#define IF_MODULE_OPTIONS(option, count) uint8_t(isModuleOptionAvailable(modelId, option) ? count : HIDDEN_ROW) +#define IF_MODULE_OPTIONS(option, count) uint8_t(isPXX2ModuleOptionAvailable(modelId, option) ? count : HIDDEN_ROW) bool isPowerAvailable(int value) { @@ -51,8 +65,8 @@ bool isPowerAvailable(int value) if (modelId == PXX2_MODULE_R9M_LITE) { if (variant == PXX2_VARIANT_EU) - return (value == 14 /* 25 mW */ || - value == 20 /* 100 mW */); + return (value == 14 /* 25 mW with telemetry */ || + value == 20 /* 100 mW without telemetry */); else return value == 20; /* 100 mW */ } @@ -78,33 +92,30 @@ void menuModelModuleOptions(event_t event) memclear(&reusableBuffer.hardwareAndSettings, sizeof(reusableBuffer.hardwareAndSettings)); #if defined(SIMU) reusableBuffer.hardwareAndSettings.moduleSettings.state = PXX2_SETTINGS_OK; -#else - // no need to initialize reusableBuffer.hardwareAndSettings.moduleState.state to PXX2_HARDWARE_INFO - moduleState[g_moduleIdx].readModuleInformation(&reusableBuffer.hardwareAndSettings.modules[g_moduleIdx], PXX2_HW_INFO_TX_ID, PXX2_HW_INFO_TX_ID); #endif } uint8_t modelId = reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].information.modelID; // uint8_t variant = reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].information.variant; - - uint8_t optionsAvailable = moduleOptions[modelId] & ((1 << MODULE_OPTION_EXTERNAL_ANTENNA) | (1 << MODULE_OPTION_POWER)); + uint8_t optionsAvailable = getPXX2ModuleOptions(modelId) & ((1 << MODULE_OPTION_EXTERNAL_ANTENNA) | (1 << MODULE_OPTION_POWER)); SUBMENU_NOTITLE(ITEM_MODULE_SETTINGS_COUNT, { !optionsAvailable ? (uint8_t)0 : IF_MODULE_OPTIONS(MODULE_OPTION_EXTERNAL_ANTENNA, 0), IF_MODULE_OPTIONS(MODULE_OPTION_POWER, 0), + IF_MODULE_OPTIONS(MODULE_OPTION_POWER, isTelemetryAvailable() ? HIDDEN_ROW : READONLY_ROW) }); if (reusableBuffer.hardwareAndSettings.moduleSettings.state == PXX2_HARDWARE_INFO && moduleState[g_moduleIdx].mode == MODULE_MODE_NORMAL) { - if (modelId) - moduleState[g_moduleIdx].readModuleSettings(&reusableBuffer.hardwareAndSettings.moduleSettings); - else + if (!modelId) moduleState[g_moduleIdx].readModuleInformation(&reusableBuffer.hardwareAndSettings.modules[g_moduleIdx], PXX2_HW_INFO_TX_ID, PXX2_HW_INFO_TX_ID); + else + moduleState[g_moduleIdx].readModuleSettings(&reusableBuffer.hardwareAndSettings.moduleSettings); } if (menuEvent) { killEvents(KEY_EXIT); moduleState[g_moduleIdx].mode = MODULE_MODE_NORMAL; - if (reusableBuffer.hardwareAndSettings.moduleSettingsDirty) { + if (reusableBuffer.hardwareAndSettings.moduleSettings.dirty) { abortPopMenu(); POPUP_CONFIRMATION(STR_UPDATE_TX_OPTIONS, onTxOptionsUpdateConfirm); } @@ -113,14 +124,15 @@ void menuModelModuleOptions(event_t event) } } - if (event == EVT_KEY_LONG(KEY_ENTER) && reusableBuffer.hardwareAndSettings.moduleSettingsDirty) { + if (event == EVT_KEY_LONG(KEY_ENTER) && reusableBuffer.hardwareAndSettings.moduleSettings.dirty) { killEvents(event); - reusableBuffer.hardwareAndSettings.moduleSettingsDirty = 0; + reusableBuffer.hardwareAndSettings.moduleSettings.dirty = MODULE_SETTINGS_OK; moduleState[g_moduleIdx].writeModuleSettings(&reusableBuffer.hardwareAndSettings.moduleSettings); } - if (reusableBuffer.hardwareAndSettings.moduleSettingsDirty == 2 && reusableBuffer.hardwareAndSettings.moduleSettings.state == PXX2_SETTINGS_OK) { + if (reusableBuffer.hardwareAndSettings.moduleSettings.dirty == MODULE_SETTINGS_WRITING && reusableBuffer.hardwareAndSettings.moduleSettings.state == PXX2_SETTINGS_OK) { popMenu(); + return; } if (modelId != 0 && mstate_tab[menuVerticalPosition] == HIDDEN_ROW) { @@ -132,7 +144,7 @@ void menuModelModuleOptions(event_t event) int8_t sub = menuVerticalPosition; lcdDrawTextAlignedLeft(0, STR_MODULE_OPTIONS); - lcdDrawText(lcdLastRightPos + 3, 0, PXX2modulesModels[modelId]); + lcdDrawText(lcdLastRightPos + 3, 0, getPXX2ModuleName(modelId)); lcdInvertLine(0); if (reusableBuffer.hardwareAndSettings.moduleSettings.state == PXX2_SETTINGS_OK) { @@ -149,9 +161,9 @@ void menuModelModuleOptions(event_t event) switch (i) { case ITEM_MODULE_SETTINGS_EXTERNAL_ANTENNA: - reusableBuffer.hardwareAndSettings.moduleSettings.externalAntenna = editCheckBox(reusableBuffer.hardwareAndSettings.moduleSettings.externalAntenna, RECEIVER_OPTIONS_2ND_COLUMN, y, "Ext. antenna", attr, event); + reusableBuffer.hardwareAndSettings.moduleSettings.externalAntenna = editCheckBox(reusableBuffer.hardwareAndSettings.moduleSettings.externalAntenna, RECEIVER_OPTIONS_2ND_COLUMN, y, STR_EXT_ANTENNA, attr, event); if (attr && checkIncDec_Ret) { - reusableBuffer.hardwareAndSettings.moduleSettingsDirty = true; + reusableBuffer.hardwareAndSettings.moduleSettings.dirty = MODULE_SETTINGS_DIRTY; } break; @@ -162,12 +174,25 @@ void menuModelModuleOptions(event_t event) drawPower(lcdNextPos, y, reusableBuffer.hardwareAndSettings.moduleSettings.txPower); lcdDrawText(lcdNextPos, y, ")"); if (attr) { + bool previousTelemetry = isTelemetryAvailable(); reusableBuffer.hardwareAndSettings.moduleSettings.txPower = checkIncDec(event, reusableBuffer.hardwareAndSettings.moduleSettings.txPower, 0, 30, 0, &isPowerAvailable); if (checkIncDec_Ret) { - reusableBuffer.hardwareAndSettings.moduleSettingsDirty = true; + reusableBuffer.hardwareAndSettings.moduleSettings.dirty = MODULE_SETTINGS_DIRTY; + if (previousTelemetry != isTelemetryAvailable()) { + reusableBuffer.hardwareAndSettings.moduleSettings.dirty |= MODULE_SETTINGS_REBIND; + } + } + if (s_editMode == 0 && (reusableBuffer.hardwareAndSettings.moduleSettings.dirty & MODULE_SETTINGS_REBIND)) { + reusableBuffer.hardwareAndSettings.moduleSettings.dirty &= ~MODULE_SETTINGS_REBIND; + POPUP_WARNING(STR_REBIND); } } break; + + case ITEM_MODULE_SETTINGS_TELEMETRY: + // only displayed in EU mode when TX power > 25mW + lcdDrawText(RECEIVER_OPTIONS_2ND_COLUMN, y, "Telem OFF", attr | SMLSIZE); + break; } } } diff --git a/radio/src/gui/common/stdlcd/model_receiver_options.cpp b/radio/src/gui/common/stdlcd/model_receiver_options.cpp index f5c799095..ed4dbcd48 100644 --- a/radio/src/gui/common/stdlcd/model_receiver_options.cpp +++ b/radio/src/gui/common/stdlcd/model_receiver_options.cpp @@ -24,11 +24,17 @@ extern uint8_t g_moduleIdx; +enum { + RECEIVER_SETTINGS_OK = 0, + RECEIVER_SETTINGS_DIRTY = 1, + RECEIVER_SETTINGS_WRITING = 2, +}; + void onRxOptionsUpdateConfirm(const char * result) { if (result == STR_OK) { reusableBuffer.hardwareAndSettings.receiverSettings.state = PXX2_SETTINGS_WRITE; - reusableBuffer.hardwareAndSettings.receiverSettings.dirty = 2; + reusableBuffer.hardwareAndSettings.receiverSettings.dirty = RECEIVER_SETTINGS_WRITING; reusableBuffer.hardwareAndSettings.receiverSettings.timeout = 0; moduleState[g_moduleIdx].mode = MODULE_MODE_RECEIVER_SETTINGS; } @@ -38,33 +44,43 @@ void onRxOptionsUpdateConfirm(const char * result) } enum { - ITEM_RECEIVER_TELEMETRY, - ITEM_RECEIVER_PWM_RATE, - ITEM_RECEIVER_PINMAP_FIRST + ITEM_RECEIVER_SETTINGS_PWM_RATE, + ITEM_RECEIVER_SETTINGS_TELEMETRY, + ITEM_RECEIVER_SETTINGS_SPORT_FPORT, + ITEM_RECEIVER_SETTINGS_CAPABILITY_NOT_SUPPORTED1, + ITEM_RECEIVER_SETTINGS_CAPABILITY_NOT_SUPPORTED2, + ITEM_RECEIVER_SETTINGS_PINMAP_FIRST }; + +#define IF_RECEIVER_CAPABILITY(capability, count) uint8_t((reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].receivers[receiverId].information.capabilities & (1 << capability)) ? count : HIDDEN_ROW) + void menuModelReceiverOptions(event_t event) { const int lim = (g_model.extendedLimits ? (512 * LIMIT_EXT_PERCENT / 100) : 512) * 2; uint8_t wbar = LCD_W / 2 - 20; auto outputsCount = min(16, reusableBuffer.hardwareAndSettings.receiverSettings.outputsCount); - SIMPLE_SUBMENU_NOTITLE(ITEM_RECEIVER_PINMAP_FIRST + outputsCount); - if (event == EVT_ENTRY) { + // reusableBuffer.hardwareSettings should have been cleared before calling this menu #if defined(SIMU) reusableBuffer.hardwareAndSettings.receiverSettings.state = PXX2_SETTINGS_OK; reusableBuffer.hardwareAndSettings.receiverSettings.outputsCount = 8; -#else - // no need to initialize reusableBuffer.hardwareAndSettings.receiverSettings.state to PXX2_HARDWARE_INFO - moduleState[g_moduleIdx].readModuleInformation(&reusableBuffer.hardwareAndSettings.modules[g_moduleIdx], reusableBuffer.hardwareAndSettings.receiverSettings.receiverId, reusableBuffer.hardwareAndSettings.receiverSettings.receiverId); #endif } - if (reusableBuffer.hardwareAndSettings.receiverSettings.state == PXX2_HARDWARE_INFO && moduleState[g_moduleIdx].mode == MODULE_MODE_NORMAL) { - reusableBuffer.hardwareAndSettings.receiverSettings.state = PXX2_SETTINGS_READ; - moduleState[g_moduleIdx].mode = MODULE_MODE_RECEIVER_SETTINGS; - } + uint8_t receiverId = reusableBuffer.hardwareAndSettings.receiverSettings.receiverId; + uint8_t receiverModelId = reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].receivers[receiverId].information.modelID; + uint8_t receiverVariant = reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].receivers[receiverId].information.variant; + + SUBMENU_NOTITLE(ITEM_RECEIVER_SETTINGS_PINMAP_FIRST + outputsCount, { + 0, // PWM rate + isModuleR9MAccess(g_moduleIdx) && receiverVariant == PXX2_VARIANT_EU && reusableBuffer.hardwareAndSettings.moduleSettings.txPower > 14 /*25mW*/ ? READONLY_ROW : (uint8_t)0, // Telemetry + IF_RECEIVER_CAPABILITY(RECEIVER_CAPABILITY_FPORT, 0), + uint8_t(reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].receivers[receiverId].information.capabilityNotSupported ? READONLY_ROW : HIDDEN_ROW), + uint8_t(reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].receivers[receiverId].information.capabilityNotSupported ? READONLY_ROW : HIDDEN_ROW), + 0 // channels ... + }); if (menuEvent) { killEvents(KEY_EXIT); @@ -78,49 +94,83 @@ void menuModelReceiverOptions(event_t event) } } - if (event == EVT_KEY_LONG(KEY_ENTER) && reusableBuffer.hardwareAndSettings.receiverSettings.dirty) { - killEvents(event); - reusableBuffer.hardwareAndSettings.receiverSettings.state = PXX2_SETTINGS_WRITE; - reusableBuffer.hardwareAndSettings.receiverSettings.dirty = 0; - reusableBuffer.hardwareAndSettings.receiverSettings.timeout = 0; - moduleState[g_moduleIdx].mode = MODULE_MODE_RECEIVER_SETTINGS; + if (reusableBuffer.hardwareAndSettings.receiverSettings.state == PXX2_HARDWARE_INFO && moduleState[g_moduleIdx].mode == MODULE_MODE_NORMAL) { + if (!receiverModelId) + moduleState[g_moduleIdx].readModuleInformation(&reusableBuffer.hardwareAndSettings.modules[g_moduleIdx], receiverId, receiverId); + else if (isModuleR9MAccess(g_moduleIdx) && receiverVariant == PXX2_VARIANT_EU && !reusableBuffer.hardwareAndSettings.moduleSettings.txPower) + moduleState[g_moduleIdx].readModuleSettings(&reusableBuffer.hardwareAndSettings.moduleSettings); + else + moduleState[g_moduleIdx].readReceiverSettings(&reusableBuffer.hardwareAndSettings.receiverSettings); } - if (reusableBuffer.hardwareAndSettings.receiverSettings.dirty == 2 && reusableBuffer.hardwareAndSettings.receiverSettings.state == PXX2_SETTINGS_OK) { + if (event == EVT_KEY_LONG(KEY_ENTER) && reusableBuffer.hardwareAndSettings.receiverSettings.dirty) { + killEvents(event); + reusableBuffer.hardwareAndSettings.receiverSettings.dirty = RECEIVER_SETTINGS_OK; + moduleState[g_moduleIdx].writeReceiverSettings(&reusableBuffer.hardwareAndSettings.receiverSettings); + } + + if (reusableBuffer.hardwareAndSettings.receiverSettings.dirty == RECEIVER_SETTINGS_WRITING && reusableBuffer.hardwareAndSettings.receiverSettings.state == PXX2_SETTINGS_OK) { popMenu(); return; } + if (receiverModelId && mstate_tab[menuVerticalPosition] == HIDDEN_ROW) { + menuVerticalPosition = 0; + while (menuVerticalPosition < ITEM_RECEIVER_SETTINGS_PINMAP_FIRST && mstate_tab[menuVerticalPosition] == HIDDEN_ROW) { + ++menuVerticalPosition; + } + } + int8_t sub = menuVerticalPosition; lcdDrawTextAlignedLeft(0, STR_RECEIVER_OPTIONS); - drawReceiverName(FW * 13, 0, g_moduleIdx, reusableBuffer.hardwareAndSettings.receiverSettings.receiverId); + drawReceiverName(lcdNextPos + FW, 0, g_moduleIdx, reusableBuffer.hardwareAndSettings.receiverSettings.receiverId); lcdInvertLine(0); if (reusableBuffer.hardwareAndSettings.receiverSettings.state == PXX2_SETTINGS_OK) { for (uint8_t k=0; k0 ? BLINK|INVERS : INVERS) : 0); switch (i) { - case ITEM_RECEIVER_TELEMETRY: - reusableBuffer.hardwareAndSettings.receiverSettings.telemetryDisabled = editCheckBox(reusableBuffer.hardwareAndSettings.receiverSettings.telemetryDisabled, RECEIVER_OPTIONS_2ND_COLUMN, y, "Telem. disabled", attr, event); + case ITEM_RECEIVER_SETTINGS_PWM_RATE: + reusableBuffer.hardwareAndSettings.receiverSettings.pwmRate = editCheckBox(reusableBuffer.hardwareAndSettings.receiverSettings.pwmRate, RECEIVER_OPTIONS_2ND_COLUMN, y, isModuleR9MAccess(g_moduleIdx) ? "6.67ms PWM": "9ms PWM", attr, event); if (attr && checkIncDec_Ret) { - reusableBuffer.hardwareAndSettings.receiverSettings.dirty = true; + reusableBuffer.hardwareAndSettings.receiverSettings.dirty = RECEIVER_SETTINGS_DIRTY; } break; - case ITEM_RECEIVER_PWM_RATE: - reusableBuffer.hardwareAndSettings.receiverSettings.pwmRate = editCheckBox(reusableBuffer.hardwareAndSettings.receiverSettings.pwmRate, RECEIVER_OPTIONS_2ND_COLUMN, y, isModuleR9M2(g_moduleIdx) ? "6.67ms PWM": "9ms PWM", attr, event); + case ITEM_RECEIVER_SETTINGS_TELEMETRY: + reusableBuffer.hardwareAndSettings.receiverSettings.telemetryDisabled = editCheckBox(reusableBuffer.hardwareAndSettings.receiverSettings.telemetryDisabled, RECEIVER_OPTIONS_2ND_COLUMN, y, STR_TELEMETRY_DISABLED, attr, event); if (attr && checkIncDec_Ret) { - reusableBuffer.hardwareAndSettings.receiverSettings.dirty = true; + reusableBuffer.hardwareAndSettings.receiverSettings.dirty = RECEIVER_SETTINGS_DIRTY; } break; + case ITEM_RECEIVER_SETTINGS_SPORT_FPORT: + reusableBuffer.hardwareAndSettings.receiverSettings.fport = editCheckBox(reusableBuffer.hardwareAndSettings.receiverSettings.fport, RECEIVER_OPTIONS_2ND_COLUMN, y, "F.Port", attr, event); + if (attr && checkIncDec_Ret) { + reusableBuffer.hardwareAndSettings.receiverSettings.dirty = RECEIVER_SETTINGS_DIRTY; + } + break; + + case ITEM_RECEIVER_SETTINGS_CAPABILITY_NOT_SUPPORTED1: + lcdDrawText(LCD_W/2, y+1, STR_MORE_OPTIONS_AVAILABLE, SMLSIZE|CENTERED); + break; + + case ITEM_RECEIVER_SETTINGS_CAPABILITY_NOT_SUPPORTED2: + lcdDrawText(LCD_W/2, y+1, STR_OPENTX_UPGRADE_REQUIRED, SMLSIZE|CENTERED); + break; + default: - // Pin + // Pin { - uint8_t pin = i - ITEM_RECEIVER_PINMAP_FIRST; + uint8_t pin = i - ITEM_RECEIVER_SETTINGS_PINMAP_FIRST; if (pin < reusableBuffer.hardwareAndSettings.receiverSettings.outputsCount) { uint8_t & mapping = reusableBuffer.hardwareAndSettings.receiverSettings.outputsMapping[pin]; uint8_t channel = g_model.moduleData[g_moduleIdx].channelsStart + mapping; @@ -133,18 +183,18 @@ void menuModelReceiverOptions(event_t event) if (attr) { mapping = checkIncDec(event, mapping, 0, sentModuleChannels(g_moduleIdx) - 1); if (checkIncDec_Ret) { - reusableBuffer.hardwareAndSettings.receiverSettings.dirty = true; + reusableBuffer.hardwareAndSettings.receiverSettings.dirty = RECEIVER_SETTINGS_DIRTY; } } // Bargraph #if !defined(PCBX7) // X7 LCD doesn't like too many horizontal lines - lcdDrawRect(LCD_W - 3 - wbar, y + 1, wbar + 1, 4); + lcdDrawRect(RECEIVER_OPTIONS_2ND_COLUMN, y + 2, wbar + 1, 4); #endif const uint8_t lenChannel = limit(1, (abs(channelValue) * wbar / 2 + lim / 2) / lim, wbar / 2); - const coord_t xChannel = (channelValue > 0) ? LCD_W - 3 - wbar / 2 : LCD_W - 2 - wbar / 2 - lenChannel; - lcdDrawHorizontalLine(xChannel, y + 2, lenChannel, SOLID, 0); + const coord_t xChannel = (channelValue > 0) ? RECEIVER_OPTIONS_2ND_COLUMN + wbar / 2 : RECEIVER_OPTIONS_2ND_COLUMN + wbar / 2 + 1 - lenChannel; lcdDrawHorizontalLine(xChannel, y + 3, lenChannel, SOLID, 0); + lcdDrawHorizontalLine(xChannel, y + 4, lenChannel, SOLID, 0); } break; } diff --git a/radio/src/gui/common/stdlcd/model_setup_pxx1.cpp b/radio/src/gui/common/stdlcd/model_setup_pxx1.cpp index 79231c5f9..f0e027a98 100644 --- a/radio/src/gui/common/stdlcd/model_setup_pxx1.cpp +++ b/radio/src/gui/common/stdlcd/model_setup_pxx1.cpp @@ -26,10 +26,16 @@ void onBindMenu(const char * result) if (result == STR_BINDING_1_8_TELEM_ON) { g_model.moduleData[moduleIdx].pxx.receiver_telem_off = false; g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = false; + if (isModuleR9MLiteNonPro(moduleIdx) && isModuleR9M_LBT(moduleIdx)) { + g_model.moduleData[moduleIdx].pxx.power = R9M_LITE_LBT_POWER_25_8CH; + } } else if (result == STR_BINDING_1_8_TELEM_OFF) { g_model.moduleData[moduleIdx].pxx.receiver_telem_off = true; g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16 = false; + if (isModuleR9MLiteNonPro(moduleIdx) && isModuleR9M_LBT(moduleIdx)) { + g_model.moduleData[moduleIdx].pxx.power = R9M_LITE_LBT_POWER_100_16CH_NOTELEM; + } } else if (result == STR_BINDING_9_16_TELEM_ON) { g_model.moduleData[moduleIdx].pxx.receiver_telem_off = false; @@ -44,4 +50,32 @@ void onBindMenu(const char * result) } moduleState[moduleIdx].mode = MODULE_MODE_BIND; -} \ No newline at end of file +} + +void startBindMenu(uint8_t moduleIdx) +{ + uint8_t selection = 0; // R9M_LBT should default to 0 as available options are variables + + if (isTelemAllowedOnBind(moduleIdx)) + POPUP_MENU_ADD_ITEM(STR_BINDING_1_8_TELEM_ON); + POPUP_MENU_ADD_ITEM(STR_BINDING_1_8_TELEM_OFF); + + if (isBindCh9To16Allowed(moduleIdx)) { + if (isTelemAllowedOnBind(moduleIdx)) + POPUP_MENU_ADD_ITEM(STR_BINDING_9_16_TELEM_ON); + POPUP_MENU_ADD_ITEM(STR_BINDING_9_16_TELEM_OFF); + } + + if (isBindCh9To16Allowed(moduleIdx) && g_model.moduleData[moduleIdx].pxx.receiver_channel_9_16) { + selection += 1; + if (isTelemAllowedOnBind(moduleIdx)) + selection += 1; + } + + if (isTelemAllowedOnBind(moduleIdx) && g_model.moduleData[moduleIdx].pxx.receiver_telem_off) + selection += 1; + + + POPUP_MENU_SELECT_ITEM(selection); + POPUP_MENU_START(onBindMenu); +} diff --git a/radio/src/gui/common/stdlcd/model_setup_pxx2.cpp b/radio/src/gui/common/stdlcd/model_setup_pxx2.cpp index 36f82ba6a..2c537d242 100644 --- a/radio/src/gui/common/stdlcd/model_setup_pxx2.cpp +++ b/radio/src/gui/common/stdlcd/model_setup_pxx2.cpp @@ -20,6 +20,16 @@ #include "opentx.h" +bool isPXX2ReceiverUsed(uint8_t moduleIdx, uint8_t receiverIdx) +{ + return g_model.moduleData[moduleIdx].pxx2.receivers & (1 << receiverIdx); +} + +void setPXX2ReceiverUsed(uint8_t moduleIdx, uint8_t receiverIdx) +{ + g_model.moduleData[moduleIdx].pxx2.receivers |= (1 << receiverIdx); +} + bool isPXX2ReceiverEmpty(uint8_t moduleIdx, uint8_t receiverIdx) { return is_memclear(g_model.moduleData[moduleIdx].pxx2.receiverName[receiverIdx], PXX2_LEN_RX_NAME); @@ -41,19 +51,16 @@ void removePXX2ReceiverIfEmpty(uint8_t moduleIdx, uint8_t receiverIdx) void onPXX2R9MBindModeMenu(const char * result) { - if (result == STR_8CH_WITH_TELEMETRY) { - reusableBuffer.moduleSetup.bindInformation.lbtMode = 0; - } - else if (result == STR_16CH_WITH_TELEMETRY) { + if (result == STR_16CH_WITH_TELEMETRY) { reusableBuffer.moduleSetup.bindInformation.lbtMode = 1; } else if (result == STR_16CH_WITHOUT_TELEMETRY) { reusableBuffer.moduleSetup.bindInformation.lbtMode = 2; } - else if (result == STR_FLEX_868) { + else if (result == STR_FLEX_915) { reusableBuffer.moduleSetup.bindInformation.flexMode = 0; } - else if (result == STR_FLEX_915) { + else if (result == STR_FLEX_868) { reusableBuffer.moduleSetup.bindInformation.flexMode = 1; } else { @@ -83,14 +90,14 @@ void onPXX2BindMenu(const char * result) if (result != STR_EXIT) { uint8_t moduleIdx = CURRENT_MODULE_EDITED(menuVerticalPosition - HEADER_LINE); reusableBuffer.moduleSetup.bindInformation.selectedReceiverIndex = (result - reusableBuffer.moduleSetup.bindInformation.candidateReceiversNames[0]) / sizeof(reusableBuffer.moduleSetup.bindInformation.candidateReceiversNames[0]); - if (isModuleR9M2(moduleIdx) && reusableBuffer.moduleSetup.pxx2.moduleInformation.information.variant == PXX2_VARIANT_EU) { + if (isModuleR9MAccess(moduleIdx) && reusableBuffer.moduleSetup.pxx2.moduleInformation.information.variant == PXX2_VARIANT_EU) { reusableBuffer.moduleSetup.bindInformation.step = BIND_RX_NAME_SELECTED; - POPUP_MENU_ADD_ITEM(STR_8CH_WITH_TELEMETRY); - POPUP_MENU_ADD_ITEM(STR_16CH_WITH_TELEMETRY); - POPUP_MENU_ADD_ITEM(STR_16CH_WITHOUT_TELEMETRY); - POPUP_MENU_START(onPXX2R9MBindModeMenu); + if (reusableBuffer.moduleSetup.pxx2.moduleSettings.txPower <= 14) + onPXX2R9MBindModeMenu(STR_16CH_WITH_TELEMETRY); + else + onPXX2R9MBindModeMenu(STR_16CH_WITHOUT_TELEMETRY); } - else if (isModuleR9M2(moduleIdx) && reusableBuffer.moduleSetup.pxx2.moduleInformation.information.variant == PXX2_VARIANT_FLEX) { + else if (isModuleR9MAccess(moduleIdx) && reusableBuffer.moduleSetup.pxx2.moduleInformation.information.variant == PXX2_VARIANT_FLEX) { reusableBuffer.moduleSetup.bindInformation.step = BIND_RX_NAME_SELECTED; POPUP_MENU_ADD_ITEM(STR_FLEX_868); POPUP_MENU_ADD_ITEM(STR_FLEX_915); @@ -115,6 +122,7 @@ void onPXX2BindMenu(const char * result) uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(menuVerticalPosition - HEADER_LINE); moduleState[moduleIdx].mode = MODULE_MODE_NORMAL; removePXX2ReceiverIfEmpty(moduleIdx, receiverIdx); + s_editMode = 0; } } @@ -142,7 +150,8 @@ void onPXX2ReceiverMenu(const char * result) else if (result == STR_BIND) { memclear(&reusableBuffer.moduleSetup.bindInformation, sizeof(BindInformation)); reusableBuffer.moduleSetup.bindInformation.rxUid = receiverIdx; - if (isModuleR9M2(moduleIdx)) { + if (isModuleR9MAccess(moduleIdx)) { + reusableBuffer.moduleSetup.bindInformation.step = BIND_MODULE_TX_INFORMATION_REQUEST; #if defined(SIMU) reusableBuffer.moduleSetup.pxx2.moduleInformation.information.modelID = 1; reusableBuffer.moduleSetup.pxx2.moduleInformation.information.variant = 2; @@ -261,3 +270,84 @@ void startRegisterDialog(uint8_t module) killAllEvents(); POPUP_INPUT("", runPopupRegister); } + +void modelSetupModulePxx2ReceiverLine(uint8_t moduleIdx, uint8_t receiverIdx, coord_t y, event_t event, LcdFlags attr) +{ + ModuleInformation & moduleInformation = reusableBuffer.moduleSetup.pxx2.moduleInformation; + + drawStringWithIndex(INDENT_WIDTH, y, STR_RECEIVER, receiverIdx + 1); + + if (!isPXX2ReceiverUsed(moduleIdx, receiverIdx)) { + lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_MODULE_BIND, attr); + if (attr && s_editMode > 0) { + killEvents(event); + setPXX2ReceiverUsed(moduleIdx, receiverIdx); + memclear(g_model.moduleData[moduleIdx].pxx2.receiverName[receiverIdx], PXX2_LEN_RX_NAME); + onPXX2ReceiverMenu(STR_BIND); + } + return; + } + + drawReceiverName(MODEL_SETUP_2ND_COLUMN, y, moduleIdx, receiverIdx, attr); + + if (s_editMode && isModuleR9MAccess(moduleIdx) && moduleState[moduleIdx].mode == MODULE_MODE_NORMAL && reusableBuffer.moduleSetup.bindInformation.step < 0) { + if (reusableBuffer.moduleSetup.bindInformation.step == BIND_MODULE_TX_INFORMATION_REQUEST && moduleInformation.information.modelID) { + // For R9M ACCESS the module information has been requested to know if we are in EU mode. We just receive it here and continue + if (moduleInformation.information.variant == PXX2_VARIANT_EU) { + // In EU mode we will need the power of the module to know if telemetry can be proposed + reusableBuffer.moduleSetup.bindInformation.step = BIND_MODULE_TX_SETTINGS_REQUEST; +#if defined(SIMU) + reusableBuffer.moduleSetup.pxx2.moduleSettings.txPower = 14; +#else + moduleState[moduleIdx].readModuleSettings(&reusableBuffer.moduleSetup.pxx2.moduleSettings); +#endif + } + else { + reusableBuffer.moduleSetup.bindInformation.step = 0; + moduleState[moduleIdx].startBind(&reusableBuffer.moduleSetup.bindInformation); + } + } + else if (reusableBuffer.moduleSetup.bindInformation.step == BIND_MODULE_TX_SETTINGS_REQUEST && reusableBuffer.moduleSetup.pxx2.moduleSettings.txPower > 0) { + // We just receive the module settings (for TX power) + reusableBuffer.moduleSetup.bindInformation.step = 0; + moduleState[moduleIdx].startBind(&reusableBuffer.moduleSetup.bindInformation); + } + } + else if (attr && (moduleState[moduleIdx].mode == MODULE_MODE_NORMAL || s_editMode == 0)) { + if (moduleState[moduleIdx].mode) { + moduleState[moduleIdx].mode = 0; + removePXX2ReceiverIfEmpty(moduleIdx, receiverIdx); + killEvents(event); // we stopped BIND / SHARE, we don't want to re-open the menu + event = 0; + CLEAR_POPUP(); + } + s_editMode = 0; + } + + if (moduleState[moduleIdx].mode == MODULE_MODE_BIND) { + if (reusableBuffer.moduleSetup.bindInformation.step == BIND_INIT) { + if (reusableBuffer.moduleSetup.bindInformation.candidateReceiversCount > 0) { + popupMenuItemsCount = min(reusableBuffer.moduleSetup.bindInformation.candidateReceiversCount, PXX2_MAX_RECEIVERS_PER_MODULE); + for (auto rx = 0; rx < popupMenuItemsCount; rx++) { + popupMenuItems[rx] = reusableBuffer.moduleSetup.bindInformation.candidateReceiversNames[rx]; + } + popupMenuTitle = STR_PXX2_SELECT_RX; + CLEAR_POPUP(); + POPUP_MENU_START(onPXX2BindMenu); + } + else { + POPUP_WAIT(STR_WAITING_FOR_RX); + } + } + } + + if (attr && EVT_KEY_MASK(event) == KEY_ENTER) { + killEvents(event); + POPUP_MENU_ADD_ITEM(STR_BIND); + POPUP_MENU_ADD_ITEM(STR_OPTIONS); + POPUP_MENU_ADD_ITEM(STR_SHARE); + POPUP_MENU_ADD_ITEM(STR_DELETE); + POPUP_MENU_ADD_ITEM(STR_RESET); + POPUP_MENU_START(onPXX2ReceiverMenu); + } +} diff --git a/radio/src/gui/common/stdlcd/popups.h b/radio/src/gui/common/stdlcd/popups.h index 4ba6e8b14..c68d3b2a1 100644 --- a/radio/src/gui/common/stdlcd/popups.h +++ b/radio/src/gui/common/stdlcd/popups.h @@ -75,7 +75,7 @@ enum inline void POPUP_INPUT(const char * s, PopupFunc func) { } inline void SET_WARNING_INFO(const char * info, uint8_t length, uint8_t flags) { } #else - #define DISPLAY_WARNING (*popupFunc) + #define DISPLAY_WARNING(evt) (*popupFunc)(evt) inline void CLEAR_POPUP() { warningText = nullptr; diff --git a/radio/src/gui/128x64/radio_hardware.cpp b/radio/src/gui/common/stdlcd/radio_hardware.cpp similarity index 63% rename from radio/src/gui/128x64/radio_hardware.cpp rename to radio/src/gui/common/stdlcd/radio_hardware.cpp index 61ea3414b..ba91fefce 100644 --- a/radio/src/gui/128x64/radio_hardware.cpp +++ b/radio/src/gui/common/stdlcd/radio_hardware.cpp @@ -22,7 +22,7 @@ #if defined(PCBSKY9X) #define HW_SETTINGS_COLUMN (2+(15*FW)) -enum MenuRadioHardwareItems { +enum { ITEM_RADIO_HARDWARE_OPTREX_DISPLAY, ITEM_RADIO_HARDWARE_STICKS_GAINS_LABELS, ITEM_RADIO_HARDWARE_STICK_LV_GAIN, @@ -88,7 +88,7 @@ void menuRadioHardware(event_t event) #endif // PCBSKY9X #if defined(PCBTARANIS) -enum MenuRadioHardwareItems { +enum { ITEM_RADIO_HARDWARE_LABEL_STICKS, ITEM_RADIO_HARDWARE_STICK1, ITEM_RADIO_HARDWARE_STICK2, @@ -96,37 +96,71 @@ enum MenuRadioHardwareItems { ITEM_RADIO_HARDWARE_STICK4, ITEM_RADIO_HARDWARE_LABEL_POTS, ITEM_RADIO_HARDWARE_POT1, -#if !defined(PCBX9LITE) +#if defined(HARDWARE_POT2) ITEM_RADIO_HARDWARE_POT2, +#endif +#if defined(HARDWARE_POT3) + ITEM_RADIO_HARDWARE_POT3, +#endif +#if defined(HARDWARE_POT4) + ITEM_RADIO_HARDWARE_POT4, +#endif +#if NUM_SLIDERS > 0 + ITEM_RADIO_HARDWARE_SLIDER1, + ITEM_RADIO_HARDWARE_SLIDER2, +#endif +#if NUM_SLIDERS > 2 + ITEM_RADIO_HARDWARE_SLIDER3, + ITEM_RADIO_HARDWARE_SLIDER4, #endif ITEM_RADIO_HARDWARE_LABEL_SWITCHES, ITEM_RADIO_HARDWARE_SA, ITEM_RADIO_HARDWARE_SB, ITEM_RADIO_HARDWARE_SC, ITEM_RADIO_HARDWARE_SD, -#if NUM_SWITCHES >= 5 +#if defined(HARDWARE_SWITCH_E) + ITEM_RADIO_HARDWARE_SE, +#endif +#if defined(HARDWARE_SWITCH_F) ITEM_RADIO_HARDWARE_SF, #endif -#if NUM_SWITCHES >= 6 +#if defined(HARDWARE_SWITCH_G) + ITEM_RADIO_HARDWARE_SG, +#endif +#if defined(HARDWARE_SWITCH_H) ITEM_RADIO_HARDWARE_SH, #endif -#if NUM_SWITCHES >= 8 +#if defined(HARDWARE_SWITCH_I) ITEM_RADIO_HARDWARE_SI, +#endif +#if defined(HARDWARE_SWITCH_J) ITEM_RADIO_HARDWARE_SJ, #endif +#if defined(HARDWARE_SWITCH_K) + ITEM_RADIO_HARDWARE_SK, + ITEM_RADIO_HARDWARE_SL, + ITEM_RADIO_HARDWARE_SM, + ITEM_RADIO_HARDWARE_SN, + ITEM_RADIO_HARDWARE_SO, + ITEM_RADIO_HARDWARE_SP, + ITEM_RADIO_HARDWARE_SQ, + ITEM_RADIO_HARDWARE_SR, +#endif + ITEM_RADIO_HARDWARE_BATTERY_CALIB, + #if defined(STM32) ITEM_RADIO_HARDWARE_RTC_BATTERY, #endif + #if defined(TX_CAPACITY_MEASUREMENT) ITEM_RADIO_HARDWARE_CAPACITY_CALIB, #endif -#if defined(PCBSKY9X) - ITEM_RADIO_HARDWARE_TEMPERATURE_CALIB, -#endif + #if defined(CROSSFIRE) && SPORT_MAX_BAUDRATE < 400000 ITEM_RADIO_HARDWARE_SERIAL_BAUDRATE, #endif + #if defined(BLUETOOTH) ITEM_RADIO_HARDWARE_BLUETOOTH_MODE, ITEM_RADIO_HARDWARE_BLUETOOTH_PAIRING_CODE, @@ -134,40 +168,57 @@ enum MenuRadioHardwareItems { ITEM_RADIO_HARDWARE_BLUETOOTH_DISTANT_ADDR, ITEM_RADIO_HARDWARE_BLUETOOTH_NAME, #endif + +#if defined(AUX_SERIAL) + ITEM_RADIO_HARDWARE_AUX_SERIAL_MODE, +#endif + ITEM_RADIO_HARDWARE_JITTER_FILTER, ITEM_RADIO_HARDWARE_RAS, ITEM_RADIO_HARDWARE_DEBUG, +#if defined(EEPROM_RLC) + ITEM_RADIO_BACKUP_EEPROM, + ITEM_RADIO_FACTORY_RESET, +#endif ITEM_RADIO_HARDWARE_MAX }; -#if defined(PCBX9LITE) -#define POTS_ROWS NAVIGATION_LINE_BY_LINE|1 -#else -#define POTS_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1 +#if (NUM_POTS + NUM_SLIDERS) == 1 + #define POTS_ROWS NAVIGATION_LINE_BY_LINE|1 +#elif (NUM_POTS + NUM_SLIDERS) == 2 + #define POTS_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1 +#elif (NUM_POTS + NUM_SLIDERS) == 3 + #define POTS_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1 +#elif (NUM_POTS + NUM_SLIDERS) == 4 + #define POTS_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1 +#elif (NUM_POTS + NUM_SLIDERS) == 5 + #define POTS_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1 +#elif (NUM_POTS + NUM_SLIDERS) == 8 + #define POTS_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1 #endif -#if NUM_SWITCHES == 8 -#if defined(RADIO_T12) -#define SWITCHES_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|HIDDEN_ROW, NAVIGATION_LINE_BY_LINE|HIDDEN_ROW -#else -#define SWITCHES_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1 -#endif +#if defined(PCBX9E) + #define SWITCHES_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1 +#elif defined(RADIO_T12) + #define SWITCHES_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|HIDDEN_ROW, NAVIGATION_LINE_BY_LINE|HIDDEN_ROW +#elif NUM_SWITCHES == 9 + #define SWITCHES_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1 +#elif NUM_SWITCHES == 8 + #define SWITCHES_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1 #elif NUM_SWITCHES == 6 -#define SWITCHES_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1 + #define SWITCHES_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1 #elif NUM_SWITCHES == 5 -#define SWITCHES_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1 + #define SWITCHES_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1 #elif NUM_SWITCHES == 4 -#define SWITCHES_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1 + #define SWITCHES_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1 #endif -#if defined(PCBX9LITE) +#if !defined(BLUETOOTH) #define BLUETOOTH_ROWS -#elif defined(PCBTARANIS) - #define BLUETOOTH_ROWS uint8_t(IS_BLUETOOTH_CHIP_PRESENT() ? 0 : HIDDEN_ROW), uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_TELEMETRY ? -1 : HIDDEN_ROW), uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_OFF ? HIDDEN_ROW : -1), uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_OFF ? HIDDEN_ROW : -1), uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_OFF ? HIDDEN_ROW : 0), -#elif defined(BLUETOOTH) - #define BLUETOOTH_ROWS 0, uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_OFF ? HIDDEN_ROW : READONLY_ROW), uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_OFF ? HIDDEN_ROW : READONLY_ROW), uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_OFF ? HIDDEN_ROW : 0), +#elif defined(PCBX9E) + #define BLUETOOTH_ROWS 0, uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_OFF ? HIDDEN_ROW : READONLY_ROW), uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_OFF ? HIDDEN_ROW : READONLY_ROW), uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_OFF ? HIDDEN_ROW : 0), uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_OFF ? HIDDEN_ROW : 0), #else - #define BLUETOOTH_ROWS + #define BLUETOOTH_ROWS uint8_t(IS_BLUETOOTH_CHIP_PRESENT() ? 0 : HIDDEN_ROW), uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_TELEMETRY ? -1 : HIDDEN_ROW), uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_OFF ? HIDDEN_ROW : -1), uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_OFF ? HIDDEN_ROW : -1), uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_OFF ? HIDDEN_ROW : 0), #endif #if defined(PCBX9LITE) @@ -176,14 +227,16 @@ enum MenuRadioHardwareItems { #define SWITCH_TYPE_MAX(sw) (sw >= MIXSRC_SE-MIXSRC_FIRST_SWITCH ? SWITCH_2POS : SWITCH_3POS) #elif defined(PCBXLITE) #define SWITCH_TYPE_MAX(sw) (SWITCH_3POS) +#elif defined(PCBX9E) + #define SWITCH_TYPE_MAX(sw) ((MIXSRC_SF - MIXSRC_FIRST_SWITCH == sw || MIXSRC_SH - MIXSRC_FIRST_SWITCH == sw) ? SWITCH_2POS : SWITCH_3POS) #else - #define SWITCH_TYPE_MAX(sw) ((MIXSRC_SF-MIXSRC_FIRST_SWITCH == sw || MIXSRC_SH-MIXSRC_FIRST_SWITCH == sw || MIXSRC_SI-MIXSRC_FIRST_SWITCH == sw || MIXSRC_SJ-MIXSRC_FIRST_SWITCH == sw) ? SWITCH_2POS : SWITCH_3POS) + #define SWITCH_TYPE_MAX(sw) ((MIXSRC_SF - MIXSRC_FIRST_SWITCH == sw || MIXSRC_SH - MIXSRC_FIRST_SWITCH <= sw) ? SWITCH_2POS : SWITCH_3POS) #endif #if defined(STM32) - #define RTC_BATT_ROWS READONLY_ROW, + #define RTC_ROW READONLY_ROW, #else - #define RTC_BATT_ROWS + #define RTC_ROW #endif #if defined(TX_CAPACITY_MEASUREMENT) @@ -192,20 +245,36 @@ enum MenuRadioHardwareItems { #define TX_CAPACITY_MEASUREMENT_ROWS #endif -#if defined(PCBSKY9X) - #define TEMPERATURE_CALIB_ROWS 0, -#else - #define TEMPERATURE_CALIB_ROWS -#endif - #if defined(CROSSFIRE) && SPORT_MAX_BAUDRATE < 400000 #define MAX_BAUD_ROWS 0, #else #define MAX_BAUD_ROWS #endif -#define HW_SETTINGS_COLUMN1 30 -#define HW_SETTINGS_COLUMN2 (30 + 5*FW) +#if defined(AUX_SERIAL) + #define AUX_SERIAL_ROWS 0, +#else + #define AUX_SERIAL_ROWS +#endif + +#if LCD_W >= 212 + #define HW_SETTINGS_COLUMN1 12*FW + #define HW_SETTINGS_COLUMN2 (HW_SETTINGS_COLUMN1 + 6*FW) +#else + #define HW_SETTINGS_COLUMN1 30 + #define HW_SETTINGS_COLUMN2 (HW_SETTINGS_COLUMN1 + 5*FW) +#endif + +#if defined(EEPROM_RLC) +void onFactoryResetConfirm(const char * result) +{ + if (result == STR_OK) { + showMessageBox(STR_STORAGE_FORMAT); + storageEraseAll(false); + NVIC_SystemReset(); + } +} +#endif void menuRadioHardware(event_t event) { @@ -220,30 +289,43 @@ void menuRadioHardware(event_t event) POTS_ROWS, LABEL(Switches), SWITCHES_ROWS, + 0 /* battery calib */, - - RTC_BATT_ROWS - + RTC_ROW TX_CAPACITY_MEASUREMENT_ROWS - TEMPERATURE_CALIB_ROWS - MAX_BAUD_ROWS BLUETOOTH_ROWS - 0 /* jitter filter */, - READONLY_ROW, + + AUX_SERIAL_ROWS + + 0 /* ADC filter */, + READONLY_ROW /* RAS */, + 1 /* debugs */, + + 0, + + 0 }); uint8_t sub = menuVerticalPosition - HEADER_LINE; - + #if defined(BLUETOOTH) if (g_eeGeneral.bluetoothMode != BLUETOOTH_OFF && !IS_BLUETOOTH_CHIP_PRESENT()) { g_eeGeneral.bluetoothMode = BLUETOOTH_OFF; + storageDirty(EE_GENERAL); } #endif + if (menuEvent) { + disableVBatBridge(); + } + else if (event == EVT_ENTRY) { + enableVBatBridge(); + } + for (uint8_t i=0; i0) ? BLINK|INVERS : INVERS); - uint8_t attr = (sub == k ? blink : 0); + LcdFlags blink = ((s_editMode>0) ? BLINK|INVERS : INVERS); + LcdFlags attr = (sub == k ? blink : 0); switch(k) { case ITEM_RADIO_HARDWARE_LABEL_STICKS: @@ -263,6 +345,7 @@ void menuRadioHardware(event_t event) pushMenu(menuRadioCalibration); } break; + case ITEM_RADIO_HARDWARE_STICK1: case ITEM_RADIO_HARDWARE_STICK2: case ITEM_RADIO_HARDWARE_STICK3: @@ -275,8 +358,14 @@ void menuRadioHardware(event_t event) break; case ITEM_RADIO_HARDWARE_POT1: -#if !defined(PCBX9LITE) +#if defined(HARDWARE_POT2) case ITEM_RADIO_HARDWARE_POT2: +#endif +#if defined(HARDWARE_POT3) + case ITEM_RADIO_HARDWARE_POT3: +#endif +#if defined(HARDWARE_POT4) + case ITEM_RADIO_HARDWARE_POT4: #endif { int idx = k - ITEM_RADIO_HARDWARE_POT1; @@ -294,6 +383,29 @@ void menuRadioHardware(event_t event) break; } +#if NUM_SLIDERS > 0 + case ITEM_RADIO_HARDWARE_SLIDER1: + case ITEM_RADIO_HARDWARE_SLIDER2: +#if NUM_SLIDERS > 2 + case ITEM_RADIO_HARDWARE_SLIDER3: + case ITEM_RADIO_HARDWARE_SLIDER4: +#endif + { + int idx = k - ITEM_RADIO_HARDWARE_SLIDER1; + lcdDrawTextAtIndex(INDENT_WIDTH, y, STR_VSRCRAW, NUM_STICKS+NUM_POTS+idx+1, menuHorizontalPosition < 0 ? attr : 0); + if (ZEXIST(g_eeGeneral.anaNames[NUM_STICKS+NUM_POTS+idx]) || (attr && menuHorizontalPosition == 0 && s_editMode > 0)) + editName(HW_SETTINGS_COLUMN1, y, g_eeGeneral.anaNames[NUM_STICKS+NUM_POTS+idx], LEN_ANA_NAME, event, attr && menuHorizontalPosition == 0); + else + lcdDrawMMM(HW_SETTINGS_COLUMN1, y, menuHorizontalPosition == 0 ? attr : 0); + uint8_t mask = (0x01 << idx); + uint8_t potType = (g_eeGeneral.slidersConfig & mask) >> idx; + potType = editChoice(HW_SETTINGS_COLUMN2, y, "", STR_SLIDERTYPES, potType, SLIDER_NONE, SLIDER_WITH_DETENT, menuHorizontalPosition == 1 ? attr : 0, event); + g_eeGeneral.slidersConfig &= ~mask; + g_eeGeneral.slidersConfig |= (potType << idx); + break; + } +#endif + case ITEM_RADIO_HARDWARE_LABEL_SWITCHES: lcdDrawTextAlignedLeft(y, STR_SWITCHES); break; @@ -302,18 +414,36 @@ void menuRadioHardware(event_t event) case ITEM_RADIO_HARDWARE_SB: case ITEM_RADIO_HARDWARE_SC: case ITEM_RADIO_HARDWARE_SD: -#if NUM_SWITCHES >= 5 +#if defined(HARDWARE_SWITCH_E) + case ITEM_RADIO_HARDWARE_SE: +#endif +#if defined(HARDWARE_SWITCH_F) case ITEM_RADIO_HARDWARE_SF: #endif -#if NUM_SWITCHES >= 6 +#if defined(HARDWARE_SWITCH_G) + case ITEM_RADIO_HARDWARE_SG: +#endif +#if defined(HARDWARE_SWITCH_H) case ITEM_RADIO_HARDWARE_SH: #endif -#if NUM_SWITCHES >= 8 +#if defined(HARDWARE_SWITCH_I) case ITEM_RADIO_HARDWARE_SI: +#endif +#if defined(HARDWARE_SWITCH_J) case ITEM_RADIO_HARDWARE_SJ: +#endif +#if defined(HARDWARE_SWITCH_K) + case ITEM_RADIO_HARDWARE_SK: + case ITEM_RADIO_HARDWARE_SL: + case ITEM_RADIO_HARDWARE_SM: + case ITEM_RADIO_HARDWARE_SN: + case ITEM_RADIO_HARDWARE_SO: + case ITEM_RADIO_HARDWARE_SP: + case ITEM_RADIO_HARDWARE_SQ: + case ITEM_RADIO_HARDWARE_SR: #endif { - int index = k-ITEM_RADIO_HARDWARE_SA; + int index = k - ITEM_RADIO_HARDWARE_SA; int config = SWITCH_CONFIG(index); lcdDrawTextAtIndex(INDENT_WIDTH, y, STR_VSRCRAW, MIXSRC_FIRST_SWITCH-MIXSRC_Rud+index+1, menuHorizontalPosition < 0 ? attr : 0); if (ZEXIST(g_eeGeneral.switchNames[index]) || (attr && s_editMode > 0 && menuHorizontalPosition == 0)) @@ -352,7 +482,7 @@ void menuRadioHardware(event_t event) #if defined(STM32) case ITEM_RADIO_HARDWARE_RTC_BATTERY: lcdDrawTextAlignedLeft(y, STR_RTC_BATT); - putsVolts(HW_SETTINGS_COLUMN2, y, vbattRTC, PREC2|LEFT); + putsVolts(HW_SETTINGS_COLUMN2, y, getRTCBatteryVoltage(), PREC2|LEFT); break; #endif @@ -366,23 +496,13 @@ void menuRadioHardware(event_t event) break; #endif -#if defined(PCBSKY9X) - case ITEM_RADIO_HARDWARE_TEMPERATURE_CALIB: - lcdDrawTextAlignedLeft(y, STR_TEMP_CALIB); - drawValueWithUnit(HW_SETTINGS_COLUMN2, y, getTemperature(), UNIT_TEMPERATURE, attr) ; - if (attr) { - CHECK_INCDEC_GENVAR(event, g_eeGeneral.temperatureCalib, -100, 100); - } - break; -#endif - #if defined(CROSSFIRE) && SPORT_MAX_BAUDRATE < 400000 case ITEM_RADIO_HARDWARE_SERIAL_BAUDRATE: lcdDrawTextAlignedLeft(y, STR_MAXBAUDRATE); lcdDrawNumber(HW_SETTINGS_COLUMN2, y, CROSSFIRE_BAUDRATES[g_eeGeneral.telemetryBaudrate], attr|LEFT); if (attr) { g_eeGeneral.telemetryBaudrate = DIM(CROSSFIRE_BAUDRATES) - 1 - checkIncDecModel(event, DIM(CROSSFIRE_BAUDRATES) - 1 - g_eeGeneral.telemetryBaudrate, 0, DIM(CROSSFIRE_BAUDRATES) - 1); - if (checkIncDec_Ret) { + if (checkIncDec_Ret && IS_EXTERNAL_MODULE_ON()) { pauseMixerCalculations(); pausePulses(); EXTERNAL_MODULE_OFF(); @@ -426,6 +546,15 @@ void menuRadioHardware(event_t event) break; #endif +#if defined(AUX_SERIAL) + case ITEM_RADIO_HARDWARE_AUX_SERIAL_MODE: + g_eeGeneral.auxSerialMode = editChoice(HW_SETTINGS_COLUMN2, y, STR_AUX_SERIAL_MODE, STR_AUX_SERIAL_MODES, g_eeGeneral.auxSerialMode, 0, UART_MODE_MAX, attr, event); + if (attr && checkIncDec_Ret) { + auxSerialInit(g_eeGeneral.auxSerialMode, modelTelemetryProtocol()); + } + break; +#endif + case ITEM_RADIO_HARDWARE_JITTER_FILTER: g_eeGeneral.jitterFilter = 1 - editCheckBox(1 - g_eeGeneral.jitterFilter, HW_SETTINGS_COLUMN2, y, STR_JITTER_FILTER, attr, event); break; @@ -437,13 +566,13 @@ void menuRadioHardware(event_t event) #else lcdDrawTextAlignedLeft(y, "RAS"); if (telemetryData.swrInternal.isFresh()) - lcdDrawNumber(HW_SETTINGS_COLUMN2, y, telemetryData.swrInternal.value); + lcdDrawNumber(HW_SETTINGS_COLUMN2, y, telemetryData.swrInternal.value()); else lcdDrawText(HW_SETTINGS_COLUMN2, y, "---"); lcdDrawText(lcdNextPos, y, "/"); #endif if (telemetryData.swrExternal.isFresh()) - lcdDrawNumber(lcdNextPos, y, telemetryData.swrExternal.value); + lcdDrawNumber(lcdNextPos, y, telemetryData.swrExternal.value()); else lcdDrawText(lcdNextPos, y, "---"); break; @@ -459,6 +588,22 @@ void menuRadioHardware(event_t event) pushMenu(menuRadioDiagKeys); } break; + + case ITEM_RADIO_BACKUP_EEPROM: + lcdDrawText(LCD_W / 2, y, BUTTON(STR_EEBACKUP), attr | CENTERED); + if (attr && event == EVT_KEY_FIRST(KEY_ENTER)) { + s_editMode = EDIT_SELECT_FIELD; + eepromBackup(); + } + break; + + case ITEM_RADIO_FACTORY_RESET: + lcdDrawText(LCD_W / 2, y, BUTTON(STR_FACTORYRESET), attr | CENTERED); + if (attr && event == EVT_KEY_FIRST(KEY_ENTER)) { + s_editMode = EDIT_SELECT_FIELD; + POPUP_CONFIRMATION(STR_CONFIRMRESET, onFactoryResetConfirm); + } + break; } } } diff --git a/radio/src/gui/common/stdlcd/radio_sdmanager.cpp b/radio/src/gui/common/stdlcd/radio_sdmanager.cpp index 6554e12c3..6b7fc5e3a 100644 --- a/radio/src/gui/common/stdlcd/radio_sdmanager.cpp +++ b/radio/src/gui/common/stdlcd/radio_sdmanager.cpp @@ -79,7 +79,7 @@ void onSdFormatConfirm(const char * result) #endif audioQueue.stopSD(); if (sdCardFormat()) { - f_chdir("/"); + f_chdir(ROOT_PATH); REFRESH_FILES(); } } @@ -101,14 +101,29 @@ void onUpdateConfirmation(const char * result) void onUpdateStateChanged() { if (reusableBuffer.sdManager.otaUpdateInformation.step == BIND_INFO_REQUEST) { - POPUP_CONFIRMATION(PXX2receiversModels[reusableBuffer.sdManager.otaUpdateInformation.receiverInformation.modelID], onUpdateConfirmation); - char * tmp = strAppend(reusableBuffer.sdManager.otaReceiverVersion, TR_CURRENT_VERSION); - tmp = strAppendUnsigned(tmp, 1 + reusableBuffer.sdManager.otaUpdateInformation.receiverInformation.swVersion.major); - *tmp++ = '.'; - tmp = strAppendUnsigned(tmp, reusableBuffer.sdManager.otaUpdateInformation.receiverInformation.swVersion.minor); - *tmp++ = '.'; - tmp = strAppendUnsigned(tmp, reusableBuffer.sdManager.otaUpdateInformation.receiverInformation.swVersion.revision); - SET_WARNING_INFO(reusableBuffer.sdManager.otaReceiverVersion, tmp - reusableBuffer.sdManager.otaReceiverVersion, 0); + uint8_t modelId = reusableBuffer.sdManager.otaUpdateInformation.receiverInformation.modelID; + if (modelId > 0 && modelId < DIM(PXX2ReceiversNames)) { + if (isPXX2ReceiverOptionAvailable(modelId, RECEIVER_OPTION_OTA)) { + POPUP_CONFIRMATION(getPXX2ReceiverName(modelId), onUpdateConfirmation); + char *tmp = strAppend(reusableBuffer.sdManager.otaReceiverVersion, TR_CURRENT_VERSION); + tmp = strAppendUnsigned(tmp, 1 + reusableBuffer.sdManager.otaUpdateInformation.receiverInformation.swVersion.major); + *tmp++ = '.'; + tmp = strAppendUnsigned(tmp, reusableBuffer.sdManager.otaUpdateInformation.receiverInformation.swVersion.minor); + *tmp++ = '.'; + tmp = strAppendUnsigned(tmp, reusableBuffer.sdManager.otaUpdateInformation.receiverInformation.swVersion.revision); + SET_WARNING_INFO(reusableBuffer.sdManager.otaReceiverVersion, tmp - reusableBuffer.sdManager.otaReceiverVersion, 0); + } + else { + POPUP_WARNING(STR_OTA_UPDATE_ERROR); + SET_WARNING_INFO(STR_UNSUPPORTED_RX, sizeof(TR_UNSUPPORTED_RX) - 1, 0); + moduleState[EXTERNAL_MODULE].mode = MODULE_MODE_NORMAL; + } + } + else { + POPUP_WARNING(STR_OTA_UPDATE_ERROR); + SET_WARNING_INFO(STR_UNKNOWN_RX, sizeof(TR_UNKNOWN_RX) - 1, 0); + moduleState[EXTERNAL_MODULE].mode = MODULE_MODE_NORMAL; + } } } #endif @@ -312,7 +327,7 @@ void menuRadioSdManager(event_t _event) break; case EVT_KEY_LONG(KEY_ENTER): -#if !defined(PCBX9) && !defined(PCBX7) // TODO NO_HEADER_LINE +#if !defined(PCBX9) && !defined(RADIO_X7) // TODO NO_HEADER_LINE if (menuVerticalPosition < HEADER_LINE) { killEvents(_event); POPUP_MENU_ADD_ITEM(STR_SD_INFO); @@ -340,9 +355,6 @@ void menuRadioSdManager(event_t _event) } } #endif - else if (!strcasecmp(ext, TEXT_EXT)) { - POPUP_MENU_ADD_ITEM(STR_VIEW_TEXT); - } #if defined(LUA) else if (isExtensionMatching(ext, SCRIPTS_EXT)) { POPUP_MENU_ADD_ITEM(STR_EXECUTE_FILE); @@ -386,6 +398,9 @@ void menuRadioSdManager(event_t _event) } } #endif + if (isExtensionMatching(ext, TEXT_EXT) || isExtensionMatching(ext, SCRIPTS_EXT)) { + POPUP_MENU_ADD_ITEM(STR_VIEW_TEXT); + } } if (!READ_ONLY()) { if (IS_FILE(line)) diff --git a/radio/src/gui/common/stdlcd/radio_spectrum_analyser.cpp b/radio/src/gui/common/stdlcd/radio_spectrum_analyser.cpp index 48349d8e8..693032325 100644 --- a/radio/src/gui/common/stdlcd/radio_spectrum_analyser.cpp +++ b/radio/src/gui/common/stdlcd/radio_spectrum_analyser.cpp @@ -51,7 +51,7 @@ void menuRadioSpectrumAnalyser(event_t event) return; } - if (isModuleR9M2(g_moduleIdx)) { + if (isModuleR9MAccess(g_moduleIdx)) { reusableBuffer.spectrumAnalyser.spanDefault = 20; reusableBuffer.spectrumAnalyser.spanMax = 40; reusableBuffer.spectrumAnalyser.freqDefault = 890; diff --git a/radio/src/gui/common/stdlcd/radio_tools.cpp b/radio/src/gui/common/stdlcd/radio_tools.cpp index d7baa272d..209a772d0 100644 --- a/radio/src/gui/common/stdlcd/radio_tools.cpp +++ b/radio/src/gui/common/stdlcd/radio_tools.cpp @@ -32,6 +32,7 @@ bool addRadioTool(uint8_t index, const char * label) lcdDrawText(3*FW, y, label, (sub == index ? INVERS : 0)); if (attr && s_editMode > 0) { s_editMode = 0; + killAllEvents(); return true; } return false; @@ -47,6 +48,7 @@ void addRadioModuleTool(uint8_t index, const char * label, void (* tool)(event_t #define TOOL_NAME_MAXLEN 16 +#if defined(LUA) bool readToolName(const char * filename, char * name) { FIL file; @@ -84,23 +86,19 @@ bool readToolName(const char * filename, char * name) return true; } -void addRadioScriptTool(uint8_t index, const char * filename) +void addRadioScriptTool(uint8_t index, const char * path) { - TCHAR path[_MAX_LFN+1] = SCRIPTS_TOOLS_PATH "/"; - strcat(path, filename); - char toolName[TOOL_NAME_MAXLEN + 1]; - const char * label; - if (readToolName(path, toolName)) { - label = toolName; - } - else { - char * ext = (char *)getFileExtension(filename); - *ext = '\0'; - label = filename; + + if (!readToolName(path, toolName)) { + strAppendFilename(toolName, getBasename(path), TOOL_NAME_MAXLEN); } - if (addRadioTool(index, label)) { + if (addRadioTool(index, toolName)) { + char toolPath[_MAX_LFN]; + strcpy(toolPath, path); + *((char *)getBasename(toolPath)-1) = '\0'; + f_chdir(toolPath); luaExec(path); } } @@ -110,6 +108,7 @@ bool isRadioScriptTool(const char * filename) const char * ext = getFileExtension(filename); return ext && !strcasecmp(ext, SCRIPT_EXT); } +#endif void menuRadioTools(event_t event) { @@ -129,35 +128,44 @@ void menuRadioTools(event_t event) uint8_t index = 0; #if defined(PXX2) - if (isModuleOptionAvailable(reusableBuffer.hardwareAndSettings.modules[INTERNAL_MODULE].information.modelID, MODULE_OPTION_SPECTRUM_ANALYSER)) + if (isPXX2ModuleOptionAvailable(reusableBuffer.hardwareAndSettings.modules[INTERNAL_MODULE].information.modelID, MODULE_OPTION_SPECTRUM_ANALYSER)) addRadioModuleTool(index++, STR_SPECTRUM_ANALYSER_INT, menuRadioSpectrumAnalyser, INTERNAL_MODULE); - if (isModuleOptionAvailable(reusableBuffer.hardwareAndSettings.modules[INTERNAL_MODULE].information.modelID, MODULE_OPTION_POWER_METER)) + if (isPXX2ModuleOptionAvailable(reusableBuffer.hardwareAndSettings.modules[INTERNAL_MODULE].information.modelID, MODULE_OPTION_POWER_METER)) addRadioModuleTool(index++, STR_POWER_METER_INT, menuRadioPowerMeter, INTERNAL_MODULE); - if (isModuleOptionAvailable(reusableBuffer.hardwareAndSettings.modules[EXTERNAL_MODULE].information.modelID, MODULE_OPTION_SPECTRUM_ANALYSER)) + if (isPXX2ModuleOptionAvailable(reusableBuffer.hardwareAndSettings.modules[EXTERNAL_MODULE].information.modelID, MODULE_OPTION_SPECTRUM_ANALYSER)) addRadioModuleTool(index++, STR_SPECTRUM_ANALYSER_EXT, menuRadioSpectrumAnalyser, EXTERNAL_MODULE); - if (isModuleOptionAvailable(reusableBuffer.hardwareAndSettings.modules[EXTERNAL_MODULE].information.modelID, MODULE_OPTION_POWER_METER)) + if (isPXX2ModuleOptionAvailable(reusableBuffer.hardwareAndSettings.modules[EXTERNAL_MODULE].information.modelID, MODULE_OPTION_POWER_METER)) addRadioModuleTool(index++, STR_POWER_METER_EXT, menuRadioPowerMeter, EXTERNAL_MODULE); #endif +#if defined(LUA) FILINFO fno; DIR dir; +#if defined(CROSSFIRE) + if(isFileAvailable(SCRIPTS_TOOLS_PATH "/CROSSFIRE/crossfire.lua")) + addRadioScriptTool(index++, SCRIPTS_TOOLS_PATH "/CROSSFIRE/crossfire.lua"); +#endif + FRESULT res = f_opendir(&dir, SCRIPTS_TOOLS_PATH); if (res == FR_OK) { for (;;) { + TCHAR path[_MAX_LFN+1] = SCRIPTS_TOOLS_PATH "/"; res = f_readdir(&dir, &fno); /* Read a directory item */ if (res != FR_OK || fno.fname[0] == 0) break; /* Break on error or end of dir */ if (fno.fattrib & AM_DIR) continue; /* Skip subfolders */ if (fno.fattrib & AM_HID) continue; /* Skip hidden files */ if (fno.fattrib & AM_SYS) continue; /* Skip system files */ + strcat(path, fno.fname); if (isRadioScriptTool(fno.fname)) - addRadioScriptTool(index++, fno.fname); + addRadioScriptTool(index++, path); } } +#endif if (index == 0) { lcdDrawCenteredText(LCD_H/2, STR_NO_TOOLS); diff --git a/radio/src/gui/212x64/radio_trainer.cpp b/radio/src/gui/common/stdlcd/radio_trainer.cpp similarity index 69% rename from radio/src/gui/212x64/radio_trainer.cpp rename to radio/src/gui/common/stdlcd/radio_trainer.cpp index 4f010595f..a4d6f5e56 100644 --- a/radio/src/gui/212x64/radio_trainer.cpp +++ b/radio/src/gui/common/stdlcd/radio_trainer.cpp @@ -20,40 +20,46 @@ #include "opentx.h" -#define TRAINER_CALIB_POS 12 +#if LCD_W >= 212 + #define TRAINER_CALIB_COLUMN_WIDTH 12 +#else + #define TRAINER_CALIB_COLUMN_WIDTH 8 +#endif void menuRadioTrainer(event_t event) { uint8_t y; bool slave = SLAVE_MODE(); - MENU(STR_MENUTRAINER, menuTabGeneral, MENU_RADIO_TRAINER, (slave ? 0 : 6), { NAVIGATION_LINE_BY_LINE|2, NAVIGATION_LINE_BY_LINE|2, NAVIGATION_LINE_BY_LINE|2, NAVIGATION_LINE_BY_LINE|2, 0, 0 }); + MENU(STR_MENUTRAINER, menuTabGeneral, MENU_RADIO_TRAINER, (slave ? HEADER_LINE : HEADER_LINE+6), { HEADER_LINE_COLUMNS NAVIGATION_LINE_BY_LINE|2, NAVIGATION_LINE_BY_LINE|2, NAVIGATION_LINE_BY_LINE|2, NAVIGATION_LINE_BY_LINE|2, 0, 0 }); if (slave) { - lcdDrawText(7*FW, 4*FH, STR_SLAVE); + lcdDrawText(LCD_W/2, 4*FH, STR_SLAVE, CENTERED); return; } LcdFlags attr; LcdFlags blink = ((s_editMode>0) ? BLINK|INVERS : INVERS); - lcdDrawText(3*FW, MENU_HEADER_HEIGHT+1, STR_MODESRC); + lcdDrawText(5*FW, MENU_HEADER_HEIGHT+1, STR_MODE); + lcdDrawText(11*FW, MENU_HEADER_HEIGHT+1, "%", RIGHT); + lcdDrawText(12*FW, MENU_HEADER_HEIGHT+1, STR_SOURCE); y = MENU_HEADER_HEIGHT + 1 + FH; - for (int i=0; imode, attr); + lcdDrawTextAtIndex(5*FW, y, STR_TRNMODE, td->mode, attr); if (attr&BLINK) CHECK_INCDEC_GENVAR(event, td->mode, 0, 2); break; @@ -71,16 +77,17 @@ void menuRadioTrainer(event_t event) y += FH; } - attr = (menuVerticalPosition==4) ? blink : 0; + attr = (menuVerticalPosition==HEADER_LINE+4) ? blink : 0; lcdDrawTextAlignedLeft(MENU_HEADER_HEIGHT+1+5*FH, STR_MULTIPLIER); lcdDrawNumber(LEN_MULTIPLIER*FW+3*FW, MENU_HEADER_HEIGHT+1+5*FH, g_eeGeneral.PPM_Multiplier+10, attr|PREC1|RIGHT); if (attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.PPM_Multiplier, -10, 40); - attr = (menuVerticalPosition==5) ? INVERS : 0; - if (attr) s_editMode = 0; + attr = (menuVerticalPosition==HEADER_LINE+5) ? INVERS : 0; + if (attr) + s_editMode = 0; lcdDrawText(0*FW, MENU_HEADER_HEIGHT+1+6*FH, STR_CAL, attr); - for (int i=0; i<4; i++) { - uint8_t x = (i*TRAINER_CALIB_POS+16)*FW/2; + for (uint8_t i=0; i<4; i++) { + uint8_t x = (i*TRAINER_CALIB_COLUMN_WIDTH + 16) * FW/2; #if defined (PPM_UNIT_PERCENT_PREC1) lcdDrawNumber(x, MENU_HEADER_HEIGHT+1+6*FH, (ppmInput[i]-g_eeGeneral.trainer.calib[i])*2, PREC1|RIGHT); #else @@ -89,6 +96,7 @@ void menuRadioTrainer(event_t event) } if (attr) { + s_editMode = 0; if (event==EVT_KEY_LONG(KEY_ENTER)){ memcpy(g_eeGeneral.trainer.calib, ppmInput, sizeof(g_eeGeneral.trainer.calib)); storageDirty(EE_GENERAL); diff --git a/radio/src/gui/128x64/radio_version.cpp b/radio/src/gui/common/stdlcd/radio_version.cpp similarity index 74% rename from radio/src/gui/128x64/radio_version.cpp rename to radio/src/gui/common/stdlcd/radio_version.cpp index 054c56063..2d7ffe4ce 100644 --- a/radio/src/gui/128x64/radio_version.cpp +++ b/radio/src/gui/common/stdlcd/radio_version.cpp @@ -19,6 +19,7 @@ */ #include "opentx.h" +#include "options.h" // TODO duplicated code #if defined(ROTARY_ENCODER_NAVIGATION) @@ -32,7 +33,35 @@ #define MENU_BODY_TOP (FH + 1) #define MENU_BODY_BOTTOM (LCD_H) -constexpr uint8_t COLUMN2_X = 11 * FW; +constexpr uint8_t COLUMN2_X = 10 * FW; + + +void menuRadioFirmwareOptions(event_t event) +{ + title(STR_MENU_FIRM_OPTIONS); + + coord_t y = MENU_HEADER_HEIGHT + 1; + lcdNextPos = INDENT_WIDTH; + + for (uint8_t i=0; options[i]; i++) { + const char * option = options[i]; + + if (i > 0) { + lcdDrawText(lcdNextPos, y, ", "); + } + + if (lcdNextPos + getTextWidth(option) + 5 > LCD_W) { + lcdNextPos = INDENT_WIDTH; + y += FH; + } + + lcdDrawText(lcdNextPos, y, option); + } + + if (event == EVT_KEY_BREAK(KEY_EXIT)) { + popMenu(); + } +} #if defined(PXX2) void drawPXX2Version(coord_t x, coord_t y, PXX2Version version) @@ -85,31 +114,44 @@ void menuRadioModulesVersion(event_t event) coord_t y = (FH + 1) - menuVerticalOffset * FH; for (uint8_t module=0; module= MENU_BODY_TOP && y < MENU_BODY_BOTTOM) { if (module == INTERNAL_MODULE) - lcdDrawTextAlignedLeft(y, "Internal module"); + lcdDrawTextAlignedLeft(y, STR_INTERNAL_MODULE); else if (module == EXTERNAL_MODULE) - lcdDrawTextAlignedLeft(y, "External module"); + lcdDrawTextAlignedLeft(y, STR_EXTERNAL_MODULE); } y += FH; // Module model if (y >= MENU_BODY_TOP && y < MENU_BODY_BOTTOM) { - lcdDrawText(INDENT_WIDTH, y, "Module"); + lcdDrawText(INDENT_WIDTH, y, STR_MODULE); + if (module == INTERNAL_MODULE) { + if (!IS_INTERNAL_MODULE_ON()) { + lcdDrawText(COLUMN2_X, y, STR_OFF); + y += FH; + continue; + } + if (!isModulePXX2(INTERNAL_MODULE)) { + lcdDrawText(COLUMN2_X, y, STR_NO_INFORMATION); + y += FH; + continue; + } + } + else if (module == EXTERNAL_MODULE) { + if (!IS_EXTERNAL_MODULE_ON()) { + lcdDrawText(COLUMN2_X, y, STR_OFF); + y += FH; + continue; + } + if (!isModulePXX2(EXTERNAL_MODULE)) { + lcdDrawText(COLUMN2_X, y, STR_NO_INFORMATION); + y += FH; + continue; + } + } uint8_t modelId = reusableBuffer.hardwareAndSettings.modules[module].information.modelID; - lcdDrawText(COLUMN2_X, y, PXX2modulesModels[modelId]); + lcdDrawText(COLUMN2_X, y, getPXX2ModuleName(modelId)); } y += FH; @@ -130,10 +172,10 @@ void menuRadioModulesVersion(event_t event) if (reusableBuffer.hardwareAndSettings.modules[module].receivers[receiver].information.modelID && reusableBuffer.hardwareAndSettings.modules[module].receivers[receiver].timestamp < get_tmr10ms() + 2000) { // Receiver model if (y >= MENU_BODY_TOP && y < MENU_BODY_BOTTOM) { - lcdDrawText(INDENT_WIDTH, y, "Receiver"); + lcdDrawText(INDENT_WIDTH, y, STR_RECEIVER); lcdDrawNumber(lcdLastRightPos + 2, y, receiver + 1); uint8_t modelId = reusableBuffer.hardwareAndSettings.modules[module].receivers[receiver].information.modelID; - lcdDrawText(COLUMN2_X, y, PXX2receiversModels[modelId]); + lcdDrawText(COLUMN2_X, y, getPXX2ReceiverName(modelId)); } y += FH; @@ -150,9 +192,6 @@ void menuRadioModulesVersion(event_t event) if (lines > NUM_BODY_LINES) { drawVerticalScrollbar(LCD_W-1, FH, LCD_H-FH, menuVerticalOffset, lines, NUM_BODY_LINES); } - else { - menuVerticalOffset = 0; - } switch(event) { case EVT_KEY_PREVIOUS_LINE: @@ -182,47 +221,40 @@ void menuRadioModulesVersion(event_t event) enum MenuRadioVersionItems { ITEM_RADIO_VERSION_FIRST = HEADER_LINE - 1, +#if defined(PCBTARANIS) || defined(PCBHORUS) + ITEM_RADIO_FIRMWARE_OPTIONS, +#endif #if defined(PXX2) ITEM_RADIO_MODULES_VERSION, -#endif -#if defined(EEPROM_RLC) - ITEM_RADIO_BACKUP_EEPROM, - ITEM_RADIO_FACTORY_RESET, #endif ITEM_RADIO_VERSION_COUNT }; -#if defined(EEPROM_RLC) -void onFactoryResetConfirm(const char * result) -{ - if (result == STR_OK) { - showMessageBox(STR_STORAGE_FORMAT); - storageEraseAll(false); - NVIC_SystemReset(); - } -} -#endif - void menuRadioVersion(event_t event) { SIMPLE_MENU(STR_MENUVERSION, menuTabGeneral, MENU_RADIO_VERSION, ITEM_RADIO_VERSION_COUNT); - coord_t y = MENU_HEADER_HEIGHT + 1; - lcdDrawTextAlignedLeft(y, vers_stamp); - y += 4*FH; - // TODO this was good on AVR radios, but horrible now ... + coord_t y = MENU_HEADER_HEIGHT + 2; + lcdDrawText(FW, y, vers_stamp, SMLSIZE); + y += 4 * (FH - 1); #if defined(COPROCESSOR) - if (Coproc_valid == 1) { - lcdDrawTextAlignedLeft(y, "CoPr:"); - lcdDraw8bitsNumber(10*FW, y, Coproc_read); - } - else { - lcdDrawTextAlignedLeft(y, "CoPr: ---"); + lcdDrawText(FW, y, "COPR\037\033: ", SMLSIZE); + if (Coproc_valid == 1) + lcdDrawNumber(lcdNextPos, y, Coproc_read, SMLSIZE); + else + lcdDrawText(lcdNextPos, y, "---", SMLSIZE); + y += FH - 1; +#endif + y += 2; +#if defined(PCBTARANIS) || defined(PCBHORUS) + lcdDrawText(INDENT_WIDTH, y, BUTTON(TR_FIRMWARE_OPTIONS), menuVerticalPosition == ITEM_RADIO_FIRMWARE_OPTIONS ? INVERS : 0); + y += FH; + if (menuVerticalPosition == ITEM_RADIO_FIRMWARE_OPTIONS && event == EVT_KEY_BREAK(KEY_ENTER)) { + s_editMode = EDIT_SELECT_FIELD; + pushMenu(menuRadioFirmwareOptions); } - y += FH; #endif - #if defined(PXX2) lcdDrawText(INDENT_WIDTH, y, BUTTON(TR_MODULES_RX_VERSION), menuVerticalPosition == ITEM_RADIO_MODULES_VERSION ? INVERS : 0); y += FH; @@ -231,20 +263,4 @@ void menuRadioVersion(event_t event) pushMenu(menuRadioModulesVersion); } #endif - -#if defined(EEPROM_RLC) - lcdDrawText(INDENT_WIDTH, y, BUTTON(STR_EEBACKUP), menuVerticalPosition == ITEM_RADIO_BACKUP_EEPROM ? INVERS : 0); - y += FH; - if (menuVerticalPosition == ITEM_RADIO_BACKUP_EEPROM && event == EVT_KEY_BREAK(KEY_ENTER)) { - s_editMode = EDIT_SELECT_FIELD; - eepromBackup(); - } - - lcdDrawText(INDENT_WIDTH, y, BUTTON(STR_FACTORYRESET), menuVerticalPosition == ITEM_RADIO_FACTORY_RESET ? INVERS : 0); - // y += FH; - if (menuVerticalPosition == ITEM_RADIO_FACTORY_RESET && event == EVT_KEY_BREAK(KEY_ENTER)) { - s_editMode = EDIT_SELECT_FIELD; - POPUP_CONFIRMATION(STR_CONFIRMRESET, onFactoryResetConfirm); - } -#endif } diff --git a/radio/src/gui/common/stdlcd/view_text.cpp b/radio/src/gui/common/stdlcd/view_text.cpp index 53519fac9..f513d25a3 100644 --- a/radio/src/gui/common/stdlcd/view_text.cpp +++ b/radio/src/gui/common/stdlcd/view_text.cpp @@ -166,7 +166,7 @@ void menuTextView(event_t event) #else // TODO? #endif - lcdDrawText(LCD_W/2-strlen(title)*FW/2, 0, title); + lcdDrawText(LCD_W/2, 0, getBasename(title), CENTERED); lcdInvertLine(0); if (lines_count > LCD_LINES-1) { diff --git a/radio/src/gui/common/stdlcd/widgets.cpp b/radio/src/gui/common/stdlcd/widgets.cpp index b87a1a995..e91943344 100644 --- a/radio/src/gui/common/stdlcd/widgets.cpp +++ b/radio/src/gui/common/stdlcd/widgets.cpp @@ -233,20 +233,3 @@ void drawReceiverName(coord_t x, coord_t y, uint8_t moduleIdx, uint8_t receiverI lcdDrawText(x, y, "External", flags); } } - -#if defined(PWR_BUTTON_PRESS) -void drawShutdownAnimation(uint32_t index, const char * message) -{ - lcdClear(); - int quarter = index / (PWR_PRESS_SHUTDOWN_DELAY / 5); - for (int i=1; i<=4; i++) { - if (4 - quarter >= i) { - lcdDrawFilledRect(LCD_W / 2 - 28 + 10 * i, LCD_H / 2 - 3, 6, 6, SOLID, 0); - } - } - if (message) { - lcdDrawText((LCD_W - getTextWidth(message)) / 2, LCD_H-2*FH, message); - } - lcdRefresh(); -} -#endif diff --git a/radio/src/gui/gui_common.cpp b/radio/src/gui/gui_common.cpp index 538a4ae93..d4c028a8b 100644 --- a/radio/src/gui/gui_common.cpp +++ b/radio/src/gui/gui_common.cpp @@ -161,57 +161,57 @@ bool isSourceAvailable(int source) if (source < 0) return false; - if (source>=MIXSRC_FIRST_INPUT && source<=MIXSRC_LAST_INPUT) { + if (source >= MIXSRC_FIRST_INPUT && source <= MIXSRC_LAST_INPUT) { return isInputAvailable(source - MIXSRC_FIRST_INPUT); } #if defined(LUA_MODEL_SCRIPTS) - if (source>=MIXSRC_FIRST_LUA && source<=MIXSRC_LAST_LUA) { - div_t qr = div(source-MIXSRC_FIRST_LUA, MAX_SCRIPT_OUTPUTS); + if (source >= MIXSRC_FIRST_LUA && source <= MIXSRC_LAST_LUA) { + div_t qr = div(source - MIXSRC_FIRST_LUA, MAX_SCRIPT_OUTPUTS); return (qr.rem=MIXSRC_FIRST_LUA && source<=MIXSRC_LAST_LUA) + if (source >= MIXSRC_FIRST_LUA && source <= MIXSRC_LAST_LUA) return false; #endif - if (source>=MIXSRC_FIRST_POT && source<=MIXSRC_LAST_POT) { - return IS_POT_SLIDER_AVAILABLE(POT1+source-MIXSRC_FIRST_POT); + if (source >= MIXSRC_FIRST_POT && source <= MIXSRC_LAST_POT) { + return IS_POT_SLIDER_AVAILABLE(POT1+source - MIXSRC_FIRST_POT); } #if defined(PCBX10) - if ((source>=MIXSRC_S3 && source<=MIXSRC_S4) || (source>=MIXSRC_MOUSE1 && source<=MIXSRC_MOUSE2)) + if (source >= MIXSRC_MOUSE1 && source <= MIXSRC_MOUSE2) return false; #endif - if (source>=MIXSRC_FIRST_SWITCH && source<=MIXSRC_LAST_SWITCH) { - return SWITCH_EXISTS(source-MIXSRC_FIRST_SWITCH); + if (source >= MIXSRC_FIRST_SWITCH && source <= MIXSRC_LAST_SWITCH) { + return SWITCH_EXISTS(source - MIXSRC_FIRST_SWITCH); } #if !defined(HELI) - if (source>=MIXSRC_CYC1 && source<=MIXSRC_CYC3) + if (source >= MIXSRC_CYC1 && source <= MIXSRC_CYC3) return false; #endif - if (source>=MIXSRC_FIRST_CH && source<=MIXSRC_LAST_CH) { - return isChannelUsed(source-MIXSRC_FIRST_CH); + if (source >= MIXSRC_FIRST_CH && source <= MIXSRC_LAST_CH) { + return isChannelUsed(source - MIXSRC_FIRST_CH); } - if (source>=MIXSRC_FIRST_LOGICAL_SWITCH && source<=MIXSRC_LAST_LOGICAL_SWITCH) { - LogicalSwitchData * cs = lswAddress(source-MIXSRC_FIRST_LOGICAL_SWITCH); + if (source >= MIXSRC_FIRST_LOGICAL_SWITCH && source <= MIXSRC_LAST_LOGICAL_SWITCH) { + LogicalSwitchData * cs = lswAddress(source - MIXSRC_FIRST_LOGICAL_SWITCH); return (cs->func != LS_FUNC_NONE); } #if !defined(GVARS) - if (source>=MIXSRC_GVAR1 && source<=MIXSRC_LAST_GVAR) + if (source >= MIXSRC_GVAR1 && source <= MIXSRC_LAST_GVAR) return false; #endif - if (source>=MIXSRC_FIRST_RESERVE && source<=MIXSRC_LAST_RESERVE) + if (source >= MIXSRC_FIRST_RESERVE && source <= MIXSRC_LAST_RESERVE) return false; - if (source>=MIXSRC_FIRST_TELEM && source<=MIXSRC_LAST_TELEM) { - div_t qr = div(source-MIXSRC_FIRST_TELEM, 3); + if (source >= MIXSRC_FIRST_TELEM && source <= MIXSRC_LAST_TELEM) { + div_t qr = div(source - MIXSRC_FIRST_TELEM, 3); if (qr.rem == 0) return isTelemetryFieldAvailable(qr.quot); else @@ -223,7 +223,7 @@ bool isSourceAvailable(int source) bool isSourceAvailableInGlobalFunctions(int source) { - if (source>=MIXSRC_FIRST_TELEM && source<=MIXSRC_LAST_TELEM) { + if (source >= MIXSRC_FIRST_TELEM && source <= MIXSRC_LAST_TELEM) { return false; } return isSourceAvailable(source); @@ -234,8 +234,8 @@ bool isSourceAvailableInCustomSwitches(int source) bool result = isSourceAvailable(source); #if defined(TELEMETRY_FRSKY) - if (result && source>=MIXSRC_FIRST_TELEM && source<=MIXSRC_LAST_TELEM) { - div_t qr = div(source-MIXSRC_FIRST_TELEM, 3); + if (result && source >= MIXSRC_FIRST_TELEM && source <= MIXSRC_LAST_TELEM) { + div_t qr = div(source - MIXSRC_FIRST_TELEM, 3); result = isTelemetryFieldComparisonAvailable(qr.quot); } #endif @@ -246,14 +246,19 @@ bool isSourceAvailableInCustomSwitches(int source) bool isInputSourceAvailable(int source) { if (source >= MIXSRC_FIRST_POT && source <= MIXSRC_LAST_POT) - return IS_POT_SLIDER_AVAILABLE(POT1+source-MIXSRC_FIRST_POT); + return IS_POT_SLIDER_AVAILABLE(POT1+source - MIXSRC_FIRST_POT); #if defined(GYRO) if (source >= MIXSRC_GYRO1 && source <= MIXSRC_GYRO2) return true; #endif - if (source >= MIXSRC_Rud && source <= MIXSRC_MAX) +#if defined(PCBX10) + if (source >= MIXSRC_MOUSE1 && source <= MIXSRC_MOUSE2) + return false; +#endif + + if (source >= MIXSRC_Rud && source < MIXSRC_MAX) return true; if (source >= MIXSRC_FIRST_TRIM && source <= MIXSRC_LAST_TRIM) @@ -548,6 +553,9 @@ bool isModuleUsingSport(uint8_t moduleBay, uint8_t moduleType) return false; case MODULE_TYPE_XJT_PXX1: + // External XJT has a physical switch to disable S.PORT + case MODULE_TYPE_R9M_PXX1: + // R9M telemetry is disabled by pulses (pxx1.cpp) if (moduleBay == EXTERNAL_MODULE) return false; @@ -562,22 +570,23 @@ bool isInternalModuleAvailable(int moduleType) if (moduleType == MODULE_TYPE_NONE) return true; + if (moduleType == MODULE_TYPE_XJT_PXX1) { #if defined(PXX1) && defined(INTERNAL_MODULE_PXX1) - if (moduleType == MODULE_TYPE_XJT_PXX1) return !isModuleUsingSport(EXTERNAL_MODULE, g_model.moduleData[EXTERNAL_MODULE].type); -#else - if (moduleType == MODULE_TYPE_XJT_PXX1) - return false; #endif + } -#if defined(PXX2) - if (moduleType == MODULE_TYPE_ISRM_PXX2) -#if defined(INTMODULE_USART) + if (moduleType == MODULE_TYPE_ISRM_PXX2) { +#if defined(PXX2) && defined(INTERNAL_MODULE_PXX2) return true; -#else - return (!isModuleUsingSport(EXTERNAL_MODULE, g_model.moduleData[EXTERNAL_MODULE].type)); #endif + } + + if (moduleType == MODULE_TYPE_PPM) { +#if defined(PPM) && defined(INTERNAL_MODULE_PPM) + return true; #endif + } return false; } @@ -586,12 +595,12 @@ bool isInternalModuleAvailable(int moduleType) bool isExternalModuleAvailable(int moduleType) { #if !defined(HARDWARE_EXTERNAL_MODULE_SIZE_SML) - if (moduleType == MODULE_TYPE_R9M_LITE_PXX1 || moduleType == MODULE_TYPE_R9M_LITE_PXX2 || moduleType == MODULE_TYPE_R9M_LITE_PRO_PXX2) + if (isModuleTypeR9MLite(moduleType) || moduleType == MODULE_TYPE_XJT_LITE_PXX2) return false; #endif #if !defined(PXX1) - if (moduleType == MODULE_TYPE_XJT_PXX1 || moduleType == MODULE_TYPE_R9M_PXX1 || moduleType == MODULE_TYPE_R9M_LITE_PXX1) + if (isModuleTypePXX1(moduleType)) return false; #endif @@ -600,16 +609,16 @@ bool isExternalModuleAvailable(int moduleType) return false; #endif -#if !defined(R9M_SIZE_STD) - if (moduleType == MODULE_TYPE_R9M_PXX1) +#if !defined(HARDWARE_EXTERNAL_MODULE_SIZE_STD) + if (moduleType == MODULE_TYPE_R9M_PXX1 || moduleType == MODULE_TYPE_R9M_PXX2) return false; #endif - if (moduleType == MODULE_TYPE_ISRM_PXX2 || moduleType == MODULE_TYPE_R9M_PXX2) - return false; + if (moduleType == MODULE_TYPE_ISRM_PXX2) + return false; // doesn't exist for now #if !defined(PXX2) - if (moduleType == MODULE_TYPE_R9M_PXX2 || moduleType == MODULE_TYPE_R9M_LITE_PXX2 || moduleType == MODULE_TYPE_R9M_LITE_PRO_PXX2) { + if (moduleType == MODULE_TYPE_XJT_LITE_PXX2 || moduleType == MODULE_TYPE_R9M_PXX2 || moduleType == MODULE_TYPE_R9M_LITE_PXX2 || moduleType == MODULE_TYPE_R9M_LITE_PRO_PXX2) { return false; } #endif @@ -698,66 +707,33 @@ bool isTelemetryProtocolAvailable(int protocol) return true; } -#if defined(PCBHORUS) bool isTrainerModeAvailable(int mode) { +#if defined(PCBTARANIS) + if (IS_EXTERNAL_MODULE_ENABLED() && (mode == TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE || mode == TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE)) + return false; +#endif + +#if !defined(PCBSKY9X) && !defined(TRAINER_BATTERY_COMPARTMENT) + if (mode == TRAINER_MODE_MASTER_BATTERY_COMPARTMENT) + return false; +#endif + +#if defined(PCBX9E) + if (mode == TRAINER_MODE_MASTER_BLUETOOTH || mode == TRAINER_MODE_SLAVE_BLUETOOTH) + return false; +#elif defined(BLUETOOTH) + if (g_eeGeneral.bluetoothMode != BLUETOOTH_TRAINER && (mode == TRAINER_MODE_MASTER_BLUETOOTH || mode == TRAINER_MODE_SLAVE_BLUETOOTH)) + return false; +#endif + +#if defined(PCBXLITE) && !defined(PCBXLITES) + if (mode == TRAINER_MODE_MASTER_TRAINER_JACK || mode == TRAINER_MODE_SLAVE) + return false; +#endif + return true; } -#elif defined(PCBX9E) -bool isTrainerModeAvailable(int mode) -{ - if (IS_EXTERNAL_MODULE_ENABLED() && (mode == TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE || mode == TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE)) - return false; -#if defined(USEHORUSBT) - else if (mode == TRAINER_MODE_MASTER_BATTERY_COMPARTMENT) -#else - else if (mode == TRAINER_MODE_MASTER_BLUETOOTH || mode == TRAINER_MODE_MASTER_BATTERY_COMPARTMENT || mode == TRAINER_MODE_SLAVE_BLUETOOTH) -#endif - return false; - else - return true; -} -#elif defined(PCBX9D) || defined(PCBX9DP) || defined(PCBX9E) -bool isTrainerModeAvailable(int mode) -{ - if (IS_EXTERNAL_MODULE_ENABLED() && (mode == TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE || mode == TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE)) - return false; - else - return true; -} -#elif defined(PCBX7) || defined(PCBXLITES) || defined(PCBX9LITE) -bool isTrainerModeAvailable(int mode) -{ - if (IS_EXTERNAL_MODULE_ENABLED() && (mode == TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE || mode == TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE)) - return false; - else if (mode == TRAINER_MODE_MASTER_BATTERY_COMPARTMENT) - return false; -#if defined(BLUETOOTH) - else if (g_eeGeneral.bluetoothMode != BLUETOOTH_TRAINER && (mode == TRAINER_MODE_MASTER_BLUETOOTH || mode == TRAINER_MODE_SLAVE_BLUETOOTH)) - return false; -#endif - else - return true; -} -#elif defined(PCBXLITES) -bool isTrainerModeAvailable(int mode) -{ - if (mode == TRAINER_MODE_MASTER_TRAINER_JACK || mode == TRAINER_MODE_SLAVE) - return true; - else if (g_eeGeneral.bluetoothMode == BLUETOOTH_TRAINER && (mode == TRAINER_MODE_MASTER_BLUETOOTH || mode == TRAINER_MODE_SLAVE_BLUETOOTH)) - return true; - else - return false; -} -#elif defined(PCBXLITE) -bool isTrainerModeAvailable(int mode) -{ - if (g_eeGeneral.bluetoothMode == BLUETOOTH_TRAINER && (mode == TRAINER_MODE_MASTER_BLUETOOTH || mode == TRAINER_MODE_SLAVE_BLUETOOTH)) - return true; - else - return false; -} -#endif bool modelHasNotes() { @@ -803,7 +779,7 @@ int getFirstAvailable(int min, int max, IsValueAvailable isValueAvailable) // local strings const char STR_SUBTYPE_FLYSKY[] = "\004""Std\0""V9x9""V6x6""V912""CX20"; -const char STR_SUBTYPE_HUBSAN[] = "\005"" H107"" H301"" H501"; +const char STR_SUBTYPE_HUBSAN[] = "\004""H107""H301""H501"; const char STR_SUBTYPE_FRSKY[] = "\007""D16\0 ""D8\0 ""D16 8ch""V8\0 ""LBT(EU)""LBT 8ch"; const char STR_SUBTYPE_HISKY[] = "\005""Std\0 ""HK310"; const char STR_SUBTYPE_V2X2[] = "\006""Std\0 ""JXD506"; @@ -814,22 +790,24 @@ const char STR_SUBTYPE_SYMAX[] = "\003""Std""X5C"; const char STR_SUBTYPE_SLT[] = "\006""V1_6ch""V2_8ch""Q100\0 ""Q200\0 ""MR100\0"; const char STR_SUBTYPE_CX10[] = "\007""Green\0 ""Blue\0 ""DM007\0 ""-\0 ""JC3015a""JC3015b""MK33041"; const char STR_SUBTYPE_CG023[] = "\005""Std\0 ""YD829"; -const char STR_SUBTYPE_BAYANG[] = "\007"" Std\0 "" H8S3D\0"" X16 AH""IRDrone"" DHD D4"; -const char STR_SUBTYPE_MT99[] = "\006"" MT99\0"" H7\0 "" YZ\0 "" LS\0 "" FY805"; +const char STR_SUBTYPE_BAYANG[] = "\007""Std\0 ""H8S3D\0 ""X16 AH\0 ""IRDrone""DHD D4"; +const char STR_SUBTYPE_MT99[] = "\006""MT99\0 ""H7\0 ""YZ\0 ""LS\0 ""FY805"; const char STR_SUBTYPE_MJXQ[] = "\007""WLH08\0 ""X600\0 ""X800\0 ""H26D\0 ""E010\0 ""H26WH\0 ""Phoenix"; const char STR_SUBTYPE_FY326[] = "\005""Std\0 ""FY319"; -const char STR_SUBTYPE_HONTAI[] = "\007"" Std\0 ""JJRC X1"" X5C1\0 "" FQ_951"; +const char STR_SUBTYPE_HONTAI[] = "\007""Std\0 ""JJRC X1""X5C1\0 ""FQ_951"; const char STR_SUBTYPE_AFHDS2A[] = "\010""PWM,IBUS""PPM,IBUS""PWM,SBUS""PPM,SBUS"; const char STR_SUBTYPE_Q2X2[] = "\004""Q222""Q242""Q282"; const char STR_SUBTYPE_WK2x01[] = "\006""WK2801""WK2401""W6_5_1""W6_6_1""W6_HeL""W6_HeI"; const char STR_SUBTYPE_Q303[] = "\006""Std\0 ""CX35\0 ""CX10D\0""CX10WD"; const char STR_SUBTYPE_CABELL[] = "\007""V3\0 ""V3 Telm""-\0 ""-\0 ""-\0 ""-\0 ""F-Safe\0""Unbind\0"; const char STR_SUBTYPE_H83D[] = "\007""Std\0 ""H20H\0 ""H20Mini""H30Mini"; -const char STR_SUBTYPE_CORONA[] = "\006"" V1\0 "" V2\0 "" FD V3"; +const char STR_SUBTYPE_CORONA[] = "\005""V1\0 ""V2\0 ""FD V3"; const char STR_SUBTYPE_HITEC[] = "\007""Optima\0""Opt Hub""Minima\0"; -const char STR_SUBTYPE_BUGS_MINI[] = "\006"" Std\0 ""Bugs3H"; +const char STR_SUBTYPE_BUGS_MINI[] = "\006""Std\0 ""Bugs3H"; const char STR_SUBTYPE_E01X[] = "\005""E012\0""E015\0""E016H"; const char STR_SUBTYPE_GD00X[] = "\005""GD_V1""GD_V2"; +const char STR_SUBTYPE_REDPINE[] = "\004""Fast""Slow"; +const char STR_SUBTYPE_POTENSIC[] = "\003""A20""---"; const mm_protocol_definition multi_protocols[] = { @@ -851,7 +829,7 @@ const mm_protocol_definition multi_protocols[] = { {MODULE_SUBTYPE_MULTI_FY326, 1, false, STR_SUBTYPE_FY326, nullptr}, {MODULE_SUBTYPE_MULTI_SFHSS, 0, true, NO_SUBTYPE, STR_MULTI_RFTUNE}, {MODULE_SUBTYPE_MULTI_HONTAI, 3, false, STR_SUBTYPE_HONTAI, nullptr}, - {MODULE_SUBTYPE_MULTI_OLRS, 0, false, NO_SUBTYPE, STR_MULTI_RFPOWER}, + {MODULE_SUBTYPE_MULTI_OLRS, 0, false, NO_SUBTYPE, STR_RFPOWER}, {MODULE_SUBTYPE_MULTI_FS_AFHDS2A, 3, true, STR_SUBTYPE_AFHDS2A, STR_MULTI_SERVOFREQ}, {MODULE_SUBTYPE_MULTI_Q2X2, 2, false, STR_SUBTYPE_Q2X2, nullptr}, {MODULE_SUBTYPE_MULTI_WK_2X01, 5, false, STR_SUBTYPE_WK2x01, nullptr}, @@ -862,9 +840,11 @@ const mm_protocol_definition multi_protocols[] = { {MODULE_SUBTYPE_MULTI_HITEC, 2, false, STR_SUBTYPE_HITEC, STR_MULTI_RFTUNE}, {MODULE_SUBTYPE_MULTI_BUGS_MINI, 1, false, STR_SUBTYPE_BUGS_MINI, nullptr}, {MODULE_SUBTYPE_MULTI_E01X, 2, false, STR_SUBTYPE_E01X, nullptr}, + {MODULE_SUBTYPE_MULTI_V911S, 0, false, NO_SUBTYPE, STR_MULTI_RFTUNE}, {MODULE_SUBTYPE_MULTI_GD00X, 1, false, STR_SUBTYPE_GD00X, STR_MULTI_RFTUNE}, {MODULE_SUBTYPE_MULTI_KF606, 0, false, NO_SUBTYPE, STR_MULTI_RFTUNE}, - {MODULE_SUBTYPE_MULTI_V911S, 0, false, NO_SUBTYPE, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_REDPINE, 1, false, STR_SUBTYPE_REDPINE, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_POTENSIC, 1, false, STR_SUBTYPE_POTENSIC, nullptr}, {MM_RF_CUSTOM_SELECTED, 7, true, NO_SUBTYPE, STR_MULTI_OPTION}, // Sentinel and default for protocols not listed above (MM_RF_CUSTOM is 0xff) diff --git a/radio/src/gui/gui_common.h b/radio/src/gui/gui_common.h index a14d0f329..26367e882 100644 --- a/radio/src/gui/gui_common.h +++ b/radio/src/gui/gui_common.h @@ -23,6 +23,11 @@ #include "lcd.h" #include "keys.h" +#include "telemetry/telemetry_sensors.h" + +#define READONLY_ROW ((uint8_t)-1) +#define TITLE_ROW READONLY_ROW +#define HIDDEN_ROW ((uint8_t)-2) #if defined(ROTARY_ENCODER_NAVIGATION) #define CASE_EVT_ROTARY_LEFT case EVT_ROTARY_LEFT: @@ -56,7 +61,7 @@ bool isSwitchAvailableInTimers(int swtch); bool isR9MModeAvailable(int mode); bool isPxx2IsrmChannelsCountAllowed(int channels); bool isExternalModuleAvailable(int moduleType); -bool isInternalModuleAvailable(int module); +bool isInternalModuleAvailable(int moduleType); bool isRfProtocolAvailable(int protocol); bool isTelemetryProtocolAvailable(int protocol); bool isTrainerModeAvailable(int mode); @@ -90,8 +95,7 @@ void drawFlightMode(coord_t x, coord_t y, int8_t idx, LcdFlags att=0); swsrc_t checkIncDecMovedSwitch(swsrc_t val); -#include "telemetry/telemetry_sensors.h" -void drawValueWithUnit(coord_t x, coord_t y, int32_t val, uint8_t unit, LcdFlags flags); +void drawValueWithUnit(coord_t x, coord_t y, int val, uint8_t unit, LcdFlags flags); void drawCurveRef(coord_t x, coord_t y, CurveRef & curve, LcdFlags flags=0); void drawDate(coord_t x, coord_t y, TelemetryItem & telemetryItem, LcdFlags flags=0); void drawTelemScreenDate(coord_t x, coord_t y, source_t sensor, LcdFlags flags=0); @@ -117,51 +121,45 @@ void lcdDrawMMM(coord_t x, coord_t y, LcdFlags flags=0); // model_setup Defines that are used in all uis in the same way #define INTERNAL_MODULE_CHANNELS_ROWS IF_INTERNAL_MODULE_ON((uint8_t)1) #define EXTERNAL_MODULE_CHANNELS_ROWS IF_EXTERNAL_MODULE_ON((isModuleDSM2(EXTERNAL_MODULE) || isModuleCrossfire(EXTERNAL_MODULE) || isModuleSBUS(EXTERNAL_MODULE) || (isModuleMultimodule(EXTERNAL_MODULE) && g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true) != MODULE_SUBTYPE_MULTI_DSM2)) ? (uint8_t)0 : (uint8_t)1) - +#define EXTERNAL_MODULE_BIND_ROWS (isModuleXJTD8(EXTERNAL_MODULE) || isModuleSBUS(EXTERNAL_MODULE)) ? (uint8_t)1 : (isModulePPM(EXTERNAL_MODULE) || isModulePXX1(EXTERNAL_MODULE) || isModulePXX2(EXTERNAL_MODULE) || isModuleDSM2(EXTERNAL_MODULE) || isModuleMultimodule(EXTERNAL_MODULE)) ? (uint8_t)2 : HIDDEN_ROW #if defined(MULTIMODULE) -#define MULTIMODULE_STATUS_ROWS isModuleMultimodule(EXTERNAL_MODULE) ? TITLE_ROW : HIDDEN_ROW, (isModuleMultimodule(EXTERNAL_MODULE) && multiSyncStatus.isValid()) ? TITLE_ROW : HIDDEN_ROW, -#define MULTIMODULE_MODULE_ROWS isModuleMultimodule(EXTERNAL_MODULE) ? (uint8_t) 0 : HIDDEN_ROW, -#define MULTIMODULE_MODE_ROWS(x) (g_model.moduleData[x].multi.customProto) ? (uint8_t) 3 :MULTIMODULE_HAS_SUBTYPE(g_model.moduleData[x].getMultiProtocol(true)) ? (uint8_t)2 : (uint8_t)1 -#define MULTIMODULE_RFPROTO_ROWS(x) (g_model.moduleData[x].multi.customProto) ? (uint8_t) 1 :MULTIMODULE_HAS_SUBTYPE(g_model.moduleData[x].getMultiProtocol(true)) ? (uint8_t) 0 : HIDDEN_ROW -#define MULTIMODULE_SUBTYPE_ROWS(x) isModuleMultimodule(x) ? MULTIMODULE_RFPROTO_ROWS(x) : HIDDEN_ROW, -#define MULTIMODULE_HAS_SUBTYPE(x) (getMultiProtocolDefinition(x)->maxSubtype > 0) -#define MULTIMODULE_HASOPTIONS(x) (getMultiProtocolDefinition(x)->optionsstr != nullptr) -#define MULTI_MAX_RX_NUM(x) (g_model.moduleData[x].getMultiProtocol(true) == MODULE_SUBTYPE_MULTI_OLRS ? 4 : 15) -#define MULTIMODULE_HASFAILSAFE(x) (isModuleMultimodule(x) && multiModuleStatus.isValid() && multiModuleStatus.supportsFailsafe()) -#define MULTIMODULE_OPTIONS_ROW (isModuleMultimodule(EXTERNAL_MODULE) && MULTIMODULE_HASOPTIONS(g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true))) ? (uint8_t) 0: HIDDEN_ROW - // When using packed, the pointer in here end up not being aligned, which clang and gcc complain about // Keep the order of the fields that the so that the size stays small struct mm_protocol_definition { - uint8_t protocol; - uint8_t maxSubtype; - bool failsafe; - const char *subTypeString; - const char *optionsstr; + uint8_t protocol; + uint8_t maxSubtype; + bool failsafe; + const char *subTypeString; + const char *optionsstr; }; - const mm_protocol_definition *getMultiProtocolDefinition (uint8_t protocol); +#define MULTIMODULE_STATUS_ROWS isModuleMultimodule(EXTERNAL_MODULE) ? TITLE_ROW : HIDDEN_ROW, (isModuleMultimodule(EXTERNAL_MODULE) && multiSyncStatus.isValid()) ? TITLE_ROW : HIDDEN_ROW, +#define MULTIMODULE_MODULE_ROWS isModuleMultimodule(EXTERNAL_MODULE) ? (uint8_t) 0 : HIDDEN_ROW, +#define MULTIMODULE_MODE_ROWS(x) (g_model.moduleData[x].multi.customProto) ? (uint8_t) 3 :MULTIMODULE_HAS_SUBTYPE(g_model.moduleData[x].getMultiProtocol(true)) ? (uint8_t)2 : (uint8_t)1 +inline bool MULTIMODULE_HAS_SUBTYPE(uint8_t moduleIdx) +{ + return getMultiProtocolDefinition(moduleIdx)->maxSubtype > 0; +} +inline uint8_t MULTIMODULE_RFPROTO_COLUMNS(uint8_t moduleIdx) +{ + return (g_model.moduleData[moduleIdx].multi.customProto ? (uint8_t) 1 : MULTIMODULE_HAS_SUBTYPE(g_model.moduleData[moduleIdx].getMultiProtocol(true)) ? (uint8_t) 0 : HIDDEN_ROW); +} +#define MULTIMODULE_SUBTYPE_ROWS(x) isModuleMultimodule(x) ? MULTIMODULE_RFPROTO_COLUMNS(x) : HIDDEN_ROW, +#define MULTIMODULE_HASOPTIONS(x) (getMultiProtocolDefinition(x)->optionsstr != nullptr) +#define MULTIMODULE_OPTIONS_ROW (isModuleMultimodule(EXTERNAL_MODULE) && MULTIMODULE_HASOPTIONS(g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true))) ? (uint8_t) 0: HIDDEN_ROW + #else #define MULTIMODULE_STATUS_ROWS #define MULTIMODULE_MODULE_ROWS -#define MULTIMODULE_HASFAILSAFE(x) false #define MULTIMODULE_SUBTYPE_ROWS(x) #define MULTIMODULE_MODE_ROWS(x) (uint8_t)0 -#define MULTI_MAX_RX_NUM(x) 15 #define MULTIMODULE_OPTIONS_ROW HIDDEN_ROW #endif -#define MAX_RX_NUM(x) (isModuleDSM2(x) ? 20 : isModuleMultimodule(x) ? MULTI_MAX_RX_NUM(x) : 63) -#define IS_D8_RX(x) (g_model.moduleData[x].rfProtocol == MODULE_SUBTYPE_PXX1_ACCST_D8) -#define IS_R9M_OR_XJTD16(x) ((isModuleXJT(x) && g_model.moduleData[x].rfProtocol== MODULE_SUBTYPE_PXX1_ACCST_D16) || isModuleR9M(x)) - -#define FAILSAFE_ROWS(x) ((isModuleXJTVariant(x) && HAS_RF_PROTOCOL_FAILSAFE(g_model.moduleData[x].rfProtocol)) || MULTIMODULE_HASFAILSAFE(x) || isModuleR9M(x) || isModuleR9M2(x)) ? (g_model.moduleData[x].failsafeMode==FAILSAFE_CUSTOM ? (uint8_t)1 : (uint8_t)0) : HIDDEN_ROW - -#define EXTERNAL_MODULE_OPTION_ROW (isModuleR9M(EXTERNAL_MODULE) || isModuleSBUS(EXTERNAL_MODULE) ? TITLE_ROW : MULTIMODULE_OPTIONS_ROW) - -#define EXTERNAL_MODULE_POWER_ROW (isModuleMultimodule(EXTERNAL_MODULE) || isModuleR9M(EXTERNAL_MODULE)) ? (g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_R9M_LITE_PXX1 ? TITLE_ROW : (uint8_t) 0) : HIDDEN_ROW - +#define FAILSAFE_ROWS(x) isModuleFailsafeAvailable(x) ? (g_model.moduleData[x].failsafeMode==FAILSAFE_CUSTOM ? (uint8_t)1 : (uint8_t)0) : HIDDEN_ROW +#define EXTERNAL_MODULE_OPTION_ROW (isModuleR9MNonAccess(EXTERNAL_MODULE) || isModuleSBUS(EXTERNAL_MODULE) ? TITLE_ROW : MULTIMODULE_OPTIONS_ROW) +#define EXTERNAL_MODULE_POWER_ROW (isModuleMultimodule(EXTERNAL_MODULE) || isModuleR9MNonAccess(EXTERNAL_MODULE)) ? (isModuleR9MLiteNonPro(EXTERNAL_MODULE) ? (isModuleR9M_FCC_VARIANT(EXTERNAL_MODULE) ? READONLY_ROW : (uint8_t)0) : (uint8_t)0) : HIDDEN_ROW void editStickHardwareSettings(coord_t x, coord_t y, int idx, event_t event, LcdFlags flags); diff --git a/radio/src/io/frsky_firmware_update.cpp b/radio/src/io/frsky_firmware_update.cpp index 7fcedbd86..1e793c4b3 100644 --- a/radio/src/io/frsky_firmware_update.cpp +++ b/radio/src/io/frsky_firmware_update.cpp @@ -101,7 +101,7 @@ void FrskyDeviceFirmwareUpdate::startup() switch(module) { #if defined(INTMODULE_USART) case INTERNAL_MODULE: - intmoduleSerialStart(57600, true); + intmoduleSerialStart(INTMODULE_FLASH_BAUDRATE, true); break; #endif @@ -118,6 +118,37 @@ void FrskyDeviceFirmwareUpdate::startup() SPORT_UPDATE_POWER_ON(); } +bool FrskyDeviceFirmwareUpdate::readBuffer(uint8_t * buffer, uint8_t count, uint32_t timeout) +{ + watchdogSuspend(timeout); + + switch(module) { +#if defined(INTMODULE_USART) + case INTERNAL_MODULE: + { + uint32_t elapsed = 0; + uint8_t index = 0; + while (index < count && elapsed < timeout) { + if (intmoduleFifo.pop(buffer[index])) { + ++index; + } + else { + RTOS_WAIT_MS(1); + if (++elapsed == timeout) + return false; + } + } + break; + } +#endif + + default: + break; + } + + return true; +} + const uint8_t * FrskyDeviceFirmwareUpdate::readFullDuplexFrame(ModuleFifo & fifo, uint32_t timeout) { uint8_t len = 0; @@ -215,7 +246,7 @@ void FrskyDeviceFirmwareUpdate::sendFrame() uint8_t * ptr = outputTelemetryBuffer.data; *ptr++ = 0x7E; *ptr++ = 0xFF; - frame[7] = crc16(frame, 7); + frame[7] = crc16(CRC_1021, frame, 7); for (int i=0; i<8; i++) { if (frame[i] == 0x7E || frame[i] == 0x7D) { *ptr++ = 0x7D; @@ -259,16 +290,8 @@ const char * FrskyDeviceFirmwareUpdate::sendPowerOn() if (!IS_FRSKY_SPORT_PROTOCOL()) { return TR("Not responding", "Not S.Port 2"); } -#if defined(PCBX7) - if (IS_PCBREV_40()) { - return TR("Bottom pin no resp", "Bottom pin not responding"); - } - else { - return TR("Device pin no resp", "Device pin not responding"); - } -#else + return TR("Not responding", "Device not responding"); -#endif } const char * FrskyDeviceFirmwareUpdate::sendReqVersion() @@ -299,13 +322,68 @@ const char * FrskyDeviceFirmwareUpdate::uploadFile(const char * filename) const char * ext = getFileExtension(filename); if (ext && !strcasecmp(ext, UPDATE_FIRMWARE_EXT)) { - // FrSkyFirmwareInformation *information = (FrSkyFirmwareInformation *) buffer; + // FrSkyFirmwareInformation * information = (FrSkyFirmwareInformation *) buffer; if (f_read(&file, buffer, sizeof(FrSkyFirmwareInformation), &count) != FR_OK || count != sizeof(FrSkyFirmwareInformation)) { f_close(&file); return "Format error"; } } +#if defined(PCBHORUS) + uint8_t frame[8]; + + if (!readBuffer(frame, 8, 100) || frame[0] != 0x01) { + return TR("Not responding", "Device not responding"); + } + + intmoduleSendByte(0x81); + readBuffer(frame, 1, 100); + + if (!readBuffer(frame, 8, 100) || frame[0] != 0x02) { + return TR("Not responding", "Device not responding"); + } + + intmoduleSendByte(0x82); + readBuffer(frame, 1, 100); + + uint8_t index = 0; + while (1) { + drawProgressScreen(getBasename(filename), STR_WRITING, file.fptr, file.obj.objsize); + + if (f_read(&file, buffer, 1024, &count) != FR_OK) { + f_close(&file); + return "Error reading file"; + } + + if (!readBuffer(frame, 2, 100)) + return "Data refused"; + + if (frame[0] != 0x11 || frame[1] != index) + return "Wrong request"; + + if (count == 0) { + f_close(&file); + intmoduleSendByte(0xA1); + RTOS_WAIT_MS(50); + return nullptr; + } + + if (count < 1024) + memset(((uint8_t *)buffer) + count, 0, 1024 - count); + + intmoduleSendByte(frame[0] + 0x80); + intmoduleSendByte(frame[1]); + + uint16_t crc_16 = crc16(CRC_1189, (uint8_t *)buffer, 1024, crc16(CRC_1189, &frame[1], 1)); + for (unsigned i = 0; i < sizeof(buffer); i++) { + intmoduleSendByte(((uint8_t *)buffer)[i]); + } + intmoduleSendByte(crc_16 >> 8); + intmoduleSendByte(crc_16); + + index++; + } +#else RTOS_WAIT_MS(200); telemetryClearFifo(); @@ -323,7 +401,7 @@ const char * FrskyDeviceFirmwareUpdate::uploadFile(const char * filename) for (uint32_t i=0; i> 2; // 32 bit word offset into buffer @@ -341,43 +419,66 @@ const char * FrskyDeviceFirmwareUpdate::uploadFile(const char * filename) return nullptr; } } +#endif } const char * FrskyDeviceFirmwareUpdate::endTransfer() { if (!waitState(SPORT_DATA_REQ, 2000)) - return "Device refused data"; + return "Data refused"; startFrame(PRIM_DATA_EOF); sendFrame(); if (!waitState(SPORT_COMPLETE, 2000)) { - return "Device rejected firmware"; + return "Firmware rejected"; } return nullptr; } -void FrskyDeviceFirmwareUpdate::flashFirmware(const char * filename) +const char * FrskyDeviceFirmwareUpdate::doFlashFirmware(const char * filename) +{ + const char * result; + +#if defined(PCBHORUS) + if (module == INTERNAL_MODULE) { + intmoduleSerialStart(38400, true); + GPIO_SetBits(INTMODULE_BOOTCMD_GPIO, INTMODULE_BOOTCMD_GPIO_PIN); + result = uploadFile(filename); + GPIO_ResetBits(INTMODULE_BOOTCMD_GPIO, INTMODULE_BOOTCMD_GPIO_PIN); + return result; + } +#endif + + result = sendPowerOn(); + if (!result) result = sendReqVersion(); + if (!result) result = uploadFile(filename); + if (!result) result = endTransfer(); + + return result; +} + +const char * FrskyDeviceFirmwareUpdate::flashFirmware(const char * filename) { pausePulses(); +#if defined(HARDWARE_INTERNAL_MODULE) uint8_t intPwr = IS_INTERNAL_MODULE_ON(); + INTERNAL_MODULE_OFF(); +#endif + uint8_t extPwr = IS_EXTERNAL_MODULE_ON(); + EXTERNAL_MODULE_OFF(); + + SPORT_UPDATE_POWER_OFF(); drawProgressScreen(getBasename(filename), STR_DEVICE_RESET, 0, 0); - INTERNAL_MODULE_OFF(); - EXTERNAL_MODULE_OFF(); - SPORT_UPDATE_POWER_OFF(); - /* wait 2s off */ watchdogSuspend(2000); RTOS_WAIT_MS(2000); startup(); - const char * result = sendPowerOn(); - if (!result) result = sendReqVersion(); - if (!result) result = uploadFile(filename); - if (!result) result = endTransfer(); + const char * result = doFlashFirmware(filename); AUDIO_PLAY(AU_SPECIAL_SOUND_BEEP1 ); BACKLIGHT_ENABLE(); @@ -399,17 +500,22 @@ void FrskyDeviceFirmwareUpdate::flashFirmware(const char * filename) RTOS_WAIT_MS(2000); telemetryClearFifo(); +#if defined(HARDWARE_INTERNAL_MODULE) if (intPwr) { INTERNAL_MODULE_ON(); - setupPulses(INTERNAL_MODULE); + setupPulsesInternalModule(); } +#endif + if (extPwr) { EXTERNAL_MODULE_ON(); - setupPulses(EXTERNAL_MODULE); + setupPulsesExternalModule(); } state = SPORT_IDLE; resumePulses(); + + return result; } #define CHIP_FIRMWARE_UPDATE_TIMEOUT 20000 /* 20s */ @@ -446,8 +552,6 @@ const char * FrskyChipFirmwareUpdate::waitAnswer(uint8_t & status) const char * FrskyChipFirmwareUpdate::startBootloader() { - telemetryPortSetDirectionOutput(); - sportSendByte(0x01); for (uint8_t i = 0; i < 30; i++) @@ -483,8 +587,6 @@ void FrskyChipFirmwareUpdate::sendByte(uint8_t byte, bool crcFlag) const char * FrskyChipFirmwareUpdate::sendUpgradeCommand(char command, uint32_t packetsCount) { - telemetryPortSetDirectionOutput(); - crc = 0; // Head @@ -526,8 +628,6 @@ const char * FrskyChipFirmwareUpdate::sendUpgradeCommand(char command, uint32_t const char * FrskyChipFirmwareUpdate::sendUpgradeData(uint32_t index, uint8_t * data) { - telemetryPortSetDirectionOutput(); - crc = 0; // Head @@ -614,28 +714,33 @@ const char * FrskyChipFirmwareUpdate::doFlashFirmware(const char * filename) return sendUpgradeCommand('E', packetsCount); } -void FrskyChipFirmwareUpdate::flashFirmware(const char * filename) +const char * FrskyChipFirmwareUpdate::flashFirmware(const char * filename, bool wait) { drawProgressScreen(getBasename(filename), STR_DEVICE_RESET, 0, 0); pausePulses(); +#if defined(HARDWARE_INTERNAL_MODULE) uint8_t intPwr = IS_INTERNAL_MODULE_ON(); - uint8_t extPwr = IS_EXTERNAL_MODULE_ON(); - INTERNAL_MODULE_OFF(); +#endif + + uint8_t extPwr = IS_EXTERNAL_MODULE_ON(); EXTERNAL_MODULE_OFF(); + SPORT_UPDATE_POWER_OFF(); - /* wait 2s off */ - watchdogSuspend(2000); - RTOS_WAIT_MS(2000); + if (wait) { + /* wait 2s off */ + watchdogSuspend(2000); + RTOS_WAIT_MS(2000); + } telemetryInit(PROTOCOL_TELEMETRY_FRSKY_SPORT); const char * result = doFlashFirmware(filename); - AUDIO_PLAY(AU_SPECIAL_SOUND_BEEP1 ); + AUDIO_PLAY(AU_SPECIAL_SOUND_BEEP1); BACKLIGHT_ENABLE(); if (result) { @@ -646,22 +751,23 @@ void FrskyChipFirmwareUpdate::flashFirmware(const char * filename) POPUP_INFORMATION(STR_FIRMWARE_UPDATE_SUCCESS); } - INTERNAL_MODULE_OFF(); - EXTERNAL_MODULE_OFF(); - SPORT_UPDATE_POWER_OFF(); - /* wait 2s off */ watchdogSuspend(2000); RTOS_WAIT_MS(2000); +#if defined(HARDWARE_INTERNAL_MODULE) if (intPwr) { INTERNAL_MODULE_ON(); - setupPulses(INTERNAL_MODULE); + setupPulsesInternalModule(); } +#endif + if (extPwr) { EXTERNAL_MODULE_ON(); - setupPulses(EXTERNAL_MODULE); + setupPulsesExternalModule(); } resumePulses(); + + return result; } diff --git a/radio/src/io/frsky_firmware_update.h b/radio/src/io/frsky_firmware_update.h index f0724a6db..e23b5cb98 100644 --- a/radio/src/io/frsky_firmware_update.h +++ b/radio/src/io/frsky_firmware_update.h @@ -22,6 +22,7 @@ #define _FRSKY_FIRMWARE_UPDATE_H_ #include "dataconstants.h" +#include "definitions.h" #include "frsky_pxx2.h" enum FrskyFirmwareProductFamily { @@ -65,7 +66,7 @@ class FrskyDeviceFirmwareUpdate { module(module) { } - void flashFirmware(const char * filename); + const char * flashFirmware(const char * filename); protected: uint8_t state = SPORT_IDLE; @@ -78,12 +79,14 @@ class FrskyDeviceFirmwareUpdate { void startFrame(uint8_t command); void sendFrame(); + bool readBuffer(uint8_t * buffer, uint8_t count, uint32_t timeout); const uint8_t * readFullDuplexFrame(ModuleFifo & fifo, uint32_t timeout); const uint8_t * readHalfDuplexFrame(uint32_t timeout); const uint8_t * readFrame(uint32_t timeout); bool waitState(State state, uint32_t timeout); void processFrame(const uint8_t * frame); + const char * doFlashFirmware(const char * filename); const char * sendPowerOn(); const char * sendReqVersion(); const char * uploadFile(const char * filename); @@ -96,7 +99,7 @@ class FrskyChipFirmwareUpdate { { } - void flashFirmware(const char * filename); + const char * flashFirmware(const char * filename, bool wait = true); protected: uint8_t crc; diff --git a/radio/src/keys.cpp b/radio/src/keys.cpp index 227259c4b..0fc7999dc 100644 --- a/radio/src/keys.cpp +++ b/radio/src/keys.cpp @@ -85,6 +85,7 @@ void Key::input(bool val) m_cnt = 0; } break; + case KSTATE_START: // TRACE("key %d FIRST", key()); putEvent(EVT_KEY_FIRST(key())); diff --git a/radio/src/logs.cpp b/radio/src/logs.cpp index cc5de96bb..822f5e7b4 100644 --- a/radio/src/logs.cpp +++ b/radio/src/logs.cpp @@ -22,20 +22,21 @@ #include "ff.h" FIL g_oLogFile __DMA; -const char * g_logError = NULL; +const char * g_logError = nullptr; uint8_t logDelay; void writeHeader(); #if defined(PCBTARANIS) || defined(PCBHORUS) - #define GET_2POS_STATE(sw) (switchState(SW_ ## sw ## 0) ? -1 : 1) + int getSwitchState(uint8_t swtch) { + int value = getValue(MIXSRC_FIRST_SWITCH + swtch); + return (value == 0) ? 0 : (value < 0) ? -1 : +1; + } #else #define GET_2POS_STATE(sw) (switchState(SW_ ## sw) ? -1 : 1) + #define GET_3POS_STATE(sw) (switchState(SW_ ## sw ## 0) ? -1 : (switchState(SW_ ## sw ## 2) ? 1 : 0)) #endif -#define GET_3POS_STATE(sw) (switchState(SW_ ## sw ## 0) ? -1 : (switchState(SW_ ## sw ## 2) ? 1 : 0)) - - void logsInit() { memset(&g_oLogFile, 0, sizeof(g_oLogFile)); @@ -108,7 +109,7 @@ const char * logsOpen() writeHeader(); } - return NULL; + return nullptr; } tmr10ms_t lastLogTime = 0; @@ -166,18 +167,18 @@ void writeHeader() } f_putc(',', &g_oLogFile); } -#if defined(PCBX7) - #define STR_SWITCHES_LOG_HEADER "SA,SB,SC,SD,SF,SH" -#elif defined(PCBXLITE) - #define STR_SWITCHES_LOG_HEADER "SA,SB,SC,SD" -#elif defined(PCBXLITES) - #define STR_SWITCHES_LOG_HEADER "SA,SB,SC,SD,SE,SF" -#elif defined(PCBX9LITE) - #define STR_SWITCHES_LOG_HEADER "SA,SB,SC,SE,SF" -#else - #define STR_SWITCHES_LOG_HEADER "SA,SB,SC,SD,SE,SF,SG,SH" -#endif - f_puts(STR_SWITCHES_LOG_HEADER ",LSW,", &g_oLogFile); + + for (uint8_t i=0; i 0) { tmr10ms_t tmr10ms = get_tmr10ms(); @@ -205,7 +206,7 @@ void logsWrite() if (!g_oLogFile.obj.fs) { const char * result = logsOpen(); - if (result != NULL) { + if (result) { if (result != error_displayed) { error_displayed = result; POPUP_WARNING(result); @@ -229,7 +230,6 @@ void logsWrite() #endif #if defined(TELEMETRY_FRSKY) - for (int i=0; i 1 - { "FILL_WHITE", FILL_WHITE }, - { "GREY_DEFAULT", GREY_DEFAULT }, + +// Virtual Page Next/Previous +#if defined(KEYS_GPIO_REG_PGUP) && defined(KEYS_GPIO_REG_PGDN) + { "EVT_VIRTUAL_PREVIOUS_PAGE", EVT_KEY_FIRST(KEY_PGUP) }, + { "EVT_VIRTUAL_NEXT_PAGE", EVT_KEY_FIRST(KEY_PGDN) }, +#elif defined(KEYS_GPIO_REG_PGDN) + { "EVT_VIRTUAL_PREVIOUS_PAGE", EVT_KEY_LONG(KEY_PGDN) }, + { "EVT_VIRTUAL_NEXT_PAGE", EVT_KEY_BREAK(KEY_PGDN) }, +#elif defined(KEYS_GPIO_REG_UP) && defined(KEYS_GPIO_REG_DOWN) + { "EVT_VIRTUAL_PREVIOUS_PAGE", EVT_KEY_LONG(KEY_UP) }, + { "EVT_VIRTUAL_NEXT_PAGE", EVT_KEY_LONG(KEY_DOWN) }, +#elif defined(KEYS_GPIO_REG_PAGE) + { "EVT_VIRTUAL_PREVIOUS_PAGE", EVT_KEY_LONG(KEY_PAGE) }, + { "EVT_VIRTUAL_NEXT_PAGE", EVT_KEY_BREAK(KEY_PAGE) }, #endif - { "FORCE", FORCE }, - { "ERASE", ERASE }, - { "ROUND", ROUND }, + +// Virtual exit + { "EVT_VIRTUAL_EXIT", EVT_KEY_BREAK(KEY_EXIT) }, + +// Virtual enter +#if defined(KEYS_GPIO_REG_ENTER) + { "EVT_VIRTUAL_ENTER", EVT_KEY_BREAK(KEY_ENTER) }, + { "EVT_VIRTUAL_ENTER_LONG", EVT_KEY_LONG(KEY_ENTER) }, #endif - { "EVT_ENTER_BREAK", EVT_KEY_BREAK(KEY_ENTER) }, - { "EVT_ENTER_LONG", EVT_KEY_LONG(KEY_ENTER) }, - { "EVT_EXIT_BREAK", EVT_KEY_BREAK(KEY_EXIT) }, + +// Virtual menu +#if defined(KEYS_GPIO_REG_MENU) + { "EVT_VIRTUAL_MENU", EVT_KEY_BREAK(KEY_MENU) }, + { "EVT_VIRTUAL_MENU_LONG", EVT_KEY_LONG(KEY_MENU) }, +#elif defined(KEYS_GPIO_REG_SHIFT) + { "EVT_VIRTUAL_MENU", EVT_KEY_BREAK(KEY_SHIFT) }, + { "EVT_VIRTUAL_MENU_LONG", EVT_KEY_LONG(KEY_SHIFT) }, +#endif + +// Virtual generic plus-next-right minus-previous-left #if defined(ROTARY_ENCODER_NAVIGATION) - { "EVT_ROT_BREAK", EVT_KEY_BREAK(KEY_ENTER) }, - { "EVT_ROT_LONG", EVT_KEY_LONG(KEY_ENTER) }, + { "EVT_VIRTUAL_NEXT", EVT_ROTARY_RIGHT}, + { "EVT_VIRTUAL_PREVIOUS", EVT_ROTARY_LEFT }, +#elif defined(KEYS_GPIO_REG_RIGHT) && defined(KEYS_GPIO_REG_LEFT) + { "EVT_VIRTUAL_NEXT", EVT_KEY_FIRST(KEY_RIGHT) }, + { "EVT_VIRTUAL_NEXT_REPT", EVT_KEY_REPT(KEY_RIGHT) }, + { "EVT_VIRTUAL_PREVIOUS", EVT_KEY_FIRST(KEY_LEFT) }, + { "EVT_VIRTUAL_PREVIOUS_REPT", EVT_KEY_REPT(KEY_LEFT) }, +#elif defined(KEYS_GPIO_REG_PLUS) && defined(KEYS_GPIO_REG_MINUS) + { "EVT_VIRTUAL_NEXT", EVT_KEY_FIRST(KEY_PLUS) }, + { "EVT_VIRTUAL_NEXT_REPT", EVT_KEY_REPT(KEY_PLUS) }, + { "EVT_VIRTUAL_PREVIOUS", EVT_KEY_FIRST(KEY_MINUS) }, + { "EVT_VIRTUAL_PREVIOUS_REPT", EVT_KEY_REPT(KEY_MINUS) }, +#endif + +#if defined(KEYS_GPIO_REG_EXIT) + { "EVT_EXIT_BREAK", EVT_KEY_BREAK(KEY_EXIT) }, +#endif + +#if defined(KEYS_GPIO_REG_ENTER) + KEY_EVENTS(ENTER, KEY_ENTER), +#endif + +#if defined(KEYS_GPIO_REG_MENU) + KEY_EVENTS(MENU, KEY_MENU), +#endif + +#if defined(KEYS_GPIO_REG_RIGHT) && defined(NAVIGATION_HORUS) + KEY_EVENTS(TELEM, KEY_TELEM), +#elif defined(KEYS_GPIO_REG_RIGHT) + KEY_EVENTS(RIGHT, KEY_RIGHT), +#endif + +#if defined(KEYS_GPIO_REG_UP) && defined(NAVIGATION_HORUS) + KEY_EVENTS(MODEL, KEY_MODEL), +#elif defined(KEYS_GPIO_REG_UP) + KEY_EVENTS(UP, KEY_UP), +#endif + +#if defined(KEYS_GPIO_REG_LEFT) && defined(NAVIGATION_HORUS) + KEY_EVENTS(SYS, KEY_RADIO), +#elif defined(KEYS_GPIO_REG_LEFT) + KEY_EVENTS(LEFT, KEY_LEFT), +#endif + +#if defined(KEYS_GPIO_REG_DOWN) && defined(NAVIGATION_HORUS) + { "EVT_RTN_FIRST", EVT_KEY_BREAK(KEY_EXIT) }, +#else + KEY_EVENTS(DOWN, KEY_DOWN), +#endif + +#if defined(KEYS_GPIO_REG_PGUP) + KEY_EVENTS(PAGEUP, KEY_PGUP), +#endif + +#if defined(KEYS_GPIO_REG_PGDN) + KEY_EVENTS(PAGEDN, KEY_PGDN), +#endif + +#if defined(KEYS_GPIO_REG_PAGE) + KEY_EVENTS(PAGE, KEY_PAGE), +#endif + +#if defined(KEYS_GPIO_REG_SHIFT) + KEY_EVENTS(SHIFT, KEY_SHIFT), +#endif + +#if defined(KEYS_GPIO_REG_PLUS) + KEY_EVENTS(PLUS, KEY_PLUS), +#endif + +#if defined(KEYS_GPIO_REG_MINUS) + KEY_EVENTS(MINUS, KEY_MINUS), +#endif + +#if defined(ROTARY_ENCODER_NAVIGATION) + KEY_EVENTS(ROT, KEY_ENTER), { "EVT_ROT_LEFT", EVT_ROTARY_LEFT }, { "EVT_ROT_RIGHT", EVT_ROTARY_RIGHT }, #endif + +#if LCD_DEPTH > 1 && !defined(COLORLCD) + { "FILL_WHITE", FILL_WHITE }, + { "GREY_DEFAULT", GREY_DEFAULT }, +#endif + +#if LCD_W <= 212 + { "FORCE", FORCE }, + { "ERASE", ERASE }, + { "ROUND", ROUND }, +#endif + { "SOLID", SOLID }, { "DOTTED", DOTTED }, { "LCD_W", LCD_W }, diff --git a/radio/src/lua/api_model.cpp b/radio/src/lua/api_model.cpp index 481bbf4b8..31ad730d1 100644 --- a/radio/src/lua/api_model.cpp +++ b/radio/src/lua/api_model.cpp @@ -335,8 +335,9 @@ Return input data for given input and line number * `switch` (number) input switch index * `curveType` (number) curve type (function, expo, custom curve) * `curveValue` (number) curve index + * `carryTrim` (boolean) input trims applied -@status current Introduced in 2.0.0, curveType/curveValue added in 2.3 +@status current Introduced in 2.0.0, curveType/curveValue/carryTrim added in 2.3 */ static int luaModelGetInput(lua_State *L) { @@ -354,6 +355,7 @@ static int luaModelGetInput(lua_State *L) lua_pushtableinteger(L, "switch", expo->swtch); lua_pushtableinteger(L, "curveType", expo->curve.type); lua_pushtableinteger(L, "curveValue", expo->curve.value); + lua_pushtableinteger(L, "carryTrim", expo->carryTrim); } else { lua_pushnil(L); @@ -372,7 +374,7 @@ Insert an Input at specified line @param value (table) input data, see model.getInput() -@status current Introduced in 2.0.0, curveType/curveValue added in 2.3 +@status current Introduced in 2.0.0, curveType/curveValue/carryTrim added in 2.3 */ static int luaModelInsertInput(lua_State *L) { @@ -413,6 +415,9 @@ static int luaModelInsertInput(lua_State *L) else if (!strcmp(key, "curveValue")) { expo->curve.value = luaL_checkinteger(L, -1); } + else if (!strcmp(key, "carryTrim")) { + expo->carryTrim = lua_toboolean(L, -1); + } } } diff --git a/radio/src/main.cpp b/radio/src/main.cpp index c69eddac5..21fdc4246 100644 --- a/radio/src/main.cpp +++ b/radio/src/main.cpp @@ -184,14 +184,11 @@ void checkEeprom() void checkBatteryAlarms() { // TRACE("checkBatteryAlarms()"); - if (IS_TXBATT_WARNING() && g_vbat100mV>50) { + if (IS_TXBATT_WARNING()) { AUDIO_TX_BATTERY_LOW(); // TRACE("checkBatteryAlarms(): battery low"); } #if defined(PCBSKY9X) - else if (g_eeGeneral.temperatureWarn && getTemperature() >= g_eeGeneral.temperatureWarn) { - AUDIO_TX_TEMP_HIGH(); - } else if (g_eeGeneral.mAhWarn && (g_eeGeneral.mAhUsed + Current_used * (488 + g_eeGeneral.txCurrentCalibration)/8192/36) / 500 >= g_eeGeneral.mAhWarn) { // TODO move calculation into board file AUDIO_TX_MAH_HIGH(); } @@ -544,7 +541,7 @@ void perMain() setTopSecondTimer(g_eeGeneral.globalTimer + sessionTimer); setTopRssi(TELEMETRY_RSSI()); setTopBatteryValue(g_vbat100mV); - setTopBatteryState(GET_TXBATT_BARS(), IS_TXBATT_WARNING()); + setTopBatteryState(GET_TXBATT_BARS(10), IS_TXBATT_WARNING()); toplcdRefreshEnd(); #endif diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h index aefdbd371..977cc58c9 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -80,23 +80,7 @@ #define MODEL_GVAR_MAX(idx) (CFN_GVAR_CST_MAX - g_model.gvars[idx].max) #if defined(PCBTARANIS) || defined(PCBHORUS) - enum SwitchConfig { - SWITCH_NONE, - SWITCH_TOGGLE, - SWITCH_2POS, - SWITCH_3POS, - }; - enum PotConfig { - POT_NONE, - POT_WITH_DETENT, - POT_MULTIPOS_SWITCH, - POT_WITHOUT_DETENT - }; - enum SliderConfig { - SLIDER_NONE, - SLIDER_WITH_DETENT, - }; - #define SWITCH_CONFIG(x) (bfGet(g_eeGeneral.switchConfig, 2*(x), 2)) + #define SWITCH_CONFIG(x) (bfGet(g_eeGeneral.switchConfig, 2*(x), 2)) #define SWITCH_EXISTS(x) (SWITCH_CONFIG(x) != SWITCH_NONE) #define IS_CONFIG_3POS(x) (SWITCH_CONFIG(x) == SWITCH_3POS) #define IS_CONFIG_TOGGLE(x) (SWITCH_CONFIG(x) == SWITCH_TOGGLE) diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 598a531bf..1a2033451 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -18,6 +18,7 @@ * GNU General Public License for more details. */ +#include #include "opentx.h" RadioData g_eeGeneral; @@ -57,9 +58,14 @@ const uint8_t bchout_ar[] = { 0x87, 0x8D, 0x93, 0x9C, 0xB1, 0xB4, 0xC6, 0xC9, 0xD2, 0xD8, 0xE1, 0xE4 }; -uint8_t channel_order(uint8_t x) +uint8_t channelOrder(uint8_t setup, uint8_t x) { - return ( ((*(bchout_ar + g_eeGeneral.templateSetup) >> (6-(x-1) * 2)) & 3 ) + 1 ); + return ((*(bchout_ar + setup) >> (6 - (x - 1) * 2)) & 3) + 1; +} + +uint8_t channelOrder(uint8_t x) +{ + return channelOrder(g_eeGeneral.templateSetup, x); } /* @@ -82,6 +88,25 @@ void watchdogSuspend(uint32_t timeout) watchdogTimeout = timeout; } +#if defined(DEBUG_LATENCY) +void toggleLatencySwitch() +{ + latencyToggleSwitch ^= 1; + +#if defined(PCBHORUS) + if (latencyToggleSwitch) + GPIO_ResetBits(EXTMODULE_TX_GPIO, EXTMODULE_TX_GPIO_PIN); + else + GPIO_SetBits(EXTMODULE_TX_GPIO, EXTMODULE_TX_GPIO_PIN); +#else + if (latencyToggleSwitch) + sportUpdatePowerOn(); + else + sportUpdatePowerOff(); +#endif +} +#endif + void per10ms() { g_tmr10ms++; @@ -105,6 +130,14 @@ void per10ms() else trimsDisplayMask = 0; +#if defined(DEBUG_LATENCY_END_TO_END) + static tmr10ms_t lastLatencyToggle = 0; + if (g_tmr10ms - lastLatencyToggle == 10) { + lastLatencyToggle = g_tmr10ms; + toggleLatencySwitch(); + } +#endif + #if defined(RTCLOCK) /* Update global Date/Time every 100 per10ms cycles */ if (++g_ms100 == 100) { @@ -224,47 +257,37 @@ void memswap(void * a, void * b, uint8_t size) } } +#if defined(PXX2) +void setDefaultOwnerId() +{ + for (uint8_t i = 0; i < PXX2_LEN_REGISTRATION_ID; i++) { + g_eeGeneral.ownerRegistrationID[i] = (cpu_uid[1 + i] & 0x3f) - 26; + } +} +#endif + void generalDefault() { memclear(&g_eeGeneral, sizeof(g_eeGeneral)); g_eeGeneral.version = EEPROM_VER; g_eeGeneral.variant = EEPROM_VARIANT; -#if !defined(PCBHORUS) +#if defined(PCBHORUS) + g_eeGeneral.blOffBright = 20; +#else g_eeGeneral.contrast = LCD_CONTRAST_DEFAULT; #endif -#if defined(PCBHORUS) - #if PCBREV >= 13 - g_eeGeneral.potsConfig = 0x1B; // S1 = pot, 6P = multipos, S2 = pot with detent - #else - g_eeGeneral.potsConfig = 0x19; // S1 = pot without detent, 6P = multipos, S2 = pot with detent - #endif - g_eeGeneral.slidersConfig = 0x0f; // 4 sliders - g_eeGeneral.blOffBright = 20; -#elif defined(PCBXLITE) - g_eeGeneral.potsConfig = 0x0F; // S1 and S2 = pot without detent -#elif defined(PCBX7) - g_eeGeneral.potsConfig = (POT_WITHOUT_DETENT << 0) + (POT_WITH_DETENT << 2); // S1 = pot without detent, S2 = pot with detent -#elif defined(PCBX9LITE) - g_eeGeneral.potsConfig = (POT_WITH_DETENT << 0); // S1 = pot with detent -#elif defined(PCBTARANIS) - g_eeGeneral.potsConfig = 0x05; // S1 and S2 = pots with detent - g_eeGeneral.slidersConfig = 0x03; // LS and RS = sliders with detent +#if defined(DEFAULT_POTS_CONFIG) + g_eeGeneral.potsConfig = DEFAULT_POTS_CONFIG; #endif -#if defined(PCBXLITES) - g_eeGeneral.switchConfig = (SWITCH_TOGGLE << 10) + (SWITCH_TOGGLE << 8) + (SWITCH_2POS << 6) + (SWITCH_2POS << 4) + (SWITCH_3POS << 2) + (SWITCH_3POS << 0); -#elif defined(PCBXLITE) - g_eeGeneral.switchConfig = (SWITCH_2POS << 6) + (SWITCH_2POS << 4) + (SWITCH_3POS << 2) + (SWITCH_3POS << 0); -#elif defined(RADIO_X7) - g_eeGeneral.switchConfig = 0x000006ff; // 4x3POS, 1x2POS, 1xTOGGLE -#elif defined(RADIO_T12) - g_eeGeneral.switchConfig = (SWITCH_2POS << 10) + (SWITCH_2POS << 8) + (SWITCH_3POS << 6) + (SWITCH_3POS << 4) + (SWITCH_3POS << 2) + (SWITCH_3POS << 0); -#elif defined(PCBX9LITE) - g_eeGeneral.switchConfig = (SWITCH_TOGGLE << 8) + (SWITCH_2POS << 6) + (SWITCH_3POS << 4) + (SWITCH_3POS << 2) + (SWITCH_3POS << 0); -#elif defined(PCBTARANIS) || defined(PCBHORUS) - g_eeGeneral.switchConfig = 0x00007bff; // 6x3POS, 1x2POS, 1xTOGGLE +#if defined(DEFAULT_SWITCH_CONFIG) + g_eeGeneral.switchConfig = DEFAULT_SWITCH_CONFIG; +#endif + +#if defined(DEFAULT_SLIDERS_CONFIG) + g_eeGeneral.slidersConfig = DEFAULT_SLIDERS_CONFIG; #endif // vBatWarn is voltage in 100mV, vBatMin is in 100mV but with -9V offset, vBatMax has a -12V offset @@ -293,7 +316,7 @@ void generalDefault() for (int i=0; igetName()); theme->init(); #endif #if defined(PXX2) - for (uint8_t i=0; isrcRaw = MIXSRC_Rud - 1 + stick_index; expo->curve.type = CURVE_REF_EXPO; @@ -377,7 +398,7 @@ void applyDefaultTemplate() #if defined(EEPROM) void checkModelIdUnique(uint8_t index, uint8_t module) { - if (isModulePXX(module) && IS_D8_RX(module)) + if (isModuleXJTD8(module)) return; uint8_t modelId = g_model.header.modelId[module]; @@ -447,7 +468,7 @@ uint8_t findNextUnusedModelId(uint8_t index, uint8_t module) uint8_t new_id = 1; uint8_t tst_mask = 1; - for (;new_id < MAX_RX_NUM(module); new_id++) { + for (;new_id < getMaxRxNum(module); new_id++) { if (!(usedModelIds[new_id >> 3] & tst_mask)) { // found free ID return new_id; @@ -837,13 +858,25 @@ void checkSDVersion() } #endif +#if defined(STM32) +static void checkRTCBattery() +{ + if (isVBatBridgeEnabled()) { + if (getRTCBatteryVoltage() < 200) { + ALERT("BATTERY", STR_WARN_RTC_BATTERY_LOW, AU_ERROR); + } + disableVBatBridge(); + } +} +#endif + #if defined(PCBTARANIS) || defined(PCBHORUS) void checkFailsafe() { for (int i=0; iNUM_POTS+NUM_SLIDERS)) ? THR_STICK : g_model.thrTraceSrc+NUM_STICKS-1; + if (g_model.disableThrottleWarning) { + return false; + } + // throttle channel is either the stick according stick mode (already handled in evalInputs) // or P1 to P3; // in case an output channel is choosen as throttle source (thrTraceSrc>NUM_POTS+NUM_SLIDERS) we assume the throttle stick is the input // no other information available at the moment, and good enough to my option (otherwise too much exceptions...) - - if (g_model.disableThrottleWarning) { - return; - } + uint8_t thrchn = ((g_model.thrTraceSrc==0) || (g_model.thrTraceSrc>NUM_POTS+NUM_SLIDERS)) ? THR_STICK : g_model.thrTraceSrc+NUM_STICKS-1; GET_ADC_IF_MIXER_NOT_RUNNING(); - evalInputs(e_perout_mode_notrainer); // let do evalInputs do the job int16_t v = calibratedAnalogs[thrchn]; - if (g_model.thrTraceSrc && g_model.throttleReversed) { //TODO : proper review of THR source definition and handling + if (g_model.thrTraceSrc && g_model.throttleReversed) { // TODO : proper review of THR source definition and handling v = -v; } - if (v <= THRCHK_DEADBAND-1024) { - return; // prevent warning if throttle input OK + return v > THRCHK_DEADBAND - 1024; +} + +void checkThrottleStick() +{ + if (!isThrottleWarningAlertNeeded()) { + return; } // first - display warning; also deletes inputs if any have been before @@ -938,26 +981,20 @@ void checkTHR() bool refresh = false; #endif - while (1) { - - GET_ADC_IF_MIXER_NOT_RUNNING(); - - evalInputs(e_perout_mode_notrainer); // let do evalInputs do the job - - v = calibratedAnalogs[thrchn]; - if (g_model.thrTraceSrc && g_model.throttleReversed) { //TODO : proper review of THR source definition and handling - v = -v; + while (!getEvent()) { + if (!isThrottleWarningAlertNeeded()) { + return; } #if defined(PWR_BUTTON_PRESS) - uint32_t pwr_check = pwrCheck(); - if (pwr_check == e_power_off) { + uint32_t power = pwrCheck(); + if (power == e_power_off) { break; } - else if (pwr_check == e_power_press) { + else if (power == e_power_press) { refresh = true; } - else if (pwr_check == e_power_on && refresh) { + else if (power == e_power_on && refresh) { RAISE_ALERT(STR_THROTTLEWARN, STR_THROTTLENOTIDLE, STR_PRESSANYKEYTOSKIP, AU_NONE); refresh = false; } @@ -967,10 +1004,6 @@ void checkTHR() } #endif - if (keyDown() || v <= THRCHK_DEADBAND-1024) { - break; - } - doLoopCommonActions(); wdt_reset(); @@ -1344,15 +1377,11 @@ void doMixerCalculations() tmr10ms_t tmr10ms = get_tmr10ms(); -#if defined(DEBUG_LATENCY) +#if defined(DEBUG_LATENCY_MIXER_RF) || defined(DEBUG_LATENCY_RF_ONLY) static tmr10ms_t lastLatencyToggle = 0; if (tmr10ms - lastLatencyToggle >= 10) { lastLatencyToggle = tmr10ms; - latencyToggleSwitch ^= 1; - if (latencyToggleSwitch) - sportUpdatePowerOn(); - else - sportUpdatePowerOff(); + toggleLatencySwitch(); } #endif @@ -1441,7 +1470,7 @@ void doMixerCalculations() s_cnt_1s -= 10; sessionTimer += 1; inactivity.counter++; - if ((((uint8_t)inactivity.counter)&0x07)==0x01 && g_eeGeneral.inactivityTimer && g_vbat100mV>50 && inactivity.counter > ((uint16_t)g_eeGeneral.inactivityTimer*60)) + if ((((uint8_t)inactivity.counter) & 0x07) == 0x01 && g_eeGeneral.inactivityTimer && inactivity.counter > ((uint16_t)g_eeGeneral.inactivityTimer * 60)) AUDIO_INACTIVITY(); #if defined(AUDIO) @@ -1452,8 +1481,9 @@ void doMixerCalculations() val = s_sum_samples_thr_1s / s_cnt_samples_thr_1s; s_timeCum16ThrP += (val>>3); // s_timeCum16ThrP would overrun if we would store throttle value with higher accuracy; therefore stay with 16 steps - if (val) s_timeCumThr += 1; - s_sum_samples_thr_1s>>=2; // correct better accuracy now, because trace graph can show this information; in case thrtrace is not active, the compile should remove this + if (val) + s_timeCumThr += 1; + s_sum_samples_thr_1s >>= 2; // correct better accuracy now, because trace graph can show this information; in case thrtrace is not active, the compile should remove this #if defined(THRTRACE) // throttle trace is done every 10 seconds; Tracebuffer is adjusted to screen size. @@ -1500,26 +1530,18 @@ void doMixerCalculations() s_mixer_first_run_done = true; } - -#define OPENTX_START_NO_SPLASH 0x01 -#define OPENTX_START_NO_CHECKS 0x02 - #if !defined(OPENTX_START_DEFAULT_ARGS) #define OPENTX_START_DEFAULT_ARGS 0 #endif -void opentxStart(const uint8_t startType = OPENTX_START_DEFAULT_ARGS) +void opentxStart(const uint8_t startOptions = OPENTX_START_DEFAULT_ARGS) { - TRACE("opentxStart(%u)", startType); + TRACE("opentxStart(%u)", startOptions); - if (startType & OPENTX_START_NO_CHECKS) { - return; - } - - uint8_t calibration_needed = (g_eeGeneral.chkSum != evalChkSum()); + uint8_t calibration_needed = !(startOptions & OPENTX_START_NO_CALIBRATION) && (g_eeGeneral.chkSum != evalChkSum()); #if defined(GUI) - if (!calibration_needed && !(startType & OPENTX_START_NO_SPLASH)) { + if (!calibration_needed && !(startOptions & OPENTX_START_NO_SPLASH)) { doSplash(); } #endif @@ -1542,7 +1564,7 @@ void opentxStart(const uint8_t startType = OPENTX_START_DEFAULT_ARGS) if (calibration_needed) { chainMenu(menuFirstCalib); } - else { + else if (!(startOptions & OPENTX_START_NO_CHECKS)) { checkAlarm(); checkAll(); PLAY_MODEL_NAME(); @@ -1563,7 +1585,7 @@ void opentxClose(uint8_t shutdown) #endif #if defined(LUA) luaClose(&lsScripts); -#if defined(PCBHORUS) +#if defined(COLORLCD) luaClose(&lsWidgets); #endif #endif @@ -1614,12 +1636,14 @@ void opentxResume() sdMount(); storageReadAll(); -#if defined(PCBHORUS) + +#if defined(COLORLCD) loadTheme(); loadFontCache(); #endif - opentxStart(OPENTX_START_NO_SPLASH); + // removed to avoid the double warnings (throttle, switch, etc.) + // opentxStart(OPENTX_START_NO_SPLASH | OPENTX_START_NO_CALIBRATION | OPENTX_START_NO_CHECKS); referenceSystemAudioFiles(); @@ -1704,6 +1728,44 @@ void copyTrimsToOffset(uint8_t ch) storageDirty(EE_MODEL); } + +#if defined(STARTUP_ANIMATION) + +inline uint32_t PWR_PRESS_DURATION_MIN() +{ + return (2 - g_eeGeneral.pwrOnSpeed) * 100; +} + +constexpr uint32_t PWR_PRESS_DURATION_MAX = 500; // 5s + +void runStartupAnimation() +{ + tmr10ms_t start = get_tmr10ms(); + tmr10ms_t duration = 0; + bool isPowerOn = false; + + while (pwrPressed()) { + duration = get_tmr10ms() - start; + if (duration < PWR_PRESS_DURATION_MIN()) { + drawStartupAnimation(duration, PWR_PRESS_DURATION_MIN()); + } + else if (duration >= PWR_PRESS_DURATION_MAX) { + drawSleepBitmap(); + backlightDisable(); + } + else if (!isPowerOn) { + isPowerOn = true; + pwrOn(); + haptic.play(15, 3, PLAY_NOW); + } + } + + if (duration < PWR_PRESS_DURATION_MIN() || duration >= PWR_PRESS_DURATION_MAX) { + boardOff(); + } +} +#endif + void moveTrimsToOffsets() // copy state of 3 primary to subtrim { int16_t zeros[MAX_OUTPUT_CHANNELS]; @@ -1759,14 +1821,23 @@ void opentxInit() #endif #endif -#if defined(RTCLOCK) && !defined(COPROCESSOR) - rtcInit(); // RTC must be initialized before rambackupRestore() is called -#endif - #if defined(EEPROM) storageReadRadioSettings(); #endif + BACKLIGHT_ENABLE(); // we start the backlight during the startup animation + +#if defined(STARTUP_ANIMATION) + if (WAS_RESET_BY_WATCHDOG_OR_SOFTWARE()) { + pwrOn(); + } + else { + runStartupAnimation(); + } +#else // defined(PWR_BUTTON_PRESS) + pwrOn(); +#endif + // Radios handle UNEXPECTED_SHUTDOWN() differently: // * radios with WDT and EEPROM and CPU controlled power use Reset status register // and eeGeneral.unexpectedShutdown @@ -1778,10 +1849,33 @@ void opentxInit() unexpectedShutdown = 1; } -#if defined(SDCARD) && !defined(PCBMEGA2560) +#if defined(SDCARD) // SDCARD related stuff, only done if not unexpectedShutdown if (!unexpectedShutdown) { sdInit(); + +#if defined(AUTOUPDATE) + sportStopSendByteLoop(); + if (f_stat(AUTOUPDATE_FILENAME, nullptr) == FR_OK) { + FrSkyFirmwareInformation information; + if (readFirmwareInformation(AUTOUPDATE_FILENAME, information) == nullptr) { +#if defined(BLUETOOTH) + if (information.productFamily == FIRMWARE_FAMILY_BLUETOOTH_CHIP) { + if (bluetooth.flashFirmware(AUTOUPDATE_FILENAME) == nullptr) + f_unlink(AUTOUPDATE_FILENAME); + } +#endif +#if defined(HARDWARE_POWER_MANAGEMENT_UNIT) + if (information.productFamily == FIRMWARE_FAMILY_POWER_MANAGEMENT_UNIT) { + FrskyChipFirmwareUpdate device; + if (device.flashFirmware(AUTOUPDATE_FILENAME, false) == nullptr) + f_unlink(AUTOUPDATE_FILENAME); + } +#endif + } + } +#endif + logsInit(); } #endif @@ -1790,22 +1884,12 @@ void opentxInit() storageReadCurrentModel(); #endif -#if defined(PCBHORUS) +#if defined(COLORLCD) if (!unexpectedShutdown) { // g_model.topbarData is still zero here (because it was not yet read from SDCARD), // but we only remember the pointer to in in constructor. // The storageReadAll() needs topbar object, so it must be created here -#if __clang__ -// clang does not like this at all, turn into a warning so that -Werror does not stop here -// taking address of packed member 'topbarData' of class or structure 'ModelData' may result in an unaligned pointer value [-Werror,-Waddress-of-packed-member] -#pragma clang diagnostic push -#pragma clang diagnostic warning "-Waddress-of-packed-member" -#endif topbar = new Topbar(&g_model.topbarData); -#if __clang__ -// Restore warnings -#pragma clang diagnostic pop -#endif // lua widget state must also be prepared before the call to storageReadAll() LUA_INIT_THEMES_AND_WIDGETS(); @@ -1844,9 +1928,9 @@ void opentxInit() #endif currentSpeakerVolume = requiredSpeakerVolume = g_eeGeneral.speakerVolume + VOLUME_LEVEL_DEF; - #if !defined(SOFTWARE_VOLUME) - setScaledVolume(currentSpeakerVolume); - #endif +#if !defined(SOFTWARE_VOLUME) + setScaledVolume(currentSpeakerVolume); +#endif referenceSystemAudioFiles(); audioQueue.start(); @@ -1861,7 +1945,7 @@ void opentxInit() btInit(); #endif -#if defined(PCBHORUS) +#if defined(COLORLCD) loadTheme(); loadFontCache(); #endif @@ -1886,10 +1970,6 @@ void opentxInit() #endif backlightOn(); -#if defined(PCBSKY9X) && !defined(SIMU) - init_trainer_capture(); -#endif - startPulses(); wdt_enable(WDTO_500MS); @@ -1919,40 +1999,21 @@ int main() #if defined(PCBTARANIS) g_eeGeneral.contrast = LCD_CONTRAST_DEFAULT; #endif - wdt_disable(); boardInit(); -#if defined(PCBHORUS) +#if defined(COLORLCD) loadFonts(); #endif - -#if defined(GUI) && !defined(PCBTARANIS) && !defined(PCBHORUS) - // TODO remove this - lcdInit(); -#endif - #if !defined(SIMU) stackPaint(); #endif -#if defined(GUI) && !defined(PCBTARANIS) - // lcdSetRefVolt(25); -#endif - -#if defined(SPLASH) && (defined(PCBTARANIS) || defined(PCBHORUS)) +#if defined(SPLASH) && !defined(STARTUP_ANIMATION) drawSplash(); #endif -#if defined(DSM2_SERIAL) && !defined(TELEMETRY_FRSKY) - DSM2_Init(); -#endif - -#if defined(MENU_ROTARY_SW) - init_rotary_sw(); -#endif - #if defined(PCBHORUS) if (!IS_FIRMWARE_COMPATIBLE_WITH_BOARD()) { runFatalErrorScreen(STR_WRONG_PCBREV); @@ -1970,6 +2031,12 @@ int main() #if !defined(SIMU) #if defined(PWR_BUTTON_PRESS) + +inline uint32_t PWR_PRESS_SHUTDOWN_DELAY() +{ + return (2 - g_eeGeneral.pwrOffSpeed) * 100; +} + uint32_t pwr_press_time = 0; uint32_t pwrPressedDuration() @@ -2015,7 +2082,7 @@ uint32_t pwrCheck() if (g_eeGeneral.backlightMode != e_backlight_mode_off) { BACKLIGHT_ENABLE(); } - if (get_tmr10ms() - pwr_press_time > PWR_PRESS_SHUTDOWN_DELAY) { + if (get_tmr10ms() - pwr_press_time > PWR_PRESS_SHUTDOWN_DELAY()) { #if defined(SHUTDOWN_CONFIRMATION) while (1) { #else @@ -2045,7 +2112,7 @@ uint32_t pwrCheck() return e_power_off; } else { - drawShutdownAnimation(pwrPressedDuration(), message); + drawShutdownAnimation(pwrPressedDuration(), PWR_PRESS_SHUTDOWN_DELAY(), message); return e_power_press; } } diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 5ec52dca5..c31498d41 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -28,6 +28,14 @@ #include #include "definitions.h" #include "opentx_types.h" +#include "debounce.h" + + +#if defined(SIMU) +#include "targets/simu/simpgmspace.h" +#endif + +#include "board.h" #if defined(STM32) #include "usbd_conf.h" @@ -119,6 +127,12 @@ #define CASE_SPLASH(x) #endif +#if defined(PWR_BUTTON_PRESS) + #define CASE_PWR_BUTTON_PRESS(x) x, +#else + #define CASE_PWR_BUTTON_PRESS(x) +#endif + #if defined(TELEMETRY_FRSKY) #define CASE_FRSKY(x) x, #else @@ -200,7 +214,7 @@ #define IS_FAI_FORBIDDEN(idx) (IS_FAI_ENABLED() && isFaiForbidden(idx)) #if defined(BLUETOOTH) - #if defined(X9E) && !defined(USEHORUSBT) + #if defined(X9E) #define IS_BLUETOOTH_TRAINER() (g_model.trainerData.mode == TRAINER_MODE_SLAVE_BLUETOOTH) #define IS_SLAVE_TRAINER() (g_model.trainerData.mode == TRAINER_MODE_SLAVE) #else @@ -219,8 +233,6 @@ #define RESXul 1024ul #define RESXl 1024l -#include "board.h" - #if defined(JACK_DETECT_GPIO) #define CASE_JACK_DETECT(x) x, #else @@ -231,10 +243,6 @@ #include "disk_cache.h" #endif -#if defined(SIMU) - #include "targets/simu/simpgmspace.h" -#endif - #include "debug.h" #if defined(PCBTARANIS) || defined(PCBHORUS) @@ -248,8 +256,6 @@ #define SW_DSM2_BIND SW_TRN #endif -#define NUM_PSWITCH (SWSRC_LAST_SWITCH-SWSRC_FIRST_SWITCH+1) - #include "myeeprom.h" inline void memclear(void * p, size_t size) @@ -260,7 +266,7 @@ inline void memclear(void * p, size_t size) inline bool is_memclear(void * p, size_t size) { uint8_t * buf = (uint8_t *)p; - return buf[0] == 0 && !memcmp(buf, buf + 1, size - 1); + return buf[0] == 0 && memcmp(buf, buf + 1, size - 1) == 0; } void memswap(void * a, void * b, uint8_t size); @@ -293,8 +299,6 @@ void memswap(void * a, void * b, uint8_t size); #define pwrOffPressed() (!pwrPressed()) #endif -#define PWR_PRESS_SHUTDOWN_DELAY 300 // 3s - #define GET_LOWRES_POT_POSITION(i) (getValue(MIXSRC_FIRST_POT+(i)) >> 4) #define SAVE_POT_POSITION(i) g_model.potsWarnPosition[i] = GET_LOWRES_POT_POSITION(i) @@ -364,7 +368,7 @@ extern const uint8_t modn12x3[]; #define CONVERT_MODE_TRIMS(x) CONVERT_MODE(x) #endif -extern uint8_t channel_order(uint8_t x); +extern uint8_t channelOrder(uint8_t x); #define THRCHK_DEADBAND 16 @@ -398,10 +402,10 @@ extern uint8_t channel_order(uint8_t x); constexpr uint8_t HEART_TIMER_10MS = 0x01; constexpr uint8_t HEART_TIMER_PULSES = 0x02; // when multiple modules this is the first one -#if defined(PCBTARANIS) || defined(PCBHORUS) -constexpr uint8_t HEART_WDT_CHECK = (HEART_TIMER_10MS + (HEART_TIMER_PULSES << 0) + (HEART_TIMER_PULSES << 1)); +#if defined(HARDWARE_INTERNAL_MODULE) +constexpr uint8_t HEART_WDT_CHECK = HEART_TIMER_10MS + (HEART_TIMER_PULSES << INTERNAL_MODULE) + (HEART_TIMER_PULSES << EXTERNAL_MODULE); #else -constexpr uint8_t HEART_WDT_CHECK = (HEART_TIMER_10MS + HEART_TIMER_PULSES); +constexpr uint8_t HEART_WDT_CHECK = HEART_TIMER_10MS + (HEART_TIMER_PULSES << EXTERNAL_MODULE); #endif extern uint8_t heartbeat; @@ -432,6 +436,7 @@ extern struct t_inactivity inactivity; char hex2zchar(uint8_t hex); char zchar2char(int8_t idx); +char char2lower(char c); int8_t char2zchar(char c); void str2zchar(char *dest, const char *src, int size); int zchar2str(char *dest, const char *src, int size); @@ -445,24 +450,27 @@ div_t switchInfo(int switchPosition); extern uint8_t potsPos[NUM_XPOTS]; #endif -#if defined(PCBHORUS) - uint16_t trimDown(uint16_t idx); // TODO why? -#else - uint8_t trimDown(uint8_t idx); -#endif +bool trimDown(uint8_t idx); void readKeysAndTrims(); uint16_t evalChkSum(); +void alert(const char * title, const char * msg, uint8_t sound); + #if !defined(GUI) #define RAISE_ALERT(...) #define ALERT(...) #else - #define RAISE_ALERT(title, msg, info, sound) showAlertBox(title, msg, info, sound) - #define ALERT(title, msg, sound) alert(title, msg, sound) -#endif + inline void RAISE_ALERT(const char * title, const char * msg, const char * info, uint8_t sound) + { + showAlertBox(title, msg, info, sound); + } -void alert(const char * t, const char * s , uint8_t sound); + inline void ALERT(const char * title, const char * msg, uint8_t sound) + { + alert(title, msg, sound); + } +#endif enum PerOutMode { e_perout_mode_normal = 0, @@ -542,8 +550,6 @@ bool setTrimValue(uint8_t phase, uint8_t idx, int trim); #if defined(PCBSKY9X) #define ROTARY_ENCODER_GRANULARITY (2 << g_eeGeneral.rotarySteps) -#elif defined(PCBHORUS) - #define ROTARY_ENCODER_GRANULARITY (1) #else #define ROTARY_ENCODER_GRANULARITY (2) #endif @@ -616,7 +622,7 @@ extern uint16_t maxMixerDuration; #endif void checkLowEEPROM(); -void checkTHR(); +void checkThrottleStick(); void checkSwitches(); void checkAlarm(); void checkAll(); @@ -640,9 +646,6 @@ void doLoopCommonActions(); #define BITMASK(bit) (1<<(bit)) -/// returns the number of elements of an array -#define DIM(arr) (sizeof((arr))/sizeof((arr)[0])) - template inline t min(t a, t b) { return a inline t max(t a, t b) { return a>b?a:b; } template inline t sgn(t a) { return a>0 ? 1 : (a < 0 ? -1 : 0); } @@ -668,6 +671,7 @@ inline void resumeMixerCalculations() } #endif +void setDefaultOwnerId(); void generalDefault(); void modelDefault(uint8_t id); @@ -728,21 +732,12 @@ extern const char vers_stamp[]; * @param buffer If non-null find the firmware version in the buffer instead * @return The opentx version string starting with "opentx-" or "no version found" if the version string is not found */ -const char* getOtherVersion(char* buffer); - -extern uint8_t g_vbat100mV; -#if LCD_W > 128 - #define GET_TXBATT_BARS() (limit(0, div_and_round(10 * (g_vbat100mV - g_eeGeneral.vBatMin - 90), 30 + g_eeGeneral.vBatMax - g_eeGeneral.vBatMin), 10)) -#else - #define GET_TXBATT_BARS() (limit(2, 20 * (g_vbat100mV - g_eeGeneral.vBatMin - 90) / (30 + g_eeGeneral.vBatMax - g_eeGeneral.vBatMin), 20)) -#endif -#define IS_TXBATT_WARNING() (g_vbat100mV <= g_eeGeneral.vBatWarn) - +const char * getOtherVersion(char * buffer); #define g_blinkTmr10ms (*(uint8_t*)&g_tmr10ms) extern uint8_t g_beepCnt; -#include "trainer_input.h" +#include "trainer.h" extern int32_t chans[MAX_OUTPUT_CHANNELS]; extern int16_t ex_chans[MAX_OUTPUT_CHANNELS]; // Outputs (before LIMITS) of the last perMain @@ -954,9 +949,7 @@ inline void customFunctionsReset() } #include "telemetry/telemetry.h" - -uint8_t crc8(const uint8_t * ptr, uint32_t len); -uint16_t crc16(const uint8_t * ptr, uint32_t len); +#include "crc.h" #define PLAY_REPEAT(x) (x) /* Range 0 to 15 */ #define PLAY_NOW 0x10 @@ -1082,6 +1075,10 @@ void opentxClose(uint8_t shutdown=true); void opentxInit(); void opentxResume(); +constexpr uint8_t OPENTX_START_NO_SPLASH = 0x01; +constexpr uint8_t OPENTX_START_NO_CALIBRATION = 0x02; +constexpr uint8_t OPENTX_START_NO_CHECKS = 0x04; + #if defined(STATUS_LEDS) #define LED_ERROR_BEGIN() ledRed() #define LED_ERROR_END() ledBlue() @@ -1103,9 +1100,7 @@ void opentxResume(); union ReusableBuffer { - // ARM 334 bytes - struct - { + struct { #if defined(EEPROM_RLC) && LCD_W < 212 uint16_t eepromfree; #endif @@ -1137,6 +1132,7 @@ union ReusableBuffer }; uint8_t resetReceiverFlags; ModuleInformation moduleInformation; + ModuleSettings moduleSettings; } pxx2; #if defined(BLUETOOTH) struct { @@ -1146,11 +1142,10 @@ union ReusableBuffer #endif } moduleSetup; - // 103 bytes struct { - int16_t midVals[NUM_STICKS+NUM_POTS+NUM_SLIDERS+NUM_MOUSE_ANALOGS]; - int16_t loVals[NUM_STICKS+NUM_POTS+NUM_SLIDERS+NUM_MOUSE_ANALOGS]; - int16_t hiVals[NUM_STICKS+NUM_POTS+NUM_SLIDERS+NUM_MOUSE_ANALOGS]; + int16_t midVals[NUM_STICKS+NUM_POTS+NUM_SLIDERS+STORAGE_NUM_MOUSE_ANALOGS]; + int16_t loVals[NUM_STICKS+NUM_POTS+NUM_SLIDERS+STORAGE_NUM_MOUSE_ANALOGS]; + int16_t hiVals[NUM_STICKS+NUM_POTS+NUM_SLIDERS+STORAGE_NUM_MOUSE_ANALOGS]; uint8_t state; #if defined(PCBTARANIS) || defined(PCBHORUS) struct { @@ -1163,7 +1158,6 @@ union ReusableBuffer } calib; #if defined(SDCARD) - // 274 bytes struct { char lines[NUM_BODY_LINES][SD_SCREEN_FILE_LENGTH+1+1]; // the last char is used to store the flags (directory) of the line uint32_t available; @@ -1178,14 +1172,8 @@ union ReusableBuffer struct { ModuleInformation modules[NUM_MODULES]; uint32_t updateTime; - - union { - ModuleSettings moduleSettings; - ReceiverSettings receiverSettings; - }; - - uint8_t moduleSettingsDirty; - + ModuleSettings moduleSettings; + ReceiverSettings receiverSettings; // when dealing with receiver settings, we also need module settings } hardwareAndSettings; struct { @@ -1197,8 +1185,7 @@ union ReusableBuffer uint8_t stickMode; } generalSettings; - struct - { + struct { uint8_t bars[LCD_W]; uint32_t freq; uint32_t span; @@ -1211,8 +1198,7 @@ union ReusableBuffer uint8_t dirty; } spectrumAnalyser; - struct - { + struct { uint32_t freq; int16_t power; int16_t peak; @@ -1220,8 +1206,7 @@ union ReusableBuffer uint8_t dirty; } powerMeter; - struct - { + struct { int8_t preset; } curveEdit; @@ -1277,6 +1262,18 @@ inline int div_and_round(int num, int den) return num / den; } +extern uint8_t g_vbat100mV; + +inline uint8_t GET_TXBATT_BARS(uint8_t barsMax) +{ + return limit(0, div_and_round(barsMax * (g_vbat100mV - g_eeGeneral.vBatMin - 90), 30 + g_eeGeneral.vBatMax - g_eeGeneral.vBatMin), barsMax); +} + +inline bool IS_TXBATT_WARNING() +{ + return g_vbat100mV <= g_eeGeneral.vBatWarn; +} + #if defined(TELEMETRY_FRSKY) enum TelemetryViews { TELEMETRY_CUSTOM_SCREEN_1, @@ -1390,4 +1387,13 @@ inline bool isSimu() extern uint8_t latencyToggleSwitch; #endif +inline bool isAsteriskDisplayed() +{ +#if defined(LOG_TELEMETRY) || defined(WATCHDOG_DISABLED) || defined(DEBUG_LATENCY) + return true; +#endif + + return unexpectedShutdown; +} + #endif // _OPENTX_H_ diff --git a/radio/src/targets/horus/board_preinit.cpp b/radio/src/opentx_constants.h similarity index 60% rename from radio/src/targets/horus/board_preinit.cpp rename to radio/src/opentx_constants.h index 54a24cb21..7267d6d33 100644 --- a/radio/src/targets/horus/board_preinit.cpp +++ b/radio/src/opentx_constants.h @@ -18,8 +18,34 @@ * GNU General Public License for more details. */ -#include "board.h" +#ifndef _OPENTX_CONSTANTS_H_ +#define _OPENTX_CONSTANTS_H_ -void boardPreInit() -{ -} +enum SwitchConfig { + SWITCH_NONE, + SWITCH_TOGGLE, + SWITCH_2POS, + SWITCH_3POS, +}; + +enum PotConfig { + POT_NONE, + POT_WITH_DETENT, + POT_MULTIPOS_SWITCH, + POT_WITHOUT_DETENT +}; + +enum SliderConfig { + SLIDER_NONE, + SLIDER_WITH_DETENT, +}; + +enum CalibrationState { + CALIB_START, + CALIB_SET_MIDPOINT, + CALIB_MOVE_STICKS, + CALIB_STORE, + CALIB_FINISHED +}; + +#endif // _OPENTX_CONSTANTS_H_ diff --git a/radio/src/opentx_types.h b/radio/src/opentx_types.h index 8d6f86977..9851f5a5e 100644 --- a/radio/src/opentx_types.h +++ b/radio/src/opentx_types.h @@ -31,5 +31,6 @@ typedef int32_t swsrc_t; typedef int16_t safetych_t; typedef uint32_t bitfield_channels_t; typedef uint16_t event_t; +typedef uint16_t FlightModesType; #endif // _OPENTX_TYPES_H_ diff --git a/radio/src/options.h b/radio/src/options.h new file mode 100644 index 000000000..ae0522b73 --- /dev/null +++ b/radio/src/options.h @@ -0,0 +1,83 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + + +#ifndef OPENTX_OPTIONS_H +#define OPENTX_OPTIONS_H + +static const char * options[] = { +#if defined(AUTOUPDATE) + "autoupdate", +#endif +#if defined(CROSSFIRE) + "crossfire", +#endif +#if defined(MODULE_D16_EU_ONLY_SUPPORT) + "eu", +#endif +#if defined(FAI) + "faimode", +#endif +#if defined(FAI_CHOICE) + "faichoice", +#endif +#if defined(R9M_PROTO_FLEX) + "flexr9m", +#endif +#if !defined(GVARS) + "nogvars", +#endif +#if defined(HAPTIC) && defined(PCBX9D) + "haptic", +#endif +#if !defined(HELI) + "noheli", +#endif +#if defined(HORUS_STICKS) + "horussticks", +#endif +#if defined(INTERNAL_MODULE_PPM) + "internalppm", +#endif +#if defined(MULTIMODULE) + "multimodule", +#endif +#if defined(LUA_MODEL_SCRIPTS) + "lua", +#endif +#if defined(LUA_COMPILER) + "luac", +#endif +#if !defined(OVERRIDE_CHANNEL_FUNCTION) + "nooverridech", +#endif +#if defined(PPM_UNIT_US) + "ppmus", +#endif +#if defined(NO_RAS) + "noras", +#endif +#if defined(SHUTDOWN_CONFIRMATION) + "shutdownconfirm", +#endif + nullptr //sentinel +}; + +#endif //OPENTX_OPTIONS_H diff --git a/radio/src/pulses/modules_constants.h b/radio/src/pulses/modules_constants.h index 194dc3f4f..00ac471e0 100644 --- a/radio/src/pulses/modules_constants.h +++ b/radio/src/pulses/modules_constants.h @@ -10,10 +10,12 @@ enum ModuleType { MODULE_TYPE_R9M_PXX2, MODULE_TYPE_R9M_LITE_PXX1, MODULE_TYPE_R9M_LITE_PXX2, + MODULE_TYPE_R9M_LITE_PRO_PXX1, MODULE_TYPE_R9M_LITE_PRO_PXX2, MODULE_TYPE_SBUS, - MODULE_TYPE_MAX = MODULE_TYPE_SBUS, - MODULE_TYPE_COUNT + MODULE_TYPE_XJT_LITE_PXX2, + MODULE_TYPE_COUNT, + MODULE_TYPE_MAX = MODULE_TYPE_COUNT - 1 }; /* FrSky XJT / ISRM */ @@ -29,19 +31,32 @@ enum ModuleSubtypePXX1 { enum ModuleSubtypeISRM_PXX2 { MODULE_SUBTYPE_ISRM_PXX2_ACCESS, MODULE_SUBTYPE_ISRM_PXX2_ACCST_D16, - MODULE_SUBTYPE_ISRM_PXX2_ACCST_LR12, // not implemented in the module as of today - MODULE_SUBTYPE_ISRM_PXX2_LAST = MODULE_SUBTYPE_ISRM_PXX2_ACCST_D16 + MODULE_SUBTYPE_ISRM_PXX2_ACCST_LR12, + MODULE_SUBTYPE_ISRM_PXX2_ACCST_D8, + MODULE_SUBTYPE_ISRM_PXX2_LAST = MODULE_SUBTYPE_ISRM_PXX2_ACCST_D8 }; -enum ModuleSubtypeR9M_PXX2 { - MODULE_SUBTYPE_R9M_PXX2_ACCESS, - MODULE_SUBTYPE_R9M_PXX2_FCC, - MODULE_SUBTYPE_R9M_PXX2_EU, -#if defined(R9M_PROTO_FLEX) - MODULE_SUBTYPE_R9M_PXX2_FLEX, -#endif - MODULE_SUBTYPE_R9M_PXX2_COUNT, - MODULE_SUBTYPE_R9M_PXX2_LAST = MODULE_SUBTYPE_R9M_PXX2_COUNT - 1 +enum R9MLiteLBTPowerValues { + R9M_LITE_LBT_POWER_25_8CH = 0, + R9M_LITE_LBT_POWER_25_16CH, + R9M_LITE_LBT_POWER_100_16CH_NOTELEM, + R9M_LITE_LBT_POWER_MAX = R9M_LITE_LBT_POWER_100_16CH_NOTELEM +}; + +enum R9MFCCPowerValues { + R9M_FCC_POWER_10 = 0, + R9M_FCC_POWER_100, + R9M_FCC_POWER_500, + R9M_FCC_POWER_1000, + R9M_FCC_POWER_MAX = R9M_FCC_POWER_1000 +}; + +enum R9MLBTPowerValues { + R9M_LBT_POWER_25_8CH = 0, + R9M_LBT_POWER_25_16CH, + R9M_LBT_POWER_200_16CH_NOTELEM, + R9M_LBT_POWER_500_16CH_NOTELEM, + R9M_LBT_POWER_MAX = R9M_LBT_POWER_500_16CH_NOTELEM }; enum AntennaTypes { @@ -49,9 +64,6 @@ enum AntennaTypes { XJT_EXTERNAL_ANTENNA }; -#define HAS_RF_PROTOCOL_FAILSAFE(rf) ((rf) == MODULE_SUBTYPE_PXX1_ACCST_D16) -#define HAS_RF_PROTOCOL_MODELINDEX(rf) (((rf) == MODULE_SUBTYPE_PXX1_ACCST_D16) || ((rf) == MODULE_SUBTYPE_PXX1_ACCST_LR12)) - /* FrSky R9M / R9M-Lite & co */ enum ModuleSubtypeR9M { @@ -114,7 +126,9 @@ enum ModuleSubtypeMulti { MODULE_SUBTYPE_MULTI_GD00X, MODULE_SUBTYPE_MULTI_V761, MODULE_SUBTYPE_MULTI_KF606, - MODULE_SUBTYPE_MULTI_LAST = MODULE_SUBTYPE_MULTI_KF606 + MODULE_SUBTYPE_MULTI_REDPINE, + MODULE_SUBTYPE_MULTI_POTENSIC, + MODULE_SUBTYPE_MULTI_LAST = MODULE_SUBTYPE_MULTI_POTENSIC }; enum MMDSM2Subtypes { diff --git a/radio/src/pulses/modules_helpers.h b/radio/src/pulses/modules_helpers.h index 2ae4280bf..ae5d36849 100644 --- a/radio/src/pulses/modules_helpers.h +++ b/radio/src/pulses/modules_helpers.h @@ -22,8 +22,11 @@ #define _MODULES_H_ #include "bitfield.h" - - +#include "definitions.h" +#include "telemetry/telemetry.h" +#if defined(MULTIMODULE) +#include "telemetry/multi.h" +#endif #define CROSSFIRE_CHANNELS_COUNT 16 @@ -49,21 +52,50 @@ inline bool isModuleMultimoduleDSM2(uint8_t) } #endif -inline bool isModuleXJT(uint8_t idx) +inline bool isModuleTypeXJT(uint8_t type) { - return g_model.moduleData[idx].type == MODULE_TYPE_XJT_PXX1; + return type == MODULE_TYPE_XJT_PXX1 || type == MODULE_TYPE_XJT_LITE_PXX2; } -inline bool isModuleXJT2(uint8_t idx) +inline bool isModuleXJT(uint8_t idx) +{ + return isModuleTypeXJT(g_model.moduleData[idx].type); +} + +inline bool isModuleXJTD8(uint8_t idx) +{ + return isModuleXJT(idx) && g_model.moduleData[idx].subType == MODULE_SUBTYPE_PXX1_ACCST_D8; +} + +inline bool isModuleXJTLR12(uint8_t idx) +{ + return isModuleXJT(idx) && g_model.moduleData[idx].subType == MODULE_SUBTYPE_PXX1_ACCST_LR12; +} + +inline bool isModuleXJTD16(uint8_t idx) +{ + return isModuleXJT(idx) && g_model.moduleData[idx].subType == MODULE_SUBTYPE_PXX1_ACCST_D16; +} + +inline bool isModuleISRM(uint8_t idx) { return g_model.moduleData[idx].type == MODULE_TYPE_ISRM_PXX2; } -inline bool isModuleXJTVariant(uint8_t idx) +inline bool isModuleISRMD16(uint8_t idx) { - return g_model.moduleData[idx].type == MODULE_TYPE_XJT_PXX1 || g_model.moduleData[idx].type == MODULE_TYPE_ISRM_PXX2; + return g_model.moduleData[idx].type == MODULE_TYPE_ISRM_PXX2 && g_model.moduleData[idx].subType == MODULE_SUBTYPE_ISRM_PXX2_ACCST_D16; } +inline bool isModuleD16(uint8_t idx) +{ + return isModuleXJTD16(idx) || isModuleISRMD16(idx); +} + +inline bool isModuleISRMAccess(uint8_t idx) +{ + return g_model.moduleData[idx].type == MODULE_TYPE_ISRM_PXX2 && g_model.moduleData[idx].subType == MODULE_SUBTYPE_ISRM_PXX2_ACCESS; +} #if defined(CROSSFIRE) inline bool isModuleCrossfire(uint8_t idx) @@ -103,58 +135,112 @@ inline bool isModulePPM(uint8_t idx) } #endif +inline bool isModuleTypeR9MNonAccess(uint8_t type) +{ + return type == MODULE_TYPE_R9M_PXX1 || type == MODULE_TYPE_R9M_LITE_PXX1 || type == MODULE_TYPE_R9M_LITE_PRO_PXX1; +} + +inline bool isModuleR9MNonAccess(uint8_t idx) +{ + return isModuleTypeR9MNonAccess(g_model.moduleData[idx].type); +} + +inline bool isModuleTypeR9MAccess(uint8_t type) +{ + return type == MODULE_TYPE_R9M_PXX2 || type == MODULE_TYPE_R9M_LITE_PXX2 || type == MODULE_TYPE_R9M_LITE_PRO_PXX2; +} + +inline bool isModuleR9MAccess(uint8_t idx) +{ + return isModuleTypeR9MAccess(g_model.moduleData[idx].type); +} + +inline bool isModuleTypeR9M(uint8_t type) +{ + return isModuleTypeR9MNonAccess(type) || isModuleTypeR9MAccess(type); +} + inline bool isModuleR9M(uint8_t idx) { - return g_model.moduleData[idx].type == MODULE_TYPE_R9M_PXX1 || g_model.moduleData[idx].type == MODULE_TYPE_R9M_LITE_PXX1; + return isModuleTypeR9M(g_model.moduleData[idx].type); } -inline bool isModuleR9M2(uint8_t idx) +inline bool isModuleTypeR9MLiteNonPro(uint8_t type) { - return g_model.moduleData[idx].type == MODULE_TYPE_R9M_PXX2 || g_model.moduleData[idx].type == MODULE_TYPE_R9M_LITE_PXX2 || g_model.moduleData[idx].type == MODULE_TYPE_R9M_LITE_PRO_PXX2; + return type == MODULE_TYPE_R9M_LITE_PXX1 || type == MODULE_TYPE_R9M_LITE_PXX2; } +inline bool isModuleR9MLiteNonPro(uint8_t idx) +{ + return isModuleTypeR9MLiteNonPro(g_model.moduleData[idx].type); +} + +inline bool isModuleTypeR9MLitePro(uint8_t type) +{ + return type == MODULE_TYPE_R9M_LITE_PRO_PXX1 || type == MODULE_TYPE_R9M_LITE_PRO_PXX2; +} + +inline bool isModuleTypeR9MLite(uint8_t type) +{ + return isModuleTypeR9MLiteNonPro(type) || isModuleTypeR9MLitePro(type); +} + +inline bool isModuleR9MLite(uint8_t idx) +{ + return isModuleTypeR9MLite(g_model.moduleData[idx].type); +} inline bool isModuleR9M_FCC(uint8_t idx) { - return isModuleR9M(idx) && g_model.moduleData[idx].subType == MODULE_SUBTYPE_R9M_FCC; + return isModuleR9MNonAccess(idx) && g_model.moduleData[idx].subType == MODULE_SUBTYPE_R9M_FCC; +} + +inline bool isModuleTypeLite(uint8_t type) +{ + return isModuleTypeR9MLite(type) || type == MODULE_TYPE_XJT_LITE_PXX2; } inline bool isModuleR9M_LBT(uint8_t idx) { - return isModuleR9M(idx) && g_model.moduleData[idx].subType == MODULE_SUBTYPE_R9M_EU; + return isModuleR9MNonAccess(idx) && g_model.moduleData[idx].subType == MODULE_SUBTYPE_R9M_EU; } inline bool isModuleR9M_FCC_VARIANT(uint8_t idx) { - return isModuleR9M(idx) && g_model.moduleData[idx].subType != MODULE_SUBTYPE_R9M_EU; + return isModuleR9MNonAccess(idx) && g_model.moduleData[idx].subType != MODULE_SUBTYPE_R9M_EU; } inline bool isModuleR9M_EUPLUS(uint8_t idx) { - return isModuleR9M(idx) && g_model.moduleData[idx].subType == MODULE_SUBTYPE_R9M_EUPLUS; + return isModuleR9MNonAccess(idx) && g_model.moduleData[idx].subType == MODULE_SUBTYPE_R9M_EUPLUS; } inline bool isModuleR9M_AU_PLUS(uint8_t idx) { - return isModuleR9M(idx) && g_model.moduleData[idx].subType == MODULE_SUBTYPE_R9M_AUPLUS; + return isModuleR9MNonAccess(idx) && g_model.moduleData[idx].subType == MODULE_SUBTYPE_R9M_AUPLUS; } -inline bool isModulePXX(uint8_t idx) +inline bool isModuleTypePXX1(uint8_t type) { - return isModuleXJT(idx) || isModuleR9M(idx); + return isModuleTypeXJT(type) || isModuleTypeR9MNonAccess(type); +} + +inline bool isModulePXX1(uint8_t idx) +{ + return isModuleTypePXX1(g_model.moduleData[idx].type); } inline bool isModulePXX2(uint8_t idx) { - return isModuleXJT2(idx) || isModuleR9M2(idx); + return isModuleISRM(idx) || isModuleR9MAccess(idx); } inline bool isModuleRFAccess(uint8_t idx) { - if (isModuleXJT2(idx)) { + if (isModuleISRM(idx)) { return g_model.moduleData[idx].subType == MODULE_SUBTYPE_ISRM_PXX2_ACCESS; } - else if (isModuleR9M2(idx)) { + else if (isModuleR9MAccess(idx)) { return true; } else { @@ -193,14 +279,28 @@ static const int8_t maxChannelsXJT[] = { 0, 8, 0, 4 }; // relative to 8! constexpr int8_t MAX_TRAINER_CHANNELS_M8 = MAX_TRAINER_CHANNELS - 8; constexpr int8_t MAX_EXTRA_MODULE_CHANNELS_M8 = 8; // only 16ch PPM -inline int8_t maxModuleChannels_M8(uint8_t idx) +inline int8_t maxModuleChannels_M8(uint8_t moduleIdx) { - if (isExtraModule(idx)) + if (isExtraModule(moduleIdx)) { return MAX_EXTRA_MODULE_CHANNELS_M8; - else if (isModuleXJT(idx)) - return maxChannelsXJT[1 + g_model.moduleData[idx].rfProtocol]; - else - return maxChannelsModules[g_model.moduleData[idx].type]; + } + else if (isModuleXJT(moduleIdx)) { + return maxChannelsXJT[1 + g_model.moduleData[moduleIdx].subType]; + } + else if (isModuleR9M(moduleIdx)) { + if (isModuleR9M_LBT(moduleIdx)) { + if (isModuleR9MLite(moduleIdx)) + return g_model.moduleData[moduleIdx].pxx.power == R9M_LITE_LBT_POWER_25_8CH ? 0 : 8; + else + return g_model.moduleData[moduleIdx].pxx.power == R9M_LBT_POWER_25_8CH ? 0 : 8; + } + else { + return 8; // always 16 channels in FCC / FLEX + } + } + else { + return maxChannelsModules[g_model.moduleData[moduleIdx].type]; + } } inline int8_t defaultModuleChannels_M8(uint8_t idx) @@ -211,6 +311,10 @@ inline int8_t defaultModuleChannels_M8(uint8_t idx) return 0; // 8 channels else if (isModuleMultimoduleDSM2(idx)) return -1; // 7 channels + else if (isModuleXJTD8(idx)) + return 0; // 8 channels + else if (isModuleXJTLR12(idx)) + return 4; // 12 channels else if (isModulePXX2(idx)) return 8; // 16 channels else @@ -227,43 +331,122 @@ inline int8_t sentModuleChannels(uint8_t idx) return 8 + g_model.moduleData[idx].channelsCount; } -enum { - MODULE_OPTION_EXTERNAL_ANTENNA, - MODULE_OPTION_POWER, - MODULE_OPTION_SPECTRUM_ANALYSER, - MODULE_OPTION_POWER_METER, -}; - -/* Options order: - * - External antenna (0x01) - * - Power (0x02) - * - Spektrum analyser (0x04) - * - Power meter (0x08) - */ -static const uint8_t moduleOptions[] = { -#if defined(SIMU) - 0b11111111, // None = display all options on SIMU -#else - 0b00000000, // None = display all options on SIMU -#endif - 0b11110001, // XJT - 0b11110001, // ISRM - 0b11111101, // ISRM-PRO - 0b11110101, // ISRM-S - 0b11110010, // R9M - 0b11110010, // R9MLite - 0b11111110, // R9MLite-PRO - 0b11110100, // ISRM-N -}; - -inline bool isModuleOptionAvailable(uint8_t modelId, uint8_t option) -{ - return moduleOptions[modelId] & (1 << option); -} - inline bool isDefaultModelRegistrationID() { return memcmp(g_model.modelRegistrationID, g_eeGeneral.ownerRegistrationID, PXX2_LEN_REGISTRATION_ID) == 0; } +inline bool isModuleRxNumAvailable(uint8_t moduleIdx) +{ + if (isModuleXJT(moduleIdx)) + return g_model.moduleData[moduleIdx].subType != MODULE_SUBTYPE_PXX1_ACCST_D8; + + if (isModuleR9M(moduleIdx)) + return true; + + if (isModuleDSM2(moduleIdx)) + return true; + + if (isModuleISRM(moduleIdx)) + return true; + + if (isModuleMultimodule(moduleIdx)) + return true; + + return false; +} + +inline bool isModuleFailsafeAvailable(uint8_t idx) +{ +#if defined(PXX2) + if (isModuleISRM(idx)) + return true; +#endif + + if (isModuleXJT(idx)) + return g_model.moduleData[idx].subType == MODULE_SUBTYPE_PXX1_ACCST_D16; + +#if defined(MULTIMODULE) + if (isModuleMultimodule(idx)) + return multiModuleStatus.isValid() && multiModuleStatus.supportsFailsafe(); +#endif + + if (isModuleR9M(idx)) + return true; + + return false; +} + +inline bool isModuleBindRangeAvailable(uint8_t moduleIdx) +{ + return isModulePXX2(moduleIdx) || isModulePXX1(moduleIdx) || isModuleDSM2(moduleIdx) || isModuleMultimodule(moduleIdx); +} + +inline uint8_t getMaxRxNum(uint8_t idx) +{ + if (isModuleDSM2(idx)) + return 20; + +#if defined(MULTIMODULE) + if (isModuleMultimodule(idx)) + return g_model.moduleData[idx].getMultiProtocol(true) == MODULE_SUBTYPE_MULTI_OLRS ? 4 : 15; +#endif + + return 63; +} + +inline const char * getModuleDelay(uint8_t idx) +{ + if (isModuleISRMAccess(idx)) + return sentModuleChannels(idx) > 16 ? "(21ms)" : (sentModuleChannels(idx) > 8 ? "(14ms)" : "(7ms)"); + + if (isModuleXJTD16(idx) || isModuleR9MNonAccess(idx)) + return sentModuleChannels(idx) > 8 ? "(18ms)" : "(9ms)"; + + return nullptr; +} + +inline bool isBindCh9To16Allowed(uint8_t moduleIndex) +{ + if (g_model.moduleData[moduleIndex].channelsCount <= 0) { + return false; + } + + if (isModuleR9M_LBT(moduleIndex)) { + if (isModuleR9MLite(moduleIndex)) + return g_model.moduleData[moduleIndex].pxx.power != R9M_LBT_POWER_25_8CH; + else + return g_model.moduleData[moduleIndex].pxx.power != R9M_LITE_LBT_POWER_25_8CH; + } + else { + return true; + } +} + +inline bool isTelemAllowedOnBind(uint8_t moduleIndex) +{ +#if defined(HARDWARE_INTERNAL_MODULE) + if (moduleIndex == INTERNAL_MODULE) + return isModuleISRM(moduleIndex) || isSportLineUsedByInternalModule(); + + if (isSportLineUsedByInternalModule()) + return false; +#endif + + if (g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_R9M_LITE_PXX1) { + if (isModuleR9M_LBT(EXTERNAL_MODULE)) + return g_model.moduleData[EXTERNAL_MODULE].pxx.power < R9M_LITE_LBT_POWER_100_16CH_NOTELEM; + else + return true; + } + + if (g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_R9M_PXX1 || g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_R9M_LITE_PRO_PXX1) { + if (isModuleR9M_LBT(EXTERNAL_MODULE)) + return g_model.moduleData[EXTERNAL_MODULE].pxx.power < R9M_LBT_POWER_200_16CH_NOTELEM; + else + return true; + } + + return true; +} #endif // _MODULES_H_ diff --git a/radio/src/pulses/multi.cpp b/radio/src/pulses/multi.cpp index cc5ead610..babfc4bb1 100644 --- a/radio/src/pulses/multi.cpp +++ b/radio/src/pulses/multi.cpp @@ -102,7 +102,7 @@ void setupPulsesMultimodule() // Every 1000 cycles (=9s) send a config packet that configures the multimodule (inversion, telemetry type) counter++; - if (counter % 1000== 500) { + if (counter % 1000 == 500) { sendSetupFrame(); } else if (counter % 1000 == 0 && g_model.moduleData[EXTERNAL_MODULE].failsafeMode != FAILSAFE_NOT_SET && g_model.moduleData[EXTERNAL_MODULE].failsafeMode != FAILSAFE_RECEIVER) { diff --git a/radio/src/pulses/pulses.cpp b/radio/src/pulses/pulses.cpp index 23aaa1072..7a8cae8ac 100755 --- a/radio/src/pulses/pulses.cpp +++ b/radio/src/pulses/pulses.cpp @@ -61,21 +61,31 @@ uint8_t getRequiredProtocol(uint8_t module) break; } #endif - // no break + protocol = PROTOCOL_CHANNELS_PXX1_PULSES; + break; case MODULE_TYPE_R9M_PXX1: protocol = PROTOCOL_CHANNELS_PXX1_PULSES; break; +#if defined(HARDWARE_EXTERNAL_MODULE_SIZE_SML) case MODULE_TYPE_R9M_LITE_PXX1: + case MODULE_TYPE_R9M_LITE_PRO_PXX1: protocol = PROTOCOL_CHANNELS_PXX1_SERIAL; break; + case MODULE_TYPE_R9M_LITE_PXX2: + protocol = PROTOCOL_CHANNELS_PXX2_LOWSPEED; + break; +#endif + case MODULE_TYPE_ISRM_PXX2: case MODULE_TYPE_R9M_PXX2: - case MODULE_TYPE_R9M_LITE_PXX2: +#if defined(HARDWARE_EXTERNAL_MODULE_SIZE_SML) + case MODULE_TYPE_XJT_LITE_PXX2: case MODULE_TYPE_R9M_LITE_PRO_PXX2: - protocol = PROTOCOL_CHANNELS_PXX2; +#endif + protocol = PROTOCOL_CHANNELS_PXX2_HIGHSPEED; break; case MODULE_TYPE_SBUS: @@ -133,76 +143,21 @@ uint8_t getRequiredProtocol(uint8_t module) return protocol; } -void disablePulses(uint8_t module, uint8_t protocol) -{ - // stop existing protocol hardware - - switch (protocol) { -#if defined(PXX1) - case PROTOCOL_CHANNELS_PXX1_PULSES: - disable_pxx1_pulses(module); - break; - -#if defined(INTMODULE_USART) || defined(EXTMODULE_USART) - case PROTOCOL_CHANNELS_PXX1_SERIAL: - disable_pxx1_serial(module); - break; -#endif -#endif - -#if defined(DSM2) - case PROTOCOL_CHANNELS_DSM2_LP45: - case PROTOCOL_CHANNELS_DSM2_DSM2: - case PROTOCOL_CHANNELS_DSM2_DSMX: - disable_serial(module); - break; -#endif - -#if defined(CROSSFIRE) - case PROTOCOL_CHANNELS_CROSSFIRE: - // TODO disable_module_timer(module); - break; -#endif - -#if defined(PXX2) - case PROTOCOL_CHANNELS_PXX2: - disable_pxx2(module); - break; -#endif - -#if defined(MULTIMODULE) - case PROTOCOL_CHANNELS_MULTIMODULE: -#endif - -#if defined(SBUS) - case PROTOCOL_CHANNELS_SBUS: - disable_serial(module); - break; -#endif - -#if defined(PPM) - case PROTOCOL_CHANNELS_PPM: - disable_ppm(module); - break; -#endif - } -} - -void enablePulses(uint8_t module, uint8_t protocol) +void enablePulsesExternalModule(uint8_t protocol) { // start new protocol hardware here switch (protocol) { #if defined(PXX1) case PROTOCOL_CHANNELS_PXX1_PULSES: - init_pxx1_pulses(module); - break; - -#if defined(INTMODULE_USART) || defined(EXTMODULE_USART) - case PROTOCOL_CHANNELS_PXX1_SERIAL: - init_pxx1_serial(module); + extmodulePxx1PulsesStart(); break; #endif + +#if defined(PXX1) && defined(HARDWARE_EXTERNAL_MODULE_SIZE_SML) + case PROTOCOL_CHANNELS_PXX1_SERIAL: + extmodulePxx1SerialStart(); + break; #endif #if defined(DSM2) @@ -215,13 +170,17 @@ void enablePulses(uint8_t module, uint8_t protocol) #if defined(CROSSFIRE) case PROTOCOL_CHANNELS_CROSSFIRE: - // TODO init_module_timer(module, CROSSFIRE_PERIOD, true); + EXTERNAL_MODULE_ON(); break; #endif #if defined(PXX2) - case PROTOCOL_CHANNELS_PXX2: - init_pxx2(module); + case PROTOCOL_CHANNELS_PXX2_HIGHSPEED: + extmoduleInvertedSerialStart(PXX2_HIGHSPEED_BAUDRATE); + break; + + case PROTOCOL_CHANNELS_PXX2_LOWSPEED: + extmoduleInvertedSerialStart(PXX2_LOWSPEED_BAUDRATE); break; #endif @@ -239,54 +198,7 @@ void enablePulses(uint8_t module, uint8_t protocol) #if defined(PPM) case PROTOCOL_CHANNELS_PPM: - init_ppm(module); - break; -#endif - - default: - // TODO some reworking needed here ... -#if defined(PXX2) - disable_pxx2(module); -#endif - break; - } -} - -void setupPulsesInternalModule(uint8_t protocol) -{ - switch (protocol) { -#if defined(HARDWARE_INTERNAL_MODULE) && defined(PXX1) && !defined(INTMODULE_USART) - case PROTOCOL_CHANNELS_PXX1_PULSES: - intmodulePulsesData.pxx.setupFrame(INTERNAL_MODULE); - scheduleNextMixerCalculation(INTERNAL_MODULE, INTMODULE_PXX_PERIOD); - break; -#endif - -#if defined(PXX1) && defined(INTMODULE_USART) - case PROTOCOL_CHANNELS_PXX1_SERIAL: - intmodulePulsesData.pxx_uart.setupFrame(INTERNAL_MODULE); - scheduleNextMixerCalculation(INTERNAL_MODULE, INTMODULE_PXX_PERIOD); - break; -#endif - -#if defined(PXX2) - case PROTOCOL_CHANNELS_PXX2: - intmodulePulsesData.pxx2.setupFrame(INTERNAL_MODULE); - if (moduleState[INTERNAL_MODULE].mode == MODULE_MODE_SPECTRUM_ANALYSER || moduleState[INTERNAL_MODULE].mode == MODULE_MODE_POWER_METER) { - scheduleNextMixerCalculation(INTERNAL_MODULE, PXX2_TOOLS_PERIOD); - } -#if !defined(INTMODULE_HEARTBEAT) - else { - scheduleNextMixerCalculation(INTERNAL_MODULE, PXX2_PERIOD); - } -#endif - break; -#endif - -#if defined(PCBTARANIS) && defined(INTERNAL_MODULE_PPM) - case PROTOCOL_CHANNELS_PPM: - setupPulsesPPM(&extmodulePulsesData.ppm, g_model.moduleData[INTERNAL_MODULE].channelsStart, g_model.moduleData[INTERNAL_MODULE].channelsCount, g_model.moduleData[INTERNAL_MODULE].ppm.frameLength); - scheduleNextMixerCalculation(INTERNAL_MODULE, PPM_PERIOD(INTERNAL_MODULE)); + extmodulePpmStart(); break; #endif @@ -305,15 +217,16 @@ void setupPulsesExternalModule(uint8_t protocol) break; #endif -#if defined(PXX1) && defined(EXTMODULE_USART) +#if defined(PXX1) && defined(HARDWARE_EXTERNAL_MODULE_SIZE_SML) case PROTOCOL_CHANNELS_PXX1_SERIAL: extmodulePulsesData.pxx_uart.setupFrame(EXTERNAL_MODULE); - scheduleNextMixerCalculation(EXTERNAL_MODULE, EXTMODULE_PXX_SERIAL_PERIOD); + scheduleNextMixerCalculation(EXTERNAL_MODULE, EXTMODULE_PXX1_SERIAL_PERIOD); break; #endif #if defined(PXX2) - case PROTOCOL_CHANNELS_PXX2: + case PROTOCOL_CHANNELS_PXX2_HIGHSPEED: + case PROTOCOL_CHANNELS_PXX2_LOWSPEED: extmodulePulsesData.pxx2.setupFrame(EXTERNAL_MODULE); scheduleNextMixerCalculation(EXTERNAL_MODULE, PXX2_PERIOD); break; @@ -361,35 +274,113 @@ void setupPulsesExternalModule(uint8_t protocol) } } -void setupPulses(uint8_t module, uint8_t protocol) -{ - switch (module) { #if defined(HARDWARE_INTERNAL_MODULE) - case INTERNAL_MODULE: - setupPulsesInternalModule(protocol); +void enablePulsesInternalModule(uint8_t protocol) +{ + // start new protocol hardware here + + switch (protocol) { +#if defined(PXX1) && !defined(INTMODULE_USART) + case PROTOCOL_CHANNELS_PXX1_PULSES: + intmodulePxx1PulsesStart(); break; #endif - case EXTERNAL_MODULE: - setupPulsesExternalModule(protocol); +#if defined(PXX1) && defined(INTMODULE_USART) + case PROTOCOL_CHANNELS_PXX1_SERIAL: + intmodulePxx1SerialStart(); + break; +#endif + +#if defined(PXX2) + case PROTOCOL_CHANNELS_PXX2_HIGHSPEED: + intmoduleSerialStart(PXX2_HIGHSPEED_BAUDRATE, true); + break; +#endif + + default: break; } } -bool setupPulses(uint8_t module) +void setupPulsesInternalModule(uint8_t protocol) { - uint8_t protocol = getRequiredProtocol(module); + switch (protocol) { +#if defined(HARDWARE_INTERNAL_MODULE) && defined(PXX1) && !defined(INTMODULE_USART) + case PROTOCOL_CHANNELS_PXX1_PULSES: + intmodulePulsesData.pxx.setupFrame(INTERNAL_MODULE); + scheduleNextMixerCalculation(INTERNAL_MODULE, INTMODULE_PXX1_SERIAL_PERIOD); + break; +#endif - heartbeat |= (HEART_TIMER_PULSES << module); +#if defined(PXX1) && defined(INTMODULE_USART) + case PROTOCOL_CHANNELS_PXX1_SERIAL: + intmodulePulsesData.pxx_uart.setupFrame(INTERNAL_MODULE); +#if !defined(INTMODULE_HEARTBEAT) + scheduleNextMixerCalculation(INTERNAL_MODULE, INTMODULE_PXX1_SERIAL_PERIOD); +#endif + break; +#endif - if (moduleState[module].protocol != protocol) { - disablePulses(module, moduleState[module].protocol); - moduleState[module].protocol = protocol; - enablePulses(module, protocol); +#if defined(PXX2) + case PROTOCOL_CHANNELS_PXX2_HIGHSPEED: + intmodulePulsesData.pxx2.setupFrame(INTERNAL_MODULE); + if (moduleState[INTERNAL_MODULE].mode == MODULE_MODE_SPECTRUM_ANALYSER || moduleState[INTERNAL_MODULE].mode == MODULE_MODE_POWER_METER) { + scheduleNextMixerCalculation(INTERNAL_MODULE, PXX2_TOOLS_PERIOD); + } +#if !defined(INTMODULE_HEARTBEAT) + else { + scheduleNextMixerCalculation(INTERNAL_MODULE, PXX2_PERIOD); + } +#endif + break; +#endif + +#if defined(PCBTARANIS) && defined(INTERNAL_MODULE_PPM) + case PROTOCOL_CHANNELS_PPM: + setupPulsesPPM(&extmodulePulsesData.ppm, g_model.moduleData[INTERNAL_MODULE].channelsStart, g_model.moduleData[INTERNAL_MODULE].channelsCount, g_model.moduleData[INTERNAL_MODULE].ppm.frameLength); + scheduleNextMixerCalculation(INTERNAL_MODULE, PPM_PERIOD(INTERNAL_MODULE)); + break; +#endif + + default: + break; + } +} + +bool setupPulsesInternalModule() +{ + uint8_t protocol = getRequiredProtocol(INTERNAL_MODULE); + + heartbeat |= (HEART_TIMER_PULSES << INTERNAL_MODULE); + + if (moduleState[INTERNAL_MODULE].protocol != protocol) { + intmoduleStop(); + moduleState[INTERNAL_MODULE].protocol = protocol; + enablePulsesInternalModule(protocol); return false; } else { - setupPulses(module, protocol); + setupPulsesInternalModule(protocol); + return true; + } +} +#endif + +bool setupPulsesExternalModule() +{ + uint8_t protocol = getRequiredProtocol(EXTERNAL_MODULE); + + heartbeat |= (HEART_TIMER_PULSES << EXTERNAL_MODULE); + + if (moduleState[EXTERNAL_MODULE].protocol != protocol) { + extmoduleStop(); + moduleState[EXTERNAL_MODULE].protocol = protocol; + enablePulsesExternalModule(protocol); + return false; + } + else { + setupPulsesExternalModule(protocol); return true; } } diff --git a/radio/src/pulses/pulses.h b/radio/src/pulses/pulses.h index 35c9a6cf1..d583157fb 100644 --- a/radio/src/pulses/pulses.h +++ b/radio/src/pulses/pulses.h @@ -94,6 +94,8 @@ PACK(struct PXX2HardwareInformation { PXX2Version hwVersion; PXX2Version swVersion; uint8_t variant; + uint32_t capabilities; // variable length + uint8_t capabilityNotSupported; }); PACK(struct ModuleInformation { @@ -110,9 +112,10 @@ PACK(struct ModuleInformation { class ModuleSettings { public: uint8_t state; // 0x00 = READ 0x40 = WRITE - tmr10ms_t retryTime; + tmr10ms_t timeout; uint8_t externalAntenna; int8_t txPower; + uint8_t dirty; }; class ReceiverSettings { @@ -123,13 +126,14 @@ class ReceiverSettings { uint8_t dirty; uint8_t telemetryDisabled; uint8_t pwmRate; + uint8_t fport; uint8_t outputsCount; uint8_t outputsMapping[24]; }; class BindInformation { public: - uint8_t step; + int8_t step; uint32_t timeout; char candidateReceiversNames[PXX2_MAX_RECEIVERS_PER_MODULE][PXX2_LEN_RX_NAME + 1]; uint8_t candidateReceiversCount; @@ -166,6 +170,7 @@ PACK(struct ModuleState { union { ModuleInformation * moduleInformation; ModuleSettings * moduleSettings; + ReceiverSettings * receiverSettings; BindInformation * bindInformation; OtaUpdateInformation * otaUpdateInformation; }; @@ -195,9 +200,22 @@ PACK(struct ModuleState { { moduleSettings = source; moduleSettings->state = PXX2_SETTINGS_WRITE; - moduleSettings->retryTime = 0; + moduleSettings->timeout = 0; mode = MODULE_MODE_MODULE_SETTINGS; } + void readReceiverSettings(ReceiverSettings * destination) + { + receiverSettings = destination; + receiverSettings->state = PXX2_SETTINGS_READ; + mode = MODULE_MODE_RECEIVER_SETTINGS; + } + void writeReceiverSettings(ReceiverSettings * source) + { + receiverSettings = source; + receiverSettings->state = PXX2_SETTINGS_WRITE; + receiverSettings->timeout = 0; + mode = MODULE_MODE_RECEIVER_SETTINGS; + } }); extern ModuleState moduleState[NUM_MODULES]; @@ -263,7 +281,7 @@ union InternalModulePulsesData { union ExternalModulePulsesData { #if defined(PXX1) - #if defined(EXTMODULE_USART) + #if defined(HARDWARE_EXTERNAL_MODULE_SIZE_SML) UartPxx1Pulses pxx_uart; #endif #if defined(PPM_PIN_SERIAL) @@ -302,7 +320,8 @@ union TrainerPulsesData { extern TrainerPulsesData trainerPulsesData; -bool setupPulses(uint8_t module); +bool setupPulsesInternalModule(); +bool setupPulsesExternalModule(); void setupPulsesDSM2(); void setupPulsesCrossfire(); void setupPulsesMultimodule(); @@ -314,28 +333,26 @@ void sendByteDsm2(uint8_t b); void putDsm2Flush(); void putDsm2SerialBit(uint8_t bit); void sendByteSbus(uint8_t b); - -#if defined(HUBSAN) -void Hubsan_Init(); -#endif +void intmodulePxx1PulsesStart(); +void intmodulePxx1SerialStart(); +void extmodulePxx1PulsesStart(); +void extmodulePxx1SerialStart(); +void extmodulePpmStart(); +void intmoduleStop(); +void extmoduleStop(); inline void startPulses() { s_pulses_paused = false; -#if defined(PCBTARANIS) || defined(PCBHORUS) - setupPulses(INTERNAL_MODULE); - setupPulses(EXTERNAL_MODULE); -#else - setupPulses(EXTERNAL_MODULE); +#if defined(HARDWARE_INTERNAL_MODULE) + setupPulsesInternalModule(); #endif -#if defined(PCBSKY9X) - init_ppm(EXTRA_MODULE); -#endif + setupPulsesExternalModule(); -#if defined(HUBSAN) - Hubsan_Init(); +#if defined(HARDWARE_EXTRA_MODULE) + extramodulePpmStart(); #endif } @@ -351,18 +368,39 @@ enum ChannelsProtocols { PROTOCOL_CHANNELS_CROSSFIRE, PROTOCOL_CHANNELS_MULTIMODULE, PROTOCOL_CHANNELS_SBUS, - PROTOCOL_CHANNELS_PXX2 + PROTOCOL_CHANNELS_PXX2_LOWSPEED, + PROTOCOL_CHANNELS_PXX2_HIGHSPEED, }; -inline bool pulsesStarted() { return moduleState[0].protocol != PROTOCOL_CHANNELS_UNINITIALIZED; } -inline void pausePulses() { s_pulses_paused = true; } -inline void resumePulses() { s_pulses_paused = false; } +inline void stopPulses() +{ + s_pulses_paused = true; + moduleState[0].protocol = PROTOCOL_CHANNELS_UNINITIALIZED; +} -#define SEND_FAILSAFE_NOW(idx) moduleState[idx].counter = 1 +inline bool pulsesStarted() +{ + return moduleState[0].protocol != PROTOCOL_CHANNELS_UNINITIALIZED; +} + +inline void pausePulses() +{ + s_pulses_paused = true; +} + +inline void resumePulses() +{ + s_pulses_paused = false; +} + +inline void SEND_FAILSAFE_NOW(uint8_t idx) +{ + moduleState[idx].counter = 1; +} inline void SEND_FAILSAFE_1S() { - for (int i=0; i -#if defined(PCBX12S) && PCBREV < 13 - #define pulse_duration_t uint32_t - #define trainer_pulse_duration_t uint16_t +#if defined(EXTMODULE_TIMER_32BITS) + typedef uint32_t pulse_duration_t; #else - #define pulse_duration_t uint16_t - #define trainer_pulse_duration_t uint16_t + typedef uint16_t pulse_duration_t; #endif +typedef uint16_t trainer_pulse_duration_t; + template class DataBuffer { public: diff --git a/radio/src/pulses/pxx.h b/radio/src/pulses/pxx.h index 738824d72..5d0bfaf05 100644 --- a/radio/src/pulses/pxx.h +++ b/radio/src/pulses/pxx.h @@ -27,31 +27,22 @@ #define PXX_SEND_FAILSAFE (1 << 4) #define PXX_SEND_RANGECHECK (1 << 5) -#define PXX2_EXTERNAL_MODULE_BAUDRATE 230400 +#define PXX2_LOWSPEED_BAUDRATE 230400 +#define PXX2_HIGHSPEED_BAUDRATE 450000 #define PXX2_PERIOD 4 // 4ms #define PXX2_TOOLS_PERIOD 1 // 1ms #define PXX2_FRAME_MAXLENGTH 64 #define PXX_PULSES_PERIOD 9/*ms*/ -#define EXTMODULE_PXX_SERIAL_PERIOD 4/*ms*/ -#define EXTMODULE_PXX_SERIAL_BAUDRATE 420000 +#define EXTMODULE_PXX1_SERIAL_PERIOD 4/*ms*/ +#define EXTMODULE_PXX1_SERIAL_BAUDRATE 420000 #if defined(PXX_FREQUENCY_HIGH) - #define INTMODULE_PXX_BAUDRATE 450000 - #define INTMODULE_PXX_PERIOD 4/*ms*/ + #define INTMODULE_PXX1_SERIAL_BAUDRATE 450000 + #define INTMODULE_PXX1_SERIAL_PERIOD 4/*ms*/ #else - #define INTMODULE_PXX_BAUDRATE 115200 - #define INTMODULE_PXX_PERIOD 9/*ms*/ -#endif - -#if defined(PXX_FREQUENCY_HIGH) && (!defined(INTMODULE_USART) || !defined(EXTMODULE_USART)) -/* PXX uses 20 bytes (as of Rev 1.1 document) with 8 changes per byte + stop bit ~= 162 max pulses */ -/* DSM2 uses 2 header + 12 channel bytes, with max 10 changes (8n2) per byte + 16 bits trailer ~= 156 max pulses */ -/* Multimodule uses 3 bytes header + 22 channel bytes with max 11 changes per byte (8e2) + 16 bits trailer ~= 291 max pulses */ -/* Multimodule reuses some of the DSM2 function and structs since the protocols are similar enough */ -/* sbus is 1 byte header, 22 channel bytes (11bit * 16ch) + 1 byte flags */ - -#error "Pulses array needs to be increased (PXX_FREQUENCY=HIGH)" + #define INTMODULE_PXX1_SERIAL_BAUDRATE 115200 + #define INTMODULE_PXX1_SERIAL_PERIOD 9/*ms*/ #endif // Used by the Sky9x family boards diff --git a/radio/src/pulses/pxx1.cpp b/radio/src/pulses/pxx1.cpp index 592fc285b..96c4cc558 100644 --- a/radio/src/pulses/pxx1.cpp +++ b/radio/src/pulses/pxx1.cpp @@ -21,45 +21,10 @@ #include "opentx.h" #include "pulses/pxx1.h" -const uint16_t Pxx1CrcMixin::CRCTable[] = { - 0x0000,0x1189,0x2312,0x329b,0x4624,0x57ad,0x6536,0x74bf, - 0x8c48,0x9dc1,0xaf5a,0xbed3,0xca6c,0xdbe5,0xe97e,0xf8f7, - 0x1081,0x0108,0x3393,0x221a,0x56a5,0x472c,0x75b7,0x643e, - 0x9cc9,0x8d40,0xbfdb,0xae52,0xdaed,0xcb64,0xf9ff,0xe876, - 0x2102,0x308b,0x0210,0x1399,0x6726,0x76af,0x4434,0x55bd, - 0xad4a,0xbcc3,0x8e58,0x9fd1,0xeb6e,0xfae7,0xc87c,0xd9f5, - 0x3183,0x200a,0x1291,0x0318,0x77a7,0x662e,0x54b5,0x453c, - 0xbdcb,0xac42,0x9ed9,0x8f50,0xfbef,0xea66,0xd8fd,0xc974, - 0x4204,0x538d,0x6116,0x709f,0x0420,0x15a9,0x2732,0x36bb, - 0xce4c,0xdfc5,0xed5e,0xfcd7,0x8868,0x99e1,0xab7a,0xbaf3, - 0x5285,0x430c,0x7197,0x601e,0x14a1,0x0528,0x37b3,0x263a, - 0xdecd,0xcf44,0xfddf,0xec56,0x98e9,0x8960,0xbbfb,0xaa72, - 0x6306,0x728f,0x4014,0x519d,0x2522,0x34ab,0x0630,0x17b9, - 0xef4e,0xfec7,0xcc5c,0xddd5,0xa96a,0xb8e3,0x8a78,0x9bf1, - 0x7387,0x620e,0x5095,0x411c,0x35a3,0x242a,0x16b1,0x0738, - 0xffcf,0xee46,0xdcdd,0xcd54,0xb9eb,0xa862,0x9af9,0x8b70, - 0x8408,0x9581,0xa71a,0xb693,0xc22c,0xd3a5,0xe13e,0xf0b7, - 0x0840,0x19c9,0x2b52,0x3adb,0x4e64,0x5fed,0x6d76,0x7cff, - 0x9489,0x8500,0xb79b,0xa612,0xd2ad,0xc324,0xf1bf,0xe036, - 0x18c1,0x0948,0x3bd3,0x2a5a,0x5ee5,0x4f6c,0x7df7,0x6c7e, - 0xa50a,0xb483,0x8618,0x9791,0xe32e,0xf2a7,0xc03c,0xd1b5, - 0x2942,0x38cb,0x0a50,0x1bd9,0x6f66,0x7eef,0x4c74,0x5dfd, - 0xb58b,0xa402,0x9699,0x8710,0xf3af,0xe226,0xd0bd,0xc134, - 0x39c3,0x284a,0x1ad1,0x0b58,0x7fe7,0x6e6e,0x5cf5,0x4d7c, - 0xc60c,0xd785,0xe51e,0xf497,0x8028,0x91a1,0xa33a,0xb2b3, - 0x4a44,0x5bcd,0x6956,0x78df,0x0c60,0x1de9,0x2f72,0x3efb, - 0xd68d,0xc704,0xf59f,0xe416,0x90a9,0x8120,0xb3bb,0xa232, - 0x5ac5,0x4b4c,0x79d7,0x685e,0x1ce1,0x0d68,0x3ff3,0x2e7a, - 0xe70e,0xf687,0xc41c,0xd595,0xa12a,0xb0a3,0x8238,0x93b1, - 0x6b46,0x7acf,0x4854,0x59dd,0x2d62,0x3ceb,0x0e70,0x1ff9, - 0xf78f,0xe606,0xd49d,0xc514,0xb1ab,0xa022,0x92b9,0x8330, - 0x7bc7,0x6a4e,0x58d5,0x495c,0x3de3,0x2c6a,0x1ef1,0x0f78 -}; - template uint8_t Pxx1Pulses::addFlag1(uint8_t module) { - uint8_t flag1 = (g_model.moduleData[module].rfProtocol << 6); + uint8_t flag1 = (g_model.moduleData[module].subType << 6); if (moduleState[module].mode == MODULE_MODE_BIND) { flag1 |= (g_eeGeneral.countryCode << 1) | PXX_SEND_BIND; } @@ -97,14 +62,14 @@ void Pxx1Pulses::addExtraFlags(uint8_t module) extra_flags |= (g_model.moduleData[module].pxx.receiver_telem_off << 1); extra_flags |= (g_model.moduleData[module].pxx.receiver_channel_9_16 << 2); - if (isModuleR9M(module)) { + if (isModuleR9MNonAccess(module)) { extra_flags |= (min(g_model.moduleData[module].pxx.power, isModuleR9M_FCC_VARIANT(module) ? (uint8_t)R9M_FCC_POWER_MAX : (uint8_t)R9M_LBT_POWER_MAX) << 3); if (isModuleR9M_EUPLUS(module)) extra_flags |= (1 << 6); } // Disable S.PORT if internal module is active - if (IS_TELEMETRY_INTERNAL_MODULE()) { + if (module == EXTERNAL_MODULE && isSportLineUsedByInternalModule()) { extra_flags |= (1 << 5); } PxxTransport::addByte(extra_flags); diff --git a/radio/src/pulses/pxx1.h b/radio/src/pulses/pxx1.h index 3d605de75..80dde1d5a 100644 --- a/radio/src/pulses/pxx1.h +++ b/radio/src/pulses/pxx1.h @@ -22,6 +22,7 @@ #define _PULSES_PXX1_H_ #include "pxx.h" +#include "crc.h" struct HeartbeatCapture { uint32_t timestamp; @@ -40,7 +41,7 @@ class Pxx1CrcMixin { void addToCrc(uint8_t byte) { - crc = (crc << 8) ^ (CRCTable[((crc >> 8) ^ byte) & 0xFF]); + crc = (crc << 8) ^ (crc16tab_1189[((crc >> 8) ^ byte) & 0xFF]); } uint16_t crc; diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index ada03129f..53875122e 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -20,6 +20,7 @@ #include "opentx.h" #include "pulses/pxx2.h" +#include "io/frsky_firmware_update.h" uint8_t Pxx2Pulses::addFlag0(uint8_t module) { @@ -38,8 +39,15 @@ uint8_t Pxx2Pulses::addFlag0(uint8_t module) void Pxx2Pulses::addFlag1(uint8_t module) { - uint8_t flag1 = g_model.moduleData[module].subType << 4; - Pxx2Transport::addByte(flag1); + uint8_t subType; + if (isModuleXJT(module)) { + static const uint8_t PXX2_XJT_MODULE_SUBTYPES[] = {0x01, 0x03, 0x02}; + subType = PXX2_XJT_MODULE_SUBTYPES[min(g_model.moduleData[module].subType, 2)]; + } + else { + subType = g_model.moduleData[module].subType; + } + Pxx2Transport::addByte(subType << 4); } void Pxx2Pulses::addPulsesValues(uint16_t low, uint16_t high) @@ -179,7 +187,7 @@ void Pxx2Pulses::setupModuleSettingsFrame(uint8_t module) { ModuleSettings * destination = moduleState[module].moduleSettings; - if (get_tmr10ms() > destination->retryTime) { + if (get_tmr10ms() > destination->timeout) { addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_TX_SETTINGS); uint8_t flag0 = 0; if (destination->state == PXX2_SETTINGS_WRITE) @@ -192,7 +200,7 @@ void Pxx2Pulses::setupModuleSettingsFrame(uint8_t module) Pxx2Transport::addByte(flag1); Pxx2Transport::addByte(destination->txPower); } - destination->retryTime = get_tmr10ms() + 200/*next try in 2s*/; + destination->timeout = get_tmr10ms() + 200/*next try in 2s*/; } else { setupChannelsFrame(module); @@ -213,6 +221,8 @@ void Pxx2Pulses::setupReceiverSettingsFrame(uint8_t module) flag1 |= PXX2_RX_SETTINGS_FLAG1_TELEMETRY_DISABLED; if (reusableBuffer.hardwareAndSettings.receiverSettings.pwmRate) flag1 |= PXX2_RX_SETTINGS_FLAG1_FASTPWM; + if (reusableBuffer.hardwareAndSettings.receiverSettings.fport) + flag1 |= PXX2_RX_SETTINGS_FLAG1_FPORT; Pxx2Transport::addByte(flag1); uint8_t outputsCount = min(24, reusableBuffer.hardwareAndSettings.receiverSettings.outputsCount); for (int i = 0; i < outputsCount; i++) { @@ -263,7 +273,12 @@ void Pxx2Pulses::setupAccessBindFrame(uint8_t module) for (uint8_t i=0; icandidateReceiversNames[destination->selectedReceiverIndex][i]); } - Pxx2Transport::addByte((destination->lbtMode << 6) + (destination->flexMode << 4) + destination->rxUid); // RX_UID is the slot index (which is unique and never moved) + if (isModuleR9MAccess(module)) { + Pxx2Transport::addByte((destination->lbtMode << 6) + (destination->flexMode << 4) + destination->rxUid); // RX_UID is the slot index (which is unique and never moved) + } + else { + Pxx2Transport::addByte(destination->rxUid); // RX_UID is the slot index (which is unique and never moved) + } Pxx2Transport::addByte(g_model.header.modelId[module]); } else { @@ -362,6 +377,8 @@ void Pxx2Pulses::setupFrame(uint8_t module) case MODULE_MODE_BIND: if (g_model.moduleData[module].type == MODULE_TYPE_ISRM_PXX2 && g_model.moduleData[module].subType != MODULE_SUBTYPE_ISRM_PXX2_ACCESS) setupAccstBindFrame(module); + else if (g_model.moduleData[module].type == MODULE_TYPE_XJT_LITE_PXX2) + setupAccstBindFrame(module); else setupAccessBindFrame(module); break; @@ -447,7 +464,20 @@ const char * Pxx2OtaUpdate::doFlashFirmware(const char * filename) return "Open file failed"; } - uint32_t size = f_size(&file); + uint32_t size; + const char * ext = getFileExtension(filename); + if (ext && !strcasecmp(ext, UPDATE_FIRMWARE_EXT)) { + FrSkyFirmwareInformation * information = (FrSkyFirmwareInformation *) buffer; + if (f_read(&file, buffer, sizeof(FrSkyFirmwareInformation), &count) != FR_OK || count != sizeof(FrSkyFirmwareInformation)) { + f_close(&file); + return "Format error"; + } + size = information->size; + } + else { + size = f_size(&file); + } + uint32_t done = 0; while (1) { drawProgressScreen(getBasename(filename), STR_OTA_UPDATE, done, size); diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index 98186d5d3..7ce8454e7 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -51,13 +51,28 @@ #define PXX2_RX_SETTINGS_FLAG1_TELEMETRY_DISABLED (1 << 7) #define PXX2_RX_SETTINGS_FLAG1_READONLY (1 << 6) #define PXX2_RX_SETTINGS_FLAG1_FASTPWM (1 << 4) +#define PXX2_RX_SETTINGS_FLAG1_FPORT (1 << 3) #define PXX2_TX_SETTINGS_FLAG0_WRITE (1 << 6) #define PXX2_TX_SETTINGS_FLAG1_EXTERNAL_ANTENNA (1 << 3) #define PXX2_HW_INFO_TX_ID 0xFF -static const char * const PXX2modulesModels[] = { +enum PXX2ModuleModelID { + PXX2_MODULE_NONE, + PXX2_MODULE_XJT, + PXX2_MODULE_ISRM, + PXX2_MODULE_ISRM_PRO, + PXX2_MODULE_ISRM_S, + PXX2_MODULE_R9M, + PXX2_MODULE_R9M_LITE, + PXX2_MODULE_R9M_LITE_PRO, + PXX2_MODULE_ISRM_N, + PXX2_MODULE_ISRM_S_X9, + PXX2_MODULE_ISRM_S_X10 +}; + +static const char * const PXX2ModulesNames[] = { "---", "XJT", "ISRM", @@ -66,10 +81,68 @@ static const char * const PXX2modulesModels[] = { "R9M", "R9MLite", "R9MLite-PRO", - "ISRM-N" + "ISRM-N", + "ISRM-S-X9", + "ISRM-S-X10", }; -static const char * const PXX2receiversModels[] = { +inline const char * getPXX2ModuleName(uint8_t modelId) +{ + if (modelId < DIM(PXX2ModulesNames)) + return PXX2ModulesNames[modelId]; + else + return PXX2ModulesNames[0]; +} + +enum { + MODULE_OPTION_EXTERNAL_ANTENNA, + MODULE_OPTION_POWER, + MODULE_OPTION_SPECTRUM_ANALYSER, + MODULE_OPTION_POWER_METER, +}; + +/* Module options order: + * - External antenna (0x01) + * - Power (0x02) + * - Spektrum analyser (0x04) + * - Power meter (0x08) + */ +static const uint8_t PXX2ModuleOptions[] = { +#if defined(SIMU) + 0b11111111, // None = display all options on SIMU +#else + 0b00000000, // None = no option available on unknown modules +#endif + 0b11110001, // XJT + 0b11110001, // ISRM + 0b11111101, // ISRM-PRO + 0b11110101, // ISRM-S + 0b11110010, // R9M + 0b11110010, // R9MLite + 0b11110110, // R9MLite-PRO + 0b11110100, // ISRM-N + 0b11110100, // ISRM-S-X9 + 0b11110100, // ISRM-S-X10 +}; + +inline uint8_t getPXX2ModuleOptions(uint8_t modelId) +{ + if (modelId < DIM(PXX2ModuleOptions)) + return PXX2ModuleOptions[modelId]; + else + return PXX2ModuleOptions[0]; +} + +inline bool isPXX2ModuleOptionAvailable(uint8_t modelId, uint8_t option) +{ + return getPXX2ModuleOptions(modelId) & (1 << option); +} + +enum ModuleCapabilities { + MODULE_CAPABILITY_COUNT +}; + +static const char * const PXX2ReceiversNames[] = { "---", "X8R", "RX8R", @@ -95,17 +168,77 @@ static const char * const PXX2receiversModels[] = { "R9-MINI", "R9-MM", "R9-STAB", + "R9-MINI-OTA", // this one has OTA (different bootloader) + "R9-MM-OTA", // this one has OTA (different bootloader) + "R9-SLIM+-OTA", // this one has OTA (different bootloader) }; -enum PXX2ModuleModelID { - PXX2_MODULE_NONE, - PXX2_MODULE_XJT, - PXX2_MODULE_IXJT, - PXX2_MODULE_IXJT_PRO, - PXX2_MODULE_IXJT_S, - PXX2_MODULE_R9M, - PXX2_MODULE_R9M_LITE, - PXX2_MODULE_R9M_LITE_PRO, +inline const char * getPXX2ReceiverName(uint8_t modelId) +{ + if (modelId < DIM(PXX2ReceiversNames)) + return PXX2ReceiversNames[modelId]; + else + return PXX2ReceiversNames[0]; +} + +enum { + RECEIVER_OPTION_OTA, +}; + +/* Receiver options order: + * - OTA (0x01) + */ +static const uint8_t PXX2ReceiverOptions[] = { +#if defined(SIMU) + 0b11111111, // None = display all options on SIMU +#else + 0b00000000, // None = display all options on SIMU +#endif + 0b11111110, // X8R + 0b11111110, // RX8R + 0b11111110, // RX8R-PRO + 0b11111110, // RX6R + 0b11111110, // RX4R + 0b11111110, // G-RX8 + 0b11111110, // G-RX6 + 0b11111110, // X6R + 0b11111110, // X4R + 0b11111110, // X4R-SB + 0b11111110, // XSR + 0b11111110, // XSR-M + 0b11111110, // RXSR + 0b11111110, // S6R + 0b11111110, // S8R + 0b11111110, // XM + 0b11111110, // XM+ + 0b11111110, // XMR + 0b11111110, // R9 + 0b11111110, // R9-SLIM + 0b11111110, // R9-SLIM+ + 0b11111110, // R9-MINI + 0b11111110, // R9-MM + 0b11111110, // R9-STAB + 0b11111111, // R9-MINI+OTA + 0b11111111, // R9-MM+OTA + 0b11111111, // R9-SLIM+OTA +}; + +inline uint8_t getPXX2ReceiverOptions(uint8_t modelId) +{ + if (modelId < DIM(PXX2ReceiverOptions)) + return PXX2ReceiverOptions[modelId]; + else + return PXX2ReceiverOptions[0]; +} + +inline bool isPXX2ReceiverOptionAvailable(uint8_t modelId, uint8_t option) +{ + return getPXX2ReceiverOptions(modelId) & (1 << option); +} + +enum ReceiverCapabilities { + RECEIVER_CAPABILITY_FPORT, + RECEIVER_CAPABILITY_COUNT }; enum PXX2Variant { @@ -123,6 +256,8 @@ enum PXX2RegisterSteps { }; enum PXX2BindSteps { + BIND_MODULE_TX_INFORMATION_REQUEST = -2, + BIND_MODULE_TX_SETTINGS_REQUEST = -1, BIND_INIT, BIND_RX_NAME_SELECTED, BIND_INFO_REQUEST, diff --git a/radio/src/rtos.h b/radio/src/rtos.h index a67ee9887..6e42ebf30 100644 --- a/radio/src/rtos.h +++ b/radio/src/rtos.h @@ -28,7 +28,6 @@ extern "C++" { #endif #if defined(SIMU) - #include #include @@ -113,10 +112,20 @@ extern "C++" { #define TASK_FUNCTION(task) void * task(void * pdata) - template - inline void RTOS_CREATE_TASK(pthread_t &taskId, void * task(void *), const char *, FakeTaskStack &, unsigned, unsigned) + inline void RTOS_CREATE_TASK(pthread_t &taskId, void * task(void *), const char * name) { pthread_create(&taskId, nullptr, task, nullptr); +#ifdef __linux__ + pthread_setname_np(taskId, name); +#endif + } + +template + inline void RTOS_CREATE_TASK(pthread_t &taskId, void * task(void *), const char * name, FakeTaskStack &, unsigned size = 0, unsigned priority = 0) + { + UNUSED(size); + UNUSED(priority); + RTOS_CREATE_TASK(taskId, task, name); } #define TASK_RETURN() return nullptr @@ -137,9 +146,7 @@ extern "C++" { { return (uint32_t)(simuTimerMicros() / 1000); } - #elif defined(RTOS_COOS) - #ifdef __cplusplus extern "C" { #endif diff --git a/radio/src/sdcard.cpp b/radio/src/sdcard.cpp index 59a2f239b..60948c913 100644 --- a/radio/src/sdcard.cpp +++ b/radio/src/sdcard.cpp @@ -77,7 +77,7 @@ bool isFileAvailable(const char * path, bool exclDir) FILINFO fno; return (f_stat(path, &fno) == FR_OK && !(fno.fattrib & AM_DIR)); } - return f_stat(path, 0) == FR_OK; + return f_stat(path, nullptr) == FR_OK; } /** diff --git a/radio/src/sdcard.h b/radio/src/sdcard.h index 5f39d936a..2b86198a4 100644 --- a/radio/src/sdcard.h +++ b/radio/src/sdcard.h @@ -37,6 +37,7 @@ #define SYSTEM_SUBDIR "SYSTEM" #define BITMAPS_PATH ROOT_PATH "IMAGES" #define FIRMWARES_PATH ROOT_PATH "FIRMWARE" +#define AUTOUPDATE_FILENAME FIRMWARES_PATH "/autoupdate.frsk" #define EEPROMS_PATH ROOT_PATH "EEPROM" #define SCRIPTS_PATH ROOT_PATH "SCRIPTS" #define WIZARD_PATH SCRIPTS_PATH "/WIZARD" diff --git a/radio/src/simu.cpp b/radio/src/simu.cpp index 8bbf98260..35bd87f0a 100644 --- a/radio/src/simu.cpp +++ b/radio/src/simu.cpp @@ -42,17 +42,17 @@ #define W2 LCD_W*LCD_ZOOM #define H2 LCD_H*LCD_ZOOM -class Open9xSim: public FXMainWindow +class OpenTxSim: public FXMainWindow { - FXDECLARE(Open9xSim) + FXDECLARE(OpenTxSim) public: - Open9xSim(){}; - Open9xSim(FXApp* a); - ~Open9xSim(); + OpenTxSim(){}; + OpenTxSim(FXApp* a); + ~OpenTxSim(); void updateKeysAndSwitches(bool start=false); - long onKeypress(FXObject*,FXSelector,void*); - long onTimeout(FXObject*,FXSelector,void*); + long onKeypress(FXObject*, FXSelector, void*); + long onTimeout(FXObject*, FXSelector, void*); void createBitmap(int index, uint16_t *data, int x, int y, int w, int h); void makeSnapshot(const FXDrawable* drawable); void doEvents(); @@ -60,53 +60,51 @@ class Open9xSim: public FXMainWindow void setPixel(int x, int y, FXColor color); private: - FXImage *bmp; - FXImageFrame *bmf; - bool firstTime; + FXImage * bmp; + FXImageFrame * bmf; public: - FXSlider *sliders[NUM_STICKS]; - FXKnob *knobs[NUM_POTS+NUM_SLIDERS]; + FXSlider * sliders[NUM_STICKS]; + FXKnob * knobs[NUM_POTS+NUM_SLIDERS]; }; // Message Map -FXDEFMAP(Open9xSim) Open9xSimMap[] = { -//Message_Type _________ ID____Message_Handler_______ - FXMAPFUNC(SEL_TIMEOUT, 2, Open9xSim::onTimeout), - FXMAPFUNC(SEL_KEYPRESS, 0, Open9xSim::onKeypress), +FXDEFMAP(OpenTxSim) OpenTxSimMap[] = { + // Message_Type _______ID____Message_Handler_______ + FXMAPFUNC(SEL_TIMEOUT, 2, OpenTxSim::onTimeout), + FXMAPFUNC(SEL_KEYPRESS, 0, OpenTxSim::onKeypress), }; -FXIMPLEMENT(Open9xSim,FXMainWindow,Open9xSimMap,ARRAYNUMBER(Open9xSimMap)) +FXIMPLEMENT(OpenTxSim, FXMainWindow, OpenTxSimMap, ARRAYNUMBER(OpenTxSimMap)) -Open9xSim::Open9xSim(FXApp* a): - FXMainWindow(a, "OpenTX Simu", NULL, NULL, DECOR_ALL, 20, 90, 0, 0) +OpenTxSim::OpenTxSim(FXApp* a): + FXMainWindow(a, "OpenTX Simu", nullptr, nullptr, DECOR_ALL, 20, 90, 0, 0) { - firstTime = true; memset(displayBuf, 0, DISPLAY_BUFFER_SIZE * sizeof(display_t)); - bmp = new FXPPMImage(getApp(),NULL,IMAGE_OWNED|IMAGE_KEEP|IMAGE_SHMI|IMAGE_SHMP, W2, H2); + bmp = new FXPPMImage(getApp(), nullptr, IMAGE_OWNED|IMAGE_KEEP|IMAGE_SHMI|IMAGE_SHMP, W2, H2); #if defined(SIMU_AUDIO) SDL_Init(SDL_INIT_AUDIO); #endif - FXHorizontalFrame *hf11=new FXHorizontalFrame(this,LAYOUT_CENTER_X); - FXHorizontalFrame *hf1=new FXHorizontalFrame(this,LAYOUT_FILL_X); + FXHorizontalFrame * hf11 = new FXHorizontalFrame(this, LAYOUT_CENTER_X); + FXHorizontalFrame * hf1 = new FXHorizontalFrame(this, LAYOUT_FILL_X); //rh lv rv lh for (int i=0; i<4; i++) { switch (i) { #define L LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|LAYOUT_FIX_X|LAYOUT_FIX_Y case 0: - sliders[i]=new FXSlider(hf1,NULL,0,L|SLIDER_HORIZONTAL,10,110,100,20); + sliders[i]=new FXSlider(hf1, nullptr, 0, L|SLIDER_HORIZONTAL, 10, 110, 100, 20); break; case 1: - sliders[i]=new FXSlider(hf1,NULL,0,L|SLIDER_VERTICAL,110,10,20,100); + sliders[i]=new FXSlider(hf1, nullptr, 0, L|SLIDER_VERTICAL, 110, 10, 20, 100); break; case 2: - sliders[i]=new FXSlider(hf1,NULL,0,L|SLIDER_VERTICAL,130,10,20,100); + sliders[i]=new FXSlider(hf1, nullptr, 0, L|SLIDER_VERTICAL, 130, 10, 20, 100); break; case 3: - sliders[i]=new FXSlider(hf1,NULL,0,L|SLIDER_HORIZONTAL,150,110,100,20); + sliders[i]=new FXSlider(hf1, nullptr, 0, L|SLIDER_HORIZONTAL, 150, 110, 100, 20); break; default:; } @@ -116,7 +114,7 @@ Open9xSim::Open9xSim(FXApp* a): } for(int i=0; isetValue(0); #if defined(PCBHORUS) @@ -130,17 +128,20 @@ Open9xSim::Open9xSim(FXApp* a): knobs[i]->setRange(-1024, 1024); } - bmf = new FXImageFrame(this,bmp); + bmf = new FXImageFrame(this, bmp); + bmf->enable(); + bmf->setTarget(this); updateKeysAndSwitches(true); getApp()->addTimeout(this, 2, 100); } -Open9xSim::~Open9xSim() +OpenTxSim::~OpenTxSim() { StopSimu(); StopAudioThread(); + #if defined(EEPROM) StopEepromThread(); #endif @@ -162,9 +163,9 @@ Open9xSim::~Open9xSim() #endif } -void Open9xSim::createBitmap(int index, uint16_t *data, int x, int y, int w, int h) +void OpenTxSim::createBitmap(int index, uint16_t *data, int x, int y, int w, int h) { - FXPNGImage snapshot(getApp(), NULL, IMAGE_OWNED, w, h); + FXPNGImage snapshot(getApp(), nullptr, IMAGE_OWNED, w, h); for (int i=0; igetWidth(), drawable->getHeight()); - snapshot.create(); + // Construct and create an FXImage object + FXPNGImage snapshot(getApp(), nullptr, 0, drawable->getWidth(), drawable->getHeight()); + snapshot.create(); - // Create a window device context and lock it onto the image - FXDCWindow dc(&snapshot); + // Create a window device context and lock it onto the image + FXDCWindow dc(&snapshot); - // Draw from the widget to this - dc.drawArea(drawable, 0, 0, drawable->getWidth(), drawable->getHeight(), 0, 0); + // Draw from the widget to this + dc.drawArea(drawable, 0, 0, drawable->getWidth(), drawable->getHeight(), 0, 0); - // Release lock - dc.end(); + // Release lock + dc.end(); - // Grab pixels from server side back to client side - snapshot.restore(); + // Grab pixels from server side back to client side + snapshot.restore(); - // Save recovered pixels to a file - FXFileStream stream; - char buf[100]; + // Save recovered pixels to a file + FXFileStream stream; + char buf[100]; - do { - stream.close(); - sprintf(buf,"snapshot_%02d.png", ++g_snapshot_idx); - } while (stream.open(buf, FXStreamLoad)); + do { + stream.close(); + sprintf(buf, "snapshot_%02d.png", ++g_snapshot_idx); + } while (stream.open(buf, FXStreamLoad)); - if (stream.open(buf, FXStreamSave)) { - snapshot.savePixels(stream); - stream.close(); - printf("Snapshot written: %s\n", buf); - } - else { - printf("Cannot create snapshot %s\n", buf); - } + if (stream.open(buf, FXStreamSave)) { + snapshot.savePixels(stream); + stream.close(); + printf("Snapshot written: %s\n", buf); + } + else { + printf("Cannot create snapshot %s\n", buf); + } } -void Open9xSim::doEvents() +void OpenTxSim::doEvents() { getApp()->runOneEvent(false); } -long Open9xSim::onKeypress(FXObject*,FXSelector,void*v) +long OpenTxSim::onKeypress(FXObject *, FXSelector, void * v) { - FXEvent *evt=(FXEvent*)v; - // printf("keypress %x\n", evt->code); - if (evt->code=='s') { + auto * evt = (FXEvent *)v; + + // TRACE("keypress %x", evt->code); + + if (evt->code == 's') { makeSnapshot(bmf); } + return 0; } -void Open9xSim::updateKeysAndSwitches(bool start) +void OpenTxSim::updateKeysAndSwitches(bool start) { - static int keys1[] = { + static int keys[] = { #if defined(PCBHORUS) KEY_Page_Up, KEY_PGUP, KEY_Page_Down, KEY_PGDN, @@ -279,8 +283,8 @@ void Open9xSim::updateKeysAndSwitches(bool start) #endif }; - for (unsigned int i=0; igetKeyState(keys1[i])); + for (unsigned int i=0; igetKeyState(keys[i])); } #ifdef __APPLE__ @@ -292,7 +296,7 @@ void Open9xSim::updateKeysAndSwitches(bool start) static FXuint trimKeys[] = { KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5, KEY_F6, KEY_F7, KEY_F8, KEY_F9, KEY_F10, KEY_F11, KEY_F12 }; #endif - for (unsigned i=0; igetKeyState(trimKeys[i])); } @@ -311,48 +315,48 @@ void Open9xSim::updateKeysAndSwitches(bool start) else { \ state##key = false; \ } \ - simuSetSwitch(swtch, state_##swtch-states); + simuSetSwitch(swtch, state_##swtch-states) -#if defined(PCBX9E) - SWITCH_KEY(A, 0, 3); - SWITCH_KEY(B, 1, 3); - SWITCH_KEY(C, 2, 3); - SWITCH_KEY(D, 3, 3); - SWITCH_KEY(E, 4, 3); - SWITCH_KEY(F, 5, 3); - SWITCH_KEY(G, 6, 3); - SWITCH_KEY(H, 7, 3); - SWITCH_KEY(I, 8, 3); - SWITCH_KEY(J, 9, 3); - SWITCH_KEY(K, 10, 3); - SWITCH_KEY(L, 11, 3); - SWITCH_KEY(M, 12, 3); - SWITCH_KEY(N, 13, 3); - SWITCH_KEY(O, 14, 3); - SWITCH_KEY(P, 15, 3); - SWITCH_KEY(Q, 16, 3); - SWITCH_KEY(R, 17, 3); -#elif defined(PCBTARANIS) || defined(PCBHORUS) - SWITCH_KEY(A, 0, 3); - SWITCH_KEY(B, 1, 3); - SWITCH_KEY(C, 2, 3); - SWITCH_KEY(D, 3, 3); - SWITCH_KEY(E, 4, 3); - SWITCH_KEY(F, 5, 2); - SWITCH_KEY(G, 6, 3); - SWITCH_KEY(H, 7, 2); -#else - SWITCH_KEY(1, 0, 2); +#if defined(PCBSKY9X) + SWITCH_KEY(1, 0, 3); SWITCH_KEY(2, 1, 2); SWITCH_KEY(3, 2, 2); - SWITCH_KEY(4, 3, 3); + SWITCH_KEY(4, 3, 2); SWITCH_KEY(5, 4, 2); SWITCH_KEY(6, 5, 2); SWITCH_KEY(7, 6, 2); +#else + SWITCH_KEY(A, 0, 3); + SWITCH_KEY(B, 1, 3); + SWITCH_KEY(C, 2, 3); + SWITCH_KEY(D, 3, 3); + + #if defined(HARDWARE_SWITCH_G) + SWITCH_KEY(E, 4, 3); + SWITCH_KEY(F, 5, 2); + SWITCH_KEY(G, 6, 3); + SWITCH_KEY(H, 7, 2); + #elif defined(HARDWARE_SWITCH_F) && defined(HARDWARE_SWITCH_H) + SWITCH_KEY(F, 4, 2); + SWITCH_KEY(H, 5, 2); + #endif + + #if defined(PCBX9E) + SWITCH_KEY(I, 8, 3); + SWITCH_KEY(J, 9, 3); + SWITCH_KEY(K, 10, 3); + SWITCH_KEY(L, 11, 3); + SWITCH_KEY(M, 12, 3); + SWITCH_KEY(N, 13, 3); + SWITCH_KEY(O, 14, 3); + SWITCH_KEY(P, 15, 3); + SWITCH_KEY(Q, 16, 3); + SWITCH_KEY(R, 17, 3); + #endif #endif } -long Open9xSim::onTimeout(FXObject*, FXSelector, void*) +long OpenTxSim::onTimeout(FXObject*, FXSelector, void*) { if (hasFocus()) { #if defined(COPROCESSOR) @@ -360,11 +364,6 @@ long Open9xSim::onTimeout(FXObject*, FXSelector, void*) Coproc_maxtemp = 28; #endif -#if defined(PCBSKY9X) - temperature = 31; - maxTemperature = 42; -#endif - updateKeysAndSwitches(); #if defined(ROTARY_ENCODER_NAVIGATION) @@ -381,49 +380,6 @@ long Open9xSim::onTimeout(FXObject*, FXSelector, void*) rotencAction = false; } #endif - -#if defined(PCBX9E) - SWITCH_KEY(A, 0, 3); - SWITCH_KEY(B, 1, 3); - SWITCH_KEY(C, 2, 3); - SWITCH_KEY(D, 3, 3); - SWITCH_KEY(E, 4, 3); - SWITCH_KEY(F, 5, 2); - SWITCH_KEY(G, 6, 3); - SWITCH_KEY(H, 7, 2); - SWITCH_KEY(I, 8, 3); - SWITCH_KEY(J, 9, 3); - SWITCH_KEY(K, 10, 3); - SWITCH_KEY(L, 11, 3); - SWITCH_KEY(M, 12, 3); - SWITCH_KEY(N, 13, 3); - SWITCH_KEY(O, 14, 3); - SWITCH_KEY(P, 15, 3); - SWITCH_KEY(Q, 16, 3); - SWITCH_KEY(R, 17, 3); -#elif defined(PCBTARANIS) || defined(PCBHORUS) - SWITCH_KEY(A, 0, 3); - SWITCH_KEY(B, 1, 3); - SWITCH_KEY(C, 2, 3); - SWITCH_KEY(D, 3, 3); -#if defined(PCBX7) - SWITCH_KEY(F, 4, 2); - SWITCH_KEY(H, 5, 2); -#else - SWITCH_KEY(E, 4, 3); - SWITCH_KEY(F, 5, 2); - SWITCH_KEY(G, 6, 3); - SWITCH_KEY(H, 7, 2); -#endif -#else - SWITCH_KEY(1, 0, 2); - SWITCH_KEY(2, 1, 2); - SWITCH_KEY(3, 2, 2); - SWITCH_KEY(4, 3, 3); - SWITCH_KEY(5, 4, 2); - SWITCH_KEY(6, 5, 2); - SWITCH_KEY(7, 6, 2); -#endif } per10ms(); @@ -442,7 +398,7 @@ long Open9xSim::onTimeout(FXObject*, FXSelector, void*) #define BL_COLOR FXRGB(150, 200, 152) #endif -void Open9xSim::setPixel(int x, int y, FXColor color) +void OpenTxSim::setPixel(int x, int y, FXColor color) { #if LCD_ZOOM > 1 for (int i=0; i>11)/0x1f, 255*((z&0x07E0)>>5)/0x3F, 255*(z&0x001F)/0x01F); setPixel(x, y, color); } } -#elif LCD_W >= 212 +#elif LCD_DEPTH == 4 display_t * p = &simuLcdBuf[y / 2 * LCD_W + x]; uint8_t z = (y & 1) ? (*p >> 4) : (*p & 0x0F); if (z) { @@ -506,15 +462,16 @@ void Open9xSim::refreshDisplay() } } -Open9xSim *th9xSim; +OpenTxSim * opentxSim; + void doFxEvents() { //puts("doFxEvents"); - th9xSim->getApp()->runOneEvent(false); - th9xSim->refreshDisplay(); + opentxSim->getApp()->runOneEvent(false); + opentxSim->refreshDisplay(); } -int main(int argc,char **argv) +int main(int argc, char ** argv) { // Each FOX GUI program needs one, and only one, application object. // The application objects coordinates some common stuff shared between @@ -529,23 +486,23 @@ int main(int argc,char **argv) // because FOX may sometimes need to filter out some of the arguments. // This opens up the display as well, and reads the registry database // so that persistent settings are now available. - application.init(argc,argv); + application.init(argc, argv); // This creates the main window. We pass in the title to be displayed // above the window, and possibly some icons for when its iconified. // The decorations determine stuff like the borders, close buttons, // drag handles, and so on the Window Manager is supposed to give this // window. - //FXMainWindow *main=new FXMainWindow(&application,"Hello",NULL,NULL,DECOR_ALL); - th9xSim = new Open9xSim(&application); + //FXMainWindow *main=new FXMainWindow(&application, "Hello", nullptr, nullptr, DECOR_ALL); + opentxSim = new OpenTxSim(&application); application.create(); // Pretty self-explanatory:- this shows the window, and places it in the // middle of the screen. #ifndef __APPLE__ - th9xSim->show(PLACEMENT_SCREEN); + opentxSim->show(PLACEMENT_SCREEN); #else - th9xSim->show(); // Otherwise the main window gets centred across my two monitors, split down the middle. + opentxSim->show(); // Otherwise the main window gets centred across my two monitors, split down the middle. #endif #if defined(TELEMETRY_FRSKY) && !defined(TELEMETRY_FRSKY_SPORT) @@ -568,29 +525,12 @@ int main(int argc,char **argv) uint16_t anaIn(uint8_t chan) { if (chansliders[chan]->getValue(); + return opentxSim->sliders[chan]->getValue(); else if (chanknobs[chan-NUM_STICKS]->getValue(); -#if defined(PCBHORUS) - else if (chan == TX_VOLTAGE) - return 1737; //~10.6V -#elif defined(PCBX9E) - else if (chan == TX_VOLTAGE) - return 1420; //~10.6V -#elif defined(PCBXLITE) - else if (chan == TX_VOLTAGE) - return 1100; -#elif defined(PCBTARANIS) - else if (chan == TX_VOLTAGE) - return 1000; //~7.4V -#elif defined(PCBSKY9X) - else if (chan == TX_VOLTAGE) - return 5.1*1500/11.3; - else if (chan == TX_CURRENT) - return 100; -#else - else if (chan == TX_VOLTAGE) - return 1500; + return opentxSim->knobs[chan-NUM_STICKS]->getValue(); +#if defined(PCBTARANIS) + else if (chan == TX_RTC_VOLTAGE) + return 800; // 2.34V #endif else return 0; @@ -603,5 +543,5 @@ uint16_t getAnalogValue(uint8_t index) void createBitmap(int index, uint16_t *data, int x, int y, int w, int h) { - th9xSim->createBitmap(index, data, x, y, w, h); + opentxSim->createBitmap(index, data, x, y, w, h); } diff --git a/radio/src/stamp.cpp b/radio/src/stamp.cpp index 80423ce6d..f112a97dc 100644 --- a/radio/src/stamp.cpp +++ b/radio/src/stamp.cpp @@ -28,6 +28,8 @@ #if defined(PCBHORUS) #define TAB "\037\075" +#else +#define TAB "\037\033" #endif #if defined(COLORLCD) @@ -35,12 +37,10 @@ const char date_stamp[] = "DATE" TAB ": " DATE; const char time_stamp[] = "TIME" TAB ": " TIME; const char eeprom_stamp[] = "EEPR" TAB ": " EEPROM_STR; -#elif defined(PCBTARANIS) && defined(BOARD_NAME) - const char vers_stamp[] = "FW\037\033: " "opentx-" BOARD_NAME "\036VERS\037\033: " VERSION " (" GIT_STR ")" "\036DATE\037\033: " DATE " " TIME "\036EEPR\037\033: " EEPROM_STR; -#elif defined(PCBTARANIS) - const char vers_stamp[] = "FW\037\033: " "opentx-" FLAVOUR "\036VERS\037\033: " VERSION " (" GIT_STR ")" "\036DATE\037\033: " DATE " " TIME "\036EEPR\037\033: " EEPROM_STR; +#elif defined(BOARD_NAME) + const char vers_stamp[] = "FW" TAB ": opentx-" BOARD_NAME "\036VERS" TAB ": " VERSION " (" GIT_STR ")" "\036DATE" TAB ": " DATE " " TIME "\036EEPR" TAB ": " EEPROM_STR; #else - const char vers_stamp[] = "FW\037\033: " "opentx-" FLAVOUR "\036VERS\037\033: " VERSION "\036DATE\037\033: " DATE "\036TIME\037\033: " TIME "\036EEPR\037\033: " EEPROM_STR; + const char vers_stamp[] = "FW" TAB ": opentx-" FLAVOUR "\036VERS" TAB ": " VERSION " (" GIT_STR ")" "\036DATE" TAB ": " DATE " " TIME "\036EEPR" TAB ": " EEPROM_STR; #endif /** @@ -56,23 +56,24 @@ __SECTION_USED(".bootversiondata") const char boot_version[] = "opentx-" FLA * Tries to find opentx version in the first 1024 byte of either firmware/bootloader (the one not running) or the buffer * @param buffer If non-null find the firmware version in the buffer instead */ -const char* getOtherVersion(char* buffer) +const char * getOtherVersion(char* buffer) { #if defined(BOOT) - const char* startother = (char*)(FIRMWARE_ADDRESS+BOOTLOADER_SIZE); + const char * startother = (char*)(FIRMWARE_ADDRESS+BOOTLOADER_SIZE); #else - const char* startother = (char*)(FIRMWARE_ADDRESS); + const char * startother = (char*)(FIRMWARE_ADDRESS); #endif if (buffer != nullptr) - startother=buffer; + startother = buffer; - const char* other_str = nullptr; - for (int i=0; i< 1024;i++) { - if (memcmp(startother+i, "opentx-", 7)==0) { + const char * other_str = nullptr; + for (int i=0; i<1024;i++) { + if (memcmp(startother+i, "opentx-", 7) == 0) { other_str = startother + i; break; } } + if (other_str != nullptr) return other_str; else diff --git a/radio/src/storage/conversions/conversions_216_218.cpp b/radio/src/storage/conversions/conversions_216_218.cpp index f5b5d444a..dc9c03f2f 100644 --- a/radio/src/storage/conversions/conversions_216_218.cpp +++ b/radio/src/storage/conversions/conversions_216_218.cpp @@ -776,7 +776,7 @@ PACK(typedef struct { uint8_t backlightBright; int8_t txCurrentCalibration; - int8_t temperatureWarn; + int8_t spare; uint8_t mAhWarn; uint16_t mAhUsed; uint32_t globalTimer; @@ -883,7 +883,6 @@ void convertRadioData_217_to_218(RadioData &settings) #if defined(PCBSKY9X) settings.txCurrentCalibration = settings_v217.txCurrentCalibration; - settings.temperatureWarn = settings_v217.temperatureWarn; settings.mAhWarn = settings_v217.mAhWarn; settings.mAhUsed = settings_v217.mAhUsed; settings.temperatureCalib = settings_v217.temperatureCalib; diff --git a/radio/src/storage/conversions/conversions_218_219.cpp b/radio/src/storage/conversions/conversions_218_219.cpp index a832861bf..618d52887 100644 --- a/radio/src/storage/conversions/conversions_218_219.cpp +++ b/radio/src/storage/conversions/conversions_218_219.cpp @@ -35,14 +35,26 @@ typedef ModelData ModelData_v219; int convertSource_218_to_219(int source) { // on X7: 2 additional switches + // on X9D / X9D+: 1 additional switch + // on xlite : 2 more storage switches + +#if defined(PCBXLITE) + if (source >= MIXSRC_SE) + source += 2; +#endif #if defined(PCBX7) if (source >= MIXSRC_SI) source += 2; #endif +#if defined(PCBX9D) || defined(PCBX9DP) + if (source >= MIXSRC_SI) + source += 1; +#endif + #if defined(PCBHORUS) - if (source >= MIXSRC_GMBL) + if (source >= MIXSRC_SI) source += 2; #endif @@ -52,19 +64,31 @@ int convertSource_218_to_219(int source) int convertSwitch_218_to_219(int swtch) { // on X7: 2 additional switches + // on X9D / X9D+: 1 additional switch + // on xlite : 2 more storage switches -#if defined(PCBX7) || defined(PCBHORUS) +#if defined(PCBX7) || defined(PCBHORUS) || defined(PCBX9D) || defined(PCBX9DP) || defined(PCBXLITE) if (swtch < 0) return -convertSwitch_218_to_219(-swtch); #endif +#if defined(PCBXLITE) + if (swtch >= SWSRC_SE0) + swtch += 2 * 3; +#endif + #if defined(PCBX7) if (swtch >= SWSRC_SI0) swtch += 2 * 3; #endif +#if defined(PCBX9D) || defined(PCBX9DP) + if (swtch >= SWSRC_SI0) + swtch += 3; +#endif + #if defined(PCBHORUS) - if (swtch >= SWSRC_GMBL0) + if (swtch >= SWSRC_SI0) swtch += 2 * 3; if (swtch >= SWSRC_FIRST_MULTIPOS_SWITCH + 3 * XPOTS_MULTIPOS_COUNT) swtch += 2 * XPOTS_MULTIPOS_COUNT; @@ -150,6 +174,8 @@ void convertModelData_218_to_219(ModelData &model) for (uint8_t i=0; i= MODULE_TYPE_R9M_PXX2) newModel.moduleData[i].type += 4; + if (newModel.moduleData[i].type == MODULE_TYPE_XJT_PXX1) { + newModel.moduleData[i].subType = newModel.moduleData[i].rfProtocol; +#if defined(PCBX9DP) && PCBREV >= 2019 + if (i == INTERNAL_MODULE) { + newModel.moduleData[i].type = MODULE_TYPE_ISRM_PXX2; + newModel.moduleData[i].subType = MODULE_SUBTYPE_ISRM_PXX2_ACCST_D16; + } +#endif + } } +#if defined(RADIO_T12) + newModel.moduleData[INTERNAL_MODULE].type = MODULE_TYPE_NONE; // Early t12 firmware had unused INT settings that need to be cleared +#endif + for (uint8_t module=0; module<2; module++) { if (oldModel.moduleData[module].failsafeMode == FAILSAFE_CUSTOM) { memcpy(newModel.failsafeChannels, oldModel.moduleData[module].failsafeChannels, sizeof(newModel.failsafeChannels)); @@ -215,7 +254,12 @@ void convertModelData_218_to_219(ModelData &model) #endif for (uint8_t i=0; i> (2*i)) & 0x03; if (screenType == TELEMETRY_SCREEN_TYPE_VALUES) { for (int j = 0; j < 4; j++) { for (int k = 0; k < NUM_LINE_ITEMS; k++) { - newModel.screens[i].lines[j].sources[k] = convertSource_218_to_219(newModel.screens[i].lines[j].sources[k]); + newModel.screens[i].lines[j].sources[k] = convertSource_218_to_219(oldModel.frsky.screens[i].lines[j].sources[k]); } } } else if (screenType == TELEMETRY_SCREEN_TYPE_GAUGES) { for (int j = 0; j < 4; j++) { - newModel.screens[i].bars[j].source = convertSource_218_to_219(newModel.screens[i].bars[j].source); + newModel.screens[i].bars[j].source = convertSource_218_to_219(oldModel.frsky.screens[i].bars[j].source); } } } #endif -#if defined(PCBHORUS) +#if defined(STM32) free(oldModelAllocated); #endif } @@ -271,25 +312,75 @@ void convertRadioData_218_to_219(RadioData & settings) settings.version = 219; settings.variant = EEPROM_VARIANT; -#if defined(PCBHORUS) - RadioData_v218 settings_v218 = (RadioData_v218 &)settings; +#if defined(STM32) + RadioData_v218 * oldSettingsAllocated = (RadioData_v218 *)malloc(sizeof(RadioData_v218)); + RadioData_v218 & oldSettings = *oldSettingsAllocated; + memcpy(&oldSettings, &settings, sizeof(RadioData_v218)); +#endif - memcpy(&settings.chkSum, &settings_v218.chkSum, offsetof(RadioData, auxSerialMode) - offsetof(RadioData, chkSum)); - memcpy(&settings.calib[NUM_STICKS + 5], &settings_v218.calib[NUM_STICKS + 3], sizeof(CalibData) * (STORAGE_NUM_SLIDERS + STORAGE_NUM_MOUSE_ANALOGS)); +#if defined(PCBX9D) || defined(PCBX9DP) || defined(PCBX7) || defined(PCBXLITE) + for (uint8_t i=0; i= 2019 + settings.switchConfig |= SWITCH_TOGGLE << 16; +#endif + memcpy(&settings.switchNames[0], &oldSettings.switchNames[0], 8 * LEN_SWITCH_NAME); + memclear(&settings.switchNames[8], LEN_SWITCH_NAME); + memcpy(&settings.anaNames[0], &oldSettings.anaNames[0], (NUM_STICKS+NUM_POTS+NUM_SLIDERS) * LEN_ANA_NAME); +#endif + +#if defined(PCBHORUS) + // 2 new pots from X10: + // - copy btw. 'chkSum' and 'auxSerialMode' (excl.) + memcpy(&settings.chkSum, &oldSettings.chkSum, offsetof(RadioData, auxSerialMode) - offsetof(RadioData, chkSum)); + // - move calibration data + memcpy(&settings.calib[NUM_STICKS + 5], &oldSettings.calib[NUM_STICKS + 3], sizeof(CalibData) * (STORAGE_NUM_SLIDERS + STORAGE_NUM_MOUSE_ANALOGS)); memclear(&settings.calib[NUM_STICKS + 3], sizeof(CalibData) * 2); - settings.auxSerialMode = settings_v218.auxSerialMode; - settings.switchConfig = settings_v218.switchConfig; - settings.potsConfig = settings_v218.potsConfig; - settings.slidersConfig = settings_v218.slidersConfig; + // move fields after custom functions + settings.auxSerialMode = oldSettings.auxSerialMode; + settings.switchConfig = oldSettings.switchConfig; + settings.potsConfig = oldSettings.potsConfig; + settings.slidersConfig = oldSettings.slidersConfig; - memcpy(&settings.switchNames[0], &settings_v218.switchNames[0], 8 * LEN_SWITCH_NAME); + // 2 new switches + memcpy(&settings.switchNames[0], &oldSettings.switchNames[0], 8 * LEN_SWITCH_NAME); memclear(&settings.switchNames[8], 2 * LEN_SWITCH_NAME); - memcpy(&settings.anaNames[0], &settings_v218.anaNames[0], (NUM_STICKS + 3) * LEN_ANA_NAME); + // 2 new pots for X10 + // - split 'anaNames' (sticks + 3 old pots, 2 new pots, other old analogs) + memcpy(&settings.anaNames[0], &oldSettings.anaNames[0], (NUM_STICKS + 3) * LEN_ANA_NAME); memclear(&settings.anaNames[NUM_STICKS + 3], 2 * LEN_SWITCH_NAME); - memcpy(&settings.anaNames[NUM_STICKS + 5], &settings_v218.anaNames[NUM_STICKS + 3], STORAGE_NUM_SLIDERS * LEN_ANA_NAME); + memcpy(&settings.anaNames[NUM_STICKS + 5], &oldSettings.anaNames[NUM_STICKS + 3], STORAGE_NUM_SLIDERS * LEN_ANA_NAME); - memcpy(&settings.currModelFilename[0], &settings_v218.currModelFilename[0], sizeof(RadioData_v218) - offsetof(RadioData_v218, currModelFilename[0])); + // - copy rest of RadioData struct + memcpy(&settings.currModelFilename[0], &oldSettings.currModelFilename[0], sizeof(RadioData_v218) - offsetof(RadioData_v218, currModelFilename[0])); +#endif + +#if defined(RADIO_T12) + g_eeGeneral.switchConfig = bfSet(g_eeGeneral.switchConfig, SWITCH_2POS, 10, 2); // T12 comes with wrongly defined pot2 + g_eeGeneral.potsConfig = bfSet(g_eeGeneral.potsConfig, POT_WITHOUT_DETENT, 2, 2); // T12 comes with wrongly defined pot2 +#endif + +#if defined(PCBX9DP) && PCBREV >= 2019 + // force re-calibration + settings.chkSum = 0xFFFF; + setDefaultOwnerId(); +#endif + +#if defined(STM32) + free(oldSettingsAllocated); #endif } diff --git a/radio/src/storage/conversions/datastructs_218.h b/radio/src/storage/conversions/datastructs_218.h index ce0725471..2a34b3255 100644 --- a/radio/src/storage/conversions/datastructs_218.h +++ b/radio/src/storage/conversions/datastructs_218.h @@ -24,12 +24,6 @@ #define MAX_TIMERS_218 3 #define MAX_GVARS_218 9 -#if defined(BUZZER) -#define BUZZER_FIELD_218 int8_t buzzerMode:2; // -2=quiet, -1=only alarms, 0=no keys, 1=all (only used on AVR radios without audio hardware) -#else -#define BUZZER_FIELD_218 int8_t spareRadio:2; -#endif - #if defined(PCBHORUS) #define NUM_SWITCHES_218 8 #elif defined(PCBXLITE) @@ -130,6 +124,21 @@ #define MAX_TELEMETRY_SENSORS_218 32 #endif +#if defined(COLORLCD) +typedef uint32_t swarnstate218_t; +#elif defined(PCBX9E) +typedef uint64_t swconfig218_t; +typedef uint64_t swarnstate218_t; +typedef uint32_t swarnenable218_t; +#elif defined(PCBTARANIS) +typedef uint16_t swconfig218_t; +typedef uint16_t swarnstate218_t; +typedef uint8_t swarnenable218_t; +#else +typedef uint8_t swarnstate218_t; +typedef uint8_t swarnenable218_t; +#endif + PACK(typedef struct { uint8_t type:4; int8_t rfProtocol:4; @@ -416,7 +425,7 @@ PACK(struct ModelHeader_v218 { #if defined(COLORLCD) #define SWITCH_WARNING_DATA_218 #else -#define SWITCH_WARNING_DATA_218 swarnenable_t switchWarningEnable; +#define SWITCH_WARNING_DATA_218 swarnenable218_t switchWarningEnable; #endif PACK(struct ModelData_v218 { @@ -448,7 +457,7 @@ PACK(struct ModelData_v218 { uint8_t thrTraceSrc; - swarnstate_t switchWarningState; + swarnstate218_t switchWarningState; SWITCH_WARNING_DATA_218 @@ -467,45 +476,8 @@ PACK(struct ModelData_v218 { VIEW_DATA }); -#include "chksize.h" - -#define CHKSIZE(x, y) check_size() - -static inline void check_struct_218() -{ -#if defined(PCBHORUS) - CHKSIZE(ModelData_v218, 9380); -#elif defined(PCBX9E) - CHKSIZE(ModelData_v218, 6520); -#endif -} - -#undef CHKSIZE - -#define EXTRA_GENERAL_FIELDS_GENERAL_218 \ - uint8_t backlightBright; \ - uint32_t globalTimer; \ - uint8_t bluetoothBaudrate:4; \ - uint8_t bluetoothMode:4; \ - uint8_t countryCode; \ - uint8_t imperial:1; \ - uint8_t jitterFilter:1; /* 0 - active */\ - uint8_t disableRssiPoweroffAlarm:1; \ - uint8_t USBMode:2; \ - uint8_t spareExtraArm:3; \ - char ttsLanguage[2]; \ - int8_t beepVolume:4; \ - int8_t wavVolume:4; \ - int8_t varioVolume:4; \ - int8_t backgroundVolume:4; \ - int8_t varioPitch; \ - int8_t varioRange; \ - int8_t varioRepeat; \ - CustomFunctionData_v218 customFn[MAX_SPECIAL_FUNCTIONS_218]; - #if defined(PCBHORUS) #define EXTRA_GENERAL_FIELDS_218 \ - EXTRA_GENERAL_FIELDS_GENERAL_218 \ uint8_t auxSerialMode:4; \ uint8_t slidersConfig:4; \ uint32_t switchConfig; \ @@ -517,27 +489,25 @@ static inline void check_struct_218() uint8_t blOffBright:7; \ char bluetoothName[LEN_BLUETOOTH_NAME_218]; #elif defined(PCBTARANIS) -#if defined(BLUETOOTH) -#define BLUETOOTH_FIELDS_218 \ + #if defined(STORAGE_BLUETOOTH) && !defined(PCBX9D) && !defined(PCBX9DP) + #define BLUETOOTH_FIELDS_218 \ uint8_t spare; \ char bluetoothName[LEN_BLUETOOTH_NAME_218]; -#else -#define BLUETOOTH_FIELDS -#endif -#define EXTRA_GENERAL_FIELDS_218 \ - EXTRA_GENERAL_FIELDS_GENERAL_218 \ + #else + #define BLUETOOTH_FIELDS_218 + #endif + #define EXTRA_GENERAL_FIELDS_218 \ uint8_t auxSerialMode:4; \ uint8_t slidersConfig:4; \ uint8_t potsConfig; /* two bits per pot */\ uint8_t backlightColor; \ - swarnstate_t switchUnlockStates; \ - swconfig_t switchConfig; \ + swarnstate218_t switchUnlockStates; \ + swconfig218_t switchConfig; \ char switchNames[NUM_SWITCHES_218][LEN_SWITCH_NAME_218]; \ char anaNames[NUM_STICKS+NUM_POTS+NUM_SLIDERS][LEN_ANA_NAME_218]; \ - BLUETOOTH_FIELDS + BLUETOOTH_FIELDS_218 #elif defined(PCBSKY9X) -#define EXTRA_GENERAL_FIELDS_218 \ - EXTRA_GENERAL_FIELDS_GENERAL_218 \ + #define EXTRA_GENERAL_FIELDS_218 \ int8_t txCurrentCalibration; \ int8_t temperatureWarn; \ uint8_t mAhWarn; \ @@ -548,16 +518,8 @@ static inline void check_struct_218() uint8_t rotarySteps; \ char switchNames[NUM_SWITCHES_218][LEN_SWITCH_NAME_218]; \ char anaNames[NUM_STICKS+NUM_POTS+NUM_SLIDERS][LEN_ANA_NAME_218]; -#else - #define EXTRA_GENERAL_FIELDS_218 EXTRA_GENERAL_FIELDS_GENERAL_218 -#endif - -#if defined(PCBHORUS) -#define SPLASH_MODE_218 uint8_t splashSpares:3 -#elif defined(FSPLASH) -#define SPLASH_MODE_218 uint8_t splashMode:3 -#else -#define SPLASH_MODE_218 int8_t splashMode:3 + #else + #define EXTRA_GENERAL_FIELDS_218 EXTRA_GENERAL_FIELDS_GENERAL_218 #endif #if defined(COLORLCD) @@ -570,7 +532,7 @@ static inline void check_struct_218() #define THEME_DATA #endif -PACK(typedef struct { +PACK(struct RadioData_v218 { uint8_t version; uint16_t variant; CalibData calib[NUM_STICKS+STORAGE_NUM_POTS+STORAGE_NUM_SLIDERS+STORAGE_NUM_MOUSE_ANALOGS]; @@ -582,7 +544,7 @@ PACK(typedef struct { int8_t backlightMode; TrainerData_v218 trainer; uint8_t view; // index of view in main screen - BUZZER_FIELD_218 + int8_t buzzerMode:2; uint8_t fai:1; int8_t beepMode:2; // -2=quiet, -1=only alarms, 0=no keys, 1=all uint8_t alarmsFlash:1; @@ -592,8 +554,10 @@ PACK(typedef struct { int8_t timezone:5; uint8_t adjustRTC:1; uint8_t inactivityTimer; - SPLASH_MODE_218; /* 3bits */ - int8_t hapticMode:2; // -2=quiet, -1=only alarms, 0=no keys, 1=all + int8_t splashMode:3; + int8_t hapticMode:2; + int8_t spare2:3; + int8_t switchesDelay; uint8_t lightAutoOff; uint8_t templateSetup; // RETA order for receiver channels int8_t PPM_Multiplier; @@ -609,9 +573,47 @@ PACK(typedef struct { int8_t vBatMin; int8_t vBatMax; + uint8_t backlightBright; + uint32_t globalTimer; + uint8_t bluetoothBaudrate:4; + uint8_t bluetoothMode:4; + uint8_t countryCode; + uint8_t imperial:1; + uint8_t jitterFilter:1; /* 0 - active */ + uint8_t disableRssiPoweroffAlarm:1; + uint8_t USBMode:2; + uint8_t spareExtraArm:3; + char ttsLanguage[2]; + int8_t beepVolume:4; + int8_t wavVolume:4; + int8_t varioVolume:4; + int8_t backgroundVolume:4; + int8_t varioPitch; + int8_t varioRange; + int8_t varioRepeat; + CustomFunctionData_v218 customFn[MAX_SPECIAL_FUNCTIONS_218]; + EXTRA_GENERAL_FIELDS_218 THEME_DATA -}) RadioData_v218; +}); + +#include "chksize.h" + +#define CHKSIZE(x, y) check_size() + +static inline void check_struct_218() +{ +#if defined(PCBHORUS) + CHKSIZE(ModelData_v218, 9380); +#elif defined(PCBX9E) + CHKSIZE(ModelData_v218, 6520); +#elif defined(PCBX9D) + CHKSIZE(RadioData_v218, 872); +#endif +} + + +#undef CHKSIZE #endif //OPENTX_DATASTRUCTS_218_H diff --git a/radio/src/storage/modelslist.cpp b/radio/src/storage/modelslist.cpp index 24a3089cc..bc5ce99e3 100644 --- a/radio/src/storage/modelslist.cpp +++ b/radio/src/storage/modelslist.cpp @@ -542,7 +542,7 @@ uint8_t ModelsList::findNextUnusedModelId(uint8_t moduleIdx) uint8_t new_id = 1; uint8_t tst_mask = 1; - for (;new_id < MAX_RX_NUM(moduleIdx); new_id++) { + for (;new_id < getMaxRxNum(moduleIdx); new_id++) { if (!(usedModelIds[new_id >> 3] & tst_mask)) { // found free ID return new_id; diff --git a/radio/src/strhelpers.cpp b/radio/src/strhelpers.cpp index c9a595248..3473cc5ab 100644 --- a/radio/src/strhelpers.cpp +++ b/radio/src/strhelpers.cpp @@ -44,6 +44,11 @@ char zchar2char(int8_t idx) return ' '; } +char char2lower(char c) +{ + return (c >= 'A' && c <= 'Z') ? c + 32 : c; +} + int8_t char2zchar(char c) { if (c == '_') return 37; @@ -165,7 +170,7 @@ char * strAppendStringWithIndex(char * dest, const char * s, int idx) return strAppendUnsigned(strAppend(dest, s), abs(idx)); } -char * getTimerString(char * dest, putstime_t tme, uint8_t hours) +char * getTimerString(char * dest, int32_t tme, uint8_t hours) { char * s = dest; div_t qr; @@ -236,7 +241,36 @@ char * getGVarString(char * dest, int idx) return dest; } -char * getSwitchString(char * dest, swsrc_t idx) +#if !defined(PCBSKY9X) +char * getSwitchName(char * dest, swsrc_t idx) +{ + div_t swinfo = switchInfo(idx); + if (ZEXIST(g_eeGeneral.switchNames[swinfo.quot])) { + dest += zchar2str(dest, g_eeGeneral.switchNames[swinfo.quot], LEN_SWITCH_NAME); + // TODO tous zchar2str + } + else { + *dest++ = 'S'; +#if defined(PCBX7) + if (swinfo.quot >= 5) + *dest++ = 'H' + swinfo.quot - 5; + else if (swinfo.quot == 4) +#if defined(RADIO_T12) + *dest++ = 'G'; +#else + *dest++ = 'F'; +#endif + else + *dest++ = 'A'+swinfo.quot; +#else + *dest++ = 'A' + swinfo.quot; +#endif + } + return dest; +} +#endif + +char * getSwitchPositionName(char * dest, swsrc_t idx) { if (idx == SWSRC_NONE) { return getStringAtIndex(dest, STR_VSWITCHES, 0); @@ -262,27 +296,7 @@ char * getSwitchString(char * dest, swsrc_t idx) #define IDX_ON_IN_STR_VSWITCHES (IDX_TRIMS_IN_STR_VSWITCHES+SWSRC_LAST_TRIM-SWSRC_FIRST_TRIM+1) if (idx <= SWSRC_LAST_SWITCH) { div_t swinfo = switchInfo(idx); - if (ZEXIST(g_eeGeneral.switchNames[swinfo.quot])) { - s += zchar2str(s, g_eeGeneral.switchNames[swinfo.quot], LEN_SWITCH_NAME); - // TODO tous zchar2str - } - else { - *s++ = 'S'; -#if defined(PCBX7) - if (swinfo.quot >= 5) - *s++ = 'H' + swinfo.quot - 5; - else if (swinfo.quot == 4) -#if defined(RADIO_T12) - *s++ = 'G'; -#else - *s++ = 'F'; -#endif - else - *s++ = 'A'+swinfo.quot; -#else - *s++ = 'A' + swinfo.quot; -#endif - } + s = getSwitchName(s, idx); *s++ = "\300-\301"[swinfo.rem]; *s = '\0'; } @@ -321,6 +335,9 @@ char * getSwitchString(char * dest, swsrc_t idx) else if (idx == SWSRC_TELEMETRY_STREAMING) { strcpy(s, "Tele"); } + else if (idx == SWSRC_RADIO_ACTIVITY) { + strcpy(s, "Act"); + } #if defined(DEBUG_LATENCY) else if (idx == SWSRC_LATENCY_TOGGLE) { strcpy(s, "Ltc"); @@ -388,7 +405,7 @@ char * getSourceString(char * dest, mixsrc_t idx) } } else if (idx <= MIXSRC_LAST_LOGICAL_SWITCH) { - getSwitchString(dest, SWSRC_SW1 + idx - MIXSRC_SW1); + getSwitchPositionName(dest, SWSRC_SW1 + idx - MIXSRC_SW1); } else if (idx <= MIXSRC_LAST_TRAINER) { strAppendStringWithIndex(dest, STR_PPM_TRAINER, idx - MIXSRC_FIRST_TRAINER + 1); diff --git a/radio/src/strhelpers.h b/radio/src/strhelpers.h index e9e45425d..114d7a009 100644 --- a/radio/src/strhelpers.h +++ b/radio/src/strhelpers.h @@ -35,7 +35,8 @@ char * strAppendStringWithIndex(char * dest, const char * s, int idx); char * getTimerString(char * dest, int32_t tme, uint8_t hours=0); char * getCurveString(char * dest, int idx); char * getGVarString(char * dest, int idx); -char * getSwitchString(char * dest, swsrc_t idx); +char * getSwitchPositionName(char * dest, swsrc_t idx); +char * getSwitchName(char * dest, swsrc_t idx); char * getSourceString(char * dest, mixsrc_t idx); #endif diff --git a/radio/src/switches.cpp b/radio/src/switches.cpp index 38ae149b0..3e76e3304 100644 --- a/radio/src/switches.cpp +++ b/radio/src/switches.cpp @@ -25,10 +25,9 @@ #if defined(PCBHORUS) #define SWITCH_WARNING_LIST_X WARNING_LINE_X #define SWITCH_WARNING_LIST_Y WARNING_LINE_Y+3*FH - #define SWITCH_WARNING_LIST_INTERVAL 35 #elif LCD_W >= 212 #define SWITCH_WARNING_LIST_X 60 - #define SWITCH_WARNING_LIST_Y 4*FH+3 + #define SWITCH_WARNING_LIST_Y 4*FH+4 #else #define SWITCH_WARNING_LIST_X 4 #define SWITCH_WARNING_LIST_Y 4*FH+4 @@ -132,31 +131,30 @@ void getSwitchesPosition(bool startup) CHECK_3POS(0, SW_SA); CHECK_3POS(1, SW_SB); CHECK_3POS(2, SW_SC); -#if !defined(PCBX9LITE) + +#if defined(PCBX9LITE) + CHECK_2POS(SW_SD); + CHECK_2POS(SW_SE); +#elif defined(PCBXLITES) CHECK_3POS(3, SW_SD); -#endif -#if defined(PCBXLITES) || defined(PCBX9LITE) CHECK_2POS(SW_SE); -#elif defined(PCBX7) || defined(PCBXLITE) || defined(PCBX9LITE) - // No SE -#else - CHECK_3POS(4, SW_SE); -#endif -#if defined(PCBXLITE) && !defined(PCBXLITES) - // No SF -#else CHECK_2POS(SW_SF); -#endif -#if defined(PCBX7) || defined(PCBXLITE) || defined(PCBX9LITE) - // No SG + // no SWG and SWH on XLITES +#elif defined(PCBXLITE) + CHECK_3POS(3, SW_SD); + // no SWE, SWF, SWG and SWH on XLITE +#elif defined(PCBX7) + CHECK_3POS(3, SW_SD); + CHECK_2POS(SW_SF); + CHECK_2POS(SW_SH); #else + CHECK_3POS(3, SW_SD); + CHECK_3POS(4, SW_SE); + CHECK_2POS(SW_SF); CHECK_3POS(5, SW_SG); -#endif -#if defined(PCBXLITE) || defined(PCBX9LITE) - // No SH -#else CHECK_2POS(SW_SH); #endif + #if defined(PCBX9E) CHECK_3POS(6, SW_SI); CHECK_3POS(7, SW_SJ); @@ -457,6 +455,9 @@ bool getSwitch(swsrc_t swtch, uint8_t flags) idx = (CONVERT_MODE_TRIMS(idx/2) << 1) + (idx & 1); result = trimDown(idx); } + else if (cs_idx == SWSRC_RADIO_ACTIVITY) { + result = (inactivity.counter < 2); + } else if (cs_idx >= SWSRC_FIRST_SENSOR) { result = !telemetryItems[cs_idx-SWSRC_FIRST_SENSOR].isOld(); } @@ -526,13 +527,13 @@ swsrc_t getMovedSwitch() // -4..-8 for all other switches if changed to false // 9 for Trainer switch if changed to true; Change to false is ignored swarnstate_t mask = 0x80; - for (uint8_t i=NUM_PSWITCH; i>1; i--) { + for (uint8_t i=NUM_SWITCHES_POSITIONS; i>1; i--) { bool prev; prev = (switches_states & mask); // don't use getSwitch here to always get the proper value, even getSwitch manipulates bool next = switchState(i-1); if (prev != next) { - if (((i3)) || next==true) + if (((i3)) || next==true) result = next ? i : -i; if (i<=3 && result==0) result = 1; switches_states ^= mask; @@ -558,6 +559,10 @@ void checkSwitches() uint8_t bad_pots = 0, last_bad_pots = 0xff; #endif +#if defined(PWR_BUTTON_PRESS) + bool refresh = false; +#endif + while (1) { #if defined(PCBTARANIS) || defined(PCBHORUS) @@ -642,12 +647,13 @@ void checkSwitches() // first - display warning #if defined(PCBTARANIS) || defined(PCBHORUS) - if ((last_bad_switches != switches_states) || (last_bad_pots != bad_pots)) { - drawAlertBox(STR_SWITCHWARN, NULL, STR_PRESSANYKEYTOSKIP); + if (last_bad_switches != switches_states || last_bad_pots != bad_pots) { + drawAlertBox(STR_SWITCHWARN, nullptr, STR_PRESSANYKEYTOSKIP); if (last_bad_switches == 0xff || last_bad_pots == 0xff) { AUDIO_ERROR_MESSAGE(AU_SWITCH_ALERT); } - int x = SWITCH_WARNING_LIST_X, y = SWITCH_WARNING_LIST_Y; + int x = SWITCH_WARNING_LIST_X; + int y = SWITCH_WARNING_LIST_Y; int numWarnings = 0; for (int i=0; i> (i*2)]; drawSource(x, y, MIXSRC_FIRST_SWITCH+i, attr); lcdDrawChar(lcdNextPos, y, c, attr); x = lcdNextPos + 3; } - else if (numWarnings == 7) { - lcdDrawText(x, y, "...", 0); - } } } #endif } if (g_model.potsWarnMode) { - if (y == 4*FH+3) { - y = 6*FH-2; - x = 60; - } for (int i=0; i 1) { -#if defined(COLORLCD) - char s[8]; - // TODO add an helper - strncpy(s, &STR_VSRCRAW[1+(NUM_STICKS+1+i)*STR_VSRCRAW[0]], STR_VSRCRAW[0]); - s[int(STR_VSRCRAW[0])] = '\0'; -#else - lcdDrawTextAtIndex(x, y, STR_VSRCRAW, NUM_STICKS+1+i, INVERS); - if (IS_POT(POT1+i)) - lcdDrawChar(lcdNextPos, y, g_model.potsWarnPosition[i] > GET_LOWRES_POT_POSITION(i) ? 126 : 127, INVERS); - else - lcdDrawChar(lcdNextPos, y, g_model.potsWarnPosition[i] > GET_LOWRES_POT_POSITION(i) ? '\300' : '\301', INVERS); -#endif -#if defined(COLORLCD) if (++numWarnings < 6) { +#if defined(COLORLCD) + char s[8]; + // TODO add an helper + strncpy(s, &STR_VSRCRAW[1+(NUM_STICKS+1+i)*STR_VSRCRAW[0]], STR_VSRCRAW[0]); + s[int(STR_VSRCRAW[0])] = '\0'; lcdDrawText(x, y, s, ALARM_COLOR); - } - else if (numWarnings == 6) { - lcdDrawText(x, y, "...", ALARM_COLOR); - } - x += 40; + x += 40; #else - x = lcdNextPos + 3; + lcdDrawTextAtIndex(x, y, STR_VSRCRAW, NUM_STICKS + 1 + i, INVERS); + if (IS_POT(POT1 + i)) + lcdDrawChar(lcdNextPos, y, g_model.potsWarnPosition[i] > GET_LOWRES_POT_POSITION(i) ? 126 : 127, INVERS); + else + lcdDrawChar(lcdNextPos, y, g_model.potsWarnPosition[i] > GET_LOWRES_POT_POSITION(i) ? '\300' : '\301', INVERS); + x = lcdNextPos + 3; #endif + } } - } } } + + if (numWarnings >= 6) { +#if defined(COLORLCD) + lcdDrawText(x, y, "...", ALARM_COLOR); +#else + lcdDrawText(x, y, "...", 0); +#endif + } + last_bad_pots = bad_pots; #else if (last_bad_switches != switches_states) { @@ -747,7 +745,27 @@ void checkSwitches() last_bad_switches = switches_states; } - if (pwrCheck() == e_power_off || keyDown()) break; + if (keyDown()) + break; + +#if defined(PWR_BUTTON_PRESS) + uint32_t power = pwrCheck(); + if (power == e_power_off) { + break; + } + else if (power == e_power_press) { + refresh = true; + } + else if (power == e_power_on && refresh) { + last_bad_switches = 0xff; + last_bad_pots = 0xff; + refresh = false; + } +#else + if (pwrCheck() == e_power_off) { + break; + } +#endif doLoopCommonActions(); @@ -766,10 +784,11 @@ void logicalSwitchesTimerTick() for (uint8_t i=0; ifunc == LS_FUNC_TIMER) { - int16_t *lastValue = &LS_LAST_VALUE(fm, i); + int16_t * lastValue = &LS_LAST_VALUE(fm, i); if (*lastValue == 0 || *lastValue == CS_LAST_VALUE_INIT) { *lastValue = -lswTimerValue(ls->v1); } + else if (*lastValue < 0) { if (++(*lastValue) == 0) *lastValue = lswTimerValue(ls->v2); diff --git a/radio/src/targets/common/arm/CMakeLists.txt b/radio/src/targets/common/arm/CMakeLists.txt index da45e0309..641468504 100644 --- a/radio/src/targets/common/arm/CMakeLists.txt +++ b/radio/src/targets/common/arm/CMakeLists.txt @@ -8,7 +8,7 @@ option(TRACE_FATFS "Traces FatFS enabled" OFF) option(TRACE_AUDIO "Traces audio enabled" OFF) option(DEBUG_TRACE_BUFFER "Debug Trace Screen" OFF) option(XJT "XJT TX Module" ON) -option(R9M_SIZE_STD "R9M standard size TX Module" ON) +option(MODULE_SIZE_STD "Standard size TX Module" ON) option(PPM "PPM TX Module" ON) option(DSM2 "DSM2 TX Module" ON) option(SBUS "SBUS TX Module" ON) @@ -82,6 +82,10 @@ if(DEBUG_LATENCY STREQUAL RF_ONLY) add_definitions(-DDEBUG_LATENCY_RF_ONLY) endif() +if(DEBUG_LATENCY STREQUAL END_TO_END) + add_definitions(-DDEBUG_LATENCY) + add_definitions(-DDEBUG_LATENCY_END_TO_END) +endif() if(CLI) add_definitions(-DCLI) @@ -139,8 +143,8 @@ if(XJT) add_definitions(-DXJT) endif() -if(R9M_SIZE_STD) - add_definitions(-DR9M_SIZE_STD) +if(MODULE_SIZE_STD) + add_definitions(-DHARDWARE_EXTERNAL_MODULE_SIZE_STD) endif() if(MULTIMODULE) @@ -186,19 +190,18 @@ set(SRC telemetry/frsky_d.cpp telemetry/frsky_sport.cpp telemetry/frsky_pxx2.cpp - crc16.cpp + crc.cpp vario.cpp ) set(FIRMWARE_TARGET_SRC ${FIRMWARE_TARGET_SRC} + keys_driver.cpp diskio.cpp ) set(TARGET_SRC ${TARGET_SRC} - pulses_driver.cpp - keys_driver.cpp telemetry_driver.cpp ) diff --git a/radio/src/targets/common/arm/stm32/adc_driver.cpp b/radio/src/targets/common/arm/stm32/adc_driver.cpp index 3e8d83fdf..19233a9d1 100644 --- a/radio/src/targets/common/arm/stm32/adc_driver.cpp +++ b/radio/src/targets/common/arm/stm32/adc_driver.cpp @@ -23,27 +23,27 @@ #if defined(SIMU) // not needed #elif defined(PCBX10) - const int8_t ana_direction[NUM_ANALOGS] = {1,-1,1,-1, -1,1,-1, 1,-1, 1, 1,1}; + const int8_t adcDirection[NUM_ANALOGS] = {1,-1,1,-1, -1,1,-1, 1,-1, 1, 1}; #elif defined(PCBX9E) #if defined(HORUS_STICKS) - const int8_t ana_direction[NUM_ANALOGS] = {1,-1,1,-1, -1,-1,-1,1, -1,1,-1,-1, -1}; + const int8_t adcDirection[NUM_ANALOGS] = {1,-1,1,-1, -1,-1,-1,1, -1,1,-1, -1,-1,-1}; #else - const int8_t ana_direction[NUM_ANALOGS] = {1,1,-1,-1, -1,-1,-1,1, -1,1,-1,-1, -1}; + const int8_t adcDirection[NUM_ANALOGS] = {1,1,-1,-1, -1,-1,-1,1, -1,1,-1, -1,-1,-1}; #endif - const uint8_t ana_mapping[NUM_ANALOGS] = { 0 /*STICK1*/, 1 /*STICK2*/, 2 /*STICK3*/, 3 /*STICK4*/, - 10 /*POT1*/, 4 /*POT2*/, 5 /*POT3*/, 6 /*POT4*/, - 11 /*SLIDER1*/, 12 /*SLIDER2*/, 7 /*SLIDER3*/, 8 /*SLIDER4*/, - 9 /*TX_VOLTAGE*/ }; + const uint8_t adcMapping[NUM_ANALOGS] = { 0 /*STICK1*/, 1 /*STICK2*/, 2 /*STICK3*/, 3 /*STICK4*/, + 11 /*POT1*/, 4 /*POT2*/, 5 /*POT3*/, 6 /*POT4*/, + 12 /*SLIDER1*/, 13 /*SLIDER2*/, 7 /*SLIDER3*/, 8 /*SLIDER4*/, + 9 /*TX_VOLTAGE*/, 10 /*TX_VBAT*/ }; #elif defined(PCBX9DP) - const int8_t ana_direction[NUM_ANALOGS] = {1,-1,1,-1, 1,1,-1, 1,1, 1}; + const int8_t adcDirection[NUM_ANALOGS] = {1,-1,1,-1, 1,1,-1, 1,1, 1, 1}; #elif defined(PCBX7) - const int8_t ana_direction[NUM_ANALOGS] = {-1,1,-1,1, 1,1, 1}; + const int8_t adcDirection[NUM_ANALOGS] = {-1,1,-1,1, 1,1, 1, 1}; #elif defined(PCBX9LITE) - const int8_t ana_direction[NUM_ANALOGS] = {-1,1,-1,1, 1,1}; + const int8_t adcDirection[NUM_ANALOGS] = {-1,1,-1,1, 1,1, 1}; #elif defined(PCBXLITE) - const int8_t ana_direction[NUM_ANALOGS] = {1,-1,-1,1, -1,1, 1}; + const int8_t adcDirection[NUM_ANALOGS] = {1,-1,-1,1, -1,1, 1, 1}; #else - const int8_t ana_direction[NUM_ANALOGS] = {1,-1,1,-1, 1,1,0, 1,1, 1}; + const int8_t adcDirection[NUM_ANALOGS] = {1,-1,1,-1, 1,1,0, 1,1, 1, 1}; #endif #if NUM_PWMSTICKS > 0 @@ -51,14 +51,18 @@ #define NUM_ANALOGS_ADC (STICKS_PWM_ENABLED() ? (NUM_ANALOGS - NUM_PWMSTICKS) : NUM_ANALOGS) #elif defined(PCBX9E) #define FIRST_ANALOG_ADC 0 - #define NUM_ANALOGS_ADC 10 - #define NUM_ANALOGS_ADC_EXT (NUM_ANALOGS - 10) + #define NUM_ANALOGS_ADC 11 + #define NUM_ANALOGS_ADC_EXT (NUM_ANALOGS - NUM_ANALOGS_ADC) #else #define FIRST_ANALOG_ADC 0 #define NUM_ANALOGS_ADC NUM_ANALOGS #endif -uint16_t adcValues[NUM_ANALOGS + 1/*RTC*/] __DMA; +uint16_t adcValues[NUM_ANALOGS] __DMA; + +#if defined(PCBX10) +uint16_t rtcBatteryVoltage; +#endif void adcInit() { @@ -90,60 +94,69 @@ void adcInit() ADC_MAIN->CR1 = ADC_CR1_SCAN; ADC_MAIN->CR2 = ADC_CR2_ADON | ADC_CR2_DMA | ADC_CR2_DDS; - ADC_MAIN->SQR1 = (NUM_ANALOGS_ADC + 1/*RTC*/ - 1) << 20; // bits 23:20 = number of conversions + ADC_MAIN->SQR1 = (NUM_ANALOGS_ADC - 1) << 20; // bits 23:20 = number of conversions #if defined(PCBX10) if (STICKS_PWM_ENABLED()) { - ADC_MAIN->SQR2 = (ADC_CHANNEL_EXT1<<0) + (ADC_CHANNEL_EXT2<<5); // conversions 7 and more - ADC_MAIN->SQR3 = (ADC_CHANNEL_POT1<<0) + (ADC_CHANNEL_POT2<<5) + (ADC_CHANNEL_POT3<<10) + (ADC_CHANNEL_SLIDER1<<15) + (ADC_CHANNEL_SLIDER2<<20) + (ADC_CHANNEL_BATT<<25); // conversions 1 to 6 + ADC_MAIN->SQR2 = (ADC_CHANNEL_EXT1 << 0) + (ADC_CHANNEL_EXT2 << 5); + ADC_MAIN->SQR3 = (ADC_CHANNEL_POT1 << 0) + (ADC_CHANNEL_POT2 << 5) + (ADC_CHANNEL_POT3 << 10) + (ADC_CHANNEL_SLIDER1 << 15) + (ADC_CHANNEL_SLIDER2 << 20) + (ADC_CHANNEL_BATT << 25); } else { - ADC_MAIN->SQR2 = (ADC_CHANNEL_POT3<<0) + (ADC_CHANNEL_SLIDER1<<5) + (ADC_CHANNEL_SLIDER2<<10) + (ADC_CHANNEL_BATT<<15) + (ADC_CHANNEL_EXT1<<20) + (ADC_CHANNEL_EXT2<<25); // conversions 7 and more - ADC_MAIN->SQR3 = (ADC_CHANNEL_STICK_LH<<0) + (ADC_CHANNEL_STICK_LV<<5) + (ADC_CHANNEL_STICK_RV<<10) + (ADC_CHANNEL_STICK_RH<<15) + (ADC_CHANNEL_POT1<<20) + (ADC_CHANNEL_POT2<<25); // conversions 1 to 6 + ADC_MAIN->SQR2 = (ADC_CHANNEL_POT3 << 0) + (ADC_CHANNEL_SLIDER1 << 5) + (ADC_CHANNEL_SLIDER2 << 10) + (ADC_CHANNEL_BATT << 15) + (ADC_CHANNEL_EXT1 << 20) + (ADC_CHANNEL_EXT2 << 25); + ADC_MAIN->SQR3 = (ADC_CHANNEL_STICK_LH << 0) + (ADC_CHANNEL_STICK_LV << 5) + (ADC_CHANNEL_STICK_RV << 10) + (ADC_CHANNEL_STICK_RH << 15) + (ADC_CHANNEL_POT1 << 20) + (ADC_CHANNEL_POT2 << 25); } #elif defined(PCBX9E) - ADC_MAIN->SQR2 = (ADC_CHANNEL_POT4<<0) + (ADC_CHANNEL_SLIDER3<<5) + (ADC_CHANNEL_SLIDER4<<10) + (ADC_CHANNEL_BATT<<15) + (ADC_CHANNEL_RTC<<20); // conversions 7 and more - ADC_MAIN->SQR3 = (ADC_CHANNEL_STICK_LH<<0) + (ADC_CHANNEL_STICK_LV<<5) + (ADC_CHANNEL_STICK_RV<<10) + (ADC_CHANNEL_STICK_RH<<15) + (ADC_CHANNEL_POT2<<20) + (ADC_CHANNEL_POT3<<25); // conversions 1 to 6 + ADC_MAIN->SQR2 = (ADC_CHANNEL_POT4 << 0) + (ADC_CHANNEL_SLIDER3 << 5) + (ADC_CHANNEL_SLIDER4 << 10) + (ADC_CHANNEL_BATT << 15) + (ADC_Channel_Vbat << 20); + ADC_MAIN->SQR3 = (ADC_CHANNEL_STICK_LH << 0) + (ADC_CHANNEL_STICK_LV << 5) + (ADC_CHANNEL_STICK_RV << 10) + (ADC_CHANNEL_STICK_RH << 15) + (ADC_CHANNEL_POT2 << 20) + (ADC_CHANNEL_POT3 << 25); #elif defined(PCBXLITE) if (STICKS_PWM_ENABLED()) { ADC_MAIN->SQR2 = 0; - ADC_MAIN->SQR3 = (ADC_CHANNEL_POT1<<0) + (ADC_CHANNEL_POT2<<5) + (ADC_CHANNEL_BATT<<10) + (ADC_CHANNEL_RTC<<15); + ADC_MAIN->SQR3 = (ADC_CHANNEL_POT1 << 0) + (ADC_CHANNEL_POT2 << 5) + (ADC_CHANNEL_BATT << 10) + (ADC_Channel_Vbat << 15); } else { - ADC_MAIN->SQR2 = (ADC_CHANNEL_BATT<<0) + (ADC_CHANNEL_RTC<<5); - ADC_MAIN->SQR3 = (ADC_CHANNEL_STICK_LH<<0) + (ADC_CHANNEL_STICK_LV<<5) + (ADC_CHANNEL_STICK_RV<<10) + (ADC_CHANNEL_STICK_RH<<15) + (ADC_CHANNEL_POT1<<20) + (ADC_CHANNEL_POT2<<25); // conversions 1 to 6 + ADC_MAIN->SQR2 = (ADC_CHANNEL_BATT << 0) + (ADC_Channel_Vbat << 5); + ADC_MAIN->SQR3 = (ADC_CHANNEL_STICK_LH << 0) + (ADC_CHANNEL_STICK_LV << 5) + (ADC_CHANNEL_STICK_RV << 10) + (ADC_CHANNEL_STICK_RH << 15) + (ADC_CHANNEL_POT1 << 20) + (ADC_CHANNEL_POT2 << 25); } #elif defined(PCBX7) - // TODO why do we invert POT1 and POT2 here? - ADC_MAIN->SQR2 = (ADC_CHANNEL_BATT<<0) + (ADC_CHANNEL_RTC<<5); // conversions 7 and more - ADC_MAIN->SQR3 = (ADC_CHANNEL_STICK_LH<<0) + (ADC_CHANNEL_STICK_LV<<5) + (ADC_CHANNEL_STICK_RV<<10) + (ADC_CHANNEL_STICK_RH<<15) + (ADC_CHANNEL_POT1<<25) + (ADC_CHANNEL_POT2<<20); // conversions 1 to 6 + ADC_MAIN->SQR2 = (ADC_CHANNEL_BATT << 0) + (ADC_Channel_Vbat << 5); + ADC_MAIN->SQR3 = (ADC_CHANNEL_STICK_LH << 0) + (ADC_CHANNEL_STICK_LV << 5) + (ADC_CHANNEL_STICK_RV << 10) + (ADC_CHANNEL_STICK_RH << 15) + (ADC_CHANNEL_POT1 << 20) + (ADC_CHANNEL_POT2 << 25); #elif defined(PCBX9LITE) - ADC_MAIN->SQR2 = (ADC_CHANNEL_RTC<<0); // conversions 7 and more - ADC_MAIN->SQR3 = (ADC_CHANNEL_STICK_LH<<0) + (ADC_CHANNEL_STICK_LV<<5) + (ADC_CHANNEL_STICK_RV<<10) + (ADC_CHANNEL_STICK_RH<<15) + (ADC_CHANNEL_POT1<<20) + (ADC_CHANNEL_BATT<<25); // conversions 1 to 6 -#else - ADC_MAIN->SQR2 = (ADC_CHANNEL_POT3<<0) + (ADC_CHANNEL_SLIDER1<<5) + (ADC_CHANNEL_SLIDER2<<10) + (ADC_CHANNEL_BATT<<15) + (ADC_CHANNEL_RTC<<20); // conversions 7 and more - ADC_MAIN->SQR3 = (ADC_CHANNEL_STICK_LH<<0) + (ADC_CHANNEL_STICK_LV<<5) + (ADC_CHANNEL_STICK_RV<<10) + (ADC_CHANNEL_STICK_RH<<15) + (ADC_CHANNEL_POT1<<20) + (ADC_CHANNEL_POT2<<25); // conversions 1 to 6 + ADC_MAIN->SQR2 = (ADC_Channel_Vbat << 0); + ADC_MAIN->SQR3 = (ADC_CHANNEL_STICK_LH << 0) + (ADC_CHANNEL_STICK_LV << 5) + (ADC_CHANNEL_STICK_RV << 10) + (ADC_CHANNEL_STICK_RH << 15) + (ADC_CHANNEL_POT1 << 20) + (ADC_CHANNEL_BATT << 25); +#elif defined(PCBX9D) || defined(PCBX9DP) + ADC_MAIN->SQR2 = (ADC_CHANNEL_POT3 << 0) + (ADC_CHANNEL_SLIDER1 << 5) + (ADC_CHANNEL_SLIDER2 << 10) + (ADC_CHANNEL_BATT << 15) + (ADC_Channel_Vbat << 20); + ADC_MAIN->SQR3 = (ADC_CHANNEL_STICK_LH << 0) + (ADC_CHANNEL_STICK_LV << 5) + (ADC_CHANNEL_STICK_RV << 10) + (ADC_CHANNEL_STICK_RH << 15) + (ADC_CHANNEL_POT1 << 20) + (ADC_CHANNEL_POT2 << 25); #endif - ADC_MAIN->SMPR1 = ADC_SAMPTIME + (ADC_SAMPTIME<<3) + (ADC_SAMPTIME<<6) + (ADC_SAMPTIME<<9) + (ADC_SAMPTIME<<12) + (ADC_SAMPTIME<<15) + (ADC_SAMPTIME<<18) + (ADC_SAMPTIME<<21) + (ADC_SAMPTIME<<24); - ADC_MAIN->SMPR2 = ADC_SAMPTIME + (ADC_SAMPTIME<<3) + (ADC_SAMPTIME<<6) + (ADC_SAMPTIME<<9) + (ADC_SAMPTIME<<12) + (ADC_SAMPTIME<<15) + (ADC_SAMPTIME<<18) + (ADC_SAMPTIME<<21) + (ADC_SAMPTIME<<24) + (ADC_SAMPTIME<<27); + ADC_MAIN->SMPR1 = (ADC_SAMPTIME << 0) + (ADC_SAMPTIME << 3) + (ADC_SAMPTIME << 6) + (ADC_SAMPTIME << 9) + (ADC_SAMPTIME << 12) + (ADC_SAMPTIME << 15) + (ADC_SAMPTIME << 18) + (ADC_SAMPTIME << 21) + (ADC_SAMPTIME << 24); + ADC_MAIN->SMPR2 = (ADC_SAMPTIME << 0) + (ADC_SAMPTIME << 3) + (ADC_SAMPTIME << 6) + (ADC_SAMPTIME << 9) + (ADC_SAMPTIME << 12) + (ADC_SAMPTIME << 15) + (ADC_SAMPTIME << 18) + (ADC_SAMPTIME << 21) + (ADC_SAMPTIME << 24) + (ADC_SAMPTIME << 27); - ADC->CCR = 0; + ADC->CCR = ADC_CCR_VBATE; // Enable vbat sensor ADC_DMA_Stream->CR = DMA_SxCR_PL | ADC_DMA_SxCR_CHSEL | DMA_SxCR_MSIZE_0 | DMA_SxCR_PSIZE_0 | DMA_SxCR_MINC; ADC_DMA_Stream->PAR = CONVERT_PTR_UINT(&ADC_MAIN->DR); ADC_DMA_Stream->M0AR = CONVERT_PTR_UINT(&adcValues[FIRST_ANALOG_ADC]); - ADC_DMA_Stream->NDTR = NUM_ANALOGS_ADC + 1/*RTC*/; + ADC_DMA_Stream->NDTR = NUM_ANALOGS_ADC; ADC_DMA_Stream->FCR = DMA_SxFCR_DMDIS | DMA_SxFCR_FTH_0; +#if defined(PCBX10) + ADC1->CR1 = ADC_CR1_SCAN; + ADC1->CR2 = ADC_CR2_ADON | ADC_CR2_DMA | ADC_CR2_DDS; + ADC1->SQR1 = (1 - 1) << 20; + ADC1->SQR2 = 0; + ADC1->SQR3 = (ADC_Channel_Vbat << 0); + ADC1->SMPR1 = (ADC_SAMPTIME << 0) + (ADC_SAMPTIME << 3) + (ADC_SAMPTIME << 6) + (ADC_SAMPTIME << 9) + (ADC_SAMPTIME << 12) + (ADC_SAMPTIME << 15) + (ADC_SAMPTIME << 18) + (ADC_SAMPTIME << 21) + (ADC_SAMPTIME << 24); + ADC1->SMPR2 = (ADC_SAMPTIME << 0) + (ADC_SAMPTIME << 3) + (ADC_SAMPTIME << 6) + (ADC_SAMPTIME << 9) + (ADC_SAMPTIME << 12) + (ADC_SAMPTIME << 15) + (ADC_SAMPTIME << 18) + (ADC_SAMPTIME << 21) + (ADC_SAMPTIME << 24) + (ADC_SAMPTIME << 27); +#endif + #if defined(PCBX9E) ADC_EXT->CR1 = ADC_CR1_SCAN; ADC_EXT->CR2 = ADC_CR2_ADON | ADC_CR2_DMA | ADC_CR2_DDS; ADC_EXT->SQR1 = (NUM_ANALOGS_ADC_EXT - 1) << 20; ADC_EXT->SQR2 = 0; - ADC_EXT->SQR3 = (ADC_CHANNEL_POT1<<0) + (ADC_CHANNEL_SLIDER1<<5) + (ADC_CHANNEL_SLIDER2<<10); // conversions 1 to 3 - ADC_EXT->SMPR1 = 0; - ADC_EXT->SMPR2 = (ADC_EXT_SAMPTIME<<(3*ADC_CHANNEL_POT1)) + (ADC_EXT_SAMPTIME<<(3*ADC_CHANNEL_SLIDER1)) + (ADC_EXT_SAMPTIME<<(3*ADC_CHANNEL_SLIDER2)); + ADC_EXT->SQR3 = (ADC_CHANNEL_POT1 << 0) + (ADC_CHANNEL_SLIDER1 << 5) + (ADC_CHANNEL_SLIDER2 << 10); // conversions 1 to 3 + ADC_EXT->SMPR1 = (ADC_SAMPTIME << 0) + (ADC_SAMPTIME << 3) + (ADC_SAMPTIME << 6) + (ADC_SAMPTIME << 9) + (ADC_SAMPTIME << 12) + (ADC_SAMPTIME << 15) + (ADC_SAMPTIME << 18) + (ADC_SAMPTIME << 21) + (ADC_SAMPTIME << 24); + ADC_EXT->SMPR2 = (ADC_SAMPTIME << 0) + (ADC_SAMPTIME << 3) + (ADC_SAMPTIME << 6) + (ADC_SAMPTIME << 9) + (ADC_SAMPTIME << 12) + (ADC_SAMPTIME << 15) + (ADC_SAMPTIME << 18) + (ADC_SAMPTIME << 21) + (ADC_SAMPTIME << 24) + (ADC_SAMPTIME << 27); ADC_EXT_DMA_Stream->CR = DMA_SxCR_PL | DMA_SxCR_CHSEL_1 | DMA_SxCR_MSIZE_0 | DMA_SxCR_PSIZE_0 | DMA_SxCR_MINC; ADC_EXT_DMA_Stream->PAR = CONVERT_PTR_UINT(&ADC_EXT->DR); @@ -165,11 +178,16 @@ void adcSingleRead() ADC_MAIN->SR &= ~(uint32_t)(ADC_SR_EOC | ADC_SR_STRT | ADC_SR_OVR); ADC_SET_DMA_FLAGS(); ADC_DMA_Stream->CR |= DMA_SxCR_EN; // Enable DMA - ADC_MAIN->CR2 |= (uint32_t) ADC_CR2_SWSTART; + ADC_MAIN->CR2 |= (uint32_t)ADC_CR2_SWSTART; + +#if defined(PCBX10) + ADC1->SR &= ~(uint32_t)(ADC_SR_EOC | ADC_SR_STRT | ADC_SR_OVR); + ADC1->CR2 |= (uint32_t)ADC_CR2_SWSTART; +#endif #if defined(PCBX9E) ADC_EXT_DMA_Stream->CR &= ~DMA_SxCR_EN; // Disable DMA - ADC_EXT->SR &= ~(uint32_t) ( ADC_SR_EOC | ADC_SR_STRT | ADC_SR_OVR ); + ADC_EXT->SR &= ~(uint32_t)(ADC_SR_EOC | ADC_SR_STRT | ADC_SR_OVR); ADC_EXT_SET_DMA_FLAGS(); ADC_EXT_DMA_Stream->CR |= DMA_SxCR_EN; // Enable DMA ADC_EXT->CR2 |= (uint32_t)ADC_CR2_SWSTART; @@ -191,6 +209,12 @@ void adcSingleRead() } ADC_DMA_Stream->CR &= ~DMA_SxCR_EN; // Disable DMA #endif + +#if defined(PCBX10) + if (isVBatBridgeEnabled()) { + rtcBatteryVoltage = ADC1->DR; + } +#endif } void adcRead() @@ -221,18 +245,17 @@ void adcRead() #endif } -// TODO -void adcStop() +#if defined(PCBX10) +uint16_t getRTCBatteryVoltage() { + return (rtcBatteryVoltage * ADC_VREF_PREC2) / 2048; } - -uint16_t getRTCBattVoltage() +#else +uint16_t getRTCBatteryVoltage() { - ADC->CCR |= ADC_CCR_VBATE; - adcSingleRead(); - ADC->CCR &= ADC_CCR_VBATE; - return adcValues[TX_RTC] * 330 / 2048; + return (getAnalogValue(TX_RTC_VOLTAGE) * ADC_VREF_PREC2) / 2048; } +#endif #if !defined(SIMU) uint16_t getAnalogValue(uint8_t index) @@ -244,9 +267,9 @@ uint16_t getAnalogValue(uint8_t index) return 0; } #if defined(PCBX9E) - index = ana_mapping[index]; + index = adcMapping[index]; #endif - if (ana_direction[index] < 0) + if (adcDirection[index] < 0) return 4095 - adcValues[index]; else return adcValues[index]; diff --git a/radio/src/targets/common/arm/stm32/aux_serial_driver.cpp b/radio/src/targets/common/arm/stm32/aux_serial_driver.cpp index 8d49dd53d..93a46e9a6 100644 --- a/radio/src/targets/common/arm/stm32/aux_serial_driver.cpp +++ b/radio/src/targets/common/arm/stm32/aux_serial_driver.cpp @@ -166,7 +166,7 @@ extern "C" void AUX_SERIAL_USART_IRQHandler(void) } #if defined(CLI) - if (!(getSelectedUsbMode() == USB_SERIAL_MODE)) { + if (getSelectedUsbMode() != USB_SERIAL_MODE) { // Receive uint32_t status = AUX_SERIAL_USART->SR; while (status & (USART_FLAG_RXNE | USART_FLAG_ERRORS)) { diff --git a/radio/src/targets/common/arm/stm32/board_common.h b/radio/src/targets/common/arm/stm32/board_common.h new file mode 100644 index 000000000..add5ccbde --- /dev/null +++ b/radio/src/targets/common/arm/stm32/board_common.h @@ -0,0 +1,142 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#ifndef _BOARD_COMMON_H_ +#define _BOARD_COMMON_H_ + +#include +#include "cpu_id.h" + +#if defined(LUA_EXPORT_GENERATION) +// no includes +#else + +#if __clang__ +// clang is very picky about the use of "register" +// Tell clang to ignore the warnings for the following files +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-register" +#endif + +#if defined(STM32F4) + +#include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h" +#include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_rcc.h" +#include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_syscfg.h" +#include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_gpio.h" +#include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_exti.h" +#include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_tim.h" +#include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_adc.h" +#include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_spi.h" +#include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_i2c.h" +#include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_rtc.h" +#include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_pwr.h" +#include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_dma.h" +#include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_usart.h" +#include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_flash.h" +#include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_dbgmcu.h" +#include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/misc.h" +#else +#include "STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/CMSIS/Device/ST/STM32F2xx/Include/stm32f2xx.h" + #include "STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/inc/stm32f2xx_rcc.h" + #include "STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/inc/stm32f2xx_syscfg.h" + #include "STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/inc/stm32f2xx_gpio.h" + #include "STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/inc/stm32f2xx_exti.h" + #include "STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/inc/stm32f2xx_tim.h" + #include "STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/inc/stm32f2xx_adc.h" + #include "STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/inc/stm32f2xx_spi.h" + #include "STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/inc/stm32f2xx_i2c.h" + #include "STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/inc/stm32f2xx_rtc.h" + #include "STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/inc/stm32f2xx_pwr.h" + #include "STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/inc/stm32f2xx_dma.h" + #include "STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/inc/stm32f2xx_usart.h" + #include "STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/inc/stm32f2xx_flash.h" + #include "STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/inc/stm32f2xx_dbgmcu.h" + #include "STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/inc/misc.h" +#endif + +#if __clang__ +// Restore warnings about registers +#pragma clang diagnostic pop +#endif + +#endif + +#if defined(__cplusplus) && !defined(SIMU) +extern "C" { +#endif + +#include "usb_driver.h" + +#if !defined(SIMU) +#include "usbd_cdc_core.h" +#include "usbd_msc_core.h" +#include "usbd_hid_core.h" +#include "usbd_usr.h" +#include "usbd_desc.h" +#include "usb_conf.h" +#include "usbd_conf.h" +#endif + +#if defined(__cplusplus) && !defined(SIMU) +} +#endif + +#if defined(SIMU) +#include "../simu/simpgmspace.h" +#endif + +// ADC driver +void adcInit(); +void adcRead(); +uint16_t getAnalogValue(uint8_t index); +uint16_t getBatteryVoltage(); // returns current battery voltage in 10mV steps +uint16_t getRTCBatteryVoltage(); + +// STM32 uses a 25K+25K voltage divider bridge to measure the battery voltage +// Measuring VBAT puts considerable drain (22 µA) on the battery instead of normal drain (~10 nA) +static inline void enableVBatBridge() +{ + ADC->CCR |= ADC_CCR_VBATE; +} + +static inline void disableVBatBridge() +{ + ADC->CCR &= ~ADC_CCR_VBATE; +} + +static inline bool isVBatBridgeEnabled() +{ + return ADC->CCR & ADC_CCR_VBATE; +} + +// Delays driver +#ifdef __cplusplus +extern "C" { +#endif +void delaysInit(void); +void delay_01us(uint16_t nb); +void delay_us(uint16_t nb); +void delay_ms(uint32_t ms); +#ifdef __cplusplus +} +#endif + +#endif diff --git a/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt b/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt index fec7b825f..4141a766e 100644 --- a/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt +++ b/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt @@ -2,7 +2,7 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) -if(PCB STREQUAL X12S OR PCB STREQUAL X10) +if(CPU_TYPE_FULL STREQUAL STM32F429xI) set(BOOTLOADER_SRC ${BOOTLOADER_SRC} ../f4/system_stm32f4xx.c @@ -19,7 +19,7 @@ if(PCB STREQUAL X12S OR PCB STREQUAL X10) ../../../../../${STM32LIB_DIR}/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_sdio.c ../../../../../${STM32LIB_DIR}/STM32F4xx_StdPeriph_Driver/src/misc.c ) -elseif(PCB STREQUAL X9E) +elseif(CPU_TYPE_FULL STREQUAL STM32F407xE) set(BOOTLOADER_SRC ${BOOTLOADER_SRC} ../f4/system_stm32f4xx.c @@ -70,7 +70,7 @@ set(BOOTLOADER_SRC ../../../../../targets/${TARGET_DIR}/backlight_driver.cpp ../../../../../targets/${TARGET_DIR}/keys_driver.cpp ../../../../../targets/${TARGET_DIR}/diskio.cpp - ../../../../../targets/${TARGET_DIR}/board_preinit.cpp + ../../../../../targets/${TARGET_DIR}/board.cpp ../../../../../targets/${TARGET_DIR}/pwr_driver.cpp ../../../../../targets/${TARGET_DIR}/bootloader/boot_menu.cpp ../usbd_usr.cpp @@ -85,7 +85,7 @@ set(BOOTLOADER_SRC bin_files.cpp ) -if(PCB STREQUAL X12S OR PCB STREQUAL X10 OR PCB STREQUAL X9E OR (PCB STREQUAL X7 AND NOT (PCBREV STREQUAL T12)) OR PCB STREQUAL X9LITE) +if(PCB STREQUAL X12S OR PCB STREQUAL X10 OR PCB STREQUAL X9E OR (PCB STREQUAL X9D+ AND PCBREV STREQUAL 2019) OR (PCB STREQUAL X7 AND NOT (PCBREV STREQUAL T12)) OR PCB STREQUAL X9LITE) set(BOOTLOADER_SRC ${BOOTLOADER_SRC} ../../../../../targets/common/arm/stm32/rotary_encoder_driver.cpp @@ -97,9 +97,7 @@ if(NOT (PCB STREQUAL X10 OR PCB STREQUAL X12S)) ${BOOTLOADER_SRC} ../../../../../targets/${TARGET_DIR}/i2c_driver.cpp ) - remove_definitions(-DDEBUG) - else() set(BOOTLOADER_SRC ${BOOTLOADER_SRC} @@ -131,7 +129,6 @@ set(CMAKE_EXE_LINKER_FLAGS "-mcpu=${MCU} -mthumb -nostartfiles -lm -T${RADIO_SRC # use smaller nano libc set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --specs=nano.specs") - add_executable(bootloader ${BOOTLOADER_SRC}) add_dependencies(bootloader ${BITMAPS_TARGET} firmware_translations) diff --git a/radio/src/targets/common/arm/stm32/bootloader/boot.cpp b/radio/src/targets/common/arm/stm32/bootloader/boot.cpp index 9555001f6..be86769ff 100644 --- a/radio/src/targets/common/arm/stm32/bootloader/boot.cpp +++ b/radio/src/targets/common/arm/stm32/bootloader/boot.cpp @@ -17,21 +17,23 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ + #include "opentx.h" #include "boot.h" #include "bin_files.h" #if defined(PCBXLITE) -#define BOOTLOADER_KEYS 0x0F + #define BOOTLOADER_KEYS 0x0F #else -#define BOOTLOADER_KEYS 0x42 + #define BOOTLOADER_KEYS 0x42 #endif + #define APP_START_ADDRESS (uint32_t)(FIRMWARE_ADDRESS + BOOTLOADER_SIZE) #if defined(EEPROM) -#define MAIN_MENU_LEN 3 + #define MAIN_MENU_LEN 3 #else -#define MAIN_MENU_LEN 2 + #define MAIN_MENU_LEN 2 #endif typedef void (*voidFunction)(void); @@ -63,9 +65,7 @@ uint32_t eepromWritten = 0; #endif volatile uint8_t tenms = 1; - FlashCheckRes valid; - MemoryType memoryType; uint32_t unlocked = 0; @@ -83,6 +83,7 @@ void interrupt10ms(void) #if defined(ROTARY_ENCODER_NAVIGATION) static rotenc_t rePreviousValue; + rotenc_t reNewValue = (rotencValue / ROTARY_ENCODER_GRANULARITY); int8_t scrollRE = reNewValue - rePreviousValue; if (scrollRE) { @@ -201,7 +202,7 @@ int main() AUX_SERIAL_RCC_AHB1Periph | I2C_RCC_AHB1Periph | SD_RCC_AHB1Periph, ENABLE); - RCC_APB1PeriphClockCmd(LCD_RCC_APB1Periph | BACKLIGHT_RCC_APB1Periph | + RCC_APB1PeriphClockCmd(ROTARY_ENCODER_RCC_APB1Periph | LCD_RCC_APB1Periph | BACKLIGHT_RCC_APB1Periph | INTERRUPT_xMS_RCC_APB1Periph | I2C_RCC_APB1Periph | AUX_SERIAL_RCC_APB1Periph | SD_RCC_APB1Periph, ENABLE); @@ -209,13 +210,14 @@ int main() RCC_APB2PeriphClockCmd(LCD_RCC_APB2Periph | BACKLIGHT_RCC_APB2Periph | RCC_APB2Periph_SYSCFG, ENABLE); keysInit(); + pwrInit(); + pwrOff(); - boardPreInit(); - - // wait for inputs to stabilize - for (uint32_t i = 0; i < 50000; i += 1) { - wdt_reset(); - } +#if defined(PCBHORUS) + // wait a bit for the inputs to stabilize... + // ... otherwise the bootloader cannot be started + // when the power on delay is cut to 0. +#endif // LHR & RHL trims not pressed simultanously if (readTrims() != BOOTLOADER_KEYS) { @@ -223,11 +225,12 @@ int main() jumpTo(APP_START_ADDRESS); } + pwrOn(); + #if defined(ROTARY_ENCODER_NAVIGATION) rotaryEncoderInit(); #endif - pwrInit(); delaysInit(); // needed for lcdInit() #if defined(DEBUG) @@ -488,12 +491,7 @@ int main() if (state != ST_FLASHING && state != ST_USB) { if (pwrOffPressed()) { - lcdClear(); - lcdOff(); // this drains LCD caps - pwrOff(); - for (;;) { - // Wait for power to go off - } + boardOff(); } } diff --git a/radio/src/targets/common/arm/stm32/heartbeat_driver.cpp b/radio/src/targets/common/arm/stm32/heartbeat_driver.cpp index 2281fa866..926c05c63 100644 --- a/radio/src/targets/common/arm/stm32/heartbeat_driver.cpp +++ b/radio/src/targets/common/arm/stm32/heartbeat_driver.cpp @@ -39,7 +39,7 @@ void init_intmodule_heartbeat() EXTI_StructInit(&EXTI_InitStructure); EXTI_InitStructure.EXTI_Line = INTMODULE_HEARTBEAT_EXTI_LINE; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; - EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; + EXTI_InitStructure.EXTI_Trigger = INTMODULE_HEARTBEAT_TRIGGER; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); @@ -65,10 +65,14 @@ void stop_intmodule_heartbeat() EXTI_Init(&EXTI_InitStructure); } -void check_xjt_heartbeat() +void check_intmodule_heartbeat() { if (EXTI_GetITStatus(INTMODULE_HEARTBEAT_EXTI_LINE) != RESET) { - heartbeatCapture.timestamp = TIMER_2MHz_TIMER->CNT; +#if defined(INTMODULE_USART) + heartbeatCapture.timestamp = RTOS_GET_MS(); +#else + heartbeatCapture.timestamp = getTmr2MHz(); +#endif heartbeatCapture.count++; EXTI_ClearITPendingBit(INTMODULE_HEARTBEAT_EXTI_LINE); } @@ -78,6 +82,6 @@ void check_xjt_heartbeat() #if defined(INTMODULE_HEARTBEAT) && !defined(INTMODULE_HEARTBEAT_REUSE_INTERRUPT_ROTARY_ENCODER) extern "C" void INTMODULE_HEARTBEAT_EXTI_IRQHandler() { - check_xjt_heartbeat(); + check_intmodule_heartbeat(); } #endif diff --git a/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp b/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp index 8d254a7b4..8102b5eee 100755 --- a/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp +++ b/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp @@ -41,9 +41,9 @@ void intmoduleStop() GPIO_ResetBits(INTMODULE_GPIO, INTMODULE_TX_GPIO_PIN | INTMODULE_RX_GPIO_PIN); } -void intmodulePxxStart() +void intmodulePxx1SerialStart() { - intmoduleSerialStart(INTMODULE_PXX_BAUDRATE, false); + intmoduleSerialStart(INTMODULE_PXX1_SERIAL_BAUDRATE, false); } void intmoduleSerialStart(uint32_t baudrate, uint8_t rxEnable) @@ -105,6 +105,12 @@ extern "C" void INTMODULE_USART_IRQHandler(void) } } +void intmoduleSendByte(uint8_t byte) +{ + while (!(INTMODULE_USART->SR & USART_SR_TXE)); + USART_SendData(INTMODULE_USART, byte); +} + void intmoduleSendBuffer(const uint8_t * data, uint8_t size) { if (size == 0) @@ -136,7 +142,7 @@ void intmoduleSendNextFrame() { switch(moduleState[INTERNAL_MODULE].protocol) { #if defined(PXX2) - case PROTOCOL_CHANNELS_PXX2: + case PROTOCOL_CHANNELS_PXX2_HIGHSPEED: intmoduleSendBuffer(intmodulePulsesData.pxx2.getData(), intmodulePulsesData.pxx2.getSize()); break; #endif 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 6e763f058..fc028d3b5 100644 --- a/radio/src/targets/common/arm/stm32/rotary_encoder_driver.cpp +++ b/radio/src/targets/common/arm/stm32/rotary_encoder_driver.cpp @@ -20,10 +20,20 @@ #include "opentx.h" -uint32_t rotencPosition; +uint8_t rotencPosition; void rotaryEncoderInit() { + rotencPosition = ROTARY_ENCODER_POSITION(); + + ROTARY_ENCODER_TIMER->ARR = 99; // 100uS + ROTARY_ENCODER_TIMER->PSC = (PERI1_FREQUENCY * TIMER_MULT_APB1) / 1000000 - 1; // 1uS + ROTARY_ENCODER_TIMER->CCER = 0; + ROTARY_ENCODER_TIMER->CCMR1 = 0; + ROTARY_ENCODER_TIMER->EGR = 0; + ROTARY_ENCODER_TIMER->CR1 = 0; + ROTARY_ENCODER_TIMER->DIER |= TIM_DIER_UIE; + SYSCFG_EXTILineConfig(ROTARY_ENCODER_EXTI_PortSource, ROTARY_ENCODER_EXTI_PinSource1); #if defined(ROTARY_ENCODER_EXTI_LINE2) @@ -55,20 +65,21 @@ void rotaryEncoderInit() NVIC_Init(&NVIC_InitStructure); #endif - rotencPosition = ROTARY_ENCODER_POSITION(); + NVIC_EnableIRQ(ROTARY_ENCODER_TIMER_IRQn); + NVIC_SetPriority(ROTARY_ENCODER_TIMER_IRQn, 7); } void rotaryEncoderCheck() { - uint32_t newpos = ROTARY_ENCODER_POSITION(); - if (newpos != rotencPosition && !keyState(KEY_ENTER)) { - if ((rotencPosition & 0x01) ^ ((newpos & 0x02) >> 1)) { + uint8_t newPosition = ROTARY_ENCODER_POSITION(); + if (newPosition != rotencPosition && !(readKeys() & (1 << KEY_ENTER))) { + if ((rotencPosition & 0x01) ^ ((newPosition & 0x02) >> 1)) { --rotencValue; } else { ++rotencValue; } - rotencPosition = newpos; + rotencPosition = newPosition; #if !defined(BOOT) if (g_eeGeneral.backlightMode & e_backlight_mode_keys) { backlightOn(); @@ -77,22 +88,27 @@ void rotaryEncoderCheck() } } +void rotaryEncoderStartDelay() +{ + ROTARY_ENCODER_TIMER->CR1 = TIM_CR1_CEN | TIM_CR1_URS; +} + extern "C" void ROTARY_ENCODER_EXTI_IRQHandler1(void) { if (EXTI_GetITStatus(ROTARY_ENCODER_EXTI_LINE1) != RESET) { - rotaryEncoderCheck(); + rotaryEncoderStartDelay(); EXTI_ClearITPendingBit(ROTARY_ENCODER_EXTI_LINE1); } #if !defined(ROTARY_ENCODER_EXTI_IRQn2) if (EXTI_GetITStatus(ROTARY_ENCODER_EXTI_LINE2) != RESET) { - rotaryEncoderCheck(); + rotaryEncoderStartDelay(); EXTI_ClearITPendingBit(ROTARY_ENCODER_EXTI_LINE2); } #endif #if !defined(BOOT) && defined(INTMODULE_HEARTBEAT_REUSE_INTERRUPT_ROTARY_ENCODER) - check_xjt_heartbeat(); + check_intmodule_heartbeat(); #endif } @@ -100,8 +116,15 @@ extern "C" void ROTARY_ENCODER_EXTI_IRQHandler1(void) extern "C" void ROTARY_ENCODER_EXTI_IRQHandler2(void) { if (EXTI_GetITStatus(ROTARY_ENCODER_EXTI_LINE2) != RESET) { - rotaryEncoderCheck(); + rotaryEncoderStartDelay(); EXTI_ClearITPendingBit(ROTARY_ENCODER_EXTI_LINE2); } } #endif + +extern "C" void ROTARY_ENCODER_TIMER_IRQHandler(void) +{ + ROTARY_ENCODER_TIMER->SR &= ~TIM_SR_UIF; + ROTARY_ENCODER_TIMER->CR1 = 0; + rotaryEncoderCheck(); +} \ No newline at end of file diff --git a/radio/src/targets/common/arm/stm32/timers_driver.cpp b/radio/src/targets/common/arm/stm32/timers_driver.cpp new file mode 100644 index 000000000..f25cf483b --- /dev/null +++ b/radio/src/targets/common/arm/stm32/timers_driver.cpp @@ -0,0 +1,79 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include "opentx.h" + +// Start TIMER at 2000000Hz +void init2MhzTimer() +{ + TIMER_2MHz_TIMER->PSC = (PERI1_FREQUENCY * TIMER_MULT_APB1) / 2000000 - 1; // 0.5 uS, 2 MHz + TIMER_2MHz_TIMER->ARR = 65535; + TIMER_2MHz_TIMER->CR2 = 0; + TIMER_2MHz_TIMER->CR1 = TIM_CR1_CEN; +} + +// Start TIMER at 200Hz +void init5msTimer() +{ + INTERRUPT_xMS_TIMER->ARR = 4999; // 5mS in uS + INTERRUPT_xMS_TIMER->PSC = (PERI1_FREQUENCY * TIMER_MULT_APB1) / 1000000 - 1; // 1uS + INTERRUPT_xMS_TIMER->CCER = 0; + INTERRUPT_xMS_TIMER->CCMR1 = 0; + INTERRUPT_xMS_TIMER->EGR = 0; + INTERRUPT_xMS_TIMER->CR1 = TIM_CR1_CEN | TIM_CR1_URS; + INTERRUPT_xMS_TIMER->DIER |= TIM_DIER_UIE; + NVIC_EnableIRQ(INTERRUPT_xMS_IRQn); + NVIC_SetPriority(INTERRUPT_xMS_IRQn, 7); +} + +void stop5msTimer() +{ + INTERRUPT_xMS_TIMER->CR1 = 0 ; // stop timer + NVIC_DisableIRQ(INTERRUPT_xMS_IRQn) ; +} + +// TODO use the same than board_sky9x.cpp +void interrupt5ms() +{ + static uint8_t pre_scale; // Used to get 10 Hz counter + + ++pre_scale; + +#if defined(HAPTIC) + DEBUG_TIMER_START(debugTimerHaptic); + HAPTIC_HEARTBEAT(); + DEBUG_TIMER_STOP(debugTimerHaptic); +#endif + + if (pre_scale == 2) { + pre_scale = 0; + DEBUG_TIMER_START(debugTimerPer10ms); + DEBUG_TIMER_SAMPLE(debugTimerPer10msPeriod); + per10ms(); + DEBUG_TIMER_STOP(debugTimerPer10ms); + } +} + +extern "C" void INTERRUPT_xMS_IRQHandler() +{ + INTERRUPT_xMS_TIMER->SR &= ~TIM_SR_UIF; + interrupt5ms(); + DEBUG_INTERRUPT(INT_1MS); +} diff --git a/radio/src/targets/common/arm/stm32/usb_driver.cpp b/radio/src/targets/common/arm/stm32/usb_driver.cpp index e47774623..7e2c5abf1 100644 --- a/radio/src/targets/common/arm/stm32/usb_driver.cpp +++ b/radio/src/targets/common/arm/stm32/usb_driver.cpp @@ -49,23 +49,8 @@ void setSelectedUsbMode(int mode) int usbPlugged() { - // debounce - static uint8_t debounced_state = 0; - static uint8_t last_state = 0; - - if (GPIO_ReadInputDataBit(USB_GPIO, USB_GPIO_PIN_VBUS)) { - if (last_state) { - debounced_state = 1; - } - last_state = 1; - } - else { - if (!last_state) { - debounced_state = 0; - } - last_state = 0; - } - return debounced_state; + static PinDebounce debounce; + return debounce.debounce(USB_GPIO, USB_GPIO_PIN_VBUS); } USB_OTG_CORE_HANDLE USB_OTG_dev; diff --git a/radio/src/targets/horus/CMakeLists.txt b/radio/src/targets/horus/CMakeLists.txt index 14fd9c4e9..ffaeadc74 100644 --- a/radio/src/targets/horus/CMakeLists.txt +++ b/radio/src/targets/horus/CMakeLists.txt @@ -1,5 +1,5 @@ -option(DISK_CACHE "Enable SD card disk cache" YES) -option(UNEXPECTED_SHUTDOWN "Enable the Unexpected Shutdown screen" YES) +option(DISK_CACHE "Enable SD card disk cache" ON) +option(UNEXPECTED_SHUTDOWN "Enable the Unexpected Shutdown screen" ON) option(PXX1 "PXX1 protocol support" ON) option(PXX2 "PXX2 protocol support" OFF) @@ -28,6 +28,7 @@ endif() if (PCB STREQUAL X10) set(FLAVOUR x10) + set(PCBREV "STD" CACHE STRING "PCB Revision") add_definitions(-DPCBX10) add_definitions(-DSOFTWARE_VOLUME) set(TARGET_SRC @@ -40,6 +41,13 @@ if (PCB STREQUAL X10) set(FONTS_TARGET x10_fonts) set(LCD_DRIVER lcd_driver.cpp) set(LUA_EXPORT lua_export_x10) + if (PCBREV STREQUAL EXPRESS) + option(INTERNAL_MODULE_PXX1 "Support for PXX1 internal module" OFF) + option(INTERNAL_MODULE_PXX2 "Support for PXX2 internal module" ON) + else() + option(INTERNAL_MODULE_PXX1 "Support for PXX1 internal module" ON) + option(INTERNAL_MODULE_PXX2 "Support for PXX2 internal module" OFF) + endif() elseif (PCB STREQUAL X12S) set(FLAVOUR x12s) set(PCBREV "13" CACHE STRING "PCB Revision") @@ -59,14 +67,16 @@ elseif (PCB STREQUAL X12S) adc_driver.cpp gps_driver.cpp ) - + set(AUX_SERIAL_DRIVER ../common/arm/stm32/aux_serial_driver.cpp) set(BITMAPS_TARGET x12s_bitmaps) set(FONTS_TARGET x12s_fonts) set(LCD_DRIVER lcd_driver.cpp) set(LUA_EXPORT lua_export_x12s) - add_definitions(-DPCBREV=${PCBREV}) endif() +add_definitions(-DPCBREV=${PCBREV}) +add_definitions(-DPCBREV_${PCBREV}) + set(FIRMWARE_DEPENDENCIES ${FIRMWARE_DEPENDENCIES} ${BITMAPS_TARGET}) add_definitions(-DPCBHORUS -DSTM32F429_439xx -DSDRAM -DCOLORLCD) @@ -108,26 +118,39 @@ set(GUI_SRC ${WIDGETS_SRC} rle.cpp ) + +if(PXX2 OR LUA) + set(GUI_SRC ${GUI_SRC} radio_tools.cpp) +endif() + +#if(PXX2) +# set(GUI_SRC +# ${GUI_SRC} +# ../common/stdlcd/radio_spectrum_analyser.cpp +# ../common/stdlcd/radio_power_meter.cpp +# ) +#endif() + if(DISK_CACHE) set(SRC ${SRC} disk_cache.cpp) add_definitions(-DDISK_CACHE) endif() + if(INTERNAL_GPS) set(SRC ${SRC} gps.cpp) add_definitions(-DINTERNAL_GPS) message("Horus: Internal GPS enabled") endif() -set(AUX_SERIAL_DRIVER ../common/arm/stm32/aux_serial_driver.cpp) - set(GVAR_SCREEN model_gvars.cpp) set(TARGET_SRC ${TARGET_SRC} - board.cpp led_driver.cpp extmodule_driver.cpp trainer_driver.cpp + ../common/arm/stm32/heartbeat_driver.cpp + ../common/arm/stm32/timers_driver.cpp ../common/arm/stm32/intmodule_serial_driver.cpp ../common/arm/stm32/bluetooth_driver.cpp ../common/arm/stm32/rotary_encoder_driver.cpp @@ -136,6 +159,7 @@ set(TARGET_SRC set(FIRMWARE_TARGET_SRC ${FIRMWARE_TARGET_SRC} ${LCD_DRIVER} + board.cpp backlight_driver.cpp pwr_driver.cpp sdram_driver.c @@ -167,3 +191,11 @@ if(PYTHONINTERP_FOUND) DEPENDS ${RADIO_DIRECTORY}/src/datastructs.h ${RADIO_DIRECTORY}/util/generate_datacopy.py ) endif() + +if(INTERNAL_MODULE_PXX1) + add_definitions(-DINTERNAL_MODULE_PXX1) +endif() + +if(INTERNAL_MODULE_PXX2) + add_definitions(-DINTERNAL_MODULE_PXX2) +endif() \ No newline at end of file diff --git a/radio/src/targets/horus/adc_driver.cpp b/radio/src/targets/horus/adc_driver.cpp index 34aff8f24..932f752a0 100644 --- a/radio/src/targets/horus/adc_driver.cpp +++ b/radio/src/targets/horus/adc_driver.cpp @@ -20,7 +20,8 @@ #include "opentx.h" -uint16_t adcValues[NUM_ANALOGS + 1/*RTC*/] __DMA; +uint16_t adcValues[NUM_ANALOGS] __DMA; +uint16_t rtcBatteryVoltage; #define ADC_CS_HIGH() (ADC_SPI_GPIO->BSRRL = ADC_SPI_PIN_CS) #define ADC_CS_LOW() (ADC_SPI_GPIO->BSRRH = ADC_SPI_PIN_CS) @@ -40,8 +41,6 @@ uint16_t adcValues[NUM_ANALOGS + 1/*RTC*/] __DMA; #define RESETCMD 0x4000 #define MANUAL_MODE 0x1000 // manual mode channel 0 -#define SAMPTIME 2 // sample time = 28 cycles - uint16_t SPIx_ReadWriteByte(uint16_t value) { while (SPI_I2S_GetFlagStatus(ADC_SPI, SPI_I2S_FLAG_TXE) == RESET); @@ -113,22 +112,13 @@ void adcInit() GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(ADC_GPIO_MOUSE, &GPIO_InitStructure); - // RTC battery - ADC1->CR1 = ADC_CR1_SCAN; - ADC1->CR2 = ADC_CR2_ADON | ADC_CR2_DMA | ADC_CR2_DDS; - ADC1->SQR1 = (1 - 1) << 20; - ADC1->SQR3 = ADC_CHANNEL_RTC; - ADC1->SMPR1 = SAMPTIME + (SAMPTIME<<3) + (SAMPTIME<<6) + (SAMPTIME<<9) + (SAMPTIME<<12) + (SAMPTIME<<15) + (SAMPTIME<<18) + (SAMPTIME<<21) + (SAMPTIME<<24); - ADC1->SMPR2 = SAMPTIME + (SAMPTIME<<3) + (SAMPTIME<<6) + (SAMPTIME<<9) + (SAMPTIME<<12) + (SAMPTIME<<15) + (SAMPTIME<<18) + (SAMPTIME<<21) + (SAMPTIME<<24) + (SAMPTIME<<27); - - // Track pad ADC3->CR1 = ADC_CR1_SCAN; ADC3->CR2 = ADC_CR2_ADON | ADC_CR2_DMA | ADC_CR2_DDS; ADC3->SQR1 = (2 - 1) << 20; ADC3->SQR2 = 0; - ADC3->SQR3 = ADC_CHANNEL_MOUSE1 + (ADC_CHANNEL_MOUSE2<<5); - ADC3->SMPR1 = 0; - ADC3->SMPR2 = (ADC_SAMPTIME<<(3*ADC_CHANNEL_MOUSE1)) + (ADC_SAMPTIME<<(3*ADC_CHANNEL_MOUSE2)); + ADC3->SQR3 = (ADC_CHANNEL_MOUSE1 << 0) + (ADC_CHANNEL_MOUSE2 << 5); + ADC3->SMPR1 = (ADC_SAMPTIME << 0) + (ADC_SAMPTIME << 3) + (ADC_SAMPTIME << 6) + (ADC_SAMPTIME << 9) + (ADC_SAMPTIME << 12) + (ADC_SAMPTIME << 15) + (ADC_SAMPTIME << 18) + (ADC_SAMPTIME << 21) + (ADC_SAMPTIME << 24); + ADC3->SMPR2 = (ADC_SAMPTIME << 0) + (ADC_SAMPTIME << 3) + (ADC_SAMPTIME << 6) + (ADC_SAMPTIME << 9) + (ADC_SAMPTIME << 12) + (ADC_SAMPTIME << 15) + (ADC_SAMPTIME << 18) + (ADC_SAMPTIME << 21) + (ADC_SAMPTIME << 24) + (ADC_SAMPTIME << 27); ADC->CCR = 0; // Enable the DMA channel here, DMA2 stream 1, channel 2 @@ -137,6 +127,19 @@ void adcInit() ADC_DMA_Stream->M0AR = CONVERT_PTR_UINT(&adcValues[MOUSE1]); ADC_DMA_Stream->NDTR = 2; ADC_DMA_Stream->FCR = DMA_SxFCR_DMDIS | DMA_SxFCR_FTH_0; + + ADC1->CR1 = ADC_CR1_SCAN; + ADC1->CR2 = ADC_CR2_ADON | ADC_CR2_DMA | ADC_CR2_DDS; + ADC1->SQR1 = (1 - 1) << 20; + ADC1->SQR2 = 0; + ADC1->SQR3 = (ADC_Channel_Vbat << 0); + ADC1->SMPR1 = (ADC_SAMPTIME << 0) + (ADC_SAMPTIME << 3) + (ADC_SAMPTIME << 6) + (ADC_SAMPTIME << 9) + (ADC_SAMPTIME << 12) + (ADC_SAMPTIME << 15) + (ADC_SAMPTIME << 18) + (ADC_SAMPTIME << 21) + (ADC_SAMPTIME << 24); + ADC1->SMPR2 = (ADC_SAMPTIME << 0) + (ADC_SAMPTIME << 3) + (ADC_SAMPTIME << 6) + (ADC_SAMPTIME << 9) + (ADC_SAMPTIME << 12) + (ADC_SAMPTIME << 15) + (ADC_SAMPTIME << 18) + (ADC_SAMPTIME << 21) + (ADC_SAMPTIME << 24) + (ADC_SAMPTIME << 27); +} + +uint16_t getRTCBatteryVoltage() +{ + return (rtcBatteryVoltage * ADC_VREF_PREC2) / 2048; } const uint16_t adcCommands[MOUSE1+2] = @@ -206,13 +209,14 @@ uint32_t adcReadNextSPIChannel(uint8_t index) void adcOnChipReadStart() { ADC_DMA_Stream->CR &= ~DMA_SxCR_EN; // Disable DMA - ADC1->SR &= ~(uint32_t)(ADC_SR_EOC | ADC_SR_STRT | ADC_SR_OVR); ADC3->SR &= ~(uint32_t)(ADC_SR_EOC | ADC_SR_STRT | ADC_SR_OVR); ADC_DMA->LIFCR = DMA_LIFCR_CTCIF0 | DMA_LIFCR_CHTIF0 | DMA_LIFCR_CTEIF0 | DMA_LIFCR_CDMEIF0 | DMA_LIFCR_CFEIF0; // Write ones to clear bits ADC_DMA_Stream->M0AR = CONVERT_PTR_UINT(&adcValues[MOUSE1]); ADC_DMA_Stream->NDTR = 2; ADC_DMA_Stream->CR |= DMA_SxCR_EN; // Enable DMA ADC3->CR2 |= (uint32_t)ADC_CR2_SWSTART; + + ADC1->SR &= ~(uint32_t)(ADC_SR_EOC | ADC_SR_STRT | ADC_SR_OVR); ADC1->CR2 |= (uint32_t)ADC_CR2_SWSTART; } @@ -256,14 +260,10 @@ void adcRead() for (uint8_t x=0; x> 2; } -} -uint16_t getRTCBattVoltage() -{ - ADC->CCR |= ADC_CCR_VBATE; - adcRead(); - ADC->CCR &= ADC_CCR_VBATE; - return ADC1->DR * 330 / 2048; + if (isVBatBridgeEnabled()) { + rtcBatteryVoltage = ADC1->DR; + } } #if !defined(SIMU) diff --git a/radio/src/targets/horus/backlight_driver.cpp b/radio/src/targets/horus/backlight_driver.cpp index 05026acf1..e141cf5dd 100644 --- a/radio/src/targets/horus/backlight_driver.cpp +++ b/radio/src/targets/horus/backlight_driver.cpp @@ -33,26 +33,23 @@ void backlightInit() GPIO_PinAFConfig(BACKLIGHT_GPIO, BACKLIGHT_GPIO_PinSource, BACKLIGHT_GPIO_AF); // TIMER init -#if defined(PCBX12S) - if (IS_HORUS_PROD()) { - BACKLIGHT_TIMER->ARR = 100; - BACKLIGHT_TIMER->PSC = BACKLIGHT_TIMER_FREQ / 10000 - 1; // 1kHz - BACKLIGHT_TIMER->CCMR2 = TIM_CCMR2_OC4M_1 | TIM_CCMR2_OC4M_2; // PWM - BACKLIGHT_TIMER->CCER = TIM_CCER_CC4E; - BACKLIGHT_TIMER->CCR4 = 0; - BACKLIGHT_TIMER->EGR = 0; - BACKLIGHT_TIMER->CR1 = TIM_CR1_CEN; // Counter enable - } - else { - BACKLIGHT_TIMER->ARR = 100; - BACKLIGHT_TIMER->PSC = BACKLIGHT_TIMER_FREQ / 10000 - 1; // 1kHz - BACKLIGHT_TIMER->CCMR1 = TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2; // PWM - BACKLIGHT_TIMER->CCER = TIM_CCER_CC1E | TIM_CCER_CC1NE; - BACKLIGHT_TIMER->CCR1 = 100; - BACKLIGHT_TIMER->EGR = 1; - BACKLIGHT_TIMER->CR1 |= TIM_CR1_CEN; // Counter enable - BACKLIGHT_TIMER->BDTR |= TIM_BDTR_MOE; - } +#if defined(PCBX12S) && PCBREV >= 13 + BACKLIGHT_TIMER->ARR = 100; + BACKLIGHT_TIMER->PSC = BACKLIGHT_TIMER_FREQ / 10000 - 1; // 1kHz + BACKLIGHT_TIMER->CCMR2 = TIM_CCMR2_OC4M_1 | TIM_CCMR2_OC4M_2; // PWM + BACKLIGHT_TIMER->CCER = TIM_CCER_CC4E; + BACKLIGHT_TIMER->CCR4 = 0; + BACKLIGHT_TIMER->EGR = 0; + BACKLIGHT_TIMER->CR1 = TIM_CR1_CEN; // Counter enable +#elif defined(PCBX12S) + BACKLIGHT_TIMER->ARR = 100; + BACKLIGHT_TIMER->PSC = BACKLIGHT_TIMER_FREQ / 10000 - 1; // 1kHz + BACKLIGHT_TIMER->CCMR1 = TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2; // PWM + BACKLIGHT_TIMER->CCER = TIM_CCER_CC1E | TIM_CCER_CC1NE; + BACKLIGHT_TIMER->CCR1 = 100; + BACKLIGHT_TIMER->EGR = 1; + BACKLIGHT_TIMER->CR1 |= TIM_CR1_CEN; // Counter enable + BACKLIGHT_TIMER->BDTR |= TIM_BDTR_MOE; #elif defined(PCBX10) BACKLIGHT_TIMER->ARR = 100; BACKLIGHT_TIMER->PSC = BACKLIGHT_TIMER_FREQ / 1000000 - 1; // 10kHz (same as FrOS) @@ -67,13 +64,10 @@ void backlightInit() void backlightEnable(uint8_t dutyCycle) { -#if defined(PCBX12S) - if (IS_HORUS_PROD()) { - BACKLIGHT_TIMER->CCR4 = dutyCycle; - } - else { - BACKLIGHT_TIMER->CCR1 = BACKLIGHT_LEVEL_MAX - dutyCycle; - } +#if defined(PCBX12S) && PCBREV >= 13 + BACKLIGHT_TIMER->CCR4 = dutyCycle; +#elif defined(PCBX12S) + BACKLIGHT_TIMER->CCR1 = BACKLIGHT_LEVEL_MAX - dutyCycle; #elif defined(PCBX10) BACKLIGHT_TIMER->CCR3 = BACKLIGHT_LEVEL_MAX - dutyCycle; #endif diff --git a/radio/src/targets/horus/board.cpp b/radio/src/targets/horus/board.cpp index c30c9b8ff..56b37ac40 100644 --- a/radio/src/targets/horus/board.cpp +++ b/radio/src/targets/horus/board.cpp @@ -20,15 +20,19 @@ #include "opentx.h" -#if defined(__cplusplus) && !defined(SIMU) +#if defined(__cplusplus) extern "C" { #endif #include "usb_dcd_int.h" #include "usb_bsp.h" -#if defined(__cplusplus) && !defined(SIMU) +#if defined(__cplusplus) } #endif +uint32_t shutdownRequest; // Stores intentional shutdown to avoid reboot loop +uint32_t shutdownReason; // Used for detecting unexpected reboots regardless of reason +uint32_t powerupReason __NOINIT; // Stores power up reason beyond initialization for emergency mode activation + HardwareOptions hardwareOptions; void watchdogInit(unsigned int duration) @@ -41,60 +45,6 @@ void watchdogInit(unsigned int duration) IWDG->KR = 0xCCCC; // start } -// Start TIMER7 at 2000000Hz -void init2MhzTimer() -{ - TIMER_2MHz_TIMER->PSC = (PERI1_FREQUENCY * TIMER_MULT_APB1) / 2000000 - 1; // 0.5 uS, 2 MHz - TIMER_2MHz_TIMER->ARR = 65535; - TIMER_2MHz_TIMER->CR2 = 0; - TIMER_2MHz_TIMER->CR1 = TIM_CR1_CEN; -} - -// Starts TIMER at 1000Hz -void init1msTimer() -{ - INTERRUPT_xMS_TIMER->ARR = 999; // 1mS in uS - INTERRUPT_xMS_TIMER->PSC = (PERI1_FREQUENCY * TIMER_MULT_APB1) / 1000000 - 1; // 1uS - INTERRUPT_xMS_TIMER->CCER = 0; - INTERRUPT_xMS_TIMER->CCMR1 = 0; - INTERRUPT_xMS_TIMER->EGR = 0; - INTERRUPT_xMS_TIMER->CR1 = 5; - INTERRUPT_xMS_TIMER->DIER |= 1; - NVIC_EnableIRQ(INTERRUPT_xMS_IRQn); - NVIC_SetPriority(INTERRUPT_xMS_IRQn, 7); -} - -// TODO use the same than board_sky9x.cpp -void interrupt1ms() -{ - static uint8_t pre_scale; // Used to get 10 Hz counter - - ++pre_scale; - -#if defined(HAPTIC) - if (pre_scale == 5 || pre_scale == 10) { - DEBUG_TIMER_START(debugTimerHaptic); - HAPTIC_HEARTBEAT(); - DEBUG_TIMER_STOP(debugTimerHaptic); - } -#endif - - if (pre_scale == 10) { - pre_scale = 0; - DEBUG_TIMER_START(debugTimerPer10ms); - DEBUG_TIMER_SAMPLE(debugTimerPer10msPeriod); - per10ms(); - DEBUG_TIMER_STOP(debugTimerPer10ms); - } -} - -extern "C" void INTERRUPT_xMS_IRQHandler() -{ - INTERRUPT_xMS_TIMER->SR &= ~TIM_SR_UIF; - interrupt1ms(); - DEBUG_INTERRUPT(INT_1MS); -} - #if defined(SEMIHOSTING) extern "C" void initialise_monitor_handles(); #endif @@ -128,7 +78,6 @@ void boardInit() initialise_monitor_handles(); #endif -#if !defined(SIMU) RCC_AHB1PeriphClockCmd(PWR_RCC_AHB1Periph | PCBREV_RCC_AHB1Periph | LED_RCC_AHB1Periph | @@ -150,7 +99,8 @@ void boardInit() SPORT_UPDATE_RCC_AHB1Periph, ENABLE); - RCC_APB1PeriphClockCmd(INTERRUPT_xMS_RCC_APB1Periph | + RCC_APB1PeriphClockCmd(ROTARY_ENCODER_RCC_APB1Periph | + INTERRUPT_xMS_RCC_APB1Periph | ADC_RCC_APB1Periph | TIMER_2MHz_RCC_APB1Periph | AUDIO_RCC_APB1Periph | @@ -175,6 +125,7 @@ void boardInit() ENABLE); pwrInit(); + pwrOn(); delaysInit(); #if defined(DEBUG) @@ -208,7 +159,7 @@ void boardInit() backlightInit(); init2MhzTimer(); - init1msTimer(); + init5msTimer(); usbInit(); hapticInit(); @@ -230,59 +181,39 @@ void boardInit() #endif ledBlue(); - - vbattRTC = getRTCBattVoltage(); -#endif } void boardOff() { - BACKLIGHT_DISABLE(); + backlightEnable(0); while (pwrPressed()) { wdt_reset(); } SysTick->CTRL = 0; // turn off systick + +#if defined(PCBX12S) + // Shutdown the Audio amp + GPIO_InitTypeDef GPIO_InitStructure; + GPIO_InitStructure.GPIO_Pin = AUDIO_SHUTDOWN_GPIO_PIN; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; + GPIO_Init(AUDIO_SHUTDOWN_GPIO, &GPIO_InitStructure); + GPIO_ResetBits(AUDIO_SHUTDOWN_GPIO, AUDIO_SHUTDOWN_GPIO_PIN); +#endif + + // Shutdown the Haptic + hapticDone(); + + shutdownRequest = SHUTDOWN_REQUEST; + shutdownReason = NORMAL_POWER_OFF; + pwrOff(); } -uint8_t currentTrainerMode = 0xff; - -void checkTrainerSettings() -{ - uint8_t requiredTrainerMode = g_model.trainerData.mode; - if (requiredTrainerMode != currentTrainerMode) { - switch (currentTrainerMode) { - case TRAINER_MODE_MASTER_TRAINER_JACK: - stop_trainer_capture(); - break; - case TRAINER_MODE_SLAVE: - stop_trainer_ppm(); - break; - case TRAINER_MODE_MASTER_BATTERY_COMPARTMENT: - auxSerialStop(); - } - - currentTrainerMode = requiredTrainerMode; - switch (requiredTrainerMode) { - case TRAINER_MODE_SLAVE: - init_trainer_ppm(); - break; - case TRAINER_MODE_MASTER_BATTERY_COMPARTMENT: - if (g_eeGeneral.auxSerialMode == UART_MODE_SBUS_TRAINER) { - auxSerialSbusInit(); - break; - } - // no break - default: - // master is default - init_trainer_capture(); - break; - } - } -} - uint16_t getBatteryVoltage() { int32_t instant_vbat = anaIn(TX_VOLTAGE); // using filtered ADC value on purpose diff --git a/radio/src/targets/horus/board.h b/radio/src/targets/horus/board.h index ea4d2604e..62b5b7004 100644 --- a/radio/src/targets/horus/board.h +++ b/radio/src/targets/horus/board.h @@ -18,69 +18,27 @@ * GNU General Public License for more details. */ -#ifndef _BOARD_HORUS_H_ -#define _BOARD_HORUS_H_ +#ifndef _BOARD_H_ +#define _BOARD_H_ #include "../definitions.h" -#include "cpu_id.h" - -#if defined(__cplusplus) && !defined(SIMU) -extern "C" { -#endif - -#if __clang__ -// clang is very picky about the use of "register" -// Tell clang to ignore the warnings for the following files -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-register" -#endif - -#include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h" -#include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_rcc.h" -#include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_syscfg.h" -#include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_gpio.h" -#include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_exti.h" -#include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_spi.h" -#include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_i2c.h" -#include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_rtc.h" -#include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_pwr.h" -#include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_dma.h" -#include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_usart.h" -#include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_flash.h" -#include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_sdio.h" -#include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_dbgmcu.h" -#include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_ltdc.h" -#include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_fmc.h" -#include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_tim.h" -#include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_dma2d.h" - -#if defined(PCBX10) -#include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_adc.h" -#endif - -#include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/misc.h" - -#if __clang__ -// Restore warnings about registers -#pragma clang diagnostic pop -#endif - -#include "usb_driver.h" - -#if !defined(SIMU) -#include "usbd_cdc_core.h" -#include "usbd_msc_core.h" -#include "usbd_hid_core.h" -#include "usbd_usr.h" -#include "usbd_desc.h" -#include "usb_conf.h" -#include "usbd_conf.h" -#endif - +#include "../opentx_constants.h" +#include "board_common.h" #include "hal.h" -#if defined(__cplusplus) && !defined(SIMU) -} +PACK(typedef struct { + uint8_t pcbrev : 2; + uint8_t sticksPwmDisabled : 1; + uint8_t pxx2Enabled : 1; +}) HardwareOptions; + +extern HardwareOptions hardwareOptions; + +#if !defined(LUA_EXPORT_GENERATION) +#include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_sdio.h" +#include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_dma2d.h" +#include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_ltdc.h" +#include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_fmc.h" #endif #define FLASHSIZE 0x200000 @@ -108,30 +66,38 @@ extern uint16_t sessionTimer; #endif // Board driver -void boardPreInit(void); -void boardInit(void); -void boardOff(void); +void boardInit(); +void boardOff(); -// Delays driver -#ifdef __cplusplus -extern "C" { -#endif -void delaysInit(void); -void delay_01us(uint16_t nb); -void delay_us(uint16_t nb); -void delay_ms(uint32_t ms); -#ifdef __cplusplus -} -#endif +// Timers driver +void init2MhzTimer(); +void init5msTimer(); // PCBREV driver -#define IS_HORUS_PROD() GPIO_ReadInputDataBit(PCBREV_GPIO, PCBREV_GPIO_PIN) -#if defined(SIMU) || defined(PCBX10) +enum { + // X12S + PCBREV_X12S_LT13 = 0, + PCBREV_X12S_GTE13 = 1, + + // X10 + PCBREV_X10_STD = 0, + PCBREV_X10_EXPRESS = 3, +}; + +#if defined(SIMU) #define IS_FIRMWARE_COMPATIBLE_WITH_BOARD() true -#elif PCBREV >= 13 - #define IS_FIRMWARE_COMPATIBLE_WITH_BOARD() IS_HORUS_PROD() +#elif defined(PCBX10) + #if defined(PCBREV_EXPRESS) + #define IS_FIRMWARE_COMPATIBLE_WITH_BOARD() (hardwareOptions.pcbrev == PCBREV_X10_EXPRESS) + #else + #define IS_FIRMWARE_COMPATIBLE_WITH_BOARD() (hardwareOptions.pcbrev == PCBREV_X10_STD) + #endif #else - #define IS_FIRMWARE_COMPATIBLE_WITH_BOARD() (!IS_HORUS_PROD()) + #if PCBREV >= 13 + #define IS_FIRMWARE_COMPATIBLE_WITH_BOARD() (hardwareOptions.pcbrev == PCBREV_X12S_GTE13) + #else + #define IS_FIRMWARE_COMPATIBLE_WITH_BOARD() (hardwareOptions.pcbrev == PCBREV_X12S_LT13) + #endif #endif // SD driver @@ -147,7 +113,7 @@ void sdInit(void); void sdMount(void); void sdDone(void); #define sdPoll10ms() -uint32_t sdMounted(void); +uint32_t sdMounted(); #else #define SD_IS_HC() (0) #define SD_GET_SPEED() (0) @@ -190,7 +156,6 @@ void SDRAM_Init(void); #define EXTERNAL_MODULE_OFF() GPIO_ResetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) #define IS_INTERNAL_MODULE_ON() (GPIO_ReadInputDataBit(INTMODULE_PWR_GPIO, INTMODULE_PWR_GPIO_PIN) == Bit_SET) #define IS_EXTERNAL_MODULE_ON() (GPIO_ReadInputDataBit(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) == Bit_SET) -#define INTERNAL_MODULE_PXX1 #if !defined(PXX2) #define IS_PXX2_INTERNAL_ENABLED() (false) @@ -205,28 +170,18 @@ void SDRAM_Init(void); #define IS_PXX1_INTERNAL_ENABLED() (true) #endif -void init_ppm(uint8_t module); -void disable_ppm(uint8_t module); -void init_pxx1_pulses(uint8_t module); -void init_pxx1_serial(uint8_t module); -void disable_pxx1_pulses(uint8_t module); -void disable_pxx1_serial(uint8_t module); -void init_pxx2(uint8_t module); -void disable_pxx2(uint8_t module); -void disable_serial(uint8_t module); +void init_intmodule_heartbeat(); +void check_intmodule_heartbeat(); -void intmoduleStop(); void intmoduleSerialStart(uint32_t baudrate, uint8_t rxEnable); -void intmodulePxxStart(); +void intmoduleSendByte(uint8_t byte); void intmoduleSendBuffer(const uint8_t * data, uint8_t size); void intmoduleSendNextFrame(); void extmoduleSerialStart(uint32_t baudrate, uint32_t period_half_us, bool inverted); +void extmoduleInvertedSerialStart(uint32_t baudrate); +void extmoduleSendBuffer(const uint8_t * data, uint8_t size); void extmoduleSendNextFrame(); -void extmoduleStop(); -void extmodulePpmStart(); -void extmodulePxxStart(); -void extmodulePxx2Start(); // Trainer driver void init_trainer_ppm(void); @@ -280,8 +235,8 @@ enum EnumSwitches SW_SF, SW_SG, SW_SH, - SW_GMBL, - SW_GMBR, + SW_SI, + SW_SJ, NUM_SWITCHES }; @@ -314,22 +269,18 @@ enum EnumSwitchesPositions SW_SH0, SW_SH1, SW_SH2, - SW_SGMBL0, - SW_SGMBL1, - SW_SGMBL2, - SW_SGMBR0, - SW_SGMBR1, - SW_SGMBR2, - STORAGE_NUM_SWITCHES_POSITIONS + SW_SI0, + SW_SI1, + SW_SI2, + SW_SJ0, + SW_SJ1, + SW_SJ2, + NUM_SWITCHES_POSITIONS }; - -#if defined(__cplusplus) -static_assert(STORAGE_NUM_SWITCHES_POSITIONS == NUM_SWITCHES * 3, "Wrong switches positions count"); -#endif +#define STORAGE_NUM_SWITCHES_POSITIONS (STORAGE_NUM_SWITCHES * 3) void keysInit(void); -uint8_t keyState(uint8_t index); uint32_t switchState(uint8_t index); uint32_t readKeys(void); #define KEYS_PRESSED() (readKeys()) @@ -358,7 +309,6 @@ extern uint32_t powerupReason; #define DIRTY_SHUTDOWN 0xCAFEDEAD #define NORMAL_POWER_OFF ~DIRTY_SHUTDOWN -#define wdt_disable() void watchdogInit(unsigned int duration); #if defined(SIMU) #define WAS_RESET_BY_WATCHDOG() (false) @@ -409,15 +359,15 @@ enum Analogs { POT1 = POT_FIRST, POT2, POT3, +#if defined(PCBX10) + EXT1, + EXT2, +#endif + POT_LAST = POT_FIRST + NUM_POTS - 1, SLIDER_FIRST, - SLIDER1 = SLIDER_FIRST, - SLIDER2, -#if defined(PCBX12S) SLIDER_FRONT_LEFT = SLIDER_FIRST, SLIDER_FRONT_RIGHT, - SLIDER_REAR_LEFT, - SLIDER_REAR_RIGHT, -#else +#if defined(PCBX12S) SLIDER_REAR_LEFT, SLIDER_REAR_RIGHT, #endif @@ -427,15 +377,20 @@ enum Analogs { MOUSE1, // TODO why after voltage? MOUSE2, #endif -#if defined(PCBX10) - EXT1, - EXT2, -#endif - NUM_ANALOGS, - TX_RTC = NUM_ANALOGS + NUM_ANALOGS }; -#define POT_LAST (SLIDER_FIRST - 1) +#define SLIDER1 SLIDER_FRONT_LEFT +#define SLIDER2 SLIDER_FRONT_RIGHT + +#define DEFAULT_SWITCH_CONFIG (SWITCH_TOGGLE << 14) + (SWITCH_3POS << 12) + (SWITCH_2POS << 10) + (SWITCH_3POS << 8) + (SWITCH_3POS << 6) + (SWITCH_3POS << 4) + (SWITCH_3POS << 2) + (SWITCH_3POS << 0) +#define DEFAULT_POTS_CONFIG (POT_WITH_DETENT << 4) + (POT_MULTIPOS_SWITCH << 2) + (POT_WITHOUT_DETENT << 0) + +#if defined(PCBX12S) +#define DEFAULT_SLIDERS_CONFIG (SLIDER_WITH_DETENT << 3) + (SLIDER_WITH_DETENT << 2) + (SLIDER_WITH_DETENT << 1) + (SLIDER_WITH_DETENT << 0) +#else +#define DEFAULT_SLIDERS_CONFIG (SLIDER_WITH_DETENT << 1) + (SLIDER_WITH_DETENT << 0) +#endif enum CalibratedAnalogs { CALIBRATED_STICK1, @@ -451,6 +406,8 @@ enum CalibratedAnalogs { CALIBRATED_SLIDER_REAR_LEFT, CALIBRATED_SLIDER_REAR_RIGHT, #else + CALIBRATED_POT_EXT1, + CALIBRATED_POT_EXT2, CALIBRATED_SLIDER_REAR_LEFT, CALIBRATED_SLIDER_REAR_RIGHT, #endif @@ -461,11 +418,7 @@ enum CalibratedAnalogs { #define IS_POT(x) ((x)>=POT_FIRST && (x)<=POT_LAST) #define IS_SLIDER(x) ((x)>=SLIDER_FIRST && (x)<=SLIDER_LAST) -extern uint16_t adcValues[NUM_ANALOGS + 1/*RTC*/]; -void adcInit(void); -void adcRead(void); -uint16_t getRTCBattVoltage(); -uint16_t getAnalogValue(uint8_t index); +extern uint16_t adcValues[NUM_ANALOGS]; #if defined(PCBX12S) #define NUM_MOUSE_ANALOGS 2 @@ -476,7 +429,7 @@ uint16_t getAnalogValue(uint8_t index); #if NUM_PWMSTICKS > 0 #define STICKS_PWM_ENABLED() (!hardwareOptions.sticksPwmDisabled) -void sticksPwmInit(void); +void sticksPwmInit(); void sticksPwmRead(uint16_t * values); extern volatile uint32_t pwm_interrupt_count; #else @@ -495,7 +448,6 @@ extern volatile uint32_t pwm_interrupt_count; #define BATTERY_MIN 85 // 8.5V #define BATTERY_MAX 115 // 11.5V #endif -uint16_t getBatteryVoltage(); // returns current battery voltage in 10mV steps #if defined(__cplusplus) && !defined(SIMU) extern "C" { @@ -503,13 +455,15 @@ extern "C" { // Power driver #define SOFT_PWR_CTRL -void pwrInit(void); -uint32_t pwrCheck(void); -void pwrOn(void); -void pwrOff(void); -void pwrResetHandler(void); -uint32_t pwrPressed(void); -uint32_t pwrPressedDuration(void); +extern uint32_t shutdownRequest; // Stores intentional shutdown to avoid reboot loop +extern uint32_t shutdownReason; // Used for detecting unexpected reboots regardless of reason +void pwrInit(); +uint32_t pwrCheck(); +void pwrOn(); +void pwrOff(); +void pwrResetHandler(); +bool pwrPressed(); +uint32_t pwrPressedDuration(); #if defined(SIMU) || defined(NO_UNEXPECTED_SHUTDOWN) #define UNEXPECTED_SHUTDOWN() (false) #else @@ -517,10 +471,10 @@ uint32_t pwrPressedDuration(void); #endif // Led driver -void ledInit(void); -void ledOff(void); -void ledRed(void); -void ledBlue(void); +void ledInit(); +void ledOff(); +void ledRed(); +void ledBlue(); #if defined(PCBX10) void ledGreen(); #endif @@ -529,14 +483,15 @@ void ledBlue(void); #define LCD_W 480 #define LCD_H 272 #define LCD_DEPTH 16 -void lcdInit(void); -void lcdRefresh(void); +void lcdInit(); +void lcdRefresh(); +void lcdCopy(void * dest, void * src); void DMAFillRect(uint16_t * dest, uint16_t destw, uint16_t desth, uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t color); void DMACopyBitmap(uint16_t * dest, uint16_t destw, uint16_t desth, uint16_t x, uint16_t y, const uint16_t * src, uint16_t srcw, uint16_t srch, uint16_t srcx, uint16_t srcy, uint16_t w, uint16_t h); void DMACopyAlphaBitmap(uint16_t * dest, uint16_t destw, uint16_t desth, uint16_t x, uint16_t y, const uint16_t * src, uint16_t srcw, uint16_t srch, uint16_t srcx, uint16_t srcy, uint16_t w, uint16_t h); void DMABitmapConvert(uint16_t * dest, const uint8_t * src, uint16_t w, uint16_t h, uint32_t format); -void lcdStoreBackupBuffer(void); -int lcdRestoreBackupBuffer(void); +void lcdStoreBackupBuffer(); +int lcdRestoreBackupBuffer(); void lcdSetContrast(); #define lcdOff() backlightEnable(0) /* just disable the backlight */ #define lcdSetRefVolt(...) @@ -618,7 +573,6 @@ void sportUpdatePowerOff(void); void hapticInit(void); void hapticDone(void); void hapticOff(void); -#define HAPTIC_OFF() hapticOff() void hapticOn(uint32_t pwmPercent); // GPS driver @@ -628,8 +582,12 @@ uint8_t gpsGetByte(uint8_t * byte); extern uint8_t gpsTraceEnabled; #endif void gpsSendByte(uint8_t byte); +#if defined(PCBX12S) +#define PILOTPOS_MIN_HDOP 500 +#endif // Second serial port driver +#if defined(PCBX12S) #define AUX_SERIAL #define DEBUG_BAUDRATE 115200 extern uint8_t auxSerialMode; @@ -638,6 +596,7 @@ void auxSerialPutc(char c); #define auxSerialTelemetryInit(protocol) auxSerialInit(UART_MODE_TELEMETRY, protocol) void auxSerialSbusInit(void); void auxSerialStop(void); +#endif #define USART_FLAG_ERRORS (USART_FLAG_ORE | USART_FLAG_NE | USART_FLAG_FE | USART_FLAG_PE) // BT driver @@ -651,9 +610,6 @@ void bluetoothWriteWakeup(void); uint8_t bluetoothIsWriting(void); void bluetoothDisable(void); -extern uint8_t currentTrainerMode; -void checkTrainerSettings(void); - #if defined(__cplusplus) #include "fifo.h" #include "dmafifo.h" @@ -661,17 +617,4 @@ extern DMAFifo<512> telemetryFifo; extern DMAFifo<32> auxSerialRxFifo; #endif -#if NUM_PWMSTICKS > 0 -PACK(typedef struct { - uint8_t sticksPwmDisabled : 1; - uint8_t pxx2Enabled : 1; -}) HardwareOptions; -#else -PACK(typedef struct { - uint8_t pxx2Enabled : 1; -}) HardwareOptions; -#endif - -extern HardwareOptions hardwareOptions; - -#endif // _BOARD_HORUS_H_ +#endif // _BOARD_H_ diff --git a/radio/src/targets/horus/extmodule_driver.cpp b/radio/src/targets/horus/extmodule_driver.cpp index 32490c7c1..99c5f811f 100644 --- a/radio/src/targets/horus/extmodule_driver.cpp +++ b/radio/src/targets/horus/extmodule_driver.cpp @@ -24,19 +24,27 @@ void extmoduleStop() { EXTERNAL_MODULE_OFF(); - NVIC_DisableIRQ(EXTMODULE_DMA_IRQn); - NVIC_DisableIRQ(EXTMODULE_TIMER_IRQn); + NVIC_DisableIRQ(EXTMODULE_TIMER_DMA_STREAM_IRQn); + NVIC_DisableIRQ(EXTMODULE_TIMER_CC_IRQn); - EXTMODULE_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA + EXTMODULE_TIMER_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA EXTMODULE_TIMER->DIER &= ~(TIM_DIER_CC2IE | TIM_DIER_UDE); EXTMODULE_TIMER->CR1 &= ~TIM_CR1_CEN; + + GPIO_InitTypeDef GPIO_InitStructure; + GPIO_InitStructure.GPIO_Pin = EXTMODULE_TX_GPIO_PIN; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_Init(EXTMODULE_TX_GPIO, &GPIO_InitStructure); } void extmodulePpmStart() { EXTERNAL_MODULE_ON(); - GPIO_PinAFConfig(EXTMODULE_TX_GPIO, EXTMODULE_TX_GPIO_PinSource, EXTMODULE_TX_GPIO_AF); + GPIO_PinAFConfig(EXTMODULE_TX_GPIO, EXTMODULE_TX_GPIO_PinSource, EXTMODULE_TIMER_TX_GPIO_AF); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = EXTMODULE_TX_GPIO_PIN; @@ -60,34 +68,40 @@ void extmodulePpmStart() EXTMODULE_TIMER->CR1 &= ~TIM_CR1_CEN; // Stop timer EXTMODULE_TIMER->PSC = EXTMODULE_TIMER_FREQ / 2000000 - 1; // 0.5uS (2Mhz) - EXTMODULE_TIMER->ARR = 45000; + #if defined(PCBX10) || PCBREV >= 13 - EXTMODULE_TIMER->CCMR2 = TIM_CCMR2_OC3M_1 | TIM_CCMR2_OC3M_2; // PWM mode 1 + EXTMODULE_TIMER->CCR3 = GET_MODULE_PPM_DELAY(EXTERNAL_MODULE)*2; + EXTMODULE_TIMER->CCER = TIM_CCER_CC3E | (GET_MODULE_PPM_POLARITY(EXTERNAL_MODULE) ? TIM_CCER_CC3P : 0); + EXTMODULE_TIMER->CCMR2 = TIM_CCMR2_OC3M_1 | TIM_CCMR2_OC3M_0; // Force O/P high EXTMODULE_TIMER->BDTR = TIM_BDTR_MOE; EXTMODULE_TIMER->EGR = 1; // Reloads register values now - EXTMODULE_TIMER->DIER = TIM_DIER_UDE; // Update DMA request - EXTMODULE_TIMER->CR1 = TIM_CR1_CEN; // Start timer + EXTMODULE_TIMER->CCMR2 = TIM_CCMR2_OC3M_1 | TIM_CCMR2_OC3M_2; // PWM mode 1 #else EXTMODULE_TIMER->CCR1 = GET_MODULE_PPM_DELAY(EXTERNAL_MODULE)*2; EXTMODULE_TIMER->CCER = TIM_CCER_CC1E | (GET_MODULE_PPM_POLARITY(EXTERNAL_MODULE) ? TIM_CCER_CC1P : 0); EXTMODULE_TIMER->CCMR1 = TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_0; // Force O/P high EXTMODULE_TIMER->EGR = 1; // Reloads register values now - EXTMODULE_TIMER->DIER |= TIM_DIER_UDE; // Update DMA request EXTMODULE_TIMER->CCMR1 = TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC2PE; // PWM mode 1 - EXTMODULE_TIMER->CR1 |= TIM_CR1_CEN; // Start timer #endif - NVIC_EnableIRQ(EXTMODULE_DMA_IRQn); - NVIC_SetPriority(EXTMODULE_DMA_IRQn, 7); - NVIC_EnableIRQ(EXTMODULE_TIMER_IRQn); - NVIC_SetPriority(EXTMODULE_TIMER_IRQn, 7); + EXTMODULE_TIMER->ARR = 45000; + EXTMODULE_TIMER->CCR2 = 40000; // The first frame will be sent in 20ms + EXTMODULE_TIMER->SR &= ~TIM_SR_CC2IF; // Clear flag + EXTMODULE_TIMER->DIER |= TIM_DIER_UDE | TIM_DIER_CC2IE; // Enable this interrupt + EXTMODULE_TIMER->CR1 = TIM_CR1_CEN; // Start timer + + NVIC_EnableIRQ(EXTMODULE_TIMER_DMA_STREAM_IRQn); + NVIC_SetPriority(EXTMODULE_TIMER_DMA_STREAM_IRQn, 7); + NVIC_EnableIRQ(EXTMODULE_TIMER_CC_IRQn); + NVIC_SetPriority(EXTMODULE_TIMER_CC_IRQn, 7); } -void extmodulePxxStart() +#if defined(PXX1) +void extmodulePxx1PulsesStart() { EXTERNAL_MODULE_ON(); - GPIO_PinAFConfig(EXTMODULE_TX_GPIO, EXTMODULE_TX_GPIO_PinSource, EXTMODULE_TX_GPIO_AF); + GPIO_PinAFConfig(EXTMODULE_TX_GPIO, EXTMODULE_TX_GPIO_PinSource, EXTMODULE_TIMER_TX_GPIO_AF); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = EXTMODULE_TX_GPIO_PIN; @@ -99,45 +113,41 @@ void extmodulePxxStart() EXTMODULE_TIMER->CR1 &= ~TIM_CR1_CEN; EXTMODULE_TIMER->PSC = EXTMODULE_TIMER_FREQ / 2000000 - 1; // 0.5uS (2Mhz) - EXTMODULE_TIMER->ARR = 18000; - + #if defined(PCBX10) || PCBREV >= 13 - EXTMODULE_TIMER->CCER = TIM_CCER_CC3E | TIM_CCER_CC3NE; - EXTMODULE_TIMER->BDTR = TIM_BDTR_MOE; // Enable outputs EXTMODULE_TIMER->CCR3 = 18; + EXTMODULE_TIMER->CCER = TIM_CCER_CC3E | TIM_CCER_CC3NE; EXTMODULE_TIMER->CCMR2 = TIM_CCMR2_OC3M_2 | TIM_CCMR2_OC3M_0; // Force O/P high - EXTMODULE_TIMER->EGR = 1; // Restart - EXTMODULE_TIMER->DIER |= TIM_DIER_UDE; // Enable DMA on update - EXTMODULE_TIMER->CCMR2 = TIM_CCMR2_OC3M_1 | TIM_CCMR2_OC3M_2; - EXTMODULE_TIMER->CR1 |= TIM_CR1_CEN; -#else - EXTMODULE_TIMER->CCER = TIM_CCER_CC1E | TIM_CCER_CC1P | TIM_CCER_CC1NE | TIM_CCER_CC1NP; // TIM_CCER_CC1E | TIM_CCER_CC1P; EXTMODULE_TIMER->BDTR = TIM_BDTR_MOE; // Enable outputs - EXTMODULE_TIMER->CCR1 = 18; - EXTMODULE_TIMER->CCMR1 = TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_0; // Force O/P high EXTMODULE_TIMER->EGR = 1; // Restart - EXTMODULE_TIMER->DIER |= TIM_DIER_UDE; // Enable DMA on update + EXTMODULE_TIMER->CCMR2 = TIM_CCMR2_OC3M_1 | TIM_CCMR2_OC3M_2; +#else + EXTMODULE_TIMER->CCR1 = 18; + EXTMODULE_TIMER->CCER = TIM_CCER_CC1E | TIM_CCER_CC1P | TIM_CCER_CC1NE | TIM_CCER_CC1NP; // TIM_CCER_CC1E | TIM_CCER_CC1P; + EXTMODULE_TIMER->CCMR1 = TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_0; // Force O/P high + EXTMODULE_TIMER->BDTR = TIM_BDTR_MOE; // Enable outputs + EXTMODULE_TIMER->EGR = 1; // Restart EXTMODULE_TIMER->CCMR1 = TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2; - EXTMODULE_TIMER->CR1 |= TIM_CR1_CEN; #endif - NVIC_EnableIRQ(EXTMODULE_DMA_IRQn); - NVIC_SetPriority(EXTMODULE_DMA_IRQn, 7); - NVIC_EnableIRQ(EXTMODULE_TIMER_IRQn); - NVIC_SetPriority(EXTMODULE_TIMER_IRQn, 7); -} + EXTMODULE_TIMER->ARR = 45000; + EXTMODULE_TIMER->CCR2 = 40000; // The first frame will be sent in 20ms + EXTMODULE_TIMER->SR &= ~TIM_SR_CC2IF; // Clear flag + EXTMODULE_TIMER->DIER |= TIM_DIER_UDE | TIM_DIER_CC2IE; // Enable DMA on update + EXTMODULE_TIMER->CR1 |= TIM_CR1_CEN; -void extmodulePxx2Start() -{ - // TODO just enable the S.PORT line (or let telemetry init do it) + NVIC_EnableIRQ(EXTMODULE_TIMER_DMA_STREAM_IRQn); + NVIC_SetPriority(EXTMODULE_TIMER_DMA_STREAM_IRQn, 7); + NVIC_EnableIRQ(EXTMODULE_TIMER_CC_IRQn); + NVIC_SetPriority(EXTMODULE_TIMER_CC_IRQn, 7); } +#endif -#if defined(DSM2) void extmoduleSerialStart(uint32_t /*baudrate*/, uint32_t period_half_us, bool inverted) { EXTERNAL_MODULE_ON(); - GPIO_PinAFConfig(EXTMODULE_TX_GPIO, EXTMODULE_TX_GPIO_PinSource, EXTMODULE_TX_GPIO_AF); + GPIO_PinAFConfig(EXTMODULE_TX_GPIO, EXTMODULE_TX_GPIO_PinSource, EXTMODULE_TIMER_TX_GPIO_AF); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = EXTMODULE_TX_GPIO_PIN; @@ -149,41 +159,78 @@ void extmoduleSerialStart(uint32_t /*baudrate*/, uint32_t period_half_us, bool i EXTMODULE_TIMER->CR1 &= ~TIM_CR1_CEN; EXTMODULE_TIMER->PSC = EXTMODULE_TIMER_FREQ / 2000000 - 1; // 0.5uS (2Mhz) - EXTMODULE_TIMER->ARR = period_half_us; - + #if defined(PCBX10) || PCBREV >= 13 EXTMODULE_TIMER->CCER = TIM_CCER_CC3E | TIM_CCER_CC3P; EXTMODULE_TIMER->BDTR = TIM_BDTR_MOE; // Enable outputs EXTMODULE_TIMER->CCR3 = 0; EXTMODULE_TIMER->CCMR2 = TIM_CCMR2_OC3M_2 | TIM_CCMR2_OC3M_0; // Force O/P high EXTMODULE_TIMER->EGR = 1; // Restart - EXTMODULE_TIMER->DIER |= TIM_DIER_UDE; // Enable DMA on update EXTMODULE_TIMER->CCMR2 = TIM_CCMR2_OC3M_1 | TIM_CCMR2_OC3M_0; - EXTMODULE_TIMER->CR1 |= TIM_CR1_CEN; #else EXTMODULE_TIMER->CCER = TIM_CCER_CC1E | TIM_CCER_CC1P; EXTMODULE_TIMER->BDTR = TIM_BDTR_MOE; // Enable outputs EXTMODULE_TIMER->CCR1 = 0; EXTMODULE_TIMER->CCMR1 = TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_0; // Force O/P high EXTMODULE_TIMER->EGR = 1; // Restart - EXTMODULE_TIMER->DIER |= TIM_DIER_UDE; // Enable DMA on update EXTMODULE_TIMER->CCMR1 = TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_0; - EXTMODULE_TIMER->CR1 |= TIM_CR1_CEN; #endif - NVIC_EnableIRQ(EXTMODULE_DMA_IRQn); - NVIC_SetPriority(EXTMODULE_DMA_IRQn, 7); - NVIC_EnableIRQ(EXTMODULE_TIMER_IRQn); - NVIC_SetPriority(EXTMODULE_TIMER_IRQn, 7); + EXTMODULE_TIMER->ARR = 45000; + EXTMODULE_TIMER->CCR2 = 40000; // The first frame will be sent in 20ms + EXTMODULE_TIMER->SR &= ~TIM_SR_CC2IF; // Clear flag + EXTMODULE_TIMER->DIER |= TIM_DIER_UDE | TIM_DIER_CC2IE; + EXTMODULE_TIMER->CR1 |= TIM_CR1_CEN; + + NVIC_EnableIRQ(EXTMODULE_TIMER_DMA_STREAM_IRQn); + NVIC_SetPriority(EXTMODULE_TIMER_DMA_STREAM_IRQn, 7); + NVIC_EnableIRQ(EXTMODULE_TIMER_CC_IRQn); + NVIC_SetPriority(EXTMODULE_TIMER_CC_IRQn, 7); } -#endif #if defined(EXTMODULE_USART) +ModuleFifo extmoduleFifo; + +void extmoduleInvertedSerialStart(uint32_t baudrate) +{ + EXTERNAL_MODULE_ON(); + + // TX + RX Pins + GPIO_PinAFConfig(EXTMODULE_USART_GPIO, EXTMODULE_TX_GPIO_PinSource, EXTMODULE_USART_GPIO_AF); + GPIO_PinAFConfig(EXTMODULE_USART_GPIO, EXTMODULE_RX_GPIO_PinSource, EXTMODULE_USART_GPIO_AF); + + GPIO_InitTypeDef GPIO_InitStructure; + GPIO_InitStructure.GPIO_Pin = EXTMODULE_TX_GPIO_PIN | EXTMODULE_RX_GPIO_PIN; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; + GPIO_Init(EXTMODULE_USART_GPIO, &GPIO_InitStructure); + + // UART config + USART_DeInit(EXTMODULE_USART); + USART_InitTypeDef USART_InitStructure; + USART_InitStructure.USART_BaudRate = baudrate; + USART_InitStructure.USART_Parity = USART_Parity_No; + USART_InitStructure.USART_StopBits = USART_StopBits_1; + USART_InitStructure.USART_WordLength = USART_WordLength_8b; + USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; + USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; + USART_Init(EXTMODULE_USART, &USART_InitStructure); + USART_Cmd(EXTMODULE_USART, ENABLE); + + extmoduleFifo.clear(); + + USART_ITConfig(EXTMODULE_USART, USART_IT_RXNE, ENABLE); + NVIC_SetPriority(EXTMODULE_USART_IRQn, 6); + NVIC_EnableIRQ(EXTMODULE_USART_IRQn); +} + void extmoduleSendBuffer(const uint8_t * data, uint8_t size) { DMA_InitTypeDef DMA_InitStructure; - DMA_DeInit(EXTMODULE_DMA_STREAM); - DMA_InitStructure.DMA_Channel = EXTMODULE_DMA_CHANNEL; + DMA_DeInit(EXTMODULE_USART_TX_DMA_STREAM); + DMA_InitStructure.DMA_Channel = EXTMODULE_USART_TX_DMA_CHANNEL; DMA_InitStructure.DMA_PeripheralBaseAddr = CONVERT_PTR_UINT(&EXTMODULE_USART->DR); DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; DMA_InitStructure.DMA_Memory0BaseAddr = CONVERT_PTR_UINT(data); @@ -198,83 +245,117 @@ void extmoduleSendBuffer(const uint8_t * data, uint8_t size) DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full; DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; - DMA_Init(EXTMODULE_DMA_STREAM, &DMA_InitStructure); - DMA_Cmd(EXTMODULE_DMA_STREAM, ENABLE); + DMA_Init(EXTMODULE_USART_TX_DMA_STREAM, &DMA_InitStructure); + DMA_Cmd(EXTMODULE_USART_TX_DMA_STREAM, ENABLE); USART_DMACmd(EXTMODULE_USART, USART_DMAReq_Tx, ENABLE); } + +#define USART_FLAG_ERRORS (USART_FLAG_ORE | USART_FLAG_NE | USART_FLAG_FE | USART_FLAG_PE) +extern "C" void EXTMODULE_USART_IRQHandler(void) +{ + uint32_t status = EXTMODULE_USART->SR; + + while (status & (USART_FLAG_RXNE | USART_FLAG_ERRORS)) { + uint8_t data = EXTMODULE_USART->DR; + if (status & USART_FLAG_ERRORS) { + extmoduleFifo.errors++; + } + else { + extmoduleFifo.push(data); + } + status = EXTMODULE_USART->SR; + } +} #endif void extmoduleSendNextFrame() { - if (moduleState[EXTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PPM) { + switch (moduleState[EXTERNAL_MODULE].protocol) { + case PROTOCOL_CHANNELS_PPM: #if defined(PCBX10) || PCBREV >= 13 - EXTMODULE_TIMER->CCR3 = GET_MODULE_PPM_DELAY(EXTERNAL_MODULE)*2; - EXTMODULE_TIMER->CCER = TIM_CCER_CC3E | (GET_MODULE_PPM_POLARITY(EXTERNAL_MODULE) ? TIM_CCER_CC3P : 0); - EXTMODULE_TIMER->CCR2 = *(extmodulePulsesData.ppm.ptr - 1) - 4000; // 2mS in advance - EXTMODULE_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA - EXTMODULE_DMA_STREAM->CR |= EXTMODULE_DMA_CHANNEL | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | DMA_SxCR_PSIZE_0 | DMA_SxCR_MSIZE_0 | DMA_SxCR_PL_0 | DMA_SxCR_PL_1; + EXTMODULE_TIMER->CCR3 = GET_MODULE_PPM_DELAY(EXTERNAL_MODULE)*2; + EXTMODULE_TIMER->CCER = TIM_CCER_CC3E | (GET_MODULE_PPM_POLARITY(EXTERNAL_MODULE) ? TIM_CCER_CC3P : 0); + EXTMODULE_TIMER->CCR2 = *(extmodulePulsesData.ppm.ptr - 1) - 4000; // 2mS in advance + EXTMODULE_TIMER_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA + EXTMODULE_TIMER_DMA_STREAM->CR |= EXTMODULE_TIMER_DMA_CHANNEL | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | EXTMODULE_TIMER_DMA_SIZE | DMA_SxCR_PL_0 | DMA_SxCR_PL_1; #else - EXTMODULE_TIMER->CCR1 = GET_MODULE_PPM_DELAY(EXTERNAL_MODULE)*2; - EXTMODULE_TIMER->CCER = TIM_CCER_CC1E | (GET_MODULE_PPM_POLARITY(EXTERNAL_MODULE) ? TIM_CCER_CC1P : 0); - EXTMODULE_TIMER->CCR2 = *(extmodulePulsesData.ppm.ptr - 1) - 4000; // 2mS in advance - EXTMODULE_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA - EXTMODULE_DMA_STREAM->CR |= EXTMODULE_DMA_CHANNEL | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | DMA_SxCR_PSIZE_1 | DMA_SxCR_MSIZE_1 | DMA_SxCR_PL_0 | DMA_SxCR_PL_1; + EXTMODULE_TIMER->CCR1 = GET_MODULE_PPM_DELAY(EXTERNAL_MODULE)*2; + EXTMODULE_TIMER->CCER = TIM_CCER_CC1E | (GET_MODULE_PPM_POLARITY(EXTERNAL_MODULE) ? TIM_CCER_CC1P : 0); + EXTMODULE_TIMER->CCR2 = *(extmodulePulsesData.ppm.ptr - 1) - 4000; // 2mS in advance + EXTMODULE_TIMER_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA + EXTMODULE_TIMER_DMA_STREAM->CR |= EXTMODULE_TIMER_DMA_CHANNEL | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | EXTMODULE_TIMER_DMA_SIZE | DMA_SxCR_PL_0 | DMA_SxCR_PL_1; #endif - EXTMODULE_DMA_STREAM->PAR = CONVERT_PTR_UINT(&EXTMODULE_TIMER->ARR); - EXTMODULE_DMA_STREAM->M0AR = CONVERT_PTR_UINT(extmodulePulsesData.ppm.pulses); - EXTMODULE_DMA_STREAM->NDTR = extmodulePulsesData.ppm.ptr - extmodulePulsesData.ppm.pulses; - EXTMODULE_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA - } + EXTMODULE_TIMER_DMA_STREAM->PAR = CONVERT_PTR_UINT(&EXTMODULE_TIMER->ARR); + EXTMODULE_TIMER_DMA_STREAM->M0AR = CONVERT_PTR_UINT(extmodulePulsesData.ppm.pulses); + EXTMODULE_TIMER_DMA_STREAM->NDTR = extmodulePulsesData.ppm.ptr - extmodulePulsesData.ppm.pulses; + EXTMODULE_TIMER_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA + break; + #if defined(PXX1) - else if (moduleState[EXTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PXX1_PULSES) { - EXTMODULE_TIMER->CCR2 = extmodulePulsesData.pxx.getLast() - 4000; // 2mS in advance - EXTMODULE_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA -#if defined(PCBX10) || PCBREV >= 13 - EXTMODULE_DMA_STREAM->CR |= EXTMODULE_DMA_CHANNEL | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | DMA_SxCR_PSIZE_0 | DMA_SxCR_MSIZE_0 | DMA_SxCR_PL_0 | DMA_SxCR_PL_1; -#else - EXTMODULE_DMA_STREAM->CR |= EXTMODULE_DMA_CHANNEL | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | DMA_SxCR_PSIZE_1 | DMA_SxCR_MSIZE_1 | DMA_SxCR_PL_0 | DMA_SxCR_PL_1; + case PROTOCOL_CHANNELS_PXX1_PULSES: + EXTMODULE_TIMER->CCR2 = extmodulePulsesData.pxx.getLast() - 4000; // 2mS in advance + EXTMODULE_TIMER_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA + EXTMODULE_TIMER_DMA_STREAM->CR |= EXTMODULE_TIMER_DMA_CHANNEL | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | EXTMODULE_TIMER_DMA_SIZE | DMA_SxCR_PL_0 | DMA_SxCR_PL_1; + EXTMODULE_TIMER_DMA_STREAM->PAR = CONVERT_PTR_UINT(&EXTMODULE_TIMER->ARR); + EXTMODULE_TIMER_DMA_STREAM->M0AR = CONVERT_PTR_UINT(extmodulePulsesData.pxx.getData()); + EXTMODULE_TIMER_DMA_STREAM->NDTR = extmodulePulsesData.pxx.getSize(); + EXTMODULE_TIMER_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA + break; #endif - EXTMODULE_DMA_STREAM->PAR = CONVERT_PTR_UINT(&EXTMODULE_TIMER->ARR); - EXTMODULE_DMA_STREAM->M0AR = CONVERT_PTR_UINT(extmodulePulsesData.pxx.getData()); - EXTMODULE_DMA_STREAM->NDTR = extmodulePulsesData.pxx.getSize(); - EXTMODULE_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA - } + +#if defined(PXX1) && defined(HARDWARE_EXTERNAL_MODULE_SIZE_SML) + case PROTOCOL_CHANNELS_PXX1_SERIAL: + extmoduleSendBuffer(extmodulePulsesData.pxx_uart.getData(), extmodulePulsesData.pxx_uart.getSize()); + break; #endif + #if defined(PXX2) - else if (moduleState[EXTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PXX2) { - sportSendBuffer(extmodulePulsesData.pxx2.getData(), extmodulePulsesData.pxx2.getSize()); - } + case PROTOCOL_CHANNELS_PXX2_HIGHSPEED: + case PROTOCOL_CHANNELS_PXX2_LOWSPEED: + extmoduleSendBuffer(extmodulePulsesData.pxx2.getData(), extmodulePulsesData.pxx2.getSize()); + break; #endif + #if defined(DSM2) - else if (IS_DSM2_PROTOCOL(moduleState[EXTERNAL_MODULE].protocol) || IS_MULTIMODULE_PROTOCOL(moduleState[EXTERNAL_MODULE].protocol) || IS_SBUS_PROTOCOL(moduleState[EXTERNAL_MODULE].protocol)) { - EXTMODULE_TIMER->CCR2 = *(extmodulePulsesData.dsm2.ptr - 1) - 4000; // 2mS in advance - EXTMODULE_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA + case PROTOCOL_CHANNELS_SBUS: #if defined(PCBX10) || PCBREV >= 13 - EXTMODULE_DMA_STREAM->CR |= EXTMODULE_DMA_CHANNEL | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | DMA_SxCR_PSIZE_0 | DMA_SxCR_MSIZE_0 | DMA_SxCR_PL_0 | DMA_SxCR_PL_1; - if (IS_SBUS_PROTOCOL(moduleState[EXTERNAL_MODULE].protocol)) EXTMODULE_TIMER->CCER = TIM_CCER_CC3E | (GET_SBUS_POLARITY(EXTERNAL_MODULE) ? TIM_CCER_CC3P : 0); // reverse polarity for Sbus if needed #else - EXTMODULE_DMA_STREAM->CR |= EXTMODULE_DMA_CHANNEL | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | DMA_SxCR_PSIZE_1 | DMA_SxCR_MSIZE_1 | DMA_SxCR_PL_0 | DMA_SxCR_PL_1; - if (IS_SBUS_PROTOCOL(moduleState[EXTERNAL_MODULE].protocol)) EXTMODULE_TIMER->CCER = TIM_CCER_CC1E | (GET_SBUS_POLARITY(EXTERNAL_MODULE) ? TIM_CCER_CC1P : 0); // reverse polarity for Sbus if needed #endif - EXTMODULE_DMA_STREAM->PAR = CONVERT_PTR_UINT(&EXTMODULE_TIMER->ARR); - EXTMODULE_DMA_STREAM->M0AR = CONVERT_PTR_UINT(extmodulePulsesData.dsm2.pulses); - EXTMODULE_DMA_STREAM->NDTR = extmodulePulsesData.dsm2.ptr - extmodulePulsesData.dsm2.pulses; - EXTMODULE_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA - } + // no break + case PROTOCOL_CHANNELS_DSM2_LP45: + case PROTOCOL_CHANNELS_DSM2_DSM2: + case PROTOCOL_CHANNELS_DSM2_DSMX: + case PROTOCOL_CHANNELS_MULTIMODULE: + EXTMODULE_TIMER->CCR2 = *(extmodulePulsesData.dsm2.ptr - 1) - 4000; // 2mS in advance + EXTMODULE_TIMER_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA + EXTMODULE_TIMER_DMA_STREAM->CR |= EXTMODULE_TIMER_DMA_CHANNEL | DMA_SxCR_DIR_0 | EXTMODULE_TIMER_DMA_SIZE | DMA_SxCR_MSIZE_1 | DMA_SxCR_PL_0 | DMA_SxCR_PL_1; + EXTMODULE_TIMER_DMA_STREAM->PAR = CONVERT_PTR_UINT(&EXTMODULE_TIMER->ARR); + EXTMODULE_TIMER_DMA_STREAM->M0AR = CONVERT_PTR_UINT(extmodulePulsesData.dsm2.pulses); + EXTMODULE_TIMER_DMA_STREAM->NDTR = extmodulePulsesData.dsm2.ptr - extmodulePulsesData.dsm2.pulses; + EXTMODULE_TIMER_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA + break; #endif - else { - EXTMODULE_TIMER->DIER |= TIM_DIER_CC2IE; + +#if defined(CROSSFIRE) + case PROTOCOL_CHANNELS_CROSSFIRE: + sportSendBuffer(extmodulePulsesData.crossfire.pulses, extmodulePulsesData.crossfire.length); + break; +#endif + + default: + EXTMODULE_TIMER->DIER |= TIM_DIER_CC2IE; + break; } } -extern "C" void EXTMODULE_DMA_IRQHandler() +extern "C" void EXTMODULE_TIMER_DMA_IRQHandler() { - if (!DMA_GetITStatus(EXTMODULE_DMA_STREAM, EXTMODULE_DMA_FLAG_TC)) + if (!DMA_GetITStatus(EXTMODULE_TIMER_DMA_STREAM, EXTMODULE_TIMER_DMA_FLAG_TC)) return; - DMA_ClearITPendingBit(EXTMODULE_DMA_STREAM, EXTMODULE_DMA_FLAG_TC); + DMA_ClearITPendingBit(EXTMODULE_TIMER_DMA_STREAM, EXTMODULE_TIMER_DMA_FLAG_TC); EXTMODULE_TIMER->SR &= ~TIM_SR_CC2IF; // Clear flag EXTMODULE_TIMER->DIER |= TIM_DIER_CC2IE; // Enable this interrupt @@ -284,6 +365,6 @@ extern "C" void EXTMODULE_TIMER_IRQHandler() { EXTMODULE_TIMER->DIER &= ~TIM_DIER_CC2IE; // Stop this interrupt EXTMODULE_TIMER->SR &= ~TIM_SR_CC2IF; - if (setupPulses(EXTERNAL_MODULE)) + if (setupPulsesExternalModule()) extmoduleSendNextFrame(); } diff --git a/radio/src/targets/horus/hal.h b/radio/src/targets/horus/hal.h index 11361676a..186bd3329 100644 --- a/radio/src/targets/horus/hal.h +++ b/radio/src/targets/horus/hal.h @@ -54,6 +54,7 @@ #endif // Rotary Encoder +#define ROTARY_ENCODER_RCC_APB1Periph RCC_APB1Periph_TIM4 #define ROTARY_ENCODER_GPIO GPIOH #define ROTARY_ENCODER_GPIO_PIN_A GPIO_Pin_11 // PH.11 #define ROTARY_ENCODER_GPIO_PIN_B GPIO_Pin_10 // PH.10 @@ -65,6 +66,9 @@ #define ROTARY_ENCODER_EXTI_PortSource EXTI_PortSourceGPIOH #define ROTARY_ENCODER_EXTI_PinSource1 EXTI_PinSource11 #define ROTARY_ENCODER_EXTI_PinSource2 EXTI_PinSource10 +#define ROTARY_ENCODER_TIMER TIM4 +#define ROTARY_ENCODER_TIMER_IRQn TIM4_IRQn +#define ROTARY_ENCODER_TIMER_IRQHandler TIM4_IRQHandler // Switches #define STORAGE_SWITCH_A @@ -113,23 +117,27 @@ #define SWITCHES_GPIO_PIN_H GPIO_Pin_7 // PG.07 #if defined(PCBX10) - #define STORAGE_SWITCH_GMBL - #define HARDWARE_SWITCH_GMBL - #define SWITCHES_GPIO_REG_GMBL GPIOH->IDR - #define SWITCHES_GPIO_PIN_GMBL GPIO_Pin_14 // PH.14 - #define STORAGE_SWITCH_GMBR - #define HARDWARE_SWITCH_GMBR - #define SWITCHES_GPIO_REG_GMBR GPIOH->IDR - #define SWITCHES_GPIO_PIN_GMBR GPIO_Pin_15 // PH.15 + // Gimbal switch left + #define STORAGE_SWITCH_I + #define HARDWARE_SWITCH_I + #define SWITCHES_GPIO_REG_I GPIOH->IDR + #define SWITCHES_GPIO_PIN_I GPIO_Pin_14 // PH.14 + // Gimbal switch right + #define STORAGE_SWITCH_J + #define HARDWARE_SWITCH_J + #define SWITCHES_GPIO_REG_J GPIOH->IDR + #define SWITCHES_GPIO_PIN_J GPIO_Pin_15 // PH.15 #elif defined(PCBX12S) - #define STORAGE_SWITCH_GMBL - #define HARDWARE_SWITCH_GMBL - #define SWITCHES_GPIO_REG_GMBL GPIOB->IDR - #define SWITCHES_GPIO_PIN_GMBL GPIO_Pin_1 // PB.01 - #define STORAGE_SWITCH_GMBR - #define HARDWARE_SWITCH_GMBR - #define SWITCHES_GPIO_REG_GMBR GPIOB->IDR - #define SWITCHES_GPIO_PIN_GMBR GPIO_Pin_0 // PB.00 + // Gimbal switch left + #define STORAGE_SWITCH_I + #define HARDWARE_SWITCH_I + #define SWITCHES_GPIO_REG_I GPIOB->IDR + #define SWITCHES_GPIO_PIN_I GPIO_Pin_1 // PB.01 + // Gimbal switch right + #define STORAGE_SWITCH_J + #define HARDWARE_SWITCH_J + #define SWITCHES_GPIO_REG_J GPIOB->IDR + #define SWITCHES_GPIO_PIN_J GPIO_Pin_0 // PB.00 #endif // Trims @@ -210,7 +218,7 @@ #if defined(PCBX12S) #define ADC_RCC_AHB1Periph (RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOF | RCC_AHB1Periph_DMA2) #define ADC_RCC_APB1Periph 0 - #define ADC_RCC_APB2Periph (RCC_APB2Periph_SPI4 | RCC_APB2Periph_ADC3) + #define ADC_RCC_APB2Periph (RCC_APB2Periph_SPI4 | RCC_APB2Periph_ADC1 | RCC_APB2Periph_ADC3) #define ADC_SPI SPI4 #define ADC_GPIO_AF GPIO_AF_SPI4 #define ADC_SPI_GPIO GPIOE @@ -229,11 +237,11 @@ #define ADC_DMA DMA2 #define ADC_DMA_Stream DMA2_Stream0 #define ADC_SAMPTIME 3 - #define ADC_CHANNEL_RTC 0 // TODO later ... ADC1_IN18 + #define ADC_VREF_PREC2 300 #elif defined(PCBX10) #define ADC_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOF | RCC_AHB1Periph_DMA2) #define ADC_RCC_APB1Periph (RCC_APB1Periph_TIM5) - #define ADC_RCC_APB2Periph (RCC_APB2Periph_ADC3) + #define ADC_RCC_APB2Periph (RCC_APB2Periph_ADC1 | RCC_APB2Periph_ADC3) #define ADC_GPIO_PIN_STICK_LH GPIO_Pin_0 // PA.00 #define ADC_GPIO_PIN_STICK_LV GPIO_Pin_1 // PA.01 #define ADC_GPIO_PIN_STICK_RH GPIO_Pin_2 // PA.02 @@ -267,7 +275,6 @@ #define ADC_CHANNEL_BATT ADC_Channel_5 // ADC3_IN5 #define ADC_CHANNEL_EXT1 ADC_Channel_6 // ADC3_IN6 #define ADC_CHANNEL_EXT2 ADC_Channel_7 // ADC3_IN7 - #define ADC_CHANNEL_RTC 0 // TODO later ... ADC1_IN18 #define ADC_MAIN ADC3 #define ADC_SAMPTIME 3 #define ADC_DMA DMA2 @@ -275,13 +282,15 @@ #define ADC_DMA_Stream DMA2_Stream0 #define ADC_SET_DMA_FLAGS() ADC_DMA->LIFCR = (DMA_LIFCR_CTCIF0 | DMA_LIFCR_CHTIF0 | DMA_LIFCR_CTEIF0 | DMA_LIFCR_CDMEIF0 | DMA_LIFCR_CFEIF0) #define ADC_TRANSFER_COMPLETE() (ADC_DMA->LISR & DMA_LISR_TCIF0) + #define ADC_VREF_PREC2 250 #endif // Power #define PWR_RCC_AHB1Periph RCC_AHB1Periph_GPIOJ -#define PWR_GPIO GPIOJ -#define PWR_SWITCH_GPIO_PIN GPIO_Pin_0 // PJ.00 +#define PWR_ON_GPIO GPIOJ #define PWR_ON_GPIO_PIN GPIO_Pin_1 // PJ.01 +#define PWR_SWITCH_GPIO GPIOJ +#define PWR_SWITCH_GPIO_PIN GPIO_Pin_0 // PJ.00 // S.Port update connector #define SPORT_MAX_BAUDRATE 250000 // < 400000 @@ -296,9 +305,17 @@ #endif // PCBREV +#if defined(PCBX10) +#define PCBREV_RCC_AHB1Periph RCC_AHB1Periph_GPIOH +#define PCBREV_GPIO_PIN (GPIO_Pin_7 | GPIO_Pin_8) +#define PCBREV_GPIO GPIOH +#define PCBREV_VALUE() (GPIO_ReadInputDataBit(PCBREV_GPIO, GPIO_Pin_7) + (GPIO_ReadInputDataBit(PCBREV_GPIO, GPIO_Pin_8) << 1)) +#else #define PCBREV_RCC_AHB1Periph RCC_AHB1Periph_GPIOI #define PCBREV_GPIO GPIOI #define PCBREV_GPIO_PIN GPIO_Pin_11 // PI.11 +#define PCBREV_VALUE() GPIO_ReadInputDataBit(PCBREV_GPIO, PCBREV_GPIO_PIN) +#endif // Led #define STATUS_LEDS @@ -316,6 +333,7 @@ #endif // Serial Port (DEBUG) +#if defined(PCBX12S) #define AUX_SERIAL_RCC_AHB1Periph (RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_DMA1) #define AUX_SERIAL_RCC_APB1Periph RCC_APB1Periph_USART3 #define AUX_SERIAL_GPIO GPIOB @@ -329,6 +347,10 @@ #define AUX_SERIAL_USART_IRQn USART3_IRQn #define AUX_SERIAL_DMA_Stream_RX DMA1_Stream1 #define AUX_SERIAL_DMA_Channel_RX DMA_Channel_4 +#else +#define AUX_SERIAL_RCC_AHB1Periph 0 +#define AUX_SERIAL_RCC_APB1Periph 0 +#endif // Telemetry #define TELEMETRY_RCC_AHB1Periph (RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA1) @@ -562,12 +584,13 @@ #define INTMODULE_DMA_FLAG_TC DMA_IT_TCIF7 #define INTMODULE_DMA_CHANNEL DMA_Channel_4 #if defined(PCBX12S) - #define INTMODULE_BOOT_GPIO GPIOI - #define INTMODULE_BOOT_GPIO_PIN GPIO_PIN_9 // PC.02 + #define INTMODULE_BOOTCMD_GPIO GPIOC + #define INTMODULE_BOOTCMD_GPIO_PIN GPIO_Pin_2 // PC.02 #elif defined(PCBX10) - #define INTMODULE_BOOT_GPIO GPIOI - #define INTMODULE_BOOT_GPIO_PIN GPIO_PIN_9 // PI.09 + #define INTMODULE_BOOTCMD_GPIO GPIOI + #define INTMODULE_BOOTCMD_GPIO_PIN GPIO_Pin_9 // PI.09 #endif +#define INTMODULE_FLASH_BAUDRATE 38400 #if defined(PCBX10) || PCBREV >= 13 #define INTMODULE_RCC_APB1Periph RCC_APB1Periph_TIM2 #define INTMODULE_RCC_APB2Periph RCC_APB2Periph_USART1 @@ -585,50 +608,92 @@ #endif // External Module -#define EXTMODULE_PULSES -#define EXTMODULE_PWR_GPIO GPIOB -#define EXTMODULE_PWR_GPIO_PIN GPIO_Pin_3 // PB.03 -#if defined(PCBX10) || PCBREV >= 13 - #define EXTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_DMA2) - #define EXTMODULE_RCC_APB1Periph 0 - #define EXTMODULE_RCC_APB2Periph RCC_APB2Periph_TIM1 - #define EXTMODULE_TX_GPIO GPIOA - #define EXTMODULE_TX_GPIO_PIN GPIO_Pin_10 // PA.10 - #define EXTMODULE_TX_GPIO_PinSource GPIO_PinSource10 - #define EXTMODULE_TX_GPIO_AF GPIO_AF_TIM1 - #define EXTMODULE_TIMER TIM1 - #define EXTMODULE_TIMER_IRQn TIM1_CC_IRQn - #define EXTMODULE_TIMER_IRQHandler TIM1_CC_IRQHandler - #define EXTMODULE_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2) - #define EXTMODULE_DMA_CHANNEL DMA_Channel_6 - #define EXTMODULE_DMA_STREAM DMA2_Stream5 - #define EXTMODULE_DMA_IRQn DMA2_Stream5_IRQn - #define EXTMODULE_DMA_IRQHandler DMA2_Stream5_IRQHandler - #define EXTMODULE_DMA_FLAG_TC DMA_IT_TCIF5 +#define EXTMODULE_PWR_GPIO GPIOB +#define EXTMODULE_PWR_GPIO_PIN GPIO_Pin_3 // PB.03 +#if defined(PCBX10) && defined(PCBREV_EXPRESS) + #define EXTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_DMA1) + #define EXTMODULE_RCC_APB1Periph (RCC_APB1Periph_TIM2 | RCC_APB1Periph_USART3) + #define EXTMODULE_RCC_APB2Periph 0 + #define EXTMODULE_TX_GPIO GPIOB + #define EXTMODULE_USART_GPIO EXTMODULE_TX_GPIO + #define EXTMODULE_TX_GPIO_PIN GPIO_Pin_10 // PB.10 (TIM2_CH3) + #define EXTMODULE_TX_GPIO_PinSource GPIO_PinSource10 + #define EXTMODULE_RX_GPIO_PIN GPIO_Pin_11 // PB.11 + #define EXTMODULE_RX_GPIO_PinSource GPIO_PinSource11 + #define EXTMODULE_TIMER_TX_GPIO_AF GPIO_AF_TIM2 + #define EXTMODULE_TIMER TIM2 + #define EXTMODULE_TIMER_32BITS + #define EXTMODULE_TIMER_DMA_SIZE (DMA_SxCR_PSIZE_1 | DMA_SxCR_MSIZE_1) + #define EXTMODULE_TIMER_FREQ (PERI1_FREQUENCY * TIMER_MULT_APB1) + #define EXTMODULE_TIMER_CC_IRQn TIM2_IRQn + #define EXTMODULE_TIMER_IRQHandler TIM2_IRQHandler + #define EXTMODULE_TIMER_DMA_CHANNEL DMA_Channel_3 + #define EXTMODULE_TIMER_DMA_STREAM DMA1_Stream1 + #define EXTMODULE_TIMER_DMA_FLAG_TC DMA_IT_TCIF1 + #define EXTMODULE_TIMER_DMA_STREAM_IRQn DMA1_Stream1_IRQn + #define EXTMODULE_TIMER_DMA_IRQHandler DMA1_Stream1_IRQHandler + #define EXTMODULE_USART_GPIO_AF GPIO_AF_USART3 + #define EXTMODULE_USART USART3 + #define EXTMODULE_USART_IRQn USART3_IRQn + #define EXTMODULE_USART_IRQHandler USART3_IRQHandler + #define EXTMODULE_USART_TX_DMA_CHANNEL DMA_Channel_4 + #define EXTMODULE_USART_TX_DMA_STREAM DMA1_Stream3 + #define EXTMODULE_USART_RX_DMA_CHANNEL DMA_Channel_4 + #define EXTMODULE_USART_RX_DMA_STREAM DMA1_Stream1 +#elif defined(PCBX10) || PCBREV >= 13 + #define EXTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_DMA2) + #define EXTMODULE_RCC_APB1Periph 0 + #define EXTMODULE_RCC_APB2Periph RCC_APB2Periph_TIM1 + #define EXTMODULE_TX_GPIO GPIOA + #define EXTMODULE_TX_GPIO_PIN GPIO_Pin_10 // PA.10 (TIM1_CH3) + #define EXTMODULE_TX_GPIO_PinSource GPIO_PinSource10 + #define EXTMODULE_TIMER_TX_GPIO_AF GPIO_AF_TIM1 + #define EXTMODULE_TIMER TIM1 + #define EXTMODULE_TIMER_DMA_SIZE (DMA_SxCR_PSIZE_0 | DMA_SxCR_MSIZE_0) + #define EXTMODULE_TIMER_CC_IRQn TIM1_CC_IRQn + #define EXTMODULE_TIMER_IRQHandler TIM1_CC_IRQHandler + #define EXTMODULE_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2) + #define EXTMODULE_TIMER_DMA_CHANNEL DMA_Channel_6 + #define EXTMODULE_TIMER_DMA_STREAM DMA2_Stream5 + #define EXTMODULE_TIMER_DMA_STREAM_IRQn DMA2_Stream5_IRQn + #define EXTMODULE_TIMER_DMA_IRQHandler DMA2_Stream5_IRQHandler + #define EXTMODULE_TIMER_DMA_FLAG_TC DMA_IT_TCIF5 #else - #define EXTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_DMA1) - #define EXTMODULE_RCC_APB1Periph RCC_APB1Periph_TIM2 - #define EXTMODULE_RCC_APB2Periph 0 - #define EXTMODULE_TX_GPIO GPIOA - #define EXTMODULE_TX_GPIO_PIN GPIO_Pin_15 // PA.15 - #define EXTMODULE_TX_GPIO_PinSource GPIO_PinSource15 - #define EXTMODULE_TX_GPIO_AF GPIO_AF_TIM2 - #define EXTMODULE_TIMER TIM2 - #define EXTMODULE_TIMER_IRQn TIM2_IRQn - #define EXTMODULE_TIMER_IRQHandler TIM2_IRQHandler - #define EXTMODULE_TIMER_FREQ (PERI1_FREQUENCY * TIMER_MULT_APB1) - #define EXTMODULE_DMA_CHANNEL DMA_Channel_3 - #define EXTMODULE_DMA_STREAM DMA1_Stream7 - #define EXTMODULE_DMA_IRQn DMA1_Stream7_IRQn - #define EXTMODULE_DMA_IRQHandler DMA1_Stream7_IRQHandler - #define EXTMODULE_DMA_FLAG_TC DMA_IT_TCIF7 + #define EXTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_DMA1) + #define EXTMODULE_RCC_APB1Periph RCC_APB1Periph_TIM2 + #define EXTMODULE_RCC_APB2Periph 0 + #define EXTMODULE_TX_GPIO GPIOA + #define EXTMODULE_TX_GPIO_PIN GPIO_Pin_15 // PA.15 (TIM2_CH1) + #define EXTMODULE_TX_GPIO_PinSource GPIO_PinSource15 + #define EXTMODULE_TIMER_TX_GPIO_AF GPIO_AF_TIM2 + #define EXTMODULE_TIMER TIM2 + #define EXTMODULE_TIMER_32BITS + #define EXTMODULE_TIMER_DMA_SIZE (DMA_SxCR_PSIZE_1 | DMA_SxCR_MSIZE_1) + #define EXTMODULE_TIMER_CC_IRQn TIM2_IRQn + #define EXTMODULE_TIMER_IRQHandler TIM2_IRQHandler + #define EXTMODULE_TIMER_FREQ (PERI1_FREQUENCY * TIMER_MULT_APB1) + #define EXTMODULE_TIMER_DMA_CHANNEL DMA_Channel_3 + #define EXTMODULE_TIMER_DMA_STREAM DMA1_Stream7 + #define EXTMODULE_TIMER_DMA_STREAM_IRQn DMA1_Stream7_IRQn + #define EXTMODULE_TIMER_DMA_IRQHandler DMA1_Stream7_IRQHandler + #define EXTMODULE_TIMER_DMA_FLAG_TC DMA_IT_TCIF7 #endif -// Heartbeat (not used) -#define TRAINER_MODULE_RCC_AHB1Periph RCC_AHB1Periph_GPIOD -#define INTMODULE_HEARTBEAT_GPIO GPIOD -#define INTMODULE_HEARTBEAT_GPIO_PIN GPIO_Pin_12 // PD.12 -#define INTMODULE_HEARTBEAT_TRIGGER EXTI_Trigger_Falling +// Heartbeat +#define INTMODULE_HEARTBEAT +#define INTMODULE_HEARTBEAT_RCC_AHB1Periph RCC_AHB1Periph_GPIOD +#define INTMODULE_HEARTBEAT_GPIO GPIOD +#define INTMODULE_HEARTBEAT_GPIO_PIN GPIO_Pin_12 +#define INTMODULE_HEARTBEAT_EXTI_PortSource EXTI_PortSourceGPIOD +#define INTMODULE_HEARTBEAT_EXTI_PinSource GPIO_PinSource12 +#define INTMODULE_HEARTBEAT_EXTI_LINE EXTI_Line12 +#define INTMODULE_HEARTBEAT_EXTI_IRQn EXTI15_10_IRQn +#define INTMODULE_HEARTBEAT_REUSE_INTERRUPT_ROTARY_ENCODER +#if defined(PXX2) +#define INTMODULE_HEARTBEAT_TRIGGER EXTI_Trigger_Falling +#else +#define INTMODULE_HEARTBEAT_TRIGGER EXTI_Trigger_Rising +#endif // Trainer Port #define TRAINER_RCC_AHB1Periph (RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_DMA1) @@ -663,6 +728,7 @@ #define TIMER_2MHz_TIMER TIM7 // Bluetooth +#define STORAGE_BLUETOOTH #define BT_RCC_APB2Periph RCC_APB2Periph_USART6 #define BT_USART USART6 #define BT_GPIO_AF GPIO_AF_USART6 diff --git a/radio/src/targets/horus/keys_driver.cpp b/radio/src/targets/horus/keys_driver.cpp index 0f0b5f7ac..1a04427a4 100644 --- a/radio/src/targets/horus/keys_driver.cpp +++ b/radio/src/targets/horus/keys_driver.cpp @@ -79,9 +79,9 @@ uint32_t readTrims() return result; } -uint16_t trimDown(uint16_t idx) +bool trimDown(uint8_t idx) { - return readTrims() & (1 << idx); + return readTrims() & ((uint32_t)1 << idx); } bool keyDown() @@ -158,11 +158,6 @@ void readKeysAndTrims() } \ break -uint8_t keyState(uint8_t index) -{ - return keys[index].state(); -} - #if !defined(BOOT) uint32_t switchState(uint8_t index) { @@ -178,6 +173,8 @@ uint32_t switchState(uint8_t index) ADD_INV_2POS_CASE(F); ADD_3POS_CASE(G, 6); ADD_2POS_CASE(H); + ADD_2POS_CASE(I); + ADD_2POS_CASE(J); #else ADD_3POS_CASE(A, 0); ADD_INV_3POS_CASE(B, 1); @@ -187,8 +184,8 @@ uint32_t switchState(uint8_t index) ADD_2POS_CASE(F); ADD_3POS_CASE(G, 6); ADD_2POS_CASE(H); - ADD_2POS_CASE(GMBL); - ADD_2POS_CASE(GMBR); + ADD_2POS_CASE(I); + ADD_2POS_CASE(J); #endif default: break; diff --git a/radio/src/targets/horus/pulses_driver.cpp b/radio/src/targets/horus/pulses_driver.cpp deleted file mode 100644 index 6a14b4046..000000000 --- a/radio/src/targets/horus/pulses_driver.cpp +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright (C) OpenTX - * - * Based on code named - * th9x - http://code.google.com/p/th9x - * er9x - http://code.google.com/p/er9x - * gruvin9x - http://code.google.com/p/gruvin9x - * - * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "opentx.h" - -void init_ppm(uint8_t module) -{ - if (module == EXTERNAL_MODULE) { - extmodulePpmStart(); - } -} - -void disable_ppm(uint8_t module) -{ - if (module == EXTERNAL_MODULE) { - extmoduleStop(); - } -} - -void init_pxx2(uint8_t module) -{ - if (module == INTERNAL_MODULE) - intmoduleSerialStart(INTMODULE_PXX_BAUDRATE, true); - else - extmodulePxx2Start(); -} - -void disable_pxx2(uint8_t module) -{ - if (module == INTERNAL_MODULE) - intmoduleStop(); - else - extmoduleStop(); -} - -void init_pxx1_pulses(uint8_t module) -{ - if (module == INTERNAL_MODULE) - intmodulePxxStart(); - else - extmodulePxxStart(); -} - -void init_pxx1_serial(uint8_t module) -{ - if (module == INTERNAL_MODULE) - intmodulePxxStart(); - else - extmodulePxxStart(); -} - -void disable_pxx1_pulses(uint8_t module) -{ - if (module == INTERNAL_MODULE) - intmoduleStop(); - else - extmoduleStop(); -} - -void disable_pxx1_serial(uint8_t module) -{ - if (module == INTERNAL_MODULE) - intmoduleStop(); - else - extmoduleStop(); -} - -#if defined(DSM2) -void disable_serial(uint8_t module) -{ - if (module == EXTERNAL_MODULE) { - extmoduleStop(); - } -} -#endif - diff --git a/radio/src/targets/horus/pwr_driver.cpp b/radio/src/targets/horus/pwr_driver.cpp index 7c7dab489..0a4ad4846 100644 --- a/radio/src/targets/horus/pwr_driver.cpp +++ b/radio/src/targets/horus/pwr_driver.cpp @@ -21,44 +21,50 @@ #include "pwr.h" #include "board.h" -uint32_t shutdownRequest; // Stores intentional shutdown to avoid reboot loop -uint32_t shutdownReason; // Used for detecting unexpected reboots regardless of reason -uint32_t powerupReason __NOINIT; // Stores power up reason beyond initialization for emergency mode activation - void pwrInit() { GPIO_InitTypeDef GPIO_InitStructure; - // Init Module PWR + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; + + // Internal module PWR GPIO_ResetBits(INTMODULE_PWR_GPIO, INTMODULE_PWR_GPIO_PIN); GPIO_InitStructure.GPIO_Pin = INTMODULE_PWR_GPIO_PIN; GPIO_Init(INTMODULE_PWR_GPIO, &GPIO_InitStructure); + // External module PWR GPIO_ResetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN); GPIO_InitStructure.GPIO_Pin = EXTMODULE_PWR_GPIO_PIN; GPIO_Init(EXTMODULE_PWR_GPIO, &GPIO_InitStructure); +#if defined(INTMODULE_BOOTCMD_GPIO) + GPIO_ResetBits(INTMODULE_BOOTCMD_GPIO, INTMODULE_BOOTCMD_GPIO_PIN); + GPIO_InitStructure.GPIO_Pin = INTMODULE_BOOTCMD_GPIO_PIN; + GPIO_Init(INTMODULE_BOOTCMD_GPIO, &GPIO_InitStructure); +#endif + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; - // Init PWR SWITCH PIN + // PWR SWITCH GPIO_InitStructure.GPIO_Pin = PWR_SWITCH_GPIO_PIN; - GPIO_Init(PWR_GPIO, &GPIO_InitStructure); + GPIO_Init(PWR_SWITCH_GPIO, &GPIO_InitStructure); - // Init PCBREV PIN - // TODO to be removed on X10? - GPIO_ResetBits(PCBREV_GPIO, PCBREV_GPIO_PIN); + // PCBREV +#if defined(PCBREV_GPIO_PIN) GPIO_InitStructure.GPIO_Pin = PCBREV_GPIO_PIN; GPIO_Init(PCBREV_GPIO, &GPIO_InitStructure); + hardwareOptions.pcbrev = PCBREV_VALUE(); +#endif - // Init SD-DETECT PIN + // SD-DETECT PIN GPIO_ResetBits(SD_PRESENT_GPIO, SD_PRESENT_GPIO_PIN); GPIO_InitStructure.GPIO_Pin = SD_PRESENT_GPIO_PIN; GPIO_Init(SD_PRESENT_GPIO, &GPIO_InitStructure); - // Init TRAINER DETECT PIN + // TRAINER DETECT PIN GPIO_InitStructure.GPIO_Pin = TRAINER_DETECT_GPIO_PIN; GPIO_Init(TRAINER_DETECT_GPIO, &GPIO_InitStructure); @@ -73,9 +79,9 @@ void pwrOn() GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; - GPIO_Init(PWR_GPIO, &GPIO_InitStructure); + GPIO_Init(PWR_ON_GPIO, &GPIO_InitStructure); - GPIO_SetBits(PWR_GPIO, PWR_ON_GPIO_PIN); + GPIO_SetBits(PWR_ON_GPIO, PWR_ON_GPIO_PIN); shutdownRequest = NO_SHUTDOWN_REQUEST; shutdownReason = DIRTY_SHUTDOWN; @@ -83,34 +89,17 @@ void pwrOn() void pwrOff() { -#if defined(PCBX12S) - // Shutdown the Audio amp - GPIO_InitTypeDef GPIO_InitStructure; - GPIO_InitStructure.GPIO_Pin = AUDIO_SHUTDOWN_GPIO_PIN; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz; - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; - GPIO_Init(AUDIO_SHUTDOWN_GPIO, &GPIO_InitStructure); - GPIO_ResetBits(AUDIO_SHUTDOWN_GPIO, AUDIO_SHUTDOWN_GPIO_PIN); -#endif - - // Shutdown the Haptic - hapticDone(); - - shutdownRequest = SHUTDOWN_REQUEST; - shutdownReason = NORMAL_POWER_OFF; - GPIO_ResetBits(PWR_GPIO, PWR_ON_GPIO_PIN); + GPIO_ResetBits(PWR_ON_GPIO, PWR_ON_GPIO_PIN); } -uint32_t pwrPressed() +bool pwrPressed() { - return GPIO_ReadInputDataBit(PWR_GPIO, PWR_SWITCH_GPIO_PIN) == Bit_RESET; + return GPIO_ReadInputDataBit(PWR_ON_GPIO, PWR_SWITCH_GPIO_PIN) == Bit_RESET; } void pwrResetHandler() { - RCC->AHB1ENR |= RCC_AHB1ENR_GPIOJEN; + RCC->AHB1ENR |= PWR_RCC_AHB1Periph; // these two NOPs are needed (see STM32F errata sheet) before the peripheral // register can be written after the peripheral clock was enabled @@ -144,9 +133,11 @@ void pwrResetHandler() if (shutdownReason == DIRTY_SHUTDOWN) { powerupReason = DIRTY_SHUTDOWN; } -#else - if (WAS_RESET_BY_WATCHDOG_OR_SOFTWARE()) { -#endif pwrOn(); } +#else + if (WAS_RESET_BY_WATCHDOG_OR_SOFTWARE()) { + pwrOn(); + } +#endif } diff --git a/radio/src/targets/horus/telemetry_driver.cpp b/radio/src/targets/horus/telemetry_driver.cpp index 6d9276ef1..8b782f759 100644 --- a/radio/src/targets/horus/telemetry_driver.cpp +++ b/radio/src/targets/horus/telemetry_driver.cpp @@ -140,10 +140,40 @@ void telemetryPortSetDirectionInput() void sportSendByte(uint8_t byte) { + telemetryPortSetDirectionOutput(); + while (!(TELEMETRY_USART->SR & USART_SR_TXE)); USART_SendData(TELEMETRY_USART, byte); } +void sportSendByteLoop(uint8_t byte) +{ + telemetryPortSetDirectionOutput(); + + outputTelemetryBuffer.data[0] = byte; + + DMA_InitTypeDef DMA_InitStructure; + DMA_DeInit(TELEMETRY_DMA_Stream_TX); + DMA_InitStructure.DMA_Channel = TELEMETRY_DMA_Channel_TX; + DMA_InitStructure.DMA_PeripheralBaseAddr = CONVERT_PTR_UINT(&TELEMETRY_USART->DR); + DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; + DMA_InitStructure.DMA_Memory0BaseAddr = CONVERT_PTR_UINT(outputTelemetryBuffer.data); + DMA_InitStructure.DMA_BufferSize = 1; + DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; + DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable; + DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; + DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; + DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; + DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh; + DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; + DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full; + DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; + DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; + DMA_Init(TELEMETRY_DMA_Stream_TX, &DMA_InitStructure); + DMA_Cmd(TELEMETRY_DMA_Stream_TX, ENABLE); + USART_DMACmd(TELEMETRY_USART, USART_DMAReq_Tx, ENABLE); +} + void sportSendBuffer(const uint8_t * buffer, uint32_t count) { telemetryPortSetDirectionOutput(); diff --git a/radio/src/targets/simu/opentxsimulator.cpp b/radio/src/targets/simu/opentxsimulator.cpp index b16be36eb..e30e6e2ec 100644 --- a/radio/src/targets/simu/opentxsimulator.cpp +++ b/radio/src/targets/simu/opentxsimulator.cpp @@ -25,7 +25,7 @@ #define MAX_LOGICAL_SWITCHES NUM_CSW #endif - #define GET_SWITCH_BOOL(sw__) getSwitch((sw__), 0); +#define GET_SWITCH_BOOL(sw__) getSwitch((sw__), 0); #define OTXS_DBG qDebug() << "(" << simuTimerMicros() << "us)" @@ -93,6 +93,7 @@ void OpenTxSimulator::init() { if (isRunning()) return; + OTXS_DBG; if (!m_timer10ms) { @@ -109,6 +110,11 @@ void OpenTxSimulator::init() QMutexLocker lckr(&m_mtxSimuMain); memset(g_anas, 0, sizeof(g_anas)); + +#if defined(PCBTARANIS) + g_anas[TX_RTC_VOLTAGE] = 800; // 2,34V +#endif + simuInit(); } @@ -161,6 +167,7 @@ void OpenTxSimulator::setRadioData(const QByteArray & data) { #if defined(EEPROM_SIZE) QMutexLocker lckr(&m_mtxRadioData); + eeprom = (uint8_t *)malloc(qMin(EEPROM_SIZE, data.size())); memcpy(eeprom, data.data(), qMin(EEPROM_SIZE, data.size())); #endif } diff --git a/radio/src/targets/simu/simpgmspace.cpp b/radio/src/targets/simu/simpgmspace.cpp index 5d3fc51c0..697b1861f 100644 --- a/radio/src/targets/simu/simpgmspace.cpp +++ b/radio/src/targets/simu/simpgmspace.cpp @@ -34,20 +34,15 @@ #include #endif -uint8_t MCUCSR, MCUSR, MCUCR; -volatile uint8_t pina=0xff, pinb=0xff, pinc=0xff, pind, pine=0xff, pinf=0xff, ping=0xff, pinh=0xff, pinj=0, pinl=0; -uint8_t portb, portc, porth=0, dummyport; -uint16_t dummyport16; int g_snapshot_idx = 0; uint8_t simu_start_mode = 0; -char * main_thread_error = NULL; +char * main_thread_error = nullptr; bool simu_shutdown = false; bool simu_running = false; #if defined(STM32) -uint32_t Peri1_frequency, Peri2_frequency; GPIO_TypeDef gpioa, gpiob, gpioc, gpiod, gpioe, gpiof, gpiog, gpioh, gpioi, gpioj; TIM_TypeDef tim1, tim2, tim3, tim4, tim5, tim6, tim7, tim8, tim9, tim10; RCC_TypeDef rcc; @@ -55,11 +50,13 @@ DMA_Stream_TypeDef dma1_stream1, dma1_stream2, dma1_stream3, dma1_stream4, dma1_ DMA_TypeDef dma2; USART_TypeDef Usart0, Usart1, Usart2, Usart3, Usart4; SysTick_Type systick; +ADC_Common_TypeDef adc; #else Pio Pioa, Piob, Pioc; Pmc pmc; Ssc ssc; Pwm pwm; +Tc tc1; Twi Twio; Usart Usart0; Dacc dacc; @@ -79,14 +76,12 @@ void toplcdOff() uint64_t simuTimerMicros(void) { #if SIMPGMSPC_USE_QT - static QElapsedTimer ticker; if (!ticker.isValid()) ticker.start(); return ticker.nsecsElapsed() / 1000; #elif defined(_MSC_VER) - static double freqScale = 0.0; static LARGE_INTEGER firstTick; LARGE_INTEGER newTick; @@ -105,12 +100,9 @@ uint64_t simuTimerMicros(void) QueryPerformanceCounter(&newTick); // compute the elapsed time return (newTick.QuadPart - firstTick.QuadPart) * freqScale; - #else // GNUC - auto now = std::chrono::steady_clock::now(); return (uint64_t) std::chrono::duration_cast(now.time_since_epoch()).count(); - #endif } @@ -143,197 +135,33 @@ void simuInit() PIOC->PIO_PDSR &= ~PIO_PC17; #endif - for (int i = 0; i <= 17; i++) { - simuSetSwitch(i, 0); - simuSetKey(i, false); // a little dirty, but setting keys that don't exist is perfectly OK here - } - for (int i = 0; i < 2*NUM_TRIMS; i++) - simuSetTrim(i, false); - #if defined(ROTARY_ENCODER_NAVIGATION) rotencValue = 0; #endif } -#define NEG_CASE(sw_or_key, pin, mask) \ - case sw_or_key: \ - if ((int)state > 0) pin &= ~(mask); else pin |= (mask); \ - break; -#define POS_CASE(sw_or_key, pin, mask) \ - case sw_or_key: \ - if ((int)state > 0) pin |= (mask); else pin &= ~(mask); \ - break; - - #if defined(PCBHORUS) || (defined(PCBTARANIS) && !defined(PCBX9E)) - #define SWITCH_CASE NEG_CASE - #define SWITCH_INV POS_CASE - #else - #define SWITCH_CASE POS_CASE - #endif - #define KEY_CASE NEG_CASE - #define SWITCH_3_CASE(swtch, pin1, pin2, mask1, mask2) \ - case swtch: \ - if ((int)state < 0) pin1 &= ~(mask1); else pin1 |= (mask1); \ - if ((int)state > 0) pin2 &= ~(mask2); else pin2 |= (mask2); \ - break; - #define SWITCH_3_INV(swtch, pin1, pin2, mask1, mask2) SWITCH_3_CASE(swtch, pin2, pin1, mask2, mask1) - -#define TRIM_CASE KEY_CASE - +bool keysStates[NUM_KEYS] = { false }; void simuSetKey(uint8_t key, bool state) { - // if (state) TRACE_SIMPGMSPACE("simuSetKey(%d, %d)", key, state); - - switch (key) { -#if defined(PCBX12S) - KEY_CASE(KEY_PGUP, KEYS_GPIO_REG_PGUP, KEYS_GPIO_PIN_PGUP) - KEY_CASE(KEY_PGDN, KEYS_GPIO_REG_PGDN, KEYS_GPIO_PIN_PGDN) - KEY_CASE(KEY_ENTER, KEYS_GPIO_REG_ENTER, KEYS_GPIO_PIN_ENTER) - KEY_CASE(KEY_TELEM, KEYS_GPIO_REG_RIGHT, KEYS_GPIO_PIN_RIGHT) - KEY_CASE(KEY_RADIO, KEYS_GPIO_REG_LEFT, KEYS_GPIO_PIN_LEFT) - KEY_CASE(KEY_MODEL, KEYS_GPIO_REG_UP, KEYS_GPIO_PIN_UP) - KEY_CASE(KEY_EXIT, KEYS_GPIO_REG_DOWN, KEYS_GPIO_PIN_DOWN) -#elif defined(PCBX10) - KEY_CASE(KEY_PGDN, KEYS_GPIO_REG_PGDN, KEYS_GPIO_PIN_PGDN) - KEY_CASE(KEY_ENTER, KEYS_GPIO_REG_ENTER, KEYS_GPIO_PIN_ENTER) - KEY_CASE(KEY_TELEM, KEYS_GPIO_REG_RIGHT, KEYS_GPIO_PIN_RIGHT) - KEY_CASE(KEY_RADIO, KEYS_GPIO_REG_LEFT, KEYS_GPIO_PIN_LEFT) - KEY_CASE(KEY_MODEL, KEYS_GPIO_REG_UP, KEYS_GPIO_PIN_UP) - KEY_CASE(KEY_EXIT, KEYS_GPIO_REG_DOWN, KEYS_GPIO_PIN_DOWN) -#elif defined(PCBXLITE) - KEY_CASE(KEY_SHIFT, KEYS_GPIO_REG_SHIFT, KEYS_GPIO_PIN_SHIFT) - KEY_CASE(KEY_EXIT, KEYS_GPIO_REG_EXIT, KEYS_GPIO_PIN_EXIT) - KEY_CASE(KEY_ENTER, KEYS_GPIO_REG_ENTER, KEYS_GPIO_PIN_ENTER) - KEY_CASE(KEY_RIGHT, KEYS_GPIO_REG_RIGHT, KEYS_GPIO_PIN_RIGHT) - KEY_CASE(KEY_LEFT, KEYS_GPIO_REG_LEFT, KEYS_GPIO_PIN_LEFT) - KEY_CASE(KEY_UP, KEYS_GPIO_REG_UP, KEYS_GPIO_PIN_UP) - KEY_CASE(KEY_DOWN, KEYS_GPIO_REG_DOWN, KEYS_GPIO_PIN_DOWN) -#elif defined(RADIO_T12) - KEY_CASE(KEY_EXIT, KEYS_GPIO_REG_EXIT, KEYS_GPIO_PIN_EXIT) - KEY_CASE(KEY_ENTER, KEYS_GPIO_REG_ENTER, KEYS_GPIO_PIN_ENTER) - KEY_CASE(KEY_RIGHT, KEYS_GPIO_REG_RIGHT, KEYS_GPIO_PIN_RIGHT) - KEY_CASE(KEY_LEFT, KEYS_GPIO_REG_LEFT, KEYS_GPIO_PIN_LEFT) - KEY_CASE(KEY_UP, KEYS_GPIO_REG_UP, KEYS_GPIO_PIN_UP) - KEY_CASE(KEY_DOWN, KEYS_GPIO_REG_DOWN, KEYS_GPIO_PIN_DOWN) -#elif defined(PCBTARANIS) - KEY_CASE(KEY_MENU, KEYS_GPIO_REG_MENU, KEYS_GPIO_PIN_MENU) - KEY_CASE(KEY_EXIT, KEYS_GPIO_REG_EXIT, KEYS_GPIO_PIN_EXIT) - KEY_CASE(KEY_ENTER, KEYS_GPIO_REG_ENTER, KEYS_GPIO_PIN_ENTER) - KEY_CASE(KEY_PAGE, KEYS_GPIO_REG_PAGE, KEYS_GPIO_PIN_PAGE) - #if defined(KEYS_GPIO_REG_MINUS) - KEY_CASE(KEY_MINUS, KEYS_GPIO_REG_MINUS, KEYS_GPIO_PIN_MINUS) - KEY_CASE(KEY_PLUS, KEYS_GPIO_REG_PLUS, KEYS_GPIO_PIN_PLUS) - #endif -#else - KEY_CASE(KEY_MENU, KEYS_GPIO_REG_MENU, KEYS_GPIO_PIN_MENU) - KEY_CASE(KEY_EXIT, KEYS_GPIO_REG_EXIT, KEYS_GPIO_PIN_EXIT) - KEY_CASE(KEY_RIGHT, KEYS_GPIO_REG_RIGHT, KEYS_GPIO_PIN_RIGHT) - KEY_CASE(KEY_LEFT, KEYS_GPIO_REG_LEFT, KEYS_GPIO_PIN_LEFT) - KEY_CASE(KEY_UP, KEYS_GPIO_REG_UP, KEYS_GPIO_PIN_UP) - KEY_CASE(KEY_DOWN, KEYS_GPIO_REG_DOWN, KEYS_GPIO_PIN_DOWN) -#endif - } + // TRACE("simuSetKey(%d, %d)", key, state); + assert(key < DIM(keysStates)); + keysStates[key] = state; } +bool trimsStates[NUM_TRIMS * 2] = { false }; void simuSetTrim(uint8_t trim, bool state) { - // TRACE_SIMPGMSPACE("trim=%d state=%d", trim, state); - - switch (trim) { - TRIM_CASE(0, TRIMS_GPIO_REG_LHL, TRIMS_GPIO_PIN_LHL) - TRIM_CASE(1, TRIMS_GPIO_REG_LHR, TRIMS_GPIO_PIN_LHR) - TRIM_CASE(2, TRIMS_GPIO_REG_LVD, TRIMS_GPIO_PIN_LVD) - TRIM_CASE(3, TRIMS_GPIO_REG_LVU, TRIMS_GPIO_PIN_LVU) - #if defined(TRIMS_GPIO_REG_RVD) - TRIM_CASE(4, TRIMS_GPIO_REG_RVD, TRIMS_GPIO_PIN_RVD) - TRIM_CASE(5, TRIMS_GPIO_REG_RVU, TRIMS_GPIO_PIN_RVU) - TRIM_CASE(6, TRIMS_GPIO_REG_RHL, TRIMS_GPIO_PIN_RHL) - TRIM_CASE(7, TRIMS_GPIO_REG_RHR, TRIMS_GPIO_PIN_RHR) - #endif -#if defined(PCBHORUS) - TRIM_CASE(8, TRIMS_GPIO_REG_LSD, TRIMS_GPIO_PIN_LSD) - TRIM_CASE(9, TRIMS_GPIO_REG_LSU, TRIMS_GPIO_PIN_LSU) - TRIM_CASE(10, TRIMS_GPIO_REG_RSD, TRIMS_GPIO_PIN_RSD) - TRIM_CASE(11, TRIMS_GPIO_REG_RSU, TRIMS_GPIO_PIN_RSU) -#endif - } + // TRACE("simuSetTrim(%d, %d)", trim, state); + assert(trim < DIM(trimsStates)); + trimsStates[trim] = state; } -// TODO use a better numbering to allow google tests to work on Taranis +int8_t switchesStates[NUM_SWITCHES] = { -1 }; void simuSetSwitch(uint8_t swtch, int8_t state) { - // TRACE_SIMPGMSPACE("simuSetSwitch(%d, %d)", swtch, state); - - switch (swtch) { -#if defined(PCBTARANIS) - #if defined(SWITCHES_GPIO_REG_A_L) - SWITCH_3_CASE(0, SWITCHES_GPIO_REG_A_L, SWITCHES_GPIO_REG_A_H, SWITCHES_GPIO_PIN_A_L, SWITCHES_GPIO_PIN_A_H) - SWITCH_3_CASE(1, SWITCHES_GPIO_REG_B_L, SWITCHES_GPIO_REG_B_H, SWITCHES_GPIO_PIN_B_L, SWITCHES_GPIO_PIN_B_H) - #endif - #if defined(SWITCHES_GPIO_REG_C_L) - SWITCH_3_CASE(2, SWITCHES_GPIO_REG_C_L, SWITCHES_GPIO_REG_C_H, SWITCHES_GPIO_PIN_C_L, SWITCHES_GPIO_PIN_C_H) - #endif - #if defined(SWITCHES_GPIO_REG_D_L) - SWITCH_3_CASE(3, SWITCHES_GPIO_REG_D_L, SWITCHES_GPIO_REG_D_H, SWITCHES_GPIO_PIN_D_L, SWITCHES_GPIO_PIN_D_H) - #elif defined(SWITCHES_GPIO_REG_D) - SWITCH_CASE (3, SWITCHES_GPIO_REG_D, SWITCHES_GPIO_PIN_D) - #endif - #if defined(PCBX7) - SWITCH_CASE (4, SWITCHES_GPIO_REG_F, SWITCHES_GPIO_PIN_F) - SWITCH_CASE (5, SWITCHES_GPIO_REG_H, SWITCHES_GPIO_PIN_H) - SWITCH_CASE (6, SWITCHES_GPIO_REG_I, SWITCHES_GPIO_PIN_I) - SWITCH_CASE (7, SWITCHES_GPIO_REG_J, SWITCHES_GPIO_PIN_J) - #elif defined(PCBXLITES) - SWITCH_CASE (4, SWITCHES_GPIO_REG_E, SWITCHES_GPIO_PIN_E) - SWITCH_CASE (5, SWITCHES_GPIO_REG_F, SWITCHES_GPIO_PIN_F) - #elif !defined(PCBXLITE) && !defined(PCBX9LITE) - SWITCH_3_CASE(4, SWITCHES_GPIO_REG_E_L, SWITCHES_GPIO_REG_E_H, SWITCHES_GPIO_PIN_E_L, SWITCHES_GPIO_PIN_E_H) - SWITCH_CASE (5, SWITCHES_GPIO_REG_F, SWITCHES_GPIO_PIN_F) - SWITCH_3_CASE(6, SWITCHES_GPIO_REG_G_L, SWITCHES_GPIO_REG_G_H, SWITCHES_GPIO_PIN_G_L, SWITCHES_GPIO_PIN_G_H) - SWITCH_CASE (7, SWITCHES_GPIO_REG_H, SWITCHES_GPIO_PIN_H) - #endif - #if defined(SWITCHES_GPIO_REG_I_L) - SWITCH_3_CASE(8, SWITCHES_GPIO_REG_I_L, SWITCHES_GPIO_REG_I_H, SWITCHES_GPIO_PIN_I_L, SWITCHES_GPIO_PIN_I_H) - SWITCH_3_CASE(9, SWITCHES_GPIO_REG_J_L, SWITCHES_GPIO_REG_J_H, SWITCHES_GPIO_PIN_J_L, SWITCHES_GPIO_PIN_J_H) - SWITCH_3_CASE(10, SWITCHES_GPIO_REG_K_L, SWITCHES_GPIO_REG_K_H, SWITCHES_GPIO_PIN_K_L, SWITCHES_GPIO_PIN_K_H) - SWITCH_3_CASE(11, SWITCHES_GPIO_REG_L_L, SWITCHES_GPIO_REG_L_H, SWITCHES_GPIO_PIN_L_L, SWITCHES_GPIO_PIN_L_H) - SWITCH_3_CASE(12, SWITCHES_GPIO_REG_M_L, SWITCHES_GPIO_REG_M_H, SWITCHES_GPIO_PIN_M_L, SWITCHES_GPIO_PIN_M_H) - SWITCH_3_CASE(13, SWITCHES_GPIO_REG_N_L, SWITCHES_GPIO_REG_N_H, SWITCHES_GPIO_PIN_N_L, SWITCHES_GPIO_PIN_N_H) - SWITCH_3_CASE(14, SWITCHES_GPIO_REG_O_L, SWITCHES_GPIO_REG_O_H, SWITCHES_GPIO_PIN_O_L, SWITCHES_GPIO_PIN_O_H) - SWITCH_3_CASE(15, SWITCHES_GPIO_REG_P_L, SWITCHES_GPIO_REG_P_H, SWITCHES_GPIO_PIN_P_L, SWITCHES_GPIO_PIN_P_H) - SWITCH_3_CASE(16, SWITCHES_GPIO_REG_Q_L, SWITCHES_GPIO_REG_Q_H, SWITCHES_GPIO_PIN_Q_L, SWITCHES_GPIO_PIN_Q_H) - SWITCH_3_CASE(17, SWITCHES_GPIO_REG_R_L, SWITCHES_GPIO_REG_R_H, SWITCHES_GPIO_PIN_R_L, SWITCHES_GPIO_PIN_R_H) - #endif -#elif defined(PCBHORUS) - SWITCH_3_CASE(0, SWITCHES_GPIO_REG_A_L, SWITCHES_GPIO_REG_A_H, SWITCHES_GPIO_PIN_A_L, SWITCHES_GPIO_PIN_A_H) - #if defined(PCBX10) - SWITCH_3_INV (1, SWITCHES_GPIO_REG_B_L, SWITCHES_GPIO_REG_B_H, SWITCHES_GPIO_PIN_B_L, SWITCHES_GPIO_PIN_B_H) - SWITCH_3_CASE(2, SWITCHES_GPIO_REG_C_L, SWITCHES_GPIO_REG_C_H, SWITCHES_GPIO_PIN_C_L, SWITCHES_GPIO_PIN_C_H) - SWITCH_3_INV (3, SWITCHES_GPIO_REG_D_L, SWITCHES_GPIO_REG_D_H, SWITCHES_GPIO_PIN_D_L, SWITCHES_GPIO_PIN_D_H) - SWITCH_3_INV (4, SWITCHES_GPIO_REG_E_L, SWITCHES_GPIO_REG_E_H, SWITCHES_GPIO_PIN_E_L, SWITCHES_GPIO_PIN_E_H) - SWITCH_CASE (5, SWITCHES_GPIO_REG_F, SWITCHES_GPIO_PIN_F) - #else // X12 - SWITCH_3_CASE(1, SWITCHES_GPIO_REG_B_L, SWITCHES_GPIO_REG_B_H, SWITCHES_GPIO_PIN_B_L, SWITCHES_GPIO_PIN_B_H) - SWITCH_3_CASE(2, SWITCHES_GPIO_REG_C_L, SWITCHES_GPIO_REG_C_H, SWITCHES_GPIO_PIN_C_L, SWITCHES_GPIO_PIN_C_H) - SWITCH_3_CASE(3, SWITCHES_GPIO_REG_D_L, SWITCHES_GPIO_REG_D_H, SWITCHES_GPIO_PIN_D_L, SWITCHES_GPIO_PIN_D_H) - SWITCH_3_CASE(4, SWITCHES_GPIO_REG_E_L, SWITCHES_GPIO_REG_E_H, SWITCHES_GPIO_PIN_E_L, SWITCHES_GPIO_PIN_E_H) - SWITCH_INV (5, SWITCHES_GPIO_REG_F, SWITCHES_GPIO_PIN_F) - #endif - SWITCH_3_CASE(6, SWITCHES_GPIO_REG_G_L, SWITCHES_GPIO_REG_G_H, SWITCHES_GPIO_PIN_G_L, SWITCHES_GPIO_PIN_G_H) - SWITCH_CASE (7, SWITCHES_GPIO_REG_H, SWITCHES_GPIO_PIN_H) -#elif defined(PCBSKY9X) - SWITCH_3_CASE(0, PIOC->PIO_PDSR, PIOC->PIO_PDSR, 0x00004000, 0x00000800) - SWITCH_CASE(1, PIOC->PIO_PDSR, 1<<20) - SWITCH_CASE(2, PIOA->PIO_PDSR, 1<<15) - SWITCH_CASE(3, PIOC->PIO_PDSR, 1<<31) - SWITCH_CASE(4, PIOA->PIO_PDSR, 1<<2) - SWITCH_CASE(5, PIOC->PIO_PDSR, 1<<16) - SWITCH_CASE(6, PIOC->PIO_PDSR, 1<<8) -#endif - - default: - break; - } + // TRACE("simuSetSwitch(%d, %d)", swtch, state); + assert(swtch < DIM(switchesStates)); + switchesStates[swtch] = state; } void StartSimu(bool tests, const char * sdPath, const char * settingsPath) @@ -341,10 +169,10 @@ void StartSimu(bool tests, const char * sdPath, const char * settingsPath) if (simu_running) return; - moduleState[0].protocol = PROTOCOL_CHANNELS_UNINITIALIZED; + stopPulses(); menuLevel = 0; - simu_start_mode = (tests ? 0 : 0x02 /* OPENTX_START_NO_CHECKS */); + simu_start_mode = (tests ? 0 : OPENTX_START_NO_SPLASH | OPENTX_START_NO_CALIBRATION | OPENTX_START_NO_CHECKS); simu_shutdown = false; simuFatfsSetPaths(sdPath, settingsPath); @@ -528,7 +356,7 @@ void * audioThread(void *) */ if ( SDL_OpenAudio(&wanted, &have) < 0 ) { fprintf(stderr, "Couldn't open audio: %s\n", SDL_GetError()); - return 0; + return nullptr; } SDL_PauseAudio(0); @@ -537,7 +365,7 @@ void * audioThread(void *) sleep(1); } SDL_CloseAudio(); - return 0; + return nullptr; } void StartAudioThread(int volumeGain) @@ -553,8 +381,10 @@ void StartAudioThread(int volumeGain) struct sched_param sp; sp.sched_priority = SCHED_RR; pthread_attr_setschedparam(&attr, &sp); - pthread_create(&simuAudio.threadPid, &attr, &audioThread, NULL); - return; + pthread_create(&simuAudio.threadPid, &attr, &audioThread, nullptr); +#ifdef __linux__ + pthread_setname_np(simuAudio.threadPid, "audio"); +#endif } void StopAudioThread() @@ -567,16 +397,12 @@ void StopAudioThread() bool simuLcdRefresh = true; display_t simuLcdBuf[DISPLAY_BUFFER_SIZE]; -#if !defined(PCBHORUS) +#if !defined(COLORLCD) void lcdSetRefVolt(uint8_t val) { } #endif -void adcPrepareBandgap() -{ -} - #if defined(PCBTARANIS) void lcdOff() { @@ -602,6 +428,18 @@ void telemetryPortInit() { } +void sportUpdatePowerOn() +{ +} + +void sportUpdatePowerOff() +{ +} + +void boardInit() +{ +} + display_t simuLcdBackupBuf[DISPLAY_BUFFER_SIZE]; void lcdStoreBackupBuffer() { @@ -620,11 +458,7 @@ uint32_t pwrCheck() return simu_shutdown ? e_power_off : e_power_on; } -void pwrOff() -{ -} - -uint32_t pwrPressed() +bool pwrPressed() { // TODO: simulate power button #if defined(PWR_SWITCH_GPIO) // STM32 @@ -636,8 +470,107 @@ uint32_t pwrPressed() #endif } +void pwrInit() +{ +} + +void pwrOn() +{ +} + +void pwrOff() +{ +} + +void readKeysAndTrims() +{ + uint8_t index = 0; + uint32_t keys_input = readKeys(); + for (uint8_t i = 1; i != uint8_t(1 << TRM_BASE); i <<= 1) { + keys[index++].input(keys_input & i); + } + + uint32_t trims_input = readTrims(); + for (uint8_t i = 1; i != uint8_t(1 << 8); i <<= 1) { + keys[index++].input(trims_input & i); + } + + if (keys_input || trims_input) { + backlightOn(); + } +} + +bool keyDown() +{ + return readKeys(); +} + +bool trimDown(uint8_t idx) +{ + return readTrims() & (1 << idx); +} + +uint32_t readKeys() +{ + uint32_t result = 0; + + for (int i=0; i 0; + default: + return switchesStates[index - 2] > 0; + } +#else + div_t qr = div(index, 3); + int state = switchesStates[qr.quot]; + switch (qr.rem) { + case 0: + return state < 0; + case 2: + return state > 0; + default: + return state == 0; + } +#endif +} + #if defined(STM32) -void pwrInit() { } int usbPlugged() { return false; } int getSelectedUsbMode() { return USB_JOYSTICK_MODE; } void setSelectedUsbMode(int mode) {} @@ -731,21 +664,80 @@ void RTC_GetDate(uint32_t RTC_Format, RTC_DateTypeDef * RTC_DateStruct) RTC_DateStruct->RTC_Date = timeinfo->tm_mday; } +void unlockFlash() +{ +} -void unlockFlash() { } -void lockFlash() { } -void flashWrite(uint32_t *address, uint32_t *buffer) { simuSleep(100); } -uint32_t isBootloaderStart(const uint8_t * block) { return 1; } +void lockFlash() +{ +} + +void flashWrite(uint32_t *address, uint32_t *buffer) +{ + simuSleep(100); +} + +uint32_t isBootloaderStart(const uint8_t * block) +{ + return 1; +} #endif // defined(STM32) -#if defined(PCBHORUS) -void LCD_ControlLight(uint16_t dutyCycle) { } -#endif - #if defined(PCBXLITES) -bool isJackPlugged() { return false; } +bool isJackPlugged() +{ + return false; +} #endif void serialPrintf(const char * format, ...) { } void serialCrlf() { } void serialPutc(char c) { } + +uint16_t getBatteryVoltage() +{ + return (BATTERY_MAX + BATTERY_WARN) * 5; +} + +void boardOff() +{ +} + +#if defined(PCBHORUS) || defined(PCBTARANIS) +HardwareOptions hardwareOptions; +#endif + +uint32_t Master_frequency = 0; +uint32_t Current_used = 0; +uint16_t Current_max = 0; + +void setSticksGain(uint8_t) +{ +} + +uint16_t getCurrent() +{ + return 10; +} + +void calcConsumption() +{ +} + +#if defined(HEADPHONE_TRAINER_SWITCH_GPIO) +void enableHeadphone() +{ +} + +void enableTrainer() +{ +} + +void enableSpeaker() +{ +} + +void disableSpeaker() +{ +} +#endif diff --git a/radio/src/targets/simu/simpgmspace.h b/radio/src/targets/simu/simpgmspace.h index b40864f24..07b0f95f5 100644 --- a/radio/src/targets/simu/simpgmspace.h +++ b/radio/src/targets/simu/simpgmspace.h @@ -69,8 +69,6 @@ void sig(int sgn) #include #include -#include -#include #include #include @@ -87,6 +85,7 @@ extern RCC_TypeDef rcc; extern DMA_Stream_TypeDef dma1_stream0, dma1_stream1, dma1_stream2, dma1_stream3, dma1_stream4, dma1_stream5, dma1_stream6, dma1_stream7, dma2_stream1, dma2_stream2, dma2_stream5, dma2_stream6, dma2_stream7; extern DMA_TypeDef dma2; extern SysTick_Type systick; +extern ADC_Common_TypeDef adc; #undef SysTick #define SysTick (&systick) #undef GPIOA @@ -165,6 +164,8 @@ extern SysTick_Type systick; #define DMA2_Stream7 (&dma2_stream7) #undef DMA2 #define DMA2 (&dma2) +#undef ADC +#define ADC (&adc) #elif defined(PCBSKY9X) extern Pmc pmc; #undef PMC @@ -172,6 +173,12 @@ extern Pmc pmc; extern Ssc ssc; #undef SSC #define SSC (&ssc) +extern Pmc pmc; +#undef PMC +#define PMC (&pmc) +extern Tc tc1; +#undef TC1 +#define TC1 (&tc1) extern Pio Pioa, Piob, Pioc; extern Twi Twio; extern Dacc dacc; @@ -202,12 +209,7 @@ extern Pwm pwm; #define PWM (&pwm) #endif -#if defined(EEPROM_SIZE) -extern uint8_t eeprom[EEPROM_SIZE]; -#else extern uint8_t * eeprom; -#endif - extern void startPdcUsartReceive() ; extern uint32_t txPdcUsart( uint8_t *buffer, uint32_t size ); extern uint32_t txPdcPending(); diff --git a/radio/src/targets/simu/simueeprom.cpp b/radio/src/targets/simu/simueeprom.cpp index 5aaaa4a7a..ad9dedc13 100644 --- a/radio/src/targets/simu/simueeprom.cpp +++ b/radio/src/targets/simu/simueeprom.cpp @@ -20,22 +20,14 @@ #include "opentx.h" -const char * eepromFile = NULL; -FILE * fp = NULL; - +const char * eepromFile = nullptr; +FILE * fp = nullptr; uint32_t eeprom_pointer; uint8_t * eeprom_buffer_data; volatile int32_t eeprom_buffer_size; bool eeprom_read_operation; - bool eeprom_thread_running = false; - -#if defined(EEPROM_SIZE) -uint8_t eeprom[EEPROM_SIZE]; -#else -uint8_t * eeprom = NULL; -#endif - +uint8_t * eeprom = nullptr; sem_t * eeprom_write_sem; void eepromReadBlock (uint8_t * buffer, size_t address, size_t size) @@ -73,9 +65,11 @@ void eepromSimuWriteBlock(uint8_t * buffer, size_t address, size_t size) volatile uint8_t eepromTransferComplete = 1; void * eeprom_thread_function(void *) { + eeprom_thread_running = true; + while (!sem_wait(eeprom_write_sem)) { if (!eeprom_thread_running) - return NULL; + return nullptr; assert(eeprom_buffer_size); if (eeprom_read_operation) { eepromReadBlock(eeprom_buffer_data, eeprom_pointer, eeprom_buffer_size); @@ -85,7 +79,8 @@ void * eeprom_thread_function(void *) } eepromTransferComplete = 1; } - return 0; + + return nullptr; } uint8_t eepromReadStatus() @@ -162,17 +157,14 @@ void StartEepromThread(const char * filename) sem_init(eeprom_write_sem, 0, 0); #endif - if (!pthread_create(&eeprom_thread_pid, NULL, &eeprom_thread_function, NULL)) - eeprom_thread_running = true; - else - perror("Could not create eeprom thread."); + RTOS_CREATE_TASK(eeprom_thread_pid, eeprom_thread_function, "eeprom"); } void StopEepromThread() { eeprom_thread_running = false; sem_post(eeprom_write_sem); - pthread_join(eeprom_thread_pid, NULL); + pthread_join(eeprom_thread_pid, nullptr); #ifdef __APPLE__ sem_close(eeprom_write_sem); diff --git a/radio/src/targets/simu/simulcd.h b/radio/src/targets/simu/simulcd.h index ecfc473fb..c968efc26 100644 --- a/radio/src/targets/simu/simulcd.h +++ b/radio/src/targets/simu/simulcd.h @@ -21,6 +21,8 @@ #ifndef _SIMULCD_H_ #define _SIMULCD_H_ +#include "lcd.h" + extern int g_snapshot_idx; extern bool simuLcdRefresh; extern display_t simuLcdBuf[DISPLAY_BUFFER_SIZE]; diff --git a/radio/src/targets/sky9x/CMakeLists.txt b/radio/src/targets/sky9x/CMakeLists.txt index 944910749..b4f37964b 100644 --- a/radio/src/targets/sky9x/CMakeLists.txt +++ b/radio/src/targets/sky9x/CMakeLists.txt @@ -68,7 +68,6 @@ set(GUI_SRC model_display.cpp radio_diagkeys.cpp radio_diaganas.cpp - radio_hardware.cpp view_telemetry.cpp view_about.cpp ) @@ -83,6 +82,7 @@ endif() set(FIRMWARE_TARGET_SRC ${FIRMWARE_TARGET_SRC} ../common/arm/loadboot.cpp + board.cpp core_cm3.c board_lowlevel.c crt.c @@ -90,6 +90,7 @@ set(FIRMWARE_TARGET_SRC eeprom_driver.cpp lcd_driver.cpp pwr_driver.cpp + keys_driver.cpp usb/device/core/USBD_UDP.c usb/device/core/USBDDriver.c usb/device/massstorage/MSDDriver.c @@ -111,11 +112,9 @@ set(FIRMWARE_TARGET_SRC set(TARGET_SRC ${TARGET_SRC} - board.cpp telemetry_driver.cpp adc_driver.cpp pulses_driver.cpp - keys_driver.cpp audio_driver.cpp buzzer_driver.cpp haptic_driver.cpp diff --git a/radio/src/targets/sky9x/adc_driver.cpp b/radio/src/targets/sky9x/adc_driver.cpp index dfc6d3578..1f550392a 100644 --- a/radio/src/targets/sky9x/adc_driver.cpp +++ b/radio/src/targets/sky9x/adc_driver.cpp @@ -90,11 +90,6 @@ void adcSingleRead() adcValues[7] = ADC->ADC_CDR14; adcValues[8] = ADC->ADC_CDR8 ; - temperature = (((int32_t)temperature * 7) + ((((int32_t)ADC->ADC_CDR15 - 838) * 621) >> 11)) >> 3; // Filter it - if (get_tmr10ms() >= 100 && temperature > maxTemperature) { - maxTemperature = temperature; - } - // adc direction correct #if defined(FRSKY_STICKS) uint32_t i ; diff --git a/radio/src/targets/sky9x/board.cpp b/radio/src/targets/sky9x/board.cpp index 515dc7708..e97cc8ccc 100644 --- a/radio/src/targets/sky9x/board.cpp +++ b/radio/src/targets/sky9x/board.cpp @@ -26,7 +26,6 @@ uint16_t ResetReason; uint32_t Master_frequency ; -volatile uint32_t Tenms ; volatile uint8_t lcdLock; volatile uint32_t lcdInputs; @@ -58,7 +57,6 @@ inline void setup_switches() configure_pins( 0x91114900, PIN_ENABLE | PIN_INPUT | PIN_PORTC | PIN_PULLUP ) ; } -#if !defined(SIMU) inline void UART3_Configure(uint32_t baudrate, uint32_t masterClock) { Uart *pUart = BT_USART; @@ -85,7 +83,7 @@ inline void UART3_Configure(uint32_t baudrate, uint32_t masterClock) /* Enable receiver and transmitter */ pUart->UART_CR = UART_CR_RXEN | UART_CR_TXEN; - + #if 0 pUart->UART_IER = UART_IER_RXRDY ; NVIC_EnableIRQ(UART1_IRQn) ; @@ -148,7 +146,6 @@ void interrupt5ms() static uint32_t pre_scale ; // Used to get 10 Hz counter HAPTIC_HEARTBEAT(); - AUDIO_HEARTBEAT(); if ( ++pre_scale >= 2 ) { BUZZER_HEARTBEAT(); @@ -248,72 +245,59 @@ void init_pwm() void configure_pins( uint32_t pins, uint16_t config ) { - Pio *pioptr ; + Pio * pioptr; - pioptr = PIOA + ( ( config & PIN_PORT_MASK ) >> 6) ; - if ( config & PIN_PULLUP ) - { - pioptr->PIO_PPDDR = pins ; - pioptr->PIO_PUER = pins ; - } - else - { - pioptr->PIO_PUDR = pins ; - } + pioptr = PIOA + ((config & PIN_PORT_MASK) >> 6); + if (config & PIN_PULLUP) { + pioptr->PIO_PPDDR = pins; + pioptr->PIO_PUER = pins; + } + else { + pioptr->PIO_PUDR = pins; + } - if ( config & PIN_PULLDOWN ) - { - pioptr->PIO_PUDR = pins ; - pioptr->PIO_PPDER = pins ; - } - else - { - pioptr->PIO_PPDDR = pins ; - } + if (config & PIN_PULLDOWN) { + pioptr->PIO_PUDR = pins; + pioptr->PIO_PPDER = pins; + } + else { + pioptr->PIO_PPDDR = pins; + } - if ( config & PIN_HIGH ) - { - pioptr->PIO_SODR = pins ; - } - else - { - pioptr->PIO_CODR = pins ; - } + if (config & PIN_HIGH) { + pioptr->PIO_SODR = pins; + } + else { + pioptr->PIO_CODR = pins; + } - if ( config & PIN_INPUT ) - { - pioptr->PIO_ODR = pins ; - } - else - { - pioptr->PIO_OER = pins ; - } + if (config & PIN_INPUT) { + pioptr->PIO_ODR = pins; + } + else { + pioptr->PIO_OER = pins; + } - if ( config & PIN_PERI_MASK_L ) - { - pioptr->PIO_ABCDSR[0] |= pins ; - } - else - { - pioptr->PIO_ABCDSR[0] &= ~pins ; - } - if ( config & PIN_PERI_MASK_H ) - { - pioptr->PIO_ABCDSR[1] |= pins ; - } - else - { - pioptr->PIO_ABCDSR[1] &= ~pins ; - } + if (config & PIN_PERI_MASK_L) { + pioptr->PIO_ABCDSR[0] |= pins; + } + else { + pioptr->PIO_ABCDSR[0] &= ~pins; + } - if ( config & PIN_ENABLE ) - { - pioptr->PIO_PER = pins ; - } - else - { - pioptr->PIO_PDR = pins ; - } + if (config & PIN_PERI_MASK_H) { + pioptr->PIO_ABCDSR[1] |= pins; + } + else { + pioptr->PIO_ABCDSR[1] &= ~pins; + } + + if (config & PIN_ENABLE) { + pioptr->PIO_PER = pins; + } + else { + pioptr->PIO_PDR = pins; + } } void opentxBootloader(); @@ -346,7 +330,6 @@ void i2cInit() TWI0->TWI_MMR = 0x002F0000 ; // Device 5E (>>1) and master is writing NVIC_EnableIRQ(TWI0_IRQn) ; } -#endif void boardInit() { @@ -402,6 +385,8 @@ void boardInit() rotaryEncoderInit(); #endif + lcdInit(); + init_SDcard(); } #else @@ -437,11 +422,6 @@ uint16_t getCurrent() return (current_scale * Current) / 8192; } -uint8_t getTemperature() -{ - return temperature + g_eeGeneral.temperatureCalib; -} - #define STICK_LV_GAIN 0x01 #define STICK_LH_GAIN 0x02 #define STICK_RV_GAIN 0x04 @@ -499,16 +479,6 @@ void calcConsumption() } } -void checkTrainerSettings() -{ - if (SLAVE_MODE()) { - PIOC->PIO_PDR = PIO_PC22; - } - else { - PIOC->PIO_PER = PIO_PC22; - } -} - uint16_t getBatteryVoltage() { int32_t instant_vbat = anaIn(TX_VOLTAGE); // using filtered ADC value on purpose @@ -516,3 +486,8 @@ uint16_t getBatteryVoltage() instant_vbat /= 5530; return (uint16_t)instant_vbat; } + +void boardOff() +{ + pwrOff(); +} diff --git a/radio/src/targets/sky9x/board.h b/radio/src/targets/sky9x/board.h index e46da5850..4ff927aa4 100644 --- a/radio/src/targets/sky9x/board.h +++ b/radio/src/targets/sky9x/board.h @@ -26,6 +26,7 @@ #include #include "board_lowlevel.h" #include "audio_driver.h" +#include "../opentx_constants.h" extern uint16_t ResetReason; @@ -34,9 +35,8 @@ extern uint16_t ResetReason; #define FIRMWARE_ADDRESS 0x00400000 // Board driver -void boardPreInit(void); -void boardInit(void); -#define boardOff() pwrOff() +void boardInit(); +void boardOff(); // Rotary Encoder driver void rotaryEncoderInit(); @@ -52,6 +52,7 @@ void rotaryEncoderEnd(); // Keys driver #define NUM_SWITCHES 7 #define STORAGE_NUM_SWITCHES NUM_SWITCHES +#define NUM_SWITCHES_POSITIONS 9 enum EnumKeys { @@ -160,11 +161,11 @@ enum EnumSwitches #define LCD_CONTRAST_MIN 10 #define LCD_CONTRAST_MAX 45 #define LCD_CONTRAST_DEFAULT 25 -void lcdInit(void); -void lcdRefresh(void); +void lcdInit(); +void lcdRefresh(); #define lcdRefreshWait() void lcdSetRefVolt(uint8_t val); -void lcdSetContrast(void); +void lcdSetContrast(); // USB driver void usbMassStorage(); @@ -198,10 +199,6 @@ void usbMassStorage(); void configure_pins( uint32_t pins, uint16_t config ); uint16_t getCurrent(); -extern uint8_t temperature ; // Raw temp reading -extern uint8_t maxTemperature ; // Raw temp reading -uint8_t getTemperature(); - extern uint16_t Current_analogue; extern uint16_t Current_max; extern uint32_t Current_accumulator; @@ -212,32 +209,23 @@ void calcConsumption(); // Trainer driver #define SLAVE_MODE() (pwrCheck() == e_power_trainer) #define TRAINER_CONNECTED() (PIOA->PIO_PDSR & PIO_PA8) -void checkTrainerSettings(); void init_trainer_capture(); +void stop_trainer_capture(); // Write Flash driver #define FLASH_PAGESIZE 256 void flashWrite(uint32_t * address, uint32_t * buffer); // Keys driver -uint8_t keyState(uint8_t index); uint32_t switchState(uint8_t index); -uint32_t readKeys(void); -uint32_t readTrims(void); +uint32_t readKeys(); +uint32_t readTrims(); #define NUM_TRIMS 4 #define NUM_TRIMS_KEYS (NUM_TRIMS * 2) #define TRIMS_PRESSED() readTrims() #define KEYS_PRESSED() readKeys() // Pulses driver -void init_no_pulses(uint32_t port); -void init_ppm(uint32_t port); -void disable_ppm(uint32_t port); -void init_pxx1_pulses(uint32_t port); -void disable_pxx1_pulses(uint32_t port); -void disable_serial(uint32_t port); -void init_module_timer( uint32_t module_index, uint32_t period, uint8_t state); -void disable_module_timer( uint32_t module_index); void extmoduleSerialStart(uint32_t baudrate, uint32_t period_half_us, bool inverted); void extmoduleSendNextFrame(); @@ -262,13 +250,13 @@ extern "C" { // WDT driver #if defined(WATCHDOG_DISABLED) || defined(SIMU) - #define wdt_disable() #define wdt_enable(x) #define wdt_reset() + #define IS_RESET_REASON_WATCHDOG() false #else - #define wdt_disable() #define wdt_enable(x) WDT->WDT_MR = 0x3FFF207F #define wdt_reset() WDT->WDT_CR = 0xA5000001 + #define IS_RESET_REASON_WATCHDOG() ((ResetReason & RSTC_SR_RSTTYP) == (2 << 8)) #endif // Backlight driver @@ -284,6 +272,7 @@ extern "C" { #define NUM_SLIDERS 0 #define STORAGE_NUM_SLIDERS 0 #define NUM_XPOTS 0 +#define NUM_MOUSE_ANALOGS 0 #define STORAGE_NUM_MOUSE_ANALOGS 0 enum Analogs { STICK1, @@ -315,10 +304,15 @@ enum CalibratedAnalogs { #define IS_SLIDER(x) false #define STICKS_PWM_ENABLED() false void adcInit(); -void adcRead(void); +void adcRead(); uint16_t getAnalogValue(uint8_t index); void setSticksGain(uint8_t gains); -#define NUM_MOUSE_ANALOGS 0 +inline void enableVBatBridge() +{ +} +inline void disableVBatBridge() +{ +} // Battery driver uint16_t getBatteryVoltage(); // returns current battery voltage in 10mV steps @@ -348,7 +342,7 @@ extern int8_t Coproc_maxtemp; // Haptic driver #define HAPTIC_PWM -void hapticOff(void); +void hapticOff(); void hapticOn(uint32_t pwmPercent); // BlueTooth driver @@ -363,8 +357,9 @@ void btPushByte(uint8_t data); #define SOFT_PWR_CTRL void pwrInit(); void pwrOff(); +void pwrOn(); uint32_t pwrCheck(); -uint32_t pwrPressed(); +bool pwrPressed(); #define UNEXPECTED_SHUTDOWN() (g_eeGeneral.unexpectedShutdown) // EEPROM driver @@ -372,7 +367,7 @@ uint32_t pwrPressed(); #define EEPROM_BLOCK_SIZE (4*1024) void eepromInit(); uint8_t eepromReadStatus(); -uint8_t eepromIsTransferComplete(void); +uint8_t eepromIsTransferComplete(); void eepromBlockErase(uint32_t address); void eepromStartRead(uint8_t * buffer, size_t address, size_t size); void eepromStartWrite(uint8_t * buffer, size_t address, size_t size); diff --git a/radio/src/targets/sky9x/board_lowlevel.h b/radio/src/targets/sky9x/board_lowlevel.h index 6c3357620..ab3dd2c84 100644 --- a/radio/src/targets/sky9x/board_lowlevel.h +++ b/radio/src/targets/sky9x/board_lowlevel.h @@ -43,7 +43,7 @@ /// - BOARD_NAME /// Name of the board. -#define BOARD_NAME "AT91SAM3S-EK" +// #define BOARD_NAME "AT91SAM3S-EK" /// Board definition. #define at91sam3sek /// Family definition (already defined). diff --git a/radio/src/targets/sky9x/keys_driver.cpp b/radio/src/targets/sky9x/keys_driver.cpp index dd959d8fc..9f7dac244 100644 --- a/radio/src/targets/sky9x/keys_driver.cpp +++ b/radio/src/targets/sky9x/keys_driver.cpp @@ -80,7 +80,7 @@ uint32_t readTrims() return result; } -uint8_t trimDown(uint8_t idx) +bool trimDown(uint8_t idx) { return readTrims() & (1 << idx); } @@ -113,11 +113,6 @@ void readKeysAndTrims() } } -uint8_t keyState(uint8_t index) -{ - return keys[index].state(); -} - uint32_t switchState(uint8_t index) { uint32_t a = PIOA->PIO_PDSR; diff --git a/radio/src/targets/sky9x/pulses_driver.cpp b/radio/src/targets/sky9x/pulses_driver.cpp index b25a4741a..8cc751b21 100644 --- a/radio/src/targets/sky9x/pulses_driver.cpp +++ b/radio/src/targets/sky9x/pulses_driver.cpp @@ -108,6 +108,8 @@ void init_second_ppm(uint32_t period) setExtraModulePolarity(); } +/* +// TODO re-add it later void disable_second_ppm() { Pio * pioptr = PIOC; @@ -115,16 +117,6 @@ void disable_second_ppm() PWM->PWM_IDR1 = PWM_IDR1_CHID1; } -void init_no_pulses(uint32_t port) -{ - if (port == EXTERNAL_MODULE) { - init_main_ppm(3000, 0); - } - else { - // TODO - } -} - void init_module_timer(uint32_t port, uint32_t period, uint8_t state) { if (port == EXTERNAL_MODULE) { @@ -132,32 +124,16 @@ void init_module_timer(uint32_t port, uint32_t period, uint8_t state) init_main_ppm(3000, 0); } } +*/ -void disable_module_timer(uint32_t port) +void extmodulePpmStart() { - if (port == EXTERNAL_MODULE) { - disable_ppm(EXTERNAL_MODULE); - } + init_main_ppm(3000, 1); } -void init_ppm(uint32_t port) +void extramodulePpmStart() { - if (port == EXTERNAL_MODULE) { - init_main_ppm(3000, 1); - } - else { - init_second_ppm(3000); - } -} - -void disable_ppm(uint32_t port) -{ - if (port == EXTERNAL_MODULE) { - disable_main_ppm(); - } - else { - disable_second_ppm(); - } + init_second_ppm(3000); } // Initialise the SSC to allow PXX output. @@ -201,26 +177,16 @@ void disable_ssc() sscptr->SSC_CR = SSC_CR_TXDIS; } -void init_pxx1_pulses(uint32_t port) +void extmodulePxx1PulsesStart() { - if (port == EXTERNAL_MODULE) { - init_main_ppm(2500 * 2, 0); - init_ssc(125); // 8us per bit - } - else { - // TODO - } + init_main_ppm(2500 * 2, 0); + init_ssc(125); // 8us per bit } -void disable_pxx1_pulses(uint32_t port) +void extmoduleStop() { - if (port == EXTERNAL_MODULE) { - disable_ssc(); - disable_ppm(EXTERNAL_MODULE); - } - else { - // TODO - } + disable_ssc(); + disable_main_ppm(); } void extmoduleSerialStart(uint32_t baudrate, uint32_t period_half_us, bool inverted) @@ -236,21 +202,10 @@ void extmoduleSerialStart(uint32_t baudrate, uint32_t period_half_us, bool inver } } -void disable_serial(uint32_t port) -{ - if (port == EXTERNAL_MODULE) { - disable_ssc(); - disable_ppm(EXTERNAL_MODULE); - } - else { - // TODO - } -} - void extmoduleSendNextFrame() { - } + #if !defined(SIMU) extern "C" void PWM_IRQHandler(void) { @@ -272,7 +227,7 @@ extern "C" void PWM_IRQHandler(void) } pwmptr->PWM_CH_NUM[3].PWM_CPDRUPD = period; // Period in half uS if (period != 2500 * 2) { - setupPulses(EXTERNAL_MODULE); + setupPulsesExternalModule(); setExternalModulePolarity(); } else { @@ -297,7 +252,7 @@ extern "C" void PWM_IRQHandler(void) } pwmptr->PWM_CH_NUM[3].PWM_CPDRUPD = period; // Period in half uS if (period != 2500 * 2) { - setupPulses(EXTERNAL_MODULE); + setupPulsesExternalModule(); } else { // Kick off serial output here @@ -323,7 +278,7 @@ extern "C" void PWM_IRQHandler(void) } pwmptr->PWM_CH_NUM[3].PWM_CPDRUPD = period; // Period in half uS if (period != 3500 * 2) { - setupPulses(EXTERNAL_MODULE); + setupPulsesExternalModule(); } else { // Kick off serial output here @@ -338,7 +293,7 @@ extern "C" void PWM_IRQHandler(void) pwmptr->PWM_CH_NUM[3].PWM_CPDRUPD = *extmodulePulsesData.ppm.ptr++; if (*extmodulePulsesData.ppm.ptr == 0) { setExternalModulePolarity(); - setupPulses(EXTERNAL_MODULE); + setupPulsesExternalModule(); } break; diff --git a/radio/src/targets/sky9x/pwr_driver.cpp b/radio/src/targets/sky9x/pwr_driver.cpp index 7ade8a844..a62b558c1 100644 --- a/radio/src/targets/sky9x/pwr_driver.cpp +++ b/radio/src/targets/sky9x/pwr_driver.cpp @@ -20,7 +20,14 @@ #include "opentx.h" -uint32_t pwrPressed() +void pwrInit() +{ + // Configure RF_power (PC17) + configure_pins(PIO_PC17, PIN_ENABLE | PIN_INPUT | PIN_PORTC | PIN_NO_PULLUP | PIN_PULLDOWN); + configure_pins(PIO_PA8, PIN_ENABLE | PIN_INPUT | PIN_PORTA | PIN_PULLUP); // Enable bit A8 (Soft Power) +} + +bool pwrPressed() { #if defined(SIMU) return true; @@ -29,15 +36,12 @@ uint32_t pwrPressed() #endif } +void pwrOn() +{ +} + // turn off soft power void pwrOff() { configure_pins(PIO_PA8, PIN_ENABLE | PIN_OUTPUT | PIN_LOW | PIN_PORTA | PIN_NO_PULLUP); } - -void pwrInit() -{ - // Configure RF_power (PC17) - configure_pins(PIO_PC17, PIN_ENABLE | PIN_INPUT | PIN_PORTC | PIN_NO_PULLUP | PIN_PULLDOWN); - configure_pins(PIO_PA8, PIN_ENABLE | PIN_INPUT | PIN_PORTA | PIN_PULLUP); // Enable bit A8 (Soft Power) -} diff --git a/radio/src/targets/sky9x/trainer_driver.cpp b/radio/src/targets/sky9x/trainer_driver.cpp index 151be4b30..e47a9e549 100644 --- a/radio/src/targets/sky9x/trainer_driver.cpp +++ b/radio/src/targets/sky9x/trainer_driver.cpp @@ -82,14 +82,14 @@ extern "C" void TC3_IRQHandler() //capture ppm in at 2MHz void init_trainer_capture() { + PIOC->PIO_PER = PIO_PC22; start_timer4() ; start_timer3() ; } -#if 0 void stop_trainer_capture() { + PIOC->PIO_PDR = PIO_PC22; TC1->TC_CHANNEL[0].TC_IDR = TC_IDR0_LDRAS ; NVIC_DisableIRQ(TC3_IRQn) ; } -#endif diff --git a/radio/src/targets/taranis/CMakeLists.txt b/radio/src/targets/taranis/CMakeLists.txt index aca21c142..d7073617a 100644 --- a/radio/src/targets/taranis/CMakeLists.txt +++ b/radio/src/targets/taranis/CMakeLists.txt @@ -2,9 +2,9 @@ option(SHUTDOWN_CONFIRMATION "Shutdown confirmation" OFF) option(LCD_DUAL_BUFFER "Dual LCD Buffer" OFF) option(INTERNAL_MODULE_PPM "Support for PPM internal module hack" OFF) option(INTERNAL_MODULE_PXX1 "Support for PXX1 internal module replacement" OFF) -option(USEHORUSBT "X9E BT module replaced by Horus BT module" OFF) option(PXX1 "PXX1 protocol support" ON) option(PXX2 "PXX2 protocol support" OFF) +option(AUTOUPDATE "Auto update internal chips from SD" OFF) if(PCB STREQUAL X9E) set(PWR_BUTTON "PRESS" CACHE STRING "Pwr button type (PRESS/SWITCH)") @@ -12,10 +12,11 @@ if(PCB STREQUAL X9E) set(CPU_TYPE STM32F4) set(CPU_TYPE_FULL STM32F407xE) # for size report set(LINKER_SCRIPT targets/taranis/stm32f4_flash.ld) + add_definitions(-DSTM32F40_41xxx) set(HAPTIC YES) set(LUA_EXPORT lua_export_x9e) set(FLAVOUR x9e) - add_definitions(-DSTM32F40_41xxx -DPCBX9E -DPCBX9) + add_definitions(-DPCBX9E -DPCBX9) add_definitions(-DEEPROM_VARIANT=0x8000) add_definitions(-DPWR_BUTTON_${PWR_BUTTON}) set(FIRMWARE_TARGET_SRC @@ -35,9 +36,6 @@ if(PCB STREQUAL X9E) set(GVAR_SCREEN model_gvars.cpp) set(STATUS_LEDS NO) elseif(PCB STREQUAL X9D+) - set(CPU_TYPE STM32F2) - set(CPU_TYPE_FULL STM32F205xE) # for size report - set(LINKER_SCRIPT targets/taranis/stm32f2_flash.ld) set(HAPTIC YES) set(LUA_EXPORT lua_export_x9d) set(FLAVOUR x9d+) @@ -48,9 +46,30 @@ elseif(PCB STREQUAL X9D+) set(BITMAPS_TARGET taranis_bitmaps) set(FONTS_TARGET taranis_fonts) set(LCD_DRIVER lcd_driver_spi.cpp) - set(AUX_SERIAL_DRIVER ../common/arm/stm32/aux_serial_driver.cpp) set(GVAR_SCREEN model_gvars.cpp) - set(STATUS_LEDS NO) + set(PCBREV 2014 CACHE STRING "PCB Revision") + add_definitions(-DPCBREV=${PCBREV}) + if (${PCBREV} STREQUAL 2019) + set(PWR_BUTTON "PRESS" CACHE STRING "Pwr button type (PRESS/SWITCH)") + set(CPU_TYPE STM32F4) + set(CPU_TYPE_FULL STM32F407xE) # for size report + set(FIRMWARE_TARGET_SRC + ${FIRMWARE_TARGET_SRC} + startup_stm32f40_41xxx.s + ) + set(LINKER_SCRIPT targets/taranis/stm32f4_flash.ld) + add_definitions(-DSTM32F40_41xxx) + add_definitions(-DSOFTWARE_VOLUME -DPWR_BUTTON_${PWR_BUTTON} -DHARDWARE_POWER_MANAGEMENT_UNIT) + set(STATUS_LEDS YES) + set(PXX2 ON) + set(PXX_FREQUENCY "HIGH") + else() + set(CPU_TYPE STM32F2) + set(CPU_TYPE_FULL STM32F205xE) # for size report + set(LINKER_SCRIPT targets/taranis/stm32f2_flash.ld) + set(AUX_SERIAL_DRIVER ../common/arm/stm32/aux_serial_driver.cpp) + set(STATUS_LEDS NO) + endif() elseif(PCB STREQUAL X9D) set(CPU_TYPE STM32F2) set(CPU_TYPE_FULL STM32F205xE) # for size report @@ -78,7 +97,6 @@ elseif(PCB STREQUAL X7) set(LUA_EXPORT lua_export_t12) set(FLAVOUR t12) set(NAVIGATION_TYPE 9x) - set(MULTIMODULE ON) add_definitions(-DRADIO_T12) add_definitions(-DEEPROM_VARIANT=0x4001) else() @@ -129,6 +147,7 @@ elseif(PCB STREQUAL XLITE) add_definitions(-DPCBXLITE -DSOFTWARE_VOLUME -DEXTERNAL_ANTENNA -DSTICKS_PWM) add_definitions(-DEEPROM_VARIANT=0x2000) add_definitions(-DPWR_BUTTON_${PWR_BUTTON}) + set(PXX2 ON) set(GUI_DIR 128x64) set(NAVIGATION_TYPE xlite) set(BITMAPS_TARGET 9x_bitmaps) @@ -170,7 +189,7 @@ if(PCB STREQUAL XLITES) ) endif() -if(PCB STREQUAL XLITE OR PCB STREQUAL XLITES OR PCB STREQUAL X9LITE) +if(PCB STREQUAL XLITE OR PCB STREQUAL XLITES OR PCB STREQUAL X9LITE OR (PCB STREQUAL X9D+ AND PCBREV STREQUAL 2019)) add_definitions(-DINTERNAL_MODULE_SERIAL) if(PXX_FREQUENCY STREQUAL HIGH) add_definitions(-DPXX_FREQUENCY_HIGH) @@ -179,25 +198,21 @@ if(PCB STREQUAL XLITE OR PCB STREQUAL XLITES OR PCB STREQUAL X9LITE) ${TARGET_SRC} ../common/arm/stm32/intmodule_serial_driver.cpp ) -else() +elseif(NOT (PCB STREQUAL X7 AND PCBREV STREQUAL T12)) set(TARGET_SRC ${TARGET_SRC} intmodule_pulses_driver.cpp ) - set(PULSES_SRC - ${PULSES_SRC} - ../sbus.cpp - ) endif() -if(PCB STREQUAL X9E OR (PCB STREQUAL X7 AND NOT (PCBREV STREQUAL T12)) OR PCB STREQUAL X9LITE) +if(PCB STREQUAL X9E OR (PCB STREQUAL X9D+ AND PCBREV STREQUAL 2019) OR (PCB STREQUAL X7 AND NOT (PCBREV STREQUAL T12)) OR PCB STREQUAL X9LITE) set(TARGET_SRC ${TARGET_SRC} ../common/arm/stm32/rotary_encoder_driver.cpp ) endif() -if(PCB STREQUAL X9E OR PCB STREQUAL X7 OR PCB STREQUAL XLITE OR PCB STREQUAL XLITES) +if(PCB STREQUAL X9E OR PCB STREQUAL X7 OR PCB STREQUAL XLITE OR PCB STREQUAL XLITES OR (PCB STREQUAL X9D+ AND PCBREV STREQUAL 2019)) add_definitions(-DBLUETOOTH) set(TARGET_SRC ${TARGET_SRC} @@ -209,6 +224,10 @@ if(PCB STREQUAL X9E OR PCB STREQUAL X7 OR PCB STREQUAL XLITE OR PCB STREQUAL XLI ) endif() +if(AUTOUPDATE) + add_definitions(-DAUTOUPDATE) +endif() + set(HSE_VALUE 12000000) set(SDCARD YES) set(EEPROM EEPROM_RLC) @@ -234,7 +253,6 @@ set(GUI_SRC model_display.cpp radio_diagkeys.cpp radio_diaganas.cpp - radio_hardware.cpp view_channels.cpp view_telemetry.cpp view_about.cpp @@ -246,13 +264,18 @@ if(STATUS_LEDS) set(LED_DRIVER led_driver.cpp) endif() +set(SRC + ${SRC} + sbus.cpp + ) + set(TARGET_SRC ${TARGET_SRC} - board.cpp ${LED_DRIVER} backlight_driver.cpp extmodule_driver.cpp trainer_driver.cpp + ../common/arm/stm32/timers_driver.cpp ../common/arm/stm32/audio_dac_driver.cpp ../common/arm/stm32/adc_driver.cpp ../common/arm/stm32/heartbeat_driver.cpp @@ -268,6 +291,7 @@ endif() set(FIRMWARE_TARGET_SRC ${FIRMWARE_TARGET_SRC} ${LCD_DRIVER} + board.cpp i2c_driver.cpp pwr_driver.cpp ../common/arm/loadboot.cpp @@ -285,8 +309,4 @@ if(INTERNAL_MODULE_PXX1) add_definitions(-DINTERNAL_MODULE_PXX1) endif() -if(USEHORUSBT) - add_definitions(-DUSEHORUSBT) -endif(USEHORUSBT) - set(FIRMWARE_DEPENDENCIES ${FIRMWARE_DEPENDENCIES} ${BITMAPS_TARGET}) diff --git a/radio/src/targets/taranis/backlight_driver.cpp b/radio/src/targets/taranis/backlight_driver.cpp index f61777262..63a5bfd1a 100644 --- a/radio/src/targets/taranis/backlight_driver.cpp +++ b/radio/src/targets/taranis/backlight_driver.cpp @@ -76,7 +76,7 @@ void backlightInit() BACKLIGHT_TIMER->CCMR2 = TIM_CCMR2_OC4M_1 | TIM_CCMR2_OC4M_2; // PWM BACKLIGHT_TIMER->CCER = TIM_CCER_CC4E | TIM_CCER_CC2E; BACKLIGHT_TIMER->CCR2 = 0; - BACKLIGHT_TIMER->CCR4 = 100; + BACKLIGHT_TIMER->CCR4 = 0; BACKLIGHT_TIMER->EGR = 0; BACKLIGHT_TIMER->CR1 = TIM_CR1_CEN; // Counter enable } diff --git a/radio/src/targets/taranis/board.cpp b/radio/src/targets/taranis/board.cpp index b8f408b3c..2589cd643 100644 --- a/radio/src/targets/taranis/board.cpp +++ b/radio/src/targets/taranis/board.cpp @@ -20,12 +20,12 @@ #include "opentx.h" -#if defined(__cplusplus) && !defined(SIMU) +#if defined(__cplusplus) extern "C" { #endif #include "usb_dcd_int.h" #include "usb_bsp.h" -#if defined(__cplusplus) && !defined(SIMU) +#if defined(__cplusplus) } #endif @@ -41,78 +41,6 @@ void watchdogInit(unsigned int duration) IWDG->KR = 0xCCCC; // start } -// Starts TIMER at 2MHz -void init2MhzTimer() -{ - TIMER_2MHz_TIMER->PSC = (PERI1_FREQUENCY * TIMER_MULT_APB1) / 2000000 - 1 ; // 0.5 uS, 2 MHz - TIMER_2MHz_TIMER->ARR = 65535; - TIMER_2MHz_TIMER->CR2 = 0; - TIMER_2MHz_TIMER->CR1 = TIM_CR1_CEN; -} - -// Starts TIMER at 200Hz (5ms) -void init5msTimer() -{ - INTERRUPT_xMS_TIMER->ARR = 4999 ; // 5mS in uS - INTERRUPT_xMS_TIMER->PSC = (PERI1_FREQUENCY * TIMER_MULT_APB1) / 1000000 - 1 ; // 1uS - INTERRUPT_xMS_TIMER->CCER = 0 ; - INTERRUPT_xMS_TIMER->CCMR1 = 0 ; - INTERRUPT_xMS_TIMER->EGR = 0 ; - INTERRUPT_xMS_TIMER->CR1 = 5 ; - INTERRUPT_xMS_TIMER->DIER |= 1 ; - NVIC_EnableIRQ(INTERRUPT_xMS_IRQn) ; - NVIC_SetPriority(INTERRUPT_xMS_IRQn, 7); -} - -void stop5msTimer( void ) -{ - INTERRUPT_xMS_TIMER->CR1 = 0 ; // stop timer - NVIC_DisableIRQ(INTERRUPT_xMS_IRQn) ; -} - -// TODO use the same than board_sky9x.cpp -void interrupt5ms() -{ - static uint32_t pre_scale ; // Used to get 10 Hz counter - - AUDIO_HEARTBEAT(); - -#if defined(HAPTIC) - HAPTIC_HEARTBEAT(); -#endif - - if (++pre_scale >= 2) { - pre_scale = 0 ; - DEBUG_TIMER_START(debugTimerPer10ms); - DEBUG_TIMER_SAMPLE(debugTimerPer10msPeriod); - per10ms(); - DEBUG_TIMER_STOP(debugTimerPer10ms); - } -} - -#if !defined(SIMU) -extern "C" void INTERRUPT_xMS_IRQHandler() -{ - INTERRUPT_xMS_TIMER->SR &= ~TIM_SR_UIF ; - interrupt5ms() ; - DEBUG_INTERRUPT(INT_5MS); -} -#endif - -#if defined(PWR_BUTTON_PRESS) - #define PWR_PRESS_DURATION_MIN 100 // 1s - #define PWR_PRESS_DURATION_MAX 500 // 5s -#endif - -#if (defined(PCBX9E) && !defined(SIMU)) -const unsigned char bmp_startup[] = { - #include "startup.lbm" -}; -const unsigned char bmp_lock[] = { - #include "lock.lbm" -}; -#endif - #if defined(SPORT_UPDATE_PWR_GPIO) void sportUpdateInit() { @@ -138,7 +66,6 @@ void sportUpdatePowerOff() void boardInit() { -#if !defined(SIMU) RCC_AHB1PeriphClockCmd(PWR_RCC_AHB1Periph | PCBREV_RCC_AHB1Periph | KEYS_RCC_AHB1Periph | @@ -160,7 +87,8 @@ void boardInit() GYRO_RCC_AHB1Periph, ENABLE); - RCC_APB1PeriphClockCmd(LCD_RCC_APB1Periph | + RCC_APB1PeriphClockCmd(ROTARY_ENCODER_RCC_APB1Periph | + LCD_RCC_APB1Periph | AUDIO_RCC_APB1Periph | ADC_RCC_APB1Periph | BACKLIGHT_RCC_APB1Periph | @@ -192,9 +120,11 @@ void boardInit() bluetoothInit(BLUETOOTH_DEFAULT_BAUDRATE, true); #endif -#if !defined(PCBX9E) - // some X9E boards need that the pwrInit() is moved a little bit later pwrInit(); + +#if defined(AUTOUPDATE) + telemetryPortInit(FRSKY_SPORT_BAUDRATE, TELEMETRY_SERIAL_WITHOUT_DMA); + sportSendByteLoop(0x7E); #endif #if defined(STATUS_LEDS) @@ -245,63 +175,14 @@ void boardInit() #endif #if defined(PWR_BUTTON_PRESS) - if (!WAS_RESET_BY_WATCHDOG_OR_SOFTWARE()) { - lcdClear(); -#if defined(PCBX9E) - lcdDrawBitmap(76, 2, bmp_lock, 0, 60); -#else - lcdDrawFilledRect(LCD_W / 2 - 18, LCD_H / 2 - 3, 6, 6, SOLID, 0); + if (WAS_RESET_BY_WATCHDOG_OR_SOFTWARE()) { + pwrOn(); + } #endif - lcdRefresh(); - lcdRefreshWait(); - tmr10ms_t start = get_tmr10ms(); - tmr10ms_t duration = 0; - uint8_t pwr_on = 0; - while (pwrPressed()) { - duration = get_tmr10ms() - start; - if (duration < PWR_PRESS_DURATION_MIN) { - unsigned index = duration / (PWR_PRESS_DURATION_MIN / 4); - lcdClear(); -#if defined(PCBX9E) - lcdDrawBitmap(76, 2, bmp_startup, index*60, 60); -#else - for(uint8_t i= 0; i < 4; i++) { - if (index >= i) { - lcdDrawFilledRect(LCD_W / 2 - 18 + 10 * i, LCD_H / 2 - 3, 6, 6, SOLID, 0); - } - } -#endif - } - else if (duration >= PWR_PRESS_DURATION_MAX) { - drawSleepBitmap(); - backlightDisable(); - } - else { - if (pwr_on != 1) { - pwr_on = 1; - pwrInit(); - backlightInit(); - haptic.play(15, 3, PLAY_NOW); - } - } - lcdRefresh(); - lcdRefreshWait(); - } - if (duration < PWR_PRESS_DURATION_MIN || duration >= PWR_PRESS_DURATION_MAX) { - boardOff(); - } - } - else { - pwrInit(); - backlightInit(); - } #if defined(TOPLCD_GPIO) toplcdInit(); #endif -#else // defined(PWR_BUTTON_PRESS) - backlightInit(); -#endif if (HAS_SPORT_UPDATE_CONNECTOR()) { sportUpdateInit(); @@ -316,24 +197,26 @@ void boardInit() initHeadphoneTrainerSwitch(); - vbattRTC = getRTCBattVoltage(); - #if defined(GYRO) gyroInit(); #endif -#endif // !defined(SIMU) +#if defined(RTCLOCK) && !defined(COPROCESSOR) + rtcInit(); // RTC must be initialized before rambackupRestore() is called +#endif + + backlightInit(); } void boardOff() { -#if defined(STATUS_LEDS) +#if defined(STATUS_LEDS) && !defined(BOOT) ledOff(); #endif BACKLIGHT_DISABLE(); -#if defined(TOPLCD_GPIO) +#if defined(TOPLCD_GPIO) && !defined(BOOT) toplcdOff(); #endif @@ -346,71 +229,38 @@ void boardOff() lcdOff(); SysTick->CTRL = 0; // turn off systick pwrOff(); -} -uint8_t currentTrainerMode = 0xff; + // disable interrupts + __disable_irq(); -void checkTrainerSettings() -{ - uint8_t requiredTrainerMode = g_model.trainerData.mode; - if (requiredTrainerMode != currentTrainerMode) { - switch (currentTrainerMode) { - case TRAINER_MODE_MASTER_TRAINER_JACK: - stop_trainer_capture(); - break; - case TRAINER_MODE_SLAVE: - stop_trainer_ppm(); - break; - case TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE: - stop_trainer_module_cppm(); - break; - case TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE: - stop_trainer_module_sbus(); - break; -#if defined(TRAINER_BATTERY_COMPARTMENT) - case TRAINER_MODE_MASTER_BATTERY_COMPARTMENT: - auxSerialStop(); - break; -#endif + while (1) { + wdt_reset(); +#if defined(PWR_BUTTON_PRESS) + // X9E/X7 needs watchdog reset because CPU is still running while + // the power key is held pressed by the user. + // The power key should be released by now, but we must make sure + if (!pwrPressed()) { + // Put the CPU into sleep to reduce the consumption, + // it might help with the RTC reset issue + PWR->CR |= PWR_CR_CWUF; + /* Select STANDBY mode */ + PWR->CR |= PWR_CR_PDDS; + /* Set SLEEPDEEP bit of Cortex System Control Register */ + SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; + /* Request Wait For Event */ + __WFE(); } - - currentTrainerMode = requiredTrainerMode; - switch (requiredTrainerMode) { - case TRAINER_MODE_SLAVE: - init_trainer_ppm(); - break; - case TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE: - init_trainer_module_cppm(); - break; - case TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE: - init_trainer_module_sbus(); - break; -#if defined(TRAINER_BATTERY_COMPARTMENT) - case TRAINER_MODE_MASTER_BATTERY_COMPARTMENT: - if (g_eeGeneral.auxSerialMode == UART_MODE_SBUS_TRAINER) { - auxSerialSbusInit(); - break; - } - // no break #endif - default: - // master is default - init_trainer_capture(); - break; - } - - if (requiredTrainerMode == TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE || requiredTrainerMode == TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE) - stop_intmodule_heartbeat(); - else - init_intmodule_heartbeat(); } + + // this function must not return! } uint16_t getBatteryVoltage() { int32_t instant_vbat = anaIn(TX_VOLTAGE); // using filtered ADC value on purpose instant_vbat = (instant_vbat * BATT_SCALE * (128 + g_eeGeneral.txVoltageCalibration) ) / 26214; - instant_vbat += 20; // add 0.2V because of the diode TODO check if this is needed, but removal will beak existing calibrations!!! + instant_vbat += 20; // add 0.2V because of the diode TODO check if this is needed, but removal will break existing calibrations! return (uint16_t)instant_vbat; } diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index 671677dfc..f50030bca 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -23,81 +23,15 @@ #include #include "../definitions.h" -#include "cpu_id.h" - -#if defined(__cplusplus) && !defined(SIMU) -extern "C" { -#endif - -#if __clang__ -// clang is very picky about the use of "register" -// tell it to ignore for the STM32 includes instead of modyfing the orginal files -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-register" -#endif - -#if defined(STM32F4) - #include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h" - #include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_rcc.h" - #include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_syscfg.h" - #include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_gpio.h" - #include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_exti.h" - #include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_tim.h" - #include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_adc.h" - #include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_spi.h" - #include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_i2c.h" - #include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_rtc.h" - #include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_pwr.h" - #include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_dma.h" - #include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_usart.h" - #include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_flash.h" - #include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_dbgmcu.h" - #include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/misc.h" -#else - #include "STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/CMSIS/Device/ST/STM32F2xx/Include/stm32f2xx.h" - #include "STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/inc/stm32f2xx_rcc.h" - #include "STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/inc/stm32f2xx_syscfg.h" - #include "STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/inc/stm32f2xx_gpio.h" - #include "STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/inc/stm32f2xx_exti.h" - #include "STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/inc/stm32f2xx_tim.h" - #include "STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/inc/stm32f2xx_adc.h" - #include "STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/inc/stm32f2xx_spi.h" - #include "STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/inc/stm32f2xx_i2c.h" - #include "STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/inc/stm32f2xx_rtc.h" - #include "STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/inc/stm32f2xx_pwr.h" - #include "STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/inc/stm32f2xx_dma.h" - #include "STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/inc/stm32f2xx_usart.h" - #include "STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/inc/stm32f2xx_flash.h" - #include "STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/inc/stm32f2xx_dbgmcu.h" - #include "STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/inc/misc.h" -#endif - -#if __clang__ -// Restore warnings about registers -#pragma clang diagnostic pop -#endif - -#include "usb_driver.h" -#if !defined(SIMU) - #include "usbd_cdc_core.h" - #include "usbd_msc_core.h" - #include "usbd_hid_core.h" - #include "usbd_usr.h" - #include "usbd_desc.h" - #include "usb_conf.h" - #include "usbd_conf.h" -#endif - +#include "../opentx_constants.h" +#include "board_common.h" #include "hal.h" -#if defined(__cplusplus) && !defined(SIMU) -} -#endif #if defined(ROTARY_ENCODER_NAVIGATION) // Rotary Encoder driver -void rotaryEncoderInit(void); -void rotaryEncoderCheck(void); +void rotaryEncoderInit(); +void rotaryEncoderCheck(); #endif #define FLASHSIZE 0x80000 @@ -120,27 +54,18 @@ void rotaryEncoderCheck(void); extern uint16_t sessionTimer; // Board driver -void boardPreInit(void); -void boardInit(void); -void boardOff(void); +void boardInit(); +void boardOff(); -// Delays driver -#ifdef __cplusplus -extern "C" { -#endif -void delaysInit(void); -void delay_01us(uint16_t nb); -void delay_us(uint16_t nb); -void delay_ms(uint32_t ms); -#ifdef __cplusplus -} -#endif +// Timers driver +void init2MhzTimer(); +void init5msTimer(); // SD driver #define BLOCK_SIZE 512 /* Block Size in Bytes */ #if !defined(SIMU) || defined(SIMU_DISKIO) -uint32_t sdIsHC(void); -uint32_t sdGetSpeed(void); +uint32_t sdIsHC(); +uint32_t sdGetSpeed(); #define SD_IS_HC() (sdIsHC()) #define SD_GET_SPEED() (sdGetSpeed()) #define SD_GET_FREE_BLOCKNR() (sdGetFreeSectors()) @@ -158,18 +83,18 @@ uint32_t sdGetSpeed(void); #define sdMount() #define SD_CARD_PRESENT() true #else -void sdInit(void); -void sdMount(void); -void sdDone(void); -void sdPoll10ms(void); -uint32_t sdMounted(void); +void sdInit(); +void sdMount(); +void sdDone(); +void sdPoll10ms(); +uint32_t sdMounted(); #define SD_CARD_PRESENT() ((SD_GPIO_PRESENT_GPIO->IDR & SD_GPIO_PRESENT_GPIO_PIN) == 0) #endif // Flash Write driver #define FLASH_PAGESIZE 256 -void unlockFlash(void); -void lockFlash(void); +void unlockFlash(); +void lockFlash(); void flashWrite(uint32_t * address, uint32_t * buffer); uint32_t isFirmwareStart(const uint8_t * buffer); uint32_t isBootloaderStart(const uint8_t * buffer); @@ -196,29 +121,11 @@ uint32_t isBootloaderStart(const uint8_t * buffer); #define IS_INTERNAL_MODULE_ON() (GPIO_ReadInputDataBit(INTMODULE_PWR_GPIO, INTMODULE_PWR_GPIO_PIN) == Bit_SET) #endif -void init_ppm(uint8_t module); -void disable_ppm(uint8_t module); -void init_pxx2(uint8_t module); -void disable_pxx2(uint8_t module); -void init_pxx1_pulses(uint8_t module); -void init_pxx1_serial(uint8_t module); -void disable_pxx1_pulses(uint8_t module); -void disable_pxx1_serial(uint8_t module); -void disable_serial(uint8_t module); -void intmoduleStop(); -void intmodulePxxStart(); void intmoduleSerialStart(uint32_t baudrate, uint8_t rxEnable); -#if defined(INTERNAL_MODULE_PPM) -void intmodulePpmStart(void); -#endif +void intmoduleSendByte(uint8_t byte); void intmoduleSendBuffer(const uint8_t * data, uint8_t size); void intmoduleSendNextFrame(); -void extmoduleStop(); -void extmodulePpmStart(); -void extmodulePxxPulsesStart(); -void extmodulePxxSerialStart(); -void extmodulePxx2Start(); void extmoduleSerialStart(uint32_t baudrate, uint32_t period_half_us, bool inverted); void extmoduleInvertedSerialStart(uint32_t baudrate); void extmoduleSendBuffer(const uint8_t * data, uint8_t size); @@ -226,11 +133,12 @@ void extmoduleSendNextFrame(); // Trainer driver #define SLAVE_MODE() (g_model.trainerData.mode == TRAINER_MODE_SLAVE) -#if defined(PCBX9E) - #define TRAINER_CONNECTED() (true) -#elif defined(PCBX7) || defined(PCBX9LITE) - #define TRAINER_CONNECTED() (GPIO_ReadInputDataBit(TRAINER_DETECT_GPIO, TRAINER_DETECT_GPIO_PIN) == Bit_SET) + +#if defined(PCBX9D) || (defined(PCBX9DP) && PCBREV < 2019) + // Trainer detect is a switch on the jack + #define TRAINER_CONNECTED() (GPIO_ReadInputDataBit(TRAINER_DETECT_GPIO, TRAINER_DETECT_GPIO_PIN) == Bit_RESET) #elif defined(PCBXLITES) + // Trainer is on the same connector than Headphones enum JackState { SPEAKER_ACTIVE, @@ -240,15 +148,18 @@ void extmoduleSendNextFrame(); extern uint8_t jackState; #define TRAINER_CONNECTED() (jackState == TRAINER_ACTIVE) #elif defined(PCBXLITE) - #define TRAINER_CONNECTED() false // there is no Trainer jack on Taranis X-Lite + // No Tainer jack on Taranis X-Lite + #define TRAINER_CONNECTED() false #else - #define TRAINER_CONNECTED() (GPIO_ReadInputDataBit(TRAINER_DETECT_GPIO, TRAINER_DETECT_GPIO_PIN) == Bit_RESET) + // Trainer detect catches PPM, detection would use more CPU + #define TRAINER_CONNECTED() true #endif + #if defined(TRAINER_GPIO) - void init_trainer_ppm(void); - void stop_trainer_ppm(void); - void init_trainer_capture(void); - void stop_trainer_capture(void); + void init_trainer_ppm(); + void stop_trainer_ppm(); + void init_trainer_capture(); + void stop_trainer_capture(); #else #define init_trainer_ppm() #define stop_trainer_ppm() @@ -256,15 +167,15 @@ void extmoduleSendNextFrame(); #define stop_trainer_capture() #endif #if defined(TRAINER_MODULE_CPPM) - void init_trainer_module_cppm(void); - void stop_trainer_module_cppm(void); + void init_trainer_module_cppm(); + void stop_trainer_module_cppm(); #else #define init_trainer_module_cppm() #define stop_trainer_module_cppm() #endif #if defined(TRAINER_MODULE_SBUS) - void init_trainer_module_sbus(void); - void stop_trainer_module_sbus(void); + void init_trainer_module_sbus(); + void stop_trainer_module_sbus(); #else #define init_trainer_module_sbus() #define stop_trainer_module_sbus() @@ -273,11 +184,11 @@ void extmoduleSendNextFrame(); #if defined(INTMODULE_HEARTBEAT_GPIO) void init_intmodule_heartbeat(); void stop_intmodule_heartbeat(); -void check_xjt_heartbeat(); +void check_intmodule_heartbeat(); #else #define init_intmodule_heartbeat() #define stop_intmodule_heartbeat() -#define check_xjt_heartbeat() +#define check_intmodule_heartbeat() #endif // SBUS @@ -324,7 +235,6 @@ enum EnumKeys KEY_MINUS, #endif - TRM_BASE, TRM_LH_DWN = TRM_BASE, TRM_LH_UP, @@ -360,7 +270,11 @@ enum EnumKeys #if defined(KEYS_GPIO_PIN_SHIFT) #define IS_SHIFT_KEY(index) (index == KEY_SHIFT) +#if defined(SIMU) +#define IS_SHIFT_PRESSED() (readKeys() & (1 << KEY_SHIFT)) +#else #define IS_SHIFT_PRESSED() (~KEYS_GPIO_REG_SHIFT & KEYS_GPIO_PIN_SHIFT) +#endif #else #define IS_SHIFT_KEY(index) (false) #define IS_SHIFT_PRESSED() (false) @@ -390,17 +304,15 @@ enum EnumSwitchesPositions SW_SC0, SW_SC1, SW_SC2, -#if !defined(PCBX9LITE) SW_SD0, SW_SD1, SW_SD2, -#endif #if defined(PCBX9) || defined(PCBXLITES) SW_SE0, SW_SE1, SW_SE2, #endif -#if defined(PCBX9) || defined(PCBX7) || defined(PCBXLITES) +#if defined(PCBX9D) || defined(PCBX9DP) || defined(PCBX9E) || defined(PCBX7) || defined(PCBXLITES) SW_SF0, SW_SF1, SW_SF2, @@ -415,6 +327,11 @@ enum EnumSwitchesPositions SW_SH1, SW_SH2, #endif +#if defined(PCBX9DP) && PCBREV >= 2019 + SW_SI0, + SW_SI1, + SW_SI2, +#endif #if defined(PCBX7) SW_SI0, SW_SI1, @@ -461,34 +378,54 @@ enum EnumSwitchesPositions #if defined(PCBXLITES) #define NUM_SWITCHES 6 #define STORAGE_NUM_SWITCHES NUM_SWITCHES + #define DEFAULT_SWITCH_CONFIG (SWITCH_TOGGLE << 10) + (SWITCH_TOGGLE << 8) + (SWITCH_2POS << 6) + (SWITCH_2POS << 4) + (SWITCH_3POS << 2) + (SWITCH_3POS << 0) + #define DEFAULT_POTS_CONFIG (POT_WITHOUT_DETENT << 2) + (POT_WITHOUT_DETENT << 0) #elif defined(PCBXLITE) #define NUM_SWITCHES 4 #define STORAGE_NUM_SWITCHES 6 -#elif defined(PCBT12) - #define NUM_SWITCHES 6 - #define STORAGE_NUM_SWITCHES 8 + #define DEFAULT_SWITCH_CONFIG (SWITCH_2POS << 6) + (SWITCH_2POS << 4) + (SWITCH_3POS << 2) + (SWITCH_3POS << 0); + #define DEFAULT_POTS_CONFIG (POT_WITHOUT_DETENT << 2) + (POT_WITHOUT_DETENT << 0) +#elif defined(RADIO_T12) + #define NUM_SWITCHES 8 + #define STORAGE_NUM_SWITCHES NUM_SWITCHES + #define DEFAULT_SWITCH_CONFIG (SWITCH_2POS << 10) + (SWITCH_2POS << 8) + (SWITCH_3POS << 6) + (SWITCH_3POS << 4) + (SWITCH_3POS << 2) + (SWITCH_3POS << 0) + #define DEFAULT_POTS_CONFIG (POT_WITHOUT_DETENT << 0) + (POT_WITHOUT_DETENT << 2); // S1 = pot without detent, S2 = pot with detent #elif defined(PCBX7) #define NUM_SWITCHES 8 #define STORAGE_NUM_SWITCHES NUM_SWITCHES + #define DEFAULT_SWITCH_CONFIG (SWITCH_TOGGLE << 10) + (SWITCH_2POS << 8) + (SWITCH_3POS << 6) + (SWITCH_3POS << 4) + (SWITCH_3POS << 2) + (SWITCH_3POS << 0) + #define DEFAULT_POTS_CONFIG (POT_WITHOUT_DETENT << 0) + (POT_WITH_DETENT << 2); // S1 = pot without detent, S2 = pot with detent #elif defined(PCBX9LITE) #define NUM_SWITCHES 5 #define STORAGE_NUM_SWITCHES NUM_SWITCHES + #define DEFAULT_SWITCH_CONFIG (SWITCH_TOGGLE << 8) + (SWITCH_2POS << 6) + (SWITCH_3POS << 4) + (SWITCH_3POS << 2) + (SWITCH_3POS << 0); + #define DEFAULT_POTS_CONFIG (POT_WITH_DETENT << 0); // S1 = pot with detent #elif defined(PCBX9E) #define NUM_SWITCHES 18 // yes, it's perfect like that ! #define STORAGE_NUM_SWITCHES NUM_SWITCHES -#else - #define NUM_SWITCHES 8 + #define DEFAULT_SWITCH_CONFIG (SWITCH_TOGGLE << 14) + (SWITCH_3POS << 12) + (SWITCH_2POS << 10) + (SWITCH_3POS << 8) + (SWITCH_3POS << 6) + (SWITCH_3POS << 4) + (SWITCH_3POS << 2) + (SWITCH_3POS << 0) + #define DEFAULT_POTS_CONFIG (POT_WITH_DETENT << 0) + (POT_WITH_DETENT << 2); // S1 = pot without detent, S2 = pot with detent + #define DEFAULT_SLIDERS_CONFIG (SLIDER_WITH_DETENT << 1) + (SLIDER_WITH_DETENT << 0) +#elif defined(PCBX9DP) && PCBREV >= 2019 + #define NUM_SWITCHES 9 #define STORAGE_NUM_SWITCHES NUM_SWITCHES + #define DEFAULT_SWITCH_CONFIG (SWITCH_TOGGLE << 16) + (SWITCH_TOGGLE << 14) + (SWITCH_3POS << 12) + (SWITCH_2POS << 10) + (SWITCH_3POS << 8) + (SWITCH_3POS << 6) + (SWITCH_3POS << 4) + (SWITCH_3POS << 2) + (SWITCH_3POS << 0); + #define DEFAULT_POTS_CONFIG (POT_WITH_DETENT << 0) + (POT_WITH_DETENT << 2); // S1 = pot without detent, S2 = pot with detent + #define DEFAULT_SLIDERS_CONFIG (SLIDER_WITH_DETENT << 1) + (SLIDER_WITH_DETENT << 0) +#elif defined(PCBX9D) || defined(PCBX9DP) + #define NUM_SWITCHES 8 + #define STORAGE_NUM_SWITCHES 9 + #define DEFAULT_SWITCH_CONFIG (SWITCH_TOGGLE << 14) + (SWITCH_3POS << 12) + (SWITCH_2POS << 10) + (SWITCH_3POS << 8) + (SWITCH_3POS << 6) + (SWITCH_3POS << 4) + (SWITCH_3POS << 2) + (SWITCH_3POS << 0) + #define DEFAULT_POTS_CONFIG (POT_WITH_DETENT << 0) + (POT_WITH_DETENT << 2); // S1 = pot without detent, S2 = pot with detent + #define DEFAULT_SLIDERS_CONFIG (SLIDER_WITH_DETENT << 1) + (SLIDER_WITH_DETENT << 0) #endif #define STORAGE_NUM_SWITCHES_POSITIONS (STORAGE_NUM_SWITCHES * 3) -#define NUM_SWITCHES_POSITIONS (NUM_SWITCHES * 3) -void keysInit(void); -uint8_t keyState(uint8_t index); +void keysInit(); uint32_t switchState(uint8_t index); -uint32_t readKeys(void); -uint32_t readTrims(void); +uint32_t readKeys(); +uint32_t readTrims(); #define TRIMS_PRESSED() (readTrims()) #define KEYS_PRESSED() (readKeys()) @@ -501,7 +438,6 @@ uint32_t readTrims(void); #define wdt_enable(x) watchdogInit(x) #define wdt_reset() IWDG->KR = 0xAAAA #endif -#define wdt_disable() void watchdogInit(unsigned int duration); #define WAS_RESET_BY_SOFTWARE() (RCC->CSR & RCC_CSR_SFTRSTF) #define WAS_RESET_BY_WATCHDOG() (RCC->CSR & (RCC_CSR_WDGRSTF | RCC_CSR_WWDGRSTF)) @@ -537,15 +473,33 @@ enum Analogs { SLIDER2, #endif TX_VOLTAGE, - NUM_ANALOGS, - TX_RTC = NUM_ANALOGS + TX_RTC_VOLTAGE, + NUM_ANALOGS }; -#define NUM_POTS (POT_LAST-POT_FIRST+1) +#if defined(PCBX9LITE) + #define NUM_POTS 1 + #define NUM_SLIDERS 0 + #define STORAGE_NUM_POTS 1 + #define STORAGE_NUM_SLIDERS 0 +#elif defined(PCBXLITE) || defined(PCBX7) + #define NUM_POTS 2 + #define NUM_SLIDERS 0 + #define STORAGE_NUM_POTS 2 + #define STORAGE_NUM_SLIDERS 0 +#elif defined(PCBX9E) + #define NUM_POTS 4 + #define NUM_SLIDERS 4 + #define STORAGE_NUM_POTS 4 + #define STORAGE_NUM_SLIDERS 4 +#else + #define NUM_POTS 3 + #define NUM_SLIDERS 2 + #define STORAGE_NUM_POTS 3 + #define STORAGE_NUM_SLIDERS 2 +#endif + #define NUM_XPOTS NUM_POTS -#define STORAGE_NUM_POTS NUM_POTS -#define NUM_SLIDERS (TX_VOLTAGE-POT_LAST-1) -#define STORAGE_NUM_SLIDERS NUM_SLIDERS #define NUM_TRIMS 4 #define NUM_MOUSE_ANALOGS 0 #define STORAGE_NUM_MOUSE_ANALOGS 0 @@ -553,7 +507,7 @@ enum Analogs { #if defined(STICKS_PWM) #define NUM_PWMSTICKS 4 #define STICKS_PWM_ENABLED() (!hardwareOptions.sticksPwmDisabled) - void sticksPwmInit(void); + void sticksPwmInit(); void sticksPwmRead(uint16_t * values); extern volatile uint32_t pwm_interrupt_count; // TODO => reusable buffer (boot section) #define NUM_TRIMS_KEYS 4 @@ -581,6 +535,9 @@ extern HardwareOptions hardwareOptions; #elif !defined(PXX1) || defined(PCBXLITES) || defined(PCBX9LITE) #define IS_PXX2_INTERNAL_ENABLED() (true) #define IS_PXX1_INTERNAL_ENABLED() (false) +#elif defined(INTERNAL_MODULE_PXX1) + #define IS_PXX2_INTERNAL_ENABLED() (false) + #define IS_PXX1_INTERNAL_ENABLED() (true) #else // TODO #define PXX2_PROBE // TODO #define IS_PXX2_INTERNAL_ENABLED() (hardwareOptions.pxx2Enabled) @@ -608,14 +565,9 @@ enum CalibratedAnalogs { #define IS_SLIDER(x) ((x)>POT_LAST && (x)= 2019 + #define BATT_SCALE 117 #else #define BATT_SCALE 150 #endif @@ -648,15 +603,16 @@ extern "C" { // Power driver #define SOFT_PWR_CTRL -void pwrInit(void); -uint32_t pwrCheck(void); -void pwrOn(void); -void pwrOff(void); -uint32_t pwrPressed(void); +void pwrInit(); +uint32_t pwrCheck(); +void pwrOn(); +void pwrOff(); +bool pwrPressed(); #if defined(PWR_BUTTON_PRESS) -uint32_t pwrPressedDuration(void); +#define STARTUP_ANIMATION +uint32_t pwrPressedDuration(); #endif -void pwrResetHandler(void); +void pwrResetHandler(); #if defined(SIMU) #define UNEXPECTED_SHUTDOWN() false @@ -665,10 +621,10 @@ void pwrResetHandler(void); #endif // Backlight driver -void backlightInit(void); -void backlightDisable(void); +void backlightInit(); +void backlightDisable(); #define BACKLIGHT_DISABLE() backlightDisable() -uint8_t isBacklightEnabled(void); +uint8_t isBacklightEnabled(); #if defined(PCBX9E) || defined(PCBX9DP) void backlightEnable(uint8_t level, uint8_t color); #define BACKLIGHT_ENABLE() backlightEnable(g_eeGeneral.backlightBright, g_eeGeneral.backlightColor) @@ -691,7 +647,7 @@ uint8_t isBacklightEnabled(void); // I2C driver: EEPROM + Audio Volume #define EEPROM_SIZE (32*1024) -void i2cInit(void); +void i2cInit(); void eepromReadBlock(uint8_t * buffer, size_t address, size_t size); void eepromStartWrite(uint8_t * buffer, size_t address, size_t size); uint8_t eepromIsTransferComplete(); @@ -701,29 +657,31 @@ void debugPutc(const char c); // Telemetry driver void telemetryPortInit(uint32_t baudrate, uint8_t mode); -void telemetryPortSetDirectionInput(void); -void telemetryPortSetDirectionOutput(void); +void telemetryPortSetDirectionInput(); +void telemetryPortSetDirectionOutput(); void sportSendByte(uint8_t byte); +void sportSendByteLoop(uint8_t byte); +void sportStopSendByteLoop(); void sportSendBuffer(const uint8_t * buffer, uint32_t count); uint8_t telemetryGetByte(uint8_t * byte); void telemetryClearFifo(); extern uint32_t telemetryErrors; // PCBREV driver -#if defined(PCBXLITE) || defined(PCBX9LITE) - #define HAS_SPORT_UPDATE_CONNECTOR() true -#elif defined(PCBX7) +#if defined(PCBX7) #define IS_PCBREV_40() (GPIO_ReadInputDataBit(PCBREV_GPIO, PCBREV_GPIO_PIN) == Bit_SET) #define HAS_SPORT_UPDATE_CONNECTOR() IS_PCBREV_40() +#elif defined(SPORT_UPDATE_PWR_GPIO) + #define HAS_SPORT_UPDATE_CONNECTOR() true #else #define HAS_SPORT_UPDATE_CONNECTOR() false #endif // Sport update driver #if defined(SPORT_UPDATE_PWR_GPIO) -void sportUpdateInit(void); -void sportUpdatePowerOn(void); -void sportUpdatePowerOff(void); +void sportUpdateInit(); +void sportUpdatePowerOn(); +void sportUpdatePowerOff(); #define SPORT_UPDATE_POWER_ON() sportUpdatePowerOn() #define SPORT_UPDATE_POWER_OFF() sportUpdatePowerOff() #else @@ -733,38 +691,38 @@ void sportUpdatePowerOff(void); #endif // Audio driver -void audioInit(void) ; -void audioEnd(void) ; -void dacStart(void); -void dacStop(void); +void audioInit() ; +void audioEnd() ; +void dacStart(); +void dacStop(); void setSampleRate(uint32_t frequency); #define VOLUME_LEVEL_MAX 23 #define VOLUME_LEVEL_DEF 12 #if !defined(SOFTWARE_VOLUME) void setScaledVolume(uint8_t volume); void setVolume(uint8_t volume); -int32_t getVolume(void); +int32_t getVolume(); #endif #if defined(AUDIO_SPEAKER_ENABLE_GPIO) -void initSpeakerEnable(void); +void initSpeakerEnable(); void enableSpeaker(); void disableSpeaker(); #else -static inline void initSpeakerEnable(void) { } -static inline void enableSpeaker(void) { } -static inline void disableSpeaker(void) { } +static inline void initSpeakerEnable() { } +static inline void enableSpeaker() { } +static inline void disableSpeaker() { } #endif #if defined(HEADPHONE_TRAINER_SWITCH_GPIO) -void initHeadphoneTrainerSwitch(void); -void enableHeadphone(void); -void enableTrainer(void); +void initHeadphoneTrainerSwitch(); +void enableHeadphone(); +void enableTrainer(); #else -static inline void initHeadphoneTrainerSwitch(void) { } -static inline void enableHeadphone(void) { } -static inline void enableTrainer(void) { } +static inline void initHeadphoneTrainerSwitch() { } +static inline void enableHeadphone() { } +static inline void enableTrainer() { } #endif #if defined(JACK_DETECT_GPIO) -void initJackDetect(void); +void initJackDetect(); bool isJackPlugged(); #endif void audioConsumeCurrentBuffer(); @@ -772,12 +730,12 @@ void audioConsumeCurrentBuffer(); #define audioEnableIrq() __enable_irq() // Haptic driver -void hapticInit(void); -void hapticOff(void); +void hapticInit(); +void hapticOff(); #if defined(HAPTIC_PWM) void hapticOn(uint32_t pwmPercent); #else - void hapticOn(void); + void hapticOn(); #endif // Second serial port driver @@ -788,14 +746,14 @@ extern uint8_t auxSerialMode; void auxSerialInit(unsigned int mode, unsigned int protocol); void auxSerialPutc(char c); #define auxSerialTelemetryInit(protocol) auxSerialInit(UART_MODE_TELEMETRY, protocol) -void auxSerialSbusInit(void); -void auxSerialStop(void); +void auxSerialSbusInit(); +void auxSerialStop(); #endif // BT driver #define BLUETOOTH_BOOTLOADER_BAUDRATE 230400 #define BLUETOOTH_DEFAULT_BAUDRATE 115200 -#if defined(PCBX9E) && !defined(USEHORUSBT) +#if defined(PCBX9E) #define BLUETOOTH_FACTORY_BAUDRATE 9600 #else #define BLUETOOTH_FACTORY_BAUDRATE 57600 @@ -803,9 +761,9 @@ void auxSerialStop(void); #define BT_TX_FIFO_SIZE 64 #define BT_RX_FIFO_SIZE 128 void bluetoothInit(uint32_t baudrate, bool enable); -void bluetoothWriteWakeup(void); -uint8_t bluetoothIsWriting(void); -void bluetoothDisable(void); +void bluetoothWriteWakeup(); +uint8_t bluetoothIsWriting(); +void bluetoothDisable(); #if defined(PCBX9LITE) #define IS_BLUETOOTH_CHIP_PRESENT() (false) #elif (defined(PCBX7) || defined(PCBXLITE)) && !defined(SIMU) @@ -816,18 +774,17 @@ void bluetoothDisable(void); #endif // LED driver -void ledInit(void); -void ledOff(void); -void ledRed(void); -void ledGreen(void); -void ledBlue(void); +void ledInit(); +void ledOff(); +void ledRed(); +void ledGreen(); +void ledBlue(); // LCD driver #if defined(PCBX9D) || defined(PCBX9DP) || defined(PCBX9E) #define LCD_W 212 #define LCD_H 64 #define LCD_DEPTH 4 -#define IS_LCD_RESET_NEEDED() (!WAS_RESET_BY_WATCHDOG_OR_SOFTWARE()) #define LCD_CONTRAST_MIN 0 #define LCD_CONTRAST_MAX 45 #define LCD_CONTRAST_DEFAULT 25 @@ -840,9 +797,16 @@ void ledBlue(void); #define LCD_CONTRAST_MAX 30 #define LCD_CONTRAST_DEFAULT 20 #endif -void lcdInit(void); -void lcdInitFinish(void); -void lcdOff(void); + +#if defined(PCBX9D) || defined(PCBX9E) || (defined(PCBX9DP) && PCBREV < 2019) +#define IS_LCD_RESET_NEEDED() (!WAS_RESET_BY_WATCHDOG_OR_SOFTWARE()) +#else +#define IS_LCD_RESET_NEEDED() true +#endif + +void lcdInit(); +void lcdInitFinish(); +void lcdOff(); // TODO lcdRefreshWait() stub in simpgmspace and remove LCD_DUAL_BUFFER #if defined(LCD_DMA) && !defined(LCD_DUAL_BUFFER) && !defined(SIMU) @@ -851,19 +815,19 @@ void lcdRefreshWait(); #define lcdRefreshWait() #endif #if defined(PCBX9D) || defined(SIMU) || !defined(__cplusplus) -void lcdRefresh(void); +void lcdRefresh(); #else void lcdRefresh(bool wait=true); // TODO uint8_t wait to simplify this #endif void lcdSetRefVolt(unsigned char val); -void lcdSetContrast(void); +void lcdSetContrast(); // Top LCD driver #if defined(TOPLCD_GPIO) -void toplcdInit(void); -void toplcdOff(void); -void toplcdRefreshStart(void); -void toplcdRefreshEnd(void); +void toplcdInit(); +void toplcdOff(); +void toplcdRefreshStart(); +void toplcdRefreshEnd(); void setTopFirstTimer(int32_t value); void setTopSecondTimer(uint32_t value); void setTopRssi(uint32_t rssi); @@ -873,9 +837,6 @@ void setTopBatteryValue(uint32_t volts); #define USART_FLAG_ERRORS (USART_FLAG_ORE | USART_FLAG_NE | USART_FLAG_FE | USART_FLAG_PE) -extern uint8_t currentTrainerMode; -void checkTrainerSettings(void); - #if defined(__cplusplus) #include "fifo.h" #include "dmafifo.h" diff --git a/radio/src/targets/taranis/bootloader/boot_menu.cpp b/radio/src/targets/taranis/bootloader/boot_menu.cpp index 09261ab7d..4a2eb1497 100644 --- a/radio/src/targets/taranis/bootloader/boot_menu.cpp +++ b/radio/src/targets/taranis/bootloader/boot_menu.cpp @@ -25,8 +25,8 @@ void bootloaderDrawScreen(BootloaderState st, int opt, const char *str) if (st == ST_START) { lcdDrawTextAlignedLeft(2*FH, "\010Write Firmware"); - lcdDrawTextAlignedLeft(3 * FH, "\010Restore EEPROM"); - lcdDrawTextAlignedLeft(4 * FH, "\010Exit"); + lcdDrawTextAlignedLeft(3*FH, "\010Restore EEPROM"); + lcdDrawTextAlignedLeft(4*FH, "\010Exit"); #if LCD_W >= 212 lcdDrawTextAlignedLeft(6*FH, "\001Curr FW:"); @@ -58,20 +58,21 @@ void bootloaderDrawScreen(BootloaderState st, int opt, const char *str) } else if (st == ST_FLASH_CHECK) { if (opt == FC_ERROR) { - if (memoryType == MEM_FLASH) bootloaderDrawMsg(0, STR_INVALID_FIRMWARE, 2, false); else bootloaderDrawMsg(0, STR_INVALID_EEPROM, 2, false); } else if (opt == FC_OK) { - const char *vers = getOtherVersion((char *) Block_buffer); + if (memoryType == MEM_FLASH) { + const char * vers = getOtherVersion((char *) Block_buffer); #if LCD_W < 212 - // Remove opentx- from string - if (strstr(vers, "opentx-")) - vers = vers + 7; + // Remove opentx- from string + if (strstr(vers, "opentx-")) + vers = vers + 7; #endif - bootloaderDrawMsg(INDENT_WIDTH, vers, 0, false); + bootloaderDrawMsg(INDENT_WIDTH, vers, 0, false); + } bootloaderDrawMsg(0, STR_HOLD_ENTER_TO_START, 2, false); } } diff --git a/radio/src/targets/taranis/extmodule_driver.cpp b/radio/src/targets/taranis/extmodule_driver.cpp index 6ac0b65d2..3ab23f3e9 100644 --- a/radio/src/targets/taranis/extmodule_driver.cpp +++ b/radio/src/targets/taranis/extmodule_driver.cpp @@ -27,8 +27,7 @@ void extmoduleStop() EXTMODULE_TIMER_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA #if defined(EXTMODULE_USART) - NVIC_DisableIRQ(EXTMODULE_USART_DMA_STREAM_IRQn); - EXTMODULE_USART_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA + EXTMODULE_USART_TX_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = EXTMODULE_TX_GPIO_PIN | EXTMODULE_RX_GPIO_PIN; @@ -65,17 +64,16 @@ void extmodulePpmStart() EXTMODULE_TIMER->CR1 &= ~TIM_CR1_CEN; EXTMODULE_TIMER->PSC = EXTMODULE_TIMER_FREQ / 2000000 - 1; // 0.5uS from 30MHz - EXTMODULE_TIMER->ARR = 45000; EXTMODULE_TIMER->CCR1 = GET_MODULE_PPM_DELAY(EXTERNAL_MODULE)*2; EXTMODULE_TIMER->CCER = EXTMODULE_TIMER_OUTPUT_ENABLE | (GET_MODULE_PPM_POLARITY(EXTERNAL_MODULE) ? EXTMODULE_TIMER_OUTPUT_POLARITY : 0); // // we are using complementary output so logic has to be reversed here EXTMODULE_TIMER->BDTR = TIM_BDTR_MOE; EXTMODULE_TIMER->CCMR1 = TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_0; // Force O/P high EXTMODULE_TIMER->EGR = 1; - EXTMODULE_TIMER->DIER |= TIM_DIER_UDE; EXTMODULE_TIMER->CCMR1 = TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC2PE; // PWM mode 1 EXTMODULE_TIMER->SR &= ~TIM_SR_CC2IF; // Clear flag + EXTMODULE_TIMER->ARR = 45000; EXTMODULE_TIMER->CCR2 = 40000; // The first frame will be sent in 20ms - EXTMODULE_TIMER->DIER |= TIM_DIER_CC2IE; // Enable this interrupt + EXTMODULE_TIMER->DIER |= TIM_DIER_UDE | TIM_DIER_CC2IE; EXTMODULE_TIMER->CR1 |= TIM_CR1_CEN; NVIC_EnableIRQ(EXTMODULE_TIMER_DMA_STREAM_IRQn); @@ -100,17 +98,16 @@ void extmoduleSerialStart(uint32_t /*baudrate*/, uint32_t period_half_us, bool i EXTMODULE_TIMER->CR1 &= ~TIM_CR1_CEN; EXTMODULE_TIMER->PSC = EXTMODULE_TIMER_FREQ / 2000000 - 1; // 0.5uS from 30MHz - EXTMODULE_TIMER->ARR = period_half_us; EXTMODULE_TIMER->CCER = EXTMODULE_TIMER_OUTPUT_ENABLE | (inverted ? 0 : EXTMODULE_TIMER_OUTPUT_POLARITY); EXTMODULE_TIMER->BDTR = TIM_BDTR_MOE; // Enable outputs EXTMODULE_TIMER->CCR1 = 0; EXTMODULE_TIMER->CCMR1 = TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_0; // Force O/P high EXTMODULE_TIMER->EGR = 1; // Restart - EXTMODULE_TIMER->DIER |= TIM_DIER_UDE; // Enable DMA on update EXTMODULE_TIMER->CCMR1 = TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_0; - EXTMODULE_TIMER->SR &= ~TIM_SR_CC2IF; // Clear flag + EXTMODULE_TIMER->ARR = period_half_us; EXTMODULE_TIMER->CCR2 = 40000; // The first frame will be sent in 20ms - EXTMODULE_TIMER->DIER |= TIM_DIER_CC2IE; // Enable this interrupt + EXTMODULE_TIMER->SR &= ~TIM_SR_CC2IF; // Clear flag + EXTMODULE_TIMER->DIER |= TIM_DIER_UDE | TIM_DIER_CC2IE; EXTMODULE_TIMER->CR1 |= TIM_CR1_CEN; NVIC_EnableIRQ(EXTMODULE_TIMER_DMA_STREAM_IRQn); @@ -126,13 +123,6 @@ void extmoduleInvertedSerialStart(uint32_t baudrate) { EXTERNAL_MODULE_ON(); - NVIC_InitTypeDef NVIC_InitStructure; - NVIC_InitStructure.NVIC_IRQChannel = EXTMODULE_USART_DMA_STREAM_IRQn; - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; - NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; /* Not used as 4 bits are used for the pre-emption priority. */; - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; - NVIC_Init(&NVIC_InitStructure); - // TX + RX Pins GPIO_PinAFConfig(EXTMODULE_USART_GPIO, EXTMODULE_TX_GPIO_PinSource, EXTMODULE_USART_GPIO_AF); GPIO_PinAFConfig(EXTMODULE_USART_GPIO, EXTMODULE_RX_GPIO_PinSource, EXTMODULE_USART_GPIO_AF); @@ -167,8 +157,8 @@ void extmoduleInvertedSerialStart(uint32_t baudrate) void extmoduleSendBuffer(const uint8_t * data, uint8_t size) { DMA_InitTypeDef DMA_InitStructure; - DMA_DeInit(EXTMODULE_USART_DMA_STREAM); - DMA_InitStructure.DMA_Channel = EXTMODULE_USART_DMA_CHANNEL; + DMA_DeInit(EXTMODULE_USART_TX_DMA_STREAM); + DMA_InitStructure.DMA_Channel = EXTMODULE_USART_TX_DMA_CHANNEL; DMA_InitStructure.DMA_PeripheralBaseAddr = CONVERT_PTR_UINT(&EXTMODULE_USART->DR); DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; DMA_InitStructure.DMA_Memory0BaseAddr = CONVERT_PTR_UINT(data); @@ -183,15 +173,11 @@ void extmoduleSendBuffer(const uint8_t * data, uint8_t size) DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full; DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; - DMA_Init(EXTMODULE_USART_DMA_STREAM, &DMA_InitStructure); - DMA_Cmd(EXTMODULE_USART_DMA_STREAM, ENABLE); + DMA_Init(EXTMODULE_USART_TX_DMA_STREAM, &DMA_InitStructure); + DMA_Cmd(EXTMODULE_USART_TX_DMA_STREAM, ENABLE); USART_DMACmd(EXTMODULE_USART, USART_DMAReq_Tx, ENABLE); } -// TODO remove this when we have adaptative speed -//uint8_t counter = 0; -//#include - #define USART_FLAG_ERRORS (USART_FLAG_ORE | USART_FLAG_NE | USART_FLAG_FE | USART_FLAG_PE) extern "C" void EXTMODULE_USART_IRQHandler(void) { @@ -201,9 +187,6 @@ extern "C" void EXTMODULE_USART_IRQHandler(void) uint8_t data = EXTMODULE_USART->DR; if (status & USART_FLAG_ERRORS) { extmoduleFifo.errors++; -// if (!counter++) { -// TRACE_NOCRLF("%02X ", (uint8_t)status); -// } } else { extmoduleFifo.push(data); @@ -211,20 +194,10 @@ extern "C" void EXTMODULE_USART_IRQHandler(void) status = EXTMODULE_USART->SR; } } - -void extmodulePxx2Start() -{ - extmoduleInvertedSerialStart(PXX2_EXTERNAL_MODULE_BAUDRATE); -} -#else -void extmodulePxx2Start() -{ - // TODO just enable the S.PORT line (or let telemetry init do it) -} #endif #if defined(PXX1) -void extmodulePxxPulsesStart() +void extmodulePxx1PulsesStart() { EXTERNAL_MODULE_ON(); @@ -240,17 +213,16 @@ void extmodulePxxPulsesStart() EXTMODULE_TIMER->CR1 &= ~TIM_CR1_CEN; EXTMODULE_TIMER->PSC = EXTMODULE_TIMER_FREQ / 2000000 - 1; // 0.5uS (2Mhz) - EXTMODULE_TIMER->ARR = PXX_PULSES_PERIOD * 2000; // 0.5uS (2Mhz) EXTMODULE_TIMER->CCER = EXTMODULE_TIMER_OUTPUT_ENABLE | EXTMODULE_TIMER_OUTPUT_POLARITY; // polarity, default low EXTMODULE_TIMER->BDTR = TIM_BDTR_MOE; // Enable outputs EXTMODULE_TIMER->CCR1 = 18; EXTMODULE_TIMER->CCMR1 = TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_0; // Force O/P high EXTMODULE_TIMER->EGR = 1; // Restart - EXTMODULE_TIMER->DIER |= TIM_DIER_UDE; // Enable DMA on update EXTMODULE_TIMER->CCMR1 = TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2; - EXTMODULE_TIMER->SR &= ~TIM_SR_CC2IF; // Clear flag + EXTMODULE_TIMER->ARR = 45000; EXTMODULE_TIMER->CCR2 = 40000; // The first frame will be sent in 20ms - EXTMODULE_TIMER->DIER |= TIM_DIER_CC2IE; // Enable this interrupt + EXTMODULE_TIMER->SR &= ~TIM_SR_CC2IF; // Clear flag + EXTMODULE_TIMER->DIER |= TIM_DIER_UDE | TIM_DIER_CC2IE; EXTMODULE_TIMER->CR1 |= TIM_CR1_CEN; NVIC_EnableIRQ(EXTMODULE_TIMER_DMA_STREAM_IRQn); @@ -261,15 +233,15 @@ void extmodulePxxPulsesStart() #endif #if defined(PXX1) && defined(EXTMODULE_USART) -void extmodulePxxSerialStart() +void extmodulePxx1SerialStart() { - extmoduleInvertedSerialStart(EXTMODULE_PXX_SERIAL_BAUDRATE); + extmoduleInvertedSerialStart(EXTMODULE_PXX1_SERIAL_BAUDRATE); } #endif void extmoduleSendNextFrame() { - switch(moduleState[EXTERNAL_MODULE].protocol) { + switch (moduleState[EXTERNAL_MODULE].protocol) { case PROTOCOL_CHANNELS_PPM: EXTMODULE_TIMER->CCR1 = GET_MODULE_PPM_DELAY(EXTERNAL_MODULE) * 2; EXTMODULE_TIMER->CCER = EXTMODULE_TIMER_OUTPUT_ENABLE | (GET_MODULE_PPM_POLARITY(EXTERNAL_MODULE) ? EXTMODULE_TIMER_OUTPUT_POLARITY : 0); // // we are using complementary output so logic has to be reversed here @@ -294,23 +266,20 @@ void extmoduleSendNextFrame() break; #endif -#if defined(PXX1) && defined(EXTMODULE_USART) +#if defined(PXX1) && defined(HARDWARE_EXTERNAL_MODULE_SIZE_SML) case PROTOCOL_CHANNELS_PXX1_SERIAL: extmoduleSendBuffer(extmodulePulsesData.pxx_uart.getData(), extmodulePulsesData.pxx_uart.getSize()); break; #endif #if defined(PXX2) - case PROTOCOL_CHANNELS_PXX2: - #if defined(EXTMODULE_USART) - extmoduleSendBuffer(extmodulePulsesData.pxx2.getData(), extmodulePulsesData.pxx2.getSize()); - #else - sportSendBuffer(extmodulePulsesData.pxx2.getData(), extmodulePulsesData.pxx2.getSize()); - #endif + case PROTOCOL_CHANNELS_PXX2_HIGHSPEED: + case PROTOCOL_CHANNELS_PXX2_LOWSPEED: + extmoduleSendBuffer(extmodulePulsesData.pxx2.getData(), extmodulePulsesData.pxx2.getSize()); break; #endif -#if defined(DSM2) +#if defined(SBUS) || defined(DSM2) || defined(MULTIMODULE) case PROTOCOL_CHANNELS_SBUS: EXTMODULE_TIMER->CCER = EXTMODULE_TIMER_OUTPUT_ENABLE | (GET_SBUS_POLARITY(EXTERNAL_MODULE) ? 0 : EXTMODULE_TIMER_OUTPUT_POLARITY); // reverse polarity for Sbus if needed // no break @@ -355,7 +324,7 @@ extern "C" void EXTMODULE_TIMER_CC_IRQHandler() { EXTMODULE_TIMER->DIER &= ~TIM_DIER_CC2IE; // Stop this interrupt EXTMODULE_TIMER->SR &= ~TIM_SR_CC2IF; - if (setupPulses(EXTERNAL_MODULE)) { + if (setupPulsesExternalModule()) { extmoduleSendNextFrame(); } } diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h index 8c0175408..a4cba3fda 100644 --- a/radio/src/targets/taranis/hal.h +++ b/radio/src/targets/taranis/hal.h @@ -77,6 +77,15 @@ #define KEYS_GPIO_PIN_EXIT GPIO_Pin_9 // PE.09 #define KEYS_GPIO_REG_ENTER GPIOE->IDR #define KEYS_GPIO_PIN_ENTER GPIO_Pin_11 // PE.11 +#elif defined(PCBX9DP) && PCBREV >= 2019 + #define KEYS_GPIO_REG_MENU GPIOD->IDR + #define KEYS_GPIO_PIN_MENU GPIO_Pin_2 // PD.02 + #define KEYS_GPIO_REG_EXIT GPIOD->IDR + #define KEYS_GPIO_PIN_EXIT GPIO_Pin_7 // PD.07 + #define KEYS_GPIO_REG_PAGE GPIOD->IDR + #define KEYS_GPIO_PIN_PAGE GPIO_Pin_3 // PD.03 + #define KEYS_GPIO_REG_ENTER GPIOE->IDR + #define KEYS_GPIO_PIN_ENTER GPIO_Pin_12 // PE.12 #else #define KEYS_GPIO_REG_MENU GPIOD->IDR #define KEYS_GPIO_PIN_MENU GPIO_Pin_7 // PD.07 @@ -106,6 +115,19 @@ #define ROTARY_ENCODER_EXTI_PortSource EXTI_PortSourceGPIOD #define ROTARY_ENCODER_EXTI_PinSource1 EXTI_PinSource12 #define ROTARY_ENCODER_EXTI_PinSource2 EXTI_PinSource13 +#elif defined(PCBX9DP) && PCBREV >= 2019 + #define ROTARY_ENCODER_NAVIGATION + #define ROTARY_ENCODER_GPIO GPIOE + #define ROTARY_ENCODER_GPIO_PIN_A GPIO_Pin_10 // PE.10 + #define ROTARY_ENCODER_GPIO_PIN_B GPIO_Pin_11 // PE.11 + #define ROTARY_ENCODER_POSITION() (((ROTARY_ENCODER_GPIO->IDR >> 9) & 0x02) + ((ROTARY_ENCODER_GPIO->IDR >> 11) & 0x01)) + #define ROTARY_ENCODER_EXTI_LINE1 EXTI_Line10 + #define ROTARY_ENCODER_EXTI_LINE2 EXTI_Line11 + #define ROTARY_ENCODER_EXTI_IRQn1 EXTI15_10_IRQn + #define ROTARY_ENCODER_EXTI_IRQHandler1 EXTI15_10_IRQHandler + #define ROTARY_ENCODER_EXTI_PortSource EXTI_PortSourceGPIOE + #define ROTARY_ENCODER_EXTI_PinSource1 EXTI_PinSource10 + #define ROTARY_ENCODER_EXTI_PinSource2 EXTI_PinSource11 #elif defined(RADIO_X7) #define ROTARY_ENCODER_NAVIGATION #define ROTARY_ENCODER_GPIO GPIOE @@ -135,6 +157,14 @@ #define ROTARY_ENCODER_EXTI_PinSource1 EXTI_PinSource10 #define ROTARY_ENCODER_EXTI_PinSource2 EXTI_PinSource12 #endif +#if defined(ROTARY_ENCODER_NAVIGATION) + #define ROTARY_ENCODER_RCC_APB1Periph RCC_APB1Periph_TIM5 + #define ROTARY_ENCODER_TIMER TIM5 + #define ROTARY_ENCODER_TIMER_IRQn TIM5_IRQn + #define ROTARY_ENCODER_TIMER_IRQHandler TIM5_IRQHandler +#else + #define ROTARY_ENCODER_RCC_APB1Periph 0 +#endif // Trims #if defined(PCBX9E) @@ -197,6 +227,23 @@ #define TRIMS_GPIO_PIN_RVD GPIO_Pin_14 // PE.14 #define TRIMS_GPIO_REG_RHL GPIOD->IDR #define TRIMS_GPIO_PIN_RHL GPIO_Pin_9 // PD.09 +#elif defined(PCBX9DP) && PCBREV >= 2019 + #define TRIMS_GPIO_REG_LHL GPIOE->IDR + #define TRIMS_GPIO_PIN_LHL GPIO_Pin_3 // PE.03 + #define TRIMS_GPIO_REG_LHR GPIOE->IDR + #define TRIMS_GPIO_PIN_LHR GPIO_Pin_4 // PE.04 + #define TRIMS_GPIO_REG_LVD GPIOE->IDR + #define TRIMS_GPIO_PIN_LVD GPIO_Pin_6 // PE.06 + #define TRIMS_GPIO_REG_LVU GPIOE->IDR + #define TRIMS_GPIO_PIN_LVU GPIO_Pin_5 // PE.05 + #define TRIMS_GPIO_REG_RVD GPIOC->IDR + #define TRIMS_GPIO_PIN_RVD GPIO_Pin_3 // PC.03 + #define TRIMS_GPIO_REG_RVU GPIOC->IDR + #define TRIMS_GPIO_PIN_RVU GPIO_Pin_2 // PC.02 + #define TRIMS_GPIO_REG_RHL GPIOC->IDR + #define TRIMS_GPIO_PIN_RHL GPIO_Pin_13 // PC.13 + #define TRIMS_GPIO_REG_RHR GPIOC->IDR + #define TRIMS_GPIO_PIN_RHR GPIO_Pin_1 // PC.01 #else #define TRIMS_GPIO_REG_LHL GPIOE->IDR #define TRIMS_GPIO_PIN_LHL GPIO_Pin_4 // PE.04 @@ -228,7 +275,7 @@ #elif defined(PCBXLITE) || defined(PCBX9LITE) #define STORAGE_SWITCH_A #define HARDWARE_SWITCH_A - #define SWITCHES_GPIO_REG_A_H GPIOE->IDR + #define SWITCHES_GPIO_REG_A_H GPIOE->IDR #define SWITCHES_GPIO_PIN_A_H GPIO_Pin_1 // PE.01 #define SWITCHES_GPIO_REG_A_L GPIOE->IDR #define SWITCHES_GPIO_PIN_A_L GPIO_Pin_0 // PE.00 @@ -237,12 +284,12 @@ #define HARDWARE_SWITCH_A #define SWITCHES_GPIO_REG_A_L GPIOE->IDR #define SWITCHES_GPIO_PIN_A_L GPIO_Pin_7 // PE.07 - #define SWITCHES_GPIO_REG_A_H GPIOE->IDR + #define SWITCHES_GPIO_REG_A_H GPIOE->IDR #define SWITCHES_GPIO_PIN_A_H GPIO_Pin_13 // PE.13 #else #define STORAGE_SWITCH_A #define HARDWARE_SWITCH_A - #define SWITCHES_GPIO_REG_A_H GPIOB->IDR + #define SWITCHES_GPIO_REG_A_H GPIOB->IDR #define SWITCHES_GPIO_PIN_A_H GPIO_Pin_5 // PB.05 #define SWITCHES_GPIO_REG_A_L GPIOE->IDR #define SWITCHES_GPIO_PIN_A_L GPIO_Pin_0 // PE.00 @@ -344,7 +391,10 @@ #define SWITCHES_GPIO_REG_D_H GPIOE->IDR #define SWITCHES_GPIO_PIN_D_H GPIO_Pin_2 // PE.02 #elif defined(PCBX9LITE) - // no SWD + #define STORAGE_SWITCH_D + #define HARDWARE_SWITCH_D + #define SWITCHES_GPIO_REG_D GPIOC->IDR + #define SWITCHES_GPIO_PIN_D GPIO_Pin_13 // PC.13 #else #define STORAGE_SWITCH_D #define HARDWARE_SWITCH_D @@ -366,12 +416,15 @@ #define HARDWARE_SWITCH_E #define SWITCHES_GPIO_REG_E GPIOE->IDR #define SWITCHES_GPIO_PIN_E GPIO_Pin_5 // PE.05 +#elif defined(PCBXLITE) + // no SWE but we want to remain compatible with XLiteS + #define STORAGE_SWITCH_E #elif defined(PCBX9LITE) #define STORAGE_SWITCH_E #define HARDWARE_SWITCH_E - #define SWITCHES_GPIO_REG_E GPIOC->IDR - #define SWITCHES_GPIO_PIN_E GPIO_Pin_13 // PC.13 -#elif defined(PCBX7) || defined(PCBXLITE) + #define SWITCHES_GPIO_REG_E GPIOA->IDR + #define SWITCHES_GPIO_PIN_E GPIO_Pin_5 // PA.05 +#elif defined(PCBX7) // no SWE #else #define STORAGE_SWITCH_E @@ -393,17 +446,15 @@ #define SWITCHES_GPIO_REG_F GPIOC->IDR #define SWITCHES_GPIO_PIN_F GPIO_Pin_3 // PC.03 #elif defined(PCBXLITE) + // no SWF but we want to remain compatible with XLiteS + #define STORAGE_SWITCH_F +#elif defined(PCBX9LITE) // no SWF #elif defined(PCBX7) #define STORAGE_SWITCH_F #define HARDWARE_SWITCH_F #define SWITCHES_GPIO_REG_F GPIOE->IDR #define SWITCHES_GPIO_PIN_F GPIO_Pin_14 // PE.14 -#elif defined(PCBX9LITE) - #define STORAGE_SWITCH_F - #define HARDWARE_SWITCH_F - #define SWITCHES_GPIO_REG_F GPIOA->IDR - #define SWITCHES_GPIO_PIN_F GPIO_Pin_5 // PA.05 #else #define STORAGE_SWITCH_F #define HARDWARE_SWITCH_F @@ -418,13 +469,8 @@ #define SWITCHES_GPIO_PIN_G_H GPIO_Pin_3 // PF.03 #define SWITCHES_GPIO_REG_G_L GPIOF->IDR #define SWITCHES_GPIO_PIN_G_L GPIO_Pin_4 // PF.04 -#elif defined(RADIO_X7) || defined(PCBXLITE) || defined(PCBX9LITE) +#elif defined(PCBX7) || defined(PCBXLITE) || defined(PCBX9LITE) // no SWG -#elif defined(RADIO_T12) - #define STORAGE_SWITCH_G - #define HARDWARE_SWITCH_G - #define SWITCHES_GPIO_REG_G GPIOE->IDR - #define SWITCHES_GPIO_PIN_G GPIO_Pin_14 // PE.14 #else #define STORAGE_SWITCH_G #define HARDWARE_SWITCH_G @@ -458,6 +504,15 @@ #define SWITCHES_GPIO_PIN_H GPIO_Pin_13 // PE.13 #endif +#if defined(PCBX9DP) && PCBREV >= 2019 + #define STORAGE_SWITCH_I + #define HARDWARE_SWITCH_I + #define SWITCHES_GPIO_REG_I GPIOD->IDR + #define SWITCHES_GPIO_PIN_I GPIO_Pin_10 // PD.10 +#elif defined(PCBX9D) || defined(PCBX9DP) + #define STORAGE_SWITCH_I +#endif + // X7 P400 P401 headers additionnal momentary switches #if defined(PCBX7) #define STORAGE_SWITCH_I @@ -465,9 +520,9 @@ #define STORAGE_SWITCH_J #define HARDWARE_SWITCH_J #define SWITCHES_GPIO_REG_I GPIOC->IDR - #define SWITCHES_GPIO_PIN_I GPIO_Pin_13 //PC.13 + #define SWITCHES_GPIO_PIN_I GPIO_Pin_13 // PC.13 #define SWITCHES_GPIO_REG_J GPIOC->IDR - #define SWITCHES_GPIO_PIN_J GPIO_Pin_10 //PC.10 + #define SWITCHES_GPIO_PIN_J GPIO_Pin_10 // PC.10 #endif #if defined(PCBX9E) @@ -483,8 +538,8 @@ #define SWITCHES_GPIO_PIN_J_H GPIO_Pin_7 // PG.07 #define SWITCHES_GPIO_REG_J_L GPIOG->IDR #define SWITCHES_GPIO_PIN_J_L GPIO_Pin_8 // PG.08 - #define STORAGE_SWITCH_k - #define HARDWARE_SWITCH_k + #define STORAGE_SWITCH_K + #define HARDWARE_SWITCH_K #define SWITCHES_GPIO_REG_K_H GPIOG->IDR #define SWITCHES_GPIO_PIN_K_H GPIO_Pin_13 // PG.13 #define SWITCHES_GPIO_REG_K_L GPIOG->IDR @@ -542,6 +597,13 @@ #define KEYS_GPIOE_PINS (TRIMS_GPIO_PIN_LVU | TRIMS_GPIO_PIN_LVD | SWITCHES_GPIO_PIN_D_H | SWITCHES_GPIO_PIN_D_L| SWITCHES_GPIO_PIN_E_H | SWITCHES_GPIO_PIN_E_L | SWITCHES_GPIO_PIN_F | SWITCHES_GPIO_PIN_I_L | SWITCHES_GPIO_PIN_L_H | SWITCHES_GPIO_PIN_L_L | SWITCHES_GPIO_PIN_M_H | SWITCHES_GPIO_PIN_O_L | SWITCHES_GPIO_PIN_R_L) #define KEYS_GPIOF_PINS (KEYS_GPIO_PIN_ENTER | SWITCHES_GPIO_PIN_C_H | SWITCHES_GPIO_PIN_C_L | SWITCHES_GPIO_PIN_G_H | SWITCHES_GPIO_PIN_G_L | SWITCHES_GPIO_PIN_H | SWITCHES_GPIO_PIN_I_H | SWITCHES_GPIO_PIN_O_H | SWITCHES_GPIO_PIN_P_H | SWITCHES_GPIO_PIN_P_L | SWITCHES_GPIO_PIN_Q_H | SWITCHES_GPIO_PIN_Q_L) #define KEYS_GPIOG_PINS (TRIMS_GPIO_PIN_LHL | TRIMS_GPIO_PIN_LHR| SWITCHES_GPIO_PIN_B_H | SWITCHES_GPIO_PIN_B_L | SWITCHES_GPIO_PIN_J_H | SWITCHES_GPIO_PIN_J_L | SWITCHES_GPIO_PIN_K_H | SWITCHES_GPIO_PIN_K_L) +#elif defined(PCBX9DP) && PCBREV >= 2019 + #define KEYS_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE) + #define KEYS_GPIOA_PINS (GPIO_Pin_5) + #define KEYS_GPIOB_PINS (GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5) + #define KEYS_GPIOC_PINS (GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_13) + #define KEYS_GPIOD_PINS (GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_7 | GPIO_Pin_10 | GPIO_Pin_14) + #define KEYS_GPIOE_PINS (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15) #elif defined(PCBX9DP) #define KEYS_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOC|RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_GPIOE) #define KEYS_GPIOA_PINS (SWITCHES_GPIO_PIN_C_L) @@ -562,17 +624,17 @@ #define KEYS_GPIOC_PINS (GPIO_Pin_4 | GPIO_Pin_5) #define KEYS_GPIOE_PINS (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14) #elif defined(RADIO_T12) - #define KEYS_RCC_AHB1Periph (RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOC|RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_GPIOE) - #define KEYS_GPIOA_PINS SWITCHES_GPIO_PIN_B_H - #define KEYS_GPIOC_PINS (TRIMS_GPIO_PIN_LHR | TRIMS_GPIO_PIN_RVD | TRIMS_GPIO_PIN_RVU) - #define KEYS_GPIOD_PINS (TRIMS_GPIO_PIN_LHL | KEYS_GPIO_PIN_EXIT | KEYS_GPIO_PIN_LEFT | KEYS_GPIO_PIN_RIGHT | SWITCHES_GPIO_PIN_C_L | SWITCHES_GPIO_PIN_H) - #define KEYS_GPIOE_PINS (KEYS_GPIO_PIN_UP | KEYS_GPIO_PIN_DOWN | KEYS_GPIO_PIN_ENTER | TRIMS_GPIO_PIN_RHR | TRIMS_GPIO_PIN_RHL | TRIMS_GPIO_PIN_LVD | TRIMS_GPIO_PIN_LVU | SWITCHES_GPIO_PIN_C_H | SWITCHES_GPIO_PIN_D_L | SWITCHES_GPIO_PIN_D_H | SWITCHES_GPIO_PIN_B_L | SWITCHES_GPIO_PIN_A_L | SWITCHES_GPIO_PIN_A_H | SWITCHES_GPIO_PIN_G) + #define KEYS_RCC_AHB1Periph (RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE) + #define KEYS_GPIOA_PINS GPIO_Pin_5 + #define KEYS_GPIOC_PINS (GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3) + #define KEYS_GPIOD_PINS (GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_7 | GPIO_Pin_11 | GPIO_Pin_14 | GPIO_Pin_15) + #define KEYS_GPIOE_PINS (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15) #elif defined(RADIO_X7) #define KEYS_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE) - #define KEYS_GPIOA_PINS SWITCHES_GPIO_PIN_B_H - #define KEYS_GPIOC_PINS (TRIMS_GPIO_PIN_LHR | TRIMS_GPIO_PIN_RVD | TRIMS_GPIO_PIN_RVU | SWITCHES_GPIO_PIN_I | SWITCHES_GPIO_PIN_J) - #define KEYS_GPIOD_PINS (TRIMS_GPIO_PIN_LHL | KEYS_GPIO_PIN_MENU | KEYS_GPIO_PIN_EXIT | KEYS_GPIO_PIN_PAGE | SWITCHES_GPIO_PIN_C_L | SWITCHES_GPIO_PIN_H) - #define KEYS_GPIOE_PINS (ROTARY_ENCODER_GPIO_PIN_A | ROTARY_ENCODER_GPIO_PIN_B | KEYS_GPIO_PIN_ENTER | TRIMS_GPIO_PIN_RHR | TRIMS_GPIO_PIN_RHL | TRIMS_GPIO_PIN_LVD | TRIMS_GPIO_PIN_LVU | SWITCHES_GPIO_PIN_C_H | SWITCHES_GPIO_PIN_D_L | SWITCHES_GPIO_PIN_D_H | SWITCHES_GPIO_PIN_B_L | SWITCHES_GPIO_PIN_A_L | SWITCHES_GPIO_PIN_A_H | SWITCHES_GPIO_PIN_F) + #define KEYS_GPIOA_PINS GPIO_Pin_5 + #define KEYS_GPIOC_PINS (GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_10 | GPIO_Pin_13) + #define KEYS_GPIOD_PINS (GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_7 | GPIO_Pin_11 | GPIO_Pin_14 | GPIO_Pin_15) + #define KEYS_GPIOE_PINS (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15) #elif defined(PCBX9LITE) #define KEYS_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE) #define KEYS_GPIOA_PINS (GPIO_Pin_5) @@ -597,8 +659,11 @@ #define ADC_SET_DMA_FLAGS() ADC_DMA->HIFCR = (DMA_HIFCR_CTCIF4 | DMA_HIFCR_CHTIF4 | DMA_HIFCR_CTEIF4 | DMA_HIFCR_CDMEIF4 | DMA_HIFCR_CFEIF4) #define ADC_TRANSFER_COMPLETE() (ADC_DMA->HISR & DMA_HISR_TCIF4) #define ADC_SAMPTIME 2 // sample time = 28 cycles -#define ADC_CHANNEL_RTC ADC_Channel_18 // ADC1_IN18 #if defined(PCBX9E) + #define HARDWARE_POT1 + #define HARDWARE_POT2 + #define HARDWARE_POT3 + #define HARDWARE_POT4 #define ADC_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOF | RCC_AHB1Periph_DMA2) #define ADC_RCC_APB1Periph 0 #define ADC_RCC_APB2Periph (RCC_APB2Periph_ADC1 | RCC_APB2Periph_ADC3) @@ -638,7 +703,11 @@ #define ADC_EXT_SET_DMA_FLAGS() ADC_DMA->LIFCR = (DMA_LIFCR_CTCIF0 | DMA_LIFCR_CHTIF0 | DMA_LIFCR_CTEIF0 | DMA_LIFCR_CDMEIF0 | DMA_LIFCR_CFEIF0) #define ADC_EXT_TRANSFER_COMPLETE() (ADC_DMA->LISR & DMA_LISR_TCIF0) #define ADC_EXT_SAMPTIME 3 // sample time = 56 cycles + #define ADC_VREF_PREC2 200 #elif defined(PCBX9DP) + #define HARDWARE_POT1 + #define HARDWARE_POT2 + #define HARDWARE_POT3 #define ADC_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_DMA2) #define ADC_RCC_APB1Periph 0 #define ADC_RCC_APB2Periph RCC_APB2Periph_ADC1 @@ -652,20 +721,29 @@ #define ADC_CHANNEL_STICK_LV ADC_Channel_3 // ADC1_IN3 #define ADC_GPIO_PIN_POT1 GPIO_Pin_6 // PA.06 #define ADC_GPIO_PIN_POT2 GPIO_Pin_0 // PB.00 - #define ADC_GPIO_PIN_POT3 GPIO_Pin_1 // PB.01 + #if PCBREV < 2019 + #define ADC_GPIO_PIN_POT3 GPIO_Pin_1 // PB.01 + #define ADC_GPIOB_PINS (ADC_GPIO_PIN_POT2 | ADC_GPIO_PIN_POT3) + #define ADC_CHANNEL_POT3 ADC_Channel_9 + #define ADC_VREF_PREC2 330 + #else + #define ADC_GPIOB_PINS (ADC_GPIO_PIN_POT2) + #define ADC_CHANNEL_POT3 0 + #define ADC_VREF_PREC2 300 + #endif #define ADC_GPIO_PIN_SLIDER1 GPIO_Pin_4 // PC.04 #define ADC_GPIO_PIN_SLIDER2 GPIO_Pin_5 // PC.05 #define ADC_GPIO_PIN_BATT GPIO_Pin_0 // PC.00 #define ADC_GPIOA_PINS (ADC_GPIO_PIN_STICK_RV | ADC_GPIO_PIN_STICK_RH | ADC_GPIO_PIN_STICK_LH | ADC_GPIO_PIN_STICK_LV | ADC_GPIO_PIN_POT1) - #define ADC_GPIOB_PINS (ADC_GPIO_PIN_POT2 | ADC_GPIO_PIN_POT3) #define ADC_GPIOC_PINS (ADC_GPIO_PIN_SLIDER1 | ADC_GPIO_PIN_SLIDER2 | ADC_GPIO_PIN_BATT) #define ADC_CHANNEL_POT1 ADC_Channel_6 #define ADC_CHANNEL_POT2 ADC_Channel_8 - #define ADC_CHANNEL_POT3 ADC_Channel_9 #define ADC_CHANNEL_SLIDER1 ADC_Channel_14 #define ADC_CHANNEL_SLIDER2 ADC_Channel_15 #define ADC_CHANNEL_BATT ADC_Channel_10 #elif defined(PCBXLITE) + #define HARDWARE_POT1 + #define HARDWARE_POT2 #define ADC_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_DMA2) #define ADC_RCC_APB1Periph RCC_APB1Periph_TIM5 #define ADC_RCC_APB2Periph RCC_APB2Periph_ADC1 @@ -691,7 +769,10 @@ #define ADC_CHANNEL_POT1 ADC_Channel_11 // ADC1_IN11 #define ADC_CHANNEL_POT2 ADC_Channel_12 // ADC1_IN12 #define ADC_CHANNEL_BATT ADC_Channel_10 // ADC1_IN10 + #define ADC_VREF_PREC2 330 #elif defined(PCBX7) + #define HARDWARE_POT1 + #define HARDWARE_POT2 #define ADC_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_DMA2) #define ADC_RCC_APB1Periph 0 #define ADC_RCC_APB2Periph RCC_APB2Periph_ADC1 @@ -703,16 +784,18 @@ #define ADC_CHANNEL_STICK_RH ADC_Channel_1 // ADC1_IN1 #define ADC_CHANNEL_STICK_LV ADC_Channel_2 // ADC1_IN2 #define ADC_CHANNEL_STICK_LH ADC_Channel_3 // ADC1_IN3 - #define ADC_GPIO_PIN_POT1 GPIO_Pin_6 // PA.06 - #define ADC_GPIO_PIN_POT2 GPIO_Pin_0 // PB.00 + #define ADC_GPIO_PIN_POT1 GPIO_Pin_0 // PB.00 + #define ADC_GPIO_PIN_POT2 GPIO_Pin_6 // PA.06 #define ADC_GPIO_PIN_BATT GPIO_Pin_0 // PC.00 - #define ADC_GPIOA_PINS (ADC_GPIO_PIN_STICK_RV | ADC_GPIO_PIN_STICK_RH | ADC_GPIO_PIN_STICK_LH | ADC_GPIO_PIN_STICK_LV | ADC_GPIO_PIN_POT1) - #define ADC_GPIOB_PINS ADC_GPIO_PIN_POT2 + #define ADC_GPIOA_PINS (ADC_GPIO_PIN_STICK_RV | ADC_GPIO_PIN_STICK_RH | ADC_GPIO_PIN_STICK_LH | ADC_GPIO_PIN_STICK_LV | ADC_GPIO_PIN_POT2) + #define ADC_GPIOB_PINS ADC_GPIO_PIN_POT1 #define ADC_GPIOC_PINS ADC_GPIO_PIN_BATT - #define ADC_CHANNEL_POT1 ADC_Channel_6 - #define ADC_CHANNEL_POT2 ADC_Channel_8 + #define ADC_CHANNEL_POT1 ADC_Channel_8 + #define ADC_CHANNEL_POT2 ADC_Channel_6 #define ADC_CHANNEL_BATT ADC_Channel_10 + #define ADC_VREF_PREC2 330 #elif defined(PCBX9LITE) + #define HARDWARE_POT1 #define ADC_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_DMA2) #define ADC_RCC_APB1Periph 0 #define ADC_RCC_APB2Periph RCC_APB2Periph_ADC1 @@ -730,7 +813,10 @@ #define ADC_GPIOC_PINS (GPIO_Pin_0 | GPIO_Pin_1) #define ADC_CHANNEL_POT1 ADC_Channel_11 // ADC1_IN11 #define ADC_CHANNEL_BATT ADC_Channel_10 // ADC1_IN10 + #define ADC_VREF_PREC2 300 #else + #define HARDWARE_POT1 + #define HARDWARE_POT2 #define ADC_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_DMA2) #define ADC_RCC_APB1Periph 0 #define ADC_RCC_APB2Periph RCC_APB2Periph_ADC1 @@ -756,6 +842,7 @@ #define ADC_CHANNEL_SLIDER1 ADC_Channel_14 #define ADC_CHANNEL_SLIDER2 ADC_Channel_15 #define ADC_CHANNEL_BATT ADC_Channel_10 + #define ADC_VREF_PREC2 330 #endif // PWR and LED driver @@ -778,7 +865,13 @@ #define PWR_ON_GPIO_PIN GPIO_Pin_0 // PD.00 #endif -#if defined(PCBXLITE) +#if defined(PCBX9DP) && PCBREV >= 2019 + #define STATUS_LEDS + #define GPIO_LED_GPIO_ON GPIO_ResetBits + #define GPIO_LED_GPIO_OFF GPIO_SetBits + #define LED_RED_GPIO GPIOA + #define LED_RED_GPIO_PIN GPIO_Pin_13 // PA.13 +#elif defined(PCBXLITE) #define STATUS_LEDS #define GPIO_LED_GPIO_ON GPIO_ResetBits #define GPIO_LED_GPIO_OFF GPIO_SetBits @@ -814,11 +907,14 @@ #if !defined(RADIO_T12) #define HARDWARE_INTERNAL_MODULE #endif -#if !defined(PCBXLITES) && !defined(PCBX9LITE) +#if defined(PCBXLITES) || defined(PCBX9LITE) || (defined(PCBX9DP) && PCBREV >= 2019) + #define INTERNAL_MODULE_PXX2 +#else #define INTERNAL_MODULE_PXX1 #endif +#define INTMODULE_FLASH_BAUDRATE 57600 #if defined(PCBXLITE) || defined(PCBX9LITE) - #define INTMODULE_RCC_APB1Periph RCC_APB1Periph_TIM3 + #define INTMODULE_RCC_APB1Periph 0 #define INTMODULE_RCC_APB2Periph RCC_APB2Periph_USART1 #if defined(PCBXLITES) || defined(PCBX9LITE) #define INTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_DMA2) @@ -844,13 +940,29 @@ #define INTMODULE_DMA_FLAG_TC DMA_IT_TCIF7 #define INTMODULE_DMA_CHANNEL DMA_Channel_4 #if defined(PCBXLITES) - #define INTMODULE_BOOTCMD_GPIO GPIOC - #define INTMODULE_BOOTCMD_GPIO_PIN GPIO_Pin_8 // PC.08 + #define INTMODULE_BOOTCMD_GPIO GPIOC + #define INTMODULE_BOOTCMD_GPIO_PIN GPIO_Pin_8 // PC.08 #endif - // #define INTMODULE_TIMER TIM3 - // #define INTMODULE_TIMER_IRQn TIM3_IRQn - // #define INTMODULE_TIMER_IRQHandler TIM3_IRQHandler - // #define INTMODULE_TIMER_FREQ (PERI1_FREQUENCY * TIMER_MULT_APB1) +#elif defined(PCBX9DP) && PCBREV >= 2019 + #define INTMODULE_RCC_APB1Periph 0 + #define INTMODULE_RCC_APB2Periph RCC_APB2Periph_USART1 + #define INTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_DMA2) + #define INTMODULE_PWR_GPIO GPIOA + #define INTMODULE_PWR_GPIO_PIN GPIO_Pin_7 // PA.07 + #define INTMODULE_GPIO GPIOB + #define INTMODULE_TX_GPIO_PIN GPIO_Pin_6 // PB.06 + #define INTMODULE_RX_GPIO_PIN GPIO_Pin_7 // PB.07 + #define INTMODULE_GPIO_PinSource_TX GPIO_PinSource6 + #define INTMODULE_GPIO_PinSource_RX GPIO_PinSource7 + #define INTMODULE_USART USART1 + #define INTMODULE_GPIO_AF GPIO_AF_USART1 + #define INTMODULE_USART_IRQHandler USART1_IRQHandler + #define INTMODULE_USART_IRQn USART1_IRQn + #define INTMODULE_DMA_STREAM DMA2_Stream7 + #define INTMODULE_DMA_STREAM_IRQ DMA2_Stream7_IRQn + #define INTMODULE_DMA_STREAM_IRQHandler DMA2_Stream7_IRQHandler + #define INTMODULE_DMA_FLAG_TC DMA_IT_TCIF7 + #define INTMODULE_DMA_CHANNEL DMA_Channel_4 #elif defined(PCBX9E) || defined(PCBX9DP) || defined(RADIO_X7) #define INTMODULE_PULSES #define INTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_DMA2) @@ -915,16 +1027,19 @@ #endif // External Module -#define EXTMODULE_PULSES - -#if defined(PCBXLITE) || defined(PCBX9LITE) - #define HARDWARE_EXTERNAL_MODULE_SIZE_SML +#if defined(PCBXLITE) || defined(PCBX9LITE) || (defined(PCBX9DP) && PCBREV >= 2019) #define EXTMODULE_RCC_APB2Periph (RCC_APB2Periph_TIM8 | RCC_APB2Periph_USART6) - #if defined(PCBX9LITE) + #if defined(PCBX9DP) && PCBREV >= 2019 + #define EXTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA2) + #define EXTMODULE_PWR_GPIO GPIOD + #define EXTMODULE_PWR_GPIO_PIN GPIO_Pin_8 // PD.08 + #elif defined(PCBX9LITE) + #define HARDWARE_EXTERNAL_MODULE_SIZE_SML #define EXTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_DMA2) #define EXTMODULE_PWR_GPIO GPIOA #define EXTMODULE_PWR_GPIO_PIN GPIO_Pin_8 // PA.08 #else + #define HARDWARE_EXTERNAL_MODULE_SIZE_SML #define EXTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA2) #define EXTMODULE_PWR_GPIO GPIOD #define EXTMODULE_PWR_GPIO_PIN GPIO_Pin_11 // PD.11 @@ -933,7 +1048,7 @@ #define EXTERNAL_MODULE_PWR_OFF() GPIO_ResetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) #define IS_EXTERNAL_MODULE_ON() (GPIO_ReadInputDataBit(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) == Bit_SET) #define EXTMODULE_TX_GPIO GPIOC - #define EXTMODULE_USART_GPIO GPIOC + #define EXTMODULE_USART_GPIO EXTMODULE_TX_GPIO #define EXTMODULE_TX_GPIO_PIN GPIO_Pin_6 // PC.06 #define EXTMODULE_TX_GPIO_PinSource GPIO_PinSource6 #define EXTMODULE_RX_GPIO_PIN GPIO_Pin_7 // PC.07 @@ -954,9 +1069,10 @@ #define EXTMODULE_USART USART6 #define EXTMODULE_USART_IRQn USART6_IRQn #define EXTMODULE_USART_IRQHandler USART6_IRQHandler - #define EXTMODULE_USART_DMA_CHANNEL DMA_Channel_5 - #define EXTMODULE_USART_DMA_STREAM DMA2_Stream6 - #define EXTMODULE_USART_DMA_STREAM_IRQn DMA2_Stream6_IRQn + #define EXTMODULE_USART_TX_DMA_CHANNEL DMA_Channel_5 + #define EXTMODULE_USART_TX_DMA_STREAM DMA2_Stream6 + #define EXTMODULE_USART_RX_DMA_CHANNEL DMA_Channel_5 + #define EXTMODULE_USART_RX_DMA_STREAM DMA2_Stream1 #elif defined(RADIO_T12) //Jumper T12v2 external module configured #define EXTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA2) @@ -981,8 +1097,30 @@ #define EXTMODULE_TIMER_OUTPUT_ENABLE TIM_CCER_CC1NE #define EXTMODULE_TIMER_OUTPUT_POLARITY TIM_CCER_CC1NP #define EXTMODULE_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2) +#elif defined(PCBX9DP) && PCBREV >= 2019 + #define EXTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA2) + #define EXTMODULE_RCC_APB2Periph (RCC_APB2Periph_TIM8 | RCC_APB2Periph_USART6) + #define EXTMODULE_PWR_GPIO GPIOD + #define EXTMODULE_PWR_GPIO_PIN GPIO_Pin_8 // PD.08 + #define EXTERNAL_MODULE_PWR_ON() GPIO_SetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) + #define EXTERNAL_MODULE_PWR_OFF() GPIO_ResetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) + #define IS_EXTERNAL_MODULE_ON() (GPIO_ReadInputDataBit(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) == Bit_SET) + #define EXTMODULE_TX_GPIO GPIOC + #define EXTMODULE_TX_GPIO_PIN GPIO_Pin_7 // PC.07 + #define EXTMODULE_TX_GPIO_PinSource GPIO_PinSource7 + #define EXTMODULE_TIMER TIM8 + #define EXTMODULE_TIMER_TX_GPIO_AF GPIO_AF_TIM8 // TIM8_CH2 + #define EXTMODULE_TIMER_CC_IRQn TIM8_CC_IRQn + #define EXTMODULE_TIMER_CC_IRQHandler TIM8_CC_IRQHandler + #define EXTMODULE_TIMER_DMA_CHANNEL DMA_Channel_7 // TIM8_UP + #define EXTMODULE_TIMER_DMA_STREAM DMA2_Stream1 // TIM8_UP + #define EXTMODULE_TIMER_DMA_STREAM_IRQn DMA2_Stream1_IRQn + #define EXTMODULE_TIMER_DMA_STREAM_IRQHandler DMA2_Stream1_IRQHandler + #define EXTMODULE_TIMER_DMA_FLAG_TC DMA_IT_TCIF1 + #define EXTMODULE_TIMER_OUTPUT_ENABLE TIM_CCER_CC2E + #define EXTMODULE_TIMER_OUTPUT_POLARITY TIM_CCER_CC2NP + #define EXTMODULE_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2) #else - #define EXTMODULE_PULSES #define EXTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA2) #define EXTMODULE_RCC_APB2Periph RCC_APB2Periph_TIM8 #define EXTMODULE_PWR_GPIO GPIOD @@ -997,8 +1135,8 @@ #define EXTMODULE_TIMER_TX_GPIO_AF GPIO_AF_TIM8 // TIM8_CH1N #define EXTMODULE_TIMER_CC_IRQn TIM8_CC_IRQn #define EXTMODULE_TIMER_CC_IRQHandler TIM8_CC_IRQHandler - #define EXTMODULE_TIMER_DMA_CHANNEL DMA_Channel_7 - #define EXTMODULE_TIMER_DMA_STREAM DMA2_Stream1 + #define EXTMODULE_TIMER_DMA_CHANNEL DMA_Channel_7 // TIM8_UP + #define EXTMODULE_TIMER_DMA_STREAM DMA2_Stream1 // TIM8_UP #define EXTMODULE_TIMER_DMA_STREAM_IRQn DMA2_Stream1_IRQn #define EXTMODULE_TIMER_DMA_STREAM_IRQHandler DMA2_Stream1_IRQHandler #define EXTMODULE_TIMER_DMA_FLAG_TC DMA_IT_TCIF1 @@ -1081,7 +1219,7 @@ #endif // Serial Port -#if defined(PCBX7) || defined(PCBXLITE) || defined(PCBX9LITE) +#if defined(PCBX7) || defined(PCBXLITE) || defined(PCBX9LITE) || (defined(PCBX9DP) && PCBREV >= 2019) #define AUX_SERIAL_RCC_AHB1Periph 0 #define AUX_SERIAL_RCC_APB1Periph 0 #else @@ -1106,7 +1244,7 @@ #define TELEMETRY_RCC_APB1Periph RCC_APB1Periph_USART2 #define TELEMETRY_DIR_GPIO GPIOD #define TELEMETRY_DIR_GPIO_PIN GPIO_Pin_4 // PD.04 -#if defined(PCBXLITE) || defined(PCBX9LITE) +#if defined(PCBXLITE) || defined(PCBX9LITE) || (defined(PCBX9DP) && PCBREV >= 2019) #define TELEMETRY_DIR_OUTPUT() TELEMETRY_DIR_GPIO->BSRRH = TELEMETRY_DIR_GPIO_PIN #define TELEMETRY_DIR_INPUT() TELEMETRY_DIR_GPIO->BSRRL = TELEMETRY_DIR_GPIO_PIN #else @@ -1159,18 +1297,20 @@ #define SPORT_UPDATE_PWR_GPIO_PIN GPIO_Pin_15 // PE.15 #define GPIO_SPORT_UPDATE_PWR_GPIO_ON GPIO_SetBits #define GPIO_SPORT_UPDATE_PWR_GPIO_OFF GPIO_ResetBits +#elif defined(PCBX9DP) && PCBREV >= 2019 + #define SPORT_MAX_BAUDRATE 400000 + #define SPORT_UPDATE_RCC_AHB1Periph RCC_AHB1Periph_GPIOA + #define SPORT_UPDATE_PWR_GPIO GPIOA + #define SPORT_UPDATE_PWR_GPIO_PIN GPIO_Pin_14 // PA.14 + #define GPIO_SPORT_UPDATE_PWR_GPIO_ON GPIO_SetBits + #define GPIO_SPORT_UPDATE_PWR_GPIO_OFF GPIO_ResetBits #else #define SPORT_MAX_BAUDRATE 400000 #define SPORT_UPDATE_RCC_AHB1Periph 0 #endif -#if defined(PCBXLITES) || defined(PCBX9LITE) - #define INTMODULE_HEARTBEAT_TRIGGER EXTI_Trigger_Rising -#else - #define INTMODULE_HEARTBEAT_TRIGGER EXTI_Trigger_Falling -#endif - // Heartbeat for iXJT / ISRM synchro +#define INTMODULE_HEARTBEAT_TRIGGER EXTI_Trigger_Falling #if defined(PCBXLITE) #define INTMODULE_HEARTBEAT #define INTMODULE_HEARTBEAT_RCC_AHB1Periph RCC_AHB1Periph_GPIOD @@ -1183,14 +1323,14 @@ #define INTMODULE_HEARTBEAT_EXTI_IRQHandler EXTI15_10_IRQHandler #elif defined(PCBX9LITE) // #define INTMODULE_HEARTBEAT - #define INTMODULE_HEARTBEAT_RCC_AHB1Periph RCC_AHB1Periph_GPIOC - // #define INTMODULE_HEARTBEAT_GPIO GPIOC - // #define INTMODULE_HEARTBEAT_GPIO_PIN GPIO_Pin_9 - #define INTMODULE_HEARTBEAT_EXTI_PortSource EXTI_PortSourceGPIOC - #define INTMODULE_HEARTBEAT_EXTI_PinSource GPIO_PinSource9 - #define INTMODULE_HEARTBEAT_EXTI_LINE EXTI_Line9 - #define INTMODULE_HEARTBEAT_EXTI_IRQn EXTI9_5_IRQn - #define INTMODULE_HEARTBEAT_EXTI_IRQHandler EXTI9_5_IRQHandler + #define INTMODULE_HEARTBEAT_RCC_AHB1Periph 0 // RCC_AHB1Periph_GPIOC + // #define INTMODULE_HEARTBEAT_GPIO GPIOC + // #define INTMODULE_HEARTBEAT_GPIO_PIN GPIO_Pin_9 + // #define INTMODULE_HEARTBEAT_EXTI_PortSource EXTI_PortSourceGPIOC + // #define INTMODULE_HEARTBEAT_EXTI_PinSource GPIO_PinSource9 + // #define INTMODULE_HEARTBEAT_EXTI_LINE EXTI_Line9 + // #define INTMODULE_HEARTBEAT_EXTI_IRQn EXTI9_5_IRQn + // #define INTMODULE_HEARTBEAT_EXTI_IRQHandler EXTI9_5_IRQHandler #elif defined(RADIO_X7) #define INTMODULE_HEARTBEAT #define INTMODULE_HEARTBEAT_REUSE_INTERRUPT_ROTARY_ENCODER @@ -1201,6 +1341,16 @@ #define INTMODULE_HEARTBEAT_EXTI_PinSource GPIO_PinSource7 #define INTMODULE_HEARTBEAT_EXTI_LINE EXTI_Line7 #define INTMODULE_HEARTBEAT_EXTI_IRQn EXTI9_5_IRQn +#elif defined(PCBX9DP) && PCBREV >= 2019 + #define INTMODULE_HEARTBEAT + #define INTMODULE_HEARTBEAT_RCC_AHB1Periph RCC_AHB1Periph_GPIOB + #define INTMODULE_HEARTBEAT_GPIO GPIOB + #define INTMODULE_HEARTBEAT_GPIO_PIN GPIO_Pin_1 // PB.01 + #define INTMODULE_HEARTBEAT_EXTI_PortSource EXTI_PortSourceGPIOB + #define INTMODULE_HEARTBEAT_EXTI_PinSource GPIO_PinSource1 + #define INTMODULE_HEARTBEAT_EXTI_LINE EXTI_Line1 + #define INTMODULE_HEARTBEAT_EXTI_IRQn EXTI1_IRQn + #define INTMODULE_HEARTBEAT_EXTI_IRQHandler EXTI1_IRQHandler #else #define INTMODULE_HEARTBEAT #define INTMODULE_HEARTBEAT_RCC_AHB1Periph RCC_AHB1Periph_GPIOC @@ -1225,40 +1375,55 @@ #endif // Trainer / Trainee from the module bay -#if defined(PCBX9LITE) +#if defined(PCBX9LITE) || defined(PCBXLITE) #define TRAINER_MODULE_CPPM - #define TRAINER_MODULE_RCC_AHB1Periph EXTMODULE_HEARTBEAT_RCC_AHB1Periph - #define TRAINER_MODULE_RCC_APB1Periph RCC_APB1Periph_TIM4 + #define TRAINER_MODULE_SBUS + #define TRAINER_MODULE_RCC_AHB1Periph 0 + #define TRAINER_MODULE_RCC_APB1Periph RCC_APB1Periph_TIM3 #define TRAINER_MODULE_RCC_APB2Periph 0 - #define TRAINER_MODULE_CPPM_GPIO EXTMODULE_HEARTBEAT_GPIO - #define TRAINER_MODULE_CPPM_GPIO_PIN EXTMODULE_HEARTBEAT_GPIO_PIN - #define TRAINER_MODULE_CPPM_GPIO_PinSource EXTMODULE_HEARTBEAT_EXTI_PinSource - #define TRAINER_MODULE_CPPM_GPIO_AF GPIO_AF_TIM4 -#elif defined(PCBXLITE) - #define TRAINER_MODULE_CPPM - #define TRAINER_MODULE_RCC_AHB1Periph INTMODULE_HEARTBEAT_RCC_AHB1Periph - #define TRAINER_MODULE_RCC_APB1Periph RCC_APB1Periph_TIM4 - #define TRAINER_MODULE_RCC_APB2Periph 0 - #define TRAINER_MODULE_CPPM_GPIO INTMODULE_HEARTBEAT_GPIO - #define TRAINER_MODULE_CPPM_GPIO_PIN INTMODULE_HEARTBEAT_GPIO_PIN - #define TRAINER_MODULE_CPPM_GPIO_PinSource INTMODULE_HEARTBEAT_EXTI_PinSource - #define TRAINER_MODULE_CPPM_GPIO_AF GPIO_AF_TIM4 + #define TRAINER_MODULE_CPPM_GPIO EXTMODULE_USART_GPIO + #define TRAINER_MODULE_CPPM_GPIO_PIN EXTMODULE_RX_GPIO_PIN + #define TRAINER_MODULE_CPPM_GPIO_PinSource EXTMODULE_RX_GPIO_PinSource + #define TRAINER_MODULE_CPPM_GPIO_AF GPIO_AF_TIM3 + #define TRAINER_MODULE_CPPM_TIMER TIM3 + #define TRAINER_MODULE_CPPM_COUNTER_REGISTER TRAINER_MODULE_CPPM_TIMER->CCR2 + #define TRAINER_MODULE_CPPM_INTERRUPT_ENABLE TIM_DIER_CC2IE + #define TRAINER_MODULE_CPPM_INTERRUPT_FLAG TIM_SR_CC2IF + #define TRAINER_MODULE_CPPM_CCMR1 (TIM_CCMR1_IC2F_0 | TIM_CCMR1_IC2F_1 | TIM_CCMR1_CC2S_0) + #define TRAINER_MODULE_CPPM_CCER TIM_CCER_CC2E + #define TRAINER_MODULE_CPPM_TIMER_IRQn TIM3_IRQn + #define TRAINER_MODULE_CPPM_TIMER_IRQHandler TIM3_IRQHandler + #define TRAINER_MODULE_SBUS_GPIO EXTMODULE_USART_GPIO + #define TRAINER_MODULE_SBUS_GPIO_PIN EXTMODULE_RX_GPIO_PIN + #define TRAINER_MODULE_SBUS_GPIO_AF EXTMODULE_USART_GPIO_AF + #define TRAINER_MODULE_SBUS_USART EXTMODULE_USART + #define TRAINER_MODULE_SBUS_GPIO_PinSource EXTMODULE_RX_GPIO_PinSource + #define TRAINER_MODULE_SBUS_DMA_STREAM EXTMODULE_USART_RX_DMA_STREAM + #define TRAINER_MODULE_SBUS_DMA_CHANNEL EXTMODULE_USART_RX_DMA_CHANNEL #else #define TRAINER_MODULE_CPPM #define TRAINER_MODULE_SBUS #define TRAINER_MODULE_RCC_AHB1Periph RCC_AHB1Periph_GPIOC #define TRAINER_MODULE_RCC_APB2Periph RCC_APB2Periph_USART6 #define TRAINER_MODULE_RCC_APB1Periph RCC_APB1Periph_TIM3 + #define TRAINER_MODULE_CPPM_TIMER TRAINER_TIMER #define TRAINER_MODULE_CPPM_GPIO INTMODULE_HEARTBEAT_GPIO #define TRAINER_MODULE_CPPM_GPIO_PIN INTMODULE_HEARTBEAT_GPIO_PIN #define TRAINER_MODULE_CPPM_GPIO_PinSource INTMODULE_HEARTBEAT_EXTI_PinSource - #define TRAINER_MODULE_SBUS_GPIO_AF GPIO_AF_USART6 - #define TRAINER_MODULE_CPPM_GPIO_AF GPIO_AF_TIM3 - #define TRAINER_MODULE_SBUS_USART USART6 - #define TRAINER_MODULE_SBUS_USART_IRQHandler USART6_IRQHandler - #define TRAINER_MODULE_SBUS_USART_IRQn USART6_IRQn - #define TRAINER_MODULE_SBUS_DMA_Stream DMA2_Stream1 - #define TRAINER_MODULE_SBUS_DMA_Channel DMA_Channel_5 + #define TRAINER_MODULE_CPPM_INTERRUPT_ENABLE TIM_DIER_CC2IE + #define TRAINER_MODULE_CPPM_INTERRUPT_FLAG TIM_SR_CC2IF + #define TRAINER_MODULE_CPPM_CCMR1 (TIM_CCMR1_IC2F_0 | TIM_CCMR1_IC2F_1 | TIM_CCMR1_CC2S_0) + #define TRAINER_MODULE_CPPM_CCER TIM_CCER_CC2E + #define TRAINER_MODULE_CPPM_COUNTER_REGISTER TRAINER_TIMER->CCR2 + #define TRAINER_MODULE_CPPM_TIMER_IRQn TRAINER_TIMER_IRQn + #define TRAINER_MODULE_CPPM_GPIO_AF GPIO_AF_TIM3 + #define TRAINER_MODULE_SBUS_GPIO_AF GPIO_AF_USART6 + #define TRAINER_MODULE_SBUS_USART USART6 + #define TRAINER_MODULE_SBUS_GPIO INTMODULE_HEARTBEAT_GPIO + #define TRAINER_MODULE_SBUS_GPIO_PIN INTMODULE_HEARTBEAT_GPIO_PIN + #define TRAINER_MODULE_SBUS_GPIO_PinSource INTMODULE_HEARTBEAT_EXTI_PinSource + #define TRAINER_MODULE_SBUS_DMA_STREAM DMA2_Stream1 + #define TRAINER_MODULE_SBUS_DMA_CHANNEL DMA_Channel_5 #endif // USB @@ -1440,6 +1605,15 @@ #define I2C_WP_GPIO_PIN GPIO_Pin_7 // PD.07 #define I2C_SCL_GPIO_PinSource GPIO_PinSource8 #define I2C_SDA_GPIO_PinSource GPIO_PinSource9 +#elif defined(PCBX9DP) && PCBREV >= 2019 + #define I2C_RCC_AHB1Periph (RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOF) + #define I2C_SPI_GPIO GPIOB + #define I2C_SDA_GPIO_PIN GPIO_Pin_9 // PB.09 + #define I2C_SCL_GPIO_PIN GPIO_Pin_8 // PB.08 + #define I2C_WP_GPIO GPIOF + #define I2C_WP_GPIO_PIN GPIO_Pin_0 // PF.00 + #define I2C_SCL_GPIO_PinSource GPIO_PinSource8 + #define I2C_SDA_GPIO_PinSource GPIO_PinSource9 #else #define I2C_RCC_AHB1Periph RCC_AHB1Periph_GPIOB #define I2C_SPI_GPIO GPIOB @@ -1449,10 +1623,10 @@ #define I2C_WP_GPIO_PIN GPIO_Pin_9 // PB.09 #define I2C_SCL_GPIO_PinSource GPIO_PinSource6 #define I2C_SDA_GPIO_PinSource GPIO_PinSource7 + #define I2C_ADDRESS_VOLUME 0x5C #endif #define I2C_SPEED 400000 #define I2C_ADDRESS_EEPROM 0xA2 -#define I2C_ADDRESS_VOLUME 0x5C #define I2C_FLASH_PAGESIZE 64 // Second I2C Bus: IMU @@ -1544,6 +1718,20 @@ #define HAPTIC_CCMR1 TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2M_2 #define HAPTIC_CCER TIM_CCER_CC2E #define BACKLIGHT_BDTR TIM_BDTR_MOE +#elif defined(PCBX9DP) && PCBREV >= 2019 + #define HAPTIC_PWM + #define HAPTIC_RCC_AHB1Periph RCC_AHB1Periph_GPIOA + #define HAPTIC_RCC_APB2Periph RCC_APB2Periph_TIM1 + #define HAPTIC_RCC_APB1Periph 0 + #define HAPTIC_GPIO_PinSource GPIO_PinSource10 + #define HAPTIC_GPIO GPIOA + #define HAPTIC_GPIO_PIN GPIO_Pin_10 // PA.10 + #define HAPTIC_GPIO_AF GPIO_AF_TIM1 + #define HAPTIC_TIMER TIM1 // Timer1 Channel3 + #define HAPTIC_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2) + #define HAPTIC_COUNTER_REGISTER HAPTIC_TIMER->CCR3 + #define HAPTIC_CCMR2 TIM_CCMR2_OC3M_1 | TIM_CCMR2_OC3M_2 + #define HAPTIC_CCER TIM_CCER_CC3E #elif defined(PCBX9E) || defined(PCBX9DP) || defined(PCBX7) #define HAPTIC_PWM #define HAPTIC_RCC_AHB1Periph RCC_AHB1Periph_GPIOB @@ -1579,6 +1767,7 @@ // Bluetooth #if defined(PCBX9E) + #define STORAGE_BLUETOOTH #define BT_USART USART6 #define BT_GPIO_AF GPIO_AF_USART6 #define BT_USART_IRQn USART6_IRQn @@ -1597,14 +1786,21 @@ #define BT_TX_GPIO_PinSource GPIO_PinSource14 #define BT_RX_GPIO_PinSource GPIO_PinSource9 #define BT_USART_IRQHandler USART6_IRQHandler -#elif defined(PCBX7) || defined(PCBXLITE) - #define BT_RCC_AHB1Periph (RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOE) // RCC_AHB1Periph_DMA1 +#elif defined(PCBX7) || defined(PCBXLITE) || (defined(PCBX9DP) && PCBREV >= 2019) + #define STORAGE_BLUETOOTH #define BT_RCC_APB1Periph RCC_APB1Periph_USART3 #define BT_RCC_APB2Periph 0 - #define BT_EN_GPIO GPIOE - #if defined(PCBXLITE) + #if defined(PCBX9DP) + #define BT_RCC_AHB1Periph (RCC_AHB1Periph_GPIOB) // RCC_AHB1Periph_DMA1 + #define BT_EN_GPIO GPIOB + #define BT_EN_GPIO_PIN GPIO_Pin_2 // PB.02 + #elif defined(PCBXLITE) + #define BT_RCC_AHB1Periph (RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOE) // RCC_AHB1Periph_DMA1 + #define BT_EN_GPIO GPIOE #define BT_EN_GPIO_PIN GPIO_Pin_15 // PE.15 #else + #define BT_RCC_AHB1Periph (RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOE) // RCC_AHB1Periph_DMA1 + #define BT_EN_GPIO GPIOE #define BT_EN_GPIO_PIN GPIO_Pin_12 // PE.12 #endif #define BT_USART_GPIO GPIOB @@ -1618,10 +1814,15 @@ #define BT_USART_IRQn USART3_IRQn // #define BT_DMA_Stream_RX DMA1_Stream1 // #define BT_DMA_Channel_RX DMA_Channel_4 +#elif defined(PCBX9D) || defined(PCBX9DP) + #define STORAGE_BLUETOOTH + #define BT_RCC_AHB1Periph 0 + #define BT_RCC_APB1Periph 0 + #define BT_RCC_APB2Periph 0 #else - #define BT_RCC_AHB1Periph 0 - #define BT_RCC_APB1Periph 0 - #define BT_RCC_APB2Periph 0 + #define BT_RCC_AHB1Periph 0 + #define BT_RCC_APB1Periph 0 + #define BT_RCC_APB2Periph 0 #endif // Xms Interrupt diff --git a/radio/src/targets/taranis/haptic_driver.cpp b/radio/src/targets/taranis/haptic_driver.cpp index ea1e6ca9a..c1be2940a 100644 --- a/radio/src/targets/taranis/haptic_driver.cpp +++ b/radio/src/targets/taranis/haptic_driver.cpp @@ -22,7 +22,7 @@ #if defined(HAPTIC_PWM) // TODO test Haptic on X7 (I added PWM support) -void hapticOff(void) +void hapticOff() { HAPTIC_COUNTER_REGISTER = 0; } @@ -35,7 +35,7 @@ void hapticOn(uint32_t pwmPercent) HAPTIC_COUNTER_REGISTER = pwmPercent; } -void hapticInit(void) +void hapticInit() { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = HAPTIC_GPIO_PIN; @@ -55,6 +55,7 @@ void hapticInit(void) HAPTIC_TIMER->CCMR2 = HAPTIC_CCMR2; // PWM #endif HAPTIC_TIMER->CCER = HAPTIC_CCER; + HAPTIC_TIMER->BDTR = TIM_BDTR_MOE; // Enable output HAPTIC_COUNTER_REGISTER = 0; HAPTIC_TIMER->EGR = 0; HAPTIC_TIMER->CR1 = TIM_CR1_CEN; // Counter enable @@ -63,7 +64,7 @@ void hapticInit(void) #else // No PWM before X9D+ -void hapticInit(void) +void hapticInit() { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = HAPTIC_GPIO_PIN; @@ -74,7 +75,7 @@ void hapticInit(void) GPIO_Init(HAPTIC_GPIO, &GPIO_InitStructure); } -void hapticOff(void) +void hapticOff() { GPIO_ResetBits(HAPTIC_GPIO, HAPTIC_GPIO_PIN); } diff --git a/radio/src/targets/taranis/intmodule_pulses_driver.cpp b/radio/src/targets/taranis/intmodule_pulses_driver.cpp index 044883034..8e16f19d7 100644 --- a/radio/src/targets/taranis/intmodule_pulses_driver.cpp +++ b/radio/src/targets/taranis/intmodule_pulses_driver.cpp @@ -32,11 +32,8 @@ void intmoduleStop() INTMODULE_TIMER->CR1 &= ~TIM_CR1_CEN; } -#if defined(DEBUG_LATENCY) -#define HEARBEAT_OFFSET unsigned(5500 + g_model.flightModeData[0].gvars[0] * 100) -#else -constexpr int HEARBEAT_OFFSET = 5500; -#endif +// #define HEARBEAT_OFFSET unsigned(6000 + g_model.flightModeData[0].gvars[0] * 100) +constexpr unsigned HEARBEAT_OFFSET = 6000; void intmoduleSendNextFrame() { @@ -46,7 +43,7 @@ void intmoduleSendNextFrame() { uint32_t last = intmodulePulsesData.pxx.getLast(); if (heartbeatCapture.valid) { - if (TIMER_2MHz_TIMER->CNT - heartbeatCapture.timestamp > HEARBEAT_OFFSET) + if (getTmr2MHz() - heartbeatCapture.timestamp > HEARBEAT_OFFSET) last -= 21; else last += 19; @@ -83,12 +80,7 @@ void intmoduleSendNextFrame() } } -void intmoduleSerialStart(uint32_t baudrate, uint8_t rxEnable) -{ - // nothing, the pulses will be sent through telemetry port -} - -void intmodulePxxStart() +void intmodulePxx1PulsesStart() { INTERNAL_MODULE_ON(); @@ -172,7 +164,7 @@ extern "C" void INTMODULE_TIMER_CC_IRQHandler() { INTMODULE_TIMER->DIER &= ~TIM_DIER_CC2IE; // Stop this interrupt INTMODULE_TIMER->SR &= ~TIM_SR_CC2IF; - if (setupPulses(INTERNAL_MODULE)) { + if (setupPulsesInternalModule()) { intmoduleSendNextFrame(); } } diff --git a/radio/src/targets/taranis/keys_driver.cpp b/radio/src/targets/taranis/keys_driver.cpp index 09d92434c..144d7e97e 100644 --- a/radio/src/targets/taranis/keys_driver.cpp +++ b/radio/src/targets/taranis/keys_driver.cpp @@ -100,7 +100,7 @@ uint32_t readTrims() return result; } -uint8_t trimDown(uint8_t idx) +bool trimDown(uint8_t idx) { return readTrims() & (1 << idx); } @@ -141,7 +141,7 @@ void readKeysAndTrims() break; \ case SW_S ## x ## 0: \ xxx = ~SWITCHES_GPIO_REG_ ## x & SWITCHES_GPIO_PIN_ ## x ; \ - break; + break #else #define ADD_2POS_CASE(x) \ case SW_S ## x ## 0: \ @@ -149,29 +149,25 @@ void readKeysAndTrims() break; \ case SW_S ## x ## 2: \ xxx = ~SWITCHES_GPIO_REG_ ## x & SWITCHES_GPIO_PIN_ ## x ; \ - break; -#endif - #define ADD_3POS_CASE(x, i) \ - case SW_S ## x ## 0: \ - xxx = (SWITCHES_GPIO_REG_ ## x ## _H & SWITCHES_GPIO_PIN_ ## x ## _H); \ - if (IS_CONFIG_3POS(i)) { \ - xxx = xxx && (~SWITCHES_GPIO_REG_ ## x ## _L & SWITCHES_GPIO_PIN_ ## x ## _L); \ - } \ - break; \ - case SW_S ## x ## 1: \ - xxx = (SWITCHES_GPIO_REG_ ## x ## _H & SWITCHES_GPIO_PIN_ ## x ## _H) && (SWITCHES_GPIO_REG_ ## x ## _L & SWITCHES_GPIO_PIN_ ## x ## _L); \ - break; \ - case SW_S ## x ## 2: \ - xxx = (~SWITCHES_GPIO_REG_ ## x ## _H & SWITCHES_GPIO_PIN_ ## x ## _H); \ - if (IS_CONFIG_3POS(i)) { \ - xxx = xxx && (SWITCHES_GPIO_REG_ ## x ## _L & SWITCHES_GPIO_PIN_ ## x ## _L); \ - } \ break +#endif -uint8_t keyState(uint8_t index) -{ - return keys[index].state(); -} +#define ADD_3POS_CASE(x, i) \ + case SW_S ## x ## 0: \ + xxx = (SWITCHES_GPIO_REG_ ## x ## _H & SWITCHES_GPIO_PIN_ ## x ## _H); \ + if (IS_CONFIG_3POS(i)) { \ + xxx = xxx && (~SWITCHES_GPIO_REG_ ## x ## _L & SWITCHES_GPIO_PIN_ ## x ## _L); \ + } \ + break; \ + case SW_S ## x ## 1: \ + xxx = (SWITCHES_GPIO_REG_ ## x ## _H & SWITCHES_GPIO_PIN_ ## x ## _H) && (SWITCHES_GPIO_REG_ ## x ## _L & SWITCHES_GPIO_PIN_ ## x ## _L); \ + break; \ + case SW_S ## x ## 2: \ + xxx = (~SWITCHES_GPIO_REG_ ## x ## _H & SWITCHES_GPIO_PIN_ ## x ## _H); \ + if (IS_CONFIG_3POS(i)) { \ + xxx = xxx && (SWITCHES_GPIO_REG_ ## x ## _L & SWITCHES_GPIO_PIN_ ## x ## _L); \ + } \ + break #if !defined(BOOT) uint32_t switchState(uint8_t index) @@ -182,24 +178,34 @@ uint32_t switchState(uint8_t index) ADD_3POS_CASE(A, 0); ADD_3POS_CASE(B, 1); ADD_3POS_CASE(C, 2); -#if !defined(PCBX9LITE) + +#if defined(PCBX9LITE) + ADD_2POS_CASE(D); + ADD_2POS_CASE(E); +#elif defined(PCBXLITES) ADD_3POS_CASE(D, 3); -#endif -#if defined(PCBXLITES) || defined(PCBX9LITE) ADD_2POS_CASE(E); ADD_2POS_CASE(F); - // no SWG and SWH on XLITES and X9 -#elif defined(PCBXLITE) || defined(PCBX9LITE) - // no SWE, SWF, SWG and SWH on X9LITE and XLITE + // no SWG and SWH on XLITES +#elif defined(PCBXLITE) + ADD_3POS_CASE(D, 3); + // no SWE, SWF, SWG and SWH on XLITE #elif defined(PCBX7) + ADD_3POS_CASE(D, 3); ADD_2POS_CASE(F); ADD_2POS_CASE(H); #else + ADD_3POS_CASE(D, 3); ADD_3POS_CASE(E, 4); ADD_2POS_CASE(F); ADD_3POS_CASE(G, 6); ADD_2POS_CASE(H); #endif + +#if defined(PCBX9DP) && PCBREV >= 2019 + ADD_2POS_CASE(I); +#endif + #if defined(PCBX9E) ADD_3POS_CASE(I, 8); ADD_3POS_CASE(J, 9); diff --git a/radio/src/targets/taranis/lcd_driver_spi.cpp b/radio/src/targets/taranis/lcd_driver_spi.cpp index d04a6e1e0..50eb13982 100644 --- a/radio/src/targets/taranis/lcd_driver_spi.cpp +++ b/radio/src/targets/taranis/lcd_driver_spi.cpp @@ -117,8 +117,9 @@ void lcdStart() lcdWriteCommand(0xa3); // Set bias=1/6 lcdWriteCommand(0x22); // Set internal rb/ra=5.0 lcdWriteCommand(0x2f); // All built-in power circuits on - lcdWriteCommand(0x24); // Set contrast - lcdWriteCommand(0x36); // Set Vop + lcdWriteCommand(0x24); // Power control set + lcdWriteCommand(0x81); // Set contrast + lcdWriteCommand(0x0A); // Set Vop lcdWriteCommand(0xa6); // Set display mode #else lcdWriteCommand(0xe2); // (14) Soft reset @@ -309,6 +310,13 @@ void lcdInit() Finishes LCD initialization. It is called auto-magically when first LCD command is issued by the other parts of the code. */ + +#if defined(PCBX9DP) && PCBREV >= 2019 + #define LCD_DELAY_NEEDED() true +#else + #define LCD_DELAY_NEEDED() (!WAS_RESET_BY_WATCHDOG_OR_SOFTWARE()) +#endif + void lcdInitFinish() { lcdInitFinished = true; @@ -330,9 +338,9 @@ void lcdInitFinish() initialization (without reset) is also recommended by the data sheet. */ - if (!WAS_RESET_BY_WATCHDOG_OR_SOFTWARE()) { + if (LCD_DELAY_NEEDED()) { #if !defined(BOOT) - while (g_tmr10ms < (RESET_WAIT_DELAY_MS/10)); // wait measured from the power-on + while (g_tmr10ms < (RESET_WAIT_DELAY_MS / 10)); // wait measured from the power-on #else delay_ms(RESET_WAIT_DELAY_MS); #endif diff --git a/radio/src/targets/taranis/led_driver.cpp b/radio/src/targets/taranis/led_driver.cpp index 511a62b43..88ce967fa 100644 --- a/radio/src/targets/taranis/led_driver.cpp +++ b/radio/src/targets/taranis/led_driver.cpp @@ -59,24 +59,24 @@ void ledOff() void ledRed() { -#if defined(LED_RED_GPIO) ledOff(); +#if defined(LED_RED_GPIO) GPIO_LED_GPIO_ON(LED_RED_GPIO, LED_RED_GPIO_PIN); #endif } void ledGreen() { -#if defined(LED_GREEN_GPIO) ledOff(); +#if defined(LED_GREEN_GPIO) GPIO_LED_GPIO_ON(LED_GREEN_GPIO, LED_GREEN_GPIO_PIN); #endif } void ledBlue() { -#if defined(LED_BLUE_GPIO) ledOff(); +#if defined(LED_BLUE_GPIO) GPIO_LED_GPIO_ON(LED_BLUE_GPIO, LED_BLUE_GPIO_PIN); #endif } diff --git a/radio/src/targets/taranis/pulses_driver.cpp b/radio/src/targets/taranis/pulses_driver.cpp deleted file mode 100644 index e2cbf8392..000000000 --- a/radio/src/targets/taranis/pulses_driver.cpp +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright (C) OpenTX - * - * Based on code named - * th9x - http://code.google.com/p/th9x - * er9x - http://code.google.com/p/er9x - * gruvin9x - http://code.google.com/p/gruvin9x - * - * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "opentx.h" - -#if defined(PXX1) -void init_pxx1_pulses(uint8_t module) -{ - if (module == INTERNAL_MODULE) - intmodulePxxStart(); - else - extmodulePxxPulsesStart(); -} - -void init_pxx1_serial(uint8_t module) -{ - if (module == INTERNAL_MODULE) - intmodulePxxStart(); -#if defined(EXTMODULE_USART) - else - extmodulePxxSerialStart(); -#endif -} - -void disable_pxx1_pulses(uint8_t module) -{ - if (module == INTERNAL_MODULE) - intmoduleStop(); - else - extmoduleStop(); -} - -void disable_pxx1_serial(uint8_t module) -{ - if (module == INTERNAL_MODULE) - intmoduleStop(); - else - extmoduleStop(); -} -#endif - -void init_pxx2(uint8_t module) -{ - if (module == INTERNAL_MODULE) - intmoduleSerialStart(INTMODULE_PXX_BAUDRATE, true); - else - extmodulePxx2Start(); -} - -void disable_pxx2(uint8_t module) -{ - if (module == INTERNAL_MODULE) - intmoduleStop(); - else - extmoduleStop(); -} - -#if defined(DSM2) -void disable_serial(uint8_t module) -{ - if (module == EXTERNAL_MODULE) { - extmoduleStop(); - } -} -#endif - -void init_ppm(uint8_t module) -{ - if (module == EXTERNAL_MODULE) { - extmodulePpmStart(); - } -#if defined(INTERNAL_MODULE_PPM) - else { - intmodulePpmStart(); - } -#endif -} - -void disable_ppm(uint8_t module) -{ - if (module == EXTERNAL_MODULE) { - extmoduleStop(); - } -#if defined(INTERNAL_MODULE_PPM) - else { - intmoduleStop(); - } -#endif -} diff --git a/radio/src/targets/taranis/pwr_driver.cpp b/radio/src/targets/taranis/pwr_driver.cpp index ec4e5d3ac..757a6ef06 100644 --- a/radio/src/targets/taranis/pwr_driver.cpp +++ b/radio/src/targets/taranis/pwr_driver.cpp @@ -23,22 +23,35 @@ void pwrInit() { GPIO_InitTypeDef GPIO_InitStructure; - - GPIO_InitStructure.GPIO_Pin = PWR_ON_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; + + // Board PWR + GPIO_InitStructure.GPIO_Pin = PWR_ON_GPIO_PIN; + GPIO_Init(PWR_ON_GPIO, &GPIO_InitStructure); + +#if defined(INTMODULE_BOOTCMD_GPIO) + GPIO_SetBits(INTMODULE_BOOTCMD_GPIO, INTMODULE_BOOTCMD_GPIO_PIN); + GPIO_InitStructure.GPIO_Pin = INTMODULE_BOOTCMD_GPIO_PIN; + GPIO_Init(INTMODULE_BOOTCMD_GPIO, &GPIO_InitStructure); +#endif + + // Internal module power GPIO_ResetBits(INTMODULE_PWR_GPIO, INTMODULE_PWR_GPIO_PIN); GPIO_InitStructure.GPIO_Pin = INTMODULE_PWR_GPIO_PIN; GPIO_Init(INTMODULE_PWR_GPIO, &GPIO_InitStructure); + // External module power EXTERNAL_MODULE_PWR_OFF(); GPIO_InitStructure.GPIO_Pin = EXTMODULE_PWR_GPIO_PIN; GPIO_Init(EXTMODULE_PWR_GPIO, &GPIO_InitStructure); - GPIO_InitStructure.GPIO_Pin = PWR_SWITCH_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; + + // PWR switch + GPIO_InitStructure.GPIO_Pin = PWR_SWITCH_GPIO_PIN; GPIO_Init(PWR_SWITCH_GPIO, &GPIO_InitStructure); #if defined(TRAINER_DETECT_GPIO_PIN) @@ -58,61 +71,26 @@ void pwrInit() GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; GPIO_Init(PCBREV_GPIO, &GPIO_InitStructure); #endif - - pwrOn(); } void pwrOn() { - GPIO_InitTypeDef GPIO_InitStructure; - - GPIO_InitStructure.GPIO_Pin = PWR_ON_GPIO_PIN; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; - GPIO_Init(PWR_ON_GPIO, &GPIO_InitStructure); - GPIO_SetBits(PWR_ON_GPIO, PWR_ON_GPIO_PIN); } void pwrOff() { GPIO_ResetBits(PWR_ON_GPIO, PWR_ON_GPIO_PIN); - - // disable interrupts - __disable_irq(); - - while (1) { - wdt_reset(); -#if defined(PWR_BUTTON_PRESS) - // X9E/X7 needs watchdog reset because CPU is still running while - // the power key is held pressed by the user. - // The power key should be released by now, but we must make sure - if (!pwrPressed()) { - // Put the CPU into sleep to reduce the consumption, - // it might help with the RTC reset issue - PWR->CR |= PWR_CR_CWUF; - /* Select STANDBY mode */ - PWR->CR |= PWR_CR_PDDS; - /* Set SLEEPDEEP bit of Cortex System Control Register */ - SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; - /* Request Wait For Event */ - __WFE(); - } -#endif - } - // this function must not return! } -uint32_t pwrPressed() +bool pwrPressed() { return GPIO_ReadInputDataBit(PWR_SWITCH_GPIO, PWR_SWITCH_GPIO_PIN) == Bit_RESET; } void pwrResetHandler() { - RCC->AHB1ENR |= RCC_AHB1ENR_GPIOEEN; + RCC->AHB1ENR |= PWR_RCC_AHB1Periph; // these two NOPs are needed (see STM32F errata sheet) before the peripheral // register can be written after the peripheral clock was enabled diff --git a/radio/src/targets/taranis/telemetry_driver.cpp b/radio/src/targets/taranis/telemetry_driver.cpp index dc82fcd81..ec6da0c86 100644 --- a/radio/src/targets/taranis/telemetry_driver.cpp +++ b/radio/src/targets/taranis/telemetry_driver.cpp @@ -97,10 +97,46 @@ void telemetryPortSetDirectionInput() void sportSendByte(uint8_t byte) { + telemetryPortSetDirectionOutput(); + while (!(TELEMETRY_USART->SR & USART_SR_TXE)); USART_SendData(TELEMETRY_USART, byte); } +void sportStopSendByteLoop() +{ + DMA_Cmd(TELEMETRY_DMA_Stream_TX, DISABLE); + DMA_DeInit(TELEMETRY_DMA_Stream_TX); +} + +void sportSendByteLoop(uint8_t byte) +{ + telemetryPortSetDirectionOutput(); + + outputTelemetryBuffer.data[0] = byte; + + DMA_InitTypeDef DMA_InitStructure; + DMA_DeInit(TELEMETRY_DMA_Stream_TX); + DMA_InitStructure.DMA_Channel = TELEMETRY_DMA_Channel_TX; + DMA_InitStructure.DMA_PeripheralBaseAddr = CONVERT_PTR_UINT(&TELEMETRY_USART->DR); + DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; + DMA_InitStructure.DMA_Memory0BaseAddr = CONVERT_PTR_UINT(outputTelemetryBuffer.data); + DMA_InitStructure.DMA_BufferSize = 1; + DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; + DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable; + DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; + DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; + DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; + DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh; + DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; + DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full; + DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; + DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; + DMA_Init(TELEMETRY_DMA_Stream_TX, &DMA_InitStructure); + DMA_Cmd(TELEMETRY_DMA_Stream_TX, ENABLE); + USART_DMACmd(TELEMETRY_USART, USART_DMAReq_Tx, ENABLE); +} + void sportSendBuffer(const uint8_t * buffer, uint32_t count) { telemetryPortSetDirectionOutput(); diff --git a/radio/src/targets/taranis/trainer_driver.cpp b/radio/src/targets/taranis/trainer_driver.cpp index 92977c059..0e95f2a59 100644 --- a/radio/src/targets/taranis/trainer_driver.cpp +++ b/radio/src/targets/taranis/trainer_driver.cpp @@ -21,7 +21,7 @@ #include "opentx.h" #if defined(TRAINER_MODULE_SBUS_USART) -DMAFifo<32> heartbeatFifo __DMA (TRAINER_MODULE_SBUS_DMA_Stream); +DMAFifo<32> trainerSbusFifo __DMA (TRAINER_MODULE_SBUS_DMA_STREAM); #endif void trainerSendNextFrame(); @@ -165,10 +165,10 @@ extern "C" void TRAINER_TIMER_IRQHandler() } #endif -#if defined(TRAINER_MODULE_CPPM) - if ((TRAINER_TIMER->DIER & TIM_DIER_CC2IE) && (TRAINER_TIMER->SR & TIM_SR_CC2IF)) { +#if defined(TRAINER_MODULE_CPPM) && !defined(TRAINER_MODULE_CPPM_TIMER_IRQHandler) + if ((TRAINER_TIMER->DIER & TRAINER_MODULE_CPPM_INTERRUPT_ENABLE) && (TRAINER_TIMER->SR & TRAINER_MODULE_CPPM_INTERRUPT_FLAG)) { // capture mode on heartbeat pin (external module) - capture = TRAINER_TIMER->CCR2; + capture = TRAINER_MODULE_CPPM_COUNTER_REGISTER; if (currentTrainerMode == TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE) { doCapture = true; } @@ -202,6 +202,26 @@ extern "C" void TRAINER_TIMER_IRQHandler() #endif } +#if defined(TRAINER_MODULE_CPPM_TIMER_IRQHandler) +extern "C" void TRAINER_MODULE_CPPM_TIMER_IRQHandler() +{ + uint16_t capture = 0; + bool doCapture = false; + + if ((TRAINER_MODULE_CPPM_TIMER->DIER & TRAINER_MODULE_CPPM_INTERRUPT_ENABLE) && (TRAINER_MODULE_CPPM_TIMER->SR & TRAINER_MODULE_CPPM_INTERRUPT_FLAG)) { + // capture mode on external module + capture = TRAINER_MODULE_CPPM_COUNTER_REGISTER; + if (currentTrainerMode == TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE) { + doCapture = true; + } + } + + if (doCapture) { + captureTrainerPulses(capture); + } +} +#endif + #if defined(TRAINER_MODULE_CPPM) void init_trainer_module_cppm() { @@ -217,24 +237,28 @@ void init_trainer_module_cppm() GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(TRAINER_MODULE_CPPM_GPIO, &GPIO_InitStructure); - TRAINER_TIMER->ARR = 0xFFFF; - TRAINER_TIMER->PSC = (PERI1_FREQUENCY * TIMER_MULT_APB1) / 2000000 - 1; // 0.5uS - TRAINER_TIMER->CR2 = 0; - TRAINER_TIMER->CCMR1 = TIM_CCMR1_IC2F_0 | TIM_CCMR1_IC2F_1 | TIM_CCMR1_CC2S_0; - TRAINER_TIMER->CCER = TIM_CCER_CC2E; - TRAINER_TIMER->SR &= ~TIM_SR_CC2IF; // Clear flag - TRAINER_TIMER->DIER |= TIM_DIER_CC2IE; - TRAINER_TIMER->CR1 = TIM_CR1_CEN; + TRAINER_MODULE_CPPM_TIMER->ARR = 0xFFFF; + TRAINER_MODULE_CPPM_TIMER->PSC = (PERI1_FREQUENCY * TIMER_MULT_APB1) / 2000000 - 1; // 0.5uS + TRAINER_MODULE_CPPM_TIMER->CR2 = 0; +#if defined(TRAINER_MODULE_CPPM_CCMR1) + TRAINER_MODULE_CPPM_TIMER->CCMR1 = TRAINER_MODULE_CPPM_CCMR1; +#elif defined(TRAINER_MODULE_CPPM_CCMR2) + TRAINER_MODULE_CPPM_TIMER->CCMR2 = TRAINER_MODULE_CPPM_CCMR2; +#endif + TRAINER_MODULE_CPPM_TIMER->CCER = TRAINER_MODULE_CPPM_CCER; + TRAINER_MODULE_CPPM_TIMER->SR &= ~TRAINER_MODULE_CPPM_INTERRUPT_FLAG; // Clear flag + TRAINER_MODULE_CPPM_TIMER->DIER |= TRAINER_MODULE_CPPM_INTERRUPT_ENABLE; + TRAINER_MODULE_CPPM_TIMER->CR1 = TIM_CR1_CEN; - NVIC_SetPriority(TRAINER_TIMER_IRQn, 7); - NVIC_EnableIRQ(TRAINER_TIMER_IRQn); + NVIC_SetPriority(TRAINER_MODULE_CPPM_TIMER_IRQn, 7); + NVIC_EnableIRQ(TRAINER_MODULE_CPPM_TIMER_IRQn); } void stop_trainer_module_cppm() { - TRAINER_TIMER->DIER = 0; - TRAINER_TIMER->CR1 &= ~TIM_CR1_CEN; // Stop counter - NVIC_DisableIRQ(TRAINER_TIMER_IRQn); // Stop Interrupt + TRAINER_MODULE_CPPM_TIMER->DIER = 0; + TRAINER_MODULE_CPPM_TIMER->CR1 &= ~TIM_CR1_CEN; // Stop counter + NVIC_DisableIRQ(TRAINER_MODULE_CPPM_TIMER_IRQn); // Stop Interrupt if (!IS_EXTERNAL_MODULE_ENABLED()) { EXTERNAL_MODULE_OFF(); @@ -250,14 +274,14 @@ void init_trainer_module_sbus() USART_InitTypeDef USART_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; - GPIO_PinAFConfig(GPIOC, TRAINER_MODULE_CPPM_GPIO_PinSource, TRAINER_MODULE_SBUS_GPIO_AF); + GPIO_PinAFConfig(TRAINER_MODULE_SBUS_GPIO, TRAINER_MODULE_SBUS_GPIO_PinSource, TRAINER_MODULE_SBUS_GPIO_AF); - GPIO_InitStructure.GPIO_Pin = TRAINER_MODULE_CPPM_GPIO_PIN; + GPIO_InitStructure.GPIO_Pin = TRAINER_MODULE_SBUS_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; - GPIO_Init(TRAINER_MODULE_CPPM_GPIO, &GPIO_InitStructure); + GPIO_Init(TRAINER_MODULE_SBUS_GPIO, &GPIO_InitStructure); USART_InitStructure.USART_BaudRate = 100000; USART_InitStructure.USART_WordLength = USART_WordLength_9b; @@ -268,14 +292,14 @@ void init_trainer_module_sbus() USART_Init(TRAINER_MODULE_SBUS_USART, &USART_InitStructure); DMA_InitTypeDef DMA_InitStructure; - heartbeatFifo.clear(); + trainerSbusFifo.clear(); USART_ITConfig(TRAINER_MODULE_SBUS_USART, USART_IT_RXNE, DISABLE); USART_ITConfig(TRAINER_MODULE_SBUS_USART, USART_IT_TXE, DISABLE); - DMA_InitStructure.DMA_Channel = TRAINER_MODULE_SBUS_DMA_Channel; + DMA_InitStructure.DMA_Channel = TRAINER_MODULE_SBUS_DMA_CHANNEL; DMA_InitStructure.DMA_PeripheralBaseAddr = CONVERT_PTR_UINT(&TRAINER_MODULE_SBUS_USART->DR); - DMA_InitStructure.DMA_Memory0BaseAddr = CONVERT_PTR_UINT(heartbeatFifo.buffer()); + DMA_InitStructure.DMA_Memory0BaseAddr = CONVERT_PTR_UINT(trainerSbusFifo.buffer()); DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory; - DMA_InitStructure.DMA_BufferSize = heartbeatFifo.size(); + DMA_InitStructure.DMA_BufferSize = trainerSbusFifo.size(); DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; @@ -286,19 +310,18 @@ void init_trainer_module_sbus() DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full; DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; - DMA_Init(TRAINER_MODULE_SBUS_DMA_Stream, &DMA_InitStructure); + DMA_Init(TRAINER_MODULE_SBUS_DMA_STREAM, &DMA_InitStructure); USART_DMACmd(TRAINER_MODULE_SBUS_USART, USART_DMAReq_Rx, ENABLE); USART_Cmd(TRAINER_MODULE_SBUS_USART, ENABLE); - DMA_Cmd(TRAINER_MODULE_SBUS_DMA_Stream, ENABLE); + DMA_Cmd(TRAINER_MODULE_SBUS_DMA_STREAM, ENABLE); } void stop_trainer_module_sbus() { - DMA_Cmd(TRAINER_MODULE_SBUS_DMA_Stream, DISABLE); + DMA_Cmd(TRAINER_MODULE_SBUS_DMA_STREAM, DISABLE); USART_Cmd(TRAINER_MODULE_SBUS_USART, DISABLE); USART_DMACmd(TRAINER_MODULE_SBUS_USART, USART_DMAReq_Rx, DISABLE); - DMA_DeInit(TRAINER_MODULE_SBUS_DMA_Stream); - NVIC_DisableIRQ(TRAINER_MODULE_SBUS_USART_IRQn); + DMA_DeInit(TRAINER_MODULE_SBUS_DMA_STREAM); if (!IS_EXTERNAL_MODULE_ENABLED()) { EXTERNAL_MODULE_OFF(); @@ -306,13 +329,16 @@ void stop_trainer_module_sbus() } #endif +uint32_t ccount = 0; + #if defined(SBUS) int sbusGetByte(uint8_t * byte) { switch (currentTrainerMode) { #if defined(TRAINER_MODULE_SBUS_USART) case TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE: - return heartbeatFifo.pop(*byte); + ccount++; + return trainerSbusFifo.pop(*byte); #endif #if defined(AUX_SERIAL_USART) case TRAINER_MODE_MASTER_BATTERY_COMPARTMENT: diff --git a/radio/src/tasks.cpp b/radio/src/tasks.cpp index d0d02b9fe..449d61db5 100644 --- a/radio/src/tasks.cpp +++ b/radio/src/tasks.cpp @@ -76,7 +76,7 @@ bool isForcePowerOffRequested() bool isModuleSynchronous(uint8_t module) { uint8_t protocol = moduleState[module].protocol; - if (protocol == PROTOCOL_CHANNELS_PXX2 || protocol == PROTOCOL_CHANNELS_CROSSFIRE || protocol == PROTOCOL_CHANNELS_NONE) + if (protocol == PROTOCOL_CHANNELS_PXX2_HIGHSPEED || protocol == PROTOCOL_CHANNELS_PXX2_LOWSPEED || protocol == PROTOCOL_CHANNELS_CROSSFIRE || protocol == PROTOCOL_CHANNELS_NONE) return true; #if defined(INTMODULE_USART) || defined(EXTMODULE_USART) if (protocol == PROTOCOL_CHANNELS_PXX1_SERIAL) @@ -87,15 +87,16 @@ bool isModuleSynchronous(uint8_t module) void sendSynchronousPulses() { - for (uint8_t module = 0; module < NUM_MODULES; module++) { - if (isModuleSynchronous(module) && setupPulses(module)) { #if defined(HARDWARE_INTERNAL_MODULE) - if (module == INTERNAL_MODULE) - intmoduleSendNextFrame(); + if (isModuleSynchronous(INTERNAL_MODULE)) { + if (setupPulsesInternalModule()) + intmoduleSendNextFrame(); + } #endif - if (module == EXTERNAL_MODULE) - extmoduleSendNextFrame(); - } + + if (isModuleSynchronous(EXTERNAL_MODULE)) { + if (setupPulsesExternalModule()) + extmoduleSendNextFrame(); } } @@ -107,8 +108,8 @@ TASK_FUNCTION(mixerTask) s_pulses_paused = true; while (1) { -#if defined(PCBX9D) || defined(PCBX7) - // SBUS on Hearbeat PIN (which is a serial RX) +#if defined(PCBTARANIS) && defined(SBUS) + // SBUS trainer processSbusInput(); #endif @@ -128,7 +129,7 @@ TASK_FUNCTION(mixerTask) } #else if (isForcePowerOffRequested()) { - pwrOff(); + boardOff(); } #endif @@ -140,8 +141,8 @@ TASK_FUNCTION(mixerTask) run = true; } -#if defined(PXX2) && defined(INTMODULE_HEARTBEAT) - if (moduleState[0].protocol == PROTOCOL_CHANNELS_PXX2 && heartbeatCapture.valid && heartbeatCapture.timestamp > lastRunTime) { +#if defined(INTMODULE_USART) && defined(INTMODULE_HEARTBEAT) + if ((moduleState[INTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PXX2_HIGHSPEED || moduleState[INTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PXX1_SERIAL) && heartbeatCapture.valid && heartbeatCapture.timestamp > lastRunTime) { run = true; } #endif @@ -284,11 +285,11 @@ void tasksStart() cliStart(); #endif - RTOS_CREATE_TASK(mixerTaskId, mixerTask, "Mixer", mixerStack, MIXER_STACK_SIZE, MIXER_TASK_PRIO); - RTOS_CREATE_TASK(menusTaskId, menusTask, "Menus", menusStack, MENUS_STACK_SIZE, MENUS_TASK_PRIO); + RTOS_CREATE_TASK(mixerTaskId, mixerTask, "mixer", mixerStack, MIXER_STACK_SIZE, MIXER_TASK_PRIO); + RTOS_CREATE_TASK(menusTaskId, menusTask, "menus", menusStack, MENUS_STACK_SIZE, MENUS_TASK_PRIO); #if !defined(SIMU) - RTOS_CREATE_TASK(audioTaskId, audioTask, "Audio", audioStack, AUDIO_STACK_SIZE, AUDIO_TASK_PRIO); + RTOS_CREATE_TASK(audioTaskId, audioTask, "audio", audioStack, AUDIO_STACK_SIZE, AUDIO_TASK_PRIO); #endif RTOS_CREATE_MUTEX(audioMutex); diff --git a/radio/src/telemetry/frsky.h b/radio/src/telemetry/frsky.h index 4e121252a..3b7634ab4 100644 --- a/radio/src/telemetry/frsky.h +++ b/radio/src/telemetry/frsky.h @@ -39,11 +39,6 @@ enum FrSkyDataState { #define FRSKY_SPORT_PACKET_SIZE 9 -#define WSHH_TIMEOUT10ms 60 // 600ms - -#define FRSKY_SPORT_AVERAGING 4 -#define FRSKY_D_AVERAGING 8 - // Enumerate FrSky packet codes #define LINKPKT 0xfe #define USRPKT 0xfd @@ -56,7 +51,6 @@ enum FrSkyDataState { #define RSSI2PKT 0xf6 #define RSSI_REQUEST 0xf1 - // FrSky PRIM IDs (1 byte) #define DATA_FRAME 0x10 @@ -99,7 +93,6 @@ enum FrSkyDataState { #define VFAS_D_HIPREC_OFFSET 2000 - // FrSky new DATA IDs (2 bytes) #define ALT_FIRST_ID 0x0100 #define ALT_LAST_ID 0x010f @@ -205,52 +198,44 @@ enum FrSkyDataState { #define DATA_ID_SP2UH 0x45 // 5 #define DATA_ID_SP2UR 0xC6 // 6 -#define IS_HIDDEN_TELEMETRY_VALUE(id) ((id == SP2UART_A_ID) || (id == SP2UART_B_ID) || (id == XJT_VERSION_ID) || (id == RAS_ID) || (id == FACT_TEST_ID)) +inline bool IS_HIDDEN_TELEMETRY_VALUE(uint16_t id) +{ + return (id == SP2UART_A_ID) || (id == SP2UART_B_ID) || (id == XJT_VERSION_ID) || (id == RAS_ID) || (id == FACT_TEST_ID); +} -#define ALARM_GREATER(channel, alarm) ((g_model.frsky.channels[channel].alarms_greater >> alarm) & 1) -#define ALARM_LEVEL(channel, alarm) ((g_model.frsky.channels[channel].alarms_level >> (2*alarm)) & 3) +class TelemetryData { + public: + TelemetryExpiringDecorator swrInternal; + TelemetryExpiringDecorator swrExternal; + TelemetryFilterDecorator rssi; + uint16_t xjtVersion; + bool varioHighPrecision; -#define TELEMETRY_STREAMING() (telemetryData.rssi.value > 0) -#define TELEMETRY_RSSI() (telemetryData.rssi.value) -#define TELEMETRY_RSSI_MIN() (telemetryData.rssi.min) + void setSwr(uint8_t module, uint8_t value) + { + if (module == 0) + swrInternal.set(value); + else + swrExternal.set(value); + } -#define TELEMETRY_CELL_VOLTAGE_MUTLIPLIER 1 + void clear() + { + memset(this, 0, sizeof(*this)); + } +}; -#define TELEMETRY_GPS_SPEED_BP telemetryData.hub.gpsSpeed_bp -#define TELEMETRY_GPS_SPEED_AP telemetryData.hub.gpsSpeed_ap +extern TelemetryData telemetryData; -#define TELEMETRY_ABSOLUTE_GPS_ALT (telemetryData.hub.gpsAltitude) -#define TELEMETRY_RELATIVE_GPS_ALT (telemetryData.hub.gpsAltitude + telemetryData.hub.gpsAltitudeOffset) -#define TELEMETRY_RELATIVE_GPS_ALT_BP (TELEMETRY_RELATIVE_GPS_ALT / 100) +inline bool TELEMETRY_STREAMING() +{ + return telemetryData.rssi.value() > 0; +} -#define TELEMETRY_RELATIVE_BARO_ALT_BP (telemetryData.hub.baroAltitude / 100) -#define TELEMETRY_RELATIVE_BARO_ALT_AP (telemetryData.hub.baroAltitude % 100) - -#define TELEMETRY_BARO_ALT_PREPARE() div_t baroAltitudeDivision = div(getConvertedTelemetryValue(telemetryData.hub.baroAltitude, UNIT_DIST), 100) -#define TELEMETRY_BARO_ALT_FORMAT "%c%d.%02d," -#define TELEMETRY_BARO_ALT_ARGS telemetryData.hub.baroAltitude < 0 ? '-' : ' ', abs(baroAltitudeDivision.quot), abs(baroAltitudeDivision.rem), -#define TELEMETRY_GPS_ALT_FORMAT "%c%d.%02d," -#define TELEMETRY_GPS_ALT_ARGS telemetryData.hub.gpsAltitude < 0 ? '-' : ' ', abs(telemetryData.hub.gpsAltitude / 100), abs(telemetryData.hub.gpsAltitude % 100), -#define TELEMETRY_SPEED_UNIT (IS_IMPERIAL_ENABLE() ? SPEED_UNIT_IMP : SPEED_UNIT_METR) -#define TELEMETRY_GPS_SPEED_FORMAT "%d," -#define TELEMETRY_GPS_SPEED_ARGS telemetryData.hub.gpsSpeed_bp, - -#define TELEMETRY_CELLS_ARGS telemetryData.hub.cellsSum / 10, telemetryData.hub.cellsSum % 10, TELEMETRY_CELL_VOLTAGE(0)/100, TELEMETRY_CELL_VOLTAGE(0)%100, TELEMETRY_CELL_VOLTAGE(1)/100, TELEMETRY_CELL_VOLTAGE(1)%100, TELEMETRY_CELL_VOLTAGE(2)/100, TELEMETRY_CELL_VOLTAGE(2)%100, TELEMETRY_CELL_VOLTAGE(3)/100, TELEMETRY_CELL_VOLTAGE(3)%100, TELEMETRY_CELL_VOLTAGE(4)/100, TELEMETRY_CELL_VOLTAGE(4)%100, TELEMETRY_CELL_VOLTAGE(5)/100, TELEMETRY_CELL_VOLTAGE(5)%100, TELEMETRY_CELL_VOLTAGE(6)/100, TELEMETRY_CELL_VOLTAGE(6)%100, TELEMETRY_CELL_VOLTAGE(7)/100, TELEMETRY_CELL_VOLTAGE(7)%100, TELEMETRY_CELL_VOLTAGE(8)/100, TELEMETRY_CELL_VOLTAGE(8)%100, TELEMETRY_CELL_VOLTAGE(9)/100, TELEMETRY_CELL_VOLTAGE(9)%100, TELEMETRY_CELL_VOLTAGE(10)/100, TELEMETRY_CELL_VOLTAGE(10)%100, TELEMETRY_CELL_VOLTAGE(11)/100, TELEMETRY_CELL_VOLTAGE(11)%100, -#define TELEMETRY_CELLS_FORMAT "%d.%d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d,%d.%02d," -#define TELEMETRY_CELLS_LABEL "Cell volts,Cell 1,Cell 2,Cell 3,Cell 4,Cell 5,Cell 6,Cell 7,Cell 8,Cell 9,Cell 10,Cell 11,Cell 12," - -#define TELEMETRY_CURRENT_FORMAT "%d.%d," -#define TELEMETRY_CURRENT_ARGS telemetryData.hub.current / 10, telemetryData.hub.current % 10, -#define TELEMETRY_VFAS_FORMAT "%d.%d," -#define TELEMETRY_VFAS_ARGS telemetryData.hub.vfas / 10, telemetryData.hub.vfas % 10, -#define TELEMETRY_VSPEED_FORMAT "%c%d.%02d," -#define TELEMETRY_VSPEED_ARGS telemetryData.hub.varioSpeed < 0 ? '-' : ' ', abs(telemetryData.hub.varioSpeed / 100), abs(telemetryData.hub.varioSpeed % 100), -#define TELEMETRY_ASPEED_FORMAT "%d.%d," -#define TELEMETRY_ASPEED_ARGS telemetryData.hub.airSpeed / 10, telemetryData.hub.airSpeed % 10, -#define TELEMETRY_OPENXSENSOR() (0) - -#define TELEMETRY_CELL_VOLTAGE(k) (telemetryData.hub.cellVolts[k] * TELEMETRY_CELL_VOLTAGE_MUTLIPLIER) -#define TELEMETRY_MIN_CELL_VOLTAGE (telemetryData.hub.minCellVolts * TELEMETRY_CELL_VOLTAGE_MUTLIPLIER) +inline uint8_t TELEMETRY_RSSI() +{ + return telemetryData.rssi.value(); +} #define START_STOP 0x7E #define BYTESTUFF 0x7D @@ -280,25 +265,6 @@ void telemetryInit(uint8_t protocol); void telemetryInterrupt10ms(); -class TelemetryData { - public: - TelemetryExpiringDecorator swrInternal; - TelemetryExpiringDecorator swrExternal; - TelemetryFilterDecorator rssi; - uint16_t xjtVersion; - bool varioHighPrecision; - - void setSwr(uint8_t module, uint8_t value) - { - if (module == 0) - swrInternal.set(value); - else - swrExternal.set(value); - } -}; - -extern TelemetryData telemetryData; - bool pushFrskyTelemetryData(uint8_t data); // returns true when end of frame detected void processFrskyTelemetryData(uint8_t data); diff --git a/radio/src/telemetry/frsky_pxx2.cpp b/radio/src/telemetry/frsky_pxx2.cpp index 5e051a1b1..a5fd3c568 100644 --- a/radio/src/telemetry/frsky_pxx2.cpp +++ b/radio/src/telemetry/frsky_pxx2.cpp @@ -53,12 +53,17 @@ void processGetHardwareInfoFrame(uint8_t module, uint8_t * frame) uint8_t index = frame[3]; uint8_t modelId = frame[4]; - if (index == PXX2_HW_INFO_TX_ID && modelId < DIM(PXX2modulesModels)) { - memcpy(&destination->information, &frame[4], sizeof(PXX2HardwareInformation)); + uint8_t length = min(frame[0] - 3, sizeof(PXX2HardwareInformation)); + if (index == PXX2_HW_INFO_TX_ID && modelId < DIM(PXX2ModulesNames)) { + memcpy(&destination->information, &frame[4], length); + if (destination->information.capabilities & ~((1 << MODULE_CAPABILITY_COUNT) - 1)) + destination->information.capabilityNotSupported = true; } - else if (index < PXX2_MAX_RECEIVERS_PER_MODULE && modelId < DIM(PXX2receiversModels)) { - memcpy(&destination->receivers[index].information, &frame[4], sizeof(PXX2HardwareInformation)); + else if (index < PXX2_MAX_RECEIVERS_PER_MODULE && modelId < DIM(PXX2ReceiversNames)) { + memcpy(&destination->receivers[index].information, &frame[4], length); destination->receivers[index].timestamp = get_tmr10ms(); + if (destination->receivers[index].information.capabilities & ~((1 << RECEIVER_CAPABILITY_COUNT) - 1)) + destination->information.capabilityNotSupported = true; } } @@ -78,7 +83,7 @@ void processModuleSettingsFrame(uint8_t module, uint8_t * frame) destination->txPower = frame[5]; destination->state = PXX2_SETTINGS_OK; - destination->retryTime = 0; + destination->timeout = 0; moduleState[module].mode = MODULE_MODE_NORMAL; } @@ -88,20 +93,25 @@ void processReceiverSettingsFrame(uint8_t module, uint8_t * frame) return; } + ReceiverSettings * destination = moduleState[module].receiverSettings; + + if (frame[4] & PXX2_RX_SETTINGS_FLAG1_FPORT) + destination->fport = 1; + if (frame[4] & PXX2_RX_SETTINGS_FLAG1_FASTPWM) - reusableBuffer.hardwareAndSettings.receiverSettings.pwmRate = 1; + destination->pwmRate = 1; if (frame[4] & PXX2_RX_SETTINGS_FLAG1_TELEMETRY_DISABLED) - reusableBuffer.hardwareAndSettings.receiverSettings.telemetryDisabled = 1; + destination->telemetryDisabled = 1; uint8_t outputsCount = min(16, frame[0] - 4); - reusableBuffer.hardwareAndSettings.receiverSettings.outputsCount = outputsCount; + destination->outputsCount = outputsCount; for (uint8_t pin = 0; pin < outputsCount; pin++) { - reusableBuffer.hardwareAndSettings.receiverSettings.outputsMapping[pin] = frame[5 + pin]; + destination->outputsMapping[pin] = frame[5 + pin]; } - reusableBuffer.hardwareAndSettings.receiverSettings.state = PXX2_SETTINGS_OK; - reusableBuffer.hardwareAndSettings.receiverSettings.timeout = 0; + destination->state = PXX2_SETTINGS_OK; + destination->timeout = 0; moduleState[module].mode = MODULE_MODE_NORMAL; } @@ -118,6 +128,9 @@ void processRegisterFrame(uint8_t module, uint8_t * frame) str2zchar(reusableBuffer.moduleSetup.pxx2.registerRxName, (const char *)&frame[4], PXX2_LEN_RX_NAME); reusableBuffer.moduleSetup.pxx2.registerLoopIndex = frame[12]; reusableBuffer.moduleSetup.pxx2.registerStep = REGISTER_RX_NAME_RECEIVED; +#if defined(COLORLCD) + putEvent(EVT_REFRESH); +#endif } break; @@ -211,20 +224,20 @@ void processSpectrumAnalyserFrame(uint8_t module, uint8_t * frame) return; } - uint32_t * frequency = (uint32_t *)&frame[4]; - int8_t * power = (int8_t *)&frame[8]; + uint32_t frequency = *((uint32_t *)&frame[4]); + int8_t power = *((int8_t *)&frame[8]); // center = 2440000000; // 2440MHz // span = 40000000; // 40MHz // left = 2440000000 - 20000000 // step = 10000 - // TRACE("Fq=%u, Pw=%d, X=%d, Y=%d", *frequency, int32_t(*power), D * 128 / 40000000, int32_t(127 + *power)); + int32_t offset = frequency - (reusableBuffer.spectrumAnalyser.freq - reusableBuffer.spectrumAnalyser.span / 2); + TRACE("Fq=%u => %d, Pw=%d", frequency, offset, int32_t(power)); - int32_t position = *frequency - (reusableBuffer.spectrumAnalyser.freq - reusableBuffer.spectrumAnalyser.span / 2); - uint32_t x = (position * LCD_W / 8) / (reusableBuffer.spectrumAnalyser.span / 8); + uint32_t x = offset / reusableBuffer.spectrumAnalyser.step; if (x < LCD_W) { - reusableBuffer.spectrumAnalyser.bars[x] = 0x80 + *power; + reusableBuffer.spectrumAnalyser.bars[x] = 0x80 + power; } } diff --git a/radio/src/telemetry/telemetry.cpp b/radio/src/telemetry/telemetry.cpp index 36d260a21..6d7a1ea6d 100644 --- a/radio/src/telemetry/telemetry.cpp +++ b/radio/src/telemetry/telemetry.cpp @@ -71,10 +71,10 @@ inline bool isBadAntennaDetected() if (!isRasValueValid()) return false; - if (telemetryData.swrInternal.isFresh() && telemetryData.swrInternal.value > FRSKY_BAD_ANTENNA_THRESHOLD) + if (telemetryData.swrInternal.isFresh() && telemetryData.swrInternal.value() > FRSKY_BAD_ANTENNA_THRESHOLD) return true; - if (telemetryData.swrExternal.isFresh() && telemetryData.swrExternal.value > FRSKY_BAD_ANTENNA_THRESHOLD) + if (telemetryData.swrExternal.isFresh() && telemetryData.swrExternal.value() > FRSKY_BAD_ANTENNA_THRESHOLD) return true; return false; @@ -210,15 +210,12 @@ void telemetryInterrupt10ms() { if (TELEMETRY_STREAMING()) { - if (!TELEMETRY_OPENXSENSOR()) { - for (int i=0; i> 8; // 0-100 crc &= 0x00ff; } - pushByte(0xFF - crc); + pushByteWithBytestuffing(0xFF - crc); } public: @@ -237,10 +237,16 @@ extern OutputTelemetryBuffer outputTelemetryBuffer __DMA; extern Fifo * luaInputTelemetryFifo; #endif -#if defined(STM32) -#define IS_TELEMETRY_INTERNAL_MODULE() (g_model.moduleData[INTERNAL_MODULE].type == MODULE_TYPE_XJT_PXX1) +#if defined(PCBTARANIS) || defined(PCBHORUS) +inline bool isSportLineUsedByInternalModule() +{ + return g_model.moduleData[INTERNAL_MODULE].type == MODULE_TYPE_XJT_PXX1; +} #else -#define IS_TELEMETRY_INTERNAL_MODULE() (false) +inline bool isSportLineUsedByInternalModule() +{ + return false; +} #endif void processPXX2Frame(uint8_t module, uint8_t *frame); diff --git a/radio/src/telemetry/telemetry_holders.h b/radio/src/telemetry/telemetry_holders.h index 735a9889a..70b2b6a9c 100644 --- a/radio/src/telemetry/telemetry_holders.h +++ b/radio/src/telemetry/telemetry_holders.h @@ -29,31 +29,37 @@ class TelemetryValue { public: - uint8_t value; + uint8_t value() + { + return _value; + } + void set(uint8_t value) { - this->value = value; + _value = value; } void reset() { set(0); - }; + } + + protected: + uint8_t _value; }; template class TelemetryFilterDecorator: public T { public: - uint8_t values[TELEMETRY_AVERAGE_COUNT]; void set(uint8_t value) { - if (this->value == 0) { + if (value == 0 || this->_value == 0) { memset(values, value, TELEMETRY_AVERAGE_COUNT); - this->value = value; + this->_value = value; } else { - //calculate the average from values[] and value - //also shift readings in values [] array + // calculate the average from values[] and value + // also shift readings in values [] array unsigned int sum = values[0]; for (int i=0; ivalue = sum / (TELEMETRY_AVERAGE_COUNT+1); + this->_value = sum / (TELEMETRY_AVERAGE_COUNT+1); } } + void reset() { memclear(this, sizeof(*this)); - }; + } + + protected: + uint8_t values[TELEMETRY_AVERAGE_COUNT]; }; template class TelemetryExpiringDecorator: public T { public: - tmr10ms_t expirationTime; void set(uint8_t value) { T::set(value); expirationTime = get_tmr10ms() + 1000/*10s*/; } + void reset() { memclear(this, sizeof(*this)); } + bool isFresh() { return get_tmr10ms() < expirationTime; } + + protected: + tmr10ms_t expirationTime; }; template class TelemetryMinDecorator: public T { public: - uint8_t min; void set(uint8_t value) { T::set(value); - if (!min || value < min) { - min = value; + if (!_min || value < _min) { + _min = value; } } + + uint8_t min() + { + return _min; + } + void reset() { memclear(this, sizeof(*this)); } + + protected: + uint8_t _min; }; #endif // _TELEMETRY_HOLDERS_H_ diff --git a/radio/src/telemetry/telemetry_sensors.cpp b/radio/src/telemetry/telemetry_sensors.cpp index fe97a0397..8e4e72829 100644 --- a/radio/src/telemetry/telemetry_sensors.cpp +++ b/radio/src/telemetry/telemetry_sensors.cpp @@ -141,7 +141,7 @@ void TelemetryItem::setValue(const TelemetrySensor & sensor, int32_t val, uint32 } else if (unit == UNIT_GPS_LATITUDE) { #if defined(INTERNAL_GPS) - if (gpsData.fix) { + if (gpsData.fix && gpsData.hdop < PILOTPOS_MIN_HDOP) { pilotLatitude = gpsData.latitude; distFromEarthAxis = getDistFromEarthAxis(pilotLatitude); } @@ -156,7 +156,7 @@ void TelemetryItem::setValue(const TelemetrySensor & sensor, int32_t val, uint32 } else if (unit == UNIT_GPS_LONGITUDE) { #if defined(INTERNAL_GPS) - if (gpsData.fix) { + if (gpsData.fix && gpsData.hdop < PILOTPOS_MIN_HDOP) { pilotLongitude = gpsData.longitude; } #endif diff --git a/radio/src/tests/CMakeLists.txt b/radio/src/tests/CMakeLists.txt index 20a253d1a..bef6b072e 100644 --- a/radio/src/tests/CMakeLists.txt +++ b/radio/src/tests/CMakeLists.txt @@ -1,4 +1,4 @@ -set(GTEST_ROOT /usr CACHE string "Base path to Google Test headers and source.") +set(GTEST_ROOT /usr CACHE STRING "Base path to Google Test headers and source.") find_path(GTEST_INCDIR gtest/gtest.h HINTS "${GTEST_ROOT}/include" DOC "Path to Google Test header files folder ('gtest/gtest.h').") find_path(GTEST_SRCDIR src/gtest-all.cc HINTS "${GTEST_ROOT}" "${GTEST_ROOT}/src/gtest" DOC "Path of Google Test 'src' folder.") @@ -34,7 +34,7 @@ if(GTEST_INCDIR AND GTEST_SRCDIR AND Qt5Widgets_FOUND) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mno-ms-bitfields") endif() set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -O0") - set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0") + set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0 ${WARNING_FLAGS}") use_cxx11() # ensure gnu++11 in CXX_FLAGS with CMake < 3.1 diff --git a/radio/src/tests/conversions.cpp b/radio/src/tests/conversions.cpp index 50d94c531..0726e29ee 100644 --- a/radio/src/tests/conversions.cpp +++ b/radio/src/tests/conversions.cpp @@ -52,7 +52,7 @@ TEST(Conversions, ConversionX9DPFrom22) EXPECT_ZSTREQ("Thr", g_model.inputNames[0]); EXPECT_ZSTREQ("Tes", g_model.telemetrySensors[0].label); EXPECT_EQ(10, g_model.telemetrySensors[0].id); - EXPECT_EQ(10, g_model.telemetrySensors[0].frskyInstance.physID); + EXPECT_EQ(9, g_model.telemetrySensors[0].frskyInstance.physID); } #endif @@ -77,10 +77,12 @@ TEST(Conversions, ConversionX7From22) EXPECT_ZSTREQ("Tes", g_model.telemetrySensors[0].label); EXPECT_EQ(10, g_model.telemetrySensors[0].id); - EXPECT_EQ(10, g_model.telemetrySensors[0].frskyInstance.physID); + EXPECT_EQ(9, g_model.telemetrySensors[0].frskyInstance.physID); EXPECT_EQ(-100, g_model.limitData[0].max); EXPECT_EQ(10, g_model.flightModeData[0].gvars[0]); + EXPECT_ZSTREQ("FMtest", g_model.flightModeData[1].name); + EXPECT_EQ(45, g_model.flightModeData[1].swtch); EXPECT_ZSTREQ("Tes", g_model.gvars[0].name); EXPECT_EQ(LS_FUNC_VPOS, g_model.logicalSw[0].func); @@ -89,6 +91,7 @@ TEST(Conversions, ConversionX7From22) EXPECT_EQ(TELEMETRY_SCREEN_TYPE_VALUES, g_model.screensType & 0x03); EXPECT_EQ(MIXSRC_FIRST_TRAINER, g_model.screens[0].lines[0].sources[0]); + EXPECT_EQ(MIXSRC_TIMER3, g_model.screens[0].lines[0].sources[1]); } #endif @@ -116,7 +119,7 @@ TEST(Conversions, ConversionHorusFrom22) EXPECT_ZSTREQ("Rud", g_model.inputNames[0]); EXPECT_ZSTREQ("Tes", g_model.telemetrySensors[0].label); EXPECT_EQ(10, g_model.telemetrySensors[0].id); - EXPECT_EQ(10, g_model.telemetrySensors[0].frskyInstance.physID); + EXPECT_EQ(9, g_model.telemetrySensors[0].frskyInstance.physID); } #endif diff --git a/radio/src/tests/eeprom.cpp b/radio/src/tests/eeprom.cpp index 7dce423c7..aa92eaebd 100644 --- a/radio/src/tests/eeprom.cpp +++ b/radio/src/tests/eeprom.cpp @@ -35,7 +35,6 @@ PACK(struct RamBackupUncompressed { extern Backup::RamBackupUncompressed ramBackupUncompressed; TEST(Storage, BackupAndRestore) { - rambackupWrite(); Backup::RamBackupUncompressed ramBackupRestored; if (uncompress((uint8_t *)&ramBackupRestored, sizeof(ramBackupRestored), ramBackup->data, ramBackup->size) != sizeof(ramBackupUncompressed)) @@ -55,10 +54,10 @@ TEST(Eeprom, 100_random_writes) storageFormat(); - for(int i=0; i<100; i++) { - int size = rand()%800; - for(int j=0; j> testVal; - testVal.value = 0; + testVal.reset(); testVal.set(10); - EXPECT_EQ(RAW_FRSKY_MINMAX(testVal), 10); - EXPECT_EQ(testVal.value, expected[testPos++]); - for(int n=2; n<10; ++n) { - testVal.set(n*10); - EXPECT_EQ(RAW_FRSKY_MINMAX(testVal), n*10); - EXPECT_EQ(testVal.value, expected[testPos++]); + EXPECT_EQ(testVal.value(), expected[testPos++]); + for (int n = 2; n < 10; ++n) { + testVal.set(n * 10); + EXPECT_EQ(testVal.value(), expected[testPos++]); } - for(int n=2; n<10; ++n) { + for (int n = 2; n < 10; ++n) { testVal.set(100); - EXPECT_EQ(RAW_FRSKY_MINMAX(testVal), 100); - EXPECT_EQ(testVal.value, expected[testPos++]); + EXPECT_EQ(testVal.value(), expected[testPos++]); } } @@ -190,8 +187,6 @@ void generateSportCellPacket(uint8_t * packet, uint8_t cells, uint8_t battnumber setSportPacketCrc(packet); } -#define _V(volts) (volts/TELEMETRY_CELL_VOLTAGE_MUTLIPLIER) - TEST(FrSkySPORT, FrSkyDCells) { MODEL_RESET(); @@ -227,12 +222,12 @@ TEST(FrSkySPORT, frskySetCellVoltage) allowNewSensors = true; // test that simulates 3 cell battery - generateSportCellPacket(packet, 3, 0, _V(410), _V(420)); sportProcessTelemetryPacket(packet); + generateSportCellPacket(packet, 3, 0, 410, 420); sportProcessTelemetryPacket(packet); EXPECT_EQ(checkSportPacket(packet), true) << "Bad CRC generation in setSportPacketCrc()"; - generateSportCellPacket(packet, 3, 2, _V(430), _V( 0)); sportProcessTelemetryPacket(packet); + generateSportCellPacket(packet, 3, 2, 430, 0); sportProcessTelemetryPacket(packet); - generateSportCellPacket(packet, 3, 0, _V(405), _V(300)); sportProcessTelemetryPacket(packet); - generateSportCellPacket(packet, 3, 2, _V(430), _V( 0)); sportProcessTelemetryPacket(packet); + generateSportCellPacket(packet, 3, 0, 405, 300); sportProcessTelemetryPacket(packet); + generateSportCellPacket(packet, 3, 2, 430, 0); sportProcessTelemetryPacket(packet); EXPECT_EQ(telemetryItems[0].cells.count, 3); EXPECT_EQ(telemetryItems[0].cells.values[0].value, 405); @@ -243,11 +238,11 @@ TEST(FrSkySPORT, frskySetCellVoltage) EXPECT_EQ(telemetryItems[0].valueMin, 1135); EXPECT_EQ(telemetryItems[0].valueMax, 1260); - generateSportCellPacket(packet, 3, 0, _V(405), _V(250)); sportProcessTelemetryPacket(packet); - generateSportCellPacket(packet, 3, 2, _V(430), _V( 0)); sportProcessTelemetryPacket(packet); + generateSportCellPacket(packet, 3, 0, 405, 250); sportProcessTelemetryPacket(packet); + generateSportCellPacket(packet, 3, 2, 430, 0); sportProcessTelemetryPacket(packet); - generateSportCellPacket(packet, 3, 0, _V(410), _V(420)); sportProcessTelemetryPacket(packet); - generateSportCellPacket(packet, 3, 2, _V(430), _V( 0)); sportProcessTelemetryPacket(packet); + generateSportCellPacket(packet, 3, 0, 410, 420); sportProcessTelemetryPacket(packet); + generateSportCellPacket(packet, 3, 2, 430, 0); sportProcessTelemetryPacket(packet); EXPECT_EQ(telemetryItems[0].cells.count, 3); EXPECT_EQ(telemetryItems[0].cells.values[0].value, 410); @@ -259,9 +254,9 @@ TEST(FrSkySPORT, frskySetCellVoltage) EXPECT_EQ(telemetryItems[0].valueMax, 1260); //add another two cells - 5 cell battery - generateSportCellPacket(packet, 5, 0, _V(418), _V(408)); sportProcessTelemetryPacket(packet); - generateSportCellPacket(packet, 5, 2, _V(415), _V(420)); sportProcessTelemetryPacket(packet); - generateSportCellPacket(packet, 5, 4, _V(410), _V( 0)); sportProcessTelemetryPacket(packet); + generateSportCellPacket(packet, 5, 0, 418, 408); sportProcessTelemetryPacket(packet); + generateSportCellPacket(packet, 5, 2, 415, 420); sportProcessTelemetryPacket(packet); + generateSportCellPacket(packet, 5, 4, 410, 0); sportProcessTelemetryPacket(packet); EXPECT_EQ(telemetryItems[0].cells.count, 5); EXPECT_EQ(telemetryItems[0].cells.values[0].value, 418); @@ -275,9 +270,9 @@ TEST(FrSkySPORT, frskySetCellVoltage) EXPECT_EQ(telemetryItems[0].valueMax, 2071); //simulate very low voltage for cell 3 - generateSportCellPacket(packet, 5, 0, _V(418), _V(408)); sportProcessTelemetryPacket(packet); - generateSportCellPacket(packet, 5, 2, _V(100), _V(420)); sportProcessTelemetryPacket(packet); - generateSportCellPacket(packet, 5, 4, _V(410), _V( 0)); sportProcessTelemetryPacket(packet); + generateSportCellPacket(packet, 5, 0, 418, 408); sportProcessTelemetryPacket(packet); + generateSportCellPacket(packet, 5, 2, 100, 420); sportProcessTelemetryPacket(packet); + generateSportCellPacket(packet, 5, 4, 410, 0); sportProcessTelemetryPacket(packet); EXPECT_EQ(telemetryItems[0].cells.count, 5); EXPECT_EQ(telemetryItems[0].cells.values[0].value, 418); @@ -291,10 +286,10 @@ TEST(FrSkySPORT, frskySetCellVoltage) EXPECT_EQ(telemetryItems[0].valueMax, 2071); //back to normal (but with reversed order of packets) - generateSportCellPacket(packet, 5, 4, _V(410), _V( 0)); sportProcessTelemetryPacket(packet); - generateSportCellPacket(packet, 5, 0, _V(418), _V(408)); sportProcessTelemetryPacket(packet); - generateSportCellPacket(packet, 5, 2, _V(412), _V(420)); sportProcessTelemetryPacket(packet); - generateSportCellPacket(packet, 5, 4, _V(410), _V( 0)); sportProcessTelemetryPacket(packet); + generateSportCellPacket(packet, 5, 4, 410, 0); sportProcessTelemetryPacket(packet); + generateSportCellPacket(packet, 5, 0, 418, 408); sportProcessTelemetryPacket(packet); + generateSportCellPacket(packet, 5, 2, 412, 420); sportProcessTelemetryPacket(packet); + generateSportCellPacket(packet, 5, 4, 410, 0); sportProcessTelemetryPacket(packet); EXPECT_EQ(telemetryItems[0].cells.count, 5); EXPECT_EQ(telemetryItems[0].cells.values[0].value, 418); @@ -334,8 +329,8 @@ TEST(FrSkySPORT, frskySetCellVoltageTwoSensors) allowNewSensors = true; //sensor 1: 3 cell battery - generateSportCellPacket(packet, 3, 0, _V(418), _V(416)); sportProcessTelemetryPacket(packet); - generateSportCellPacket(packet, 3, 2, _V(415), _V( 0)); sportProcessTelemetryPacket(packet); + generateSportCellPacket(packet, 3, 0, 418, 416); sportProcessTelemetryPacket(packet); + generateSportCellPacket(packet, 3, 2, 415, 0); sportProcessTelemetryPacket(packet); EXPECT_EQ(telemetryItems[0].cells.count, 3); EXPECT_EQ(telemetryItems[0].cells.values[0].value, 418); @@ -347,8 +342,8 @@ TEST(FrSkySPORT, frskySetCellVoltageTwoSensors) EXPECT_EQ(telemetryItems[0].valueMax, 1249); //sensor 2: 4 cell battery - generateSportCellPacket(packet, 4, 0, _V(410), _V(420), DATA_ID_FLVSS+1); sportProcessTelemetryPacket(packet); - generateSportCellPacket(packet, 4, 2, _V(400), _V(405), DATA_ID_FLVSS+1); sportProcessTelemetryPacket(packet); + generateSportCellPacket(packet, 4, 0, 410, 420, DATA_ID_FLVSS+1); sportProcessTelemetryPacket(packet); + generateSportCellPacket(packet, 4, 2, 400, 405, DATA_ID_FLVSS+1); sportProcessTelemetryPacket(packet); EXPECT_EQ(telemetryItems[1].cells.count, 4); EXPECT_EQ(telemetryItems[1].cells.values[0].value, 410); @@ -372,10 +367,10 @@ TEST(FrSkySPORT, frskySetCellVoltageTwoSensors) EXPECT_EQ(telemetryItems[2].valueMax, 287); //now change some voltages - generateSportCellPacket(packet, 3, 2, _V(415), _V( 0)); sportProcessTelemetryPacket(packet); - generateSportCellPacket(packet, 4, 2, _V(390), _V(370), DATA_ID_FLVSS+1); sportProcessTelemetryPacket(packet); - generateSportCellPacket(packet, 3, 0, _V(420), _V(410)); sportProcessTelemetryPacket(packet); - generateSportCellPacket(packet, 4, 0, _V(410), _V(420), DATA_ID_FLVSS+1); sportProcessTelemetryPacket(packet); + generateSportCellPacket(packet, 3, 2, 415, 0); sportProcessTelemetryPacket(packet); + generateSportCellPacket(packet, 4, 2, 390, 370, DATA_ID_FLVSS+1); sportProcessTelemetryPacket(packet); + generateSportCellPacket(packet, 3, 0, 420, 410); sportProcessTelemetryPacket(packet); + generateSportCellPacket(packet, 4, 0, 410, 420, DATA_ID_FLVSS+1); sportProcessTelemetryPacket(packet); telemetryWakeup(); diff --git a/radio/src/tests/gtests.cpp b/radio/src/tests/gtests.cpp index 98493ade7..d7b5a0a7c 100644 --- a/radio/src/tests/gtests.cpp +++ b/radio/src/tests/gtests.cpp @@ -148,7 +148,10 @@ int main(int argc, char **argv) { QCoreApplication app(argc, argv); simuInit(); - StartEepromThread(NULL); + StartEepromThread(nullptr); +#if defined(EEPROM_SIZE) + eeprom = (uint8_t *)malloc(EEPROM_SIZE); +#endif menuLevel = 0; menuHandlers[0] = menuMainView; InitGoogleTest(&argc, argv); diff --git a/radio/src/tests/gtests.h b/radio/src/tests/gtests.h index 360084bca..5be8b49be 100644 --- a/radio/src/tests/gtests.h +++ b/radio/src/tests/gtests.h @@ -81,10 +81,8 @@ inline void MIXER_RESET() inline void TELEMETRY_RESET() { #if defined(TELEMETRY_FRSKY) - memclear(&telemetryData, sizeof(telemetryData)); - TELEMETRY_RSSI() = 100; -#endif -#if defined(TELEMETRY_FRSKY) + telemetryData.clear(); + telemetryData.rssi.set(100); for (int i=0; i> Reset" +#define TR_MENUTORESET TR_ENTER" >> Reset" #define TR_PPM_TRAINER "TR" #define TR_CH "CH" #define TR_MODEL "MODEL" @@ -699,12 +694,12 @@ #define TR_MONITOR_CHANNELS4 "MONITOR KANÁLŮ 25/32" #define TR_MONITOR_OUTPUT_DESC "Výstupy" #define TR_MONITOR_MIXER_DESC "Mixy" -#define TR_RECEIVER_NUM TR(INDENT "RX číslo", INDENT "Číslo přijímače") +#define TR_RECEIVER_NUM TR("RX číslo", "Číslo přijímače") #define TR_RECEIVER "Přijímač" #define TR_MULTI_RFTUNE TR(INDENT "Ladění frek", INDENT "Jemné ladění frek. RF") #define TR_MULTI_TELEMETRY "Telemetrie" #define TR_MULTI_VIDFREQ TR(INDENT "Freq. videa", INDENT "Frekvence videa") -#define TR_MULTI_RFPOWER INDENT "Výkon RF" +#define TR_RFPOWER INDENT "Výkon RF" #define TR_MULTI_OPTION TR(INDENT "Možnosti", INDENT "Hodnota") #define TR_MULTI_AUTOBIND TR(INDENT "Autobind",INDENT "Bind při zapnutí") #define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetekce", INDENT "Formát autodetekce") @@ -719,7 +714,7 @@ #define TR_MODULE_BINDING TR("Bind...","Párování") #define TR_REBIND "Nutno přepárovat" #define TR_REG_OK "Registrace ok" -#define TR_BIND_OK "úspěšné párovaní" +#define TR_BIND_OK "Úspěšné párovaní" #define TR_BINDING_CH1_8_TELEM_ON "k1-8 telem zap" #define TR_BINDING_CH1_8_TELEM_OFF "k1-8 telem vyp" #define TR_BINDING_CH9_16_TELEM_ON "k9-16 telem zap" @@ -760,13 +755,13 @@ #define TR_CAT_NOT_EMPTY "Kategorie není prázdná" #define TR_SDCARD_ERROR "Chyba SD karty" #define TR_NO_SDCARD "Není SD karta" -#define TR_WAITING_FOR_RX "čekám na RX..." -#define TR_WAITING_FOR_TX "čekám na TX..." -#define TR_NO_TOOLS "Žádné nástroje k dispozici" +#define TR_WAITING_FOR_RX "Čekám na RX..." +#define TR_WAITING_FOR_TX "Čekám na TX..." +#define TR_NO_TOOLS TR("Nejsou k dispozici", "Žádné nástroje k dispozici") #define TR_NORMAL "Normální" #define TR_NOT_INVERTED "Neinvert" #define TR_NOT_CONNECTED "Nepřipojen" -#define TR_CONNECTED "P5ipojen" +#define TR_CONNECTED "Připojen" #define TR_FLEX_915 "Flex 915MHz" #define TR_FLEX_868 "Flex 868MHz" #define TR_16CH_WITHOUT_TELEMETRY TR("16k bez telem.", "16k bez telemetrie") @@ -778,18 +773,19 @@ #define TR_UPDATE_TX_OPTIONS "Uložit nastavení?" #define TR_MODULES_RX_VERSION "Verze modulu a RX" #define TR_MENU_MODULES_RX_VERSION "VERZE MODULU A RX" +#define TR_MENU_FIRM_OPTIONS "FIRMWARE OPTIONS" #define TR_GYRO "Gyro" -#define TR_STICKS_POTS_SLIDERS "Páky/Poty/Slidery" -#define TR_PWM_STICKS_POTS_SLIDERS "PWM Páky/Poty/Slidery" +#define TR_STICKS_POTS_SLIDERS "páky/pot./slidery" +#define TR_PWM_STICKS_POTS_SLIDERS "PWM páky/pot./slidery" #define TR_RF_PROTOCOL "RF Protokol" #define TR_MODULE_OPTIONS "Možnosti modulu" #define TR_POWER "Výkon" -#define TR_NO_TX_OPTIONS "žádné možnosti" +#define TR_NO_TX_OPTIONS "Žádné možnosti" #define TR_RTC_BATT "RTC Bat" -#define TR_POWER_METER_EXT "Měřák výkonu (EXT)" -#define TR_POWER_METER_INT "Měřák výkonu (INT)" -#define TR_SPECTRUM_ANALYSER_EXT "Spekt. an. (EXT)" -#define TR_SPECTRUM_ANALYSER_INT "Spekt. an. (INT)" +#define TR_POWER_METER_EXT "Měřič výkonu (EXT)" +#define TR_POWER_METER_INT "Měřič výkonu (INT)" +#define TR_SPECTRUM_ANALYSER_EXT "Spektální an. (EXT)" +#define TR_SPECTRUM_ANALYSER_INT "Spektální an. (INT)" #define TR_SDCARD_FULL "Plná SD karta" #define TR_INCOMPATIBLE "Nekompatibilní" #define TR_WARNING "KONTROLA" @@ -803,6 +799,8 @@ #define TR_NIGHTLY_WARNING TR("NOČNÍ", "NOČNÍ SESTAVENÍ") #define TR_NIGHTLY_NOTSAFE "Verze není bezpečná k létání" #define TR_WRONG_SDCARDVERSION "Očekávaná ver.: " +#define TR_WARN_RTC_BATTERY_LOW "Slabá RTC baterie" +#define TR_BATTERY "BATERIE" #define TR_WRONG_PCBREV "Jiná verze PCB/firmware" #define TR_EMERGENCY_MODE "NOUZOVÝ REŽIM" #define TR_PCBREV_ERROR "Chyba PCB" @@ -859,7 +857,7 @@ #define TR_BLUETOOTH_PIN_CODE TR(INDENT "PIN kód", "PIN kód") #define TR_BAUDRATE "Baudrate BT" #define LEN_BLUETOOTH_MODES "\012" -#if defined(PCBX9E) && !defined(USEHORUSBT) +#if defined(PCBX9E) #define TR_BLUETOOTH_MODES "---\0 ""Povoleno\0 " #else #define TR_BLUETOOTH_MODES "---\0 ""Telemetrie""Trenér\0 " @@ -891,30 +889,36 @@ #define TR_FLASH_INTERNAL_MODULE TR("Flash vnitř. modulu", "Flash vnitřního modulu") #define TR_FLASH_EXTERNAL_MODULE TR("Flash ext. modulu", "Flash externího zařízení") #define TR_FIRMWARE_UPDATE_ERROR TR("Chyba zápisu FW", "Chyba zápisu firmware") -#define TR_FIRMWARE_UPDATE_SUCCESS "úspěšný zápis FW" +#define TR_FIRMWARE_UPDATE_SUCCESS "Úspěšný zápis FW" #define TR_WRITING TR3("\14Zapisuji..", "\032Zapisuji..", "Zapisuji..") #define TR_CONFIRM_FORMAT "Provést Formát?" -#define TR_INTERNALRF "Vnitřní RF modul" +#define TR_INTERNALRF "Interní RF modul" +#define TR_INTERNAL_MODULE "Interní modul" +#define TR_EXTERNAL_MODULE "Externí modul" +#define TR_OPENTX_UPGRADE_REQUIRED TR("Aktualizujte OpenTX", "Vyžadována aktualizace OpenTX") +#define TR_TELEMETRY_DISABLED "Telem. zakázána" +#define TR_MORE_OPTIONS_AVAILABLE TR("Více možností", "Více dostupných možností") +#define TR_NO_MODULE_INFORMATION "Žádné info. o modulu" #define TR_EXTERNALRF "Externí RF modul" #define TR_FAILSAFE TR("Failsafe", "Mód Failsafe") #define TR_FAILSAFESET "NASTAVENÍ FAILSAFE" #define TR_REG_ID TR("Reg. ID", "Registrační ID") #define TR_OWNER_ID "ID vlastníka" #define TR_PINMAPSET "PINMAP" -#define TR_HOLD "DRŽET" -#define TR_HOLD_UPPERCASE "HOLD" -#define TR_NONE "NIC" -#define TR_NONE_UPPERCASE "NONE" +#define TR_HOLD "Držet" +#define TR_HOLD_UPPERCASE "DRŽET" +#define TR_NONE "Nic" +#define TR_NONE_UPPERCASE "NIC" #define TR_MENUSENSOR "SENZOR" #define TR_POWERMETER_PEAK "Špička" #define TR_POWERMETER_POWER "Výkon" -#define TR_POWERMETER_ATTN "Attn" +#define TR_POWERMETER_ATTN "Útlum" #define TR_POWERMETER_FREQ "Frek." #define TR_MENUTOOLS "NÁSTROJE" #define TR_TURN_OFF_RECEIVER "Vypněte přijímač" #define TR_STOPPING "Zastavuji..." -#define TR_MENU_SPECTRUM_ANALYSER "SPEKTRÁLNÍ ANALYZÁTOR" -#define TR_MENU_POWER_METER "MĚŘÁK VÝKONU" +#define TR_MENU_SPECTRUM_ANALYSER "SPEKTRÁLNÍ ANALYZER" +#define TR_MENU_POWER_METER "MĚŘIČ VÝKONU" #define TR_SENSOR "SENZOR" #define TR_COUNTRYCODE "Kód regionu" #define TR_USBMODE "Režim USB" @@ -972,7 +976,7 @@ #define TR_TRAINER "Trenér" #define TR_ANTENNAPROBLEM CENTER "Problém s TX anténou!" #define TR_MODELIDUSED TR("ID již použito","ID modelu je již použito") -#define TR_MODULE INDENT "Modul" +#define TR_MODULE "Modul" #define TR_RX_NAME "Jméno RX" #define TR_TELEMETRY_TYPE TR("Typ", "Typ telemetrie") #define TR_TELEMETRY_SENSORS "Senzory" @@ -984,10 +988,10 @@ #define TR_ANTENNASELECTION TR(INDENT "Antenna", INDENT "Volba antény") #define TR_ANTENNACONFIRM1 "Opravdu přepnout?" #define TR_ANTENNACONFIRM2 TR("Zkont. anténu", "Ujisti se že je anténa připojena!") -#define TR_R9M_PROTO_FLEX_WARN1 "Potřebuje" -#define TR_R9M_PROTO_FCC_WARN1 "Potřebuje FCC" -#define TR_R9M_PROTO_EU_WARN1 "Potřebuje EU" -#define TR_R9M_PROTO_WARN2 "necertifikovaný R9M firm." +#define TR_R9M_PROTO_FLEX_WARN_LINE1 "Vyžaduje FLEX" +#define TR_R9M_PROTO_FCC_WARN_LINE1 "Vyžaduje FCC" +#define TR_R9M_PROTO_EU_WARN_LINE1 "Vyžaduje EU" +#define TR_R9M_PROTO_WARN_LINE2 "firmware." #define TR_LOWALARM INDENT "Nízký Alarm" #define TR_CRITICALALARM INDENT "Kritický Alarm" #define TR_RSSIALARM_WARN TR("RSSI","RSSI TELEMETRIE") @@ -1018,18 +1022,13 @@ #define TR_PREFLIGHT "Předletová kontrola" #define TR_CHECKLIST TR(INDENT "Poznámky", INDENT "Zobrazit poznámky") #define TR_FAS_OFFSET TR(INDENT "FAS Ofs", INDENT "FAS Ofset") -#define TR_UART3MODE "Seriový port" +#define TR_AUX_SERIAL_MODE "Seriový port" #define TR_SCRIPT "Skript" #define TR_INPUTS "Vstupy" #define TR_OUTPUTS "Výstupy" -#if defined(COLORLCD) #define STR_EEBACKUP "Záloha EEPROM" -#define STR_FACTORYRESET "Factory reset" -#else -#define STR_EEBACKUP TR("Záloha", "Zálohuje EEPROM") -#define STR_FACTORYRESET TR("Tovární reset", "Tovární reset") -#endif -#define TR_CONFIRMRESET "Smazat modely a nastavení?" +#define STR_FACTORYRESET "Tovární reset" +#define TR_CONFIRMRESET TR("Smazat vše ?", "Smazat modely a nastavení?") #define TR_TOO_MANY_LUA_SCRIPTS "Příliš mnoho skriptů!" // Horus and Taranis column headers @@ -1141,6 +1140,9 @@ #define TR_FLASH_WRITE "Zápis flash..." #define TR_OTA_UPDATE "Aktualizace OTA..." #define TR_MODULE_RESET "Reset modulu..." +#define TR_UNKNOWN_RX "Neznámý RX" +#define TR_UNSUPPORTED_RX "Nepodporovaný RX" +#define TR_OTA_UPDATE_ERROR "Chyba aktualizace" #define TR_DEVICE_RESET "Reset zařízení..." #define TR_ALTITUDE INDENT "Výška" #define TR_SCALE "Měřítko" @@ -1156,6 +1158,7 @@ #define TR_CELLINDEX "Článek" #define TR_LOGS "Logovat" #define TR_OPTIONS "Možnosti" +#define TR_FIRMWARE_OPTIONS "Firmware options" #define TR_ALTSENSOR "Senzor výšky" #define TR_CELLSENSOR "Senzor článků" @@ -1169,7 +1172,7 @@ #define TR_SERVOS_KO "Serva KO" //TODO: translation #define TR_INVERTED_SERIAL INDENT "Invert" -#define TR_IGNORE_INSTANCE INDENT "Ignoruj chyby ID" +#define TR_IGNORE_INSTANCE TR(INDENT "Chybné ID", INDENT "Ignoruj chyby ID") #define TR_DISCOVER_SENSORS INDENT "Detekovat nové senzory" #define TR_STOP_DISCOVER_SENSORS INDENT "Zastavit autodetekci" #define TR_DELETE_ALL_SENSORS INDENT "Odebrat všechny senzory" diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index b471bdd1a..f8abd9eff 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -70,11 +70,11 @@ #define LEN_TRNCHN "\003" #define TR_TRNCHN "CH1CH2CH3CH4" -#define LEN_UART3MODES "\015" +#define LEN_AUX_SERIAL_MODES "\015" #if defined(CLI) || defined(DEBUG) -#define TR_UART3MODES "Debug\0 ""S-Port Mirror""Telemetrie\0 ""SBUS Eingang\0""LUA\0 " +#define TR_AUX_SERIAL_MODES "Debug\0 ""Telem Mirror\0""Telemetry In\0""SBUS Eingang\0""LUA\0 " #else -#define TR_UART3MODES "AUS\0 ""S-Port Mirror""Telemetrie\0 ""SBUS Eingang\0""LUA\0 " +#define TR_AUX_SERIAL_MODES "AUS\0 ""Telem Mirror\0""Telemetry In\0""SBUS Eingang\0""LUA\0 " #endif #define LEN_SWTYPES "\006" @@ -382,13 +382,10 @@ #define TR_VKEYS "Menu\0""Exit\0""Down\0""Up\0 ""Right""Left\0" #endif -#define LEN_VRENCODERS "\003" -#define TR_VRENCODERS "DGa""DGb" - #define LEN_VSWITCHES "\003" #define LEN_VSRCRAW "\004" -#define TR_STICKS_VSRCRAW TR("Sei\0""Höh\0""Gas\0""Que\0", "\307Sei""\307Höh""\307Gas""\307Que") +#define TR_STICKS_VSRCRAW "\307Sei""\307Höh""\307Gas""\307Que" #if defined(PCBHORUS) #define TR_TRIMS_VSRCRAW "\313Sei""\313Höh""\313Gas""\313Que""\313T5\0""\313T6\0" @@ -539,16 +536,16 @@ #define TR_ELEDIRECTION TR("Nick Richtung", "Nick Servo Richtung") #define TR_AILDIRECTION TR("Roll Richtung", "Roll Servo Richtung") #define TR_COLDIRECTION TR("Pitch Richtung", "Pitch Servo Richtung") -#define TR_MODE INDENT "Modus" +#define TR_MODE "Modus" #define TR_SUBTYPE INDENT "Subtype" #define TR_NOFREEEXPO "Expos voll!" #define TR_NOFREEMIXER "Mischer voll!" -#define TR_SOURCE INDENT "Quelle" +#define TR_SOURCE "Quelle" #define TR_WEIGHT "Gewicht" #define TR_EXPO TR("Expo", "Exponential") #define TR_SIDE "Seite" #define TR_DIFFERENTIAL "Diff" -#define TR_OFFSET INDENT "Offset" +#define TR_OFFSET "Offset" #define TR_TRIM "Trim" #define TR_DREX "DRex" #define DREX_CHBOX_OFFSET 30 @@ -556,6 +553,7 @@ #define TR_FLMODE TR("Phase", "Phasen") #define TR_MIXWARNING "Warnung" #define TR_OFF "AUS" +#define TR_NO_INFORMATION TR("No info", "No information") #define TR_MULTPX "Wirkung" #define TR_DELAYDOWN "Verz. Dn" #define TR_DELAYUP "Verz. Up" @@ -595,8 +593,7 @@ #define TR_RENAVIG "Drehgeb. Navig." #define TR_THROTTLE_LABEL "Gas-Kontrolle" #define TR_THROTTLEREVERSE TR("Gas invers", INDENT "Vollgas hinten?") //Änderung wg TH9x, Taranis -#define TR_TIMER_NAME INDENT "Name" -#define TR_MINUTEBEEP TR(INDENT "Min-Alarm", INDENT "Minuten-Alarm") +#define TR_MINUTEBEEP TR("Min-Alarm", "Minuten-Alarm") #define TR_BEEPCOUNTDOWN INDENT "Countdown" #define TR_PERSISTENT TR(INDENT "Permanent", INDENT "Permanent") #define TR_BACKLIGHT_LABEL "LCD-Beleuchtung" @@ -605,6 +602,8 @@ #define TR_BLOFFBRIGHTNESS INDENT "Aus-Helligkeit" #define TR_BLCOLOR INDENT "Farbe" #define TR_SPLASHSCREEN TR("Startbild Ein", "Startbild Anzeigedauer") +#define TR_PWR_ON_SPEED "Pwr On speed" +#define TR_PWR_OFF_SPEED "Pwr Off speed" #define TR_THROTTLEWARNING TR("Gasalarm", INDENT "Gas Alarm") #define TR_SWITCHWARNING TR("Sch. Alarm", INDENT "Schalter-Alarm") #define TR_POTWARNINGSTATE TR(INDENT "Pot&Slid.", INDENT "Pots & sliders") @@ -649,7 +648,7 @@ #define TR_TMR1JITTERUS "Tmr1 Jitter\037\124us" #define TR_TMIXMAXMS "Tmix max" #define TR_FREE_STACK "Freier Stack" -#define TR_MENUTORESET CENTER TR_ENTER " für Reset" +#define TR_MENUTORESET TR_ENTER " für Reset" #define TR_PPM_TRAINER "TR" #define TR_CH "CH" #define TR_MODEL "MODELL" @@ -706,12 +705,12 @@ #define TR_MONITOR_SWITCHES "LOGIK SCHALTER MONITOR" #define TR_MONITOR_OUTPUT_DESC "Kanäle" #define TR_MONITOR_MIXER_DESC "Mischer" - #define TR_RECEIVER_NUM TR(INDENT "Empf Nr.", INDENT "Empfänger Nummer") - #define TR_RECEIVER INDENT "Receiver" +#define TR_RECEIVER_NUM TR("Empf Nr.", "Empfänger Nummer") +#define TR_RECEIVER "Receiver" #define TR_MULTI_RFTUNE TR(INDENT "RF Freq.", INDENT "RF Freq. Feintuning") #define TR_MULTI_TELEMETRY "Telemetry" #define TR_MULTI_VIDFREQ TR(INDENT "Vid. Freq.", INDENT "Video Frequenz") -#define TR_MULTI_RFPOWER INDENT "RF Power" +#define TR_RFPOWER "RF Power" #define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Optionswert") #define TR_MULTI_AUTOBIND TR(INDENT "Autobind",INDENT "Bind on powerup") #define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format") @@ -734,7 +733,7 @@ #define TR_PROTOCOL_INVALID TR("Prot. invalid", "Protocol invalid") #define TR_MODULE_STATUS TR(INDENT "Status", INDENT "Module Status") #define TR_MODULE_SYNC TR(INDENT "Sync", INDENT "Module Sync") -#define TR_MULTI_SERVOFREQ TR(INDENT "Servo rate", INDENT "Servo update rate") +#define TR_MULTI_SERVOFREQ TR("Servo rate", "Servo update rate") #define TR_SYNCMENU "Sync [MENU]" #define TR_LIMIT INDENT "Grenzen" #define TR_MINRSSI "Min. RSSI" @@ -785,6 +784,7 @@ #define TR_UPDATE_TX_OPTIONS "Update TX options?" #define TR_MODULES_RX_VERSION "Modules / RX version" #define TR_MENU_MODULES_RX_VERSION "MODULES / RX VERSION" +#define TR_MENU_FIRM_OPTIONS "FIRMWARE OPTIONS" #define TR_GYRO "Gyro" #define TR_STICKS_POTS_SLIDERS "Sticks/Pots/Sliders" #define TR_PWM_STICKS_POTS_SLIDERS "PWM Sticks/Pots/Sliders" @@ -810,6 +810,8 @@ #define TR_NIGHTLY_WARNING TR("NIGHTLY", "NIGHTLY BUILD") #define TR_NIGHTLY_NOTSAFE "Nicht für Flug geeignet" #define TR_WRONG_SDCARDVERSION TR("Erw. Version: ","Erwartete Version: ") +#define TR_WARN_RTC_BATTERY_LOW "RTC Battery low" +#define TR_BATTERY "BATTERY" #define TR_WRONG_PCBREV "Falsches PCB erkannt" #define TR_EMERGENCY_MODE "NOTFALL MODUS" #define TR_PCBREV_ERROR "PCB Problem" @@ -855,7 +857,7 @@ #define TR_HARDWARE TR("Hardware einst. ", "Namen und Hardware einst.") #define TR_FORMATTING "Formatierung..." #define TR_TEMP_CALIB "Temp. abgl." -#define TR_TIME "Uhrzeit:" +#define TR_TIME "Uhrzeit" #define TR_MAXBAUDRATE "Max Baud" #define TR_BLUETOOTH "Bluetooth" @@ -863,10 +865,10 @@ #define TR_BLUETOOTH_INIT "Init" #define TR_BLUETOOTH_DIST_ADDR INDENT "Dist addr" #define TR_BLUETOOTH_LOCAL_ADDR INDENT "Local addr" -#define TR_BLUETOOTH_PIN_CODE TR(INDENT "PIN code", "PIN code") +#define TR_BLUETOOTH_PIN_CODE "PIN code" #define TR_BAUDRATE "BT Baudrate" #define LEN_BLUETOOTH_MODES "\011" -#if defined(PCBX9E) && !defined(USEHORUSBT) +#if defined(PCBX9E) #define TR_BLUETOOTH_MODES "---\0 ""Enabled\0 " #else #define TR_BLUETOOTH_MODES "---\0 ""Telemetry""Trainer\0" @@ -882,7 +884,7 @@ #define TR_GLOBAL_VAR "Globale Variable" #define TR_MENUGLOBALVARS "GLOBALE VARIABLEN" #define TR_OWN "Eigen" -#define TR_DATE "Datum:" +#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_CHANNELS_MONITOR "Kanal-Monitor==>" @@ -893,7 +895,7 @@ #define TR_FLASH_EXTERNAL_DEVICE TR("Flash ext. Gerät","Flash externes Gerät") #define TR_FLASH_RECEIVER_OTA "Flash receiver OTA" #define TR_FLASH_BLUETOOTH_MODULE TR("Flash BT module", "Flash Bluetooth module") -#define TR_FLASH_POWER_MANAGEMENT_UNIT TR("Flash pwr mngt unit", "Flash power management unit") +#define TR_FLASH_POWER_MANAGEMENT_UNIT "Flash pwr mngt unit" #define TR_CURRENT_VERSION TR("Current vers. ", "Current version: ") #define TR_FLASH_INTERNAL_MODULE TR("Flash int. XJT","Flash internes XJT-Modul") #define TR_FLASH_EXTERNAL_MODULE TR("Flash ext. mod","Flash extern module") @@ -902,10 +904,16 @@ #define TR_WRITING "Writing..." #define TR_CONFIRM_FORMAT "Formatieren bestätigen?" #define TR_INTERNALRF "Internes HF-Modul" +#define TR_INTERNAL_MODULE "Internal module" +#define TR_EXTERNAL_MODULE "External module" +#define TR_OPENTX_UPGRADE_REQUIRED "OpenTX upgrade required" +#define TR_TELEMETRY_DISABLED "Telem. disabled" +#define TR_MORE_OPTIONS_AVAILABLE "More options available" +#define TR_NO_MODULE_INFORMATION "No module information" #define TR_EXTERNALRF "Externes HF-Modul" #define TR_FAILSAFE TR(INDENT "Failsafe", INDENT "Failsafe Mode") #define TR_FAILSAFESET "Failsafe setzen" -#define TR_REG_ID TR("Reg. ID", "Registration ID") +#define TR_REG_ID "Reg. ID" #define TR_OWNER_ID "Owner ID" #define TR_PINMAPSET "PINMAP" #define TR_HOLD "Hold" @@ -979,7 +987,7 @@ #define TR_TRAINER "DSC Buchse PPM In/Out" #define TR_ANTENNAPROBLEM CENTER "TX-Antennenproblem!" #define TR_MODELIDUSED TR("ID schon benutzt", "Modell-ID schon benutzt") -#define TR_MODULE INDENT "Modul-Typ" +#define TR_MODULE "Modul-Typ" #define TR_RX_NAME "Rx Name" #define TR_TELEMETRY_TYPE TR("Typ", "Telemetrietyp") #define TR_TELEMETRY_SENSORS "Sensoren" @@ -991,10 +999,10 @@ #define TR_ANTENNASELECTION TR(INDENT "Antenna", INDENT "Antenne auswählen") #define TR_ANTENNACONFIRM1 "Ant. umschalten" #define TR_ANTENNACONFIRM2 TR("Check antenna", "Ist eine externe Antenne installiert?") -#define TR_R9M_PROTO_FLEX_WARN1 "Requires non" -#define TR_R9M_PROTO_FCC_WARN1 "Requires FCC" -#define TR_R9M_PROTO_EU_WARN1 "Requires EU" -#define TR_R9M_PROTO_WARN2 "certified firmware" +#define TR_R9M_PROTO_FLEX_WARN_LINE1 "Requires non" +#define TR_R9M_PROTO_FCC_WARN_LINE1 "Requires FCC" +#define TR_R9M_PROTO_EU_WARN_LINE1 "Requires EU" +#define TR_R9M_PROTO_WARN_LINE2 "certified firmware" #define TR_LOWALARM INDENT "Warnungsschwelle" #define TR_CRITICALALARM INDENT "Kritischer Alarm" #define TR_RSSIALARM_WARN "Telemetry" @@ -1025,7 +1033,7 @@ #define TR_PREFLIGHT "Vorflug-Checkliste" #define TR_CHECKLIST TR(INDENT "Checkliste", INDENT "Checkliste anzeigen") //9XR-Pro #define TR_FAS_OFFSET TR(INDENT "FAS-Ofs", INDENT "FAS-Offset") -#define TR_UART3MODE "Serieller Port" +#define TR_AUX_SERIAL_MODE "Serieller Port" #define TR_SCRIPT "Lua-Skript" #define TR_INPUTS "Eingaben" #define TR_OUTPUTS "Ausgaben" @@ -1144,6 +1152,9 @@ #define TR_FLASH_WRITE "Flash write..." #define TR_OTA_UPDATE "OTA update..." #define TR_MODULE_RESET "Module reset..." +#define TR_UNKNOWN_RX "Unknown RX" +#define TR_UNSUPPORTED_RX "Unsupported RX" +#define TR_OTA_UPDATE_ERROR "OTA update error" #define TR_DEVICE_RESET "Device reset..." #define TR_ALTITUDE INDENT "Höhenanzeige" #define TR_SCALE "Skalieren" @@ -1159,6 +1170,7 @@ #define TR_CELLINDEX "Zellenindex" #define TR_LOGS "Log Daten" #define TR_OPTIONS "Optionen" +#define TR_FIRMWARE_OPTIONS "Firmware options" #define TR_ALTSENSOR "Höhen Sensor" #define TR_CELLSENSOR "Zellen Sensor" diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index fae6870a8..11783de8c 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -65,16 +65,16 @@ #define TR_VBLMODE TR("OFF\0""Keys""Ctrl""Both""ON\0 ", "OFF\0 ""Keys\0 ""Controls""Both\0 ""ON\0 ") #define LEN_TRNMODE "\003" -#define TR_TRNMODE "OFF"" +="" :=" +#define TR_TRNMODE "OFF""+=\0"":=\0" #define LEN_TRNCHN "\003" #define TR_TRNCHN "CH1CH2CH3CH4" -#define LEN_UART3MODES "\015" +#define LEN_AUX_SERIAL_MODES "\015" #if defined(CLI) || defined(DEBUG) -#define TR_UART3MODES "Debug\0 ""S-Port Mirror""Telemetry\0 ""SBUS Trainer\0""LUA\0 " +#define TR_AUX_SERIAL_MODES "Debug\0 ""Telem Mirror\0""Telemetry In\0""SBUS Trainer\0""LUA\0 " #else -#define TR_UART3MODES "OFF\0 ""S-Port Mirror""Telemetry\0 ""SBUS Trainer\0""LUA\0 " +#define TR_AUX_SERIAL_MODES "OFF\0 ""Telem Mirror\0""Telemetry In\0""SBUS Trainer\0""LUA\0 " #endif #define LEN_SWTYPES "\006" @@ -368,13 +368,6 @@ #define TR_VKEYS "Menu\0""Exit\0""Down\0""Up\0 ""Right""Left\0" #endif -#define LEN_VRENCODERS "\003" -#if defined(ROTARY_ENCODERS) -#define TR_VRENCODERS "REa""REb" -#else -#define TR_VRENCODERS "RE\0" -#endif - #define LEN_VSWITCHES "\003" #define LEN_VSRCRAW "\004" @@ -534,16 +527,16 @@ #define TR_ELEDIRECTION "ELE Direction" #define TR_AILDIRECTION "AIL Direction" #define TR_COLDIRECTION "PIT Direction" -#define TR_MODE INDENT "Mode" +#define TR_MODE "Mode" #define TR_SUBTYPE INDENT "Subtype" #define TR_NOFREEEXPO "No free expo!" #define TR_NOFREEMIXER "No free mixer!" -#define TR_SOURCE INDENT "Source" +#define TR_SOURCE "Source" #define TR_WEIGHT "Weight" #define TR_EXPO TR("Expo", "Exponential") #define TR_SIDE "Side" #define TR_DIFFERENTIAL "Differ" -#define TR_OFFSET INDENT "Offset" +#define TR_OFFSET "Offset" #define TR_TRIM "Trim" #define TR_DREX "DRex" #define DREX_CHBOX_OFFSET 30 @@ -551,6 +544,7 @@ #define TR_FLMODE TR("Mode", "Modes") #define TR_MIXWARNING "Warning" #define TR_OFF "OFF" +#define TR_NO_INFORMATION TR("No info", "No information") #define TR_MULTPX "Multiplex" #define TR_DELAYDOWN "Delay dn" #define TR_DELAYUP "Delay up" @@ -590,8 +584,7 @@ #define TR_RENAVIG "RotEnc Navig" #define TR_THROTTLE_LABEL "Throttle" #define TR_THROTTLEREVERSE TR("T-Reverse", INDENT "Reverse") -#define TR_TIMER_NAME INDENT "Name" -#define TR_MINUTEBEEP TR(INDENT "Minute", INDENT "Minute call") +#define TR_MINUTEBEEP TR("Minute", "Minute call") #define TR_BEEPCOUNTDOWN INDENT "Countdown" #define TR_PERSISTENT TR(INDENT "Persist.", INDENT "Persistent") #define TR_BACKLIGHT_LABEL "Backlight" @@ -600,6 +593,8 @@ #define TR_BLOFFBRIGHTNESS INDENT "OFF brightness" #define TR_BLCOLOR INDENT "Color" #define TR_SPLASHSCREEN "Splash screen" +#define TR_PWR_ON_SPEED "Pwr On speed" +#define TR_PWR_OFF_SPEED "Pwr Off speed" #define TR_THROTTLEWARNING TR(INDENT "T-Warning", INDENT "Throttle state") #define TR_SWITCHWARNING TR(INDENT "S-Warning", INDENT "Switch positions") #define TR_POTWARNINGSTATE TR(INDENT "Pot&Slid.", INDENT "Pots & sliders") @@ -644,7 +639,7 @@ #define TR_TMR1JITTERUS "Tmr1 Jitter\037\124us" #define TR_TMIXMAXMS "Tmix max" #define TR_FREE_STACK "Free stack" -#define TR_MENUTORESET CENTER TR_ENTER " to reset" +#define TR_MENUTORESET TR_ENTER " to reset" #define TR_PPM_TRAINER "TR" #define TR_CH "CH" #define TR_MODEL "MODEL" @@ -701,13 +696,13 @@ #define TR_MONITOR_SWITCHES "LOGICAL SWITCHES MONITOR" #define TR_MONITOR_OUTPUT_DESC "Outputs" #define TR_MONITOR_MIXER_DESC "Mixers" - #define TR_RECEIVER_NUM TR(INDENT "RxNum", INDENT "Receiver No.") + #define TR_RECEIVER_NUM TR("RxNum", "Receiver No.") #define TR_RECEIVER "Receiver" -#define TR_MULTI_RFTUNE TR(INDENT "Freq tune",INDENT "RF Freq. fine tune") +#define TR_MULTI_RFTUNE TR("Freq tune", "RF Freq. fine tune") #define TR_MULTI_TELEMETRY "Telemetry" -#define TR_MULTI_VIDFREQ TR(INDENT "Vid. freq.", INDENT "Video frequency") -#define TR_MULTI_RFPOWER INDENT "RF Power" -#define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Option value") +#define TR_MULTI_VIDFREQ TR("Vid. freq.", "Video frequency") +#define TR_RFPOWER "RF Power" +#define TR_MULTI_OPTION TR("Option", "Option value") #define TR_MULTI_AUTOBIND TR(INDENT "Autobind",INDENT "Bind on powerup") #define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format") #define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode") @@ -729,7 +724,7 @@ #define TR_PROTOCOL_INVALID TR("Prot. invalid", "Protocol invalid") #define TR_MODULE_STATUS TR(INDENT "Status", INDENT "Module Status") #define TR_MODULE_SYNC TR(INDENT "Sync", INDENT "Module Sync") -#define TR_MULTI_SERVOFREQ TR(INDENT "Servo rate", INDENT "Servo update rate") +#define TR_MULTI_SERVOFREQ TR("Servo rate", "Servo update rate") #define TR_SYNCMENU "[Sync]" #define TR_LIMIT INDENT "Limit" #define TR_MINRSSI "Min Rssi" @@ -780,6 +775,7 @@ #define TR_UPDATE_TX_OPTIONS "Update TX options?" #define TR_MODULES_RX_VERSION "Modules / RX version" #define TR_MENU_MODULES_RX_VERSION "MODULES / RX VERSION" +#define TR_MENU_FIRM_OPTIONS "FIRMWARE OPTIONS" #define TR_GYRO "Gyro" #define TR_STICKS_POTS_SLIDERS "Sticks/Pots/Sliders" #define TR_PWM_STICKS_POTS_SLIDERS "PWM Sticks/Pots/Sliders" @@ -805,6 +801,8 @@ #define TR_NIGHTLY_WARNING TR("NIGHTLY", "NIGHTLY BUILD") #define TR_NIGHTLY_NOTSAFE "Version not safe to fly" #define TR_WRONG_SDCARDVERSION TR("Expected ver: ","Expected version: ") +#define TR_WARN_RTC_BATTERY_LOW "RTC Battery low" +#define TR_BATTERY "BATTERY" #define TR_WRONG_PCBREV "Wrong PCB detected" #define TR_EMERGENCY_MODE "EMERGENCY MODE" #define TR_PCBREV_ERROR "PCB error" @@ -858,10 +856,10 @@ #define TR_BLUETOOTH_INIT "Init" #define TR_BLUETOOTH_DIST_ADDR INDENT "Dist addr" #define TR_BLUETOOTH_LOCAL_ADDR INDENT "Local addr" -#define TR_BLUETOOTH_PIN_CODE TR(INDENT "PIN code", "PIN code") +#define TR_BLUETOOTH_PIN_CODE "PIN code" #define TR_BAUDRATE "BT Baudrate" #define LEN_BLUETOOTH_MODES "\011" -#if defined(PCBX9E) && !defined(USEHORUSBT) +#if defined(PCBX9E) #define TR_BLUETOOTH_MODES "---\0 ""Enabled\0 " #else #define TR_BLUETOOTH_MODES "---\0 ""Telemetry""Trainer\0" @@ -888,7 +886,7 @@ #define TR_FLASH_EXTERNAL_DEVICE TR("Flash S.Port", "Flash S.Port device") #define TR_FLASH_RECEIVER_OTA "Flash receiver OTA" #define TR_FLASH_BLUETOOTH_MODULE TR("Flash BT module", "Flash Bluetooth module") -#define TR_FLASH_POWER_MANAGEMENT_UNIT TR("Flash pwr mngt unit", "Flash power management unit") +#define TR_FLASH_POWER_MANAGEMENT_UNIT "Flash pwr mngt unit" #define TR_CURRENT_VERSION TR("Curr Vers: ", "Current version: ") #define TR_FLASH_INTERNAL_MODULE TR("Flash int. module", "Flash internal module") #define TR_FLASH_EXTERNAL_MODULE TR("Flash ext. module", "Flash external module") @@ -897,10 +895,16 @@ #define TR_WRITING "Writing..." #define TR_CONFIRM_FORMAT "Confirm Format?" #define TR_INTERNALRF "Internal RF" +#define TR_INTERNAL_MODULE "Internal module" +#define TR_EXTERNAL_MODULE "External module" +#define TR_OPENTX_UPGRADE_REQUIRED "OpenTX upgrade required" +#define TR_TELEMETRY_DISABLED "Telem. disabled" +#define TR_MORE_OPTIONS_AVAILABLE "More options available" +#define TR_NO_MODULE_INFORMATION "No module information" #define TR_EXTERNALRF "External RF" #define TR_FAILSAFE TR(INDENT "Failsafe", INDENT "Failsafe mode") #define TR_FAILSAFESET "FAILSAFE SETTINGS" -#define TR_REG_ID TR("Reg. ID", "Registration ID") +#define TR_REG_ID "Reg. ID" #define TR_OWNER_ID "Owner ID" #define TR_PINMAPSET "PINMAP" #define TR_HOLD "Hold" @@ -978,7 +982,7 @@ #else #define TR_MODELIDUSED TR("ID used in:","Receiver ID used in:") #endif -#define TR_MODULE INDENT "Module" +#define TR_MODULE "Module" #define TR_RX_NAME "Rx Name" #define TR_TELEMETRY_TYPE TR("Type", "Telemetry type") #define TR_TELEMETRY_SENSORS "Sensors" @@ -990,10 +994,10 @@ #define TR_ANTENNASELECTION TR(INDENT "Antenna", TR(INDENT "Antenna", INDENT "Antenna selection")) #define TR_ANTENNACONFIRM1 "Really switch?" #define TR_ANTENNACONFIRM2 TR("Check antenna", "Make sure antenna is installed!") -#define TR_R9M_PROTO_FLEX_WARN1 "Requires FLEX non" -#define TR_R9M_PROTO_FCC_WARN1 "Requires FCC" -#define TR_R9M_PROTO_EU_WARN1 "Requires EU" -#define TR_R9M_PROTO_WARN2 "certified firmware" +#define TR_R9M_PROTO_FLEX_WARN_LINE1 "Requires FLEX non" +#define TR_R9M_PROTO_FCC_WARN_LINE1 "Requires FCC" +#define TR_R9M_PROTO_EU_WARN_LINE1 "Requires EU" +#define TR_R9M_PROTO_WARN_LINE2 "certified firmware" #define TR_LOWALARM INDENT "Low alarm" #define TR_CRITICALALARM INDENT "Critical alarm" #define TR_RSSIALARM_WARN "RSSI" @@ -1024,7 +1028,7 @@ #define TR_PREFLIGHT "Preflight Checks" #define TR_CHECKLIST TR(INDENT "Checklist", INDENT "Display checklist") #define TR_FAS_OFFSET TR(INDENT "FAS Ofs", INDENT "FAS offset") -#define TR_UART3MODE "Serial port" +#define TR_AUX_SERIAL_MODE "Serial port" #define TR_SCRIPT "Script" #define TR_INPUTS "Inputs" #define TR_OUTPUTS "Outputs" @@ -1142,6 +1146,9 @@ #define TR_FLASH_WRITE "Flash write..." #define TR_OTA_UPDATE "OTA update..." #define TR_MODULE_RESET "Module reset..." +#define TR_UNKNOWN_RX "Unknown RX" +#define TR_UNSUPPORTED_RX "Unsupported RX" +#define TR_OTA_UPDATE_ERROR "OTA update error" #define TR_DEVICE_RESET "Device reset..." #define TR_ALTITUDE INDENT "Altitude" #define TR_SCALE "Scale" @@ -1157,6 +1164,7 @@ #define TR_CELLINDEX "Cell index" #define TR_LOGS "Logs" #define TR_OPTIONS "Options" +#define TR_FIRMWARE_OPTIONS "Firmware options" #define TR_ALTSENSOR "Alt sensor" #define TR_CELLSENSOR "Cell sensor" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index 86d0d786c..30af9cc34 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -65,16 +65,16 @@ #define TR_VBLMODE "OFF ""Keys""Stks""Both""ON\0" #define LEN_TRNMODE "\003" -#define TR_TRNMODE "OFF"" +="" :=" +#define TR_TRNMODE "OFF""+=\0"":=" #define LEN_TRNCHN "\003" #define TR_TRNCHN "CH1CH2CH3CH4" -#define LEN_UART3MODES "\015" +#define LEN_AUX_SERIAL_MODES "\015" #if defined(CLI) || defined(DEBUG) -#define TR_UART3MODES "Debug\0 ""S-Port Mirror""Telemetry\0 ""SBUS Trainer\0""LUA\0 " +#define TR_AUX_SERIAL_MODES "Debug\0 ""Telem Mirror\0""Telemetry In\0""SBUS Trainer\0""LUA\0 " #else -#define TR_UART3MODES "OFF\0 ""S-Port Mirror""Telemetry\0 ""SBUS Trainer\0""LUA\0 " +#define TR_AUX_SERIAL_MODES "OFF\0 ""Telem Mirror\0""Telemetry In\0""SBUS Trainer\0""LUA\0 " #endif #define LEN_SWTYPES "\006" @@ -383,13 +383,10 @@ #define TR_VKEYS "Menu\0""Exit\0""Down\0""Up\0 ""Right""Left\0" #endif -#define LEN_VRENCODERS "\003" -#define TR_VRENCODERS "REa""REb" - #define LEN_VSWITCHES "\003" #define LEN_VSRCRAW "\004" -#define TR_STICKS_VSRCRAW TR("Dir\0""Ele\0""Thr\0""Ale\0", "\307Dir""\307Ele""\307Thr""\307Ale") +#define TR_STICKS_VSRCRAW "\307Dir""\307Ele""\307Thr""\307Ale" #if defined(PCBHORUS) #define TR_TRIMS_VSRCRAW "\313Dir""\313Ele""\313Thr""\313Ale""\313T5\0""\313T6\0" @@ -550,16 +547,16 @@ #define TR_ELEDIRECTION TR("ELE Direccion","Largo cyc. direccion") #define TR_AILDIRECTION TR("AIL Direccion","Lateral cyc. direccion") #define TR_COLDIRECTION TR("PIT Direccion","Coll. pitch direccion") -#define TR_MODE INDENT"Modo" +#define TR_MODE "Modo" #define TR_SUBTYPE INDENT "Subtype" #define TR_NOFREEEXPO "No expo libre!" #define TR_NOFREEMIXER "No mezcla lib!" -#define TR_SOURCE INDENT"Fuente" +#define TR_SOURCE "Fuente" #define TR_WEIGHT "Cantidad" #define TR_EXPO TR("Expo","Exponencial") #define TR_SIDE "Lado" #define TR_DIFFERENTIAL "Diferenc" -#define TR_OFFSET INDENT"Offset" +#define TR_OFFSET "Offset" #define TR_TRIM "Trim" #define TR_DREX "DRex" #define DREX_CHBOX_OFFSET 30 @@ -567,6 +564,7 @@ #define TR_FLMODE TR("Modo","Modos") #define TR_MIXWARNING "Aviso" #define TR_OFF "OFF" +#define TR_NO_INFORMATION TR("No info", "No information") #define TR_MULTPX "Multpx" #define TR_DELAYDOWN "Delay Dn" #define TR_DELAYUP "Delay Up" @@ -606,8 +604,7 @@ #define TR_RENAVIG "RotEnc Navig" #define TR_THROTTLE_LABEL "Throttle" #define TR_THROTTLEREVERSE TR("Invert_Acel", INDENT "Invertir Acel.") -#define TR_TIMER_NAME INDENT "Name" -#define TR_MINUTEBEEP TR(INDENT"Minuto", INDENT"Cada Minuto") +#define TR_MINUTEBEEP TR("Minuto", "Cada Minuto") #define TR_BEEPCOUNTDOWN INDENT"Cuentaatras" #define TR_PERSISTENT TR(INDENT"Persist.", INDENT"Persistente") #define TR_BACKLIGHT_LABEL "Luz Fondo" @@ -616,6 +613,8 @@ #define TR_BLOFFBRIGHTNESS INDENT"MENOS Brillo" #define TR_BLCOLOR INDENT "Color" #define TR_SPLASHSCREEN "Ptalla.inicio" +#define TR_PWR_ON_SPEED "Pwr On speed" +#define TR_PWR_OFF_SPEED "Pwr Off speed" #define TR_THROTTLEWARNING TR("Aviso-A", INDENT "Aviso Acelerador") #define TR_SWITCHWARNING TR("Aviso-I", INDENT "Aviso Intrptor") #define TR_POTWARNINGSTATE TR(INDENT "Pot&Slid.", INDENT "Pots & sliders") @@ -654,7 +653,7 @@ #define TR_TMR1JITTERUS "Tmr1 Jitter\037\124us" #define TR_TMIXMAXMS "Tmix max" #define TR_FREE_STACK "Free stack" -#define TR_MENUTORESET CENTER TR_ENTER "Resetear" +#define TR_MENUTORESET TR_ENTER "Resetear" #define TR_PPM_TRAINER "TR" #define TR_CH "CH" #define TR_MODEL "MODELO" @@ -721,13 +720,13 @@ #define TR_MONITOR_CHANNELS4 "CHANNELS MONITOR 25/32" #define TR_MONITOR_OUTPUT_DESC "Outputs" #define TR_MONITOR_MIXER_DESC "Mixers" -#define TR_RECEIVER_NUM TR("RxNum", INDENT"Receptor No.") -#define TR_RECEIVER INDENT "Receiver" -#define TR_MULTI_RFTUNE TR(INDENT "Freq tune",INDENT "RF Freq. fine tune") +#define TR_RECEIVER_NUM TR("RxNum", "Receptor No.") +#define TR_RECEIVER "Receiver" +#define TR_MULTI_RFTUNE TR("Freq tune", "RF Freq. fine tune") #define TR_MULTI_TELEMETRY "Telemetry" -#define TR_MULTI_VIDFREQ TR(INDENT "Vid. freq.", INDENT "Video frequency") -#define TR_MULTI_RFPOWER INDENT "RF Power" -#define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Option value") +#define TR_MULTI_VIDFREQ TR("Vid. freq.", "Video frequency") +#define TR_RFPOWER "RF Power" +#define TR_MULTI_OPTION TR("Option", "Option value") #define TR_MULTI_AUTOBIND TR(INDENT "Autobind",INDENT "Bind on powerup") #define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format") #define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode") @@ -749,7 +748,7 @@ #define TR_PROTOCOL_INVALID TR("Prot. invalid", "Protocol invalid") #define TR_MODULE_STATUS TR(INDENT "Status", INDENT "Module Status") #define TR_MODULE_SYNC TR(INDENT "Sync", INDENT "Module Sync") -#define TR_MULTI_SERVOFREQ TR(INDENT "Servo rate", INDENT "Servo update rate") +#define TR_MULTI_SERVOFREQ TR("Servo rate", "Servo update rate") #define TR_SYNCMENU "Sync " TR_ENTER #define TR_LIMIT INDENT"Limite" #define TR_MINRSSI "Min Rssi" @@ -800,6 +799,7 @@ #define TR_UPDATE_TX_OPTIONS "Update TX options?" #define TR_MODULES_RX_VERSION "Modules / RX version" #define TR_MENU_MODULES_RX_VERSION "MODULES / RX VERSION" +#define TR_MENU_FIRM_OPTIONS "FIRMWARE OPTIONS" #define TR_GYRO "Gyro" #define TR_STICKS_POTS_SLIDERS "Sticks/Pots/Sliders" #define TR_PWM_STICKS_POTS_SLIDERS "PWM Sticks/Pots/Sliders" @@ -825,6 +825,8 @@ #define TR_NIGHTLY_WARNING TR("NIGHTLY", "NIGHTLY BUILD") #define TR_NIGHTLY_NOTSAFE "Version not safe to fly" #define TR_WRONG_SDCARDVERSION TR("Expected ver: ","Expected version: ") +#define TR_WARN_RTC_BATTERY_LOW "RTC Battery low" +#define TR_BATTERY "BATTERY" #define TR_WRONG_PCBREV "Wrong PCB detected" #define TR_EMERGENCY_MODE "EMERGENCY MODE" #define TR_PCBREV_ERROR "PCB error" @@ -878,10 +880,10 @@ #define TR_BLUETOOTH_INIT "Init" #define TR_BLUETOOTH_DIST_ADDR INDENT "Dist addr" #define TR_BLUETOOTH_LOCAL_ADDR INDENT "Local addr" -#define TR_BLUETOOTH_PIN_CODE TR(INDENT "PIN code", "PIN code") +#define TR_BLUETOOTH_PIN_CODE "PIN code" #define TR_BAUDRATE "BT Baudrate" #define LEN_BLUETOOTH_MODES "\011" -#if defined(PCBX9E) && !defined(USEHORUSBT) +#if defined(PCBX9E) #define TR_BLUETOOTH_MODES "---\0 ""Enabled\0 " #else #define TR_BLUETOOTH_MODES "---\0 ""Telemetry""Trainer\0" @@ -908,7 +910,7 @@ #define TR_FLASH_EXTERNAL_DEVICE "Flash External Device" #define TR_FLASH_RECEIVER_OTA "Flash receiver OTA" #define TR_FLASH_BLUETOOTH_MODULE TR("Flash BT module", "Flash Bluetooth module") -#define TR_FLASH_POWER_MANAGEMENT_UNIT TR("Flash pwr mngt unit", "Flash power management unit") +#define TR_FLASH_POWER_MANAGEMENT_UNIT "Flash pwr mngt unit" #define TR_CURRENT_VERSION TR("Current vers. ", "Current version: ") #define TR_FLASH_INTERNAL_MODULE "Flash Internal Module" #define TR_FLASH_EXTERNAL_MODULE "Flash external module" @@ -917,10 +919,16 @@ #define TR_WRITING "Writing..." #define TR_CONFIRM_FORMAT "Confirm Format?" #define TR_INTERNALRF "Interna RF" +#define TR_INTERNAL_MODULE "Internal module" +#define TR_EXTERNAL_MODULE "External module" +#define TR_OPENTX_UPGRADE_REQUIRED "OpenTX upgrade required" +#define TR_TELEMETRY_DISABLED "Telem. disabled" +#define TR_MORE_OPTIONS_AVAILABLE "More options available" +#define TR_NO_MODULE_INFORMATION "No module information" #define TR_EXTERNALRF "Externa RF" #define TR_FAILSAFE INDENT"Modo sgdad." #define TR_FAILSAFESET "AJUSTES SGDAD." -#define TR_REG_ID TR("Reg. ID", "Registration ID") +#define TR_REG_ID "Reg. ID" #define TR_OWNER_ID "Owner ID" #define TR_PINMAPSET "PINMAP" #define TR_HOLD "Hold" @@ -994,7 +1002,7 @@ #define TR_TRAINER "Aprendiz" #define TR_ANTENNAPROBLEM CENTER "¡Problema antena TX!" #define TR_MODELIDUSED TR("ID en uso", "ID modelo en uso") -#define TR_MODULE INDENT "Modulo" +#define TR_MODULE "Modulo" #define TR_RX_NAME "Rx Name" #define TR_TELEMETRY_TYPE TR("Type", "Telemetry Type") #define TR_TELEMETRY_SENSORS "Sensors" @@ -1006,10 +1014,10 @@ #define TR_ANTENNASELECTION TR(INDENT "Antenna", TR(INDENT "Antenna", INDENT "Antenna selection")) #define TR_ANTENNACONFIRM1 "Really switch?" #define TR_ANTENNACONFIRM2 TR("Check antenna", "Make sure antenna is installed!") -#define TR_R9M_PROTO_FLEX_WARN1 "Requires non" -#define TR_R9M_PROTO_FCC_WARN1 "Requires FCC" -#define TR_R9M_PROTO_EU_WARN1 "Requires EU" -#define TR_R9M_PROTO_WARN2 "certified firmware" +#define TR_R9M_PROTO_FLEX_WARN_LINE1 "Requires non" +#define TR_R9M_PROTO_FCC_WARN_LINE1 "Requires FCC" +#define TR_R9M_PROTO_EU_WARN_LINE1 "Requires EU" +#define TR_R9M_PROTO_WARN_LINE2 "certified firmware" #define TR_LOWALARM INDENT "Alarma baja" #define TR_CRITICALALARM INDENT "Alarma Critica" #define TR_RSSIALARM_WARN TR("RSSI","TELEMETRY RSSI") @@ -1040,7 +1048,7 @@ #define TR_PREFLIGHT "Preflight Checks" #define TR_CHECKLIST INDENT "Display Checklist" #define TR_FAS_OFFSET TR(INDENT "FAS Ofs", INDENT "FAS Offset") -#define TR_UART3MODE "Serial port" +#define TR_AUX_SERIAL_MODE "Serial port" #define TR_SCRIPT "Script" #define TR_INPUTS "Inputs" #define TR_OUTPUTS "Outputs" @@ -1159,6 +1167,9 @@ #define TR_FLASH_WRITE "Flash write..." #define TR_OTA_UPDATE "OTA update..." #define TR_MODULE_RESET "Module reset..." +#define TR_UNKNOWN_RX "Unknown RX" +#define TR_UNSUPPORTED_RX "Unsupported RX" +#define TR_OTA_UPDATE_ERROR "OTA update error" #define TR_DEVICE_RESET "Device reset..." #define TR_ALTITUDE INDENT "Altitude" #define TR_SCALE "Scale" @@ -1174,6 +1185,7 @@ #define TR_CELLINDEX "Cell index" #define TR_LOGS "Logs" #define TR_OPTIONS "Options" +#define TR_FIRMWARE_OPTIONS "Firmware options" #define TR_ALTSENSOR "Alt sensor" #define TR_CELLSENSOR "Cell sensor" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index cbf41d2b4..8ab2eeca2 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -65,16 +65,16 @@ #define TR_VBLMODE TR("OFF\0""Keys""Ctrl""Both""ON\0 ", "OFF\0 ""Keys\0 ""Controls""Both\0 ""ON\0 ") #define LEN_TRNMODE "\003" -#define TR_TRNMODE "OFF"" +="" :=" +#define TR_TRNMODE "OFF""+=\0"":=" #define LEN_TRNCHN "\003" #define TR_TRNCHN "CH1CH2CH3CH4" -#define LEN_UART3MODES "\015" +#define LEN_AUX_SERIAL_MODES "\015" #if defined(CLI) || defined(DEBUG) -#define TR_UART3MODES "Debug\0 ""S-Port Pelik\0""Telemetry\0 ""SBUS Trainer\0""LUA\0 " +#define TR_AUX_SERIAL_MODES "Debug\0 ""S-Port Pelik\0""Telemetry In\0""SBUS Trainer\0""LUA\0 " #else -#define TR_UART3MODES "POIS\0 ""S-Port Pelik\0""Telemetry\0 ""SBUS Trainer\0""LUA\0 " +#define TR_AUX_SERIAL_MODES "POIS\0 ""S-Port Pelik\0""Telemetry In\0""SBUS Trainer\0""LUA\0 " #endif #define LEN_SWTYPES "\006" @@ -383,13 +383,10 @@ #define TR_VKEYS "Menu\0""Exit\0""Down\0""Up\0 ""Right""Left\0" #endif -#define LEN_VRENCODERS "\003" -#define TR_VRENCODERS "REa""REb" - #define LEN_VSWITCHES "\003" #define LEN_VSRCRAW "\004" -#define TR_STICKS_VSRCRAW TR("Rud\0""Ele\0""Thr\0""Ail\0", "\307Rud""\307Ele""\307Thr""\307Ail") +#define TR_STICKS_VSRCRAW "\307Rud""\307Ele""\307Thr""\307Ail" #if defined(PCBHORUS) #define TR_TRIMS_VSRCRAW "\313Rud""\313Ele""\313Thr""\313Ail""\313T5\0""\313T6\0" @@ -542,16 +539,16 @@ #define TR_ELEDIRECTION TR("ELE Direction","Long. cyc. direction") #define TR_AILDIRECTION TR("AIL Direction","Lateral cyc. direction") #define TR_COLDIRECTION TR("PIT Direction","Coll. pitch direction") -#define TR_MODE INDENT"Mode" +#define TR_MODE "Mode" #define TR_SUBTYPE INDENT "Subtype" #define TR_NOFREEEXPO "No free expo!" #define TR_NOFREEMIXER "No free mixer!" -#define TR_SOURCE INDENT"Source" +#define TR_SOURCE "Source" #define TR_WEIGHT "Weight" #define TR_EXPO TR("Expo","Exponential") #define TR_SIDE "Side" #define TR_DIFFERENTIAL "Differ" -#define TR_OFFSET INDENT"Offset" +#define TR_OFFSET "Offset" #define TR_TRIM "Trim" #define TR_DREX "DRex" #define DREX_CHBOX_OFFSET 30 @@ -559,6 +556,7 @@ #define TR_FLMODE TR("Mode","Modes") #define TR_MIXWARNING "Warning" #define TR_OFF "OFF" +#define TR_NO_INFORMATION TR("No info", "No information") #define TR_MULTPX "Multpx" #define TR_DELAYDOWN "Delay Dn" #define TR_DELAYUP "Delay Up" @@ -598,8 +596,7 @@ #define TR_RENAVIG "RotEnc Navig" #define TR_THROTTLE_LABEL "Throttle" #define TR_THROTTLEREVERSE TR("T-Reverse", INDENT "Throttle reverse") -#define TR_TIMER_NAME INDENT "Name" -#define TR_MINUTEBEEP TR(INDENT"Minute", INDENT"Minute call") +#define TR_MINUTEBEEP TR("Minute", "Minute call") #define TR_BEEPCOUNTDOWN INDENT"Countdown" #define TR_PERSISTENT TR(INDENT"Persist.", INDENT"Persistent") #define TR_BACKLIGHT_LABEL "Backlight" @@ -608,6 +605,8 @@ #define TR_BLOFFBRIGHTNESS INDENT"OFF Brightness" #define TR_BLCOLOR INDENT "Color" #define TR_SPLASHSCREEN "Splash screen" +#define TR_PWR_ON_SPEED "Pwr On speed" +#define TR_PWR_OFF_SPEED "Pwr Off speed" #define TR_THROTTLEWARNING TR("T-Warning", INDENT "Throttle Warning") #define TR_SWITCHWARNING TR("S-Warning", INDENT "Switch Warning") #define TR_POTWARNINGSTATE TR(INDENT "Pot&Slid.", INDENT "Pots & sliders") @@ -648,7 +647,7 @@ #define TR_TMIXMAXMS "Tmix max" #define TR_FREE_STACK "Free stack" -#define TR_MENUTORESET CENTER TR_ENTER " to reset" +#define TR_MENUTORESET TR_ENTER " to reset" #define TR_PPM_TRAINER "TR" #define TR_CH "CH" #define TR_MODEL "MODEL" @@ -714,13 +713,13 @@ #define TR_MONITOR_CHANNELS4 "CHANNELS MONITOR 25/32" #define TR_MONITOR_OUTPUT_DESC "Outputs" #define TR_MONITOR_MIXER_DESC "Mixers" -#define TR_RECEIVER_NUM TR("RxNum", INDENT"Receiver No.") -#define TR_RECEIVER INDENT "Receiver" -#define TR_MULTI_RFTUNE TR(INDENT "Freq tune",INDENT "RF Freq. fine tune") -#define TR_MULTI_TELEMETRY "Telemetry" -#define TR_MULTI_VIDFREQ TR(INDENT "Vid. freq.", INDENT "Video frequency") -#define TR_MULTI_RFPOWER INDENT "RF Power" -#define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Option value") +#define TR_RECEIVER_NUM TR("RxNum", "Receiver No.") +#define TR_RECEIVER "Receiver" +#define TR_MULTI_RFTUNE TR("Freq tune", "RF Freq. fine tune") +#define TR_MULTI_TELEMETRY "Telemetry" +#define TR_MULTI_VIDFREQ TR("Vid. freq.", "Video frequency") +#define TR_RFPOWER "RF Power" +#define TR_MULTI_OPTION TR("Option", "Option value") #define TR_MULTI_AUTOBIND TR(INDENT "Autobind",INDENT "Bind on powerup") #define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format") #define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode") @@ -742,7 +741,7 @@ #define TR_PROTOCOL_INVALID TR("Prot. invalid", "Protocol invalid") #define TR_MODULE_STATUS TR(INDENT "Status", INDENT "Module Status") #define TR_MODULE_SYNC TR(INDENT "Sync", INDENT "Module Sync") -#define TR_MULTI_SERVOFREQ TR(INDENT "Servo rate", INDENT "Servo update rate") +#define TR_MULTI_SERVOFREQ TR("Servo rate", "Servo update rate") #define TR_SYNCMENU "[Sync]" #define TR_LIMIT INDENT"Limit" #define TR_MINRSSI "Min Rssi" @@ -793,6 +792,7 @@ #define TR_UPDATE_TX_OPTIONS "Update TX options?" #define TR_MODULES_RX_VERSION "Modules / RX version" #define TR_MENU_MODULES_RX_VERSION "MODULES / RX VERSION" +#define TR_MENU_FIRM_OPTIONS "FIRMWARE OPTIONS" #define TR_GYRO "Gyro" #define TR_STICKS_POTS_SLIDERS "Sticks/Pots/Sliders" #define TR_PWM_STICKS_POTS_SLIDERS "PWM Sticks/Pots/Sliders" @@ -818,6 +818,8 @@ #define TR_NIGHTLY_WARNING TR("NIGHTLY", "NIGHTLY BUILD") #define TR_NIGHTLY_NOTSAFE "Version not safe to fly" #define TR_WRONG_SDCARDVERSION TR("Expected ver: ","Expected version: ") +#define TR_WARN_RTC_BATTERY_LOW "RTC Battery low" +#define TR_BATTERY "BATTERY" #define TR_WRONG_PCBREV "Wrong PCB detected" #define TR_EMERGENCY_MODE "EMERGENCY MODE" #define TR_PCBREV_ERROR "PCB error" @@ -871,10 +873,10 @@ #define TR_BLUETOOTH_INIT "Init" #define TR_BLUETOOTH_DIST_ADDR INDENT "Dist addr" #define TR_BLUETOOTH_LOCAL_ADDR INDENT "Local addr" -#define TR_BLUETOOTH_PIN_CODE TR(INDENT "PIN code", "PIN code") +#define TR_BLUETOOTH_PIN_CODE "PIN code" #define TR_BAUDRATE "BT Baudrate" #define LEN_BLUETOOTH_MODES "\011" -#if defined(PCBX9E) && !defined(USEHORUSBT) +#if defined(PCBX9E) #define TR_BLUETOOTH_MODES "---\0 ""Enabled\0 " #else #define TR_BLUETOOTH_MODES "---\0 ""Telemetry""Trainer\0" @@ -901,7 +903,7 @@ #define TR_FLASH_EXTERNAL_DEVICE "Flash External Device" #define TR_FLASH_RECEIVER_OTA "Flash receiver OTA" #define TR_FLASH_BLUETOOTH_MODULE TR("Flash BT module", "Flash Bluetooth module") -#define TR_FLASH_POWER_MANAGEMENT_UNIT TR("Flash pwr mngt unit", "Flash power management unit") +#define TR_FLASH_POWER_MANAGEMENT_UNIT "Flash pwr mngt unit" #define TR_CURRENT_VERSION TR("Current vers. ", "Current version: ") #define TR_FLASH_INTERNAL_MODULE "Flash Internal Module" #define TR_FLASH_EXTERNAL_MODULE "Flash external module" @@ -910,10 +912,16 @@ #define TR_WRITING "Writing..." #define TR_CONFIRM_FORMAT "Confirm Format?" #define TR_INTERNALRF "Internal RF" +#define TR_INTERNAL_MODULE "Internal module" +#define TR_EXTERNAL_MODULE "External module" +#define TR_OPENTX_UPGRADE_REQUIRED "OpenTX upgrade required" +#define TR_TELEMETRY_DISABLED "Telem. disabled" +#define TR_MORE_OPTIONS_AVAILABLE "More options available" +#define TR_NO_MODULE_INFORMATION "No module information" #define TR_EXTERNALRF "External RF" #define TR_FAILSAFE INDENT "Failsafe mode" #define TR_FAILSAFESET "FAILSAFE SETTINGS" -#define TR_REG_ID TR("Reg. ID", "Registration ID") +#define TR_REG_ID "Reg. ID" #define TR_OWNER_ID "Owner ID" #define TR_PINMAPSET "PINMAP" #define TR_HOLD "Hold" @@ -987,7 +995,7 @@ #define TR_TRAINER "Trainer" #define TR_ANTENNAPROBLEM CENTER "TX Antenna problem!" #define TR_MODELIDUSED TR("ID used in:", "Receiver ID used in:") -#define TR_MODULE INDENT "Module" +#define TR_MODULE "Module" #define TR_RX_NAME "Rx Name" #define TR_TELEMETRY_TYPE TR("Type", "Telemetry Type") #define TR_TELEMETRY_SENSORS "Sensors" @@ -999,10 +1007,10 @@ #define TR_ANTENNASELECTION TR(INDENT "Antenna", TR(INDENT "Antenna", INDENT "Antenna selection")) #define TR_ANTENNACONFIRM1 "Really switch?" #define TR_ANTENNACONFIRM2 TR("Check antenna", "Make sure antenna is installed!") -#define TR_R9M_PROTO_FLEX_WARN1 "Requires non" -#define TR_R9M_PROTO_FCC_WARN1 "Requires FCC" -#define TR_R9M_PROTO_EU_WARN1 "Requires EU" -#define TR_R9M_PROTO_WARN2 "certified firmware" +#define TR_R9M_PROTO_FLEX_WARN_LINE1 "Requires non" +#define TR_R9M_PROTO_FCC_WARN_LINE1 "Requires FCC" +#define TR_R9M_PROTO_EU_WARN_LINE1 "Requires EU" +#define TR_R9M_PROTO_WARN_LINE2 "certified firmware" #define TR_LOWALARM INDENT "Low Alarm" #define TR_CRITICALALARM INDENT "Critical Alarm" #define TR_RSSIALARM_WARN TR("RSSI","TELEMETRY RSSI") @@ -1033,7 +1041,7 @@ #define TR_PREFLIGHT "Preflight Checks" #define TR_CHECKLIST INDENT "Display Checklist" #define TR_FAS_OFFSET TR(INDENT "FAS Ofs", INDENT "FAS Offset") -#define TR_UART3MODE "Serial port" +#define TR_AUX_SERIAL_MODE "Serial port" #define TR_SCRIPT "Script" #define TR_INPUTS "Inputs" #define TR_OUTPUTS "Outputs" @@ -1152,6 +1160,9 @@ #define TR_FLASH_WRITE "Flash write..." #define TR_OTA_UPDATE "OTA update..." #define TR_MODULE_RESET "Module reset..." +#define TR_UNKNOWN_RX "Unknown RX" +#define TR_UNSUPPORTED_RX "Unsupported RX" +#define TR_OTA_UPDATE_ERROR "OTA update error" #define TR_DEVICE_RESET "Device reset..." #define TR_ALTITUDE INDENT "Korkeus" #define TR_SCALE "Scale" @@ -1167,6 +1178,7 @@ #define TR_CELLINDEX "Cell index" #define TR_LOGS "Logs" #define TR_OPTIONS "Options" +#define TR_FIRMWARE_OPTIONS "Firmware options" #define TR_ALTSENSOR "Alt sensor" #define TR_CELLSENSOR "Cell sensor" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index 3a1784f20..96228acc2 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -65,16 +65,16 @@ #define TR_VBLMODE TR("OFF\0""Btns""Ctrl""Tous""ON\0","OFF\0 ""Touches\0 ""Controles""Tous\0 ""ON\0 ") #define LEN_TRNMODE "\003" -#define TR_TRNMODE "OFF"" +="" :=" +#define TR_TRNMODE "OFF""+=\0"":=" #define LEN_TRNCHN "\003" #define TR_TRNCHN "CH1CH2CH3CH4" -#define LEN_UART3MODES "\016" +#define LEN_AUX_SERIAL_MODES "\016" #if defined(CLI) || defined(DEBUG) -#define TR_UART3MODES "Debug\0 ""Recopie S-Port""Télémétrie\0 ""Ecolage SBUS\0 ""LUA\0 " +#define TR_AUX_SERIAL_MODES "Debug\0 ""Recopie Telem\0""Télémétrie In\0""Ecolage SBUS\0 ""LUA\0 " #else -#define TR_UART3MODES "OFF\0 ""Recopie S-Port""Télémétrie\0 ""Ecolage SBUS\0 ""LUA\0 " +#define TR_AUX_SERIAL_MODES "OFF\0 ""Recopie Telem\0""Télémétrie In\0""Ecolage SBUS\0 ""LUA\0 " #endif #define LEN_SWTYPES "\006" @@ -385,9 +385,6 @@ #define TR_VKEYS "Menu\0""Exit\0""Bas\0 ""Haut\0""Droit""Gauch" #endif -#define LEN_VRENCODERS "\003" -#define TR_VRENCODERS "REa""REb" - #define LEN_VSWITCHES "\003" #define LEN_VSRCRAW "\004" @@ -548,16 +545,16 @@ #define TR_ELEDIRECTION TR("Inv. longitud.", "Inversion longitudinal") #define TR_AILDIRECTION TR("Inv. latéral", "Inversion latéral") #define TR_COLDIRECTION TR("Inv. collectif", "Inversion collectif") -#define TR_MODE INDENT "Mode" +#define TR_MODE "Mode" #define TR_SUBTYPE INDENT "Sous-type" #define TR_NOFREEEXPO "Max expos atteint!" #define TR_NOFREEMIXER "Max mixages atteint!" -#define TR_SOURCE INDENT "Source" +#define TR_SOURCE "Source" #define TR_WEIGHT "Ratio" #define TR_EXPO TR("Expo", "Exponentiel") #define TR_SIDE "Coté" #define TR_DIFFERENTIAL "Différentiel" -#define TR_OFFSET INDENT "Décalage" +#define TR_OFFSET "Décalage" #define TR_TRIM "Trim" #define TR_DREX "DRex" #define DREX_CHBOX_OFFSET 30 @@ -565,6 +562,7 @@ #define TR_FLMODE TR("Phase", "Phases") #define TR_MIXWARNING "Alerte" #define TR_OFF "OFF" +#define TR_NO_INFORMATION TR("No info", "No information") #define TR_MULTPX "Opération" #define TR_DELAYDOWN "Retard bas" #define TR_DELAYUP "Retard haut" @@ -579,7 +577,7 @@ #define TR_BAR "Barre" #define TR_ALARM INDENT "Alarme" #define TR_USRDATA "Données" -#define TR_BLADES INDENT "Pales/Pôles" +#define TR_BLADES INDENT "Pales/Poles" #define TR_SCREEN "Ecran " #define TR_SOUND_LABEL "Son" #define TR_LENGTH INDENT "Durée" @@ -604,8 +602,7 @@ #define TR_RENAVIG "Navig EncRot" #define TR_THROTTLE_LABEL "Gaz" #define TR_THROTTLEREVERSE TR("Inv. gaz", INDENT "Inversion gaz") -#define TR_TIMER_NAME INDENT "Nom" -#define TR_MINUTEBEEP TR(INDENT "Bip min.", INDENT "Annonces minutes") +#define TR_MINUTEBEEP TR("Bip min.", "Annonces minutes") #define TR_BEEPCOUNTDOWN TR(INDENT "Bip fin", INDENT "Compte à rebours") #define TR_PERSISTENT TR(INDENT "Persist.", INDENT "Persistant") #define TR_BACKLIGHT_LABEL "Rétroéclairage" @@ -614,6 +611,8 @@ #define TR_BLOFFBRIGHTNESS INDENT "Luminosité OFF" #define TR_BLCOLOR INDENT "Couleur" #define TR_SPLASHSCREEN "Logo d'accueil" +#define TR_PWR_ON_SPEED "Pwr On speed" +#define TR_PWR_OFF_SPEED "Pwr Off speed" #define TR_THROTTLEWARNING TR(INDENT "Alerte gaz", INDENT "Alerte gaz") #define TR_SWITCHWARNING TR(INDENT "Alerte int", INDENT "Pos. interrupteurs") #define TR_POTWARNINGSTATE TR(INDENT "Pot&Slid.", INDENT "Pots & sliders") @@ -659,7 +658,7 @@ #define TR_TMIXMAXMS "Tmix max" #define TR_FREE_STACK "Free stack" -#define TR_MENUTORESET CENTER TR_ENTER" pour reset" +#define TR_MENUTORESET TR_ENTER" pour reset" #define TR_PPM_TRAINER "TR" #define TR_CH "CH" #define TR_MODEL "MODELE" @@ -717,12 +716,12 @@ #define TR_MONITOR_SWITCHES "INTERS LOGIQUES" #define TR_MONITOR_OUTPUT_DESC "Sorties" #define TR_MONITOR_MIXER_DESC "Mixeurs" - #define TR_RECEIVER_NUM TR(INDENT "NumRx", INDENT "No. récepteur") - #define TR_RECEIVER INDENT "Récept." +#define TR_RECEIVER_NUM TR("NumRx", "No. récepteur") +#define TR_RECEIVER "Récept." #define TR_MULTI_RFTUNE TR(INDENT "Ajust.fréq", INDENT "Ajustement fréq.") #define TR_MULTI_TELEMETRY "Télémétrie" #define TR_MULTI_VIDFREQ TR(INDENT "Fréq. vidéo", INDENT "Fréquence vidéo") -#define TR_MULTI_RFPOWER TR(INDENT "Puiss. RF", INDENT "Puissance RF") +#define TR_RFPOWER TR(INDENT "Puiss. RF", INDENT "Puissance RF") #define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Option perso") #define TR_MULTI_AUTOBIND TR(INDENT "Bind auto", INDENT "Bind automatique") #define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodét.", INDENT "Autodétection") @@ -796,6 +795,7 @@ #define TR_UPDATE_TX_OPTIONS "Update TX options?" #define TR_MODULES_RX_VERSION "Modules / RX version" #define TR_MENU_MODULES_RX_VERSION "MODULES / RX VERSION" +#define TR_MENU_FIRM_OPTIONS "FIRMWARE OPTIONS" #define TR_GYRO "Gyro" #define TR_STICKS_POTS_SLIDERS "Sticks/Pots/Sliders" #define TR_PWM_STICKS_POTS_SLIDERS "PWM Sticks/Pots/Sliders" @@ -821,6 +821,8 @@ #define TR_NIGHTLY_WARNING TR("NIGHTLY", "NIGHTLY BUILD") #define TR_NIGHTLY_NOTSAFE "Version de test uniq." #define TR_WRONG_SDCARDVERSION "Version requise: " +#define TR_WARN_RTC_BATTERY_LOW "RTC Battery low" +#define TR_BATTERY "BATTERY" #define TR_WRONG_PCBREV "PCB incorrect détecté" #define TR_EMERGENCY_MODE "MODE SECOURS" #define TR_PCBREV_ERROR "Erreur PCB" @@ -873,10 +875,10 @@ #define TR_BLUETOOTH_INIT "Init" #define TR_BLUETOOTH_DIST_ADDR INDENT "Dist addr" #define TR_BLUETOOTH_LOCAL_ADDR INDENT "Local addr" -#define TR_BLUETOOTH_PIN_CODE TR(INDENT "PIN code", "PIN code") +#define TR_BLUETOOTH_PIN_CODE "PIN code" #define TR_BAUDRATE "Baudrate BT" #define LEN_BLUETOOTH_MODES "\012" -#if defined(PCBX9E) && !defined(USEHORUSBT) +#if defined(PCBX9E) #define TR_BLUETOOTH_MODES "---\0 ""Activé\0 " #else #define TR_BLUETOOTH_MODES "---\0 ""Télémétrie""Ecolage\0" @@ -903,7 +905,7 @@ #define TR_FLASH_EXTERNAL_DEVICE TR("Flasher S.Port", "Flasher S.Port externe") #define TR_FLASH_RECEIVER_OTA "Flash receiver OTA" #define TR_FLASH_BLUETOOTH_MODULE TR("Flash BT module", "Flash Bluetooth module") -#define TR_FLASH_POWER_MANAGEMENT_UNIT TR("Flash pwr mngt unit", "Flash power management unit") +#define TR_FLASH_POWER_MANAGEMENT_UNIT "Flash pwr mngt unit" #define TR_CURRENT_VERSION "Version courante :" #define TR_FLASH_INTERNAL_MODULE TR("Flasher module int.", "Flasher module interne") #define TR_FLASH_EXTERNAL_MODULE TR("Flasher module ext.", "Flasher module externe") @@ -912,6 +914,12 @@ #define TR_WRITING TR("\14Ecriture...", "\032Ecriture...") #define TR_CONFIRM_FORMAT "Confirmer Formatage?" #define TR_INTERNALRF "HF interne" +#define TR_INTERNAL_MODULE "Internal module" +#define TR_EXTERNAL_MODULE "External module" +#define TR_OPENTX_UPGRADE_REQUIRED "OpenTX upgrade required" +#define TR_TELEMETRY_DISABLED "Telem. disabled" +#define TR_MORE_OPTIONS_AVAILABLE "More options available" +#define TR_NO_MODULE_INFORMATION "No module information" #define TR_EXTERNALRF "HF externe" #define TR_FAILSAFE TR(INDENT "Failsafe", INDENT "Type failsafe") #define TR_FAILSAFESET "REGLAGES FAILSAFE" @@ -989,7 +997,7 @@ #define TR_TRAINER "Ecolage" #define TR_ANTENNAPROBLEM CENTER "Antenne radio défect.!" #define TR_MODELIDUSED TR("ID affecté à :", "No de récepteur utilisé par :") -#define TR_MODULE INDENT "Module" +#define TR_MODULE "Module" #define TR_RX_NAME "Nom Rx" #define TR_TELEMETRY_TYPE TR("Type tél.", "Type télémétrie") #define TR_TELEMETRY_SENSORS "Capteurs" @@ -1001,10 +1009,10 @@ #define TR_ANTENNASELECTION TR(INDENT "Antenne", INDENT "Choix antenne") #define TR_ANTENNACONFIRM1 "Vraiment changer?" #define TR_ANTENNACONFIRM2 TR("Vérif antenne", "Installer l'antenne d'abord!") -#define TR_R9M_PROTO_FLEX_WARN1 "Nécessite firm." -#define TR_R9M_PROTO_FCC_WARN1 "Requires FCC" -#define TR_R9M_PROTO_EU_WARN1 "Requires EU" -#define TR_R9M_PROTO_WARN2 "R9M non certifié" +#define TR_R9M_PROTO_FLEX_WARN_LINE1 "Nécessite firm." +#define TR_R9M_PROTO_FCC_WARN_LINE1 "Requires FCC" +#define TR_R9M_PROTO_EU_WARN_LINE1 "Requires EU" +#define TR_R9M_PROTO_WARN_LINE2 "R9M non certifié" #define TR_LOWALARM INDENT "Alarme basse" #define TR_CRITICALALARM INDENT "Alarme critique" #define TR_RSSIALARM_WARN TR("RSSI", "TELEMETRIE") @@ -1035,7 +1043,7 @@ #define TR_PREFLIGHT "Vérifications avant vol" #define TR_CHECKLIST TR(INDENT "Notes", INDENT "Afficher notes") #define TR_FAS_OFFSET TR(INDENT "Corr FAS", INDENT "Correction FAS") -#define TR_UART3MODE "Port série" +#define TR_AUX_SERIAL_MODE "Port série" #define TR_SCRIPT "Script" #define TR_INPUTS "Entrées" #define TR_OUTPUTS "Sorties" @@ -1161,6 +1169,9 @@ #define TR_FLASH_WRITE "Flash write..." #define TR_OTA_UPDATE "OTA update..." #define TR_MODULE_RESET "Module reset..." +#define TR_UNKNOWN_RX "Unknown RX" +#define TR_UNSUPPORTED_RX "Unsupported RX" +#define TR_OTA_UPDATE_ERROR "OTA update error" #define TR_DEVICE_RESET "Device reset..." #define TR_ALTITUDE INDENT "Altitude" #define TR_SCALE "Echelle" @@ -1176,6 +1187,7 @@ #define TR_CELLINDEX "Index élem." #define TR_LOGS "Logs" #define TR_OPTIONS "Options" +#define TR_FIRMWARE_OPTIONS "Firmware options" #define TR_ALTSENSOR "Capteur Alt" #define TR_CELLSENSOR "Capteur Elém" diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index 7ef942227..a5812a04b 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -65,16 +65,16 @@ #define TR_VBLMODE TR("OFF\0 ""Tasti""Stks\0""Tutti""ON\0 ", "Spenta""Tasti\0""Sticks""Tutti\0""Accesa") #define LEN_TRNMODE "\003" -#define TR_TRNMODE "off"" +="" :=" +#define TR_TRNMODE "OFF""+=\0"":=" #define LEN_TRNCHN "\003" #define TR_TRNCHN "ch1ch2ch3ch4" -#define LEN_UART3MODES "\016" +#define LEN_AUX_SERIAL_MODES "\016" #if defined(CLI) || defined(DEBUG) -#define TR_UART3MODES "Debug\0 ""Replica S-Port""Telemetria\0 ""SBUS Trainer\0 ""LUA\0 " +#define TR_AUX_SERIAL_MODES "Debug\0 ""Replica S-Port""Telemetria\0 ""SBUS Trainer\0 ""LUA\0 " #else -#define TR_UART3MODES "OFF\0 ""Replica S-Port""Telemetria\0 ""SBUS Trainer\0 ""LUA\0 " +#define TR_AUX_SERIAL_MODES "OFF\0 ""Replica S-Port""Telemetria\0 ""SBUS Trainer\0 ""LUA\0 " #endif #define LEN_SWTYPES "\006" @@ -385,13 +385,10 @@ #define TR_VKEYS "Menu\0""Exit\0""Down\0""Up\0 ""Right""Left\0" #endif -#define LEN_VRENCODERS "\003" -#define TR_VRENCODERS "REa""REb" - #define LEN_VSWITCHES "\003" #define LEN_VSRCRAW "\004" -#define TR_STICKS_VSRCRAW TR("Dir\0""Ele\0""Mot\0""Ale\0", "\307Dir""\307Ele""\307Mot""\307Ale") +#define TR_STICKS_VSRCRAW "\307Dir""\307Ele""\307Mot""\307Ale" #if defined(PCBHORUS) #define TR_TRIMS_VSRCRAW "\313Dir""\313Ele""\313Mot""\313Ale""\313T5\0""\313T6\0" @@ -549,16 +546,16 @@ #define TR_ELEDIRECTION TR("Direzione ELE","Direzione Long. cyc.") #define TR_AILDIRECTION TR("Direzione AIL","Direzione Lateral cyc.") #define TR_COLDIRECTION TR("Direzione PIT","Direzione Coll. Passo") -#define TR_MODE INDENT"Modo" +#define TR_MODE "Modo" #define TR_SUBTYPE INDENT "Subtype" #define TR_NOFREEEXPO "Expo pieni!" #define TR_NOFREEMIXER "Mixer pieni!" -#define TR_SOURCE INDENT"Sorg." +#define TR_SOURCE "Sorg." #define TR_WEIGHT "Peso" #define TR_EXPO "Espo" #define TR_SIDE "Lato" #define TR_DIFFERENTIAL "Differ" -#define TR_OFFSET INDENT"Offset" +#define TR_OFFSET "Offset" #define TR_TRIM "Trim" #define TR_DREX "DRex" #define DREX_CHBOX_OFFSET 30 @@ -566,6 +563,7 @@ #define TR_FLMODE "Fase" #define TR_MIXWARNING "Avviso" #define TR_OFF "OFF" +#define TR_NO_INFORMATION TR("No info", "No information") #define TR_MULTPX "MultPx" #define TR_DELAYDOWN "Post.Giù " #define TR_DELAYUP "Post.Sù" @@ -605,8 +603,7 @@ #define TR_RENAVIG "Navig EncRot " #define TR_THROTTLE_LABEL "Motore" #define TR_THROTTLEREVERSE TR("Mot inv.", INDENT "Motore Inverso") -#define TR_TIMER_NAME INDENT "Nome" -#define TR_MINUTEBEEP INDENT"Minuto" +#define TR_MINUTEBEEP "Minuto" #define TR_BEEPCOUNTDOWN TR(INDENT"Conto rov", INDENT"Conto rovescia") #define TR_PERSISTENT TR(INDENT"Persist.", INDENT"Persistente") #define TR_BACKLIGHT_LABEL TR("Retroillum.", "Retroilluminazione") @@ -615,6 +612,8 @@ #define TR_BLOFFBRIGHTNESS TR(INDENT"Lumin. OFF",INDENT"Luminosità OFF") #define TR_BLCOLOR INDENT "Colore" #define TR_SPLASHSCREEN TR("Schermo avvio", "Schermata di avvio") +#define TR_PWR_ON_SPEED "Pwr On speed" +#define TR_PWR_OFF_SPEED "Pwr Off speed" #define TR_THROTTLEWARNING TR("All. Mot.", INDENT "Allarme Motore") #define TR_SWITCHWARNING TR("Avv. Int.", INDENT "Avviso Interr.") #define TR_POTWARNINGSTATE TR(INDENT "Pot&Slid.", INDENT "Pots & sliders") @@ -657,7 +656,7 @@ #define TR_TMR1JITTERUS "Tmr1 Jitter\037\124us" #define TR_TMIXMAXMS "Tmix max" #define TR_FREE_STACK "Free stack" -#define TR_MENUTORESET CENTER TR_ENTER" x Azzerare" +#define TR_MENUTORESET TR_ENTER" x Azzerare" #define TR_PPM_TRAINER "TR" #define TR_CH "CH" #define TR_MODEL "MODELLO" @@ -715,13 +714,13 @@ #define TR_MONITOR_CHANNELS4 "CHANNELS MONITOR 25/32" #define TR_MONITOR_OUTPUT_DESC "Outputs" #define TR_MONITOR_MIXER_DESC "Mixers" - #define TR_RECEIVER_NUM TR(INDENT "RxNum", INDENT "Ricevente No.") -#define TR_RECEIVER INDENT "Receiver" -#define TR_MULTI_RFTUNE TR(INDENT "Freq tune",INDENT "RF Freq. fine tune") -#define TR_MULTI_TELEMETRY "Telemetry" -#define TR_MULTI_VIDFREQ TR(INDENT "Vid. freq.", INDENT "Video frequency") -#define TR_MULTI_RFPOWER INDENT "RF Power" -#define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Option value") +#define TR_RECEIVER_NUM TR("RxNum", "Ricevente No.") +#define TR_RECEIVER "Receiver" +#define TR_MULTI_RFTUNE TR("Freq tune", "RF Freq. fine tune") +#define TR_MULTI_TELEMETRY "Telemetry" +#define TR_MULTI_VIDFREQ TR("Vid. freq.", "Video frequency") +#define TR_RFPOWER "RF Power" +#define TR_MULTI_OPTION TR("Option", "Option value") #define TR_MULTI_AUTOBIND TR(INDENT "Autobind",INDENT "Bind on powerup") #define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format") #define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode") @@ -743,7 +742,7 @@ #define TR_PROTOCOL_INVALID TR("Prot. invalid", "Protocol invalid") #define TR_MODULE_STATUS TR(INDENT "Status", INDENT "Module Status") #define TR_MODULE_SYNC TR(INDENT "Sync", INDENT "Module Sync") -#define TR_MULTI_SERVOFREQ TR(INDENT "Servo rate", INDENT "Servo update rate") +#define TR_MULTI_SERVOFREQ TR("Servo rate", "Servo update rate") #define TR_SYNCMENU "[Sync]" #define TR_LIMIT INDENT "Limiti" #define TR_MINRSSI "Min Rssi" @@ -794,6 +793,7 @@ #define TR_UPDATE_TX_OPTIONS "Update TX options?" #define TR_MODULES_RX_VERSION "Modules / RX version" #define TR_MENU_MODULES_RX_VERSION "MODULES / RX VERSION" +#define TR_MENU_FIRM_OPTIONS "FIRMWARE OPTIONS" #define TR_GYRO "Gyro" #define TR_STICKS_POTS_SLIDERS "Sticks/Pots/Sliders" #define TR_PWM_STICKS_POTS_SLIDERS "PWM Sticks/Pots/Sliders" @@ -819,6 +819,8 @@ #define TR_NIGHTLY_WARNING TR("NIGHTLY", "NIGHTLY BUILD") #define TR_NIGHTLY_NOTSAFE "Version not safe to fly" #define TR_WRONG_SDCARDVERSION TR("Expected ver: ","Expected version: ") +#define TR_WARN_RTC_BATTERY_LOW "RTC Battery low" +#define TR_BATTERY "BATTERY" #define TR_WRONG_PCBREV "Wrong PCB detected" #define TR_EMERGENCY_MODE "EMERGENCY MODE" #define TR_PCBREV_ERROR "PCB error" @@ -872,10 +874,10 @@ #define TR_BLUETOOTH_INIT "Init" #define TR_BLUETOOTH_DIST_ADDR INDENT "Dist addr" #define TR_BLUETOOTH_LOCAL_ADDR INDENT "Local addr" -#define TR_BLUETOOTH_PIN_CODE TR(INDENT "PIN code", "PIN code") +#define TR_BLUETOOTH_PIN_CODE "PIN code" #define TR_BAUDRATE "BT Baudrate" #define LEN_BLUETOOTH_MODES "\011" -#if defined(PCBX9E) && !defined(USEHORUSBT) +#if defined(PCBX9E) #define TR_BLUETOOTH_MODES "---\0 ""Enabled\0 " #else #define TR_BLUETOOTH_MODES "---\0 ""Telemetry""Trainer\0" @@ -902,7 +904,7 @@ #define TR_FLASH_EXTERNAL_DEVICE "Progr. Dispositivo Esterno" #define TR_FLASH_RECEIVER_OTA "Flash receiver OTA" #define TR_FLASH_BLUETOOTH_MODULE TR("Flash BT module", "Flash Bluetooth module") -#define TR_FLASH_POWER_MANAGEMENT_UNIT TR("Flash pwr mngt unit", "Flash power management unit") +#define TR_FLASH_POWER_MANAGEMENT_UNIT "Flash pwr mngt unit" #define TR_CURRENT_VERSION TR("Current vers. ", "Current version: ") #define TR_FLASH_INTERNAL_MODULE "Progr. Modulo Interno" #define TR_FLASH_EXTERNAL_MODULE "Flash external module" @@ -911,10 +913,16 @@ #define TR_WRITING "\032Scrivendo..." #define TR_CONFIRM_FORMAT "Confermi Format?" #define TR_INTERNALRF "Modulo Interno" +#define TR_INTERNAL_MODULE "Internal module" +#define TR_EXTERNAL_MODULE "External module" +#define TR_OPENTX_UPGRADE_REQUIRED "OpenTX upgrade required" +#define TR_TELEMETRY_DISABLED "Telem. disabled" +#define TR_MORE_OPTIONS_AVAILABLE "More options available" +#define TR_NO_MODULE_INFORMATION "No module information" #define TR_EXTERNALRF "Modulo esterno" #define TR_FAILSAFE "Modo failsafe" #define TR_FAILSAFESET TR("FAILSAFE","IMPOSTAZIONI FAILSAFE") -#define TR_REG_ID TR("Reg. ID", "Registration ID") +#define TR_REG_ID "Reg. ID" #define TR_OWNER_ID "Owner ID" #define TR_PINMAPSET "PINMAP" #define TR_HOLD "Hold" @@ -988,7 +996,7 @@ #define TR_TRAINER TR("Trainer","Maestro/Allievo") #define TR_ANTENNAPROBLEM CENTER "Problemi antenna TX!" #define TR_MODELIDUSED TR("ID già usato","ID Modello già usato") -#define TR_MODULE INDENT "Modulo" +#define TR_MODULE "Modulo" #define TR_RX_NAME "Rx Name" #define TR_TELEMETRY_TYPE "Tipo Telemetria" #define TR_TELEMETRY_SENSORS "Sensori" @@ -1000,10 +1008,10 @@ #define TR_ANTENNASELECTION TR(INDENT "Antenna", INDENT "Antenna selection") #define TR_ANTENNACONFIRM1 "Really switch?" #define TR_ANTENNACONFIRM2 TR("Check antenna", "Make sure antenna is installed!") -#define TR_R9M_PROTO_FLEX_WARN1 "Requires non" -#define TR_R9M_PROTO_FCC_WARN1 "Requires FCC" -#define TR_R9M_PROTO_EU_WARN1 "Requires EU" -#define TR_R9M_PROTO_WARN2 "certified firmware" +#define TR_R9M_PROTO_FLEX_WARN_LINE1 "Requires non" +#define TR_R9M_PROTO_FCC_WARN_LINE1 "Requires FCC" +#define TR_R9M_PROTO_EU_WARN_LINE1 "Requires EU" +#define TR_R9M_PROTO_WARN_LINE2 "certified firmware" #define TR_LOWALARM INDENT "Allarme Basso" #define TR_CRITICALALARM INDENT "Allarme Critico" #define TR_RSSIALARM_WARN TR("RSSI","TELEMETRY RSSI") @@ -1034,7 +1042,7 @@ #define TR_PREFLIGHT "Controlli Prevolo" #define TR_CHECKLIST INDENT "Mostra Checklist" #define TR_FAS_OFFSET TR(INDENT "FAS Ofs", INDENT "FAS Offset") -#define TR_UART3MODE "Porta Seriale" +#define TR_AUX_SERIAL_MODE "Porta Seriale" #define TR_SCRIPT "Script" #define TR_INPUTS "Ingresso" #define TR_OUTPUTS "Uscita" @@ -1153,6 +1161,9 @@ #define TR_FLASH_WRITE "Flash write..." #define TR_OTA_UPDATE "OTA update..." #define TR_MODULE_RESET "Module reset..." +#define TR_UNKNOWN_RX "Unknown RX" +#define TR_UNSUPPORTED_RX "Unsupported RX" +#define TR_OTA_UPDATE_ERROR "OTA update error" #define TR_DEVICE_RESET "Device reset..." #define TR_ALTITUDE INDENT "Altitudine" #define TR_SCALE "Scala" @@ -1168,6 +1179,7 @@ #define TR_CELLINDEX "Indice cella" #define TR_LOGS "Logs" #define TR_OPTIONS "Opzioni" +#define TR_FIRMWARE_OPTIONS "Firmware options" #define TR_ALTSENSOR "Sensore Alt" #define TR_CELLSENSOR "Sensore Cell" diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index f1738dffb..cd94cc308 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -70,11 +70,11 @@ #define LEN_TRNCHN "\003" #define TR_TRNCHN "CH1CH2CH3CH4" -#define LEN_UART3MODES "\015" +#define LEN_AUX_SERIAL_MODES "\015" #if defined(CLI) || defined(DEBUG) -#define TR_UART3MODES "Debug\0 ""S-Port Mirror""Telemetrie\0 ""SBUS Leerling""LUA\0 " +#define TR_AUX_SERIAL_MODES "Debug\0 ""Telem Mirror\0""Telemetry In\0""SBUS Leerling""LUA\0 " #else -#define TR_UART3MODES "UIT\0 ""S-Port Mirror""Telemetrie\0 ""SBUS Leerling""LUA\0 " +#define TR_AUX_SERIAL_MODES "UIT\0 ""Telem Mirror\0""Telemetry In\0""SBUS Leerling""LUA\0 " #endif #define LEN_SWTYPES "\006" @@ -367,9 +367,6 @@ #define TR_VKEYS "Menu\0""Exit\0""Down\0""Up\0 ""Right""Left\0" #endif -#define LEN_VRENCODERS "\003" -#define TR_VRENCODERS "REa""REb" - #define LEN_VSWITCHES "\003" #define LEN_VSRCRAW "\004" @@ -531,16 +528,16 @@ TR_GYR_VSRCRAW #define TR_ELEDIRECTION "ELE Direction" #define TR_AILDIRECTION "AIL Direction" #define TR_COLDIRECTION "PIT Direction" -#define TR_MODE INDENT "Mode" +#define TR_MODE "Mode" #define TR_SUBTYPE INDENT "Subtype" #define TR_NOFREEEXPO "Geen vrije expo!" #define TR_NOFREEMIXER "Geen vrije mixer!" -#define TR_SOURCE INDENT "Source" +#define TR_SOURCE "Source" #define TR_WEIGHT "Gewicht" #define TR_EXPO TR("Expo", "Exponentieel") #define TR_SIDE "Side" #define TR_DIFFERENTIAL "Diff" -#define TR_OFFSET INDENT "Offset" +#define TR_OFFSET "Offset" #define TR_TRIM "Trim" #define TR_DREX "DRex" #define DREX_CHBOX_OFFSET 30 @@ -548,6 +545,7 @@ TR_GYR_VSRCRAW #define TR_FLMODE TR("Mode", "Modes") #define TR_MIXWARNING "Melding" #define TR_OFF "UIT" +#define TR_NO_INFORMATION TR("No info", "No information") #define TR_MULTPX "Multpx" #define TR_DELAYDOWN "Vertr.Dn" #define TR_DELAYUP "Vertr.Up" @@ -589,8 +587,7 @@ TR_GYR_VSRCRAW #define TR_RENAVIG "Stappenschakelaar" #define TR_THROTTLE_LABEL "Gas" #define TR_THROTTLEREVERSE TR("Reverse", INDENT "Omgekeerd") -#define TR_TIMER_NAME INDENT "Naam" -#define TR_MINUTEBEEP TR(INDENT "Min-Alarm", INDENT "Minuten-Alarm") +#define TR_MINUTEBEEP TR("Min-Alarm", "Minuten-Alarm") #define TR_BEEPCOUNTDOWN INDENT "Countdown" #define TR_PERSISTENT TR(INDENT "Vasth.", INDENT "Vasthouden") #define TR_BACKLIGHT_LABEL "LCD-Verlichting" @@ -599,6 +596,8 @@ TR_GYR_VSRCRAW #define TR_BLOFFBRIGHTNESS INDENT "Uit-Helderheid" #define TR_BLCOLOR INDENT "Kleur" #define TR_SPLASHSCREEN "Startscherm Aan" +#define TR_PWR_ON_SPEED "Pwr On speed" +#define TR_PWR_OFF_SPEED "Pwr Off speed" #define TR_THROTTLEWARNING TR(INDENT "T-Warning", INDENT "Throttle Status") #define TR_SWITCHWARNING TR(INDENT "S-Warning", INDENT "Switch Posities") #define TR_POTWARNINGSTATE TR(INDENT "Pot&Slid.", INDENT "Pots & sliders") @@ -643,7 +642,7 @@ TR_GYR_VSRCRAW #define TR_TMR1JITTERUS "Tmr1 Jitter\037\124us" #define TR_TMIXMAXMS "Tmix max" #define TR_FREE_STACK "Free stack" -#define TR_MENUTORESET CENTER TR_ENTER" voor Reset" +#define TR_MENUTORESET TR_ENTER" voor Reset" #define TR_PPM_TRAINER "TR" #define TR_CH "CH" #define TR_MODEL "MODEL" @@ -704,13 +703,13 @@ TR_GYR_VSRCRAW #define TR_MONITOR_SWITCHES "LOGISCHE SCHAKELAARS MONITOR" #define TR_MONITOR_OUTPUT_DESC "Outputs" #define TR_MONITOR_MIXER_DESC "Mixers" - #define TR_RECEIVER_NUM TR(INDENT "RxNum", INDENT "Receiver Nr.") - #define TR_RECEIVER INDENT "Receiver" -#define TR_MULTI_RFTUNE TR(INDENT "Freq tune",INDENT "RF Freq. fine tune") -#define TR_MULTI_TELEMETRY "Telemetry" -#define TR_MULTI_VIDFREQ TR(INDENT "Vid. freq.", INDENT "Video frequency") -#define TR_MULTI_RFPOWER INDENT "RF Power" -#define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Option value") +#define TR_RECEIVER_NUM TR("RxNum", "Receiver Nr.") +#define TR_RECEIVER "Receiver" +#define TR_MULTI_RFTUNE TR("Freq tune", "RF Freq. fine tune") +#define TR_MULTI_TELEMETRY "Telemetry" +#define TR_MULTI_VIDFREQ TR("Vid. freq.", "Video frequency") +#define TR_RFPOWER "RF Power" +#define TR_MULTI_OPTION TR("Option", "Option value") #define TR_MULTI_AUTOBIND TR(INDENT "Autobind",INDENT "Bind on powerup") #define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format") #define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode") @@ -732,7 +731,7 @@ TR_GYR_VSRCRAW #define TR_PROTOCOL_INVALID TR("Prot. invalid", "Protocol invalid") #define TR_MODULE_STATUS TR(INDENT "Status", INDENT "Module Status") #define TR_MODULE_SYNC TR(INDENT "Sync", INDENT "Module Sync") -#define TR_MULTI_SERVOFREQ TR(INDENT "Servo rate", INDENT "Servo update rate") +#define TR_MULTI_SERVOFREQ TR("Servo rate", "Servo update rate") #define TR_SYNCMENU "Sync [MENU]" #define TR_LIMIT INDENT "Grenzen" #define TR_MINRSSI "Min. RSSI" @@ -783,6 +782,7 @@ TR_GYR_VSRCRAW #define TR_UPDATE_TX_OPTIONS "Update TX options?" #define TR_MODULES_RX_VERSION "Modules / RX version" #define TR_MENU_MODULES_RX_VERSION "MODULES / RX VERSION" +#define TR_MENU_FIRM_OPTIONS "FIRMWARE OPTIONS" #define TR_GYRO "Gyro" #define TR_STICKS_POTS_SLIDERS "Sticks/Pots/Sliders" #define TR_PWM_STICKS_POTS_SLIDERS "PWM Sticks/Pots/Sliders" @@ -808,6 +808,8 @@ TR_GYR_VSRCRAW #define TR_NIGHTLY_WARNING TR("NIGHTLY", "NIGHTLY BUILD") #define TR_NIGHTLY_NOTSAFE "Version not safe to fly" #define TR_WRONG_SDCARDVERSION TR("Verwachte ver: ","Verwachte versie: ") +#define TR_WARN_RTC_BATTERY_LOW "RTC Battery low" +#define TR_BATTERY "BATTERY" #define TR_WRONG_PCBREV "Verkeerde PCB gedetecteerd" #define TR_EMERGENCY_MODE "EMERGENCY MODE" #define TR_PCBREV_ERROR "PCB fout" @@ -861,10 +863,10 @@ TR_GYR_VSRCRAW #define TR_BLUETOOTH_INIT "Init" #define TR_BLUETOOTH_DIST_ADDR INDENT "Dist addr" #define TR_BLUETOOTH_LOCAL_ADDR INDENT "Local addr" -#define TR_BLUETOOTH_PIN_CODE TR(INDENT "PIN code", "PIN code") +#define TR_BLUETOOTH_PIN_CODE "PIN code" #define TR_BAUDRATE "BT Baudrate" #define LEN_BLUETOOTH_MODES "\011" -#if defined(PCBX9E) && !defined(USEHORUSBT) +#if defined(PCBX9E) #define TR_BLUETOOTH_MODES "---\0 ""Enabled\0 " #else #define TR_BLUETOOTH_MODES "---\0 ""Telemetry""Trainer\0" @@ -891,7 +893,7 @@ TR_GYR_VSRCRAW #define TR_FLASH_EXTERNAL_DEVICE "Flash extern Apparaat" #define TR_FLASH_RECEIVER_OTA "Flash receiver OTA" #define TR_FLASH_BLUETOOTH_MODULE TR("Flash BT module", "Flash Bluetooth module") -#define TR_FLASH_POWER_MANAGEMENT_UNIT TR("Flash pwr mngt unit", "Flash power management unit") +#define TR_FLASH_POWER_MANAGEMENT_UNIT "Flash pwr mngt unit" #define TR_CURRENT_VERSION TR("Current vers. ", "Current version: ") #define TR_FLASH_INTERNAL_MODULE "Flash interne XJT-Module" #define TR_FLASH_EXTERNAL_MODULE "Flash external module" @@ -900,10 +902,16 @@ TR_GYR_VSRCRAW #define TR_WRITING "\032Schrijven..." #define TR_CONFIRM_FORMAT "Formatteren bevestigen?" #define TR_INTERNALRF "Interne RF" +#define TR_INTERNAL_MODULE "Internal module" +#define TR_EXTERNAL_MODULE "External module" +#define TR_OPENTX_UPGRADE_REQUIRED "OpenTX upgrade required" +#define TR_TELEMETRY_DISABLED "Telem. disabled" +#define TR_MORE_OPTIONS_AVAILABLE "More options available" +#define TR_NO_MODULE_INFORMATION "No module information" #define TR_EXTERNALRF "Externe RF" #define TR_FAILSAFE TR(INDENT "Failsafe", INDENT "Failsafe Modus") #define TR_FAILSAFESET "Failsafe instellen" -#define TR_REG_ID TR("Reg. ID", "Registration ID") +#define TR_REG_ID "Reg. ID" #define TR_OWNER_ID "Owner ID" #define TR_PINMAPSET "PINMAP" #define TR_HOLD "Hold" @@ -977,7 +985,7 @@ TR_GYR_VSRCRAW #define TR_TRAINER "Trainer Poort" #define TR_ANTENNAPROBLEM CENTER "TX-Antenneprobleem!" #define TR_MODELIDUSED TR("ID al gebruikt", "Model-ID al gebruikt") -#define TR_MODULE INDENT "Module-Type" +#define TR_MODULE "Module-Type" #define TR_RX_NAME "Rx Name" #define TR_TELEMETRY_TYPE TR("Type", "Telemetrietype") #define TR_TELEMETRY_SENSORS "Sensoren" @@ -989,10 +997,10 @@ TR_GYR_VSRCRAW #define TR_ANTENNASELECTION TR(INDENT "Antenna", INDENT "Antenna selection") #define TR_ANTENNACONFIRM1 "Antennes wisselen?" #define TR_ANTENNACONFIRM2 TR("Check antenna", "Is er zeker een antenne geplaatst!") -#define TR_R9M_PROTO_FLEX_WARN1 "Requires non" -#define TR_R9M_PROTO_FCC_WARN1 "Requires FCC" -#define TR_R9M_PROTO_EU_WARN1 "Requires EU" -#define TR_R9M_PROTO_WARN2 "certified firmware" +#define TR_R9M_PROTO_FLEX_WARN_LINE1 "Requires non" +#define TR_R9M_PROTO_FCC_WARN_LINE1 "Requires FCC" +#define TR_R9M_PROTO_EU_WARN_LINE1 "Requires EU" +#define TR_R9M_PROTO_WARN_LINE2 "certified firmware" #define TR_LOWALARM INDENT "Waarschuwing" #define TR_CRITICALALARM INDENT "Kritiek Alarm" #define TR_RSSIALARM_WARN TR("RSSI","TELEMETRY RSSI") @@ -1023,7 +1031,7 @@ TR_GYR_VSRCRAW #define TR_PREFLIGHT "Preflight Checks" #define TR_CHECKLIST TR(INDENT "Checklist", INDENT "Toon Checklist") #define TR_FAS_OFFSET TR(INDENT "FAS Ofs", INDENT "FAS Offset") -#define TR_UART3MODE "Seriele poort" +#define TR_AUX_SERIAL_MODE "Seriele poort" #define TR_SCRIPT "Script" #define TR_INPUTS "Inputs" #define TR_OUTPUTS "Outputs" @@ -1147,6 +1155,9 @@ TR_GYR_VSRCRAW #define TR_FLASH_WRITE "Flash write..." #define TR_OTA_UPDATE "OTA update..." #define TR_MODULE_RESET "Module reset..." +#define TR_UNKNOWN_RX "Unknown RX" +#define TR_UNSUPPORTED_RX "Unsupported RX" +#define TR_OTA_UPDATE_ERROR "OTA update error" #define TR_DEVICE_RESET "Device reset..." #define TR_ALTITUDE INDENT "Hoogte" #define TR_SCALE "Schaal" @@ -1162,6 +1173,7 @@ TR_GYR_VSRCRAW #define TR_CELLINDEX "Cel index" #define TR_LOGS "Log Data" #define TR_OPTIONS "Opties" +#define TR_FIRMWARE_OPTIONS "Firmware options" #define TR_ALTSENSOR "Hoogte Sensor" #define TR_CELLSENSOR "Cellen Sensor" diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index f6e706992..ac4009108 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -70,11 +70,11 @@ #define LEN_TRNCHN "\003" #define TR_TRNCHN "KN1KN2KN3KN4" -#define LEN_UART3MODES "\015" /*13 decimal*/ +#define LEN_AUX_SERIAL_MODES "\015" /*13 decimal*/ #if defined(CLI) || defined(DEBUG) -#define TR_UART3MODES "Debug\0 ""S-Port Kopia ""Telemetria\0 ""Trener SBUS\0 ""LUA\0 " +#define TR_AUX_SERIAL_MODES "Debug\0 ""S-Port Kopia ""Telemetria\0 ""Trener SBUS\0 ""LUA\0 " #else -#define TR_UART3MODES "Wyłącz\0 ""S-Port Kopia ""Telemetria\0 ""Trener SBUS\0 ""LUA\0 " +#define TR_AUX_SERIAL_MODES "Wyłącz\0 ""S-Port Kopia ""Telemetria\0 ""Trener SBUS\0 ""LUA\0 " #endif #define LEN_SWTYPES "\006" @@ -386,13 +386,10 @@ #define TR_VKEYS "Menu\0""Exit\0""Down\0""Up\0 ""Right""Left\0" #endif -#define LEN_VRENCODERS "\003" -#define TR_VRENCODERS "REa""REb" - #define LEN_VSWITCHES "\003" #define LEN_VSRCRAW "\004" -#define TR_STICKS_VSRCRAW TR("SK\0 ""SW\0 ""Gaz\0""Lot\0", "\307SK ""\307SW ""\307Gaz""\307Lot") +#define TR_STICKS_VSRCRAW "\307SK\0""\307SW\0""\307Gaz""\307Lot" #if defined(PCBHORUS) #define TR_TRIMS_VSRCRAW "\313SK\0""\313SW\0""\313Gaz""\313Lot""\313T5\0""\313T6\0" @@ -549,16 +546,16 @@ #define TR_ELEDIRECTION TR("Ster Wysokośc","Dług. Kierunku cyklu") #define TR_AILDIRECTION TR("Kierunek Lotk","Lateral cyc. direction") #define TR_COLDIRECTION TR("PIT Direction","Coll. pitch direction") -#define TR_MODE INDENT "Tryb" +#define TR_MODE "Tryb" #define TR_SUBTYPE INDENT "Subtype" #define TR_NOFREEEXPO "BrakWoln.Expo!" #define TR_NOFREEMIXER "BrakWoln.Mixów!" -#define TR_SOURCE INDENT "Źródło" +#define TR_SOURCE "Źródło" #define TR_WEIGHT "Waga " #define TR_EXPO TR("Expo", "Exponential") #define TR_SIDE "Strona" #define TR_DIFFERENTIAL "Różnic" -#define TR_OFFSET INDENT"Ofset " +#define TR_OFFSET "Ofset " #define TR_TRIM "Trym" #define TR_DREX "DRex" #define DREX_CHBOX_OFFSET 30 @@ -566,6 +563,7 @@ #define TR_FLMODE "Tryb" #define TR_MIXWARNING "UWAGA" #define TR_OFF "Wył." +#define TR_NO_INFORMATION TR("No info", "No information") #define TR_MULTPX "Złącz." #define TR_DELAYDOWN "Opózn.(-)" #define TR_DELAYUP "Opózn.(+)" @@ -605,8 +603,7 @@ #define TR_RENAVIG "Nawigacja potencjometrem" #define TR_THROTTLE_LABEL "Gaz " #define TR_THROTTLEREVERSE TR("OdwrGaz", INDENT "OdwrGaz") -#define TR_TIMER_NAME INDENT "Nazwa" -#define TR_MINUTEBEEP TR(INDENT "Minuta", INDENT "PikCoMinutę") +#define TR_MINUTEBEEP TR("Minuta", "PikCoMinutę") #define TR_BEEPCOUNTDOWN INDENT "Odliczanie" #define TR_PERSISTENT TR(INDENT "Dokł.", INDENT "Dokładny") #define TR_BACKLIGHT_LABEL "Podświetl" @@ -615,6 +612,8 @@ #define TR_BLOFFBRIGHTNESS INDENT"Jasność wył." #define TR_BLCOLOR INDENT "Color" #define TR_SPLASHSCREEN "Logo ekranu" +#define TR_PWR_ON_SPEED "Pwr On speed" +#define TR_PWR_OFF_SPEED "Pwr Off speed" #define TR_THROTTLEWARNING TR(INDENT"OstrzGaz", INDENT "OstrzeżenieGaz") #define TR_SWITCHWARNING TR(INDENT "OstrzPrzeł", INDENT "PozycjaPrzeł") #define TR_POTWARNINGSTATE TR(INDENT "Pot&Slid.", INDENT "Pots & sliders") @@ -657,7 +656,7 @@ #define TR_TMR1JITTERUS "Tmr1 Jitter\037\124us" #define TR_TMIXMAXMS "TmixMaks" #define TR_FREE_STACK "Wolny stos" -#define TR_MENUTORESET CENTER TR_ENTER " >> Reset" +#define TR_MENUTORESET TR_ENTER " >> Reset" #define TR_PPM_TRAINER "TR" #define TR_CH "KN" #define TR_MODEL "MODEL" @@ -715,13 +714,13 @@ #define TR_MONITOR_CHANNELS4 "CHANNELS MONITOR 25/32" #define TR_MONITOR_OUTPUT_DESC "Outputs" #define TR_MONITOR_MIXER_DESC "Mixers" - #define TR_RECEIVER_NUM TR( INDENT "Nr RX",INDENT "Nr odbiornika") + #define TR_RECEIVER_NUM TR("Nr RX", "Nr odbiornika") #define TR_RECEIVER INDENT "Receiver" -#define TR_MULTI_RFTUNE TR(INDENT "Freq tune",INDENT "RF Freq. fine tune") +#define TR_MULTI_RFTUNE TR("Freq tune", "RF Freq. fine tune") #define TR_MULTI_TELEMETRY "Telemetry" -#define TR_MULTI_VIDFREQ TR(INDENT "Vid. freq.", INDENT "Video frequency") -#define TR_MULTI_RFPOWER INDENT "RF Power" -#define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Option value") +#define TR_MULTI_VIDFREQ TR("Vid. freq.", "Video frequency") +#define TR_RFPOWER "RF Power" +#define TR_MULTI_OPTION TR("Option", "Option value") #define TR_MULTI_AUTOBIND TR(INDENT "Autobind",INDENT "Bind on powerup") #define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format") #define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode") @@ -743,7 +742,7 @@ #define TR_PROTOCOL_INVALID TR("Prot. invalid", "Protocol invalid") #define TR_MODULE_STATUS TR(INDENT "Status", INDENT "Module Status") #define TR_MODULE_SYNC TR(INDENT "Sync", INDENT "Module Sync") -#define TR_MULTI_SERVOFREQ TR(INDENT "Servo rate", INDENT "Servo update rate") +#define TR_MULTI_SERVOFREQ TR("Servo rate", "Servo update rate") #define TR_SYNCMENU "[Synch]" #define TR_LIMIT INDENT "Limit" #define TR_MINRSSI "Min Rssi" @@ -794,6 +793,7 @@ #define TR_UPDATE_TX_OPTIONS "Update TX options?" #define TR_MODULES_RX_VERSION "Modules / RX version" #define TR_MENU_MODULES_RX_VERSION "MODULES / RX VERSION" +#define TR_MENU_FIRM_OPTIONS "FIRMWARE OPTIONS" #define TR_GYRO "Gyro" #define TR_STICKS_POTS_SLIDERS "Sticks/Pots/Sliders" #define TR_PWM_STICKS_POTS_SLIDERS "PWM Sticks/Pots/Sliders" @@ -819,6 +819,8 @@ #define TR_NIGHTLY_WARNING TR("NIGHTLY", "NIGHTLY BUILD") #define TR_NIGHTLY_NOTSAFE "Version not safe to fly" #define TR_WRONG_SDCARDVERSION TR("Expected ver: ","Expected version: ") +#define TR_WARN_RTC_BATTERY_LOW "RTC Battery low" +#define TR_BATTERY "BATTERY" #define TR_WRONG_PCBREV "Wrong PCB detected" #define TR_EMERGENCY_MODE "EMERGENCY MODE" #define TR_PCBREV_ERROR "PCB error" @@ -872,10 +874,10 @@ #define TR_BLUETOOTH_INIT "Init" #define TR_BLUETOOTH_DIST_ADDR INDENT "Dist addr" #define TR_BLUETOOTH_LOCAL_ADDR INDENT "Local addr" -#define TR_BLUETOOTH_PIN_CODE TR(INDENT "PIN code", "PIN code") +#define TR_BLUETOOTH_PIN_CODE "PIN code" #define TR_BAUDRATE "Prędkość BT" #define LEN_BLUETOOTH_MODES "\011" -#if defined(PCBX9E) && !defined(USEHORUSBT) +#if defined(PCBX9E) #define TR_BLUETOOTH_MODES "---\0 ""Enabled\0 " #else #define TR_BLUETOOTH_MODES "---\0 ""Telemetry""Trainer\0" @@ -902,7 +904,7 @@ #define TR_FLASH_EXTERNAL_DEVICE "Sflashuj Moduł Zewnętrzny" #define TR_FLASH_RECEIVER_OTA "Flash receiver OTA" #define TR_FLASH_BLUETOOTH_MODULE TR("Flash BT module", "Flash Bluetooth module") -#define TR_FLASH_POWER_MANAGEMENT_UNIT TR("Flash pwr mngt unit", "Flash power management unit") +#define TR_FLASH_POWER_MANAGEMENT_UNIT "Flash pwr mngt unit" #define TR_CURRENT_VERSION TR("Current vers. ", "Current version: ") #define TR_FLASH_INTERNAL_MODULE "Sflashuj Moduł Wewnętrzny" #define TR_FLASH_EXTERNAL_MODULE "Flash external module" @@ -911,10 +913,16 @@ #define TR_WRITING "\032Zapis... " #define TR_CONFIRM_FORMAT "Zatwierdź Format?" #define TR_INTERNALRF "Wewn.Moduł RF" +#define TR_INTERNAL_MODULE "Internal module" +#define TR_EXTERNAL_MODULE "External module" +#define TR_OPENTX_UPGRADE_REQUIRED "OpenTX upgrade required" +#define TR_TELEMETRY_DISABLED "Telem. disabled" +#define TR_MORE_OPTIONS_AVAILABLE "More options available" +#define TR_NO_MODULE_INFORMATION "No module information" #define TR_EXTERNALRF "Zewn.Moduł RF" #define TR_FAILSAFE TR(INDENT"Failsafe",INDENT"Tryb Failsafe") #define TR_FAILSAFESET "USTAWIENIE FAILSAFE" -#define TR_REG_ID TR("Reg. ID", "Registration ID") +#define TR_REG_ID "Reg. ID" #define TR_OWNER_ID "Owner ID" #define TR_PINMAPSET "PINMAP" #define TR_HOLD "Hold" @@ -988,7 +996,7 @@ #define TR_TRAINER "Port Trenera" #define TR_ANTENNAPROBLEM CENTER "Problem z anteną TX" #define TR_MODELIDUSED TR("ID zajęte","ID modelu zajęte") -#define TR_MODULE INDENT "Moduł " +#define TR_MODULE "Moduł " #define TR_RX_NAME "Rx Name" #define TR_TELEMETRY_TYPE TR("Typ ", "Typ Telemetrii") #define TR_TELEMETRY_SENSORS "Czujniki" @@ -1000,10 +1008,10 @@ #define TR_ANTENNASELECTION TR(INDENT "Antenna", INDENT "Antenna selection") #define TR_ANTENNACONFIRM1 "Really switch?" #define TR_ANTENNACONFIRM2 TR("Check antenna", "Make sure antenna is installed!") -#define TR_R9M_PROTO_FLEX_WARN1 "Requires non" -#define TR_R9M_PROTO_FCC_WARN1 "Requires FCC" -#define TR_R9M_PROTO_EU_WARN1 "Requires EU" -#define TR_R9M_PROTO_WARN2 "certified firmware" +#define TR_R9M_PROTO_FLEX_WARN_LINE1 "Requires non" +#define TR_R9M_PROTO_FCC_WARN_LINE1 "Requires FCC" +#define TR_R9M_PROTO_EU_WARN_LINE1 "Requires EU" +#define TR_R9M_PROTO_WARN_LINE2 "certified firmware" #define TR_LOWALARM INDENT "Alarm niski" #define TR_CRITICALALARM INDENT "Alarm krytyczny" #define TR_RSSIALARM_WARN TR("RSSI","TELEMETRY RSSI") @@ -1034,7 +1042,7 @@ #define TR_PREFLIGHT "Lista Ostrzeżeń" #define TR_CHECKLIST TR(INDENT "Czeklista",INDENT "Pokaż Listę Ostrzeżeń") #define TR_FAS_OFFSET TR(INDENT "FAS Ofs", INDENT "FAS Offset") -#define TR_UART3MODE "Port szreg." +#define TR_AUX_SERIAL_MODE "Port szreg." #define TR_SCRIPT "Skrypt" #define TR_INPUTS "Wejścia" #define TR_OUTPUTS "Wyjścia" @@ -1153,6 +1161,9 @@ #define TR_FLASH_WRITE "Flash write..." #define TR_OTA_UPDATE "OTA update..." #define TR_MODULE_RESET "Module reset..." +#define TR_UNKNOWN_RX "Unknown RX" +#define TR_UNSUPPORTED_RX "Unsupported RX" +#define TR_OTA_UPDATE_ERROR "OTA update error" #define TR_DEVICE_RESET "Device reset..." #define TR_ALTITUDE INDENT "Wysokość" #define TR_SCALE "Skala" @@ -1168,6 +1179,7 @@ #define TR_CELLINDEX "Cell index" #define TR_LOGS "Logi" #define TR_OPTIONS "Opcje " +#define TR_FIRMWARE_OPTIONS "Firmware options" #define TR_ALTSENSOR "Alt sensor" #define TR_CELLSENSOR "Cell sensor" diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index 334105849..92d1163d6 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -65,16 +65,16 @@ #define TR_VBLMODE "OFF ""Chav""Stks""Tudo""ON\0" #define LEN_TRNMODE "\003" -#define TR_TRNMODE "OFF"" +="" :=" +#define TR_TRNMODE "OFF""+=\0"":=" #define LEN_TRNCHN "\003" #define TR_TRNCHN "CH1CH2CH3CH4" -#define LEN_UART3MODES "\017" +#define LEN_AUX_SERIAL_MODES "\017" #if defined(CLI) || defined(DEBUG) -#define TR_UART3MODES "Debug\0 ""S-Port Mirror\0 ""Telemetry\0 ""SBUS Trainer\0 ""LUA\0 " +#define TR_AUX_SERIAL_MODES "Debug\0 ""S-Port Mirror\0 ""Telemetry\0 ""SBUS Trainer\0 ""LUA\0 " #else -#define TR_UART3MODES "OFF\0 ""S-Port Mirror\0 ""Telemetry\0 ""SBUS Trainer\0 ""LUA\0 " +#define TR_AUX_SERIAL_MODES "OFF\0 ""S-Port Mirror\0 ""Telemetry\0 ""SBUS Trainer\0 ""LUA\0 " #endif #define LEN_SWTYPES "\006" @@ -368,13 +368,10 @@ #define LEN_VKEYS "\005" #define TR_VKEYS TR("Menu\0""Sair\0""Desce""Sobe\0""Direi""Esqda", "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus") -#define LEN_VRENCODERS "\003" -#define TR_VRENCODERS "REa""REb" - #define LEN_VSWITCHES "\003" #define LEN_VSRCRAW "\004" -#define TR_STICKS_VSRCRAW TR("Lem\0""Pfd\0""Mot\0""Ail\0", "\307Lem""\307Pfd""\307Mot""\307Ail") +#define TR_STICKS_VSRCRAW "\307Lem""\307Pfd""\307Mot""\307Ail" #if defined(PCBHORUS) #define TR_TRIMS_VSRCRAW "\313Lem""\313Pfd""\313Mot""\313Ail""\313T5\0""\313T6\0" @@ -535,16 +532,16 @@ #define TR_ELEDIRECTION "PFD Sentido" #define TR_AILDIRECTION "AIL Sentido" #define TR_COLDIRECTION "COL Sentido" -#define TR_MODE INDENT"Modo" +#define TR_MODE "Modo" #define TR_SUBTYPE INDENT "Subtype" #define TR_NOFREEEXPO "No free expo!" #define TR_NOFREEMIXER "No free mixer!" -#define TR_SOURCE INDENT"Fonte" +#define TR_SOURCE "Fonte" #define TR_WEIGHT "Quantia" #define TR_EXPO "Exponen" #define TR_SIDE "Lado" #define TR_DIFFERENTIAL "Diferencial" -#define TR_OFFSET INDENT"Desvio" +#define TR_OFFSET "Desvio" #define TR_TRIM "Trim" #define TR_DREX "DRex" #define DREX_CHBOX_OFFSET 30 @@ -552,6 +549,7 @@ #define TR_FLMODE "Fase" #define TR_MIXWARNING "Aviso" #define TR_OFF "OFF" +#define TR_NO_INFORMATION TR("No info", "No information") #define TR_MULTPX "Aplicar" #define TR_DELAYDOWN "Atraso Dn" #define TR_DELAYUP "Atraso Up" @@ -591,8 +589,7 @@ #define TR_RENAVIG "RotEnc Navig" #define TR_THROTTLE_LABEL "Throttle" #define TR_THROTTLEREVERSE TR("Inverte Acel.", INDENT "Inverte Acel.") -#define TR_TIMER_NAME INDENT "Name" -#define TR_MINUTEBEEP INDENT "Beep Minuto" +#define TR_MINUTEBEEP "Beep Minuto" #define TR_BEEPCOUNTDOWN INDENT "Beep Regressivo" #define TR_PERSISTENT INDENT "Persist." #define TR_BACKLIGHT_LABEL "Backlight" @@ -601,6 +598,8 @@ #define TR_BLOFFBRIGHTNESS INDENT "OFF Brightness" #define TR_BLCOLOR INDENT "Color" #define TR_SPLASHSCREEN "Splash screen" +#define TR_PWR_ON_SPEED "Pwr On speed" +#define TR_PWR_OFF_SPEED "Pwr Off speed" #define TR_THROTTLEWARNING TR("Avisa Acel", INDENT "Avisa Acel") #define TR_SWITCHWARNING TR("Avisa Chav", INDENT "Avisa Chav") #define TR_POTWARNINGSTATE TR(INDENT "Pot&Slid.", INDENT "Pots & sliders") @@ -639,7 +638,7 @@ #define TR_TMR1JITTERUS "Tmr1 Jitter\037\124us" #define TR_TMIXMAXMS "Tmix max" #define TR_FREE_STACK "Free stack" -#define TR_MENUTORESET CENTER TR_ENTER" Reinicia" +#define TR_MENUTORESET TR_ENTER" Reinicia" #define TR_PPM_TRAINER "TR" #define TR_CH "CH" #define TR_MODEL "MODEL" @@ -705,14 +704,14 @@ #define TR_MONITOR_CHANNELS4 "CHANNELS MONITOR 25/32" #define TR_MONITOR_OUTPUT_DESC "Outputs" #define TR_MONITOR_MIXER_DESC "Mixers" -#define TR_RECEIVER_NUM "RxNum" -#define TR_RECEIVER INDENT "Receiver" +#define TR_RECEIVER_NUM "RxNum" +#define TR_RECEIVER "Receiver" #define TR_SYNCMENU "Sync [MENU]" -#define TR_MULTI_RFTUNE TR(INDENT "Freq tune",INDENT "RF Freq. fine tune") -#define TR_MULTI_TELEMETRY "Telemetry" -#define TR_MULTI_VIDFREQ TR(INDENT "Vid. freq.", INDENT "Video frequency") -#define TR_MULTI_RFPOWER INDENT "RF Power" -#define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Option value") +#define TR_MULTI_RFTUNE TR("Freq tune", "RF Freq. fine tune") +#define TR_MULTI_TELEMETRY "Telemetry" +#define TR_MULTI_VIDFREQ TR("Vid. freq.", "Video frequency") +#define TR_RFPOWER "RF Power" +#define TR_MULTI_OPTION TR("Option", "Option value") #define TR_MULTI_AUTOBIND TR(INDENT "Autobind",INDENT "Bind on powerup") #define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format") #define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode") @@ -734,7 +733,7 @@ #define TR_PROTOCOL_INVALID TR("Prot. invalid", "Protocol invalid") #define TR_MODULE_STATUS TR(INDENT "Status", INDENT "Module Status") #define TR_MODULE_SYNC TR(INDENT "Sync", INDENT "Module Sync") -#define TR_MULTI_SERVOFREQ TR(INDENT "Servo rate", INDENT "Servo update rate") +#define TR_MULTI_SERVOFREQ TR("Servo rate", "Servo update rate") #define TR_LIMIT INDENT"Limite" #define TR_MINRSSI "Min Rssi" #define TR_LATITUDE "Latitude" @@ -784,6 +783,7 @@ #define TR_UPDATE_TX_OPTIONS "Update TX options?" #define TR_MODULES_RX_VERSION "Modules / RX version" #define TR_MENU_MODULES_RX_VERSION "MODULES / RX VERSION" +#define TR_MENU_FIRM_OPTIONS "FIRMWARE OPTIONS" #define TR_GYRO "Gyro" #define TR_STICKS_POTS_SLIDERS "Sticks/Pots/Sliders" #define TR_PWM_STICKS_POTS_SLIDERS "PWM Sticks/Pots/Sliders" @@ -809,6 +809,8 @@ #define TR_NIGHTLY_WARNING TR("NIGHTLY", "NIGHTLY BUILD") #define TR_NIGHTLY_NOTSAFE "Version not safe to fly" #define TR_WRONG_SDCARDVERSION TR("Expected ver: ","Expected version: ") +#define TR_WARN_RTC_BATTERY_LOW "RTC Battery low" +#define TR_BATTERY "BATTERY" #define TR_WRONG_PCBREV "Wrong PCB detected" #define TR_EMERGENCY_MODE "EMERGENCY MODE" #define TR_PCBREV_ERROR "PCB error" @@ -862,10 +864,10 @@ #define TR_BLUETOOTH_INIT "Init" #define TR_BLUETOOTH_DIST_ADDR INDENT "Dist addr" #define TR_BLUETOOTH_LOCAL_ADDR INDENT "Local addr" -#define TR_BLUETOOTH_PIN_CODE TR(INDENT "PIN code", "PIN code") +#define TR_BLUETOOTH_PIN_CODE "PIN code" #define TR_BAUDRATE "BT Baudrate" #define LEN_BLUETOOTH_MODES "\011" -#if defined(PCBX9E) && !defined(USEHORUSBT) +#if defined(PCBX9E) #define TR_BLUETOOTH_MODES "---\0 ""Enabled\0 " #else #define TR_BLUETOOTH_MODES "---\0 ""Telemetry""Trainer\0" @@ -892,7 +894,7 @@ #define TR_FLASH_EXTERNAL_DEVICE "Flash External Device" #define TR_FLASH_RECEIVER_OTA "Flash receiver OTA" #define TR_FLASH_BLUETOOTH_MODULE TR("Flash BT module", "Flash Bluetooth module") -#define TR_FLASH_POWER_MANAGEMENT_UNIT TR("Flash pwr mngt unit", "Flash power management unit") +#define TR_FLASH_POWER_MANAGEMENT_UNIT "Flash pwr mngt unit" #define TR_CURRENT_VERSION TR("Current vers. ", "Current version: ") #define TR_FLASH_INTERNAL_MODULE "Flash Internal Module" #define TR_FLASH_EXTERNAL_MODULE "Flash external module" @@ -901,10 +903,16 @@ #define TR_WRITING "Writing..." #define TR_CONFIRM_FORMAT "Confirm Format?" #define TR_INTERNALRF "Internal RF" +#define TR_INTERNAL_MODULE "Internal module" +#define TR_EXTERNAL_MODULE "External module" +#define TR_OPENTX_UPGRADE_REQUIRED "OpenTX upgrade required" +#define TR_TELEMETRY_DISABLED "Telem. disabled" +#define TR_MORE_OPTIONS_AVAILABLE "More options available" +#define TR_NO_MODULE_INFORMATION "No module information" #define TR_EXTERNALRF "External RF" #define TR_FAILSAFE "Failsafe mode" #define TR_FAILSAFESET "FAILSAFE SETTINGS" -#define TR_REG_ID TR("Reg. ID", "Registration ID") +#define TR_REG_ID "Reg. ID" #define TR_OWNER_ID "Owner ID" #define TR_PINMAPSET "PINMAP" #define TR_HOLD "Hold" @@ -978,7 +986,7 @@ #define TR_TRAINER "Trainer" #define TR_ANTENNAPROBLEM CENTER "TX Antenna problem!" #define TR_MODELIDUSED TR("ID used in:", "Receiver ID used in:") -#define TR_MODULE INDENT "Module" +#define TR_MODULE "Module" #define TR_RX_NAME "Rx Name" #define TR_TELEMETRY_TYPE TR("Type", "Telemetry Type") #define TR_TELEMETRY_SENSORS "Sensors" @@ -990,10 +998,10 @@ #define TR_ANTENNASELECTION TR(INDENT "Antenna", INDENT "Antenna selection") #define TR_ANTENNACONFIRM1 "Really switch?" #define TR_ANTENNACONFIRM2 TR("Check antenna", "Make sure antenna is installed!") -#define TR_R9M_PROTO_FLEX_WARN1 "Requires non" -#define TR_R9M_PROTO_FCC_WARN1 "Requires FCC" -#define TR_R9M_PROTO_EU_WARN1 "Requires EU" -#define TR_R9M_PROTO_WARN2 "certified firmware" +#define TR_R9M_PROTO_FLEX_WARN_LINE1 "Requires non" +#define TR_R9M_PROTO_FCC_WARN_LINE1 "Requires FCC" +#define TR_R9M_PROTO_EU_WARN_LINE1 "Requires EU" +#define TR_R9M_PROTO_WARN_LINE2 "certified firmware" #define TR_LOWALARM INDENT "Low Alarm" #define TR_CRITICALALARM INDENT "Critical Alarm" #define TR_RSSIALARM_WARN TR("RSSI","TELEMETRY RSSI") @@ -1024,7 +1032,7 @@ #define TR_PREFLIGHT "Preflight Checks" #define TR_CHECKLIST INDENT "Display Checklist" #define TR_FAS_OFFSET TR(INDENT "FAS Ofs", INDENT "FAS Offset") -#define TR_UART3MODE "Serial port" +#define TR_AUX_SERIAL_MODE "Serial port" #define TR_SCRIPT "Script" #define TR_INPUTS "Inputs" #define TR_OUTPUTS "Outputs" @@ -1143,6 +1151,9 @@ #define TR_FLASH_WRITE "Flash write..." #define TR_OTA_UPDATE "OTA update..." #define TR_MODULE_RESET "Module reset..." +#define TR_UNKNOWN_RX "Unknown RX" +#define TR_UNSUPPORTED_RX "Unsupported RX" +#define TR_OTA_UPDATE_ERROR "OTA update error" #define TR_DEVICE_RESET "Device reset..." #define TR_ALTITUDE INDENT "Altitude" #define TR_SCALE "Scale" @@ -1158,6 +1169,7 @@ #define TR_CELLINDEX "Cell index" #define TR_LOGS "Logs" #define TR_OPTIONS "Options" +#define TR_FIRMWARE_OPTIONS "Firmware options" #define TR_ALTSENSOR "Alt sensor" #define TR_CELLSENSOR "Cell sensor" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index f049c5326..d2d9cffb4 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -70,11 +70,11 @@ #define LEN_TRNCHN "\003" #define TR_TRNCHN "KN1KN2KN3KN4" -#define LEN_UART3MODES "\022" +#define LEN_AUX_SERIAL_MODES "\022" #if defined(CLI) || defined(DEBUG) -#define TR_UART3MODES "Debug\0 ""Spegling av S-Port""Telemetri\0 ""SBUS Trainer\0 ""LUA\0 " +#define TR_AUX_SERIAL_MODES "Debug\0 ""Spegling av S-Port""Telemetri\0 ""SBUS Trainer\0 ""LUA\0 " #else -#define TR_UART3MODES "Av\0 ""Spegling av S-Port""Telemetri\0 ""SBUS Trainer\0 ""LUA\0 " +#define TR_AUX_SERIAL_MODES "Av\0 ""Spegling av S-Port""Telemetri\0 ""SBUS Trainer\0 ""LUA\0 " #endif #define LEN_SWTYPES "\006" @@ -380,14 +380,11 @@ #define TR_VKEYS "Menu\0""Exit\0""Ned\0 ""Upp\0 ""Höger""Vänst" #endif -#define LEN_VRENCODERS "\003" -#define TR_VRENCODERS "REa""REb" - #define LEN_VSWITCHES "\003" #define LEN_VSRCRAW "\004" -#define TR_STICKS_VSRCRAW TR("Rod\0""Hjd\0""Gas\0""Ske\0", "\307Rod""\307Hjd""\307Gas""\307Ske") +#define TR_STICKS_VSRCRAW "\307Rod""\307Hjd""\307Gas""\307Ske" #if defined(PCBHORUS) #define TR_TRIMS_VSRCRAW "\313Rod""\313Hjd""\313Gas""\313Ske""\313T5\0""\313T6\0" @@ -548,16 +545,16 @@ #define TR_ELEDIRECTION "HöJD Riktning" #define TR_AILDIRECTION "SKEV Riktning" #define TR_COLDIRECTION "PITCH Riktn. " -#define TR_MODE INDENT"Läge" +#define TR_MODE "Läge" #define TR_SUBTYPE INDENT "Subtype" #define TR_NOFREEEXPO "Expo saknas!" #define TR_NOFREEMIXER "Mixer saknas!" -#define TR_SOURCE INDENT"Källa" +#define TR_SOURCE "Källa" #define TR_WEIGHT "Vikt" #define TR_EXPO TR("Expo","Exponentiell") #define TR_SIDE "Sida" #define TR_DIFFERENTIAL "Diff." -#define TR_OFFSET INDENT"Offset" +#define TR_OFFSET "Offset" #define TR_TRIM "Trim" #define TR_DREX "DRex" #define DREX_CHBOX_OFFSET 30 @@ -565,6 +562,7 @@ #define TR_FLMODE TR("Läge","Flyglägen") #define TR_MIXWARNING "Varning" #define TR_OFF "Av " +#define TR_NO_INFORMATION TR("No info", "No information") #define TR_MULTPX "Multpx" #define TR_DELAYDOWN "Dröj Ned" #define TR_DELAYUP "Dröj Upp" @@ -604,8 +602,7 @@ #define TR_RENAVIG "RotEnk Navig" #define TR_THROTTLE_LABEL "Gas" #define TR_THROTTLEREVERSE TR("Inv.Gas", INDENT "Inverterad Gas") -#define TR_TIMER_NAME INDENT "Namn" -#define TR_MINUTEBEEP INDENT "Minutpip" +#define TR_MINUTEBEEP "Minutpip" #define TR_BEEPCOUNTDOWN INDENT "Nedräkning" #define TR_PERSISTENT TR("Jämt på ", INDENT"Alltid På") #define TR_BACKLIGHT_LABEL "Belysning" @@ -613,6 +610,8 @@ #define TR_BLONBRIGHTNESS INDENT "På Ljusstyrka" #define TR_BLOFFBRIGHTNESS INDENT "Av Ljusstyrka" #define TR_SPLASHSCREEN "Startbild" +#define TR_PWR_ON_SPEED "Pwr On speed" +#define TR_PWR_OFF_SPEED "Pwr Off speed" #define TR_BLCOLOR INDENT "Color" #define TR_THROTTLEWARNING TR("Gasvarning", INDENT "Gasvarning") #define TR_SWITCHWARNING TR("Bryt.varn.", INDENT "Brytarvarning") @@ -656,7 +655,7 @@ #define TR_TMR1JITTERUS "Tmr1 Jitter\037\124us" #define TR_TMIXMAXMS "Tmix max" #define TR_FREE_STACK "Free stack" -#define TR_MENUTORESET CENTER TR_ENTER " Nollar" +#define TR_MENUTORESET TR_ENTER " Nollar" #define TR_PPM_TRAINER "TR" #define TR_CH "KN" #define TR_MODEL "Modell" @@ -714,14 +713,14 @@ #define TR_MONITOR_CHANNELS4 "CHANNELS MONITOR 25/32" #define TR_MONITOR_OUTPUT_DESC "Outputs" #define TR_MONITOR_MIXER_DESC "Mixers" - #define TR_RECEIVER_NUM TR(INDENT "RxNum", INDENT "Mottagare Nr.") -#define TR_RECEIVER INDENT "Receiver" +#define TR_RECEIVER_NUM TR("RxNum", "Mottagare Nr.") +#define TR_RECEIVER "Receiver" #define TR_SYNCMENU "Synk [MENU]" -#define TR_MULTI_RFTUNE TR(INDENT "Freq tune",INDENT "RF Freq. fine tune") -#define TR_MULTI_TELEMETRY "Telemetry" -#define TR_MULTI_VIDFREQ TR(INDENT "Vid. freq.", INDENT "Video frequency") -#define TR_MULTI_RFPOWER INDENT "RF Power" -#define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Option value") +#define TR_MULTI_RFTUNE TR("Freq tune", "RF Freq. fine tune") +#define TR_MULTI_TELEMETRY "Telemetry" +#define TR_MULTI_VIDFREQ TR("Vid. freq.", "Video frequency") +#define TR_RFPOWER "RF Power" +#define TR_MULTI_OPTION TR("Option", "Option value") #define TR_MULTI_AUTOBIND TR(INDENT "Autobind",INDENT "Bind on powerup") #define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format") #define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode") @@ -743,7 +742,7 @@ #define TR_PROTOCOL_INVALID TR("Prot. invalid", "Protocol invalid") #define TR_MODULE_STATUS TR(INDENT "Status", INDENT "Module Status") #define TR_MODULE_SYNC TR(INDENT "Sync", INDENT "Module Sync") -#define TR_MULTI_SERVOFREQ TR(INDENT "Servo rate", INDENT "Servo update rate") +#define TR_MULTI_SERVOFREQ TR("Servo rate", "Servo update rate") #define TR_LIMIT INDENT "Nivå" #define TR_MINRSSI "Min Rssi" #define TR_LATITUDE "Breddgrad" @@ -793,6 +792,7 @@ #define TR_UPDATE_TX_OPTIONS "Update TX options?" #define TR_MODULES_RX_VERSION "Modules / RX version" #define TR_MENU_MODULES_RX_VERSION "MODULES / RX VERSION" +#define TR_MENU_FIRM_OPTIONS "FIRMWARE OPTIONS" #define TR_GYRO "Gyro" #define TR_STICKS_POTS_SLIDERS "Sticks/Pots/Sliders" #define TR_PWM_STICKS_POTS_SLIDERS "PWM Sticks/Pots/Sliders" @@ -819,6 +819,8 @@ #define TR_NIGHTLY_NOTSAFE "Version not safe to fly" #define TR_SDCARDVERSIONWARN "SD Card Check" #define TR_WRONG_SDCARDVERSION TR("Expected ver: ","Expected version: ") +#define TR_WARN_RTC_BATTERY_LOW "RTC Battery low" +#define TR_BATTERY "BATTERY" #define TR_WRONG_PCBREV "Wrong PCB detected" #define TR_EMERGENCY_MODE "EMERGENCY MODE" #define TR_PCBREV_ERROR "PCB error" @@ -872,10 +874,10 @@ #define TR_BLUETOOTH_INIT "Init" #define TR_BLUETOOTH_DIST_ADDR INDENT "Dist addr" #define TR_BLUETOOTH_LOCAL_ADDR INDENT "Local addr" -#define TR_BLUETOOTH_PIN_CODE TR(INDENT "PIN code", "PIN code") +#define TR_BLUETOOTH_PIN_CODE "PIN code" #define TR_BAUDRATE "BT Baudrate" #define LEN_BLUETOOTH_MODES "\011" -#if defined(PCBX9E) && !defined(USEHORUSBT) +#if defined(PCBX9E) #define TR_BLUETOOTH_MODES "---\0 ""Enabled\0 " #else #define TR_BLUETOOTH_MODES "---\0 ""Telemetry""Trainer\0" @@ -902,7 +904,7 @@ #define TR_FLASH_EXTERNAL_DEVICE "Flash External Device" #define TR_FLASH_RECEIVER_OTA "Flash receiver OTA" #define TR_FLASH_BLUETOOTH_MODULE TR("Flash BT module", "Flash Bluetooth module") -#define TR_FLASH_POWER_MANAGEMENT_UNIT TR("Flash pwr mngt unit", "Flash power management unit") +#define TR_FLASH_POWER_MANAGEMENT_UNIT "Flash pwr mngt unit" #define TR_CURRENT_VERSION TR("Current vers. ", "Current version: ") #define TR_FLASH_INTERNAL_MODULE "Flash Internal Module" #define TR_FLASH_EXTERNAL_MODULE "Flash external module" @@ -911,10 +913,16 @@ #define TR_WRITING "\032Skriver..." #define TR_CONFIRM_FORMAT "Formatera Minnet?" #define TR_INTERNALRF "Intern Radio" +#define TR_INTERNAL_MODULE "Internal module" +#define TR_EXTERNAL_MODULE "External module" +#define TR_OPENTX_UPGRADE_REQUIRED "OpenTX upgrade required" +#define TR_TELEMETRY_DISABLED "Telem. disabled" +#define TR_MORE_OPTIONS_AVAILABLE "More options available" +#define TR_NO_MODULE_INFORMATION "No module information" #define TR_EXTERNALRF "Extern Radiomodul" #define TR_FAILSAFE TR(INDENT "Failsafe", INDENT "Failsafeläge") #define TR_FAILSAFESET "FailsafeInställning" -#define TR_REG_ID TR("Reg. ID", "Registration ID") +#define TR_REG_ID "Reg. ID" #define TR_OWNER_ID "Owner ID" #define TR_PINMAPSET "PINMAP" #define TR_HOLD "Hold" @@ -988,7 +996,7 @@ #define TR_TRAINER "Trainer" #define TR_ANTENNAPROBLEM CENTER "Fel på TX-antennen" #define TR_MODELIDUSED TR("ID finns redan","ModellID används redan") -#define TR_MODULE INDENT "Modul" +#define TR_MODULE "Modul" #define TR_RX_NAME "Rx Name" #define TR_TELEMETRY_TYPE "Telemetrityp" #define TR_TELEMETRY_SENSORS "Sensorer" @@ -1000,10 +1008,10 @@ #define TR_ANTENNASELECTION TR(INDENT "Antenna", INDENT "Antenna selection") #define TR_ANTENNACONFIRM1 "Really switch?" #define TR_ANTENNACONFIRM2 TR("Check antenna", "Make sure antenna is installed!") -#define TR_R9M_PROTO_FLEX_WARN1 "Requires non" -#define TR_R9M_PROTO_FCC_WARN1 "Requires FCC" -#define TR_R9M_PROTO_EU_WARN1 "Requires EU" -#define TR_R9M_PROTO_WARN2 "certified firmware" +#define TR_R9M_PROTO_FLEX_WARN_LINE1 "Requires non" +#define TR_R9M_PROTO_FCC_WARN_LINE1 "Requires FCC" +#define TR_R9M_PROTO_EU_WARN_LINE1 "Requires EU" +#define TR_R9M_PROTO_WARN_LINE2 "certified firmware" #define TR_LOWALARM INDENT "Låg-alarm" #define TR_CRITICALALARM INDENT "Kritiskt alarm" #define TR_RSSIALARM_WARN TR("RSSI","TELEMETRY RSSI") @@ -1034,7 +1042,7 @@ #define TR_PREFLIGHT "Startkontroller" #define TR_CHECKLIST TR(INDENT "Checklista", INDENT "Visa Checklista") #define TR_FAS_OFFSET TR(INDENT "FAS Ofs", INDENT "FAS Offset") -#define TR_UART3MODE "Serieporten" +#define TR_AUX_SERIAL_MODE "Serieporten" #define TR_SCRIPT "Programkod" #define TR_INPUTS "Input" #define TR_OUTPUTS "Outputs" @@ -1153,6 +1161,9 @@ #define TR_FLASH_WRITE "Flash write..." #define TR_OTA_UPDATE "OTA update..." #define TR_MODULE_RESET "Module reset..." +#define TR_UNKNOWN_RX "Unknown RX" +#define TR_UNSUPPORTED_RX "Unsupported RX" +#define TR_OTA_UPDATE_ERROR "OTA update error" #define TR_DEVICE_RESET "Device reset..." #define TR_ALTITUDE INDENT "Höjd" #define TR_SCALE "Skala" @@ -1168,6 +1179,7 @@ #define TR_CELLINDEX "Cell index" #define TR_LOGS "Logga" #define TR_OPTIONS "Options" +#define TR_FIRMWARE_OPTIONS "Firmware options" #define TR_ALTSENSOR "Höjdsensor" #define TR_CELLSENSOR "Cell sensor" diff --git a/radio/src/translations/untranslated.h b/radio/src/translations/untranslated.h index 64bb5b3be..54cc555ae 100644 --- a/radio/src/translations/untranslated.h +++ b/radio/src/translations/untranslated.h @@ -31,10 +31,10 @@ #if defined(PCBX12S) #define TR_POTS_VSRCRAW "\310S1\0""\3106P\0""\310S2\0""\313L1\0""\313L2\0""\311LS\0""\311RS\0""\310JSx""\310JSy" - #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0""\312GML""\312GMR" + #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0""\312SI\0""\312SJ\0" #elif defined(PCBX10) - #define TR_POTS_VSRCRAW "\310S1\0""\3106P\0""\310S2\0""\310EX1""\310EX2""\311LS\0""\311RS\0""\313L1\0""\313L2\0" - #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0""\312GML""\312GMR" + #define TR_POTS_VSRCRAW "\310S1\0""\3106P\0""\310S2\0""\310EX1""\310EX2""\311LS\0""\311RS\0""\310JSx""\310JSy" + #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0""\312SI\0""\312SJ\0" #elif defined(PCBX9E) #define TR_POTS_VSRCRAW "\310F1\0""\310F2\0""\310F3\0""\310F4\0""\311S1\0""\311S2\0""\311LS\0""\311RS\0" #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0""\312SI\0""\312SJ\0""\312SK\0""\312SL\0""\312SM\0""\312SN\0""\312SO\0""\312SP\0""\312SQ\0""\312SR\0" @@ -53,6 +53,9 @@ #elif defined(PCBX9LITE) #define TR_POTS_VSRCRAW "\310S1\0" #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0" +#elif defined(PCBX9DP) && PCBREV >= 2019 + #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0""\310S3\0""\311LS\0""\311RS\0" + #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0""\312SI\0" #elif defined(PCBTARANIS) #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0""\310S3\0""\311LS\0""\311RS\0" #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0" @@ -89,20 +92,20 @@ #endif #define LEN_EXTERNAL_MODULE_PROTOCOLS "\014" -#define TR_EXTERNAL_MODULE_PROTOCOLS "OFF\0 ""PPM\0 ""XJT\0 ""ISRM\0 ""DSM2\0 ""CRSF\0 ""MULT\0 ""R9M\0 ""R9M ACCESS\0 " TR_MODULE_R9M_LITE "R9ML ACCESS\0""R9MLP ACCESS""SBUS" +#define TR_EXTERNAL_MODULE_PROTOCOLS "OFF\0 ""PPM\0 ""XJT\0 ""ISRM\0 ""DSM2\0 ""CRSF\0 ""MULT\0 ""R9M\0 ""R9M ACCESS\0 " TR_MODULE_R9M_LITE "R9ML ACCESS\0""R9MLP\0 ""R9MLP ACCESS""SBUS\0 ""XJT Lite" #define LEN_INTERNAL_MODULE_PROTOCOLS LEN_EXTERNAL_MODULE_PROTOCOLS #define TR_INTERNAL_MODULE_PROTOCOLS TR_EXTERNAL_MODULE_PROTOCOLS -#define LEN_ACCST_RF_PROTOCOLS "\004" -#define TR_ACCST_RF_PROTOCOLS "OFF\0""D16\0""D8\0 ""LR12" +#define LEN_XJT_ACCST_RF_PROTOCOLS "\004" +#define TR_XJT_ACCST_RF_PROTOCOLS "OFF\0""D16\0""D8\0 ""LR12" #if defined(INTERNAL_MODULE_PXX1) -#define LEN_ISRM_PXX2_RF_PROTOCOLS "\006" -#define TR_ISRM_PXX2_RF_PROTOCOLS "ACCESS""D16\0 ""LR12" +#define LEN_ISRM_RF_PROTOCOLS "\006" +#define TR_ISRM_RF_PROTOCOLS "ACCESS""D16\0 ""LR12" #else -#define LEN_ISRM_PXX2_RF_PROTOCOLS "\012" -#define TR_ISRM_PXX2_RF_PROTOCOLS "OFF\0 ""ACCESS\0 ""ACCST D16\0""ACCST LR12" +#define LEN_ISRM_RF_PROTOCOLS "\012" +#define TR_ISRM_RF_PROTOCOLS "OFF\0 ""ACCESS\0 ""ACCST D16\0""ACCST LR12""ACCST D8" #endif #define LEN_R9M_PXX2_RF_PROTOCOLS "\006" @@ -112,19 +115,19 @@ #define TR_R9M_REGION "FCC\0 ""EU\0 ""868MHz""915MHz" #define LEN_R9M_LITE_FCC_POWER_VALUES "\010" -#define TR_R9M_LITE_FCC_POWER_VALUES "(100 mW)" +#define TR_R9M_LITE_FCC_POWER_VALUES "(100mW)" -#define LEN_R9M_LITE_LBT_POWER_VALUES "\015" -#define TR_R9M_LITE_LBT_POWER_VALUES "25 mW 8ch\0 ""25 mW 16ch\0 ""100mW no tele" +#define LEN_R9M_LITE_LBT_POWER_VALUES "\014" +#define TR_R9M_LITE_LBT_POWER_VALUES "25mW 8CH\0 ""25mW 16CH\0 ""100mW NoTele" -#define LEN_R9M_FCC_POWER_VALUES "\006" -#define TR_R9M_FCC_POWER_VALUES "10 mW\0" "100 mW" "500 mW" "1 W\0" +#define LEN_R9M_FCC_POWER_VALUES "\011" +#define TR_R9M_FCC_POWER_VALUES "10mW\0 " "100mW\0 " "500mW\0 " "1W (auto)" -#define LEN_R9M_LBT_POWER_VALUES "\013" -#define TR_R9M_LBT_POWER_VALUES "25 mW 8ch\0 ""25 mW 16ch\0" "200 mW 16ch" "500 mW 16ch" +#define LEN_R9M_LBT_POWER_VALUES "\014" +#define TR_R9M_LBT_POWER_VALUES "25mW 8CH\0 ""25mW 16CH\0 ""200mW NoTele""500mW NoTele" #define LEN_DSM_PROTOCOLS "\004" #define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" #define LEN_MULTI_PROTOCOLS "\006" -#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXq\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OpnLrs""FS 2A\0""Q2x2\0 ""Walk.\0""Q303\0 ""GW008\0""DM002\0""Cabell""Esy150""H8 3D\0""Corona""CFlie\0""Hitec\0""WFly\0 ""Bugs\0 ""BugMin""Traxas""NC1701""E01X\0 ""V911S\0""GD00X\0""V761\0 ""KF606\0" +#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXq\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OpnLrs""FS 2A\0""Q2x2\0 ""Walk.\0""Q303\0 ""GW008\0""DM002\0""Cabell""Esy150""H8 3D\0""Corona""CFlie\0""Hitec\0""WFly\0 ""Bugs\0 ""BugMin""Traxas""NC1701""E01X\0 ""V911S\0""GD00X\0""V761\0 ""KF606\0""Redpin""Potens" diff --git a/radio/util/build-firmware.py b/radio/util/build-firmware.py index 6c319b8cb..eaa548055 100755 --- a/radio/util/build-firmware.py +++ b/radio/util/build-firmware.py @@ -6,6 +6,7 @@ import sys import subprocess import shutil import filelock + from fwoptions import * # Error codes @@ -100,6 +101,14 @@ elif options[optcount] == "x9d+": maxsize = 65536 * 8 board = BOARD_TARANIS board_family = BOARD_FAMILY_ARM +elif options[optcount] == "x9d+2019": + command_options["PCB"] = "X9D+" + command_options["PCBREV"] = "2019" + command_options["MULTI_SPORT"] = "ON" + firmware_options = options_taranis_x9dp + maxsize = 65536 * 8 + board = BOARD_TARANIS + board_family = BOARD_FAMILY_ARM elif options[optcount] == "x9e": command_options["PCB"] = "X9E" command_options["MULTI_SPORT"] = "ON" diff --git a/radio/util/font2png.py b/radio/util/font2png.py index 86d0f9c40..caadfac11 100755 --- a/radio/util/font2png.py +++ b/radio/util/font2png.py @@ -29,7 +29,7 @@ def createFontBitmap(filename, fontname, fontsize, fontoffset, foreground, backg coords = [] font_filename = 'fonts/' + fontname + '.ttf' - print 'Font filename: %s' % font_filename + print("Font filename: %s" % font_filename) font = ImageFont.truetype(font_filename, fontsize) extraImage = None @@ -40,7 +40,7 @@ def createFontBitmap(filename, fontname, fontsize, fontoffset, foreground, backg extraImage = extraImage.convert('RGB'); except IOError: - print 'Missing extra symbol filename %s' % extraFilename + print("Missing extra symbol filename %s" % extraFilename) def getCharWidth(c): if c in chars_extra: @@ -67,7 +67,7 @@ def createFontBitmap(filename, fontname, fontsize, fontoffset, foreground, backg width = getFontWidth() image = Image.new('RGB', (width, fontsize + 4), background) - draw = ImageDraw.Draw(image) + draw = ImageDraw.Draw(image) width = 0 for c in chars: @@ -80,7 +80,7 @@ def createFontBitmap(filename, fontname, fontsize, fontoffset, foreground, backg pass else: w, h = font.getsize(c) - draw.text( (width + 1, fontoffset) , c, fill=foreground, font=font) + draw.text((width + 1, fontoffset), c, fill=foreground, font=font) width += getCharWidth(c) diff --git a/radio/util/fwoptions.py b/radio/util/fwoptions.py index 2a2d739d2..75ae7dcf7 100755 --- a/radio/util/fwoptions.py +++ b/radio/util/fwoptions.py @@ -81,7 +81,8 @@ options_taranis_x9d = { "shutdownconfirm": ("SHUTDOWN_CONFIRMATION", "YES", "NO"), "eu": ("SUPPORT_D16_EU_ONLY", "YES", "NO"), "multimodule": ("MULTIMODULE", "YES", "NO"), - "crossfire": ("CROSSFIRE", "YES", "NO") + "crossfire": ("CROSSFIRE", "YES", "NO"), + "flexr9m": ("R9M_PROTO_FLEX", "YES", None) } options_taranis_x9dp = { @@ -99,7 +100,8 @@ options_taranis_x9dp = { "shutdownconfirm": ("SHUTDOWN_CONFIRMATION", "YES", "NO"), "eu": ("SUPPORT_D16_EU_ONLY", "YES", "NO"), "multimodule": ("MULTIMODULE", "YES", "NO"), - "crossfire": ("CROSSFIRE", "YES", "NO") + "crossfire": ("CROSSFIRE", "YES", "NO"), + "flexr9m": ("R9M_PROTO_FLEX", "YES", None) } options_taranis_x9lite = { @@ -108,6 +110,7 @@ options_taranis_x9lite = { "lua": ("LUA", "YES", "NO_MODEL_SCRIPTS"), "luac": ("LUA_COMPILER", "YES", "NO"), "nogvars": ("GVARS", "NO", "YES"), + "autoupdate": ("AUTOUPDATE", "YES", None), "sqt5font": ("FONT", "SQT5", None), "noras": ("RAS", "NO", "YES"), "faimode": ("FAI", "YES", None), @@ -116,8 +119,9 @@ options_taranis_x9lite = { "shutdownconfirm": ("SHUTDOWN_CONFIRMATION", "YES", "NO"), "eu": ("SUPPORT_D16_EU_ONLY", "YES", "NO"), "multimodule": ("MULTIMODULE", "YES", "NO"), - "internalpxx1": ("INTERNAL_MODULE_PXX1", "NO", "YES"), - "crossfire": ("CROSSFIRE", "YES", "NO") + "internalpxx1": ("INTERNAL_MODULE_PXX1", "YES", "NO"), + "crossfire": ("CROSSFIRE", "YES", "NO"), + "flexr9m": ("R9M_PROTO_FLEX", "YES", None) } options_taranis_xlite = { @@ -133,7 +137,8 @@ options_taranis_xlite = { "shutdownconfirm": ("SHUTDOWN_CONFIRMATION", "YES", "NO"), "eu": ("SUPPORT_D16_EU_ONLY", "YES", "NO"), "multimodule": ("MULTIMODULE", "YES", "NO"), - "crossfire": ("CROSSFIRE", "YES", "NO") + "crossfire": ("CROSSFIRE", "YES", "NO"), + "flexr9m": ("R9M_PROTO_FLEX", "YES", None) } options_taranis_xlites = { @@ -142,6 +147,7 @@ options_taranis_xlites = { "lua": ("LUA", "YES", "NO_MODEL_SCRIPTS"), "luac": ("LUA_COMPILER", "YES", "NO"), "nogvars": ("GVARS", "NO", "YES"), + "autoupdate": ("AUTOUPDATE", "YES", None), "sqt5font": ("FONT", "SQT5", None), "faimode": ("FAI", "YES", None), "faichoice": ("FAI", "CHOICE", None), @@ -149,8 +155,9 @@ options_taranis_xlites = { "shutdownconfirm": ("SHUTDOWN_CONFIRMATION", "YES", "NO"), "eu": ("SUPPORT_D16_EU_ONLY", "YES", "NO"), "multimodule": ("MULTIMODULE", "YES", "NO"), - "internalpxx1": ("INTERNAL_MODULE_PXX1", "NO", "YES"), - "crossfire": ("CROSSFIRE", "YES", "NO") + "internalpxx1": ("INTERNAL_MODULE_PXX1", "YES", "NO"), + "crossfire": ("CROSSFIRE", "YES", "NO"), + "flexr9m": ("R9M_PROTO_FLEX", "YES", None) } options_taranis_x9e = { @@ -168,7 +175,8 @@ options_taranis_x9e = { "eu": ("SUPPORT_D16_EU_ONLY", "YES", "NO"), "horussticks": ("STICKS", "HORUS", "STANDARD"), "multimodule": ("MULTIMODULE", "YES", "NO"), - "crossfire": ("CROSSFIRE", "YES", "NO") + "crossfire": ("CROSSFIRE", "YES", "NO"), + "flexr9m": ("R9M_PROTO_FLEX", "YES", None) } options_horus_x12s = { @@ -183,7 +191,8 @@ options_horus_x12s = { "eu": ("SUPPORT_D16_EU_ONLY", "YES", "NO"), "multimodule": ("MULTIMODULE", "YES", "NO"), "pcbdev": ("PCBREV", "10", None), - "crossfire": ("CROSSFIRE", "YES", "NO") + "crossfire": ("CROSSFIRE", "YES", "NO"), + "flexr9m": ("R9M_PROTO_FLEX", "YES", None) } options_horus_x10 = { @@ -197,5 +206,6 @@ options_horus_x10 = { "nooverridech": ("OVERRIDE_CHANNEL_FUNCTION", "NO", "YES"), "eu": ("SUPPORT_D16_EU_ONLY", "YES", "NO"), "multimodule": ("MULTIMODULE", "YES", "NO"), - "crossfire": ("CROSSFIRE", "YES", "NO") + "crossfire": ("CROSSFIRE", "YES", "NO"), + "flexr9m": ("R9M_PROTO_FLEX", "YES", None) } diff --git a/radio/util/translate.py b/radio/util/translate.py index 9eb037423..53e113ca7 100755 --- a/radio/util/translate.py +++ b/radio/util/translate.py @@ -18,7 +18,9 @@ translations = {'cz_reduced': [('\\200', u'á'), ('\\207', u'š'), ('\\207', u'Š'), ('\\210', u'ú'), + ('\\210', u'Ú'), ('\\211', u'ů'), + ('\\211', u'Ů'), ('\\212', u'ý'), ('\\213', u'Á'), ('\\214', u'Í'), diff --git a/radio/util/tts_cz.py b/radio/util/tts_cz.py index ade653a7a..1370e8d53 100755 --- a/radio/util/tts_cz.py +++ b/radio/util/tts_cz.py @@ -57,7 +57,7 @@ for s, f, a in [("střed trimu", "midtrim", 495), ("plyn není na nule", "thralert", 481), ("přepínače nejsou ve výchozí poloze", "swalert", 482), ("neplatná eeprom", "eebad", 483), - ("Oupn najn iks", "hello", 480), + ("Žádám o povolení ke startu.", "hello", 480), ("Tak zase příště!", "bye", 480), ("dvacet sekund", "timer20", 500), ("třicet sekund", "timer30", 501), diff --git a/tools/build-frsky.py b/tools/build-frsky.py index 8a6078adf..f30d68cf5 100755 --- a/tools/build-frsky.py +++ b/tools/build-frsky.py @@ -12,9 +12,10 @@ options = { "XLITES": { "LUA": "NO_MODEL_SCRIPTS", "GVARS": "YES", + "AUTOUPDATE": "YES", "PXX1": "YES", "XJT": "NO", - "R9M_SIZE_STD": "NO", + "MODULE_SIZE_STD": "NO", "PPM": "NO", "DSM2": "NO", "CROSSFIRE": "NO", @@ -23,14 +24,24 @@ options = { "X9LITE": { "LUA": "NO_MODEL_SCRIPTS", "GVARS": "YES", + "AUTOUPDATE": "YES", "PXX1": "YES", "XJT": "NO", - "R9M_SIZE_STD": "NO", + "MODULE_SIZE_STD": "NO", "PPM": "NO", "DSM2": "NO", "CROSSFIRE": "NO", "SBUS": "NO", "DEFAULT_MODE": "2", + }, + "X9D+": { + "PCBREV": "2019", + "LUA": "NO_MODEL_SCRIPTS", + "GVARS": "YES", + "AUTOUPDATE": "YES", + "PXX1": "YES", + "CROSSFIRE": "NO", + "DEFAULT_MODE": "2", } } diff --git a/tools/commit-tests.sh b/tools/commit-tests.sh index ffe3d1b5c..b4bd0f589 100755 --- a/tools/commit-tests.sh +++ b/tools/commit-tests.sh @@ -141,6 +141,15 @@ if [[ " X9D+ X9 ALL " =~ " ${FLAVOR} " ]] ; then make -j${CORES} gtests ; ./gtests ${TEST_OPTIONS} fi +if [[ " X9D+2019 X9 ALL " =~ " ${FLAVOR} " ]] ; then + # OpenTX on X9D+ 2019 + rm -rf * + cmake ${COMMON_OPTIONS} -DPCB=X9D+ -DPCBREV=2019 -DHELI=YES -DLUA=YES -DGVARS=YES ${SRCDIR} + make -j${CORES} ${FIRMARE_TARGET} + make -j${CORES} libsimulator + make -j${CORES} gtests ; ./gtests ${TEST_OPTIONS} +fi + if [[ " X9E X9 ALL " =~ " ${FLAVOR} " ]] ; then # OpenTX on Taranis X9E rm -rf * diff --git a/tools/latency.py b/tools/latency.py new file mode 100755 index 000000000..d08c251d0 --- /dev/null +++ b/tools/latency.py @@ -0,0 +1,230 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# +# Copyright (C) OpenTX +# +# Based on code named +# th9x - http://code.google.com/p/th9x +# er9x - http://code.google.com/p/er9x +# gruvin9x - http://code.google.com/p/gruvin9x +# +# License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + + +import argparse +import csv +import os + + +def build_transitions_array(f, column): + f.seek(0) + reader = csv.reader(f, delimiter=',') + last = None + transitions = [] + for i, row in enumerate(reader): + if i == 0: + continue + value = row[column] + if last is None or value != last: + transitions.append((float(row[0]) * 1000, int(value))) + last = value + debounced = [] + i = 0 + while i < len(transitions): + t, val = transitions[i] + if i < len(transitions) - 1 and transitions[i+1][0] - t < 0.002: + i += 2 + continue + debounced.append((t, val)) + i += 1 + return debounced + + +class Frame: + def __init__(self): + self.transitions = [] + + def push(self, t, value): + self.transitions.append((t, value)) + + def start(self): + return self.transitions[0][0] + + def end(self): + return self.transitions[-1][0] + + def is_after(self, t): + return self.start() >= t + + def output(self, time): + value = 0 + for t, v in self.transitions: + if t > time: + return value + value = v + return value + + @classmethod + def get_frames(cls, transitions): + result = [] + current_frame = None + last = 0 + for t, value in transitions: + if t - last > 3: + if current_frame: + result.append(current_frame) + current_frame = cls() + if current_frame is not None: + current_frame.push(t, value) + last = t + return result + + +class SBusFrame(Frame): + def byte(self, index): + t = self.start() + 0.12 * index + 0.015 + value = 0 + for bit in range(8): + value += (1 - self.output(t)) << bit + t += 0.010 + return value + + def is_lost(self): + return self.byte(23) & 0x04 + + def value(self, channel): + bits_available = 0 + bits = 0 + byte = 0 + value = None + for i in range(channel + 1): + while bits_available < 11: + byte += 1 + bits |= self.byte(byte) << bits_available + bits_available += 8 + value = ((bits & 0b11111111111) - 0x3E0) * 5 / 8 + bits_available -= 11 + bits >>= 11 + return round((value * 100) / 512) + + def __str__(self): + return "%.03fms " % self.start() + " ".join(["%02X" % self.byte(i) for i in range(25)]) + + +class PwmFrame(Frame): + def duration(self): + return self.end() - self.start() + + def value(self, channel): + return round((self.duration() * 1000 - 1500) * 100 / 512) + + def __str__(self): + return "%.03fms %d" % (self.start(), self.value(0)) + + +class LatencyStatistics: + def __init__(self, trigger_transitions, frames, channel, highval, lowval): + self.trigger_transitions = trigger_transitions + self.frames = frames + self.channel = channel + self.highval = highval + self.lowval = lowval + + def iter(self): + for t0, val in self.trigger_transitions[1:]: + value = self.highval if val == 1 else self.lowval + for frame in self.frames: + if frame.is_after(t0) and frame.value(self.channel) == value: + delay = frame.end() - t0 + yield (t0, val, delay) + break + + @staticmethod + def append_to_line(f, s, index, lines, columns): + if columns == 0: + f.write(s) + elif index < len(lines): + f.write(lines[index].strip() + ";" + s) + else: + f.write(";" * columns + s) + f.write("\n") + + def export(self, path, title, append): + lines = [] + columns = 0 + if append and os.path.exists(path): + with open(path, 'r') as f: + lines = f.readlines() + columns = len(lines[0].split(";")) + with open(path, 'w') as f: + self.append_to_line(f, title, 0, lines, columns) + index = 1 + for t0, val, delay in self.iter(): + self.append_to_line(f, str(delay), index, lines, columns) + index += 1 + + def print(self): + mini, maxi = None, None + count = 0 + total = 0 + for t0, val, delay in self.iter(): + count += 1 + total += delay + if mini is None or delay < mini[0]: + mini = (delay, t0) + if maxi is None or delay > maxi[0]: + maxi = (delay, t0) + + print("Delay between the switch toggle and the end of the SBUS frame:") + print(" Count = %d transitions" % count) + print(" Average = %.1fms" % (total / count)) + print(" Mini = %.1fms @ %fs" % (mini[0], mini[1] / 1000)) + print(" Maxi = %.1fms @ %fs" % (maxi[0], maxi[1] / 1000)) + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument('file', help='file to parse', type=argparse.FileType('r')) + parser.add_argument('--trigger', help='column in the CSV file where is the trigger', type=int, required=True) + parser.add_argument('--pwm', help='column in the CSV file where is the PWM output', type=int) + parser.add_argument('--sbus', help='column in the CSV file where is the SBUS output', type=int) + parser.add_argument('--channel', help='channel to check', type=int, default=0) + parser.add_argument('--highval', help='value of channel when trigger=HIGH', type=int, default=+100) + parser.add_argument('--lowval', help='value of channel when trigger=LOW', type=int, default=-100) + parser.add_argument('--export', help='CSV file to export latency values') + parser.add_argument('--title', help='CSV column title', default="Unknown") + parser.add_argument('--append', help='export CSV file in append mode', action='store_true') + args = parser.parse_args() + + trigger_transitions = build_transitions_array(args.file, args.trigger) + + if args.sbus: + sbus_transitions = build_transitions_array(args.file, args.sbus) + frames = SBusFrame.get_frames(sbus_transitions) + for frame in frames: + if frame.is_lost(): + print("Frame lost bit @ %fs" % (frame.start() / 1000)) + elif args.pwm: + pwm_transitions = build_transitions_array(args.file, args.pwm) + frames = PwmFrame.get_frames(pwm_transitions) + else: + print("Either a PWM or SBUS column in CSV must be specified") + exit() + + statistics = LatencyStatistics(trigger_transitions, frames, args.channel, args.highval, args.lowval) + if args.export: + statistics.export(args.export, args.title, args.append) + statistics.print() + + +if __name__ == "__main__": + main() diff --git a/tools/nightly23/build-nightly.sh b/tools/nightly23/build-nightly.sh index a69070f2b..71c1c920a 100755 --- a/tools/nightly23/build-nightly.sh +++ b/tools/nightly23/build-nightly.sh @@ -34,6 +34,8 @@ echo "Build firmware stamps" docker run -dit --name companion -v /home/opentx/${docker}:/opentx ${docker} docker exec companion sh -c "mkdir -p build && cd build && cmake /opentx/code && cp radio/src/stamp.h /opentx/binaries/stamp-opentx.txt" cp -f ${workdir}/binaries/stamp-opentx.txt ${output}/firmware +# These radios are currently not enabled +echo "#define BLOCK \"x10,x12s\"" >> ${output}/firmware/stamp-opentx.txt docker exec companion rm -rf build echo "Check if Linux companion is needed" @@ -49,7 +51,7 @@ echo "Check if Windows companion is needed" if [ ! -f ${output}/companion/windows/companion-windows-${version}${suffix}.exe ]; then echo "Build Windows companion" cd ${output}/companion/windows - wget -qO- http://winbox.open-tx.org/companion-builds/compile23.php?branch=$branch\&suffix=${suffix} + wget --tries=1 --read-timeout=6000 -O- http://winbox.open-tx.org/companion-builds/compile23.php?branch=$branch\&suffix=${suffix} wget -O companion-windows-${version}${suffix}.exe http://winbox.open-tx.org/companion-builds/companion-windows-${version}${suffix}.exe chmod -Rf g+w companion-windows-${version}${suffix}.exe fi @@ -58,7 +60,7 @@ echo "Check if Macosc companion is needed" if [ ! -f ${output}/companion/macosx/opentx-companion-${version}${suffix}.dmg ]; then echo "Build Macosx companion" cd ${output}/companion/macosx - wget -qO- http://opentx.blinkt.de:8080/~opentx/build-opentx.py?branch=${branch}\&suffix=${suffix} + wget --tries=1 -qO- http://opentx.blinkt.de:8080/~opentx/build-opentx.py?branch=${branch}\&suffix=${suffix} wget -O opentx-companion-${version}${suffix}.dmg http://opentx.blinkt.de:8080/~opentx/builds/opentx-companion-${version}${suffix}.dmg chmod -Rf g+w opentx-companion-${version}${suffix}.dmg fi