diff --git a/src/DisplayFormatters.cpp b/src/DisplayFormatters.cpp index 13aded6a6..7d5ab3399 100644 --- a/src/DisplayFormatters.cpp +++ b/src/DisplayFormatters.cpp @@ -51,6 +51,12 @@ const char *DisplayFormatters::getModemPresetDisplayName(meshtastic_Config_LoRaC case PRESET(NARROW_SLOW): return useShortName ? "NarS" : "NarrowSlow"; break; + case PRESET(TINY_FAST): + return useShortName ? "TinyF" : "TinyFast"; + break; + case PRESET(TINY_SLOW): + return useShortName ? "TinyS" : "TinySlow"; + break; default: return useShortName ? "Custom" : "Invalid"; break; diff --git a/src/graphics/niche/InkHUD/Applets/System/Menu/MenuAction.h b/src/graphics/niche/InkHUD/Applets/System/Menu/MenuAction.h index fc1aef02a..9cee18533 100644 --- a/src/graphics/niche/InkHUD/Applets/System/Menu/MenuAction.h +++ b/src/graphics/niche/InkHUD/Applets/System/Menu/MenuAction.h @@ -84,6 +84,8 @@ enum MenuAction { SET_PRESET_LITE_FAST, SET_PRESET_NARROW_SLOW, SET_PRESET_NARROW_FAST, + SET_PRESET_TINY_SLOW, + SET_PRESET_TINY_FAST, SET_PRESET_FROM_REGION, // Dynamic: preset chosen from region-available list // Timezones SET_TZ_US_HAWAII, diff --git a/src/graphics/niche/InkHUD/Applets/System/Menu/MenuApplet.cpp b/src/graphics/niche/InkHUD/Applets/System/Menu/MenuApplet.cpp index b70853151..ca178fb47 100644 --- a/src/graphics/niche/InkHUD/Applets/System/Menu/MenuApplet.cpp +++ b/src/graphics/niche/InkHUD/Applets/System/Menu/MenuApplet.cpp @@ -834,6 +834,22 @@ void InkHUD::MenuApplet::execute(MenuItem item) applyLoRaPreset(PRESET(SHORT_TURBO)); break; + case SET_PRESET_NARROW_SLOW: + applyLoRaPreset(PRESET(NARROW_SLOW)); + break; + + case SET_PRESET_NARROW_FAST: + applyLoRaPreset(PRESET(NARROW_FAST)); + break; + + case SET_PRESET_TINY_SLOW: + applyLoRaPreset(PRESET(TINY_SLOW)); + break; + + case SET_PRESET_TINY_FAST: + applyLoRaPreset(PRESET(TINY_FAST)); + break; + case SET_PRESET_FROM_REGION: { // cursor - 1 because index 0 is "Back" const uint8_t index = cursor - 1; diff --git a/src/mesh/MeshRadio.h b/src/mesh/MeshRadio.h index d04f827c7..4b9d58af7 100644 --- a/src/mesh/MeshRadio.h +++ b/src/mesh/MeshRadio.h @@ -44,7 +44,7 @@ extern const RegionProfile PROFILE_EU868; extern const RegionProfile PROFILE_UNDEF; extern const RegionProfile PROFILE_LITE; extern const RegionProfile PROFILE_NARROW; -// extern const RegionProfile PROFILE_HAM; +extern const RegionProfile PROFILE_HAM_20KHZ; // Map from old region names to new region enums struct RegionInfo { @@ -129,7 +129,7 @@ static inline float bwCodeToKHz(uint16_t bwCode) if (bwCode == 10) return 10.4f; if (bwCode == 16) - return 15.6f; + return 15.625f; if (bwCode == 21) return 20.8f; if (bwCode == 31) @@ -240,6 +240,16 @@ static inline void modemPresetToParams(meshtastic_Config_LoRaConfig_ModemPreset cr = 6; sf = 8; break; + case PRESET(TINY_FAST): + bwKHz = 15.625f; + cr = 5; + sf = 7; + break; + case PRESET(TINY_SLOW): + bwKHz = 15.625f; + cr = 6; + sf = 8; + break; default: // LONG_FAST (or illegal) bwKHz = wideLora ? 812.5f : 250.0f; cr = 5; diff --git a/src/mesh/RadioInterface.cpp b/src/mesh/RadioInterface.cpp index 7f321b0dd..e1f1f3c97 100644 --- a/src/mesh/RadioInterface.cpp +++ b/src/mesh/RadioInterface.cpp @@ -49,6 +49,8 @@ static const meshtastic_Config_LoRaConfig_ModemPreset PRESETS_LITE[] = {PRESET(L static const meshtastic_Config_LoRaConfig_ModemPreset PRESETS_NARROW[] = {PRESET(NARROW_FAST), PRESET(NARROW_SLOW), MODEM_PRESET_END}; +static const meshtastic_Config_LoRaConfig_ModemPreset PRESETS_TINY[] = {PRESET(TINY_FAST), PRESET(TINY_SLOW), MODEM_PRESET_END}; + // Region profiles: bundle preset list + regulatory parameters shared across regions // presets, spacing, padding, audio, licensed, text throttle, position throttle, telemetry throttle const RegionProfile PROFILE_STD = {PRESETS_STD, 0, 0, true, false, 0, 1, 1}; @@ -56,6 +58,8 @@ const RegionProfile PROFILE_EU868 = {PRESETS_EU_868, 0, 0, false, false, 0, 1, 1 const RegionProfile PROFILE_UNDEF = {PRESETS_UNDEF, 0, 0, true, false, 0, 1, 1}; const RegionProfile PROFILE_LITE = {PRESETS_LITE, 0.4, 0.0375f, false, false, 0, 10, 10}; const RegionProfile PROFILE_NARROW = {PRESETS_NARROW, 0, 0.0104f, true, false, 0, 1, 1}; +// Ham '20kHz' profile. 15.625kHz bandwidth coerced to 20kHz via padding. +const RegionProfile PROFILE_HAM_20KHZ = {PRESETS_TINY, 0, 0.0021875f, false, true, 0, 2, 2}; #define RDEF(name, freq_start, freq_end, duty_cycle, power_limit, frequency_switching, wide_lora, profile_ptr, default_preset, \ override_slot) \ diff --git a/test/test_radio/test_main.cpp b/test/test_radio/test_main.cpp index 104e6b36b..a0ad704c4 100644 --- a/test/test_radio/test_main.cpp +++ b/test/test_radio/test_main.cpp @@ -35,7 +35,7 @@ static void test_bwCodeToKHz_specialMappings() { TEST_ASSERT_FLOAT_WITHIN(0.0001f, 7.8f, bwCodeToKHz(8)); TEST_ASSERT_FLOAT_WITHIN(0.0001f, 10.4f, bwCodeToKHz(10)); - TEST_ASSERT_FLOAT_WITHIN(0.0001f, 15.6f, bwCodeToKHz(16)); + TEST_ASSERT_FLOAT_WITHIN(0.0001f, 15.625f, bwCodeToKHz(16)); TEST_ASSERT_FLOAT_WITHIN(0.0001f, 20.8f, bwCodeToKHz(21)); TEST_ASSERT_FLOAT_WITHIN(0.0001f, 31.25f, bwCodeToKHz(31)); TEST_ASSERT_FLOAT_WITHIN(0.0001f, 41.7f, bwCodeToKHz(42));