From f03429f49e0d89c14502f948797d4223937c789a Mon Sep 17 00:00:00 2001 From: 3djc Date: Wed, 18 Mar 2020 17:47:32 +0100 Subject: [PATCH] More work on 2.4 sdmanager (#7445) SD Manager continued --- radio/src/bluetooth.cpp | 3 +- radio/src/curves.cpp | 4 +- radio/src/dataconstants.h | 1 + radio/src/gui/colorlcd/libopenui.h | 28 +++++++- radio/src/gui/colorlcd/menus.h | 3 - radio/src/gui/colorlcd/message_dialog.cpp | 5 +- radio/src/gui/colorlcd/message_dialog.h | 12 +++- radio/src/gui/colorlcd/radio_sdmanager.cpp | 30 +++++--- radio/src/gui/common/stdlcd/popups.h | 24 ++++--- .../src/gui/common/stdlcd/radio_sdmanager.cpp | 10 ++- radio/src/io/bootloader_flash.cpp | 11 +-- radio/src/io/bootloader_flash.h | 40 +++++++++++ radio/src/io/frsky_firmware_update.cpp | 6 +- radio/src/io/frsky_sport.h | 5 -- radio/src/io/multi_firmware_update.cpp | 71 +++++++++---------- radio/src/io/multi_firmware_update.h | 13 +++- radio/src/opentx.cpp | 5 +- radio/src/pulses/pxx2.cpp | 3 +- radio/src/telemetry/telemetry.cpp | 4 +- 19 files changed, 180 insertions(+), 98 deletions(-) create mode 100644 radio/src/io/bootloader_flash.h diff --git a/radio/src/bluetooth.cpp b/radio/src/bluetooth.cpp index edf18eb05..b2c02f7d4 100644 --- a/radio/src/bluetooth.cpp +++ b/radio/src/bluetooth.cpp @@ -779,8 +779,7 @@ const char * Bluetooth::flashFirmware(const char * filename, ProgressHandler pro BACKLIGHT_ENABLE(); if (result) { - POPUP_WARNING(STR_FIRMWARE_UPDATE_ERROR); - SET_WARNING_INFO(result, strlen(result), 0); + POPUP_WARNING(STR_FIRMWARE_UPDATE_ERROR, result); } else { POPUP_INFORMATION(STR_FIRMWARE_UPDATE_SUCCESS); diff --git a/radio/src/curves.cpp b/radio/src/curves.cpp index ee23e2212..81b1fd987 100644 --- a/radio/src/curves.cpp +++ b/radio/src/curves.cpp @@ -53,9 +53,7 @@ void loadCurves() } if (showWarning) { - POPUP_WARNING("Invalid curve data repaired"); - const char * w = "check your curves, logic switches"; - SET_WARNING_INFO(w, strlen(w), 0); + POPUP_WARNING("Invalid curve data repaired", "check your curves, logic switches"); } } diff --git a/radio/src/dataconstants.h b/radio/src/dataconstants.h index 0ff525398..d34be3eed 100644 --- a/radio/src/dataconstants.h +++ b/radio/src/dataconstants.h @@ -186,6 +186,7 @@ enum ModuleIndex { INTERNAL_MODULE, EXTERNAL_MODULE, SPORT_MODULE, + BOOTLOADER_MODULE, }; enum TrainerMode { TRAINER_MODE_OFF, diff --git a/radio/src/gui/colorlcd/libopenui.h b/radio/src/gui/colorlcd/libopenui.h index 513d91277..b9be46e9a 100644 --- a/radio/src/gui/colorlcd/libopenui.h +++ b/radio/src/gui/colorlcd/libopenui.h @@ -56,9 +56,33 @@ #include "coloredit.h" #include "draw_functions.h" -inline void POPUP_INFORMATION(const char * str) +inline MessageDialog * createPopupInformation(const char * message) { - new MessageDialog(&mainWindow, "Message", str); + return new MessageDialog(&mainWindow, "Message", message); +} + +inline MessageDialog * createPopupWarning(const char * message) +{ + return new MessageDialog(&mainWindow, "Warning", message); +} + +inline void POPUP_INFORMATION(const char * message) +{ + auto popup = createPopupInformation(message); + while (popup->getParent()) { + mainWindow.run(false); + } +} + +inline void POPUP_WARNING(const char * message, const char * info = nullptr) +{ + auto popup = createPopupWarning(message); + if (info) { + popup->setInfoText(std::string(info)); + } + while (popup->getParent()) { + mainWindow.run(false); + } } #endif // _LIBOPENUI_H_ diff --git a/radio/src/gui/colorlcd/menus.h b/radio/src/gui/colorlcd/menus.h index 289019dd1..3739d052f 100644 --- a/radio/src/gui/colorlcd/menus.h +++ b/radio/src/gui/colorlcd/menus.h @@ -322,10 +322,7 @@ extern void (* popupFunc)(event_t event); extern uint8_t warningInfoFlags; #define DISPLAY_WARNING(evt) (*popupFunc)(evt) -#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) - #define POPUP_MENU_MAX_LINES 12 #define MENU_MAX_DISPLAY_LINES 9 #define MENU_LINE_LENGTH (LEN_MODEL_NAME+12) diff --git a/radio/src/gui/colorlcd/message_dialog.cpp b/radio/src/gui/colorlcd/message_dialog.cpp index 56550d433..3b26161f0 100644 --- a/radio/src/gui/colorlcd/message_dialog.cpp +++ b/radio/src/gui/colorlcd/message_dialog.cpp @@ -20,10 +20,11 @@ #include "message_dialog.h" #include "static.h" -MessageDialog::MessageDialog(Window * parent, const char * title, const char * message): +MessageDialog::MessageDialog(Window * parent, const char * title, const char * message, const char * info): Dialog(parent, title, {50, 73, LCD_W - 100, LCD_H - 146}) { - new StaticText(this, {0, coord_t(height() - PAGE_LINE_HEIGHT) / 2, width(), PAGE_LINE_HEIGHT}, message, 0, CENTERED); + messageWidget = new StaticText(this, {0, coord_t(height() - PAGE_LINE_HEIGHT) / 2, width(), PAGE_LINE_HEIGHT}, message, 0, CENTERED); + infoWidget = new StaticText(this, {0, 30 + coord_t(height() - PAGE_LINE_HEIGHT) / 2, width(), PAGE_LINE_HEIGHT}, info, 0, CENTERED); } #if defined(HARDWARE_KEYS) diff --git a/radio/src/gui/colorlcd/message_dialog.h b/radio/src/gui/colorlcd/message_dialog.h index 09666834f..f2429638c 100644 --- a/radio/src/gui/colorlcd/message_dialog.h +++ b/radio/src/gui/colorlcd/message_dialog.h @@ -21,10 +21,20 @@ #define _MESSAGE_DIALOG_H_ #include "dialog.h" +#include "static.h" class MessageDialog: public Dialog { public: - MessageDialog(Window * parent, const char * title, const char * message); + MessageDialog(Window * parent, const char * title, const char * message, const char * info = ""); + + void setInfoText(std::string text) + { + infoWidget->setText(std::move(text)); + } + + protected: + StaticText * messageWidget; + StaticText * infoWidget; #if defined(HARDWARE_KEYS) void onEvent(event_t event) override; diff --git a/radio/src/gui/colorlcd/radio_sdmanager.cpp b/radio/src/gui/colorlcd/radio_sdmanager.cpp index cc511e32a..792f0ff02 100644 --- a/radio/src/gui/colorlcd/radio_sdmanager.cpp +++ b/radio/src/gui/colorlcd/radio_sdmanager.cpp @@ -23,6 +23,7 @@ #include "libopenui.h" #include "io/frsky_firmware_update.h" #include "io/multi_firmware_update.h" +#include "io/bootloader_flash.h" RadioSdManagerPage::RadioSdManagerPage() : PageTab(SD_IS_HC() ? STR_SDHC_CARD : STR_SD_CARD, ICON_RADIO_SD_MANAGER) @@ -86,16 +87,22 @@ class FilePreview : public Window BitmapBuffer *bitmap = nullptr; }; -class FlashModuleDialog: public FullScreenDialog +template +class FlashDialog: public FullScreenDialog { public: - explicit FlashModuleDialog(ModuleIndex module): + explicit FlashDialog(ModuleIndex module): FullScreenDialog(WARNING_TYPE_INFO, "Flash device"), device(module), - progress(this, {100, 100, 100, 15}) + progress(this, {LCD_W / 2 - 50, LCD_H / 2, 100, 15}) { } + ~FlashDialog() override + { + progress.detach(); + } + void flash(const char * filename) { device.flashFirmware(filename, [=](const char * title, const char * message, int count, int total) -> void { @@ -107,7 +114,7 @@ class FlashModuleDialog: public FullScreenDialog } protected: - FrskyDeviceFirmwareUpdate device; + T device; Progress progress; }; @@ -175,11 +182,13 @@ void RadioSdManagerPage::build(FormWindow * window) if (information.readMultiFirmwareInformation(name.data()) == nullptr) { #if defined(INTERNAL_MODULE_MULTI) menu->addLine(STR_FLASH_INTERNAL_MULTI, [=]() { - // TODO + auto dialog = new FlashDialog(INTERNAL_MODULE); + dialog->flash(getFullPath(name)); }); #endif menu->addLine(STR_FLASH_EXTERNAL_MULTI, [=]() { - // TODO + auto dialog = new FlashDialog(EXTERNAL_MODULE); + dialog->flash(getFullPath(name)); }); } } @@ -195,23 +204,24 @@ void RadioSdManagerPage::build(FormWindow * window) if (!READ_ONLY() && !strcasecmp(ext, FIRMWARE_EXT)) { if (isBootloader(name.data())) { menu->addLine(STR_FLASH_BOOTLOADER, [=]() { - // TODO + auto dialog = new FlashDialog(BOOTLOADER_MODULE); + dialog->flash(getFullPath(name)); }); } } else if (!READ_ONLY() && !strcasecmp(ext, SPORT_FIRMWARE_EXT)) { if (HAS_SPORT_UPDATE_CONNECTOR()) { menu->addLine(STR_FLASH_EXTERNAL_DEVICE, [=]() { - auto dialog = new FlashModuleDialog(SPORT_MODULE); + auto dialog = new FlashDialog(SPORT_MODULE); dialog->flash(getFullPath(name)); }); } menu->addLine(STR_FLASH_INTERNAL_MODULE, [=]() { - auto dialog = new FlashModuleDialog(INTERNAL_MODULE); + auto dialog = new FlashDialog(INTERNAL_MODULE); dialog->flash(getFullPath(name)); }); menu->addLine(STR_FLASH_EXTERNAL_MODULE, [=]() { - auto dialog = new FlashModuleDialog(EXTERNAL_MODULE); + auto dialog = new FlashDialog(EXTERNAL_MODULE); dialog->flash(getFullPath(name)); }); } diff --git a/radio/src/gui/common/stdlcd/popups.h b/radio/src/gui/common/stdlcd/popups.h index 81fe81466..2aea293d6 100644 --- a/radio/src/gui/common/stdlcd/popups.h +++ b/radio/src/gui/common/stdlcd/popups.h @@ -73,7 +73,7 @@ enum #if !defined(GUI) #define DISPLAY_WARNING(...) inline void POPUP_WAIT(const char * s) { } - inline void POPUP_WARNING(const char * s) { } + inline void POPUP_WARNING(const char *, const char * = nullptr) { } inline void POPUP_CONFIRMATION(const char * s, PopupMenuHandler handler) { } inline void POPUP_INPUT(const char * s, PopupFunc func) { } inline void SET_WARNING_INFO(const char * info, uint8_t length, uint8_t flags) { } @@ -103,14 +103,23 @@ enum popupFunc = runPopupWarning; } - inline void POPUP_WARNING(const char * s) + inline void POPUP_WARNING(const char * message, const char * info = nullptr) { - warningText = s; - warningInfoText = nullptr; + warningText = message; + warningInfoText = info; + warningInfoLength = strlen(info); + warningInfoFlags = 0; warningType = WARNING_TYPE_ASTERISK; popupFunc = runPopupWarning; } + inline void SET_WARNING_INFO(const char * info, uint8_t length, uint8_t flags) + { + warningInfoText = info; + warningInfoLength = length; + warningInfoFlags = flags; + } + inline void POPUP_CONFIRMATION(const char * s, PopupMenuHandler handler) { if (s != warningText) { @@ -131,13 +140,6 @@ enum popupFunc = func; } - inline void SET_WARNING_INFO(const char * info, uint8_t length, uint8_t flags) - { - warningInfoText = info; - warningInfoLength = length; - warningInfoFlags = flags; - } - inline bool isEventCaughtByPopup() { if (warningText && warningType != WARNING_TYPE_WAIT) diff --git a/radio/src/gui/common/stdlcd/radio_sdmanager.cpp b/radio/src/gui/common/stdlcd/radio_sdmanager.cpp index 605f81635..f47f967d6 100644 --- a/radio/src/gui/common/stdlcd/radio_sdmanager.cpp +++ b/radio/src/gui/common/stdlcd/radio_sdmanager.cpp @@ -21,6 +21,7 @@ #include "opentx.h" #include "io/frsky_firmware_update.h" #include "io/multi_firmware_update.h" +#include "io/bootloader_flash.h" #include "libopenui/src/libopenui_file.h" #define NODE_TYPE(fname) fname[SD_SCREEN_FILE_LENGTH+1] @@ -203,7 +204,8 @@ void onSdManagerMenu(const char * result) #if defined(PCBTARANIS) else if (result == STR_FLASH_BOOTLOADER) { getSelectionFullPath(lfn); - bootloaderFlash(lfn); + BootloaderDeviceFirmwareUpdate device(BOOTLOADER_MODULE); + device.flashFirmware(lfn, drawProgressScreen); } else if (result == STR_FLASH_INTERNAL_MODULE) { getSelectionFullPath(lfn); @@ -225,12 +227,14 @@ void onSdManagerMenu(const char * result) #if defined(INTERNAL_MODULE_MULTI) else if (result == STR_FLASH_INTERNAL_MULTI) { getSelectionFullPath(lfn); - multiFlashFirmware(INTERNAL_MODULE, lfn); + MultiDeviceFirmwareUpdate device(INTERNAL_MODULE); + device.flashFirmware(lfn, drawProgressScreen); } #endif else if (result == STR_FLASH_EXTERNAL_MULTI) { getSelectionFullPath(lfn); - multiFlashFirmware(EXTERNAL_MODULE, lfn); + MultiDeviceFirmwareUpdate device(EXTERNAL_MODULE); + device.flashFirmware(lfn, drawProgressScreen); } #endif #if defined(BLUETOOTH) diff --git a/radio/src/io/bootloader_flash.cpp b/radio/src/io/bootloader_flash.cpp index 5be24b373..baf79d657 100644 --- a/radio/src/io/bootloader_flash.cpp +++ b/radio/src/io/bootloader_flash.cpp @@ -19,6 +19,7 @@ */ #include "opentx.h" +#include "bootloader_flash.h" bool isBootloader(const char * filename) { @@ -34,7 +35,7 @@ bool isBootloader(const char * filename) return isBootloaderStart(buffer); } -void bootloaderFlash(const char * filename) +void BootloaderDeviceFirmwareUpdate::flashFirmware(const char *filename, ProgressHandler progressHandler) { FIL file; uint8_t buffer[1024]; @@ -63,9 +64,9 @@ void bootloaderFlash(const char * filename) for (int j = 0; j < 1024; j += FLASH_PAGESIZE) { flashWrite(CONVERT_UINT_PTR(FIRMWARE_ADDRESS + i + j), CONVERT_UINT_PTR(buffer + j)); } -#if !defined(COLORLCD) - drawProgressScreen("Bootloader", STR_WRITING, i, BOOTLOADER_SIZE); -#endif + + progressHandler("Bootloader", STR_WRITING, i, BOOTLOADER_SIZE); + #if defined(SIMU) // add an artificial delay and check for simu quit if (SIMU_SLEEP_OR_EXIT_MS(30)) @@ -73,6 +74,8 @@ void bootloaderFlash(const char * filename) #endif } + POPUP_INFORMATION(STR_FIRMWARE_UPDATE_SUCCESS); + watchdogSuspend(0); WDG_RESET(); diff --git a/radio/src/io/bootloader_flash.h b/radio/src/io/bootloader_flash.h new file mode 100644 index 000000000..45ad75d6f --- /dev/null +++ b/radio/src/io/bootloader_flash.h @@ -0,0 +1,40 @@ +/* + * 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 _BOOTLOADER_FLASH_H_ +#define _BOOTLOADER_FLASH_H_ + +bool isBootloader(const char * filename); + +class BootloaderDeviceFirmwareUpdate +{ + public: + explicit BootloaderDeviceFirmwareUpdate(ModuleIndex module): + module(module) + { + } + + void flashFirmware(const char * filename, ProgressHandler progressHandler); + + protected: + ModuleIndex module; +}; + +#endif // _BOOTLOADER_FLASH_H_ diff --git a/radio/src/io/frsky_firmware_update.cpp b/radio/src/io/frsky_firmware_update.cpp index 23df6cb52..da500b07d 100644 --- a/radio/src/io/frsky_firmware_update.cpp +++ b/radio/src/io/frsky_firmware_update.cpp @@ -503,8 +503,7 @@ const char * FrskyDeviceFirmwareUpdate::flashFirmware(const char * filename, Pro BACKLIGHT_ENABLE(); if (result) { - POPUP_WARNING(STR_FIRMWARE_UPDATE_ERROR); - SET_WARNING_INFO(result, strlen(result), 0); + POPUP_WARNING(STR_FIRMWARE_UPDATE_ERROR, result); } else { POPUP_INFORMATION(STR_FIRMWARE_UPDATE_SUCCESS); @@ -775,8 +774,7 @@ const char * FrskyChipFirmwareUpdate::flashFirmware(const char * filename, Progr BACKLIGHT_ENABLE(); if (result) { - POPUP_WARNING(STR_FIRMWARE_UPDATE_ERROR); - SET_WARNING_INFO(result, strlen(result), 0); + POPUP_WARNING(STR_FIRMWARE_UPDATE_ERROR, result); } else { POPUP_INFORMATION(STR_FIRMWARE_UPDATE_SUCCESS); diff --git a/radio/src/io/frsky_sport.h b/radio/src/io/frsky_sport.h index 10a72af96..dd5e0335d 100644 --- a/radio/src/io/frsky_sport.h +++ b/radio/src/io/frsky_sport.h @@ -34,9 +34,4 @@ PACK(union SportTelemetryPacket uint8_t raw[8]; }); -#if defined(STM32) -bool isBootloader(const char * filename); -void bootloaderFlash(const char * filename); -#endif - #endif // _IO_FRSKY_SPORT_H_ diff --git a/radio/src/io/multi_firmware_update.cpp b/radio/src/io/multi_firmware_update.cpp index b2eafab1c..f2d05e6d3 100644 --- a/radio/src/io/multi_firmware_update.cpp +++ b/radio/src/io/multi_firmware_update.cpp @@ -30,7 +30,7 @@ class MultiFirmwareUpdateDriver { public: MultiFirmwareUpdateDriver() {} - const char* flashFirmware(FIL* file, const char* label) const; + const char * flashFirmware(FIL * file, const char * label, ProgressHandler progressHandler) const; protected: virtual void moduleOn() const = 0; @@ -289,9 +289,18 @@ void MultiFirmwareUpdateDriver::leaveProgMode(bool inverted) const deinit(inverted); } -const char * MultiFirmwareUpdateDriver::flashFirmware(FIL* file, const char* label) const +const char * MultiFirmwareUpdateDriver::flashFirmware(FIL * file, const char * label, ProgressHandler progressHandler) const { - const char* result = nullptr; +#if defined(SIMU) + for (uint16_t i = 0; i < 100; i++) { + progressHandler(label, STR_WRITING, i, 100); + if (SIMU_SLEEP_OR_EXIT_MS(30)) + break; + } + return nullptr; +#endif + + const char * result = nullptr; moduleOn(); bool inverted = true; //false; // true @@ -329,12 +338,7 @@ const char * MultiFirmwareUpdateDriver::flashFirmware(FIL* file, const char* lab } while (!f_eof(file)) { - -#if defined(COLORLCD) -#warning "TODO drawProgressScreen" -#else - drawProgressScreen(label, STR_WRITING, file->fptr, file->obj.objsize); -#endif + progressHandler(label, STR_WRITING, file->fptr, file->obj.objsize); UINT count=0; memclear(buffer, pageSize); @@ -362,11 +366,7 @@ const char * MultiFirmwareUpdateDriver::flashFirmware(FIL* file, const char* lab } if (f_eof(file)) { -#if defined(COLORLCD) -#warning "TODO drawProgressScreen" -#else - drawProgressScreen(label, STR_WRITING, file->fptr, file->obj.objsize); -#endif + progressHandler(label, STR_WRITING, file->fptr, file->obj.objsize); } leaveProgMode(inverted); @@ -392,24 +392,24 @@ const char * MultiFirmwareInformation::readV1Signature(const char * buffer) else return "Wrong format"; - if(buffer[MULTI_SIGN_BOOTLOADER_SUPPORT_OFFSET] == 'b') + if (buffer[MULTI_SIGN_BOOTLOADER_SUPPORT_OFFSET] == 'b') optibootSupport = true; else optibootSupport = false; - if(buffer[MULTI_SIGN_BOOTLOADER_CHECK_OFFSET] == 'c') + if (buffer[MULTI_SIGN_BOOTLOADER_CHECK_OFFSET] == 'c') bootloaderCheck = true; else bootloaderCheck = false; - if(buffer[MULTI_SIGN_TELEM_TYPE_OFFSET] == 't') + if (buffer[MULTI_SIGN_TELEM_TYPE_OFFSET] == 't') telemetryType = FIRMWARE_MULTI_TELEM_MULTI_STATUS; else if (buffer[MULTI_SIGN_TELEM_TYPE_OFFSET] == 's') telemetryType = FIRMWARE_MULTI_TELEM_MULTI_TELEMETRY; else telemetryType = FIRMWARE_MULTI_TELEM_NONE; - if(buffer[MULTI_SIGN_TELEM_INVERSION_OFFSET] == 'i') + if (buffer[MULTI_SIGN_TELEM_INVERSION_OFFSET] == 'i') telemetryInversion = true; else telemetryInversion = false; @@ -486,7 +486,7 @@ const char * MultiFirmwareInformation::readMultiFirmwareInformation(FIL * file) return readV1Signature(buffer); } -bool multiFlashFirmware(uint8_t moduleIdx, const char * filename) +bool MultiDeviceFirmwareUpdate::flashFirmware(const char * filename, ProgressHandler progressHandler) { FIL file; @@ -503,26 +503,24 @@ bool multiFlashFirmware(uint8_t moduleIdx, const char * filename) } f_lseek(&file, 0); - if (moduleIdx == EXTERNAL_MODULE) { + if (module == EXTERNAL_MODULE) { if (!firmwareFile.isMultiExternalFirmware()) { f_close(&file); - POPUP_WARNING(STR_NEEDS_FILE); - SET_WARNING_INFO(STR_EXT_MULTI_SPEC, strlen(STR_EXT_MULTI_SPEC), 0); + POPUP_WARNING(STR_NEEDS_FILE, STR_EXT_MULTI_SPEC); return false; } } else { if (!firmwareFile.isMultiInternalFirmware()) { f_close(&file); - POPUP_WARNING(STR_NEEDS_FILE); - SET_WARNING_INFO(STR_INT_MULTI_SPEC, strlen(STR_INT_MULTI_SPEC), 0); + POPUP_WARNING(STR_NEEDS_FILE, STR_INT_MULTI_SPEC); return false; } } const MultiFirmwareUpdateDriver* driver = &multiExternalUpdateDriver; #if defined(INTERNAL_MODULE_MULTI) - if (moduleIdx == INTERNAL_MODULE) + if (module == INTERNAL_MODULE) driver = &multiInternalUpdateDriver; #endif @@ -539,30 +537,18 @@ bool multiFlashFirmware(uint8_t moduleIdx, const char * filename) uint8_t spuPwr = IS_SPORT_UPDATE_POWER_ON(); SPORT_UPDATE_POWER_OFF(); -#if defined(COLORLCD) -#warning "TODO drawProgressScreen" -#else - drawProgressScreen(getBasename(filename), STR_DEVICE_RESET, 0, 0); -#endif + progressHandler(getBasename(filename), STR_DEVICE_RESET, 0, 0); /* wait 2s off */ watchdogSuspend(500 /*5s*/); RTOS_WAIT_MS(3000); - const char * result = driver->flashFirmware(&file, getBasename(filename)); + const char * result = driver->flashFirmware(&file, getBasename(filename), progressHandler); f_close(&file); AUDIO_PLAY(AU_SPECIAL_SOUND_BEEP1 ); BACKLIGHT_ENABLE(); - if (result) { - POPUP_WARNING(STR_FIRMWARE_UPDATE_ERROR); - SET_WARNING_INFO(result, strlen(result), 0); - } - else { - POPUP_INFORMATION(STR_FIRMWARE_UPDATE_SUCCESS); - } - #if defined(HARDWARE_INTERNAL_MODULE) INTERNAL_MODULE_OFF(); #endif @@ -573,6 +559,13 @@ bool multiFlashFirmware(uint8_t moduleIdx, const char * filename) watchdogSuspend(500 /*5s*/); RTOS_WAIT_MS(2000); + if (result) { + POPUP_WARNING(STR_FIRMWARE_UPDATE_ERROR, result); + } + else { + POPUP_INFORMATION(STR_FIRMWARE_UPDATE_SUCCESS); + } + // reset telemetry protocol telemetryInit(255); diff --git a/radio/src/io/multi_firmware_update.h b/radio/src/io/multi_firmware_update.h index a4ad7156f..5d467451d 100644 --- a/radio/src/io/multi_firmware_update.h +++ b/radio/src/io/multi_firmware_update.h @@ -101,6 +101,17 @@ class MultiFirmwareInformation { const char * readV2Signature(const char * buffer); }; -bool multiFlashFirmware(uint8_t module, const char * filename); +class MultiDeviceFirmwareUpdate { + public: + explicit MultiDeviceFirmwareUpdate(ModuleIndex module): + module(module) + { + } + + bool flashFirmware(const char * filename, ProgressHandler progressHandler); + + protected: + ModuleIndex module; +}; #endif //OPENTX_MULTI_FIRMWARE_H diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 9e41bc5f2..cfaa469b0 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -439,9 +439,8 @@ void checkModelIdUnique(uint8_t index, uint8_t module) strAppend(name, ")"); } - if (reusableBuffer.moduleSetup.msg[0] != '\0') { - POPUP_WARNING(STR_MODELIDUSED); - SET_WARNING_INFO(reusableBuffer.moduleSetup.msg, sizeof(reusableBuffer.moduleSetup.msg), 0); + if (reusableBuffer.moduleSetup.msg[0]) { + POPUP_WARNING(STR_MODELIDUSED, reusableBuffer.moduleSetup.msg); } } diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index bdf066a19..0febbe6fe 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -546,8 +546,7 @@ void Pxx2OtaUpdate::flashFirmware(const char * filename, ProgressHandler progres BACKLIGHT_ENABLE(); if (result) { - POPUP_WARNING(STR_FIRMWARE_UPDATE_ERROR); - SET_WARNING_INFO(result, strlen(result), 0); + POPUP_WARNING(STR_FIRMWARE_UPDATE_ERROR, result); } else { POPUP_INFORMATION(STR_FIRMWARE_UPDATE_SUCCESS); diff --git a/radio/src/telemetry/telemetry.cpp b/radio/src/telemetry/telemetry.cpp index ec76c09f2..9da862a54 100644 --- a/radio/src/telemetry/telemetry.cpp +++ b/radio/src/telemetry/telemetry.cpp @@ -179,9 +179,7 @@ void telemetryWakeup() #if defined(PCBFRSKY) if (isBadAntennaDetected()) { AUDIO_RAS_RED(); - POPUP_WARNING(STR_WARNING); - const char * w = STR_ANTENNAPROBLEM; - SET_WARNING_INFO(w, strlen(w), 0); + POPUP_WARNING(STR_WARNING, STR_ANTENNAPROBLEM); SCHEDULE_NEXT_ALARMS_CHECK(10/*seconds*/); } #endif