From a59d9515d912b6b39fc69a4798e9bd53939ba7d2 Mon Sep 17 00:00:00 2001 From: philmoz Date: Tue, 25 Nov 2025 14:18:44 +1100 Subject: [PATCH] fix(color): new model may not load radio info and date/time widgets (#6825) --- radio/src/datastructs_model.cpp | 2 +- radio/src/datastructs_private.h | 2 +- radio/src/gui/colorlcd/mainview/layout.cpp | 9 ++++----- radio/src/gui/colorlcd/mainview/widget.cpp | 3 ++- radio/src/model_init.cpp | 2 +- radio/src/storage/sdcard_yaml.cpp | 2 +- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/radio/src/datastructs_model.cpp b/radio/src/datastructs_model.cpp index 3470675ff..ab5a65962 100644 --- a/radio/src/datastructs_model.cpp +++ b/radio/src/datastructs_model.cpp @@ -245,7 +245,7 @@ void ModelData::removeScreenLayout(int idx) _screenData[idx] = nullptr; } -void ModelData::initScreenData() +void ModelData::resetScreenData() { _topbarData.clear(); diff --git a/radio/src/datastructs_private.h b/radio/src/datastructs_private.h index c18b936fe..cc4b18e27 100644 --- a/radio/src/datastructs_private.h +++ b/radio/src/datastructs_private.h @@ -831,7 +831,7 @@ PACK(struct ModelData { NOBACKUP(uint8_t topbarWidgetWidth[MAX_TOPBAR_ZONES]); NOBACKUP(uint8_t view); - void initScreenData(); + void resetScreenData(); const char* getScreenLayoutId(int screenNum); void setScreenLayoutId(int screenNum, const char* s); TopBarPersistentData* getTopbarData(); diff --git a/radio/src/gui/colorlcd/mainview/layout.cpp b/radio/src/gui/colorlcd/mainview/layout.cpp index c4c1a523a..811b7b987 100644 --- a/radio/src/gui/colorlcd/mainview/layout.cpp +++ b/radio/src/gui/colorlcd/mainview/layout.cpp @@ -33,7 +33,7 @@ const LayoutOption defaultLayoutOptions[] = {LAYOUT_COMMON_OPTIONS, void ZonePersistentData::clear() { - widgetName[0] = 0; + widgetName.clear(); widgetData.clear(); } @@ -69,7 +69,7 @@ WidgetPersistentData* LayoutPersistentData::getWidgetData(int idx) bool LayoutPersistentData::hasWidget(int idx) { - return zones[idx].widgetName[0] != 0; + return !zones[idx].widgetName.empty(); } //----------------------------------------------------------------------------- @@ -280,9 +280,8 @@ void LayoutFactory::initPersistentData(int screenNum, bool setDefault) const // TODO compiler bug? The CPU freezes ... persistentData->options[i++] // = option->deflt; auto optVal = &layoutData->options[i]; - if (setDefault) { - memcpy(&optVal->value, &option->deflt, sizeof(LayoutOptionValue)); - } + if (setDefault) + optVal->value.unsignedValue = option->deflt.unsignedValue; optVal->type = layoutValueEnumFromType(option->type); } } diff --git a/radio/src/gui/colorlcd/mainview/widget.cpp b/radio/src/gui/colorlcd/mainview/widget.cpp index fe107813b..f6e6b71d8 100644 --- a/radio/src/gui/colorlcd/mainview/widget.cpp +++ b/radio/src/gui/colorlcd/mainview/widget.cpp @@ -79,7 +79,8 @@ void WidgetPersistentData::setDefault(int idx, const WidgetOption* opt, bool for if (forced || options[idx].type != optType) { // reset to default value options[idx].type = optType; - memcpy((void*)&options[idx].value, (void*)&opt->deflt, sizeof(WidgetOptionValue)); + options[idx].value.unsignedValue = opt->deflt.unsignedValue; + options[idx].value.stringValue = opt->deflt.stringValue; } } diff --git a/radio/src/model_init.cpp b/radio/src/model_init.cpp index dddedab7b..ac4287de9 100644 --- a/radio/src/model_init.cpp +++ b/radio/src/model_init.cpp @@ -144,7 +144,7 @@ void applyDefaultTemplate() #endif #if defined(COLORLCD) - g_model.initScreenData(); + g_model.resetScreenData(); LayoutFactory::loadDefaultLayout(); #endif diff --git a/radio/src/storage/sdcard_yaml.cpp b/radio/src/storage/sdcard_yaml.cpp index aad69a003..d2b1837fd 100644 --- a/radio/src/storage/sdcard_yaml.cpp +++ b/radio/src/storage/sdcard_yaml.cpp @@ -348,7 +348,7 @@ const char * readModelYaml(const char * filename, uint8_t * buffer, uint32_t siz initCustomSwitches(); #endif #if defined(COLORLCD) - g_model.initScreenData(); + g_model.resetScreenData(); #endif auto md = reinterpret_cast(buffer); #if defined(FLIGHT_MODES) && defined(GVARS)