From 3e38c7a033a6b2f630837b2828712d1015039113 Mon Sep 17 00:00:00 2001 From: Benjamin Faershtein <119711889+RCGV1@users.noreply.github.com> Date: Tue, 7 Jul 2026 17:22:31 -0700 Subject: [PATCH] fix: guard modem preset frequency when region unset --- source/graphics/TFT/TFTView_320x240.cpp | 13 ++++++++++--- source/graphics/common/LoRaPresets.cpp | 4 ++++ tests/test_LoRaPresets.cpp | 12 ++++++++++++ 3 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 tests/test_LoRaPresets.cpp diff --git a/source/graphics/TFT/TFTView_320x240.cpp b/source/graphics/TFT/TFTView_320x240.cpp index 72f662e8..8e830f79 100644 --- a/source/graphics/TFT/TFTView_320x240.cpp +++ b/source/graphics/TFT/TFTView_320x240.cpp @@ -1741,7 +1741,8 @@ void TFTView_320x240::ui_event_region_button(lv_event_t *e) void TFTView_320x240::ui_event_preset_button(lv_event_t *e) { lv_event_code_t event_code = lv_event_get_code(e); - if (event_code == LV_EVENT_CLICKED && THIS->activeSettings == eNone && THIS->db.config.lora.use_preset) { + if (event_code == LV_EVENT_CLICKED && THIS->activeSettings == eNone && THIS->db.config.lora.use_preset && + THIS->db.config.lora.region != meshtastic_Config_LoRaConfig_RegionCode_UNSET) { THIS->activeSettings = eModemPreset; lv_dropdown_set_selected(objects.settings_modem_preset_dropdown, THIS->preset2val(THIS->db.config.lora.modem_preset)); @@ -6013,8 +6014,13 @@ void TFTView_320x240::updateLoRaConfig(const meshtastic_Config_LoRaConfig &cfg) lv_label_set_text(objects.basic_settings_modem_preset_label, buf2); uint32_t numChannels = LoRaPresets::getNumChannels(cfg.region, cfg.modem_preset); - lv_slider_set_range(objects.frequency_slot_slider, 1, numChannels); - lv_slider_set_value(objects.frequency_slot_slider, db.config.lora.channel_num, LV_ANIM_OFF); + if (numChannels) { + lv_slider_set_range(objects.frequency_slot_slider, 1, numChannels); + lv_slider_set_value(objects.frequency_slot_slider, db.config.lora.channel_num, LV_ANIM_OFF); + } else { + lv_slider_set_range(objects.frequency_slot_slider, 0, 0); + lv_slider_set_value(objects.frequency_slot_slider, 0, LV_ANIM_OFF); + } } else { lv_label_set_text(objects.basic_settings_modem_preset_label, _("Modem Preset: custom")); } @@ -6042,6 +6048,7 @@ void TFTView_320x240::showLoRaFrequency(const meshtastic_Config_LoRaConfig &cfg) char loraFreq[48]; if (!cfg.region) { strcpy(loraFreq, _("region unset")); + lv_obj_add_state(objects.basic_settings_modem_preset_button, LV_STATE_DISABLED); } else if (cfg.use_preset) { float frequency = LoRaPresets::getRadioFreq(cfg.region, cfg.modem_preset, cfg.channel_num) + cfg.frequency_offset; sprintf(loraFreq, "LoRa %g MHz\n[%s kHz]", frequency, LoRaPresets::getBandwidthString(cfg.modem_preset)); diff --git a/source/graphics/common/LoRaPresets.cpp b/source/graphics/common/LoRaPresets.cpp index ad750cb3..f58c5ae8 100644 --- a/source/graphics/common/LoRaPresets.cpp +++ b/source/graphics/common/LoRaPresets.cpp @@ -80,6 +80,10 @@ uint32_t LoRaPresets::getNumChannels(meshtastic_Config_LoRaConfig_RegionCode reg float LoRaPresets::getRadioFreq(meshtastic_Config_LoRaConfig_RegionCode region, meshtastic_Config_LoRaConfig_ModemPreset preset, uint32_t channel) { + if (region == meshtastic_Config_LoRaConfig_RegionCode_UNSET || channel == 0) { + return 0.0f; + } + return (regionInfo[region].freqStart + modemPreset[preset].bandwidth_MHz / 2) + (channel - 1) * modemPreset[preset].bandwidth_MHz; } diff --git a/tests/test_LoRaPresets.cpp b/tests/test_LoRaPresets.cpp new file mode 100644 index 00000000..c14d1ba5 --- /dev/null +++ b/tests/test_LoRaPresets.cpp @@ -0,0 +1,12 @@ +#include "graphics/common/LoRaPresets.h" +#include + +TEST_CASE("LoRaPresets::getRadioFreq returns no frequency without a valid region and slot") +{ + CHECK(LoRaPresets::getRadioFreq(meshtastic_Config_LoRaConfig_RegionCode_UNSET, + meshtastic_Config_LoRaConfig_ModemPreset_LONG_FAST, 0) == doctest::Approx(0.0f)); + CHECK(LoRaPresets::getRadioFreq(meshtastic_Config_LoRaConfig_RegionCode_US, + meshtastic_Config_LoRaConfig_ModemPreset_LONG_FAST, 0) == doctest::Approx(0.0f)); + CHECK(LoRaPresets::getRadioFreq(meshtastic_Config_LoRaConfig_RegionCode_US, + meshtastic_Config_LoRaConfig_ModemPreset_LONG_FAST, 1) == doctest::Approx(902.125f)); +}