diff --git a/Makefile b/Makefile index 4865a71..2e5c0c6 100644 --- a/Makefile +++ b/Makefile @@ -226,6 +226,7 @@ flash: build/ch.bin dfu-util -d 0483:df11 -a 0 -s 0x08000000:leave -D build/ch.bin dfu: + c:/work/dfu/HEX2DFU build/ch.hex build/ch.dfu -@printf "reset dfu\r" >/dev/cu.usbmodem401 diff --git a/nanovna.h b/nanovna.h index 57ec27f..71c98f3 100644 --- a/nanovna.h +++ b/nanovna.h @@ -163,7 +163,7 @@ extern const char *info_about[]; void reset_settings(int); //void ui_process_touch(void); void SetPowerGrid(int); -void SetRefLevel(int); +void SetRefLevel(float); void set_refer_output(int); void toggle_below_IF(void); int get_refer_output(void); @@ -197,8 +197,8 @@ void set_subtract_storage(void); void toggle_waterfall(void); void set_mode(int); int GetMode(void); -void set_reflevel(int); -void set_scale(int); +void set_reflevel(float); +void set_scale(float); void AllDirty(void); void MenuDirty(void); void toggle_LNA(void); @@ -338,6 +338,12 @@ enum trace_type { // Electrical Delay // Phase +enum unit_type { + U_DBM=0, U_DBMV, U_DBUV, U_VOLT, U_MWATT, +}; + +float value(float); + typedef struct trace { uint8_t enabled; uint8_t type; @@ -533,8 +539,8 @@ typedef struct setting int agc; int lna; int auto_reflevel; - int reflevel; - int scale; + float reflevel; + float scale; int tracking; int modulation; int step_delay; @@ -556,7 +562,9 @@ typedef struct setting trace_t _trace[TRACES_MAX]; marker_t _markers[MARKERS_MAX]; int8_t _active_marker; + int8_t unit; uint32_t checksum; + float offset; }setting_t; extern setting_t setting; @@ -778,8 +786,9 @@ int get_waterfall(void); void toggle_tracking(void); void calibrate(void); void reset_calibration(void); -void set_reflevel(int); -void set_scale(int); +void set_reflevel(float); +void set_offset(float); +void set_unit(int); void set_RBW(int); void set_switches(int); //extern int setting_measurement; diff --git a/plot.c b/plot.c index 733683f..09d0ef7 100644 --- a/plot.c +++ b/plot.c @@ -451,12 +451,31 @@ draw_on_strut(int v0, int d, int color) /* * calculate log10(abs(gamma)) */ -static float -logmag(const float *v) +float +value(const float v) { - return v[0]; // raw data is in logmag*10 format + switch(setting.unit) + { + case U_DBMV: + return v+ 30.0 + 20.0*log10(sqrt(50)); + break; + case U_DBUV: + return v+ 90.0 + 20.0*log10(sqrt(50.0)); + break; + case U_VOLT: + return pow(10, (v - 30.0)/20.0) * sqrt(50.0); + break; + case U_MWATT: + return pow(10, v/10.0); + break; + } +// case U_DBM: + return v; // raw data is in logmag*10 format + } + + #ifdef __VNA_ /* * calculate phase[-2:2] of coefficient @@ -566,14 +585,14 @@ static index_t trace_into_index(int t, int i, float array[POINTS_COUNT]) { int y, x; - - float *coeff = &array[i]; + float coeff = array[i]; float refpos = NGRIDY - get_trace_refpos(t); float v = refpos; float scale = 1 / get_trace_scale(t); + switch (trace[t].type) { case TRC_LOGMAG: - v-= logmag(coeff) * scale; + v-= value(coeff) * scale; break; #ifdef __VNA__ case TRC_PHASE: @@ -777,6 +796,15 @@ trace_get_value_string_delta(int t, char *buf, int len, float array[POINTS_COUNT } #endif +static const char *unit_string[] = +{ + "", + "dBmV", + "dBuV", + "V", + "mW" +}; + static void trace_get_value_string( int t, char *buf, int len, int i, float coeff[POINTS_COUNT], @@ -812,14 +840,19 @@ static void trace_get_value_string( plot_printf(&buf2[1], sizeof(buf2) -1, "%3.1f" , (dfreq + 50000) / 1000000.0); // frequency_string(&buf2[1], sizeof(buf2) -1, dfreq); - v = logmag(&coeff[i]); + v = value(coeff[i]); if (mtype & M_NOISE) v = v - 10*log10(get_actual_RBW()*1000.0); if (v == -INFINITY) plot_printf(buf, len, "-INF"); - else - plot_printf(buf, len, "%s %.1f%s", buf2, v - rlevel,(mtype & M_NOISE?"/Hz":"")); + else { + if (setting.unit) + plot_printf(buf, len, "%s %.5f%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":"")); + } } + #ifdef __VNA__ static int trace_get_info(int t, char *buf, int len) @@ -1911,10 +1944,10 @@ static void cell_draw_marker_info(int x0, int y0) } for (int i = 0; i < MARKER_COUNT; i++) { if (i >= 2 && setting.measurement == M_OIP3 && markers[2].enabled && markers[3].enabled) { - float il = logmag(&(actual_t[markers[2].index])); - float ir = logmag(&(actual_t[markers[3].index])); - float sl = logmag(&(actual_t[markers[0].index])); - float sr = logmag(&(actual_t[markers[1].index])); + float il = value((actual_t[markers[2].index])); + float ir = value((actual_t[markers[3].index])); + float sl = value((actual_t[markers[0].index])); + float sr = value((actual_t[markers[1].index])); float ip = sl+ (sr - il)/2; plot_printf(buf, sizeof buf, "OIP3: %4.1fdB", ip); @@ -1978,13 +2011,19 @@ static void cell_draw_marker_info(int x0, int y0) buf[k++] = 0; ili9341_set_background(DEFAULT_BG_COLOR); ili9341_set_foreground(marker_color(markers[i].mtype)); - cell_drawstring_7x13(buf, xpos, ypos); + if (setting.unit) + cell_drawstring(buf, xpos, ypos); + else + cell_drawstring_7x13(buf, xpos, ypos); xpos += strlen(buf)*7; // cell_drawstring_size(buf, xpos, ypos, 2); trace_get_value_string( t, buf, sizeof buf, idx, measured[trace[t].channel], frequencies, sweep_points, ridx, markers[i].mtype); - cell_drawstring_7x13(buf, xpos, ypos); + if (setting.unit) + cell_drawstring(buf, xpos, ypos); + else + cell_drawstring_7x13(buf, xpos, ypos); // cell_drawstring_size(buf, xpos+3*7, ypos, 2); j++; } diff --git a/sa_cmd.c b/sa_cmd.c index f599708..1d6f998 100644 --- a/sa_cmd.c +++ b/sa_cmd.c @@ -70,7 +70,7 @@ VNA_SHELL_FUNCTION(cmd_rbw) shell_printf("usage: rbw 2..600|auto\r\n"); return; } - if (strcmp(argv[0],"auto") == 0) { + if (strcmp(argv[0],"auto") == 0 || strcmp(argv[0],"0") == 0) { set_RBW(0); } else { int a = my_atoi(argv[0]); @@ -207,7 +207,7 @@ VNA_SHELL_FUNCTION(cmd_o) VNA_SHELL_FUNCTION(cmd_d) { (void) argc; - int32_t a = my_atoi(argv[0]); +// int32_t a = my_atoi(argv[0]); // setting.drive = a; } diff --git a/sa_core.c b/sa_core.c index a85fe26..89d40c6 100644 --- a/sa_core.c +++ b/sa_core.c @@ -46,6 +46,7 @@ void reset_settings(int m) setting.tracking_output = false; setting.measurement = M_OFF; setting.frequency_IF = 433800000; + setting.offset = 0.0; trace[TRACE_STORED].enabled = false; trace[TRACE_TEMP].enabled = false; #ifdef __SPUR__ @@ -187,6 +188,12 @@ void set_IF(int f) dirty = true; } +void set_unit(int u) +{ + setting.unit = u; + dirty = true; +} + int GetMode(void) { return(setting.mode); @@ -195,8 +202,8 @@ int GetMode(void) #define POWER_STEP 0 // Should be 5 dB but appearently it is lower -#define POWER_OFFSET 20 -#define SWITCH_ATTENUATION 29 +#define POWER_OFFSET 15 +#define SWITCH_ATTENUATION 30 int get_attenuation(void) { @@ -434,7 +441,7 @@ int GetAGC(void) return(setting.agc); } -void set_reflevel(int level) +void set_reflevel(float level) { setting.reflevel = (level / setting.scale) * setting.scale; set_trace_refpos(0, NGRIDY - level / get_trace_scale(0)); @@ -443,11 +450,17 @@ void set_reflevel(int level) dirty = true; } + +void set_offset(float offset) +{ + setting.offset = offset; + dirty = true; +} //int GetRefpos(void) { // return (NGRIDY - get_trace_refpos(2)) * get_trace_scale(2); //} -void set_scale(int s) { +void set_scale(float s) { setting.scale = s; set_trace_scale(0, s); set_trace_scale(1, s); @@ -978,7 +991,7 @@ again: signal_path_loss = -5.5; // Loss in dB, -9.5 for v0.1, -12.5 for v0.2 else signal_path_loss = +7; // Loss in dB (+ is gain) - float subRSSI = SI4432_RSSI(lf, MODE_SELECT(setting.mode))+get_level_offset()+ setting.attenuate - signal_path_loss; + float subRSSI = SI4432_RSSI(lf, MODE_SELECT(setting.mode))+get_level_offset()+ setting.attenuate - signal_path_loss - setting.offset; #ifdef __SPUR__ if (setting.spur == 1) { // First pass spur_RSSI = subRSSI; @@ -1115,27 +1128,28 @@ static bool sweep(bool break_on_operation) scandirty = false; draw_cal_status(); } + if (!in_selftest && setting.mode == M_LOW && setting.auto_attenuation && max_index[0] > 0) { - if (actual_t[max_index[0]] - setting.attenuate < - 3*setting.scale && setting.attenuate >= setting.scale) { - setting.attenuate -= setting.scale; + if (actual_t[max_index[0]] - setting.attenuate < - 30 && setting.attenuate >= 10) { + setting.attenuate -= 10; redraw_request |= REDRAW_CAL_STATUS; dirty = true; // Must be above if(scandirty!!!!!) - } else if (actual_t[max_index[0]] - setting.attenuate > - 1.5*setting.scale && setting.attenuate <= 30 - setting.scale) { - setting.attenuate += setting.scale; + } else if (actual_t[max_index[0]] - setting.attenuate > - 15 && setting.attenuate <= 20) { + setting.attenuate += 10; redraw_request |= REDRAW_CAL_STATUS; dirty = true; // Must be above if(scandirty!!!!!) } } if (!in_selftest && MODE_INPUT(setting.mode) && setting.auto_reflevel && max_index[0] > 0) { - if (actual_t[max_index[0]] > setting.reflevel - setting.scale/2) { + 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 - 9 * setting.scale - 2 && actual_t[max_index[0]] < setting.reflevel - setting.scale * 3 / 2) { + } else if (temp_min_level < setting.reflevel - 9.2 * 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; dirty = true; // Must be above if(scandirty!!!!!) - } else if (temp_min_level > setting.reflevel - 9 * setting.scale + setting.scale + 2) { + } else if (temp_min_level > setting.reflevel - 7.8 * setting.scale) { set_reflevel(setting.reflevel + setting.scale); redraw_request |= REDRAW_CAL_STATUS; dirty = true; // Must be above if(scandirty!!!!!) @@ -1380,8 +1394,8 @@ void draw_cal_status(void) ili9341_set_background(DEFAULT_BG_COLOR); - int yMax = setting.reflevel; - plot_printf(buf, BLEN, "%ddB", yMax); + float yMax = setting.reflevel; + plot_printf(buf, BLEN, "%f", yMax); buf[5]=0; if (level_is_calibrated()) { if (setting.auto_reflevel) @@ -1397,7 +1411,7 @@ void draw_cal_status(void) color = DEFAULT_FG_COLOR; ili9341_set_foreground(color); y += YSTEP*2; - plot_printf(buf, BLEN, "%ddB/",(int)setting.scale); + plot_printf(buf, BLEN, "%f/",setting.scale); ili9341_drawstring(buf, x, y); if (setting.auto_attenuation) @@ -1496,6 +1510,17 @@ void draw_cal_status(void) ili9341_drawstring(buf, x, y); } + if (setting.offset != 0.0) { + ili9341_set_foreground(BRIGHT_COLOR_RED); + y += YSTEP*2; + ili9341_drawstring("Amp:", x, y); + + y += YSTEP; + plot_printf(buf, BLEN, "%fdB",setting.offset); + buf[5]=0; + ili9341_drawstring(buf, x, y); + } + ili9341_set_foreground(BRIGHT_COLOR_GREEN); y += YSTEP*2; if (MODE_LOW(setting.mode)) @@ -1505,7 +1530,7 @@ void draw_cal_status(void) y = HEIGHT-7 + OFFSETY; - plot_printf(buf, BLEN, "%ddB", (int)(yMax - setting.scale * NGRIDY)); + plot_printf(buf, BLEN, "%f", (yMax - setting.scale * NGRIDY)); buf[5]=0; if (level_is_calibrated()) if (setting.auto_reflevel) diff --git a/ui_sa.c b/ui_sa.c index db4a1f6..258e2f3 100644 --- a/ui_sa.c +++ b/ui_sa.c @@ -279,7 +279,7 @@ 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_ACTUALPOWER, KM_IF, KM_SAMPLETIME, KM_DRIVE, KM_LOWOUTLEVEL, KM_DECAY, KM_NOISE, KM_10MHZ, KM_REPEAT, KM_OFFSET, }; @@ -389,6 +389,7 @@ static const keypads_t * const keypads_mode_tbl[] = { keypads_level, // KM_NOISE keypads_level, // KM_10MHz keypads_level, // KM_REPEA + keypads_level, // KM_OFFSET }; #ifdef __VNA__ @@ -399,7 +400,7 @@ static const char * const keypad_mode_label[] = { #ifdef __SA__ 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", "OFFSET" , "REPEATS"// 8-17 + "\2ATTENUATE\0 0-31dB", "ACTUALPOWER", "IF", "SAMPLE TIME", "DRIVE", "LEVEL", "LEVEL", "LEVEL", "OFFSET" , "REPEATS", "OFFSET"// 8-17 }; #endif @@ -829,12 +830,23 @@ static void menu_rbw_cb(int item, uint8_t data) // draw_cal_status(); } -int menu_dBper_value[]={1,2,5,10,20}; +static void menu_unit_cb (int item, uint8_t data) +{ + (void)item; + set_unit(data); + menu_move_back(); + ui_mode_normal(); +} + +enum { + S_20,S_10,S_5,S_2,S_1,S_P5,S_P2,S_P1,S_P05,S_P02,S_P01 +}; +static const float menu_scale_per_value[11]={20,10,5,2,1,0.5,0.2,0.1,0.05,0.02,0.01}; -static void menu_dBper_cb(int item, uint8_t data) +static void menu_scale_per_cb(int item, uint8_t data) { (void)item; - set_scale(data); + set_scale(menu_scale_per_value[data]); menu_move_back(); ui_mode_normal(); // draw_cal_status(); @@ -910,7 +922,7 @@ static void menu_pause_cb(int item, uint8_t data) } //const int menu_drive_value[]={5,10,15,20}; -const char *menu_drive_text[]={"-36dBm","-34dBm","-32dBm","-30dBm","-28dBm","-26dBm","-24dBm"," -22dBm", " -10dBm"," -7dBm"," -4dBm"," -1dBm"," 2dBm"," 5dBm"," 8dBm"," 11dBm"}; +const char *menu_drive_text[]={"-38dBm","-35dBm","-33dBm","-30dBm","-27dBm","-24dBm","-21dBm"," -19dBm", " -7dBm"," -4dBm"," -2dBm"," 1dBm"," 4dBm"," 7dBm"," 10dBm"," 13dBm"}; @@ -965,42 +977,42 @@ static const menuitem_t menu_load_preset[] = }; static const menuitem_t menu_drive[] = { - { MT_CALLBACK, 15, " 20dBm", menu_drive_cb}, - { MT_CALLBACK, 14, " 16dBm", menu_drive_cb}, - { MT_CALLBACK, 13, " 12dBm", menu_drive_cb}, - { MT_CALLBACK, 12, " 8dBm", menu_drive_cb}, + { MT_CALLBACK, 15, " 15dBm", menu_drive_cb}, + { MT_CALLBACK, 14, " 12dBm", menu_drive_cb}, + { MT_CALLBACK, 13, " 9dBm", menu_drive_cb}, + { MT_CALLBACK, 12, " 6dBm", menu_drive_cb}, { MT_CANCEL, 255, S_LARROW" BACK", NULL }, { MT_NONE, 0, NULL, NULL } // sentinel }; static const menuitem_t menu_drive_wide3[] = { - { MT_FORM | MT_CALLBACK, 5, "-26dBm", menu_drive_cb }, - { MT_FORM | MT_CALLBACK, 4, "-28dBm", menu_drive_cb}, + { MT_FORM | MT_CALLBACK, 5, "-24dBm", menu_drive_cb }, + { MT_FORM | MT_CALLBACK, 4, "-27dBm", menu_drive_cb}, { MT_FORM | MT_CALLBACK, 3, "-30dBm", menu_drive_cb}, - { MT_FORM | MT_CALLBACK, 2, "-32dBm", menu_drive_cb }, - { MT_FORM | MT_CALLBACK, 1, "-34dBm", menu_drive_cb}, - { MT_FORM | MT_CALLBACK, 0, "-36dBm", menu_drive_cb}, + { MT_FORM | MT_CALLBACK, 2, "-33dBm", menu_drive_cb }, + { MT_FORM | MT_CALLBACK, 1, "-35dBm", menu_drive_cb}, + { MT_FORM | MT_CALLBACK, 0, "-38dBm", menu_drive_cb}, { MT_FORM | MT_CANCEL, 255, S_LARROW" BACK", NULL }, { MT_FORM | MT_NONE, 0, NULL, NULL } // sentinel }; static const menuitem_t menu_drive_wide2[] = { - { MT_FORM | MT_CALLBACK, 10, " -4dBm", menu_drive_cb }, - { MT_FORM | MT_CALLBACK, 9, " -7dBm", menu_drive_cb}, - { MT_FORM | MT_CALLBACK, 8, "-10dBm", menu_drive_cb}, - { MT_FORM | MT_CALLBACK, 7, "-22dBm", menu_drive_cb }, - { MT_FORM | MT_CALLBACK, 6, "-24dBm", menu_drive_cb}, + { MT_FORM | MT_CALLBACK, 10, " -2dBm", menu_drive_cb }, + { MT_FORM | MT_CALLBACK, 9, " -4dBm", menu_drive_cb}, + { MT_FORM | MT_CALLBACK, 8, " -7dBm", menu_drive_cb}, + { MT_FORM | MT_CALLBACK, 7, "-19dBm", menu_drive_cb }, + { MT_FORM | MT_CALLBACK, 6, "-21dBm", menu_drive_cb}, { MT_FORM | MT_SUBMENU, 255, S_RARROW" MORE", menu_drive_wide3}, { MT_FORM | MT_CANCEL, 255, S_LARROW" BACK", NULL }, { MT_FORM | MT_NONE, 0, NULL, NULL } // sentinel }; static const menuitem_t menu_drive_wide[] = { - { MT_FORM | MT_CALLBACK, 15, " 11dBm", menu_drive_cb}, - { MT_FORM | MT_CALLBACK, 14, " 8dBm", menu_drive_cb}, - { MT_FORM | MT_CALLBACK, 13, " 5dBm", menu_drive_cb}, - { MT_FORM | MT_CALLBACK, 12, " 2dBm", menu_drive_cb}, - { MT_FORM | MT_CALLBACK, 11, " -1dBm", menu_drive_cb}, + { MT_FORM | MT_CALLBACK, 15, " 13dBm", menu_drive_cb}, + { MT_FORM | MT_CALLBACK, 14, " 10dBm", menu_drive_cb}, + { MT_FORM | MT_CALLBACK, 13, " 7dBm", menu_drive_cb}, + { MT_FORM | MT_CALLBACK, 12, " 4dBm", menu_drive_cb}, + { MT_FORM | MT_CALLBACK, 11, " 1dBm", menu_drive_cb}, { MT_FORM | MT_SUBMENU, 255, S_RARROW" MORE", menu_drive_wide2}, { MT_FORM | MT_CANCEL, 255, S_LARROW" BACK", NULL }, { MT_FORM | MT_NONE, 0, NULL, NULL } // sentinel @@ -1062,12 +1074,27 @@ static const menuitem_t menu_rbw[] = { }; -static const menuitem_t menu_dBper[] = { - { MT_CALLBACK, 1, " 1dB/", menu_dBper_cb}, - { MT_CALLBACK, 2, " 2dB/", menu_dBper_cb}, - { MT_CALLBACK, 5, " 5dB/", menu_dBper_cb}, - { MT_CALLBACK, 10," 10dB/", menu_dBper_cb}, - { MT_CALLBACK, 20," 20dB/", menu_dBper_cb}, +static const menuitem_t menu_scale_per2[] = { + { MT_CALLBACK, 6, "0.1 /", menu_scale_per_cb}, + { MT_CALLBACK, 7, "0.2 /", menu_scale_per_cb}, + { MT_CALLBACK, 8, "0.05/", menu_scale_per_cb}, + { MT_CALLBACK, 9, "0.02/", menu_scale_per_cb}, + { MT_CALLBACK,10, "0.01/", menu_scale_per_cb}, +// { MT_CALLBACK,11, "0.005/", menu_scale_per_cb}, +// { MT_SUBMENU, 0, S_RARROW" MORE", menu_scale_per2}, + { MT_CANCEL, 0, S_LARROW" BACK", NULL }, + { MT_NONE, 0, NULL, NULL } // sentinel +}; + +static const menuitem_t menu_scale_per[] = { + { MT_CALLBACK, 0, " 20/", menu_scale_per_cb}, + { MT_CALLBACK, 1, " 10/", menu_scale_per_cb}, + { MT_CALLBACK, 2, " 5/", menu_scale_per_cb}, + { MT_CALLBACK, 3, " 2/", menu_scale_per_cb}, + { MT_CALLBACK, 4, " 1/", menu_scale_per_cb}, + { MT_CALLBACK, 5, "0.5/", menu_scale_per_cb}, + { MT_SUBMENU, 0, S_RARROW" MORE", menu_scale_per2}, + { MT_CANCEL, 0, S_LARROW" BACK", NULL }, { MT_NONE, 0, NULL, NULL } // sentinel }; @@ -1235,7 +1262,7 @@ static const menuitem_t menu_settings[] = { MT_KEYPAD, KM_IF, "\2IF\0FREQ", NULL}, { MT_SUBMENU,0, "\2SCAN\0SPEED", menu_scanning_speed}, { MT_KEYPAD, KM_REPEAT, "REPEATS", NULL}, - { MT_SUBMENU,0, "\2LO\0DRIVE", menu_drive}, + { MT_SUBMENU,0, "\2MIXER\0DRIVE", menu_drive}, #ifdef __ULTRA__ { MT_SUBMENU,0, "HARMONIC", menu_harmonic}, #endif @@ -1341,19 +1368,39 @@ static const menuitem_t menu_displayhigh[] = { { MT_NONE, 0, NULL, NULL } // sentinel }; + +static const menuitem_t menu_unit[] = +{ + { MT_CALLBACK,U_DBM, "dBm", menu_unit_cb}, + { MT_CALLBACK,U_DBMV, "dBmV", menu_unit_cb}, + { MT_CALLBACK,U_DBUV, "dBuV", menu_unit_cb}, + { MT_CALLBACK,U_VOLT, "Volt", menu_unit_cb}, + { MT_CALLBACK,U_MWATT, "mWatt", menu_unit_cb}, + { MT_CANCEL, 0, S_LARROW" BACK", NULL }, + { MT_NONE, 0, NULL, NULL } // sentinel +}; + + + static const menuitem_t menu_levelhigh[] = { { MT_SUBMENU, 0, "\2REF\0LEVEL", menu_reflevel}, - { MT_SUBMENU, 0, "\2SCALE/\0DIV",menu_dBper}, +// { MT_SUBMENU, 0, "\2SCALE/\0DIV",menu_scale_per}, + { MT_KEYPAD, KM_SCALE, "\2SCALE/\0DIV", NULL}, { MT_SUBMENU,0, "AVER", menu_average}, { MT_CANCEL, 0, S_LARROW" BACK",NULL }, + { MT_SUBMENU, 0, "UNIT", menu_unit}, + { MT_KEYPAD, KM_OFFSET, "\2EXTERN\0AMP", NULL}, { MT_NONE, 0, NULL, NULL } // sentinel }; static const menuitem_t menu_level[] = { { MT_SUBMENU, 0, "\2REF\0LEVEL", menu_reflevel}, - { MT_SUBMENU, 0, "\2SCALE/\0DIV",menu_dBper}, +// { MT_SUBMENU, 0, "\2SCALE/\0DIV",menu_scale_per}, + { MT_KEYPAD, KM_SCALE, "\2SCALE/\0DIV", NULL}, { MT_SUBMENU, 0, "ATTEN", menu_atten}, { MT_SUBMENU,0, "AVER", menu_average}, + { MT_SUBMENU, 0, "UNIT", menu_unit}, + { MT_KEYPAD, KM_OFFSET, "\2EXTERN\0AMP", NULL}, { MT_CANCEL, 0, S_LARROW" BACK",NULL }, { MT_NONE, 0, NULL, NULL } // sentinel }; @@ -1508,8 +1555,8 @@ static void menu_item_modify_attribute( if (item == GetAverage()){ mark = true; } - } else if (menu == menu_dBper) { - if (data == setting.scale){ + } else if (menu == menu_scale_per) { + if (menu_scale_per_value[data] == setting.scale){ mark = true; } } else if (menu == menu_measure && MT_MASK(menu[item].type) == MT_CALLBACK) { @@ -1641,11 +1688,11 @@ static void fetch_numeric_target(void) break; case KM_SCALE: uistat.value = setting.scale; - plot_printf(uistat.text, sizeof uistat.text, "%ddB/", ((int32_t)uistat.value)); + plot_printf(uistat.text, sizeof uistat.text, "%f/", uistat.value); break; case KM_REFPOS: uistat.value = setting.reflevel; - plot_printf(uistat.text, sizeof uistat.text, "%ddB", ((int32_t)uistat.value)); + plot_printf(uistat.text, sizeof uistat.text, "%f", uistat.value); break; case KM_ATTENUATION: uistat.value = get_attenuation(); @@ -1687,6 +1734,10 @@ static void fetch_numeric_target(void) uistat.value = setting_frequency_10mhz; plot_printf(uistat.text, sizeof uistat.text, "%3.6fMHz", uistat.value / 1000000.0); break; + case KM_OFFSET: + uistat.value = setting.offset; + plot_printf(uistat.text, sizeof uistat.text, "%fdB", uistat.value); + break; } @@ -1720,9 +1771,7 @@ set_numeric_value(void) set_sweep_frequency(ST_CW, uistat.value); break; case KM_SCALE: - set_trace_scale(0, uistat.value / 1000.0); - set_trace_scale(1, uistat.value / 1000.0); - set_trace_scale(2, uistat.value / 1000.0); + set_scale(uistat.value); break; case KM_REFPOS: setting.auto_reflevel = false; @@ -1765,5 +1814,8 @@ set_numeric_value(void) set_10mhz(uistat.value); dirty = true; break; + case KM_OFFSET: + set_offset(uistat.value); + break; } }