Scale entry and trace command afapted

tinySA-v0.2
erikkaashoek 6 years ago
parent 785d302817
commit 7f0efbfdf9

@ -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;
@ -1720,7 +1734,7 @@ VNA_SHELL_FUNCTION(cmd_trace)
set_trace_type(t, TRC_OFF);
goto exit;
}
if ('0' <= argv[0][0] && argv[0][0] <= '9') {
t = my_atoi(argv[0]);
if (t < 0 || t >= TRACES_MAX)
goto usage;
@ -1730,44 +1744,45 @@ VNA_SHELL_FUNCTION(cmd_trace)
shell_printf("%d %s %s\r\n", t, type, channel);
return;
}
#if MAX_TRACE_TYPE != 12
#error "Trace type enum possibly changed, check cmd_trace function"
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_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);
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_trace_type(t, type);
goto check_ch_num;
set_unit(type);
return;
}
}
// 0 1
static const char cmd_scale_ref_list[] = "scale|refpos";
if (argc >= 3) {
switch (get_str_index(argv[1], cmd_scale_ref_list)) {
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_trace_scale(t, my_atof(argv[2]));
set_scale(my_atof(argv[1]));
goto exit;
case 1:
//trace[t].refpos = my_atof(argv[2]);
set_trace_refpos(t, my_atof(argv[2]));
set_reflevel(my_atof(argv[1]));
goto exit;
default:
goto usage;
}
}
check_ch_num:
if (argc > 2) {
int src = my_atoi(argv[2]);
if (src != 0 && src != 1)
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);
}

@ -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

@ -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":""));
}
}

@ -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));

19
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);
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;

@ -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_n },
{ 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_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 },

Loading…
Cancel
Save

Powered by TurnKey Linux.