diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 501d40473..eee82aa61 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1178,96 +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 && 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 (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 (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) diff --git a/radio/src/gui/212x64/model_setup.cpp b/radio/src/gui/212x64/model_setup.cpp index 947302718..935f5bd2c 100644 --- a/radio/src/gui/212x64/model_setup.cpp +++ b/radio/src/gui/212x64/model_setup.cpp @@ -1407,78 +1407,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 && 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; - 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 (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/common/stdlcd/model_setup_pxx2.cpp b/radio/src/gui/common/stdlcd/model_setup_pxx2.cpp index 42d43ecdb..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); @@ -260,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/opentx.h b/radio/src/opentx.h index 6f17cad4b..f53dd9c36 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -451,15 +451,22 @@ 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,