From 70cb7cbe5a90865a94aa463631e2398eb7350b24 Mon Sep 17 00:00:00 2001 From: erikkaashoek Date: Sat, 6 Jun 2020 16:13:52 +0200 Subject: [PATCH] Update of auto leveling in linear mode --- nanovna.h | 2 ++ plot.c | 2 +- sa_core.c | 86 +++++++++++++++++++++++++++++++++++++------------------ ui_sa.c | 2 +- 4 files changed, 62 insertions(+), 30 deletions(-) diff --git a/nanovna.h b/nanovna.h index 1b923ee..e393870 100644 --- a/nanovna.h +++ b/nanovna.h @@ -202,6 +202,8 @@ void toggle_waterfall(void); void set_mode(int); int GetMode(void); void set_reflevel(float); +#define REFLEVEL_MAX 999999.0 +#define REFLEVEL_MIN 0.0010 void set_scale(float); void AllDirty(void); void MenuDirty(void); diff --git a/plot.c b/plot.c index b9198b5..3ff4313 100644 --- a/plot.c +++ b/plot.c @@ -875,7 +875,7 @@ static void trace_get_value_string( plot_printf(buf, len, "-INF"); else { if (setting.unit) - plot_printf(buf, len, "%s %.2f%s%s", buf2, v - rlevel,unit_string[setting.unit],(mtype & M_NOISE?"/Hz":"")); + plot_printf(buf, len, "%s %.4f%s%s", buf2, v - rlevel,unit_string[setting.unit],(mtype & M_NOISE?"/Hz":"")); else plot_printf(buf, len, "%s %.1f%s%s", buf2, v - rlevel,unit_string[setting.unit],(mtype & M_NOISE?"/Hz":"")); } diff --git a/sa_core.c b/sa_core.c index e33cf56..d5ebdee 100644 --- a/sa_core.c +++ b/sa_core.c @@ -479,14 +479,15 @@ void set_unit(int u) r = value(r); // Convert to target unit s = value(s); if (UNIT_IS_LINEAR(setting.unit)) { - if (r < 0.1) - r = 0.1; // Minimum value to ensure display - if (r >500) - r = 500; // Maximum value - set_reflevel(r); - set_scale(r/10.0); + if (r < REFLEVEL_MIN) + r = REFLEVEL_MIN; // Minimum value to ensure display + if (r >REFLEVEL_MAX) + r = REFLEVEL_MAX; // Maximum value + set_scale(r/NGRIDY); + set_reflevel(setting.scale*NGRIDY); } else { r = 10 * round((r*1.2)/10.0); + set_reflevel(r); set_scale(10); } dirty = true; @@ -495,14 +496,18 @@ void set_unit(int u) void set_reflevel(float level) { - if (UNIT_IS_LINEAR(setting.unit)) { // Never negative bottom - if (level < 0.1) - level = 0.1; + if (UNIT_IS_LINEAR(setting.unit)) { + if (level < REFLEVEL_MIN) + level = REFLEVEL_MIN; + if (level > REFLEVEL_MAX) + level = REFLEVEL_MAX; +#if 0 float s = setting.scale; - if (level - NGRIDY * s < 0) { + if (level < NGRIDY * s) { // Never negative bottom set_scale(level/NGRIDY); level = setting.scale * NGRIDY; } +#endif } setting.reflevel = level; @@ -514,26 +519,43 @@ void set_reflevel(float level) } void set_scale(float t) { - if (UNIT_IS_LINEAR(setting.unit)) { // Never negative bottom - if (t < 0.01) - t = 0.01; + if (UNIT_IS_LINEAR(setting.unit)) { + if (t < REFLEVEL_MIN/10) + t = REFLEVEL_MIN/10; + if (t > REFLEVEL_MAX/10) + t = REFLEVEL_MAX/10; + } else { + if (t > 20.0) + t = 20.0; + else if (t < 1) + t = 1.0; } + float m = 1; // t = t * 1.2; while (t > 10) { m *= 10; t/=10; } while (t < 1.0) { m /= 10; t*=10; } - if (t>5) + if (t>5.0001) t = 10.0; - else if (t>2) + else if (t>2.0001) t = 5.0; - else + else if (t > 1.0001) t = 2.0; + else + t = 1.0; t = t*m; setting.scale = t; set_trace_scale(0, t); set_trace_scale(1, t); set_trace_scale(2, t); +// if (!UNIT_IS_LINEAR(setting.unit)) { + setting.reflevel = t * floor(setting.reflevel/t); + set_trace_refpos(0,setting.reflevel); + set_trace_refpos(1,setting.reflevel); + set_trace_refpos(2,setting.reflevel); +// } +#if 0 if (UNIT_IS_LINEAR(setting.unit)) { // Never negative bottom float r = setting.reflevel; t = NGRIDY * t; @@ -544,7 +566,7 @@ void set_scale(float t) { set_trace_refpos(2, t); } } - +#endif // set_reflevel(setting.reflevel); } @@ -1440,7 +1462,9 @@ again: if (!in_selftest && MODE_INPUT(setting.mode) && setting.auto_reflevel && max_index[0] > 0) { // Auto reflevel if (UNIT_IS_LINEAR(setting.unit)) { // Linear scales can not have negative values float r = value(actual_t[max_index[0]]); - if ((setting.reflevel > 0.1 && r < setting.reflevel / 2 ) || (setting.reflevel < 500.0 && r > setting.reflevel) ) { // ensure minimum and maximum reflevel + if ((setting.reflevel > REFLEVEL_MIN && r < setting.reflevel / 2 ) || (setting.reflevel < REFLEVEL_MAX && r > setting.reflevel) ) { // ensure minimum and maximum reflevel + // r = setting.scale * (floor(r / setting.scale) + 1); +#if 0 float m = 1; // t = t * 1.2; while (r > 10) { m *= 10; r/=10; } @@ -1452,18 +1476,24 @@ again: else r = 2.0; r = r*m; - if (r < 0.1) - r = 0.1; - if (r > 500.0) - r = 500.0; - set_scale(r / NGRIDY); - set_reflevel(r); +#endif + if (r < REFLEVEL_MIN) + r = REFLEVEL_MIN; + if (r > REFLEVEL_MAX) + r = REFLEVEL_MAX; + //if (setting.scale * NGRIDY > r) + set_scale(r / NGRIDY); + set_reflevel(setting.scale*NGRIDY); } } else { - if (value(actual_t[max_index[0]]) > setting.reflevel - setting.scale/2) { - set_reflevel(setting.reflevel + setting.scale); + if (value(actual_t[max_index[0]]) < setting.reflevel - setting.scale*NGRIDY || temp_min_level > setting.reflevel) { + set_reflevel(setting.scale*(floor(value(actual_t[max_index[0]])/setting.scale)+1)); redraw_request |= REDRAW_CAL_STATUS; dirty = true; // Must be above if(scandirty!!!!!) + }else if (value(actual_t[max_index[0]]) > setting.reflevel - setting.scale/2) { + set_reflevel(setting.reflevel + setting.scale); + redraw_request |= REDRAW_CAL_STATUS; + dirty = true; // Must be above if(scandirty!!!!!) } else if (temp_min_level < setting.reflevel - 10.1 * setting.scale && value(actual_t[max_index[0]]) < setting.reflevel - setting.scale * 1.5) { set_reflevel(setting.reflevel - setting.scale); redraw_request |= REDRAW_CAL_STATUS; @@ -1716,8 +1746,8 @@ float my_round(float v) const char *unit_string[] = { "dBm", "dBmV", "dBuV", "mV", "uV", "mW", "uW" }; -static const float scale_value[12]={50, 20,10,5,2,1,0.5,0.2,0.1,0.05,0.02,0.01}; -static const char *scale_vtext[12]= {"50", "20","10","5","2","1","0.5","0.2","0.1","0.05","0.02","0.01"}; +static const float scale_value[]={50000, 20000, 10000, 5000, 2000, 1000, 500, 200, 100, 50, 20,10,5,2,1,0.5,0.2,0.1,0.05,0.02,0.01,0.005,0.002, 0.001,0.0005,0.0002, 0.0001}; +static const char *scale_vtext[]= {"50000", "20000", "10000", "5000", "2000", "1000", "500", "200", "100", "50", "20","10","5","2","1","0.5","0.2","0.1","0.05","0.02","0.01", "0.005","0.002","0.001", "0.0005","0.0002","0.0001"}; void draw_cal_status(void) { diff --git a/ui_sa.c b/ui_sa.c index 6a4ce20..b5cc6bb 100644 --- a/ui_sa.c +++ b/ui_sa.c @@ -421,7 +421,7 @@ static const char * const keypad_mode_label[] = { #endif #ifdef __SA__ static const char * const keypad_mode_label[] = { - "error", "START", "STOP", "CENTER", "SPAN", "FREQ", "REFPOS", "SCALE", // 0-7 + "error", "START", "STOP", "CENTER", "SPAN", "FREQ", "REFPOS", "\2SCALE\0 5/2/1", // 0-7 "\2ATTENUATE\0 0-31dB", "\2ACTUAL\0POWER", "IF", "\2SAMPLE\0TIME", "DRIVE", "LEVEL", "LEVEL", "LEVEL", // 8-15 "OFFSET" , "REPEATS", "OFFSET", "\2TRIGGER\0LEVEL", "\2LEVEL\0SWEEP", "\2SWEEP\0SECONDS"// 16- };