From dae01ca9250eb431c0c14d3faf0c0870123c8fbe Mon Sep 17 00:00:00 2001 From: erikkaashoek Date: Mon, 21 Sep 2020 20:31:19 +0200 Subject: [PATCH 1/3] Add hamband and gridlines setting --- nanovna.h | 6 +++++- plot.c | 12 +++++++----- sa_core.c | 16 ++++++++++++++++ ui_sa.c | 39 ++++++++++++++++++++++++++++++++++++--- 4 files changed, 64 insertions(+), 9 deletions(-) diff --git a/nanovna.h b/nanovna.h index 7a842bf..552fcb1 100644 --- a/nanovna.h +++ b/nanovna.h @@ -35,7 +35,7 @@ #define __SELFTEST__ #define __CALIBRATE__ #define __FAST_SWEEP__ // Pre-fill SI4432 RSSI buffer to get fastest sweep in zero span mode -//#define __HAM_BAND__ +#define __HAM_BAND__ //#define __ULTRA__ // Add harmonics mode on low input. //#define __ULTRA_SA__ // Adds ADF4351 control for extra high 1st IF stage #define __SPUR__ // Does spur reduction by shifting IF @@ -452,6 +452,8 @@ typedef struct config { float correction_value[CORRECTION_POINTS]; uint32_t deviceid; uint16_t ham_color; + uint16_t gridlines; + uint16_t hambands; // uint8_t _reserved[22]; uint32_t checksum; } config_t; @@ -945,11 +947,13 @@ extern uint16_t actual_rbw_x10; int get_waterfall(void); void toggle_tracking(void); +void toggle_hambands(void); void reset_calibration(void); void set_reflevel(float); void set_offset(float); void set_unit(int); void set_switches(int); +void set_gridlines(int); void set_trigger_level(float); void set_trigger(int); void update_rbw(void); diff --git a/plot.c b/plot.c index f2b2445..0fd01d2 100644 --- a/plot.c +++ b/plot.c @@ -127,18 +127,18 @@ void update_grid(void) fspan = setting.actual_sweep_time_us; // Time in uS fstart = 0; } - -#define GRIDLINE_MINIMUM 7 + if (config.gridlines < 3) + config.gridlines = 6; while (gdigit > 100) { grid = 5 * gdigit; - if (fspan / grid >= GRIDLINE_MINIMUM) + if (fspan / grid >= config.gridlines) break; grid = 2 * gdigit; - if (fspan / grid >= GRIDLINE_MINIMUM) + if (fspan / grid >= config.gridlines) break; grid = gdigit; - if (fspan / grid >= GRIDLINE_MINIMUM) + if (fspan / grid >= config.gridlines) break; gdigit /= 10; } @@ -432,6 +432,8 @@ const ham_bands_t ham_bands[] = int ham_band(int x) // Search which index in the frequency tabled matches with frequency f using actual_rbw { + if (!config.hambands) + return false; uint32_t f = frequencies[x]; int L = 0; int R = (sizeof ham_bands)/sizeof(uint32_t) - 1; diff --git a/sa_core.c b/sa_core.c index 9317d6c..87c8378 100644 --- a/sa_core.c +++ b/sa_core.c @@ -242,6 +242,16 @@ void set_noise(int d) dirty = true; } +void set_gridlines(int d) +{ + if (d < 3 || d > 20) + return; + config.gridlines = d; + config_save(); + dirty = true; + update_grid(); +} + void set_measurement(int m) { setting.measurement = m; @@ -312,6 +322,12 @@ void toggle_mute(void) dirty = true; } +void toggle_hambands(void) +{ + config.hambands = !config.hambands; + dirty = true; +} + void toggle_below_IF(void) { if (S_IS_AUTO(setting.below_IF )) diff --git a/ui_sa.c b/ui_sa.c index 24ac1f7..a4b1f4b 100644 --- a/ui_sa.c +++ b/ui_sa.c @@ -406,7 +406,7 @@ static const keypads_t keypads_time[] = { enum { KM_START, KM_STOP, KM_CENTER, KM_SPAN, KM_CW, KM_REFLEVEL, KM_SCALE, KM_ATTENUATION, KM_ACTUALPOWER, KM_IF, KM_SAMPLETIME, KM_DRIVE, KM_LOWOUTLEVEL, KM_DECAY, KM_NOISE, - KM_10MHZ, KM_REPEAT, KM_OFFSET, KM_TRIGGER, KM_LEVELSWEEP, KM_SWEEP_TIME, KM_OFFSET_DELAY, KM_FAST_SPEEDUP, + KM_10MHZ, KM_REPEAT, KM_OFFSET, KM_TRIGGER, KM_LEVELSWEEP, KM_SWEEP_TIME, KM_OFFSET_DELAY, KM_FAST_SPEEDUP, KM_GRIDLINES, KM_NONE // always at enum end }; @@ -428,7 +428,7 @@ static const struct { {keypads_positive , "DRIVE"}, // drive {keypads_plusmin , "LEVEL"}, // KM_LOWOUTLEVEL {keypads_positive , "SCANS"}, // KM_DECAY - {keypads_positive , "LEVEL"}, // KM_NOISE + {keypads_positive , "NOISE\nLEVEL"}, // KM_NOISE {keypads_freq , "FREQ"}, // KM_10MHz {keypads_positive , "SAMPLE\nREPEAT"}, // KM_REPEA {keypads_plusmin , "OFFSET"}, // KM_OFFSET @@ -437,6 +437,7 @@ static const struct { {keypads_time , "SWEEP\nSECONDS"}, // KM_SWEEP_TIME {keypads_positive , "OFFSET\nDELAY"}, // KM_OFFSET_DELAY {keypads_positive , "FAST\nSPEEDUP"}, // KM_FAST_SPEEDUP + {keypads_positive , "MINIMUM\nGRIDLINES"}, // KM_GRIDLINES }; // ===[MENU CALLBACKS]========================================================= @@ -1174,6 +1175,19 @@ static UI_FUNCTION_ADV_CALLBACK(menu_settings_bpf_acb){ draw_menu(); } +#ifdef __HAM_BAND__ +static UI_FUNCTION_ADV_CALLBACK(menu_settings_ham_bands){ + (void)item; + (void)data; + if(b){ + b->icon = config.hambands ? BUTTON_ICON_CHECK : BUTTON_ICON_NOCHECK; + return; + } + toggle_hambands(); + draw_menu(); +} +#endif + static UI_FUNCTION_ADV_CALLBACK(menu_settings_below_if_acb){ (void)item; (void)data; @@ -1574,6 +1588,21 @@ static const menuitem_t menu_sweep_speed[] = { MT_NONE, 0, NULL, NULL } // sentinel }; +static const menuitem_t menu_settings3[] = +{ + { MT_KEYPAD, KM_10MHZ, "CORRECT\nFREQUENCY", "Enter actual l0MHz frequency"}, + { MT_KEYPAD, KM_GRIDLINES, "MINIMUM\nGRIDLINES", "Enter minimum horizontal grid divisions"}, +#ifdef __HAM_BAND__ + { MT_ADV_CALLBACK, 0, "HAM\nBANDS", menu_settings_ham_bands}, +#endif +#ifdef __ULTRA__ + { MT_SUBMENU,0, "HARMONIC", menu_harmonic}, +#endif + { MT_CANCEL, 0, S_LARROW" BACK", NULL }, + { MT_NONE, 0, NULL, NULL } // sentinel +}; + + static const menuitem_t menu_settings2[] = { { MT_ADV_CALLBACK, 0, "AGC", menu_settings_agc_acb}, @@ -1582,10 +1611,10 @@ static const menuitem_t menu_settings2[] = { MT_ADV_CALLBACK | MT_LOW, 0, "BELOW IF", menu_settings_below_if_acb}, { MT_KEYPAD, KM_DECAY, "HOLD\nSWEEPS", "1..1000 sweeps"}, { MT_KEYPAD, KM_NOISE, "NOISE\nLEVEL", "2..20 dB"}, - { MT_KEYPAD, KM_10MHZ, "CORRECT\nFREQUENCY", "Enter actual l0MHz frequency"}, #ifdef __ULTRA__ { MT_SUBMENU,0, "HARMONIC", menu_harmonic}, #endif + { MT_SUBMENU, 0, S_RARROW" MORE", menu_settings3}, { MT_CANCEL, 0, S_LARROW" BACK", NULL }, { MT_NONE, 0, NULL, NULL } // sentinel }; @@ -1991,6 +2020,10 @@ set_numeric_value(void) completed = true; break; + case KM_GRIDLINES: + set_gridlines(uistat.value); + break; + } } From 2d7e702227a0cb099aac7447b65e8faa51b7a231 Mon Sep 17 00:00:00 2001 From: erikkaashoek Date: Wed, 23 Sep 2020 10:01:04 +0200 Subject: [PATCH 2/3] Automatic disable tracking if marker is dragged --- ui.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ui.c b/ui.c index abda101..3c32ad9 100644 --- a/ui.c +++ b/ui.c @@ -2081,6 +2081,7 @@ lever_move_marker(int status) } markers[active_marker].frequency = frequencies[markers[active_marker].index]; redraw_marker(active_marker); + markers[active_marker].mtype &= ~M_TRACKING; // Disable tracking when dragging marker step++; } status = btn_wait_release(); @@ -2492,7 +2493,7 @@ touch_pickup_marker(void) // select trace uistat.current_trace = t; select_lever_mode(LM_MARKER); - + markers[m].mtype &= ~M_TRACKING; // Disable tracking when dragging marker // drag marker until release drag_marker(t, m); return TRUE; From b0f5097d920e56eeef7e40c05073b9f6070ceca3 Mon Sep 17 00:00:00 2001 From: erikkaashoek Date: Wed, 23 Sep 2020 16:28:09 +0200 Subject: [PATCH 3/3] Waterfall big, small or off --- nanovna.h | 9 ++++++--- plot.c | 33 +++++++++++++++++++-------------- sa_core.c | 10 +++++----- 3 files changed, 30 insertions(+), 22 deletions(-) diff --git a/nanovna.h b/nanovna.h index 552fcb1..b416499 100644 --- a/nanovna.h +++ b/nanovna.h @@ -285,10 +285,13 @@ extern void tlv320aic3204_select(int channel); #ifdef __SCROLL__ extern uint16_t _grid_y; #define GRIDY _grid_y -#define HEIGHT_SCROLL 180 -#define HEIGHT_NOSCROLL 230 +extern uint16_t graph_bottom; +#define BIG_WATERFALL 90 +#define SMALL_WATERFALL 180 +#define NO_WATERFALL CHART_BOTTOM +#define CHART_BOTTOM 230 #define SCROLL_GRIDY (HEIGHT_SCROLL / NGRIDY) -#define NOSCROLL_GRIDY (HEIGHT_NOSCROLL / NGRIDY) +#define NOSCROLL_GRIDY (CHART_BOTTOM / NGRIDY) #else #define GRIDY (230 / NGRIDY) #endif diff --git a/plot.c b/plot.c index 0fd01d2..3012a6f 100644 --- a/plot.c +++ b/plot.c @@ -29,7 +29,8 @@ #ifdef __SCROLL__ -uint16_t _grid_y = NOSCROLL_GRIDY; +uint16_t _grid_y = (CHART_BOTTOM / NGRIDY); +uint16_t graph_bottom = CHART_BOTTOM; static int waterfall = false; #endif static void cell_draw_marker_info(int x0, int y0); @@ -2316,7 +2317,7 @@ static void update_waterfall(void){ // Waterfall only in 290 or 145 points if (!(sweep_points == 290 || sweep_points == 145)) return; - for (i = HEIGHT_NOSCROLL-1; i >=HEIGHT_SCROLL+2; i--) { // Scroll down + for (i = CHART_BOTTOM-1; i >=graph_bottom+1; i--) { // Scroll down ili9341_read_memory(OFFSETX, i , w_width, 1, w_width*1, spi_buffer); ili9341_bulk(OFFSETX, i+1, w_width, 1); } @@ -2324,12 +2325,12 @@ static void update_waterfall(void){ for (i=0; i< w_width; i++) { // Add new topline uint16_t color; #ifdef _USE_WATERFALL_PALETTE - uint16_t y = _PALETTE_ALIGN(CELL_Y(index[i])); // should be always in range 0 - HEIGHT_SCROLL + uint16_t y = _PALETTE_ALIGN(CELL_Y(index[i])); // should be always in range 0 - graph_bottom // y = (uint8_t)i; // for test color = waterfall_palette[y]; #elif 0 - uint16_t y = CELL_Y(index[i]); // should be always in range 0 - HEIGHT_SCROLL - uint16_t ratio = (HEIGHT_SCROLL - y)*2; + uint16_t y = CELL_Y(index[i]); // should be always in range 0 - graph_bottom + uint16_t ratio = (graph_bottom - y)*2; // ratio = (i*2); // Uncomment for testing the waterfall colors int16_t b = 255 - ratio; if (b > 255) b = 255; @@ -2344,7 +2345,7 @@ static void update_waterfall(void){ gamma_correct(b); color = RGB565(r, g, b); #else - uint16_t y = CELL_Y(index[i]); // should be always in range 0 - HEIGHT_SCROLL + uint16_t y = CELL_Y(index[i])* (graph_bottom == BIG_WATERFALL ? 2 : 1); // should be always in range 0 - graph_bottom *2 depends on height of scroll // Calculate gradient palette for range 0 .. 192 // idx r g b // 0 - 127 0 0 @@ -2371,30 +2372,34 @@ static void update_waterfall(void){ spi_buffer[2*i+1] = color; } } - ili9341_bulk(OFFSETX, HEIGHT_SCROLL+2, w_width, 1); + ili9341_bulk(OFFSETX, graph_bottom+1, w_width, 1); } int get_waterfall(void) { return(waterfall); } +enum {W_OFF, W_SMALL, W_BIG}; void toggle_waterfall(void) { - if (!waterfall) { - _grid_y = SCROLL_GRIDY; - ili9341_fill(OFFSETX, HEIGHT_SCROLL, LCD_WIDTH - OFFSETX, HEIGHT_NOSCROLL - HEIGHT_SCROLL, 0); - waterfall = true; + if (waterfall == W_OFF) { w_min = (int)min_level; w_max = (int)peakLevel; if (w_max < w_min + 20) w_max = w_min + 20; - + graph_bottom = SMALL_WATERFALL; + waterfall = W_SMALL; + } else if (waterfall == W_SMALL) { + graph_bottom = BIG_WATERFALL; + waterfall = W_BIG; } else { - _grid_y = NOSCROLL_GRIDY; - waterfall = false; + graph_bottom = NO_WATERFALL; + waterfall = W_OFF; } + _grid_y = graph_bottom / NGRIDY; + ili9341_fill(OFFSETX, graph_bottom, LCD_WIDTH - OFFSETX, CHART_BOTTOM - graph_bottom, 0); request_to_redraw_grid(); } void diff --git a/sa_core.c b/sa_core.c index 87c8378..0a437ba 100644 --- a/sa_core.c +++ b/sa_core.c @@ -1913,7 +1913,7 @@ sweep_again: // stay in sweep loop when output mo scandirty = false; if (break_on_operation && operation_requested) { // break loop if needed if (setting.actual_sweep_time_us > ONE_SECOND_TIME && MODE_INPUT(setting.mode)) { - ili9341_fill(OFFSETX, HEIGHT_NOSCROLL+1, WIDTH, 1, 0); // Erase progress bar + ili9341_fill(OFFSETX, CHART_BOTTOM+1, WIDTH, 1, 0); // Erase progress bar } return false; } @@ -1953,8 +1953,8 @@ sweep_again: // stay in sweep loop when output mo if (setting.actual_sweep_time_us > ONE_SECOND_TIME && (i & 0x07) == 0) { // if required int pos = i * (WIDTH+1) / sweep_points; - ili9341_fill(OFFSETX, HEIGHT_NOSCROLL+1, pos, 1, BRIGHT_COLOR_GREEN); // update sweep progress bar - ili9341_fill(OFFSETX+pos, HEIGHT_NOSCROLL+1, WIDTH-pos, 1, 0); + ili9341_fill(OFFSETX, CHART_BOTTOM+1, pos, 1, BRIGHT_COLOR_GREEN); // update sweep progress bar + ili9341_fill(OFFSETX+pos, CHART_BOTTOM+1, WIDTH-pos, 1, 0); } // ------------------------ do all RSSI calculations from CALC menu ------------------- @@ -2409,7 +2409,7 @@ sweep_again: // stay in sweep loop when output mo // redraw_marker(peak_marker, FALSE); // STOP_PROFILE; - ili9341_fill(OFFSETX, HEIGHT_NOSCROLL+1, WIDTH, 1, 0); + ili9341_fill(OFFSETX, CHART_BOTTOM+1, WIDTH, 1, 0); palSetPad(GPIOB, GPIOB_LED); return true; @@ -2604,7 +2604,7 @@ void draw_cal_status(void) rounding = true; const char * const unit = unit_string[setting.unit]; - ili9341_fill(0, 0, OFFSETX, HEIGHT_NOSCROLL, 0x0000); + ili9341_fill(0, 0, OFFSETX, CHART_BOTTOM, 0x0000); if (MODE_OUTPUT(setting.mode)) { // No cal status during output return; }