diff --git a/main.c b/main.c index 042e8e8..c084a4c 100644 --- a/main.c +++ b/main.c @@ -1,5 +1,4 @@ /* - * All rights reserved. * * This is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -418,6 +417,11 @@ static int32_t my_atoi(const char *p) if (*p == '+') p++; while ((c = *p++ - '0') < 10) value = value * 10 + c; + switch (*(--p)) { + case 'k': value *= 1000; break; + case 'M': value *= 1000000; break; + case 'G': value *= 1000000000; break; + } return neg ? -value : value; } @@ -481,6 +485,16 @@ my_atof(const char *p) exp++; } } + switch (*p) { + case 'k': x *= 1e+3; break; + case 'M': x *= 1e+6; break; + case 'G': x *= 1e+9; break; + case 'm': x /= 1e+3; break; + case 'u': x /= 1e+6; break; + case 'n': x /= 1e+9; break; + case 'p': x /= 1e+12; break; + } + if (neg) x = -x; return x; @@ -1716,58 +1730,59 @@ VNA_SHELL_FUNCTION(cmd_trace) if (strcmp(argv[0], "all") == 0 && argc > 1 && strcmp(argv[1], "off") == 0) { - for (t = 0; t < TRACES_MAX; t++) + for (t = 0; t < TRACES_MAX; t++) set_trace_type(t, TRC_OFF); goto exit; } - - t = my_atoi(argv[0]); - if (t < 0 || t >= TRACES_MAX) - goto usage; - if (argc == 1) { - const char *type = get_trace_typename(t); - const char *channel = trc_channel_name[trace[t].channel]; - shell_printf("%d %s %s\r\n", t, type, channel); - return; + if ('0' <= argv[0][0] && argv[0][0] <= '9') { + t = my_atoi(argv[0]); + if (t < 0 || t >= TRACES_MAX) + goto usage; + if (argc == 1) { + const char *type = get_trace_typename(t); + const char *channel = trc_channel_name[trace[t].channel]; + shell_printf("%d %s %s\r\n", t, type, channel); + return; + } + if (argc > 1 && strcmp(argv[1], "off") == 0) + set_trace_type(t, TRC_OFF); + if (argc > 1 && strcmp(argv[1], "on") == 0) + set_trace_type(t, TRC_LOGMAG); + goto exit; } -#if MAX_TRACE_TYPE != 12 -#error "Trace type enum possibly changed, check cmd_trace function" +#if MAX_UNIT_TYPE != 4 +#error "Unit type enum possibly changed, check cmd_trace function" #endif - // enum TRC_LOGMAG, TRC_PHASE, TRC_DELAY, TRC_SMITH, TRC_POLAR, TRC_LINEAR, TRC_SWR, TRC_REAL, TRC_IMAG, TRC_R, TRC_X, TRC_OFF - static const char cmd_type_list[] = "logmag|phase|delay|smith|polar|linear|swr|real|imag|r|x|off"; - int type = get_str_index(argv[1], cmd_type_list); - if (type >= 0) { - set_trace_type(t, type); - goto check_ch_num; - } - // 0 1 - static const char cmd_scale_ref_list[] = "scale|refpos"; - if (argc >= 3) { - switch (get_str_index(argv[1], cmd_scale_ref_list)) { - case 0: - //trace[t].scale = my_atof(argv[2]); - set_trace_scale(t, my_atof(argv[2])); - goto exit; - case 1: - //trace[t].refpos = my_atof(argv[2]); - set_trace_refpos(t, my_atof(argv[2])); - goto exit; - default: - goto usage; + static const char cmd_type_list[] = "dBm|dBmV|dBuV|V|W"; + if (argc == 1) { + int type = get_str_index(argv[0], cmd_type_list); + if (type >= 0) { + set_unit(type); + return; } } -check_ch_num: - if (argc > 2) { - int src = my_atoi(argv[2]); - if (src != 0 && src != 1) + // 0 1 + static const char cmd_scale_ref_list[] = "scale|reflevel"; + if (argc == 2) { + switch (get_str_index(argv[0], cmd_scale_ref_list)) { + case 0: + //trace[t].scale = my_atof(argv[2]); + set_scale(my_atof(argv[1])); + goto exit; + case 1: + //trace[t].refpos = my_atof(argv[2]); + set_reflevel(my_atof(argv[1])); + goto exit; + default: goto usage; - trace[t].channel = src; + } } -exit: + exit: return; usage: - shell_printf("trace {0|1|2|3|all} [%s] [src]\r\n"\ - "trace {0|1|2|3} {%s} {value}\r\n", cmd_type_list, cmd_scale_ref_list); + shell_printf("trace {0|1|2|all} [{on|off]\r\n"\ + "trace {%s}\r\n"\ + "trace {%s} {value}\r\n", cmd_type_list, cmd_scale_ref_list); } diff --git a/nanovna.h b/nanovna.h index 4612b85..ee6d8c4 100644 --- a/nanovna.h +++ b/nanovna.h @@ -203,7 +203,7 @@ void set_mode(int); int GetMode(void); void set_reflevel(float); #define REFLEVEL_MAX 9999.0 -#define REFLEVEL_MIN 0.00000000001 +#define REFLEVEL_MIN 1.0e-12 void set_scale(float); void AllDirty(void); void MenuDirty(void); @@ -344,8 +344,9 @@ enum trace_type { // Electrical Delay // Phase +#define MAX_UNIT_TYPE 4 enum unit_type { - U_DBM=0, U_DBMV, U_DBUV, U_VOLT, U_MVOLT, U_UVOLT, U_WATT, U_MWATT, U_UWATT + U_DBM=0, U_DBMV, U_DBUV, U_VOLT, U_WATT }; #define UNIT_IS_LINEAR(T) ( T >= U_VOLT ? true : false) #define UNIT_IS_LOG(T) ( T >= U_VOLT ? false : true) @@ -604,7 +605,7 @@ enum { S_OFF=0, S_ON=1, S_AUTO_OFF=2, S_AUTO_ON=3 }; extern uint32_t frequencies[POINTS_COUNT]; extern const float unit_scale_value[]; -extern const char *unit_scale_text[]; +extern const char * const unit_scale_text[]; #if 1 #define SAVEAREA_MAX 9 diff --git a/plot.c b/plot.c index 4fb5032..11b7344 100644 --- a/plot.c +++ b/plot.c @@ -468,25 +468,12 @@ value(const float v) case U_DBUV: return v + 90.0 + 20.0*log10(sqrt(50.0)); break; - - case U_MVOLT: - return pow(10, (v-30.0)/20.0) * sqrt(50.0) * 1000.0; - break; case U_VOLT: return pow(10, (v-30.0)/20.0) * sqrt(50.0); break; - case U_UVOLT: - return pow(10, (v-30.0)/20.0) * sqrt(50.0) * 1000000.0; - break; case U_WATT: return pow(10, v/10.0)/1000.0; break; - case U_MWATT: - return pow(10, v/10.0); - break; - case U_UWATT: - return pow(10, (v)/10.0) * 1000.0; - break; } // case U_DBM: return v; // raw data is in logmag*10 format @@ -507,21 +494,9 @@ to_dBm(const float v) case U_VOLT: return log10( v / (sqrt(50.0))) * 20.0 + 30.0 ; break; - case U_MVOLT: - return log10( v / (sqrt(50.0) * 1000.0)) * 20.0 + 30.0 ; - break; - case U_UVOLT: - return log10(v / (sqrt(50.0) * 1000000.0))*20.0 + 30.0; - break; case U_WATT: return log10(v*1000.0)*10.0; break; - case U_MWATT: - return log10(v)*10.0; - break; - case U_UWATT: - return log10(v/1000.0)*10.0; - break; } // case U_DBM: return v; // raw data is in logmag*10 format @@ -878,7 +853,7 @@ static void trace_get_value_string( ii = i - ri; buf2[0] = '+'; } - rlevel = coeff[ri]; + rlevel = value(coeff[ri]); } else { dfreq = frequencies[i]; } @@ -920,11 +895,10 @@ static void trace_get_value_string( v = v - rlevel; if (UNIT_IS_LINEAR(setting.unit)) { plot_printf(buf3, sizeof(buf3), "%4f", v/setting.unit_scale); - buf3[5] = 0; } else { plot_printf(buf3, sizeof(buf3), "%.1f", v); - buf3[5] = 0; } + buf3[5] = 0; plot_printf(buf, len, "%s %s%s%s%s", buf2, buf3, unit_scale_text[setting.unit_scale_index], unit_string[setting.unit],(mtype & M_NOISE?"/Hz":"")); } } diff --git a/sa_core.c b/sa_core.c index 0730f52..cb102ab 100644 --- a/sa_core.c +++ b/sa_core.c @@ -21,6 +21,9 @@ int in_selftest = false; void reset_settings(int m) { setting.mode = m; + setting.unit_scale_index = 0; + setting.unit_scale = 1; + setting.unit = U_DBM; set_scale(10); set_reflevel(-10); setting.attenuate = 0; @@ -56,8 +59,6 @@ void reset_settings(int m) trace[TRACE_STORED].enabled = false; trace[TRACE_TEMP].enabled = false; setting.refer = -1; - setting.unit_scale_index = 0; - setting.unit_scale = 0; setting.mute = false; #ifdef __SPUR__ setting.spur = 0; @@ -449,6 +450,8 @@ void set_harmonic(int h) void set_step_delay(int d) { + if (d < 300 || d > 30000) + return; setting.step_delay = d; dirty = true; } @@ -517,6 +520,8 @@ int GetAGC(void) void set_unit(int u) { + if (setting.unit == u) + return; float r = to_dBm(setting.reflevel); // Get neutral unit float s = to_dBm(setting.scale); // float t = setting.trigger; // Is always in dBm @@ -546,8 +551,12 @@ void set_unit(int u) if (S_IS_AUTO(setting.lna)) setting.lna = S_AUTO_OFF; } + plot_into_index(measured); + force_set_markmap(); dirty = true; } +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 set_reflevel(float level) { @@ -566,6 +575,15 @@ void set_reflevel(float level) #endif } + setting.unit_scale_index = 0; + setting.unit_scale = 1.0; + while (UNIT_IS_LINEAR(setting.unit) && setting.unit_scale_index < sizeof(unit_scale_value)/sizeof(float) - 1) { + if (level > unit_scale_value[setting.unit_scale_index]) + break; + setting.unit_scale_index++; + } + setting.unit_scale = unit_scale_value[setting.unit_scale_index]; + setting.reflevel = level; set_trace_refpos(0, /* NGRIDY - */ level /* / get_trace_scale(0) */); set_trace_refpos(1, /* NGRIDY - */ level /* / get_trace_scale(0) */ ); @@ -1837,13 +1855,11 @@ float my_round(float v) return v; } -const char *unit_string[] = { "dBm", "dBmV", "dBuV", "V", "mV", "uV", "W", "mW", "uW" }; +const char *unit_string[] = { "dBm", "dBmV", "dBuV", "V", "W" }; 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"}; +static const char * const 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"}; -const float unit_scale_value[]={1,0.001,0.000001,0.000000001,0.000000000001}; -const char *unit_scale_text[]= {"","m", "u", "n", "p"}; void draw_cal_status(void) @@ -1855,8 +1871,6 @@ void draw_cal_status(void) int y = OFFSETY; unsigned int color; int rounding = false; - setting.unit_scale_index = 0; - setting.unit_scale = 1.0; if (!UNIT_IS_LINEAR(setting.unit)) rounding = true; const char *unit = unit_string[setting.unit]; @@ -1875,13 +1889,19 @@ void draw_cal_status(void) ili9341_set_background(DEFAULT_BG_COLOR); - float yMax = setting.reflevel; + float yMax = setting.reflevel; // Determine unit scale letter ( ,m,u,n,p) +#if 0 // moved to set_reflevel + setting.unit_scale_index = 0; + setting.unit_scale = 1.0; while (UNIT_IS_LINEAR(setting.unit) && setting.unit_scale_index < sizeof(unit_scale_value)/sizeof(float) - 1) { if (yMax > unit_scale_value[setting.unit_scale_index]) break; setting.unit_scale_index++; } setting.unit_scale = unit_scale_value[setting.unit_scale_index]; +#endif + + // Top level if (rounding) plot_printf(buf, BLEN, "%4d", (int)yMax); else @@ -1898,6 +1918,7 @@ void draw_cal_status(void) ili9341_set_foreground(color); ili9341_drawstring(buf, x, y); + // Unit #if 0 color = DEFAULT_FG_COLOR; ili9341_set_foreground(color); @@ -1910,6 +1931,7 @@ void draw_cal_status(void) plot_printf(buf, BLEN, "%s%s",unit_scale_text[setting.unit_scale_index], unit); ili9341_drawstring(buf, x, y); + // Scale color = DEFAULT_FG_COLOR; ili9341_set_foreground(color); y += YSTEP + YSTEP/2; @@ -1930,6 +1952,7 @@ void draw_cal_status(void) #endif ili9341_drawstring(buf, x, y); + // Attenuation if (setting.auto_attenuation) color = DEFAULT_FG_COLOR; else @@ -1943,6 +1966,7 @@ void draw_cal_status(void) buf[6]=0; ili9341_drawstring(buf, x, y); + // Average if (setting.average>0) { ili9341_set_foreground(BRIGHT_COLOR_BLUE); y += YSTEP + YSTEP/2 ; @@ -1953,6 +1977,7 @@ void draw_cal_status(void) buf[6]=0; ili9341_drawstring(buf, x, y); } + // Spur #ifdef __SPUR__ if (setting.spur) { ili9341_set_foreground(BRIGHT_COLOR_GREEN); @@ -1965,6 +1990,7 @@ void draw_cal_status(void) } #endif + // RBW if (setting.rbw) color = BRIGHT_COLOR_GREEN; else @@ -1979,6 +2005,7 @@ void draw_cal_status(void) buf[6]=0; ili9341_drawstring(buf, x, y); + // VBW if (setting.frequency_step > 0) { ili9341_set_foreground(DEFAULT_FG_COLOR); y += YSTEP + YSTEP/2 ; @@ -1989,6 +2016,8 @@ void draw_cal_status(void) buf[6]=0; ili9341_drawstring(buf, x, y); } + + // Sweep time if (dirty) color = BRIGHT_COLOR_RED; else if (setting.step_delay) @@ -2018,7 +2047,7 @@ void draw_cal_status(void) buf[6]=0; ili9341_drawstring(buf, x, y); - + // Cal output if (setting.refer >= 0) { ili9341_set_foreground(BRIGHT_COLOR_RED); y += YSTEP + YSTEP/2 ; @@ -2030,6 +2059,7 @@ void draw_cal_status(void) ili9341_drawstring(buf, x, y); } + // Offset if (setting.offset != 0.0) { ili9341_set_foreground(BRIGHT_COLOR_RED); y += YSTEP + YSTEP/2 ; @@ -2041,6 +2071,7 @@ void draw_cal_status(void) ili9341_drawstring(buf, x, y); } + // Repeat if (setting.repeat != 1) { ili9341_set_foreground(BRIGHT_COLOR_GREEN); y += YSTEP + YSTEP/2 ; @@ -2052,6 +2083,7 @@ void draw_cal_status(void) ili9341_drawstring(buf, x, y); } + // Trigger if (setting.trigger != T_AUTO) { if (is_paused()) { ili9341_set_foreground(BRIGHT_COLOR_GREEN); @@ -2070,7 +2102,7 @@ void draw_cal_status(void) ili9341_drawstring(buf, x, y); } - + // Mode if (level_is_calibrated()) color = BRIGHT_COLOR_GREEN; else @@ -2082,6 +2114,7 @@ void draw_cal_status(void) else ili9341_drawstring_7x13("HIGH", x, y); + // Compact status string // ili9341_set_background(DEFAULT_FG_COLOR); ili9341_set_foreground(DEFAULT_FG_COLOR); y += YSTEP + YSTEP/2 ; @@ -2112,6 +2145,7 @@ void draw_cal_status(void) buf[5] = 'B'; ili9341_drawstring(buf, x, y); + // Version y += YSTEP + YSTEP/2 ; strncpy(buf,&VERSION[8],6); buf[6]=0; @@ -2119,6 +2153,7 @@ void draw_cal_status(void) // ili9341_set_background(DEFAULT_BG_COLOR); + // Bottom level y = HEIGHT-7 + OFFSETY; if (rounding) plot_printf(buf, BLEN, "%4d", (int)(yMax - setting.scale * NGRIDY)); diff --git a/ui.c b/ui.c index 6b6a9fe..08da335 100644 --- a/ui.c +++ b/ui.c @@ -1361,6 +1361,10 @@ static const char * const keypad_mode_label[] = { }; #endif +static const char * const keypad_scale_text[] = { "1", "2", "5", "10", "20" , "50", "100", "200", "500"}; +static const int keypad_scale_value[] = { 1, 2, 5, 10, 20 , 50, 100, 200, 500}; + + static void draw_keypad(void) { @@ -1375,9 +1379,16 @@ draw_keypad(void) int y = KP_GET_Y(keypads[i].y); // ili9341_fill(x, y, KP_WIDTH, KP_HEIGHT, DEFAULT_MENU_TEXT_COLOR); // black area around button, causes flicker.... ili9341_fill(x+2, y+2, KP_WIDTH-4, KP_HEIGHT-4, bg); - ili9341_drawfont(keypads[i].c, + if (keypads[i].c < 32) { // KP_1 + ili9341_drawfont(keypads[i].c, x + (KP_WIDTH - NUM_FONT_GET_WIDTH) / 2, y + (KP_HEIGHT - NUM_FONT_GET_HEIGHT) / 2); + } else { + const char *t = keypad_scale_text[keypads[i].c - KP_1]; + ili9341_drawstring_size(t, + x + (KP_WIDTH - 5*strlen(t)*2) / 2, + y + (KP_HEIGHT - 13) / 2,2); + } i++; } } @@ -2067,7 +2078,7 @@ static int keypad_click(int key) { int c = keypads[key].c; - if ((c >= KP_X1 && c <= KP_G) || c == KP_m || c == KP_u) { + if ((c >= KP_X1 && c <= KP_G) || c == KP_m || c == KP_u || c == KP_n) { float scale = 1.0; if (c >= KP_X1 && c <= KP_G) { int n = c - KP_X1; @@ -2122,6 +2133,12 @@ keypad_click(int key) return KP_DONE; } else if (c <= 9 && kp_index < NUMINPUT_LEN) { kp_buf[kp_index++] = '0' + c; + } else if (c>=KP_1) { + kp_buf[kp_index++] = keypad_scale_text[c-KP_1][0]; + if (c >=KP_10) + kp_buf[kp_index++] = '0'; + if (c >=KP_100) + kp_buf[kp_index++] = '0'; } else if (c == KP_PERIOD && kp_index < NUMINPUT_LEN) { // check period in former input int j; diff --git a/ui_sa.c b/ui_sa.c index c2154c9..cbe337c 100644 --- a/ui_sa.c +++ b/ui_sa.c @@ -304,6 +304,16 @@ enum { #define KP_u 22 #define KP_n 23 +#define KP_1 32 +#define KP_2 33 +#define KP_5 34 +#define KP_10 35 +#define KP_20 36 +#define KP_50 37 +#define KP_100 38 +#define KP_200 39 +#define KP_500 40 + typedef struct { uint8_t x:4; @@ -315,6 +325,10 @@ static const keypads_t *keypads; static uint8_t keypads_last_index; +// 7 8 9 G +// 4 5 6 M +// 1 2 3 k +// 0 . < x static const keypads_t keypads_freq[] = { { 1, 3, KP_PERIOD }, @@ -336,6 +350,11 @@ static const keypads_t keypads_freq[] = { { 0, 0, -1 } }; +// 7 8 9 n +// 4 5 6 u +// 1 2 3 m +// 0 . < x + static const keypads_t keypads_scale[] = { { 1, 3, KP_PERIOD }, { 0, 3, 0 }, @@ -348,14 +367,39 @@ static const keypads_t keypads_scale[] = { { 0, 0, 7 }, { 1, 0, 8 }, { 2, 0, 9 }, - { 3, 0, KP_m }, + { 3, 0, KP_n }, + { 3, 1, KP_u }, + { 3, 2, KP_m }, + { 3, 3, KP_X1 }, + { 2, 3, KP_BS }, + { 0, 0, -1 } +}; + +static const keypads_t keypads_newscale[] = { + { 1, 3, KP_PERIOD }, + { 0, 3, 0 }, + { 0, 2, KP_1 }, + { 1, 2, KP_2 }, + { 2, 2, KP_5 }, + { 0, 1, KP_10 }, + { 1, 1, KP_20 }, + { 2, 1, KP_50 }, + { 0, 0, KP_100 }, + { 1, 0, KP_200 }, + { 2, 0, KP_500 }, + { 3, 0, KP_n }, { 3, 1, KP_u }, - { 3, 2, KP_n }, + { 3, 2, KP_m }, { 3, 3, KP_X1 }, { 2, 3, KP_BS }, { 0, 0, -1 } }; +// 7 8 9 m +// 4 5 6 u +// 1 2 3 - +// 0 . < x + static const keypads_t keypads_level[] = { { 1, 3, KP_PERIOD }, { 0, 3, 0 }, @@ -368,8 +412,8 @@ static const keypads_t keypads_level[] = { { 0, 0, 7 }, { 1, 0, 8 }, { 2, 0, 9 }, - { 3, 0, KP_m }, - { 3, 1, KP_u }, + { 3, 0, KP_u}, + { 3, 1, KP_m}, { 3, 2, KP_MINUS }, { 3, 3, KP_X1 }, { 2, 3, KP_BS }, @@ -388,8 +432,8 @@ static const keypads_t keypads_time[] = { { 0, 0, 7 }, { 1, 0, 8 }, { 2, 0, 9 }, - { 3, 1, KP_m }, - { 3, 2, KP_u }, + { 3, 1, KP_u}, + { 3, 2, KP_m}, { 3, 3, KP_MINUS }, { 2, 3, KP_BS }, { 0, 0, -1 } @@ -403,7 +447,7 @@ static const keypads_t * const keypads_mode_tbl[] = { keypads_freq, // span keypads_freq, // cw freq keypads_level, // refpos - keypads_scale, // scale + keypads_newscale, // scale keypads_scale, // attenuation keypads_level, // actual power keypads_freq, // IF @@ -427,9 +471,9 @@ static const char * const keypad_mode_label[] = { #endif #ifdef __SA__ static const char * const keypad_mode_label[] = { - "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", "SCANS", "LEVEL", // 8-15 - "OFFSET" , "REPEATS", "OFFSET", "\2TRIGGER\0LEVEL", "\2LEVEL\0SWEEP", "\2SWEEP\0SECONDS"// 16- + "error", "START", "STOP", "CENTER", "SPAN", "FREQ", "REFPOS", "SCALE", // 0-7 + "\2ATTENUATE\0 0-31dB", "\2ACTUAL\0POWER", "IF", "\2SAMPLE\0DELAY", "DRIVE", "LEVEL", "SCANS", "LEVEL", // 8-15 + "OFFSET" , "\2SAMPLE\0REPEAT", "OFFSET", "\2TRIGGER\0LEVEL", "\2LEVEL\0SWEEP", "\2SWEEP\0SECONDS"// 16- }; #endif @@ -1290,7 +1334,7 @@ static const menuitem_t menu_scanning_speed[] = { { MT_CALLBACK, 0, "FAST", menu_scanning_speed_cb}, { MT_CALLBACK, 1, "PRECISE", menu_scanning_speed_cb}, - { MT_KEYPAD, KM_SAMPLETIME, "\2POINT\0TIME", NULL}, + { MT_KEYPAD, KM_SAMPLETIME, "\2SAMPLE\0DELAY", NULL}, { MT_CANCEL, 0, S_LARROW" BACK", NULL }, { MT_NONE, 0, NULL, NULL } // sentinel }; @@ -1329,7 +1373,7 @@ static const menuitem_t menu_settings[] = { MT_KEYPAD, KM_ACTUALPOWER, "\2ACTUAL\0POWER", NULL}, { MT_KEYPAD | MT_LOW, KM_IF, "\2IF\0FREQ", NULL}, { MT_SUBMENU,0, "\2SCAN\0SPEED", menu_scanning_speed}, - { MT_KEYPAD, KM_REPEAT, "REPEATS", NULL}, + { MT_KEYPAD, KM_REPEAT, "\2SAMPLE\0REPEAT", NULL}, { MT_SUBMENU | MT_LOW,0, "\2MIXER\0DRIVE", menu_drive}, { MT_SUBMENU, 0, S_RARROW" MORE", menu_settings2}, { MT_CANCEL, 0, S_LARROW" BACK", NULL },