From 0bb9994ac54f771c12d573ce995bd1f57c6f18c6 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Mon, 24 May 2021 15:06:39 +0200 Subject: [PATCH] Allow disabling USB connection by discarding the pop-up menu --- .../src/gui/colorlcd/layouts/topbar_impl.cpp | 11 ++- radio/src/main.cpp | 73 +++++++++++++++---- radio/src/opentx.cpp | 2 +- 3 files changed, 68 insertions(+), 18 deletions(-) diff --git a/radio/src/gui/colorlcd/layouts/topbar_impl.cpp b/radio/src/gui/colorlcd/layouts/topbar_impl.cpp index 70cbd56dc..e45e68def 100644 --- a/radio/src/gui/colorlcd/layouts/topbar_impl.cpp +++ b/radio/src/gui/colorlcd/layouts/topbar_impl.cpp @@ -90,11 +90,16 @@ void TopbarImpl::paint(BitmapBuffer * dc) // USB icon if (usbPlugged()) { - dc->drawBitmapPattern(LCD_W - 98, 8, LBM_TOPMENU_USB, MENU_COLOR); - } + LcdFlags flags = MENU_COLOR; + if (getSelectedUsbMode() == USB_UNSELECTED_MODE) { + flags = MENU_TITLE_DISABLE_COLOR; + } + + dc->drawBitmapPattern(LCD_W - 98, 8, LBM_TOPMENU_USB, flags); + } // Logs - if (isFunctionActive(FUNCTION_LOGS) && !usbPlugged() && BLINK_ON_PHASE) { + else if (isFunctionActive(FUNCTION_LOGS) && BLINK_ON_PHASE) { dc->drawBitmapPattern(LCD_W - 98, 6, LBM_DOT, MENU_COLOR); } diff --git a/radio/src/main.cpp b/radio/src/main.cpp index 414e5f642..f80aac096 100644 --- a/radio/src/main.cpp +++ b/radio/src/main.cpp @@ -30,30 +30,49 @@ uint8_t currentBacklightBright = 0; uint8_t requiredBacklightBright = 0; uint8_t mainRequestFlags = 0; +static bool _usbDisabled = false; + #if defined(LIBOPENUI) +static Menu* _usbMenu = nullptr; + +void closeUsbMenu() +{ + if (_usbMenu && !usbPlugged()) { + + // USB has been unplugged meanwhile + _usbMenu->deleteLater(); + } +} + void openUsbMenu() { - static Menu * menu = nullptr; - if (menu) - return; - menu = new Menu(MainWindow::instance()); - menu->setCloseHandler([]() { - menu = nullptr; + if (_usbMenu || _usbDisabled) return; + + _usbMenu = new Menu(MainWindow::instance()); + + _usbMenu->setCloseHandler([]() { + _usbMenu = nullptr; + if (usbPlugged() && (getSelectedUsbMode() == USB_UNSELECTED_MODE)) { + _usbDisabled = true; + } }); - menu->setTitle("USB"); - menu->addLine(STR_USB_JOYSTICK, [] { + + _usbMenu->setTitle("USB"); + _usbMenu->addLine(STR_USB_JOYSTICK, [] { setSelectedUsbMode(USB_JOYSTICK_MODE); }); - menu->addLine(STR_USB_MASS_STORAGE, [] { + _usbMenu->addLine(STR_USB_MASS_STORAGE, [] { setSelectedUsbMode(USB_MASS_STORAGE_MODE); }); #if defined(DEBUG) - menu->addLine(STR_USB_SERIAL, [] { + _usbMenu->addLine(STR_USB_SERIAL, [] { setSelectedUsbMode(USB_SERIAL_MODE); }); #endif } + #elif defined(STM32) + void onUSBConnectMenu(const char *result) { if (result == STR_USB_MASS_STORAGE) { @@ -65,6 +84,9 @@ void onUSBConnectMenu(const char *result) else if (result == STR_USB_SERIAL) { setSelectedUsbMode(USB_SERIAL_MODE); } + else if (result == STR_EXIT) { + _disableUsb = true; + } } void openUsbMenu() @@ -77,12 +99,32 @@ void openUsbMenu() POPUP_MENU_TITLE(STR_SELECT_MODE); POPUP_MENU_START(onUSBConnectMenu); } + +void closeUsbMenu() +{ +} + #endif void handleUsbConnection() { #if defined(STM32) && !defined(SIMU) - if (!usbStarted() && usbPlugged()) { + + static bool _pluggedUsb = false; + + if (_pluggedUsb && !usbPlugged()) { + TRACE("USB unplugged"); + closeUsbMenu(); + _pluggedUsb = false; + } + else if (!_pluggedUsb && usbPlugged()) { + TRACE("USB plugged"); + _pluggedUsb = true; + _usbDisabled = false; + } + + if (!_usbDisabled && !usbStarted() && usbPlugged()) { + if (getSelectedUsbMode() == USB_UNSELECTED_MODE) { if (g_eeGeneral.USBMode == USB_UNSELECTED_MODE) { openUsbMenu(); @@ -423,7 +465,7 @@ void perMain() checkSpeakerVolume(); - if (!usbPlugged()) { + if (!usbPlugged() || (getSelectedUsbMode() == USB_UNSELECTED_MODE)) { checkEeprom(); logsWrite(); } @@ -458,14 +500,17 @@ void perMain() #endif #if defined(STM32) - if (!usbPlugged() && SD_CARD_PRESENT() && !sdMounted()) { + if ((!usbPlugged() || (getSelectedUsbMode() == USB_UNSELECTED_MODE)) + && SD_CARD_PRESENT() && !sdMounted()) { sdMount(); } #endif #if !defined(EEPROM) // In case the SD card is removed during the session - if (!usbPlugged() && !SD_CARD_PRESENT() && !globalData.unexpectedShutdown) { + if ((!usbPlugged() || (getSelectedUsbMode() == USB_UNSELECTED_MODE)) + && !SD_CARD_PRESENT() && !globalData.unexpectedShutdown) { + drawFatalErrorScreen(STR_NO_SDCARD); return; } diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 99278dc3d..710ac0a9b 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -2053,7 +2053,7 @@ uint32_t pwrCheck() #if defined(SHUTDOWN_CONFIRMATION) while (1) #else - while (usbPlugged() || + while ((usbPlugged() && getSelectedUsbMode() != USB_UNSELECTED_MODE) || (TELEMETRY_STREAMING() && !g_eeGeneral.disableRssiPoweroffAlarm)) #endif {