diff --git a/nanovna.h b/nanovna.h index 2730e9a..fca11d1 100644 --- a/nanovna.h +++ b/nanovna.h @@ -1010,6 +1010,7 @@ typedef struct setting uint8_t waterfall; // enum uint8_t average[TRACES_MAX]; // enum uint8_t subtract[TRACES_MAX];// index + uint8_t limit_trace; // index uint8_t measurement; // enum uint8_t spur_removal; // enum int8_t normalized_trace; diff --git a/sa_core.c b/sa_core.c index 84b260a..eb95ac6 100644 --- a/sa_core.c +++ b/sa_core.c @@ -921,14 +921,17 @@ void limits_update(void) { int j = 0; int prev = -1; + if (setting.limit_trace == 0) + return; + int t = setting.limit_trace - 1; for (int i = 0; i=0) { while (j < sweep_points) - stored_t[j++] = setting.limits[prev].level; - setting.stored[TRACE_STORED] = true; - TRACE_ENABLE(TRACE_STORED_FLAG); + measured[t][j++] = setting.limits[prev].level; + setting.stored[t] = true; + TRACE_ENABLE(1<text, sizeof(b->text), "LIMIT\nTRACE %d", data); + b->bg = LCD_TRACE_1_COLOR+data-1; + } + else + plot_printf(b->text, sizeof(b->text), "LIMIT\nOFF"); + b->icon = (data == setting.limit_trace) ? BUTTON_ICON_GROUP_CHECKED : BUTTON_ICON_GROUP; + return; + } + if (setting.normalized_trace != -1 && data-1 == TRACE_TEMP) { + drawMessageBox("Error", "Disable normalization first", 2000); + redraw_request|= REDRAW_AREA; + return; + } + if (setting.limit_trace != data && setting.limit_trace >0) { // Clear previous limit trace + setting.stored[setting.limit_trace-1] = false; + TRACE_DISABLE(1<<(setting.limit_trace-1)); + } + setting.limit_trace = data; + menu_move_back(false); +} +#endif static UI_FUNCTION_ADV_CALLBACK(menu_traces_acb) { @@ -1730,8 +1758,21 @@ static UI_FUNCTION_ADV_CALLBACK(menu_limit_select_acb) { (void)item; if(b){ - plot_printf(b->text, sizeof(b->text), "%.6FHz\n%.2F%s", (float)setting.limits[data-1].frequency, value(setting.limits[data-1].level),unit_string[setting.unit]); - b->icon = (setting.limits[data-1].enabled?BUTTON_ICON_CHECK:BUTTON_ICON_NOCHECK) ; + if (data == 0) { + if (setting.limit_trace) { + plot_printf(b->text, sizeof(b->text), "LIMIT\nTRACE %d", setting.limit_trace); + b->bg = LCD_TRACE_1_COLOR+setting.limit_trace-1; + } + else + plot_printf(b->text, sizeof(b->text), "LIMIT\nOFF"); + } else { + plot_printf(b->text, sizeof(b->text), "%.6FHz\n%.2F%s", (float)setting.limits[data-1].frequency, value(setting.limits[data-1].level),unit_string[setting.unit]); + b->icon = (setting.limits[data-1].enabled?BUTTON_ICON_CHECK:BUTTON_ICON_NOCHECK) ; + } + return; + } + if (data == 0) { + menu_push_submenu(menu_limit_trace); return; } active_limit = data -1; @@ -2443,7 +2484,8 @@ static const menuitem_t menu_limit_modify[] = }; const menuitem_t menu_limit_select[] = { - { MT_ADV_CALLBACK | MT_REPEATS, DATA_STARTS_REPEATS(1,6), MT_CUSTOM_LABEL, menu_limit_select_acb }, + { MT_ADV_CALLBACK, 0, MT_CUSTOM_LABEL, menu_limit_select_acb }, + { MT_ADV_CALLBACK | MT_REPEATS, DATA_STARTS_REPEATS(1,6), MT_CUSTOM_LABEL, menu_limit_select_acb }, { MT_NONE, 0, NULL, menu_back} // next-> menu_back }; #endif @@ -2839,6 +2881,14 @@ static const menuitem_t menu_subtract_trace[] = { MT_NONE, 0, NULL, menu_back} // next-> menu_back }; +#ifdef __LIMITS__ +static const menuitem_t menu_limit_trace[] = +{ + { MT_ADV_CALLBACK|MT_REPEATS,DATA_STARTS_REPEATS(0,TRACES_MAX+1), MT_CUSTOM_LABEL, menu_limit_trace_acb}, + { MT_NONE, 0, NULL, menu_back} // next-> menu_back +}; +#endif + static const menuitem_t menu_traces[] = { { MT_ADV_CALLBACK,0, "TRACE %d", menu_traces_acb},