diff --git a/main.c b/main.c index 696298c..9b36cb2 100644 --- a/main.c +++ b/main.c @@ -2268,6 +2268,7 @@ static const VNAShellCommand commands[] = { "if", cmd_if, 0 }, { "attenuate", cmd_attenuate, 0 }, { "level", cmd_level, 0 }, + { "leveloffset", cmd_leveloffset, 0 }, { "levelsweep", cmd_levelsweep, 0 }, { "modulation", cmd_modulation, 0 }, { "reflevel", cmd_reflevel, 0 }, diff --git a/nanovna.h b/nanovna.h index d400d1d..0a3ec11 100644 --- a/nanovna.h +++ b/nanovna.h @@ -185,6 +185,7 @@ void set_step_delay(int t); void set_repeat(int); void set_level_sweep(float); void set_level(float); +void set_sweep_time(int32_t); //extern int setting.repeat; //extern int setting.rbw; #ifdef __SPUR__ @@ -575,6 +576,7 @@ typedef struct setting int linearity_step; float level; float level_sweep; + int32_t sweep_time; int test_argument; uint32_t checksum; }setting_t; diff --git a/sa_cmd.c b/sa_cmd.c index c5bacbe..db5e2d4 100644 --- a/sa_cmd.c +++ b/sa_cmd.c @@ -88,18 +88,18 @@ VNA_SHELL_FUNCTION(cmd_attenuate) VNA_SHELL_FUNCTION(cmd_level) { if (argc != 1) { - usage: - shell_printf("usage: level -76..20\r\n"); + shell_printf("usage: level -76..-6\r\n"); return; } float f = my_atof(argv[0]); set_level(f); } + + VNA_SHELL_FUNCTION(cmd_levelsweep) { if (argc != 1) { - usage: shell_printf("usage: levelsweep -76..+76\r\n"); return; } @@ -127,6 +127,27 @@ VNA_SHELL_FUNCTION(cmd_reflevel) } } +VNA_SHELL_FUNCTION(cmd_leveloffset) +{ + if (argc == 0) { + shell_printf("leveloffset low %.1f\r\n", (float) config.low_level_offset); + shell_printf("leveloffset high %.1f\r\n", (float)config.high_level_offset); + return; + } else if (argc == 2) { + float v = my_atof(argv[1]); + if (strcmp(argv[0],"low") == 0) + config.low_level_offset = v; + else if (strcmp(argv[0],"high") == 0) + config.low_level_offset = v; + else + goto usage; + } else { + usage: + shell_printf("leveloffset [low|high ]\r\n"); + } +} + + VNA_SHELL_FUNCTION(cmd_rbw) { if (argc != 1) { diff --git a/sa_core.c b/sa_core.c index 49b7956..00516a5 100644 --- a/sa_core.c +++ b/sa_core.c @@ -52,6 +52,7 @@ void reset_settings(int m) setting.level = -15.0; setting.trigger_level = -150.0; setting.linearity_step = 0; + setting.sweep_time = 1000; trace[TRACE_STORED].enabled = false; trace[TRACE_TEMP].enabled = false; setting.refer = -1; @@ -160,8 +161,14 @@ void set_drive(int d) void set_level_sweep(float l) { setting.level_sweep = l; + dirty = true; } +void set_sweep_time(int32_t t) +{ + setting.sweep_time = t; + dirty = true; +} void set_tracking_output(int t) { @@ -1209,7 +1216,8 @@ again: return false; if (MODE_OUTPUT(setting.mode)) { if (setting.modulation == MO_NONE) { - osalThreadSleepMilliseconds(10); // Slow down sweep in output mode +// osalThreadSleepMilliseconds(10); // Slow down sweep in output mode + my_microsecond_delay(setting.sweep_time * 1000 / 290); } continue; // Skip all other processing } diff --git a/ui_sa.c b/ui_sa.c index 223e8af..0a62b12 100644 --- a/ui_sa.c +++ b/ui_sa.c @@ -279,7 +279,8 @@ const uint16_t right_icons [] = enum { KM_START=1, KM_STOP, KM_CENTER, KM_SPAN, KM_CW, KM_REFPOS, 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_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, }; @@ -369,6 +370,24 @@ static const keypads_t keypads_level[] = { { 0, 0, -1 } }; +static const keypads_t keypads_time[] = { + { 1, 3, KP_PERIOD }, + { 0, 3, 0 }, + { 0, 2, 1 }, + { 1, 2, 2 }, + { 2, 2, 3 }, + { 0, 1, 4 }, + { 1, 1, 5 }, + { 2, 1, 6 }, + { 0, 0, 7 }, + { 1, 0, 8 }, + { 2, 0, 9 }, + { 3, 1, KP_N }, + { 3, 2, KP_P }, + { 3, 3, KP_MINUS }, + { 2, 3, KP_BS }, + { 0, 0, -1 } +}; static const keypads_t * const keypads_mode_tbl[] = { NULL, // never used @@ -392,6 +411,7 @@ static const keypads_t * const keypads_mode_tbl[] = { keypads_level, // KM_OFFSET keypads_level, // KM_TRIGGER keypads_level, // KM_LEVELSWEEP + keypads_time, // KM_SWEEP_TIME }; #ifdef __VNA__ @@ -403,7 +423,7 @@ static const char * const keypad_mode_label[] = { static const char * const keypad_mode_label[] = { "error", "START", "STOP", "CENTER", "SPAN", "FREQ", "REFPOS", "SCALE", // 0-7 "\2ATTENUATE\0 0-31dB", "ACTUALPOWER", "IF", "SAMPLE TIME", "DRIVE", "LEVEL", "LEVEL", "LEVEL", // 8-15 - "OFFSET" , "REPEATS", "OFFSET", "TRIGGER", "LEVELSWEEP"// 16- + "OFFSET" , "REPEATS", "OFFSET", "TRIGGER", "LEVEL SWEEP", "SWEEP TIME"// 16- }; #endif @@ -1061,7 +1081,8 @@ const menuitem_t menu_lowoutputmode[] = { { MT_FORM | MT_SUBMENU, 0, "MODULATION: %s", menu_modulation}, { MT_FORM | MT_KEYPAD, KM_SPAN, "SPAN: %s", NULL}, { MT_FORM | MT_KEYPAD, KM_LEVELSWEEP, "LEVELSWEEP: %s", NULL}, -// { MT_FORM | MT_KEYPAD, KM_10MHZ, "10MHZ: %s", NULL}, + { MT_FORM | MT_KEYPAD, KM_SWEEP_TIME, "SWEEP TIME: %s", NULL}, + // { MT_FORM | MT_KEYPAD, KM_10MHZ, "10MHZ: %s", NULL}, { MT_FORM | MT_CANCEL, 0, S_LARROW" BACK", NULL }, { MT_FORM | MT_NONE, 0, NULL, NULL } // sentinel }; @@ -1726,6 +1747,10 @@ static void fetch_numeric_target(void) uistat.value = setting.level_sweep; plot_printf(uistat.text, sizeof uistat.text, "%.1fdB", uistat.value); break; + case KM_SWEEP_TIME: + uistat.value = setting.sweep_time; + plot_printf(uistat.text, sizeof uistat.text, "%.0fmS", uistat.value); + break; case KM_TRIGGER: uistat.value = setting.trigger_level; plot_printf(uistat.text, sizeof uistat.text, "%fdB", uistat.value); @@ -1812,6 +1837,9 @@ set_numeric_value(void) case KM_LEVELSWEEP: set_level_sweep(uistat.value); break; + case KM_SWEEP_TIME: + set_sweep_time(uistat.value); + break; case KM_TRIGGER: set_trigger_level(uistat.value); break;