From eff762b474f7c8efde35fc21168894fd2e1f2f6d Mon Sep 17 00:00:00 2001 From: erikkaashoek Date: Tue, 3 Nov 2026 17:11:23 +0100 Subject: [PATCH] Markers: TRACKING L->R keeps the tracking markers in frequency order (issue #124) --- nanovna.h | 2 ++ sa_core.c | 17 +++++++++++++++++ ui.c | 25 +++++++------------------ 3 files changed, 26 insertions(+), 18 deletions(-) diff --git a/nanovna.h b/nanovna.h index fe0a695..ad0dd7f 100644 --- a/nanovna.h +++ b/nanovna.h @@ -818,6 +818,8 @@ float marker_to_value(const int i); // auto name #define _MODE_AUTO_FILENAME 0x10 #define _MODE_MHZ_CSV 0x20 +// tracking markers left to right +#define _MODE_MARKER_ORDER 0x40 #ifdef __USE_SD_CARD__ // SD Icon Save (SDIS) configuration diff --git a/sa_core.c b/sa_core.c index 6293f6b..7697ce8 100644 --- a/sa_core.c +++ b/sa_core.c @@ -5769,6 +5769,23 @@ static volatile int dummy; if (MODE_INPUT(setting.mode)) { // Assign maxima found to tracking markers int i = 0; int m = 0; +#ifdef TINYSA4 + if (config._mode & _MODE_MARKER_ORDER) { // The highest maxima, one per tracking marker, left to right + for (; m < MARKERS_MAX; m++) + if (markers[m].enabled && markers[m].mtype & M_TRACKING && markers[m].trace == t) + i++; + if (i > cur_max) i = cur_max; + while (--i > 0) { // Bubble sort these first maxima on frequency + for (m = 0; m < i; m++) + if (max_index[m] > max_index[m+1]) { + uint16_t s = max_index[m]; + max_index[m] = max_index[m+1]; + max_index[m+1] = s; + } + } + i = m = 0; + } +#endif while (i < cur_max) { // For all maxima found while (m < MARKERS_MAX) { if (markers[m].enabled && markers[m].mtype & M_TRACKING && markers[m].trace == t) { // Available marker found diff --git a/ui.c b/ui.c index 849fe6e..178fdb7 100644 --- a/ui.c +++ b/ui.c @@ -4615,27 +4615,15 @@ __attribute__((noinline)) static void fw_update_ui(const char *fname) { -static UI_FUNCTION_ADV_CALLBACK(menu_autoname_acb) +// Toggle the config._mode bit in data +static UI_FUNCTION_ADV_CALLBACK(menu_config_mode_acb) { (void)item; - (void)data; - if (b){ - b->icon = config._mode & _MODE_AUTO_FILENAME ? BUTTON_ICON_CHECK : BUTTON_ICON_NOCHECK; - return; - } - config._mode^= _MODE_AUTO_FILENAME; - config_save(); -} - -static UI_FUNCTION_ADV_CALLBACK(menu_mhz_csv_acb) -{ - (void)item; - (void)data; if (b){ - b->icon = config._mode & _MODE_MHZ_CSV ? BUTTON_ICON_CHECK : BUTTON_ICON_NOCHECK; + b->icon = config._mode & data ? BUTTON_ICON_CHECK : BUTTON_ICON_NOCHECK; return; } - config._mode^= _MODE_MHZ_CSV; + config._mode^= data; config_save(); } @@ -4871,6 +4859,7 @@ const menuitem_t menu_marker_search[] = { { MT_ADV_CALLBACK, 0, "ENTER\n%s", menu_enter_marker_acb}, { MT_ADV_CALLBACK, M_TRACKING, "TRACKING",menu_marker_modify_acb }, #ifdef TINYSA4 + { MT_ADV_CALLBACK, _MODE_MARKER_ORDER, "TRACKING\nL"S_RARROW"R", menu_config_mode_acb }, { MT_ADV_CALLBACK, 0, "JOG JUMP\nMAX",menu_jog_jump_acb }, { MT_KEYPAD, KM_NOISE, "PEAK\n\b%s", "2..120 dB"}, #endif @@ -5640,8 +5629,8 @@ static const menuitem_t menu_storage_sd_icon[] = { }; static const menuitem_t menu_storage_more[] = { - { MT_ADV_CALLBACK, 0, "AUTO NAME", menu_autoname_acb }, - { MT_ADV_CALLBACK, 0, "MHz\nCSV", menu_mhz_csv_acb }, + { MT_ADV_CALLBACK, _MODE_AUTO_FILENAME, "AUTO NAME", menu_config_mode_acb }, + { MT_ADV_CALLBACK, _MODE_MHZ_CSV, "MHz\nCSV", menu_config_mode_acb }, { MT_SUBMENU, 0, "SD CARD\nICON", menu_storage_sd_icon }, #ifdef __USE_USB_MSC__ { MT_CALLBACK, 0, "USB\nDISK", menu_usb_disk_cb },