From 2fb820207b630e72d6b1cc0536ca56588f5ab602 Mon Sep 17 00:00:00 2001 From: erikkaashoek Date: Mon, 10 Jan 2022 18:44:29 +0100 Subject: [PATCH] Level meter added --- ili9341.c | 2 +- main.c | 1 + nanovna.h | 8 ++++++++ plot.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ ui_sa.c | 18 ++++++++++++++++++ 5 files changed, 85 insertions(+), 1 deletion(-) diff --git a/ili9341.c b/ili9341.c index c1a39f1..1b36548 100644 --- a/ili9341.c +++ b/ili9341.c @@ -899,7 +899,7 @@ void ili9341_drawstringV(const char *str, int x, int y) ili9341_drawstring(str, ILI9341_HEIGHT-y, x); ili9341_set_rotation(DISPLAY_ROTATION_0); } -#ifndef wFONT_GET_DATA +#ifdef __LEVEL_METER__ int ili9341_drawchar_size(uint8_t ch, int x, int y, uint8_t size) { uint16_t *buf = spi_buffer; diff --git a/main.c b/main.c index 9b57e79..88754c7 100644 --- a/main.c +++ b/main.c @@ -951,6 +951,7 @@ void load_LCD_properties(void) setting.trace_scale = 10.0; setting.trace_refpos = 0; setting.waterfall = W_OFF; + setting.level_meter = false; setting._traces = TRACE_ACTUAL_FLAG; memcpy(setting._markers, def_markers, sizeof(def_markers)); #ifdef __LIMITS__ diff --git a/nanovna.h b/nanovna.h index b53a70f..7ab8f33 100644 --- a/nanovna.h +++ b/nanovna.h @@ -54,6 +54,7 @@ #define __PE4302__ //#define __SIMULATION__ #define __SCROLL__ // Add waterfall option +#define __LEVEL_METER__ #define __ICONS__ #define __MEASURE__ #define __LINEARITY__ // Not available @@ -363,6 +364,10 @@ void set_subtract_storage(void); void toggle_normalize(int); void set_waterfall(void); void disable_waterfall(void); +#ifdef __LEVEL_METER__ +void set_level_meter(void); +void disable_level_meter(void); +#endif void set_mode(int); int GetMode(void); void set_reflevel(float); @@ -1042,6 +1047,9 @@ typedef struct setting uint8_t trigger_direction; // enum uint8_t step_delay_mode; // enum uint8_t waterfall; // enum +#ifdef __LEVEL_METER__ + uint8_t level_meter; // enum +#endif uint8_t average[TRACES_MAX]; // enum uint8_t subtract[TRACES_MAX];// index uint8_t measurement; // enum diff --git a/plot.c b/plot.c index f206022..80d0c93 100644 --- a/plot.c +++ b/plot.c @@ -35,6 +35,10 @@ static void cell_grid_line_info(int x0, int y0); static void cell_blit_bitmap(int x, int y, uint16_t w, uint16_t h, const uint8_t *bitmap); static void draw_battery_status(void); static void update_waterfall(void); +#ifdef __LEVEL_METER__ +static void update_level_meter(void); +char level_text[20]; +#endif void cell_draw_test_info(int x0, int y0); int cell_printf(int16_t x, int16_t y, const char *fmt, ...); #ifndef wFONT_GET_DATA @@ -138,6 +142,10 @@ void update_grid(void) if (setting.waterfall) set_waterfall(); +#ifdef __LEVEL_METER__ + if (setting.level_meter) + set_level_meter(); +#endif redraw_request |= REDRAW_FREQUENCY | REDRAW_AREA; } @@ -1237,6 +1245,9 @@ draw_all_cells(bool flush_markmap) void draw_all(bool flush) { +#ifdef __LEVEL_METER__ + level_text[0] = 0; // Clear level text +#endif if (redraw_request & REDRAW_AREA) // this set all area for update force_set_markmap(); else { @@ -1253,6 +1264,12 @@ draw_all(bool flush) update_waterfall(); // STOP_PROFILE #endif + +#ifdef __LEVEL_METER__ + if (setting.level_meter) { + update_level_meter(); + } +#endif } if (redraw_request & REDRAW_CAL_STATUS) draw_cal_status(); // calculates the actual sweep time, must be before draw_frequencies @@ -1263,6 +1280,7 @@ draw_all(bool flush) redraw_request = 0; } + // // Call this function then need fast draw marker and marker info // Used in ui.c for leveler move marker, drag marker and etc. @@ -1515,6 +1533,8 @@ static void trace_print_value_string( // Only used at one place if (bold) format++; // Skip small prefix for bold output #endif cell_printf(xpos, ypos, format, buf2, v, unit_string[unit_index], (mtype & M_NOISE?"/Hz":""), (mtype & M_AVER?"/T":"")); + if (level_text[0] == 0) + plot_printf(level_text, sizeof(level_text), &format[3], v, unit_string[unit_index], (mtype & M_NOISE?"/Hz":""), (mtype & M_AVER?"/T":"")); } static void cell_draw_marker_info(int x0, int y0) @@ -2006,6 +2026,43 @@ disable_waterfall(void) set_waterfall(); } +#ifdef __LEVEL_METER__ +static void update_level_meter(void){ + int m = 0; + while (m < MARKERS_MAX){ + if (markers[m].enabled) + break; + m++; + } + if (m == MARKERS_MAX) + return; + ili9341_set_foreground(LCD_FG_COLOR); + ili9341_drawstring_size(level_text,OFFSETX, graph_bottom+2,6); +} + +void +set_level_meter(void) +{ + if (setting.level_meter) graph_bottom = SMALL_WATERFALL; +// else if (setting.level_meter == W_BIG) graph_bottom = BIG_WATERFALL; + else /*if (setting.level_meter == W_OFF)*/graph_bottom = NO_WATERFALL; + _grid_y = graph_bottom / NGRIDY; + area_height = AREA_HEIGHT_NORMAL; + if (setting.level_meter){ + ili9341_set_background(LCD_BG_COLOR); + ili9341_fill(OFFSETX, graph_bottom, LCD_WIDTH - OFFSETX, CHART_BOTTOM - graph_bottom); + } + request_to_redraw_grid(); +} + +void +disable_level_meter(void) +{ + setting.level_meter = false; + set_level_meter(); +} +#endif + void plot_init(void) { diff --git a/ui_sa.c b/ui_sa.c index 78a0eac..b83949c 100644 --- a/ui_sa.c +++ b/ui_sa.c @@ -1796,6 +1796,21 @@ static UI_FUNCTION_ADV_CALLBACK(menu_waterfall_acb){ ui_mode_normal(); } +#ifdef __LEVEL_METER__ +static UI_FUNCTION_ADV_CALLBACK(menu_level_meter_acb){ + (void)item; + (void)data; + if (b){ + b->icon = setting.level_meter ? BUTTON_ICON_CHECK : BUTTON_ICON_NOCHECK; + return; + } + setting.level_meter = !setting.level_meter; + set_level_meter(); + ui_mode_normal(); +} +#endif + + #ifdef __LIMITS__ uint8_t active_limit = 0; static UI_FUNCTION_ADV_CALLBACK(menu_limit_select_acb) @@ -2943,6 +2958,9 @@ static const menuitem_t menu_traces[] = static const menuitem_t menu_display[] = { { MT_ADV_CALLBACK,0, "PAUSE\nSWEEP", menu_pause_acb}, { MT_ADV_CALLBACK,1, "WATER\nFALL", menu_waterfall_acb}, +#ifdef __LEVEL_METER__ + { MT_ADV_CALLBACK,1, "LEVEL\nMETER", menu_level_meter_acb}, +#endif #ifdef __VBW__ { MT_SUBMENU, 0, "VBW", menu_vbw}, #endif