More work on 2.4 sdmanager (#7445)

SD Manager continued
This commit is contained in:
3djc
2020-03-18 17:47:32 +01:00
committed by GitHub
parent 1d96af49c4
commit f03429f49e
19 changed files with 180 additions and 98 deletions
+1 -2
View File
@@ -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);
+1 -3
View File
@@ -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");
}
}
+1
View File
@@ -186,6 +186,7 @@ enum ModuleIndex {
INTERNAL_MODULE,
EXTERNAL_MODULE,
SPORT_MODULE,
BOOTLOADER_MODULE,
};
enum TrainerMode {
TRAINER_MODE_OFF,
+26 -2
View File
@@ -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_
-3
View File
@@ -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)
+3 -2
View File
@@ -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)
+11 -1
View File
@@ -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;
+20 -10
View File
@@ -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));
});
}
+13 -11
View File
@@ -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)
+7 -4
View File
@@ -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();
+40
View File
@@ -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_
+2 -4
View File
@@ -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);
-5
View File
@@ -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_
+32 -39
View File
@@ -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);
+12 -1
View File
@@ -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
+2 -3
View File
@@ -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);
}
}
+1 -2
View File
@@ -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);
+1 -3
View File
@@ -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