diff --git a/radio/src/gui/128x64/model_select.cpp b/radio/src/gui/128x64/model_select.cpp index ce6649c17..479a0b544 100644 --- a/radio/src/gui/128x64/model_select.cpp +++ b/radio/src/gui/128x64/model_select.cpp @@ -52,7 +52,7 @@ void onModelSelectMenu(const char * result) } #endif else if (result == STR_DELETE_MODEL) { - POPUP_CONFIRMATION(STR_DELETEMODEL); + POPUP_CONFIRMATION(STR_DELETEMODEL, nullptr); SET_WARNING_INFO(modelHeaders[sub].name, sizeof(g_model.header.name), ZCHAR); } #if defined(SDCARD) @@ -104,7 +104,7 @@ void menuModelSelect(event_t event) case EVT_KEY_LONG(KEY_EXIT): killEvents(event); if (s_copyMode && s_copyTgtOfs == 0 && g_eeGeneral.currModel != sub && eeModelExists(sub)) { - POPUP_CONFIRMATION(STR_DELETEMODEL); + POPUP_CONFIRMATION(STR_DELETEMODEL, nullptr); SET_WARNING_INFO(modelHeaders[sub].name, sizeof(g_model.header.name), ZCHAR); } else { diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index c6d322771..15a670a52 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1608,7 +1608,7 @@ void menuModelSetup(event_t event) { 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); + POPUP_CONFIRMATION(STR_ANTENNACONFIRM1, nullptr); const char * w = STR_ANTENNACONFIRM2; SET_WARNING_INFO(w, strlen(w), 0); } @@ -1950,16 +1950,37 @@ enum MenuModelReceiverOptions { #define RECEIVER_OPTIONS_2ND_COLUMN 80 +void onRxOptionsUpdateConfirm(const char * result) +{ + if (result == STR_OK) { + reusableBuffer.receiverSetup.state = RECEIVER_SETTINGS_WRITE; + reusableBuffer.receiverSetup.dirty = 0; + reusableBuffer.receiverSetup.timeout = 0; + moduleSettings[g_moduleIdx].mode = MODULE_MODE_RECEIVER_SETTINGS; + } + else { + reusableBuffer.receiverSetup.dirty = 0; + popMenu(); + } +} + 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; + uint8_t outputsCount = min(16, reusableBuffer.receiverSetup.outputsCount); - SIMPLE_SUBMENU_NOTITLE(ITEM_RECEIVER_PINMAP_FIRST + sentModuleChannels(g_moduleIdx)); + SIMPLE_SUBMENU_NOTITLE(ITEM_RECEIVER_PINMAP_FIRST + outputsCount); if (menuEvent) { moduleSettings[g_moduleIdx].mode = MODULE_MODE_NORMAL; - return; + if (reusableBuffer.receiverSetup.dirty) { + pushMenu(menuModelReceiverOptions); + POPUP_CONFIRMATION("Update RX options?", onRxOptionsUpdateConfirm); + } + else { + return; + } } int8_t sub = menuVerticalPosition; @@ -1969,22 +1990,15 @@ void menuModelReceiverOptions(event_t event) lcdInvertLine(0); if (event == EVT_ENTRY) { - moduleSettings[g_moduleIdx].mode = MODULE_MODE_RECEIVER_SETTINGS; - } - - if (!s_editMode && reusableBuffer.receiverSetup.dirty && reusableBuffer.receiverSetup.state == RECEIVER_SETTINGS_OK) { - reusableBuffer.receiverSetup.state = RECEIVER_SETTINGS_WRITE; - reusableBuffer.receiverSetup.dirty = 0; - reusableBuffer.receiverSetup.timeout = 0; - reusableBuffer.receiverSetup.dirtyTimeout = get_tmr10ms() + 500/*5s*/; - moduleSettings[g_moduleIdx].mode = MODULE_MODE_RECEIVER_SETTINGS; - } - #if defined(SIMU) - reusableBuffer.receiverSetup.state = RECEIVER_SETTINGS_OK; + reusableBuffer.receiverSetup.state = RECEIVER_SETTINGS_OK; + reusableBuffer.receiverSetup.outputsCount = 8; +#else + moduleSettings[g_moduleIdx].mode = MODULE_MODE_RECEIVER_SETTINGS; #endif + } - if (reusableBuffer.receiverSetup.state == RECEIVER_SETTINGS_OK || get_tmr10ms() < reusableBuffer.receiverSetup.dirtyTimeout) { + if (reusableBuffer.receiverSetup.state == RECEIVER_SETTINGS_OK) { for (uint8_t k=0; k 0 ? (s < popupMenuItemsCount ? s : popupMenuItemsCount) : 0) #define POPUP_MENU_START(func) do { popupMenuHandler = (func); AUDIO_KEY_PRESS(); } while (0) @@ -78,13 +77,11 @@ extern uint8_t warningInfoFlags; extern uint8_t popupMenuOffsetType; extern uint8_t s_menu_item; -#if defined(NAVIGATION_MENUS) extern uint16_t popupMenuOffset; extern const char * popupMenuItems[POPUP_MENU_MAX_LINES]; extern uint16_t popupMenuItemsCount; const char * runPopupMenu(event_t event); extern void (*popupMenuHandler)(const char * result); extern const char * popupMenuTitle; -#endif #endif // _POPUPS_H_ diff --git a/radio/src/gui/128x64/radio_setup.cpp b/radio/src/gui/128x64/radio_setup.cpp index 25d407045..2334fd44e 100644 --- a/radio/src/gui/128x64/radio_setup.cpp +++ b/radio/src/gui/128x64/radio_setup.cpp @@ -553,7 +553,7 @@ void menuRadioSetup(event_t event) if (g_eeGeneral.fai) POPUP_WARNING("FAI\001mode blocked!"); else - POPUP_CONFIRMATION("FAI mode?"); + POPUP_CONFIRMATION("FAI mode?", nullptr); } break; #endif diff --git a/radio/src/gui/128x64/radio_version.cpp b/radio/src/gui/128x64/radio_version.cpp index 18ffd8085..a86bc7f12 100644 --- a/radio/src/gui/128x64/radio_version.cpp +++ b/radio/src/gui/128x64/radio_version.cpp @@ -196,7 +196,7 @@ void menuRadioVersion(event_t event) // y += FH; if (menuVerticalPosition == ITEM_RADIO_FACTORY_RESET && event == EVT_KEY_BREAK(KEY_ENTER)) { s_editMode = EDIT_SELECT_FIELD; - POPUP_CONFIRMATION(STR_CONFIRMRESET); + POPUP_CONFIRMATION(STR_CONFIRMRESET, nullptr); } #endif } diff --git a/radio/src/gui/212x64/model_select.cpp b/radio/src/gui/212x64/model_select.cpp index 76de6a69e..d4bf5d37d 100644 --- a/radio/src/gui/212x64/model_select.cpp +++ b/radio/src/gui/212x64/model_select.cpp @@ -52,7 +52,7 @@ void onModelSelectMenu(const char * result) else if (result == STR_DELETE_MODEL) { char * nametmp = reusableBuffer.modelsel.mainname; strcat_modelname (nametmp, sub); - POPUP_CONFIRMATION(STR_DELETEMODEL); + POPUP_CONFIRMATION(STR_DELETEMODEL, nullptr); SET_WARNING_INFO(nametmp, sizeof(g_model.header.name), 0); } else if (result) { @@ -102,7 +102,7 @@ void menuModelSelect(event_t event) if (s_copyMode && s_copyTgtOfs == 0 && g_eeGeneral.currModel != sub && eeModelExists(sub)) { char * nametmp = reusableBuffer.modelsel.mainname; strcat_modelname (nametmp, sub); - POPUP_CONFIRMATION(STR_DELETEMODEL); + POPUP_CONFIRMATION(STR_DELETEMODEL, nullptr); SET_WARNING_INFO(nametmp, sizeof(g_model.header.name), 0); killEvents(event); break; diff --git a/radio/src/gui/212x64/model_telemetry.cpp b/radio/src/gui/212x64/model_telemetry.cpp index 13c2f1c21..5c4f5af2d 100644 --- a/radio/src/gui/212x64/model_telemetry.cpp +++ b/radio/src/gui/212x64/model_telemetry.cpp @@ -506,7 +506,7 @@ void menuModelTelemetryFrsky(event_t event) s_editMode = 0; if (attr && event==EVT_KEY_LONG(KEY_ENTER)) { killEvents(KEY_ENTER); - POPUP_CONFIRMATION(STR_CONFIRMDELETE); + POPUP_CONFIRMATION(STR_CONFIRMDELETE, nullptr); } break; diff --git a/radio/src/gui/212x64/popups.cpp b/radio/src/gui/212x64/popups.cpp index 93b8693bf..e8c19f932 100644 --- a/radio/src/gui/212x64/popups.cpp +++ b/radio/src/gui/212x64/popups.cpp @@ -86,6 +86,8 @@ void showAlertBox(const char * title, const char * text, const char * action, ui void runPopupWarning(event_t event) { + warningResult = false; + drawMessageBox(warningText); if (warningInfoText) { @@ -99,12 +101,22 @@ void runPopupWarning(event_t event) if (warningType == WARNING_TYPE_ASTERISK) break; - if (warningType != WARNING_TYPE_INFO) - popupMenuHandler(STR_OK); + if (warningType == WARNING_TYPE_CONFIRM) { + warningType = WARNING_TYPE_ASTERISK; + warningText = nullptr; + warningResult = true; + if (popupMenuHandler) + popupMenuHandler(STR_OK); + 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; } diff --git a/radio/src/gui/212x64/popups.h b/radio/src/gui/212x64/popups.h index 65f0881b4..b3d9aa1ee 100644 --- a/radio/src/gui/212x64/popups.h +++ b/radio/src/gui/212x64/popups.h @@ -39,7 +39,7 @@ extern uint8_t warningInfoFlags; #define DISPLAY_WARNING (*popupFunc) #define POPUP_INFORMATION(s) (warningText = s, warningType = WARNING_TYPE_INFO, warningInfoText = 0, popupFunc = runPopupWarning) #define POPUP_WARNING(s) (warningText = s, warningInfoText = 0, popupFunc = runPopupWarning) -#define POPUP_CONFIRMATION(s) (warningText = s, warningType = WARNING_TYPE_CONFIRM, warningInfoText = 0, popupFunc = runPopupWarning) +#define POPUP_CONFIRMATION(s, func) (warningText = s, warningType = WARNING_TYPE_CONFIRM, warningInfoText = 0, popupFunc = runPopupWarning, popupMenuHandler = func) #define POPUP_INPUT(s, func) (warningText = s, popupFunc = func) #define WARNING_INFO_FLAGS warningInfoFlags #define SET_WARNING_INFO(info, len, flags) (warningInfoText = info, warningInfoLength = len, warningInfoFlags = flags) diff --git a/radio/src/gui/212x64/radio_setup.cpp b/radio/src/gui/212x64/radio_setup.cpp index cce07e5cf..684ba39af 100644 --- a/radio/src/gui/212x64/radio_setup.cpp +++ b/radio/src/gui/212x64/radio_setup.cpp @@ -460,7 +460,7 @@ void menuRadioSetup(event_t event) if (g_eeGeneral.fai) POPUP_WARNING("FAI\001mode blocked!"); else - POPUP_CONFIRMATION("FAI mode?"); + POPUP_CONFIRMATION("FAI mode?", nullptr); } break; #endif diff --git a/radio/src/gui/212x64/radio_version.cpp b/radio/src/gui/212x64/radio_version.cpp index fb864c11a..ed4045ba1 100644 --- a/radio/src/gui/212x64/radio_version.cpp +++ b/radio/src/gui/212x64/radio_version.cpp @@ -46,6 +46,6 @@ void menuRadioVersion(event_t event) eepromBackup(); } else if (event == EVT_KEY_LONG(KEY_MENU)) { - POPUP_CONFIRMATION(STR_CONFIRMRESET); + POPUP_CONFIRMATION(STR_CONFIRMRESET, nullptr); } } diff --git a/radio/src/gui/212x64/view_statistics.cpp b/radio/src/gui/212x64/view_statistics.cpp index e980092be..191a4a95b 100644 --- a/radio/src/gui/212x64/view_statistics.cpp +++ b/radio/src/gui/212x64/view_statistics.cpp @@ -149,7 +149,7 @@ void menuStatisticsDebug(event_t event) #if defined(WATCHDOG_TEST) case EVT_KEY_LONG(KEY_MENU): { - POPUP_CONFIRMATION("Test the watchdog?"); + POPUP_CONFIRMATION("Test the watchdog?", nullptr); const char * w = "The radio will reset!"; SET_WARNING_INFO(w, strlen(w), 0); } diff --git a/radio/src/gui/common/stdlcd/radio_sdmanager.cpp b/radio/src/gui/common/stdlcd/radio_sdmanager.cpp index a3699fc03..ef652d316 100644 --- a/radio/src/gui/common/stdlcd/radio_sdmanager.cpp +++ b/radio/src/gui/common/stdlcd/radio_sdmanager.cpp @@ -82,7 +82,7 @@ void onSdManagerMenu(const char * result) pushMenu(menuRadioSdManagerInfo); } else if (result == STR_SD_FORMAT) { - POPUP_CONFIRMATION(STR_CONFIRM_FORMAT); + POPUP_CONFIRMATION(STR_CONFIRM_FORMAT, nullptr); } else if (result == STR_COPY_FILE) { clipboard.type = CLIPBOARD_TYPE_SD_FILE; diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index c1fc97bc8..32f1db946 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -2041,7 +2041,7 @@ uint32_t pwrCheck() lcdRefreshWait(); lcdClear(); - POPUP_CONFIRMATION(STR_MODEL_SHUTDOWN); + POPUP_CONFIRMATION(STR_MODEL_SHUTDOWN, nullptr); SET_WARNING_INFO(STR_MODEL_STILL_POWERED, sizeof(TR_MODEL_STILL_POWERED), 0); event_t evt = getEvent(false); DISPLAY_WARNING(evt); diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 27fcec425..a9821c9c7 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -1144,10 +1144,10 @@ union ReusableBuffer struct { uint8_t state; // 0x00 = READ 0x40 = WRITE tmr10ms_t timeout; - tmr10ms_t dirtyTimeout; tmr10ms_t updateTime; uint8_t receiverId; - uint8_t channelMapping[24]; + uint8_t outputsCount; + uint8_t outputsMapping[24]; uint8_t telemetryDisabled; uint8_t pwmRate; uint8_t dirty; diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index eb1eebee1..71f4c0400 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -162,15 +162,17 @@ void Pxx2Pulses::setupReceiverSettingsFrame(uint8_t module) if (reusableBuffer.receiverSetup.state == RECEIVER_SETTINGS_WRITE) flag0 |= PXX2_RX_SETTINGS_FLAG0_WRITE; Pxx2Transport::addByte(flag0); - uint8_t flag1 = 0; - if (reusableBuffer.receiverSetup.telemetryDisabled) - flag1 |= PXX2_RX_SETTINGS_FLAG1_TELEMETRY_DISABLED; - if (reusableBuffer.receiverSetup.pwmRate) - flag1 |= PXX2_RX_SETTINGS_FLAG1_FASTPWM; - Pxx2Transport::addByte(flag1); - uint8_t channelsCount = sentModuleChannels(module); - for (int i = 0; i < channelsCount; i++) { - Pxx2Transport::addByte(reusableBuffer.receiverSetup.channelMapping[i]); + if (reusableBuffer.receiverSetup.state == RECEIVER_SETTINGS_WRITE) { + uint8_t flag1 = 0; + if (reusableBuffer.receiverSetup.telemetryDisabled) + flag1 |= PXX2_RX_SETTINGS_FLAG1_TELEMETRY_DISABLED; + if (reusableBuffer.receiverSetup.pwmRate) + flag1 |= PXX2_RX_SETTINGS_FLAG1_FASTPWM; + Pxx2Transport::addByte(flag1); + uint8_t outputsCount = min(16, reusableBuffer.receiverSetup.outputsCount); + for (int i = 0; i < outputsCount; i++) { + Pxx2Transport::addByte(reusableBuffer.receiverSetup.outputsMapping[i]); + } } reusableBuffer.receiverSetup.timeout = get_tmr10ms() + 200/*next try in 2s*/; } diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h index 0cab9aab7..09e38b652 100644 --- a/radio/src/targets/taranis/hal.h +++ b/radio/src/targets/taranis/hal.h @@ -751,8 +751,8 @@ #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 - #define EXTERNAL_MODULE_ON() GPIO_ResetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) - #define EXTERNAL_MODULE_OFF() GPIO_SetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) + #define EXTERNAL_MODULE_ON() GPIO_SetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) + #define EXTERNAL_MODULE_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_RESET) #else #define EXTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA2) diff --git a/radio/src/telemetry/frsky_pxx2.cpp b/radio/src/telemetry/frsky_pxx2.cpp index 6dcdcf7f6..f309d3b4a 100644 --- a/radio/src/telemetry/frsky_pxx2.cpp +++ b/radio/src/telemetry/frsky_pxx2.cpp @@ -66,17 +66,18 @@ void processReceiverSettingsFrame(uint8_t module, uint8_t * frame) return; } - uint8_t channelsCount = sentModuleChannels(module); - for (uint8_t pin = 0; pin < channelsCount; pin++) { - reusableBuffer.receiverSetup.channelMapping[pin] = frame[5 + pin]; - } - if (frame[4] & PXX2_RX_SETTINGS_FLAG1_FASTPWM) reusableBuffer.receiverSetup.pwmRate = 1; if (frame[4] & PXX2_RX_SETTINGS_FLAG1_TELEMETRY_DISABLED) reusableBuffer.receiverSetup.telemetryDisabled = 1; + uint8_t outputsCount = min(16, frame[0] - 4); + reusableBuffer.receiverSetup.outputsCount = outputsCount; + for (uint8_t pin = 0; pin < outputsCount; pin++) { + reusableBuffer.receiverSetup.outputsMapping[pin] = frame[5 + pin]; + } + reusableBuffer.receiverSetup.state = RECEIVER_SETTINGS_OK; reusableBuffer.receiverSetup.timeout = 0; moduleSettings[module].mode = MODULE_MODE_NORMAL;