@@ -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);
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -186,6 +186,7 @@ enum ModuleIndex {
|
||||
INTERNAL_MODULE,
|
||||
EXTERNAL_MODULE,
|
||||
SPORT_MODULE,
|
||||
BOOTLOADER_MODULE,
|
||||
};
|
||||
enum TrainerMode {
|
||||
TRAINER_MODE_OFF,
|
||||
|
||||
@@ -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_
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 T>
|
||||
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<MultiDeviceFirmwareUpdate>(INTERNAL_MODULE);
|
||||
dialog->flash(getFullPath(name));
|
||||
});
|
||||
#endif
|
||||
menu->addLine(STR_FLASH_EXTERNAL_MULTI, [=]() {
|
||||
// TODO
|
||||
auto dialog = new FlashDialog<MultiDeviceFirmwareUpdate>(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<BootloaderDeviceFirmwareUpdate>(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<FrskyDeviceFirmwareUpdate>(SPORT_MODULE);
|
||||
dialog->flash(getFullPath(name));
|
||||
});
|
||||
}
|
||||
menu->addLine(STR_FLASH_INTERNAL_MODULE, [=]() {
|
||||
auto dialog = new FlashModuleDialog(INTERNAL_MODULE);
|
||||
auto dialog = new FlashDialog<FrskyDeviceFirmwareUpdate>(INTERNAL_MODULE);
|
||||
dialog->flash(getFullPath(name));
|
||||
});
|
||||
menu->addLine(STR_FLASH_EXTERNAL_MODULE, [=]() {
|
||||
auto dialog = new FlashModuleDialog(EXTERNAL_MODULE);
|
||||
auto dialog = new FlashDialog<FrskyDeviceFirmwareUpdate>(EXTERNAL_MODULE);
|
||||
dialog->flash(getFullPath(name));
|
||||
});
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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_
|
||||
@@ -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);
|
||||
|
||||
@@ -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_
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user