diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index ca8115670..68c6b3df8 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -192,7 +192,19 @@ enum MenuModelSetupItems { #endif #define PORT_CHANNELS_ROWS(x) (x==EXTERNAL_MODULE ? EXTERNAL_MODULE_CHANNELS_ROWS : 0) -#define EXTERNAL_MODULE_TYPE_ROWS (isModulePXX1(EXTERNAL_MODULE) || isModulePXX2(EXTERNAL_MODULE) || isModuleDSM2(EXTERNAL_MODULE) || isModuleMultimodule(EXTERNAL_MODULE)) ? (uint8_t)1 : (uint8_t)0 + +inline uint8_t EXTERNAL_MODULE_TYPE_ROW() +{ + if (isModuleXJT(EXTERNAL_MODULE) || isModuleR9MNonAccess(EXTERNAL_MODULE) || isModuleDSM2(EXTERNAL_MODULE)) + return 1; +#if defined(MULTIMODULE) + else if (isModuleMultimodule(EXTERNAL_MODULE)) { + return 1; + } +#endif + else + return 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 @@ -315,7 +327,7 @@ void menuModelSetup(event_t event) INTERNAL_MODULE_ROWS LABEL(ExternalModule), - EXTERNAL_MODULE_TYPE_ROWS, + EXTERNAL_MODULE_TYPE_ROW(), MULTIMODULE_SUBTYPE_ROWS(EXTERNAL_MODULE) EXTERNAL_MODULE_POWER_ROW, MULTIMODULE_STATUS_ROWS @@ -336,7 +348,7 @@ void menuModelSetup(event_t event) #else MENU_TAB({ HEADER_LINE_COLUMNS 0, TIMER_ROWS, TIMER_ROWS, TIMER_ROWS, 0, 1, 0, 0, 0, 0, 0, LABEL(PreflightCheck), 0, 0, NUM_SWITCHES-1, NUM_STICKS+NUM_POTS+NUM_SLIDERS-1, 0, LABEL(ExternalModule), - EXTERNAL_MODULE_TYPE_ROWS, + EXTERNAL_MODULE_TYPE_ROW(), MULTIMODULE_SUBTYPE_ROWS(EXTERNAL_MODULE) MULTIMODULE_STATUS_ROWS EXTERNAL_MODULE_CHANNELS_ROWS, @@ -851,7 +863,7 @@ void menuModelSetup(event_t event) g_model.moduleData[EXTERNAL_MODULE].channelsCount = defaultModuleChannels_M8(EXTERNAL_MODULE); if (isModuleSBUS(EXTERNAL_MODULE)) g_model.moduleData[EXTERNAL_MODULE].sbus.refreshRate = -31; - if (isModulePPM(EXTERNAL_MODULE)) + else if (isModulePPM(EXTERNAL_MODULE)) SET_DEFAULT_PPM_FRAME_LENGTH(EXTERNAL_MODULE); } } diff --git a/radio/src/gui/212x64/model_setup.cpp b/radio/src/gui/212x64/model_setup.cpp index 35e5efbe1..5c0e00726 100644 --- a/radio/src/gui/212x64/model_setup.cpp +++ b/radio/src/gui/212x64/model_setup.cpp @@ -246,7 +246,7 @@ void editTimerCountdown(int timerIdx, coord_t y, LcdFlags attr, event_t event) #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 -inline uint8_t EXTERNAL_MODULE_MODE_ROW() +inline uint8_t EXTERNAL_MODULE_TYPE_ROW() { if (isModuleXJT(EXTERNAL_MODULE) || isModuleR9MNonAccess(EXTERNAL_MODULE) || isModuleDSM2(EXTERNAL_MODULE)) return 1; @@ -363,7 +363,7 @@ void menuModelSetup(event_t event) IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 0), // Receiver 3 LABEL(ExternalModule), - EXTERNAL_MODULE_MODE_ROW(), + EXTERNAL_MODULE_TYPE_ROW(), MULTIMODULE_STATUS_ROWS EXTERNAL_MODULE_CHANNELS_ROWS, IF_NOT_ACCESS_MODULE_RF(EXTERNAL_MODULE, EXTERNAL_MODULE_BIND_ROWS), @@ -838,19 +838,21 @@ void menuModelSetup(event_t event) if (s_editMode > 0) { switch (menuHorizontalPosition) { case 0: - g_model.moduleData[EXTERNAL_MODULE].type = checkIncDec(event, g_model.moduleData[EXTERNAL_MODULE].type, MODULE_TYPE_NONE, - IS_TRAINER_EXTERNAL_MODULE() ? MODULE_TYPE_NONE : MODULE_TYPE_COUNT - 1, EE_MODEL, - isExternalModuleAvailable); + { + uint8_t moduleType = checkIncDec(event, g_model.moduleData[EXTERNAL_MODULE].type, MODULE_TYPE_NONE, MODULE_TYPE_COUNT - 1, EE_MODEL, + isExternalModuleAvailable); if (checkIncDec_Ret) { - g_model.moduleData[EXTERNAL_MODULE].rfProtocol = 0; - g_model.moduleData[EXTERNAL_MODULE].channelsStart = 0; + memclear(&g_model.moduleData[EXTERNAL_MODULE], sizeof(g_model.moduleData[EXTERNAL_MODULE])); + g_model.moduleData[EXTERNAL_MODULE].type = moduleType; g_model.moduleData[EXTERNAL_MODULE].channelsCount = defaultModuleChannels_M8(EXTERNAL_MODULE); if (isModuleSBUS(EXTERNAL_MODULE)) g_model.moduleData[EXTERNAL_MODULE].sbus.refreshRate = -31; - if (isModulePPM(EXTERNAL_MODULE)) + else if (isModulePPM(EXTERNAL_MODULE)) SET_DEFAULT_PPM_FRAME_LENGTH(EXTERNAL_MODULE); } break; + } + case 1: if (isModuleDSM2(EXTERNAL_MODULE)) CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, DSM2_PROTO_LP45, DSM2_PROTO_DSMX); diff --git a/radio/src/gui/480x272/menus.h b/radio/src/gui/480x272/menus.h index 708417b76..ff97b08d1 100644 --- a/radio/src/gui/480x272/menus.h +++ b/radio/src/gui/480x272/menus.h @@ -330,7 +330,7 @@ extern const CheckIncDecStops &stopsSwitch; (val), (val+1) int checkIncDec(event_t event, int val, int i_min, int i_max, unsigned int i_flags=0, IsValueAvailable isValueAvailable=NULL, const CheckIncDecStops &stops=stops100); -swsrc_t checkIncDecMovedSwitch(swsrc_t val); + #define checkIncDecModel(event, i_val, i_min, i_max) checkIncDec(event, i_val, i_min, i_max, EE_MODEL) #define checkIncDecModelZero(event, i_val, i_max) checkIncDec(event, i_val, 0, i_max, EE_MODEL) #define checkIncDecGen(event, i_val, i_min, i_max) checkIncDec(event, i_val, i_min, i_max, EE_GENERAL) @@ -438,11 +438,15 @@ void editCurveRef(coord_t x, coord_t y, CurveRef & curve, event_t event, LcdFlag extern uint8_t s_curveChan; -#define WARNING_TYPE_ALERT 0 -#define WARNING_TYPE_ASTERISK 1 -#define WARNING_TYPE_CONFIRM 2 -#define WARNING_TYPE_INPUT 3 -#define WARNING_TYPE_INFO 4 +enum +{ + WARNING_TYPE_WAIT, + WARNING_TYPE_INFO, + WARNING_TYPE_ASTERISK, + WARNING_TYPE_CONFIRM, + WARNING_TYPE_INPUT, + WARNING_TYPE_ALERT +}; extern const char * warningText; extern const char * warningInfoText; @@ -489,8 +493,6 @@ extern void (* popupFunc)(event_t event); extern uint8_t warningInfoFlags; #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) #define SET_WARNING_INFO(info, len, flags) (warningInfoText = info, warningInfoLength = len, warningInfoFlags = flags) @@ -513,6 +515,35 @@ extern uint8_t popupMenuSelectedItem; const char * runPopupMenu(event_t event); extern void (*popupMenuHandler)(const char * result); +inline void CLEAR_POPUP() +{ + warningText = nullptr; +} + +inline void POPUP_WAIT(const char * s) +{ + warningText = s; + warningInfoText = nullptr; + warningType = WARNING_TYPE_WAIT; + popupFunc = runPopupWarning; +} + +inline void POPUP_INFORMATION(const char * s) +{ + warningText = s; + warningInfoText = nullptr; + warningType = WARNING_TYPE_INFO; + popupFunc = runPopupWarning; +} + +inline void POPUP_WARNING(const char * s) +{ + warningText = s; + warningInfoText = nullptr; + warningType = WARNING_TYPE_ASTERISK; + popupFunc = runPopupWarning; +} + inline void POPUP_CONFIRMATION(const char *s, void (* confirmHandler)(const char *) = nullptr) { warningText = s; diff --git a/radio/src/gui/480x272/model_setup.cpp b/radio/src/gui/480x272/model_setup.cpp index ab92d0f69..1c417a425 100644 --- a/radio/src/gui/480x272/model_setup.cpp +++ b/radio/src/gui/480x272/model_setup.cpp @@ -122,47 +122,22 @@ enum MenuModelSetupItems { #define MODEL_SETUP_SLIDPOT_SPACING 45 #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)) +#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)) #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) { + if (result == STR_16CH_WITH_TELEMETRY) { reusableBuffer.moduleSetup.bindInformation.lbtMode = 1; } - else if (result == STR_BIND_16CH_WITHOUT_TELEM) { + else if (result == STR_16CH_WITHOUT_TELEMETRY) { reusableBuffer.moduleSetup.bindInformation.lbtMode = 2; } - else if (result == STR_BIND_FLEX_868) { + else if (result == STR_FLEX_915) { reusableBuffer.moduleSetup.bindInformation.flexMode = 0; } - else if (result == STR_BIND_FLEX_915) { + else if (result == STR_FLEX_868) { reusableBuffer.moduleSetup.bindInformation.flexMode = 1; } else { @@ -170,6 +145,7 @@ void onPXX2R9MBindModeMenu(const char * result) uint8_t moduleIdx = CURRENT_MODULE_EDITED(menuVerticalPosition); uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(menuVerticalPosition); moduleState[moduleIdx].mode = MODULE_MODE_NORMAL; + reusableBuffer.moduleSetup.bindInformation.step = 0; removePXX2ReceiverIfEmpty(moduleIdx, receiverIdx); return; } @@ -498,7 +474,7 @@ int getSwitchWarningsCount() #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() +inline uint8_t EXTERNAL_MODULE_TYPE_ROW() { if (isModuleXJT(EXTERNAL_MODULE) || isModuleR9MNonAccess(EXTERNAL_MODULE) || isModuleDSM2(EXTERNAL_MODULE)) return 1; @@ -592,7 +568,7 @@ bool menuModelSetup(event_t event) IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 0), /* Receiver 3 */ LABEL(ExternalModule), - EXTERNAL_MODULE_MODE_ROW(), + EXTERNAL_MODULE_TYPE_ROW(), MULTIMODULE_STATUS_ROWS EXTERNAL_MODULE_CHANNELS_ROWS, IF_NOT_ACCESS_MODULE_RF(EXTERNAL_MODULE, EXTERNAL_MODULE_BIND_ROWS), @@ -1044,19 +1020,21 @@ bool menuModelSetup(event_t event) if (s_editMode > 0) { switch (menuHorizontalPosition) { case 0: - g_model.moduleData[EXTERNAL_MODULE].type = checkIncDec(event, g_model.moduleData[EXTERNAL_MODULE].type, - MODULE_TYPE_NONE, MODULE_TYPE_COUNT - 1, EE_MODEL, - isExternalModuleAvailable); + { + uint8_t moduleType = checkIncDec(event, g_model.moduleData[EXTERNAL_MODULE].type, MODULE_TYPE_NONE, MODULE_TYPE_COUNT - 1, EE_MODEL, + isExternalModuleAvailable); if (checkIncDec_Ret) { - g_model.moduleData[EXTERNAL_MODULE].rfProtocol = 0; - g_model.moduleData[EXTERNAL_MODULE].channelsStart = 0; + memclear(&g_model.moduleData[EXTERNAL_MODULE], sizeof(g_model.moduleData[EXTERNAL_MODULE])); + g_model.moduleData[EXTERNAL_MODULE].type = moduleType; g_model.moduleData[EXTERNAL_MODULE].channelsCount = defaultModuleChannels_M8(EXTERNAL_MODULE); if (isModuleSBUS(EXTERNAL_MODULE)) g_model.moduleData[EXTERNAL_MODULE].sbus.refreshRate = -31; - if (isModulePPM(EXTERNAL_MODULE)) + else if (isModulePPM(EXTERNAL_MODULE)) SET_DEFAULT_PPM_FRAME_LENGTH(EXTERNAL_MODULE); } break; + } + case 1: if (isModuleDSM2(EXTERNAL_MODULE)) CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, DSM2_PROTO_LP45, DSM2_PROTO_DSMX); @@ -1092,6 +1070,7 @@ bool menuModelSetup(event_t event) g_model.moduleData[EXTERNAL_MODULE].channelsCount = defaultModuleChannels_M8(EXTERNAL_MODULE); } break; + #if defined(MULTIMODULE) case 2: if (g_model.moduleData[EXTERNAL_MODULE].multi.customProto) { @@ -1264,6 +1243,7 @@ bool menuModelSetup(event_t event) #endif case ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_MODEL_NUM: + case ITEM_MODEL_SETUP_EXTERNAL_MODULE_PXX2_MODEL_NUM: { uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); lcdDrawText(MENUS_MARGIN_LEFT + INDENT_WIDTH, y, STR_RECEIVER_NUM); @@ -1283,6 +1263,7 @@ bool menuModelSetup(event_t event) break; case ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_REGISTER_RANGE: + case ITEM_MODEL_SETUP_EXTERNAL_MODULE_PXX2_REGISTER_RANGE: { uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); lcdDrawText(MENUS_MARGIN_LEFT + INDENT_WIDTH, y, STR_MODULE); @@ -1321,6 +1302,9 @@ bool menuModelSetup(event_t event) 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: + 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); @@ -1328,60 +1312,75 @@ bool menuModelSetup(event_t event) drawStringWithIndex(MENUS_MARGIN_LEFT + INDENT_WIDTH, y, STR_RECEIVER, receiverIdx + 1); - if (!(g_model.moduleData[moduleIdx].pxx2.receivers & (1 << receiverIdx))) { + if (!isPXX2ReceiverUsed(moduleIdx, 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); + if (attr && event == EVT_KEY_BREAK(KEY_ENTER)) { + setPXX2ReceiverUsed(moduleIdx, receiverIdx); memclear(g_model.moduleData[moduleIdx].pxx2.receiverName[receiverIdx], PXX2_LEN_RX_NAME); - storageDirty(EE_MODEL); - } - else { - break; + onPXX2ReceiverMenu(STR_BIND); } + 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 (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; + break; +#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); + } } - - if (attr && (moduleState[moduleIdx].mode == 0 || s_editMode == 0)) { + 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 && reusableBuffer.moduleSetup.bindInformation.candidateReceiversCount > 0) { - popupMenuItemsCount = min(reusableBuffer.moduleSetup.bindInformation.candidateReceiversCount, PXX2_MAX_RECEIVERS_PER_MODULE); - for (uint8_t i=0; i 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; + POPUP_MENU_START(onPXX2BindMenu); + } + else { + POPUP_WAIT(STR_WAITING_FOR_RX); } - //popupMenuTitle = STR_PXX2_SELECT_RX; // TODO : fix - POPUP_MENU_START(onPXX2BindMenu); } } - if (attr && EVT_KEY_MASK(event) == KEY_ENTER) { - killEvents(event); - if (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); - } + if (attr && event == EVT_KEY_BREAK(KEY_ENTER)) { + 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/480x272/theme.cpp b/radio/src/gui/480x272/theme.cpp index e4a60bec9..27756859a 100644 --- a/radio/src/gui/480x272/theme.cpp +++ b/radio/src/gui/480x272/theme.cpp @@ -90,10 +90,10 @@ void Theme::drawBackground() const void Theme::drawMessageBox(const char * title, const char * text, const char * action, uint32_t type) const { - //if (flags & MESSAGEBOX_TYPE_ALERT) { +// if (type == WARNING_TYPE_ALERT) { drawBackground(); lcdDrawFilledRect(0, POPUP_Y, LCD_W, POPUP_H, SOLID, TEXT_INVERTED_COLOR | OPACITY(8)); - //} +// } if (type == WARNING_TYPE_ALERT || type == WARNING_TYPE_ASTERISK) lcd->drawBitmap(POPUP_X-80, POPUP_Y+12, asterisk); diff --git a/radio/src/gui/common/stdlcd/model_setup_pxx1.cpp b/radio/src/gui/common/stdlcd/model_setup_pxx1.cpp index f0e027a98..aaa1a9b1c 100644 --- a/radio/src/gui/common/stdlcd/model_setup_pxx1.cpp +++ b/radio/src/gui/common/stdlcd/model_setup_pxx1.cpp @@ -75,7 +75,6 @@ void startBindMenu(uint8_t moduleIdx) 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 17a68c8bd..77c63ebb9 100644 --- a/radio/src/gui/common/stdlcd/model_setup_pxx2.cpp +++ b/radio/src/gui/common/stdlcd/model_setup_pxx2.cpp @@ -20,35 +20,6 @@ #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); -} - -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); - } -} - void onPXX2R9MBindModeMenu(const char * result) { if (result == STR_16CH_WITH_TELEMETRY) { @@ -68,6 +39,7 @@ void onPXX2R9MBindModeMenu(const char * result) uint8_t moduleIdx = CURRENT_MODULE_EDITED(menuVerticalPosition - HEADER_LINE); uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(menuVerticalPosition - HEADER_LINE); moduleState[moduleIdx].mode = MODULE_MODE_NORMAL; + reusableBuffer.moduleSetup.bindInformation.step = 0; removePXX2ReceiverIfEmpty(moduleIdx, receiverIdx); return; } @@ -279,8 +251,7 @@ void modelSetupModulePxx2ReceiverLine(uint8_t moduleIdx, uint8_t receiverIdx, co if (!isPXX2ReceiverUsed(moduleIdx, receiverIdx)) { lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_MODULE_BIND, attr); - if (attr && s_editMode > 0) { - killEvents(event); + if (attr && event == EVT_KEY_BREAK(KEY_ENTER)) { setPXX2ReceiverUsed(moduleIdx, receiverIdx); memclear(g_model.moduleData[moduleIdx].pxx2.receiverName[receiverIdx], PXX2_LEN_RX_NAME); onPXX2ReceiverMenu(STR_BIND); diff --git a/radio/src/gui/gui_common.h b/radio/src/gui/gui_common.h index e86febbbf..3b63077da 100644 --- a/radio/src/gui/gui_common.h +++ b/radio/src/gui/gui_common.h @@ -39,7 +39,7 @@ typedef bool (*IsValueAvailable)(int); -int circularIncDec(int current, int inc, int min, int max, IsValueAvailable isValueAvailable=NULL); +int circularIncDec(int current, int inc, int min, int max, IsValueAvailable isValueAvailable=nullptr); int getFirstAvailable(int min, int max, IsValueAvailable isValueAvailable); bool isTrimModeAvailable(int mode); @@ -108,7 +108,7 @@ void drawSourceValue(coord_t x, coord_t y, source_t channel, LcdFlags flags=0); void drawCurve(coord_t offset=0); #if defined(COLORLCD) -void drawStringWithIndex(coord_t x, coord_t y, const char * str, int idx, LcdFlags flags=0, const char * prefix=NULL, const char * suffix=NULL); +void drawStringWithIndex(coord_t x, coord_t y, const char * str, int idx, LcdFlags flags=0, const char * prefix=nullptr, const char * suffix=nullptr); int editChoice(coord_t x, coord_t y, const char * values, int value, int min, int max, LcdFlags flags, event_t event); uint8_t editCheckBox(uint8_t value, coord_t x, coord_t y, LcdFlags flags, event_t event); swsrc_t editSwitch(coord_t x, coord_t y, swsrc_t value, LcdFlags flags, event_t event); diff --git a/radio/src/pulses/modules_helpers.h b/radio/src/pulses/modules_helpers.h index ae5d36849..b71e61c5a 100644 --- a/radio/src/pulses/modules_helpers.h +++ b/radio/src/pulses/modules_helpers.h @@ -449,4 +449,34 @@ inline bool isTelemAllowedOnBind(uint8_t moduleIndex) return true; } + +inline bool isPXX2ReceiverUsed(uint8_t moduleIdx, uint8_t receiverIdx) +{ + return g_model.moduleData[moduleIdx].pxx2.receivers & (1 << receiverIdx); +} + +inline void setPXX2ReceiverUsed(uint8_t moduleIdx, uint8_t receiverIdx) +{ + g_model.moduleData[moduleIdx].pxx2.receivers |= (1 << receiverIdx); +} + +inline bool isPXX2ReceiverEmpty(uint8_t moduleIdx, uint8_t receiverIdx) +{ + return is_memclear(g_model.moduleData[moduleIdx].pxx2.receiverName[receiverIdx], PXX2_LEN_RX_NAME); +} + +inline 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); +} + +inline void removePXX2ReceiverIfEmpty(uint8_t moduleIdx, uint8_t receiverIdx) +{ + if (isPXX2ReceiverEmpty(moduleIdx, receiverIdx)) { + removePXX2Receiver(moduleIdx, receiverIdx); + } +} + #endif // _MODULES_H_