From 41311cc9d7d2d650a3c91d9f5e1929bb95c27a8c Mon Sep 17 00:00:00 2001 From: erikkaashoek Date: Wed, 12 May 2021 09:05:55 +0200 Subject: [PATCH] Repaired step buttons --- nanovna.h | 6 +-- plot.c | 5 ++- sa_core.c | 13 ++++++- si4468.c | 7 +++- ui.c | 47 +++++++++++++----------- ui_sa.c | 107 ++++++++++++++++++++++++++++-------------------------- 6 files changed, 104 insertions(+), 81 deletions(-) diff --git a/nanovna.h b/nanovna.h index dc6fed0..4a7f447 100644 --- a/nanovna.h +++ b/nanovna.h @@ -1033,13 +1033,8 @@ typedef struct setting int decay; // KM_DECAY < 1000000 int attack; // KM_ATTACK < 20000 -#ifdef TINYSA4 int32_t slider_position; freq_t slider_span; -#else - int32_t slider_position; - int32_t slider_span; -#endif uint32_t rbw_x10; uint32_t vbw_x10; @@ -1273,6 +1268,7 @@ enum marker_smithvalue { typedef struct uistat { float value; // for editing at numeric input area + freq_t freq_value; // for editing frequencies that do not fit in float; int8_t digit; /* 0~5 */ int8_t digit_mode; int8_t current_trace; /* 0..3 */ diff --git a/plot.c b/plot.c index a3626b6..d9dfa8e 100644 --- a/plot.c +++ b/plot.c @@ -1630,9 +1630,10 @@ draw_frequencies(void) } // Draw battery level -#define BATTERY_TOP_LEVEL 4100 +#define BATTERY_TOP_LEVEL 4200 #define BATTERY_BOTTOM_LEVEL 3200 #define BATTERY_WARNING_LEVEL 3300 +#define BATTERY_MID_LEVEL 3600 static void draw_battery_status(void) { @@ -1670,7 +1671,7 @@ static const uint8_t sd_icon [] = { return; uint8_t string_buf[16]; // Set battery color - ili9341_set_foreground(vbat < BATTERY_WARNING_LEVEL ? LCD_LOW_BAT_COLOR : LCD_NORMAL_BAT_COLOR); + ili9341_set_foreground(vbat < BATTERY_WARNING_LEVEL ? LCD_LOW_BAT_COLOR : (vbat < BATTERY_MID_LEVEL ? LCD_TRACE_1_COLOR : LCD_NORMAL_BAT_COLOR)); ili9341_set_background(LCD_BG_COLOR); // Prepare battery bitmap image diff --git a/sa_core.c b/sa_core.c index 0debc2e..bf10f1b 100644 --- a/sa_core.c +++ b/sa_core.c @@ -448,8 +448,19 @@ void set_10mhz(freq_t f) } #endif +#if 0 +static setting_t saved_setting; +#endif + void set_measurement(int m) { +#if 0 + if (m != M_OFF && setting.measurement == M_OFF ) { + saved_setting = setting; + } else if (m == M_OFF && setting.measurement != M_OFF ) { + setting = saved_setting; + } +#endif setting.measurement = m; #ifdef __LINEARITY__ if (m == M_LINEARITY) { @@ -3481,7 +3492,7 @@ again: // Spur redu if (my_step_delay < 0) my_step_delay = 0; } - my_microsecond_delay(my_step_delay * (old_R > 5 ? 8 : 1)); + my_microsecond_delay(my_step_delay * (old_R > 5 ? 8 : (old_R > 3 ? 2 : 1))); ADF4351_frequency_changed = false; SI4463_frequency_changed = false; SI4463_offset_changed = false; diff --git a/si4468.c b/si4468.c index df10f3c..1a3436f 100644 --- a/si4468.c +++ b/si4468.c @@ -303,10 +303,15 @@ void ADF4351_WriteRegister32(int channel, const uint32_t value) void ADF4351_Set(int channel) { + for (int i = 5; i >= 0; i--) { + if (registers[i] != old_registers[i]) + goto update; + } + return; +update: set_SPI_mode(SPI_MODE_SI); if (SI4432_SPI_SPEED != ADF_SPI_SPEED) SPI_BR_SET(SI4432_SPI, ADF_SPI_SPEED); - for (int i = 5; i >= 0; i--) ADF4351_WriteRegister32(channel, registers[i]); diff --git a/ui.c b/ui.c index ee73cda..07833dd 100644 --- a/ui.c +++ b/ui.c @@ -2053,10 +2053,10 @@ menu_select_touch(int i, int pos) keypad_mode = keypad; fetch_numeric_target(); int new_slider = touch_x - LCD_WIDTH/2; // Can have negative outcome - if (new_slider < - (MENU_FORM_WIDTH-8)/2) - new_slider = -(MENU_FORM_WIDTH-8)/2; - if (new_slider > (MENU_FORM_WIDTH-8)/2) - new_slider = (MENU_FORM_WIDTH-8)/2; + if (new_slider < - (MENU_FORM_WIDTH-8)/2 - 1) + new_slider = -(MENU_FORM_WIDTH-8)/2 - 1; + if (new_slider > (MENU_FORM_WIDTH-8)/2 + 1) + new_slider = (MENU_FORM_WIDTH-8)/2 + 1; if (menu_is_form(menu) && MT_MASK(menu[i].type) == MT_KEYPAD && keypad == KM_CENTER){ #define TOUCH_DEAD_ZONE 40 if (mode == SL_UNKNOWN ) { @@ -2068,20 +2068,24 @@ menu_select_touch(int i, int pos) } } if (mode == SL_MOVE ) { - uistat.value+= (int)(setting.slider_span/(MENU_FORM_WIDTH-8))*(new_slider - setting.slider_position); - if (uistat.value < minFreq) - uistat.value = minFreq; - if (uistat.value > maxFreq) - uistat.value = maxFreq; - setting.slider_position = new_slider; - set_keypad_value(keypad); - dirty = false; - perform(false, 0, (freq_t)uistat.value, false); - draw_menu(); + long_t freq_delta = (setting.slider_span/(MENU_FORM_WIDTH-8))*(new_slider - setting.slider_position); + if (freq_delta < 0 && uistat.freq_value < (freq_t)(-freq_delta)) + uistat.freq_value = 0; + else + uistat.freq_value+= freq_delta; + if (uistat.freq_value < minFreq) + uistat.freq_value = minFreq; + if (uistat.freq_value > maxFreq) + uistat.freq_value = maxFreq; + setting.slider_position = new_slider; + set_keypad_value(keypad); + dirty = false; + perform(false, 0, uistat.freq_value, false); + draw_menu(); } else if (mode == SL_SPAN ){ - freq_t slider_freq; + freq_t slider_freq; first_span: - slider_freq = (freq_t) uistat.value; + slider_freq = uistat.freq_value; int pw=new_slider + LCD_WIDTH/2; setting.slider_position = pw - LCD_WIDTH/2; // Show delta on slider setting.slider_span = 10; @@ -2101,7 +2105,7 @@ menu_select_touch(int i, int pos) setting.slider_span = (maxFreq - minFreq); freq_t old_minFreq = minFreq; // Save when in high mode minFreq = 0; // And set minFreq to 0 for span display - uistat.value = setting.slider_span; + uistat.freq_value = setting.slider_span; set_keypad_value(keypad); #if 1 plot_printf(center_text, sizeof center_text, "RANGE: %%s"); @@ -2113,7 +2117,7 @@ menu_select_touch(int i, int pos) #endif draw_menu(); // Show slider span minFreq = old_minFreq; // and restore minFreq - uistat.value = (float) slider_freq; // and restore current slider freq + uistat.freq_value = slider_freq; // and restore current slider freq set_keypad_value(keypad); #if 1 plot_printf(center_text, sizeof center_text, "FREQ: %%s"); @@ -2190,12 +2194,12 @@ menu_select_touch(int i, int pos) break; } if (step < 0 && get_sweep_frequency(ST_CENTER) < (freq_t)(-step)) - uistat.value = 0; + uistat.freq_value = 0; else - uistat.value = get_sweep_frequency(ST_CENTER) + step; + uistat.freq_value = get_sweep_frequency(ST_CENTER) + step; do_exit = true; setting.slider_position = 0; // reset slider after step - check_frequency_slider(uistat.value); + check_frequency_slider(uistat.freq_value); goto apply_step; } @@ -2696,6 +2700,7 @@ keypad_click(int key) if (modifier) kp_buf[kp_index++] = modifier; kp_buf[kp_index++] = 0; uistat.value = my_atof(kp_buf); + uistat.freq_value = my_atoui(kp_buf); #endif set_numeric_value(); return KP_DONE; diff --git a/ui_sa.c b/ui_sa.c index 54f6bc2..ef34967 100644 --- a/ui_sa.c +++ b/ui_sa.c @@ -1132,13 +1132,19 @@ static UI_FUNCTION_ADV_CALLBACK(menu_measure_acb) } menu_move_back(false); #ifdef __MEASURE__ +// set_measurement(data); switch(data) { case M_OFF: // Off // reset_settings(setting.mode); + no_measurement: + for (int i = 0; i< MARKERS_MAX; i++) { + markers[i].enabled = M_DISABLED; + markers[i].mtype = M_NORMAL; + } markers[0].enabled = M_ENABLED; markers[0].mtype = M_REFERENCE | M_TRACKING; - no_measurement: - set_measurement(M_OFF); + set_average(AV_OFF); +// set_measurement(M_OFF); break; case M_IMD: // IMD reset_settings(setting.mode); @@ -1151,7 +1157,7 @@ static UI_FUNCTION_ADV_CALLBACK(menu_measure_acb) ui_mode_keypad(KM_CENTER); set_sweep_frequency(ST_START, 0); set_sweep_frequency(ST_STOP, uistat.value*5); - set_measurement(M_IMD); +// set_measurement(M_IMD); break; case M_OIP3: // OIP3 reset_settings(setting.mode); @@ -1169,7 +1175,7 @@ static UI_FUNCTION_ADV_CALLBACK(menu_measure_acb) int right = uistat.value; set_sweep_frequency(ST_CENTER, (left+right)/2); set_sweep_frequency(ST_SPAN, (right - left)*5); - set_measurement(M_OIP3); +// set_measurement(M_OIP3); break; case M_PHASE_NOISE: // Phase noise reset_settings(setting.mode); @@ -1186,8 +1192,8 @@ static UI_FUNCTION_ADV_CALLBACK(menu_measure_acb) kp_help_text = "Frequency offset"; ui_mode_keypad(KM_SPAN); set_sweep_frequency(ST_SPAN, uistat.value*4); - set_measurement(M_PHASE_NOISE); - set_average(4); +// set_measurement(M_PHASE_NOISE); + set_average(AV_4); break; case M_STOP_BAND: // STop band measurement @@ -1201,7 +1207,7 @@ static UI_FUNCTION_ADV_CALLBACK(menu_measure_acb) kp_help_text = "Width of signal"; ui_mode_keypad(KM_SPAN); set_sweep_frequency(ST_SPAN, uistat.value*4); - set_measurement(M_STOP_BAND); +// set_measurement(M_STOP_BAND); // SetAverage(4); break; @@ -1224,7 +1230,7 @@ static UI_FUNCTION_ADV_CALLBACK(menu_measure_acb) break; #ifdef __LINEARITY__ case M_LINEARITY: - set_measurement(M_LINEARITY); +// set_measurement(M_LINEARITY); break; #endif case M_AM: // AM @@ -1259,13 +1265,13 @@ static UI_FUNCTION_ADV_CALLBACK(menu_measure_acb) #endif set_sweep_frequency(ST_SPAN, span * 5); // update_frequencies(); // To ensure markers are positioned right!!!!!! - set_measurement(M_AM); +// set_measurement(M_AM); #ifndef TINYSA4 set_marker_frequency(0, center); set_marker_frequency(1, center-span); set_marker_frequency(2, center+span); #endif - set_average(4); + set_average(AV_4); break; case M_FM: // FM reset_settings(setting.mode); @@ -1296,10 +1302,10 @@ static UI_FUNCTION_ADV_CALLBACK(menu_measure_acb) if (uistat.value < 12000) uistat.value = 12000; // minimum span set_sweep_frequency(ST_SPAN, uistat.value*4); - set_measurement(M_FM); +// set_measurement(M_FM); break; case M_THD: - set_measurement(M_THD); +// set_measurement(M_THD); break; #ifdef __CHANNEL_POWER__ case M_CP: // channel power @@ -1310,10 +1316,12 @@ static UI_FUNCTION_ADV_CALLBACK(menu_measure_acb) kp_help_text = "Channel width"; ui_mode_keypad(KM_SPAN); set_sweep_frequency(ST_SPAN, uistat.value*3); - set_measurement(M_CP); +// set_measurement(M_CP); break; #endif } + set_measurement(data); + #endif // selection = -1; ui_mode_normal(); @@ -2768,24 +2776,24 @@ static void fetch_numeric_target(void) { switch (keypad_mode) { case KM_START: - uistat.value = get_sweep_frequency(ST_START) + (setting.frequency_offset - FREQUENCY_SHIFT); - plot_printf(uistat.text, sizeof uistat.text, "%3.3fMHz", uistat.value / 1000000.0); + uistat.freq_value = get_sweep_frequency(ST_START) + (setting.frequency_offset - FREQUENCY_SHIFT); + plot_printf(uistat.text, sizeof uistat.text, "%3.3fMHz", uistat.freq_value / 1000000.0); break; case KM_STOP: - uistat.value = get_sweep_frequency(ST_STOP) + (setting.frequency_offset - FREQUENCY_SHIFT); - plot_printf(uistat.text, sizeof uistat.text, "%3.3fMHz", uistat.value / 1000000.0); + uistat.freq_value = get_sweep_frequency(ST_STOP) + (setting.frequency_offset - FREQUENCY_SHIFT); + plot_printf(uistat.text, sizeof uistat.text, "%3.3fMHz", uistat.freq_value / 1000000.0); break; case KM_CENTER: - uistat.value = get_sweep_frequency(ST_CENTER) + (setting.frequency_offset - FREQUENCY_SHIFT); - plot_printf(uistat.text, sizeof uistat.text, "%3.4fMHz", uistat.value / 1000000.0); + uistat.freq_value = get_sweep_frequency(ST_CENTER) + (setting.frequency_offset - FREQUENCY_SHIFT); + plot_printf(uistat.text, sizeof uistat.text, "%QHz", uistat.freq_value); break; case KM_SPAN: - uistat.value = get_sweep_frequency(ST_SPAN); - plot_printf(uistat.text, sizeof uistat.text, "%3.3fMHz", uistat.value / 1000000.0); + uistat.freq_value = get_sweep_frequency(ST_SPAN); + plot_printf(uistat.text, sizeof uistat.text, "%3.3fMHz", uistat.freq_value / 1000000.0); break; case KM_CW: - uistat.value = get_sweep_frequency(ST_CW) + (setting.frequency_offset - FREQUENCY_SHIFT); - plot_printf(uistat.text, sizeof uistat.text, "%3.3fMHz", uistat.value / 1000000.0); + uistat.freq_value = get_sweep_frequency(ST_CW) + (setting.frequency_offset - FREQUENCY_SHIFT); + plot_printf(uistat.text, sizeof uistat.text, "%3.3fMHz", uistat.freq_value / 1000000.0); break; case KM_SCALE: uistat.value = setting.scale; @@ -2804,13 +2812,13 @@ static void fetch_numeric_target(void) plot_printf(uistat.text, sizeof uistat.text, "%ddB", ((int32_t)uistat.value)); break; case KM_IF: - uistat.value = setting.frequency_IF; - plot_printf(uistat.text, sizeof uistat.text, "%3.3fMHz", uistat.value / 1000000.0); + uistat.freq_value = setting.frequency_IF; + plot_printf(uistat.text, sizeof uistat.text, "%3.3fMHz", uistat.freq_value / 1000000.0); break; #ifdef TINYSA4 case KM_IF2: - uistat.value = config.frequency_IF2; - plot_printf(uistat.text, sizeof uistat.text, "%3.3fMHz", uistat.value / 1000000.0); + uistat.freq_value = config.frequency_IF2; + plot_printf(uistat.text, sizeof uistat.text, "%3.3fMHz", uistat.freq_value / 1000000.0); break; case KM_R: uistat.value = SI4463_R; @@ -2860,14 +2868,14 @@ static void fetch_numeric_target(void) #endif #ifdef TINYSA4 case KM_LPF: - uistat.value = config.ultra_threshold; - plot_printf(uistat.text, sizeof uistat.text, "%3.6fMHz", uistat.value / 1000000.0); + uistat.freq_value = config.ultra_threshold; + plot_printf(uistat.text, sizeof uistat.text, "%3.6fMHz", uistat.freq_value / 1000000.0); break; #endif #ifdef __LIMITS__ case KM_LIMIT_FREQ: - uistat.value = setting.limits[active_limit].frequency; - plot_printf(uistat.text, sizeof uistat.text, "%3.6fMHz", uistat.value / 1000000.0); + uistat.freq_value = setting.limits[active_limit].frequency; + plot_printf(uistat.text, sizeof uistat.text, "%3.6fMHz", uistat.freq_value / 1000000.0); break; case KM_LIMIT_LEVEL: uistat.value = setting.limits[active_limit].level; @@ -2880,13 +2888,13 @@ static void fetch_numeric_target(void) break; #ifdef TINYSA4 case KM_30MHZ: - uistat.value = config.setting_frequency_30mhz; - plot_printf(uistat.text, sizeof uistat.text, "%3.6fMHz", uistat.value / 1000000.0); + uistat.freq_value = config.setting_frequency_30mhz; + plot_printf(uistat.text, sizeof uistat.text, "%3.6fMHz", uistat.freq_value / 1000000.0); break; #else case KM_10MHZ: - uistat.value = config.setting_frequency_10mhz; - plot_printf(uistat.text, sizeof uistat.text, "%3.6fMHz", uistat.value / 1000000.0); + uistat.freq_value = config.setting_frequency_10mhz; + plot_printf(uistat.text, sizeof uistat.text, "%3.6fMHz", uistat.freq_value / 1000000.0); break; #endif case KM_EXT_GAIN: @@ -2911,8 +2919,8 @@ static void fetch_numeric_target(void) break; case KM_MARKER: if (active_marker >=0) { - uistat.value = markers[active_marker].frequency; - plot_printf(uistat.text, sizeof uistat.text, "%3.3fMHz", uistat.value / 1000000.0); + uistat.freq_value = markers[active_marker].frequency; + plot_printf(uistat.text, sizeof uistat.text, "%3.3fMHz", uistat.freq_value / 1000000.0); } break; case KM_MODULATION: @@ -2936,25 +2944,22 @@ static void fetch_numeric_target(void) static void set_numeric_value(void) { - if (kp_buf[0] == 0) - return; - freq_t freq = my_atoui(kp_buf); switch (keypad_mode) { case KM_START: - set_sweep_frequency(ST_START, freq - (setting.frequency_offset - FREQUENCY_SHIFT)); + set_sweep_frequency(ST_START, uistat.freq_value - (setting.frequency_offset - FREQUENCY_SHIFT)); break; case KM_STOP: - set_sweep_frequency(ST_STOP, freq - (setting.frequency_offset - FREQUENCY_SHIFT)); + set_sweep_frequency(ST_STOP, uistat.freq_value - (setting.frequency_offset - FREQUENCY_SHIFT)); break; case KM_CENTER: - set_sweep_frequency(ST_CENTER, freq - (setting.frequency_offset - FREQUENCY_SHIFT)); + set_sweep_frequency(ST_CENTER, uistat.freq_value - (setting.frequency_offset - FREQUENCY_SHIFT)); break; case KM_SPAN: setting.modulation = MO_NONE; - set_sweep_frequency(ST_SPAN, freq); + set_sweep_frequency(ST_SPAN, uistat.freq_value); break; case KM_CW: - set_sweep_frequency(ST_CW, freq - (setting.frequency_offset - FREQUENCY_SHIFT)); + set_sweep_frequency(ST_CW, uistat.freq_value - (setting.frequency_offset - FREQUENCY_SHIFT)); break; case KM_SCALE: user_set_scale(uistat.value); @@ -2972,12 +2977,12 @@ set_numeric_value(void) break; case KM_IF: setting.auto_IF = false; - set_IF(freq); + set_IF(uistat.freq_value); // config_save(); break; #ifdef TINYSA4 case KM_IF2: - set_IF2(freq); + set_IF2(uistat.freq_value); // config_save(); break; case KM_R: @@ -3029,7 +3034,7 @@ set_numeric_value(void) break; #ifdef __LIMITS__ case KM_LIMIT_FREQ: - setting.limits[active_limit].frequency = freq - (setting.frequency_offset - FREQUENCY_SHIFT); + setting.limits[active_limit].frequency = uistat.freq_value - (setting.frequency_offset - FREQUENCY_SHIFT); limits_update(); break; case KM_LIMIT_LEVEL: @@ -3042,11 +3047,11 @@ set_numeric_value(void) break; #ifdef TINYSA4 case KM_30MHZ: - set_30mhz(freq); + set_30mhz(uistat.freq_value); break; #else case KM_10MHZ: - set_10mhz(freq); + set_10mhz(uistat.freq_value); break; #endif case KM_EXT_GAIN: @@ -3071,7 +3076,7 @@ set_numeric_value(void) set_gridlines(uistat.value); break; case KM_MARKER: - set_marker_frequency(active_marker, freq - (setting.frequency_offset - FREQUENCY_SHIFT)); + set_marker_frequency(active_marker, uistat.freq_value - (setting.frequency_offset - FREQUENCY_SHIFT)); break; case KM_MARKER_TIME: set_marker_time(active_marker, uistat.value);