From b93dcefa052514888cdd16ba92e79e8b073d1db2 Mon Sep 17 00:00:00 2001 From: erikkaashoek Date: Fri, 11 Dec 2020 14:13:28 +0100 Subject: [PATCH] Updated spur removal setting and marker quick menu --- nanovna.h | 1 + sa_core.c | 89 +++++++++++++++++++++++++++++++++++++------------------ ui.c | 33 ++++++++++++++++++--- ui_sa.c | 20 ++++++++----- 4 files changed, 102 insertions(+), 41 deletions(-) diff --git a/nanovna.h b/nanovna.h index ab030b0..58eca55 100644 --- a/nanovna.h +++ b/nanovna.h @@ -237,6 +237,7 @@ void set_sweep_time_us(uint32_t); #ifdef __SPUR__ //extern int setting.spur; void set_spur(int v); +void toggle_spur(void); void toggle_mirror_masking(void); #endif void set_average(int); diff --git a/sa_core.c b/sa_core.c index 0838a01..e451f22 100644 --- a/sa_core.c +++ b/sa_core.c @@ -143,7 +143,11 @@ void reset_settings(int m) // setting.refer = -1; // do not reset reffer when switching modes setting.mute = true; #ifdef __SPUR__ - setting.spur_removal = 0; +#ifdef TINYSA4 + setting.spur_removal = S_AUTO_OFF; +#else + setting.spur_removal = S_OFF; +#endif setting.mirror_masking = 0; #endif switch(m) { @@ -208,10 +212,10 @@ uint32_t calc_min_sweep_time_us(void) // Estimate minimum sweep time in #endif if (FREQ_IS_CW()) { bare_sweep_time = MINIMUM_SWEEP_TIME; // minimum sweep time in fast CW mode - if (setting.repeat != 1 || setting.sweep_time_us >= 100*ONE_MS_TIME || setting.spur_removal != 0) // if no fast CW sweep possible + if (setting.repeat != 1 || setting.sweep_time_us >= 100*ONE_MS_TIME || S_STATE(setting.spur_removal)) // if no fast CW sweep possible bare_sweep_time = 15000; // minimum CW sweep time when not in fast CW mode } - t = vbwSteps * (setting.spur_removal ? 2 : 1) * bare_sweep_time ; // factor in vbwSteps and spur impact + t = vbwSteps * (S_STATE(setting.spur_removal) ? 2 : 1) * bare_sweep_time ; // factor in vbwSteps and spur impact t += (setting.repeat - 1)* REPEAT_TIME * (sweep_points); // Add time required for repeats } return t; @@ -645,6 +649,26 @@ void set_spur(int v) // set_RBW(300); dirty = true; } + +void toggle_spur(void) +{ + if (setting.mode!=M_LOW) + return; +#ifdef TINYSA4 + if (S_IS_AUTO(setting.spur_removal )) + setting.spur_removal = false; + else if (setting.spur_removal) + setting.spur_removal = S_AUTO_OFF; + else + setting.spur_removal = true; +#else + if (S_STATE(setting.spur_removal )) + setting.spur_removal = S_OFF; + else + setting.spur_removal = S_ON; +#endif + dirty = true; +} #endif #ifdef __ULTRA__ @@ -1335,7 +1359,7 @@ void update_rbw(void) // calculate the actual_rbw and the vbwSteps (# #endif actual_rbw_x10 = temp_actual_rbw_x10; // Now it fits in 16 bit #ifdef __SI4432__ - if (setting.spur_removal && actual_rbw_x10 > 3000) + if (S_STATE(setting.spur_removal) && actual_rbw_x10 > 3000) actual_rbw_x10 = 2500; // if spur suppression reduce max rbw to fit within BPF SI4432_Sel = MODE_SELECT(setting.mode); #endif @@ -1574,13 +1598,13 @@ pureRSSI_t perform(bool break_on_operation, int i, uint32_t f, int tracking) { int modulation_delay = 0; int modulation_index = 0; + int spur_second_pass = false; if (i == 0 && dirty ) { // if first point in scan and dirty calculate_correction(); // pre-calculate correction factor dividers to avoid float division apply_settings(); // Initialize HW scandirty = true; // This is the first pass with new settings dirty = false; sweep_elapsed = chVTGetSystemTimeX(); // for measuring accumulated time - if (setting.spur_removal == -1) setting.spur_removal = 1; // ensure spur processing starts in right phase // Set for actual time pre calculated value (update after sweep) setting.actual_sweep_time_us = calc_min_sweep_time_us(); // Change actual sweep time as user input if it greater minimum @@ -1749,8 +1773,8 @@ modulation_again: goto skip_LO_setting; // No more LO changes required, save some time and jump over the code uint32_t local_IF; - - again: // Spur reduction jumps to here for second measurement + spur_second_pass = false; + again: // Spur reduction jumps to here for second measurement local_IF=0; // to get rid of warning if (MODE_HIGH(setting.mode)) { @@ -1771,17 +1795,17 @@ modulation_again: stored_t[i] = -60.0; // Display when to do spur shift in the stored trace #endif } - if (setting.spur_removal){ // If in low input mode and spur reduction is on + if (S_STATE(setting.spur_removal)){ // If in low input mode and spur reduction is on if (S_IS_AUTO(setting.below_IF) && (lf < local_IF / 2 || lf > local_IF) ) // if below 150MHz and auto_below_IF <-------------------TODO --------------------- { // else low/above IF - if (setting.spur_removal == 1) - setting.below_IF = S_AUTO_ON; // use below IF in first pass + if (spur_second_pass) + setting.below_IF = S_AUTO_ON; // use below IF in second pass else - setting.below_IF = S_AUTO_OFF; // and above IF in second pass + setting.below_IF = S_AUTO_OFF; // and above IF in first pass } else { - if (setting.spur_removal == -1) // If second spur pass + if (spur_second_pass) // If second spur pass #ifdef __SI4432__ local_IF = local_IF + 500000; // apply IF spur shift #else @@ -1796,11 +1820,11 @@ modulation_again: } #ifdef __ULTRA__ } else if (setting.mode == M_ULTRA) { // No above/below IF mode in Ultra - local_IF = setting.frequency_IF + (int)(actual_rbw < 350.0 ? setting.spur_removal*300000 : 0 ); + local_IF = setting.frequency_IF + (int)(actual_rbw < 350.0 ? S_STATE(setting.spur_removal)*300000 : 0 ); #ifdef __SI4432__ set_freq (SI4432_RX , local_IF); #endif - // local_IF = setting.frequency_IF + (int)(actual_rbw < 300.0?setting.spur_removal * 1000 * actual_rbw:0); + // local_IF = setting.frequency_IF + (int)(actual_rbw < 300.0?S_STATE(setting.spur_removal) * 1000 * actual_rbw:0); #endif } @@ -1811,7 +1835,7 @@ modulation_again: // if (lf > 3406000000 ) // setFreq (1, local_IF/5 + lf/5); // else - if (setting.spur_removal != 1) { // Left of tables + if (S_STATE(setting.spur_removal) != 1) { // Left of tables if (lf > 3250000000 ) set_freq (SI4432_LO , lf/5 - local_IF/5); if (lf > 1250000000 ) @@ -1875,7 +1899,7 @@ modulation_again: #ifdef __SI4432__ #ifdef __FAST_SWEEP__ - if (i == 0 && setting.frequency_step == 0 && setting.trigger == T_AUTO && setting.spur_removal == 0 && SI4432_step_delay == 0 && setting.repeat == 1 && setting.sweep_time_us < 100*ONE_MS_TIME) { + if (i == 0 && setting.frequency_step == 0 && setting.trigger == T_AUTO && S_STATE(setting.spur_removal) == 0 && SI4432_step_delay == 0 && setting.repeat == 1 && setting.sweep_time_us < 100*ONE_MS_TIME) { // if ultra fast scanning is needed prefill the SI4432 RSSI read buffer SI4432_Fill(MODE_SELECT(setting.mode), 0); } @@ -1929,7 +1953,7 @@ modulation_again: }while(1); #ifdef __FAST_SWEEP__ #ifdef __SI4432__ - if (setting.spur_removal == 0 && SI4432_step_delay == 0 && setting.repeat == 1 && setting.sweep_time_us < 100*ONE_MS_TIME) { + if (S_STATE(setting.spur_removal) == 0 && SI4432_step_delay == 0 && setting.repeat == 1 && setting.sweep_time_us < 100*ONE_MS_TIME) { SI4432_Fill(MODE_SELECT(setting.mode), 1); // fast mode possible to pre-fill RSSI buffer } #endif @@ -1946,13 +1970,16 @@ modulation_again: } #ifdef __SPUR__ static pureRSSI_t spur_RSSI = -1; // Initialization only to avoid warning. - if (setting.spur_removal == 1) { // If first spur pass - spur_RSSI = pureRSSI; // remember measure RSSI - setting.spur_removal = -1; - goto again; // Skip all other processing - } else if (setting.spur_removal == -1) { // If second spur pass - pureRSSI = ( pureRSSI < spur_RSSI ? pureRSSI : spur_RSSI); // Take minimum of two - setting.spur_removal = 1; // and prepare for next call of perform. + if (S_STATE(setting.spur_removal)) { + if (!spur_second_pass) { // If first spur pass + spur_RSSI = pureRSSI; // remember measure RSSI + spur_second_pass = true; + goto again; // Skip all other processing + } else { // If second spur pass + pureRSSI = ( pureRSSI < spur_RSSI ? pureRSSI : spur_RSSI); // Take minimum of two + if (S_IS_AUTO(setting.below_IF)) + setting.below_IF = S_AUTO_OFF; // make sure it is off for next pass + } } #endif @@ -3076,7 +3103,11 @@ common_silent: setting.step_delay_mode = SD_PRECISE; // set_step_delay(1); // Precise scanning speed #ifdef __SPUR__ - setting.spur_removal = 1; +#ifdef TINYSA4 + setting.spur_removal = S_AUTO_OFF; +#else + setting.spur_removal = S_OFF; +#endif #endif common: @@ -3094,7 +3125,7 @@ common_silent: dirty = true; // set_step_delay(1); // Do not set !!!!! #ifdef __SPUR__ - setting.spur_removal = 1; + setting.spur_removal = S_ON; #endif goto common; @@ -3282,7 +3313,7 @@ void self_test(int test) j = setting.test_argument; // do_again: test_prepare(TEST_RBW); - setting.spur_removal = 0; + setting.spur_removal = S_OFF; #if 1 // Disable for offset baseline scanning setting.step_delay_mode = SD_NORMAL; setting.repeat = 1; @@ -3319,7 +3350,7 @@ void self_test(int test) #if 1 // Enable for step delay tuning while (setting.step_delay > 10 && test_value != 0 && test_value > saved_peakLevel - 0.5) { test_prepare(TEST_RBW); - setting.spur_removal = 0; + setting.spur_removal = S_OFF; setting.step_delay_mode = SD_NORMAL; setting.step_delay = setting.step_delay * 4 / 5; if (setting.rbw_x10 < 1000) @@ -3346,7 +3377,7 @@ void self_test(int test) test_prepare(TEST_RBW); setting.step_delay_mode = SD_FAST; setting.offset_delay /= 2; - setting.spur_removal = 0; + setting.spur_removal = S_OFF; if (setting.rbw_x10 < 1000) set_sweep_frequency(ST_SPAN, (uint32_t)(setting.rbw_x10 * 5000)); // 50 times RBW else diff --git a/ui.c b/ui.c index 6a4cded..de4f7a3 100644 --- a/ui.c +++ b/ui.c @@ -124,6 +124,7 @@ typedef struct { #define EVT_TOUCH_DOWN 1 #define EVT_TOUCH_PRESSED 2 #define EVT_TOUCH_RELEASED 3 +#define EVT_TOUCH_LONGPRESS 4 static int8_t last_touch_status = EVT_TOUCH_NONE; static int16_t last_touch_x; @@ -296,7 +297,16 @@ touch_check(void) last_touch_y = y; } } +#if 0 // Long press detection + systime_t ticks = chVTGetSystemTimeX(); + if (stat && !last_touch_status) { // new button, initialize + prev_touch_time = ticks; + } + dt = ticks - prev_touch_time; + + if (stat && stat == last_touch_status && dt > BUTTON_DOWN_LONG_TICKS) {return EVT_TOUCH_LONGPRESS;} +#endif if (stat != last_touch_status) { last_touch_status = stat; return stat ? EVT_TOUCH_PRESSED : EVT_TOUCH_RELEASED; @@ -421,7 +431,7 @@ show_version(void) ili9341_drawstring(info_about[i++], x, y+=5); } while (true) { - if (touch_check() == EVT_TOUCH_PRESSED) + if (touch_check() == EVT_TOUCH_RELEASED) break; if (btn_check() & EVT_BUTTON_SINGLE_CLICK) break; @@ -895,9 +905,16 @@ active_marker_select(int item) choose_active_marker(); } } else { - if (previous_marker != active_marker) + if (previous_marker != active_marker) { previous_marker = active_marker; - active_marker = item; + active_marker = item; + } else { + active_marker = item; + selection = -1; + menu_current_level = 0; +extern const menuitem_t menu_marker_modify[]; + menu_push_submenu(menu_marker_modify); + } } } #ifdef __VNA__ @@ -2442,7 +2459,7 @@ ui_process_keypad(void) break; } - if (touch_check() == EVT_TOUCH_PRESSED) { + if (touch_check() == EVT_TOUCH_RELEASED) { int key = keypad_apply_touch(); if (key >= 0 && keypad_click(key)) /* exit loop on done or cancel */ @@ -2593,6 +2610,14 @@ touch_marker_select(void) for (int i = 0; i < MARKERS_MAX; i++) { if (markers[i].enabled) { if (selected_marker == 0) { + if (active_marker == i) { + extern const menuitem_t menu_marker_modify[]; + touch_wait_release(); + selection = -1; + menu_current_level = 0; + menu_push_submenu(menu_marker_modify); + break; + } active_marker = i; redraw_marker(active_marker); break; diff --git a/ui_sa.c b/ui_sa.c index 5ae89c2..23092b0 100644 --- a/ui_sa.c +++ b/ui_sa.c @@ -462,6 +462,8 @@ static const menuitem_t menu_tophigh[]; static const menuitem_t menu_topultra[]; #endif +#define AUTO_ICON(S) (S>=2?BUTTON_ICON_CHECK_AUTO:S) // Depends on order of ICONs!!!!! + static UI_FUNCTION_ADV_CALLBACK(menu_mode_acb) { (void)data; @@ -730,7 +732,7 @@ static UI_FUNCTION_ADV_CALLBACK(menu_spur_acb) if (b){ if (setting.mode == M_LOW) { b->param_1.text = "SPUR\nREMOVAL"; - b->icon = setting.spur_removal == 0 ? BUTTON_ICON_NOCHECK : BUTTON_ICON_CHECK; + b->icon = AUTO_ICON(setting.spur_removal); } else { b->param_1.text = "MIRROR\nMASKING"; b->icon = setting.mirror_masking == 0 ? BUTTON_ICON_NOCHECK : BUTTON_ICON_CHECK; @@ -738,10 +740,7 @@ static UI_FUNCTION_ADV_CALLBACK(menu_spur_acb) return; } if (setting.mode == M_LOW) { - if (setting.spur_removal) - set_spur(0); - else - set_spur(1); // must be 0 or 1 !!!! + toggle_spur(); } else toggle_mirror_masking(); // menu_move_back(); @@ -1185,8 +1184,6 @@ static UI_FUNCTION_ADV_CALLBACK(menu_harmonic_acb) #endif -#define AUTO_ICON(S) (S>=2?BUTTON_ICON_CHECK_AUTO:S) // Depends on order of ICONs!!!!! - static UI_FUNCTION_ADV_CALLBACK(menu_settings_agc_acb){ (void)item; (void)data; @@ -1295,7 +1292,11 @@ static UI_FUNCTION_ADV_CALLBACK(menu_outputmode_acb) draw_menu(); } +#ifdef TINYSA4 +static const uint16_t points_setting[] = {51, 101, 201, 450}; +#else static const uint16_t points_setting[] = {51, 101, 145, 290}; +#endif static UI_FUNCTION_ADV_CALLBACK(menu_points_acb){ (void)item; if(b){ @@ -2426,7 +2427,10 @@ redraw_cal_status: ili9341_set_foreground(LCD_BRIGHT_COLOR_GREEN); ili9341_drawstring("Spur:", x, y); y += YSTEP; - y = add_quick_menu("ON", x, y, (menuitem_t *)menu_stimulus); + if (S_IS_AUTO(setting.spur_removal)) + y = add_quick_menu("AUTO", x, y, (menuitem_t *)menu_stimulus); + else + y = add_quick_menu("ON", x, y, (menuitem_t *)menu_stimulus); } if (setting.mirror_masking) { ili9341_set_foreground(LCD_BRIGHT_COLOR_GREEN);