diff --git a/main.c b/main.c index 47d23c8..92ebacb 100644 --- a/main.c +++ b/main.c @@ -1772,19 +1772,18 @@ VNA_SHELL_FUNCTION(cmd_trace) if (argc == 2) { switch (get_str_index(argv[0], cmd_scale_ref_list)) { case 0: - if (UNIT_IS_LINEAR(setting.unit)) - set_auto_reflevel(false); - set_scale(my_atof(argv[1])); - if (UNIT_IS_LINEAR(setting.unit) && setting.reflevel < setting.scale*NGRIDY) - set_reflevel(setting.scale*NGRIDY); + if (strcmp(argv[1],"auto") == 0) { + set_auto_reflevel(true); + } else { + user_set_scale(my_atof(argv[1])); + } goto update; case 1: //trace[t].refpos = my_atof(argv[2]); if (strcmp(argv[1],"auto") == 0) { set_auto_reflevel(true); } else { - set_auto_reflevel(false); - set_reflevel(my_atof(argv[1])); + user_set_reflevel(my_atof(argv[1])); } goto update; } diff --git a/nanovna.h b/nanovna.h index ee6d8c4..fa930ed 100644 --- a/nanovna.h +++ b/nanovna.h @@ -202,9 +202,11 @@ void toggle_waterfall(void); void set_mode(int); int GetMode(void); void set_reflevel(float); +void user_set_reflevel(float); #define REFLEVEL_MAX 9999.0 #define REFLEVEL_MIN 1.0e-12 void set_scale(float); +void user_set_scale(float); void AllDirty(void); void MenuDirty(void); void toggle_LNA(void); diff --git a/sa_core.c b/sa_core.c index 2b59e9b..6a7e972 100644 --- a/sa_core.c +++ b/sa_core.c @@ -559,6 +559,16 @@ void set_unit(int u) const float unit_scale_value[]={1,0.001,0.000001,0.000000001,0.000000000001}; const char * const unit_scale_text[]= {"","m", "u", "n", "p"}; +void user_set_reflevel(float level) +{ + set_auto_reflevel(false); + if (UNIT_IS_LINEAR(setting.unit) && level < setting.scale*NGRIDY) { + set_scale(level/NGRIDY); + set_reflevel(setting.scale*NGRIDY); + } else + set_reflevel(level); +} + void set_reflevel(float level) { @@ -593,6 +603,30 @@ void set_reflevel(float level) dirty = true; } +void round_reflevel_to_scale(void) { + int multi = floor((setting.reflevel + setting.scale/2)/setting.scale); + if (UNIT_IS_LINEAR(setting.unit)) { + if (multi < NGRIDY) { + setting.reflevel = setting.scale*10; // Never negative bottom + } + } else { + + } + setting.reflevel = multi*setting.scale; + set_trace_refpos(0,setting.reflevel); + set_trace_refpos(1,setting.reflevel); + set_trace_refpos(2,setting.reflevel); +} + +void user_set_scale(float s) +{ + if (UNIT_IS_LINEAR(setting.unit)) + set_auto_reflevel(false); + set_scale(s); + if (UNIT_IS_LINEAR(setting.unit) && setting.reflevel < setting.scale*NGRIDY) + set_reflevel(setting.scale*NGRIDY); +} + void set_scale(float t) { if (UNIT_IS_LINEAR(setting.unit)) { if (t < REFLEVEL_MIN/10.0) @@ -623,12 +657,7 @@ void set_scale(float 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); -// } + round_reflevel_to_scale(); #if 0 if (UNIT_IS_LINEAR(setting.unit)) { // Never negative bottom diff --git a/ui_sa.c b/ui_sa.c index f2f3b06..03f7b3e 100644 --- a/ui_sa.c +++ b/ui_sa.c @@ -1904,19 +1904,10 @@ set_numeric_value(void) set_sweep_frequency(ST_CW, uistat.value); break; case KM_SCALE: - if (UNIT_IS_LINEAR(setting.unit)) - set_auto_reflevel(false); - set_scale(uistat.value); - if (UNIT_IS_LINEAR(setting.unit) && setting.reflevel < setting.scale*NGRIDY) - set_reflevel(setting.scale*NGRIDY); + user_set_scale(uistat.value); break; case KM_REFLEVEL: - set_auto_reflevel(false); - if (UNIT_IS_LINEAR(setting.unit) && uistat.value < setting.scale*NGRIDY) { - set_scale(uistat.value/NGRIDY); - set_reflevel(setting.scale*NGRIDY); - } else - set_reflevel(uistat.value); + user_set_reflevel(uistat.value); break; case KM_ATTENUATION: setting.auto_attenuation = false;