diff --git a/src/graphics/draw/MenuHandler.cpp b/src/graphics/draw/MenuHandler.cpp index 20e85c8fe..cd0bd0223 100644 --- a/src/graphics/draw/MenuHandler.cpp +++ b/src/graphics/draw/MenuHandler.cpp @@ -20,6 +20,8 @@ #include "modules/KeyVerificationModule.h" #include "modules/TraceRouteModule.h" +#include +#include #include #include @@ -32,20 +34,25 @@ namespace { template -BannerOverlayOptions createBannerOptions(const char *message, const MenuOption (&options)[N], Callback &&onSelection) +BannerOverlayOptions createBannerOptions(const char *message, const MenuOption (&options)[N], + std::array &labels, Callback &&onSelection) { - static const char *labels[N]; for (size_t i = 0; i < N; ++i) { labels[i] = options[i].label; } - auto callback = std::forward(onSelection); + std::array, N> optionsCopy{}; + std::copy(std::begin(options), std::end(options), optionsCopy.begin()); + + auto callback = std::function &, int)>(std::forward(onSelection)); BannerOverlayOptions bannerOptions; bannerOptions.message = message; - bannerOptions.optionsArrayPtr = labels; + bannerOptions.optionsArrayPtr = labels.data(); bannerOptions.optionsCount = static_cast(N); - bannerOptions.bannerCallback = [&options, callback](int selected) mutable -> void { callback(options[selected], selected); }; + bannerOptions.bannerCallback = [optionsCopy, callback](int selected) mutable -> void { + callback(optionsCopy[selected], selected); + }; return bannerOptions; } @@ -222,8 +229,6 @@ void menuHandler::DeviceRolePicker() void menuHandler::RadioPresetPicker() { - using RadioPresetOption = MenuOption; - static const RadioPresetOption presetOptions[] = { {"Back", OptionsAction::Back, meshtastic_Config_LoRaConfig_ModemPreset_LONG_FAST}, // Dummy preset value here to satisfy generics @@ -237,17 +242,21 @@ void menuHandler::RadioPresetPicker() {"ShortTurbo", OptionsAction::Select, meshtastic_Config_LoRaConfig_ModemPreset_SHORT_TURBO}, }; - auto bannerOptions = createBannerOptions("Radio Preset", presetOptions, [](const RadioPresetOption &option, int) -> void { - if (option.action == OptionsAction::Back) { - menuHandler::menuQueue = menuHandler::lora_Menu; - screen->runNow(); - return; - } + constexpr size_t presetCount = sizeof(presetOptions) / sizeof(presetOptions[0]); + static std::array presetLabels{}; - config.lora.modem_preset = option.value; - service->reloadConfig(SEGMENT_CONFIG); - rebootAtMsec = (millis() + DEFAULT_REBOOT_SECONDS * 1000); - }); + auto bannerOptions = + createBannerOptions("Radio Preset", presetOptions, presetLabels, [](const RadioPresetOption &option, int) -> void { + if (option.action == OptionsAction::Back) { + menuHandler::menuQueue = menuHandler::lora_Menu; + screen->runNow(); + return; + } + + config.lora.modem_preset = option.value; + service->reloadConfig(SEGMENT_CONFIG); + rebootAtMsec = (millis() + DEFAULT_REBOOT_SECONDS * 1000); + }); screen->showOverlayBanner(bannerOptions); } diff --git a/src/graphics/draw/MenuHandler.h b/src/graphics/draw/MenuHandler.h index db3653391..5f4347510 100644 --- a/src/graphics/draw/MenuHandler.h +++ b/src/graphics/draw/MenuHandler.h @@ -108,5 +108,7 @@ template struct MenuOption { T value; }; +using RadioPresetOption = MenuOption; + } // namespace graphics #endif \ No newline at end of file