Reduce code repetition for sd browser firmware update handling, add some .frsk entries (#543)

* Hacky port of FRSKY_FIRMWARE_EXT update menu
More work is needed to integrate/test the remaining menu items
May just ba a matter of correct parameters for deviceFirmwareUpdate

* Functionalise, of sorts

* Formatting

* Functionalise more repeated update code
This commit is contained in:
Peter Feerick
2021-11-22 17:01:22 +11:00
committed by GitHub
parent 019a1584d0
commit 6e51c70aa7
3 changed files with 132 additions and 37 deletions
+118 -30
View File
@@ -229,7 +229,7 @@ void RadioSdManagerPage::build(FormWindow * window)
// sort directories and files
directories.sort(compare_nocase);
files.sort(compare_nocase);
for (auto name: directories) {
new SDmanagerButton(window, grid.getLabelSlot(), name, [=]() -> uint8_t {
std::string fullpath = currentPath + "/" + name;
@@ -260,26 +260,20 @@ void RadioSdManagerPage::build(FormWindow * window)
if (information.readMultiFirmwareInformation(name.c_str()) == nullptr) {
#if defined(INTERNAL_MODULE_MULTI)
menu->addLine(STR_FLASH_INTERNAL_MULTI, [=]() {
MultiDeviceFirmwareUpdate deviceFirmwareUpdate(
INTERNAL_MODULE, MULTI_TYPE_MULTIMODULE);
auto dialog = new FlashDialog<MultiDeviceFirmwareUpdate>(
deviceFirmwareUpdate);
dialog->flash(getFullPath(name));
MultiFirmwareUpdate(name, INTERNAL_MODULE,
MULTI_TYPE_MULTIMODULE);
});
#endif
menu->addLine(STR_FLASH_EXTERNAL_MULTI, [=]() {
MultiDeviceFirmwareUpdate deviceFirmwareUpdate(EXTERNAL_MODULE, MULTI_TYPE_MULTIMODULE);
auto dialog = new FlashDialog<MultiDeviceFirmwareUpdate>(deviceFirmwareUpdate);
dialog->flash(getFullPath(name));
MultiFirmwareUpdate(name, EXTERNAL_MODULE,
MULTI_TYPE_MULTIMODULE);
});
}
}
#endif
else if (!READ_ONLY() && !strcasecmp(ext, ELRS_FIRMWARE_EXT)) {
menu->addLine(STR_FLASH_EXTERNAL_ELRS, [=]() {
MultiDeviceFirmwareUpdate deviceFirmwareUpdate(EXTERNAL_MODULE, MULTI_TYPE_ELRS);
auto dialog = new FlashDialog<MultiDeviceFirmwareUpdate>(deviceFirmwareUpdate);
dialog->flash(getFullPath(name));
MultiFirmwareUpdate(name, EXTERNAL_MODULE, MULTI_TYPE_ELRS);
});
}
// else if (isExtensionMatching(ext, BITMAPS_EXT)) {
@@ -289,7 +283,7 @@ void RadioSdManagerPage::build(FormWindow * window)
menu->addLine(STR_VIEW_TEXT, [=]() {
static char lfn[FF_MAX_LFN + 1]; // TODO optimize that!
f_getcwd((TCHAR *)lfn, FF_MAX_LFN);
auto textView = new ViewTextWindow(lfn, name);
textView->setCloseHandler([=]() {
//window->clear();
@@ -300,34 +294,101 @@ void RadioSdManagerPage::build(FormWindow * window)
if (!READ_ONLY() && !strcasecmp(ext, FIRMWARE_EXT)) {
if (isBootloader(name.c_str())) {
menu->addLine(STR_FLASH_BOOTLOADER, [=]() {
BootloaderFirmwareUpdate bootloaderFirmwareUpdate;
auto dialog = new FlashDialog<BootloaderFirmwareUpdate>(
bootloaderFirmwareUpdate);
dialog->flash(getFullPath(name));
TRACE("### finished flashing ###");
BootloaderUpdate(name);
});
}
} else if (!READ_ONLY() && !strcasecmp(ext, SPORT_FIRMWARE_EXT)) {
if (HAS_SPORT_UPDATE_CONNECTOR()) {
menu->addLine(STR_FLASH_EXTERNAL_DEVICE, [=]() {
FrskyDeviceFirmwareUpdate deviceFirmwareUpdate(SPORT_MODULE);
auto dialog = new FlashDialog<FrskyDeviceFirmwareUpdate>(
deviceFirmwareUpdate);
dialog->flash(getFullPath(name));
FrSkyFirmwareUpdate(name, SPORT_MODULE);
});
}
menu->addLine(STR_FLASH_INTERNAL_MODULE, [=]() {
FrskyDeviceFirmwareUpdate deviceFirmwareUpdate(INTERNAL_MODULE);
auto dialog = new FlashDialog<FrskyDeviceFirmwareUpdate>(
deviceFirmwareUpdate);
dialog->flash(getFullPath(name));
FrSkyFirmwareUpdate(name, INTERNAL_MODULE);
});
menu->addLine(STR_FLASH_EXTERNAL_MODULE, [=]() {
FrskyDeviceFirmwareUpdate deviceFirmwareUpdate(EXTERNAL_MODULE);
auto dialog = new FlashDialog<FrskyDeviceFirmwareUpdate>(
deviceFirmwareUpdate);
dialog->flash(getFullPath(name));
FrSkyFirmwareUpdate(name, EXTERNAL_MODULE);
});
} else if (!READ_ONLY() && !strcasecmp(ext, FRSKY_FIRMWARE_EXT)) {
FrSkyFirmwareInformation information;
if (readFrSkyFirmwareInformation(getFullPath(name),
information) == nullptr) {
#if defined(INTERNAL_MODULE_PXX1) || defined(INTERNAL_MODULE_PXX2)
menu->addLine(STR_FLASH_INTERNAL_MODULE, [=]() {
FrSkyFirmwareUpdate(name, INTERNAL_MODULE);
});
#endif
if (information.productFamily ==
FIRMWARE_FAMILY_EXTERNAL_MODULE) {
menu->addLine(STR_FLASH_EXTERNAL_MODULE, [=]() {
FrSkyFirmwareUpdate(name, EXTERNAL_MODULE);
});
}
if (information.productFamily == FIRMWARE_FAMILY_RECEIVER ||
information.productFamily == FIRMWARE_FAMILY_SENSOR) {
if (HAS_SPORT_UPDATE_CONNECTOR()) {
menu->addLine(STR_FLASH_EXTERNAL_DEVICE, [=]() {
FrSkyFirmwareUpdate(name, SPORT_MODULE);
});
} else {
menu->addLine(STR_FLASH_EXTERNAL_MODULE, [=]() {
FrSkyFirmwareUpdate(name, EXTERNAL_MODULE);
});
}
}
// TODO: Integrate the remaining options
#if 0
#if defined(PXX2)
if (information.productFamily == FIRMWARE_FAMILY_RECEIVER) {
if (isReceiverOTAEnabledFromModule(INTERNAL_MODULE,
information.productId))
menu->addLine(
STR_FLASH_RECEIVER_BY_INTERNAL_MODULE_OTA, [=]() {
FrSkyFirmwareUpdate(name, INTERNAL_MODULE_OTA);
});
if (isReceiverOTAEnabledFromModule(EXTERNAL_MODULE,
information.productId))
menu->addLine(
STR_FLASH_RECEIVER_BY_EXTERNAL_MODULE_OTA, [=]() {
FrSkyFirmwareUpdate(name, EXTERNAL_MODULE_OTA);
});
}
if (information.productFamily ==
FIRMWARE_FAMILY_FLIGHT_CONTROLLER) {
menu->addLine(
STR_FLASH_FLIGHT_CONTROLLER_BY_INTERNAL_MODULE_OTA,
[=]() {
FrSkyFirmwareUpdate(
name,
STR_FLASH_FLIGHT_CONTROLLER_BY_INTERNAL_MODULE_OTA);
});
menu->addLine(
STR_FLASH_FLIGHT_CONTROLLER_BY_EXTERNAL_MODULE_OTA,
[=]() {
FrSkyFirmwareUpdate(
name,
STR_FLASH_FLIGHT_CONTROLLER_BY_INTERNAL_MODULE_OTA);
});
}
#endif
#if defined(BLUETOOTH)
if (information.productFamily ==
FIRMWARE_FAMILY_BLUETOOTH_CHIP) {
menu->addLine(STR_FLASH_BLUETOOTH_MODULE, [=]() {
FrSkyFirmwareUpdate(name, STR_FLASH_BLUETOOTH_MODULE);
});
}
#endif
#if defined(HARDWARE_POWER_MANAGEMENT_UNIT)
if (information.productFamily ==
FIRMWARE_FAMILY_POWER_MANAGEMENT_UNIT) {
menu->addLine(STR_FLASH_POWER_MANAGEMENT_UNIT, [=]() {
FrSkyFirmwareUpdate(name, STR_FLASH_POWER_MANAGEMENT_UNIT);
});
}
#endif
#endif
}
}
#if defined(LUA)
else if (isExtensionMatching(ext, SCRIPTS_EXT)) {
@@ -390,6 +451,33 @@ void RadioSdManagerPage::build(FormWindow * window)
preview->setHeight(max(window->height(), grid.getWindowHeight()));
}
void RadioSdManagerPage::BootloaderUpdate(const std::string name)
{
BootloaderFirmwareUpdate bootloaderFirmwareUpdate;
auto dialog =
new FlashDialog<BootloaderFirmwareUpdate>(bootloaderFirmwareUpdate);
dialog->flash(getFullPath(name));
}
void RadioSdManagerPage::FrSkyFirmwareUpdate(const std::string name,
ModuleIndex module)
{
FrskyDeviceFirmwareUpdate deviceFirmwareUpdate(module);
auto dialog =
new FlashDialog<FrskyDeviceFirmwareUpdate>(deviceFirmwareUpdate);
dialog->flash(getFullPath(name));
}
void RadioSdManagerPage::MultiFirmwareUpdate(const std::string name,
ModuleIndex module,
MultiModuleType type)
{
MultiDeviceFirmwareUpdate deviceFirmwareUpdate(module, type);
auto dialog =
new FlashDialog<MultiDeviceFirmwareUpdate>(deviceFirmwareUpdate);
dialog->flash(getFullPath(name));
}
#if 0
bool menuRadioSdManagerInfo(event_t event)
{
+13 -6
View File
@@ -19,14 +19,21 @@
* GNU General Public License for more details.
*/
#include "dataconstants.h"
#include "tabsgroup.h"
enum MultiModuleType : short;
class RadioSdManagerPage: public PageTab {
public:
RadioSdManagerPage();
class RadioSdManagerPage : public PageTab
{
public:
RadioSdManagerPage();
void build(FormWindow * window) override;
void build(FormWindow* window) override;
protected:
void rebuild(FormWindow * window);
protected:
void BootloaderUpdate(const std::string name);
void FrSkyFirmwareUpdate(const std::string name, ModuleIndex module);
void MultiFirmwareUpdate(const std::string name, ModuleIndex module,
MultiModuleType type);
void rebuild(FormWindow* window);
};
+1 -1
View File
@@ -104,7 +104,7 @@ class MultiFirmwareInformation
const char * readV2Signature(const char * buffer);
};
enum MultiModuleType
enum MultiModuleType : short
{
MULTI_TYPE_MULTIMODULE = 0,
MULTI_TYPE_ELRS,