From ba60a0e615c3164e3279bb3aea015ec966bc6718 Mon Sep 17 00:00:00 2001 From: erikkaashoek Date: Thu, 22 Apr 2021 09:32:44 +0200 Subject: [PATCH] Temp reading, input correction curve editing --- main.c | 11 ++-- nanovna.h | 15 ++++- plot.c | 1 + sa_cmd.c | 9 +++ sa_core.c | 32 ++++++--- si4468.c | 10 +++ ui.c | 30 ++++++++- ui_sa.c | 194 ++++++++++++++++++++++++++++++++++++++++++------------ 8 files changed, 240 insertions(+), 62 deletions(-) diff --git a/main.c b/main.c index 8fa493d..678d5b9 100644 --- a/main.c +++ b/main.c @@ -1020,13 +1020,13 @@ config_t config = { { { 10000, 100000, 300000, 1000000, 30000000, 500000000, 750000000, 750000010, 1000000000, 1500000000, 1520000000, 2000000000, 2500000000, 3000000000, 3500000000, 4000000000, 4500000000, 5000000000, 5500000000, 6000000000 }, { 10000, 100000, 300000, 1000000, 30000000, 500000000, 750000000, 750000010, 1000000000, 1500000000, 1520000000, 2000000000, 2500000000, 3000000000, 3500000000, 4000000000, 4500000000, 5000000000, 5500000000, 6000000000 }, - { 10000, 80000, 150000, 300000, 1000000, 5000000, 80000000, 180000000, 650000000, 700000000, 760000000, 780000000, 790000000, 800000000, 800000000, 800000000, 800000000, 800000000, 800000000, 800000000 }, + { 10000, 50000, 80000, 150000, 300000, 1000000, 5000000, 80000000, 100000000, 180000000, 650000000, 700000000, 760000000, 780000000, 790000000, 800000000, 800000000, 800000000, 800000000, 800000000}, }, .correction_value = { - { 10.5, +4.9, +1.6, +0.6, 0, 0, +2, +0, +2, +2, +2, +2, +3.5, +6.5, +6.5, +9, +9, +9, +11, +11,}, // low in - { 10.5, +4.9, +1.6, +0.6, 0, 0, +2, +0, +2, +2, +2, +2, +6, +9, +11.5, +14.5, +23, +25, +36, +46,}, // LNA in - { 11.5, 6, 3.5, 1.5, 0.5, -0.2, 0, -0.5, +1.5, +2, +4, +6.5, +9, +13, +13, +13, +13, +13, +13, +13, }, // low out + { 10.5, +4.9, +1.6, +0.6, 0, 0, +2, +0, +2, +2, +2, +2, +3.5, +6.5, +6.5, +9, +9, +9, +11, +11,}, // low in + { 10.5, +4.9, +1.6, +0.6, 0, 0, +2, +0, +2, +2, +2, +2, +6, +9, +11.5, +14.5, +23, +25, +36, +46,}, // LNA in + { 11.5, 7, 6, 3.5, 1.5, 0.5, -0.2, 0, 0, -0.5, +1.5, +2, +4, +6.5, +9, +13, +13, +13, +13, +13, }, // low out }, .setting_frequency_30mhz = 30000000, .cor_am = 0, @@ -2503,7 +2503,8 @@ static const VNAShellCommand commands[] = { "v", cmd_v, CMD_WAIT_MUTEX }, { "a", cmd_a, CMD_WAIT_MUTEX }, { "b", cmd_b, CMD_WAIT_MUTEX }, - { "t", cmd_t, CMD_WAIT_MUTEX }, + { "t", cmd_t, CMD_WAIT_MUTEX }, + { "k", cmd_k, CMD_WAIT_MUTEX }, { "e", cmd_e, CMD_WAIT_MUTEX }, { "s", cmd_s, CMD_WAIT_MUTEX }, { "m", cmd_m, CMD_WAIT_MUTEX }, diff --git a/nanovna.h b/nanovna.h index d7aee70..59bbf60 100644 --- a/nanovna.h +++ b/nanovna.h @@ -18,7 +18,7 @@ */ #include "ch.h" -#ifdef TINYSA_F303 +//#ifdef TINYSA_F303 #include "adc_F303.h" #ifdef TINYSA_F072 #error "Remove comment for #ifdef TINYSA_F303" @@ -27,7 +27,7 @@ #define TINYSA4 #endif #define TINYSA4_PROTO -#endif +//#endif #ifdef TINYSA_F072 #ifdef TINYSA_F303 @@ -64,6 +64,11 @@ //#define __HAM_BAND__ #define __SPUR__ // Does spur reduction by shifting IF //#define __USE_SERIAL_CONSOLE__ // Enable serial I/O connection (need enable HAL_USE_SERIAL as TRUE in halconf.h) +#ifdef __USE_SERIAL_CONSOLE__ +#if (HAL_USE_SERIAL != TRUE) +//#error "HAL_USE_SERIAL must be set to true" +#endif +#endif #define __SINGLE_LETTER__ // Add fast console commands #define __NICE_BIG_FONT__ // Add not scaled big font for menus #define __QUASI_PEAK__ // Add quasi peak average option @@ -74,6 +79,7 @@ #ifdef TINYSA4 #define __HARMONIC__ #define __VBW__ +#define __SWEEP_RESTART__ #else #endif @@ -946,6 +952,7 @@ typedef struct setting bool tracking_output; // bool bool mute; // bool bool auto_IF; // bool + bool sweep; // bool uint8_t mode; // enum uint8_t below_IF; // enum @@ -1203,9 +1210,11 @@ void menu_push_lowoutput(void); void menu_push_highoutput(void); void menu_move_top(void); void draw_menu(void); +void refres_sweep_menu(void); int check_touched(void); int invoke_quick_menu(int); bool ui_process_listen_lever(void); +void refresh_sweep_menu(int i); // Irq operation process set #define OP_NONE 0x00 @@ -1319,7 +1328,7 @@ int plot_printf(char *str, int, const char *fmt, ...); typedef uint8_t deviceRSSI_t; typedef int16_t pureRSSI_t; - +extern int current_index; // RSSI values conversion macro #define DEVICE_TO_PURE_RSSI(rssi) ((rssi)<<4) diff --git a/plot.c b/plot.c index fa3d49b..314b2b0 100644 --- a/plot.c +++ b/plot.c @@ -1320,6 +1320,7 @@ static void trace_print_value_string( // Only used at one place int ri, // reference Marker number float coeff[POINTS_COUNT]) { + (void) bold; int mtype = markers[mi].mtype; int idx = markers[mi].index; float v = value(coeff[idx]); diff --git a/sa_cmd.c b/sa_cmd.c index 2ee9cd3..d04cfdf 100644 --- a/sa_cmd.c +++ b/sa_cmd.c @@ -1005,6 +1005,15 @@ VNA_SHELL_FUNCTION(cmd_q) } goto again; } + +extern float Si446x_get_temp(void); +VNA_SHELL_FUNCTION(cmd_k) +{ + float value; + shell_printf("temperature: %f\r\n", Si446x_get_temp()); +} + + #endif diff --git a/sa_core.c b/sa_core.c index c60a703..4e50941 100644 --- a/sa_core.c +++ b/sa_core.c @@ -38,6 +38,7 @@ uint8_t scandirty = true; bool debug_avoid = false; bool debug_avoid_second = false; +int current_index = -1; setting_t setting; freq_t frequencies[POINTS_COUNT]; @@ -175,6 +176,7 @@ void reset_settings(int m) { // strcpy((char *)spi_buffer, dummy); setting.mode = m; + setting.sweep = false; #ifdef TINYSA4 ultra_threshold = config.ultra_threshold; ultra = config.ultra; @@ -2355,7 +2357,7 @@ int avoid_spur(freq_t f) // find if this frequency should be a else { #ifdef TINYSA4 - int w = (m >= sizeof(spur_div)/sizeof(uint8_t) ? 3 : 1); + int w = ((unsigned int)m >= sizeof(spur_div)/sizeof(uint8_t) ? 3 : 1); fmin = f - spur_gate*w; fplus = f + spur_gate*w; if (spur_table[m] < fmin || spur_table[m] > fplus) @@ -3571,11 +3573,18 @@ static bool sweep(bool break_on_operation) // if break back to top level to handle ui operation if (refreshing) scandirty = false; - if (break_on_operation && operation_requested) { // break loop if needed + if ((break_on_operation && operation_requested ) +#ifdef __SWEEP_RESTART__ + || (MODE_OUTPUT(setting.mode) && !setting.sweep && (setting.level_sweep != 0 || get_sweep_frequency(ST_SPAN) != 0)) +#endif + ) { // break loop if needed abort: if (setting.actual_sweep_time_us > ONE_SECOND_TIME /* && MODE_INPUT(setting.mode) */) { ili9341_set_background(LCD_BG_COLOR); ili9341_fill(OFFSETX, CHART_BOTTOM+1, WIDTH, 1); // Erase progress bar +#ifdef __SWEEP_RESTART__ + refresh_sweep_menu(-1); +#endif } return false; } @@ -3621,18 +3630,20 @@ static bool sweep(bool break_on_operation) } } } - if ( -#ifdef TINYSA4 - show_bar && (i & 0x07) == 0 && (setting.actual_sweep_time_us > ONE_SECOND_TIME || (chVTGetSystemTimeX() - start_of_sweep_timestamp) > ONE_SECOND_TIME / 100) // if required -#else - show_bar && (i & 0x07) == 0 && setting.actual_sweep_time_us > ONE_SECOND_TIME // if required -#endif - ) { + systime_t local_sweep_time = (chVTGetSystemTimeX() - start_of_sweep_timestamp)*100 ; + if (setting.actual_sweep_time_us > ONE_SECOND_TIME) + local_sweep_time = setting.actual_sweep_time_us; + if (show_bar && (( local_sweep_time > ONE_SECOND_TIME && (i & 0x07) == 0) || ( local_sweep_time > ONE_SECOND_TIME*10)) ) + { int pos = i * (WIDTH+1) / sweep_points; ili9341_set_background(LCD_SWEEP_LINE_COLOR); ili9341_fill(OFFSETX, CHART_BOTTOM+1, pos, 1); // update sweep progress bar ili9341_set_background(LCD_BG_COLOR); ili9341_fill(OFFSETX+pos, CHART_BOTTOM+1, WIDTH-pos, 1); +#ifdef __SWEEP_RESTART__ + if (MODE_OUTPUT(setting.mode) && (setting.level_sweep != 0 || get_sweep_frequency(ST_SPAN) != 0)) + refresh_sweep_menu(i); +#endif } // ----------------------- debug avoid -------------------------------- if (debug_avoid) { @@ -3821,6 +3832,9 @@ static bool sweep(bool break_on_operation) // ili9341_fill(OFFSETX, CHART_BOTTOM+1, WIDTH, 1, 0); // Erase progress bar before updating actual_sweep_time ili9341_set_background(LCD_BG_COLOR); ili9341_fill(OFFSETX, CHART_BOTTOM+1, WIDTH, 1); +#ifdef __SWEEP_RESTART__ + refresh_sweep_menu(-1); +#endif } // ---------------------- process measured actual sweep time ----------------- // For CW mode value calculated in SI4432_Fill diff --git a/si4468.c b/si4468.c index b5e9fd9..79568d9 100644 --- a/si4468.c +++ b/si4468.c @@ -1207,6 +1207,16 @@ void Si446x_getInfo(si446x_info_t* info) info->patch = (data[3]<<8) | data[4]; info->func = data[5]; } + +float Si446x_get_temp(void) +{ + uint8_t data[6] = { SI446X_CMD_GET_ADC_READING, 0x10 }; + SI4463_do_api(data, 2, data, 6); + float t = (data[4] << 8) + data[5]; + t = (899.0 * t /4096.0) - 293.0; + return t; +} + #ifdef notused static uint8_t SI4463_get_device_status(void) { diff --git a/ui.c b/ui.c index 2ad6fc1..e4b13b1 100644 --- a/ui.c +++ b/ui.c @@ -1820,7 +1820,7 @@ static const char *step_text[5] = {"-10dB", "-1dB", "set", "+1dB", "+10dB"}; static char step_text_freq[5][10] = { "-100MHz", "-10MHz", "set", "+10MHz", "+100MHz" }; static void -draw_menu_buttons(const menuitem_t *menu) +draw_menu_buttons(const menuitem_t *menu, int only) { int i = 0; int y = 0; @@ -1830,6 +1830,14 @@ draw_menu_buttons(const menuitem_t *menu) continue; if (MT_MASK(menu[i].type) == MT_NONE) break; +#ifdef __SWEEP_RESTART__ + if (only != -1 && only != i) { + y += MENU_BUTTON_HEIGHT; + continue; + } +#else + (void)only; +#endif button.icon = BUTTON_ICON_NONE; // Border width button.border = MENU_BUTTON_BORDER; @@ -2204,8 +2212,26 @@ menu_apply_touch(int touch_x, int touch_y) void draw_menu(void) { - draw_menu_buttons(menu_stack[menu_current_level]); + draw_menu_buttons(menu_stack[menu_current_level], -1); +} + +#ifdef __SWEEP_RESTART__ +systime_t old_sweep_time; + +void +refresh_sweep_menu(int i) +{ + current_index = i; + systime_t new_sweep_time = chVTGetSystemTimeX(); + if (new_sweep_time - old_sweep_time > ONE_SECOND_TIME/200 && i >= 0) { + old_sweep_time = new_sweep_time; + if (menu_stack[menu_current_level] == menu_lowoutputmode) + draw_menu_buttons(menu_stack[menu_current_level], 5); + if (menu_stack[menu_current_level] == menu_highoutputmode) + draw_menu_buttons(menu_stack[menu_current_level], 5); + } } +#endif static void erase_menu_buttons(void) diff --git a/ui_sa.c b/ui_sa.c index ed47028..6aebb86 100644 --- a/ui_sa.c +++ b/ui_sa.c @@ -509,11 +509,17 @@ static const menuitem_t menu_sweep_points[]; static const menuitem_t menu_sweep_points_form[]; static const menuitem_t menu_modulation[]; static const menuitem_t menu_limit_modify[]; +#ifdef __USE_SERIAL_CONSOLE__ +static const menuitem_t menu_connection[]; +#endif //static const menuitem_t menu_drive_wide[]; #ifdef TINYSA4 static const menuitem_t menu_settings3[]; +static const menuitem_t menu_curve[]; +static const menuitem_t menu_curve_confirm[]; #endif static const menuitem_t menu_sweep[]; +extern bool dirty; static UI_FUNCTION_ADV_CALLBACK(menu_sweep_acb) { @@ -533,41 +539,139 @@ static UI_FUNCTION_ADV_CALLBACK(menu_sweep_acb) } menu_push_submenu(menu_sweep); } + +#ifdef __SWEEP_RESTART__ +static UI_FUNCTION_ADV_CALLBACK(menu_restart_acb){ + (void)item; + (void)data; + if(b){ + if (current_index >= 0 && setting.sweep) { + float current_level = setting.level + ((float)current_index)* setting.level_sweep / (float)sweep_points; + plot_printf(uistat.text, sizeof uistat.text, "STOP %5.3QHz %+.1fdBm", frequencies[current_index], current_level); + b->param_1.text = uistat.text; + } else { + b->param_1.text = "START SWEEP"; + } + return; + } + setting.sweep = !setting.sweep; + dirty = true; +} +#endif + #ifdef TINYSA4 + +float local_actual_level; +int current_curve; +int current_curve_index; + static UI_FUNCTION_ADV_CALLBACK(menu_curve_acb) -{ + { (void)item; + int old_m; if (b){ plot_printf(uistat.text, sizeof uistat.text, "%.3QHz %+.1fdB", - config.correction_frequency[CORRECTION_LOW_OUT][data], - config.correction_value[CORRECTION_LOW_OUT][data]); + config.correction_frequency[current_curve][data], + config.correction_value[current_curve][data]); b->param_1.text = uistat.text; return; } - if (config.low_level_output_offset == 100) + switch(current_curve) { + case CORRECTION_LOW_OUT: + old_m = setting.mode; + reset_settings(M_GENLOW); + set_level(-35); + set_sweep_frequency(ST_CW, config.correction_frequency[current_curve][data]); + setting.mute = false; + perform(false, 0, config.correction_frequency[current_curve][data], false); + perform(false, 1, config.correction_frequency[current_curve][data], false); + plot_printf(uistat.text, sizeof uistat.text, "Level of %.3QHz output", + config.correction_frequency[current_curve][data]); + kp_help_text = uistat.text; + kp_buf[0]=0; + ui_mode_keypad(KM_LEVEL); + + if (kp_buf[0] != 0) { + float new_offset = (-35.0) - uistat.value + config.correction_value[current_curve][data]; // calculate offset based on difference between measured peak level and known peak level + if (new_offset > -25 && new_offset < 25) { + config.correction_value[current_curve][data] = new_offset; + config_save(); + } + } + reset_settings(old_m); + break; + case CORRECTION_LNA: + reset_settings(M_LOW); + setting.extra_lna = true; + goto common; + case CORRECTION_LOW: + reset_settings(M_LOW); + common: + set_sweep_frequency(ST_SPAN, 1000000); + set_sweep_frequency(ST_CENTER, config.correction_frequency[current_curve][data]); + current_curve_index = data; + menu_push_submenu(menu_curve_confirm); + break; + } +} + +extern float peakLevel; + +UI_FUNCTION_CALLBACK(menu_curve_confirm_cb) +{ + (void)item; + if (data) { + float new_offset = local_actual_level - peakLevel + config.correction_value[current_curve][current_curve_index]; // calculate offset based on difference between measured peak level and known peak level + if (new_offset > -25 && new_offset < 25) { + config.correction_value[current_curve][current_curve_index] = new_offset; + config_save(); + } + } + menu_move_back(false); +} + +static UI_FUNCTION_CALLBACK(menu_input_curve_prepare_cb) +{ + (void)item; + (void)data; + if (config.low_level_offset == 100) return; - int old_m = setting.mode; - reset_settings(M_GENLOW); - set_level(-35); - set_sweep_frequency(ST_CW, config.correction_frequency[CORRECTION_LOW_OUT][data]); - setting.mute = false; - perform(false, 0, config.correction_frequency[CORRECTION_LOW_OUT][data], false); - perform(false, 1, config.correction_frequency[CORRECTION_LOW_OUT][data], false); - plot_printf(uistat.text, sizeof uistat.text, "Level of %.3QHz output", - config.correction_frequency[CORRECTION_LOW_OUT][data]); - kp_help_text = uistat.text; + kp_help_text = "Enter actual input level"; kp_buf[0]=0; ui_mode_keypad(KM_LEVEL); + if (kp_buf[0] != 0) { + local_actual_level = uistat.value; + current_curve = CORRECTION_LOW; + menu_push_submenu(menu_curve); + } +} +static UI_FUNCTION_CALLBACK(menu_lna_curve_prepare_cb) +{ + (void)item; + (void)data; + if (config.low_level_offset == 100) + return; + kp_help_text = "Enter actual input level"; + kp_buf[0]=0; + ui_mode_keypad(KM_LEVEL); if (kp_buf[0] != 0) { - float new_offset = (-35.0) - uistat.value + config.correction_value[CORRECTION_LOW_OUT][data]; // calculate offset based on difference between measured peak level and known peak level - if (new_offset > -25 && new_offset < 25) { - config.correction_value[CORRECTION_LOW_OUT][data] = new_offset; - config_save(); - } + local_actual_level = uistat.value; + current_curve = CORRECTION_LNA; + menu_push_submenu(menu_curve); } - reset_settings(old_m); } + +static UI_FUNCTION_CALLBACK(menu_output_curve_prepare_cb) +{ + (void)item; + (void)data; + if (config.low_level_output_offset == 100) + return; + current_curve = CORRECTION_LOW_OUT; + menu_push_submenu(menu_curve); +} + #endif static UI_FUNCTION_ADV_CALLBACK(menu_output_level_acb) @@ -668,8 +772,6 @@ static UI_FUNCTION_ADV_CALLBACK(menu_store_preset_acb) menu_move_back(true); } - -extern bool dirty; UI_FUNCTION_CALLBACK(menu_autosettings_cb) { (void)item; @@ -1854,37 +1956,34 @@ char center_text[18] = "FREQ: %s"; static const menuitem_t menu_lowoutputmode[] = { { MT_FORM | MT_ADV_CALLBACK, 0, "LOW OUTPUT %s", menu_outputmode_acb}, // { MT_FORM | MT_ADV_CALLBACK, 0, "MOD: %s", menu_smodulation_acb}, -#ifdef TINYSA4 - { MT_FORM | MT_SUBMENU, 255, S_RARROW" Settings", menu_settings3}, -#endif { MT_FORM | MT_KEYPAD, KM_CENTER, center_text, VARIANT("10kHz..350MHz","10kHz..850MHz")}, { MT_FORM | MT_KEYPAD, KM_LOWOUTLEVEL, "LEVEL: %s", low_level_help_text}, { MT_FORM | MT_ADV_CALLBACK, 0, "MOD: %s", menu_smodulation_acb}, { MT_FORM | MT_ADV_CALLBACK, 0, "%s", menu_sweep_acb}, -// { MT_FORM | MT_KEYPAD, KM_SPAN, "SPAN: %s", "0..350MHz"}, -// { MT_FORM | MT_KEYPAD | MT_LOW, KM_LEVELSWEEP,"LEVEL CHANGE: %s", "-70..70"}, -// { MT_FORM | MT_KEYPAD, KM_SWEEP_TIME, "SWEEP TIME: %s", "0..600 seconds"}, +#ifdef __SWEEP_RESTART__ + { MT_FORM | MT_ADV_CALLBACK, 0, "%s", menu_restart_acb}, +#endif { MT_FORM | MT_KEYPAD, KM_EXT_GAIN, "EXTERNAL GAIN: %s", "-100..+100"}, +#ifdef TINYSA4 + { MT_FORM | MT_SUBMENU, 255, S_RARROW" Settings", menu_settings3}, +#endif { MT_FORM | MT_CANCEL, 0, "MODE", NULL }, { MT_FORM | MT_NONE, 0, NULL, NULL } // sentinel }; static const menuitem_t menu_highoutputmode[] = { { MT_FORM | MT_ADV_CALLBACK, 0, "HIGH OUTPUT %s", menu_outputmode_acb}, -#ifdef TINYSA4 - { MT_FORM | MT_SUBMENU, 255, S_RARROW" Settings", menu_settings3}, -#endif { MT_FORM | MT_KEYPAD, KM_CENTER, center_text, VARIANT("240MHz..960MHz","136MHz..4350MHz")}, -// { MT_FORM | MT_ADV_CALLBACK, 0, "LEVEL: %+ddBm", menu_sdrive_acb}, { MT_FORM | MT_KEYPAD, KM_HIGHOUTLEVEL, "LEVEL: %s", low_level_help_text /* "-76..-6" */}, { MT_FORM | MT_ADV_CALLBACK, 0, "MOD: %s", menu_smodulation_acb}, -#ifdef TINYSA4 { MT_FORM | MT_ADV_CALLBACK, 0, "%s", menu_sweep_acb}, -#else - { MT_FORM | MT_KEYPAD, KM_SPAN, "SPAN: %s", NULL}, - { MT_FORM | MT_KEYPAD, KM_SWEEP_TIME,"SWEEP TIME: %s", "0..600 seconds"}, +#ifdef __SWEEP_RESTART__ + { MT_FORM | MT_ADV_CALLBACK, 0, "%s", menu_restart_acb}, #endif { MT_FORM | MT_KEYPAD, KM_EXT_GAIN, "EXTERNAL GAIN: %s", "-100..+100"}, +#ifdef TINYSA4 + { MT_FORM | MT_SUBMENU, 255, S_RARROW" Settings", menu_settings3}, +#endif { MT_FORM | MT_CANCEL, 0, "MODE", NULL }, { MT_FORM | MT_NONE, 0, NULL, NULL } // sentinel }; @@ -2194,6 +2293,9 @@ static const menuitem_t menu_settings3[] = #else { MT_KEYPAD, KM_10MHZ, "CORRECT\nFREQUENCY", "Enter actual l0MHz frequency"}, { MT_KEYPAD, KM_GRIDLINES, "MINIMUM\nGRIDLINES", "Enter minimum horizontal grid divisions"}, +#ifdef __USE_SERIAL_CONSOLE__ + { MT_SUBMENU, 0, "CONNECTION", menu_connection}, +#endif #ifdef __HAM_BAND__ { MT_ADV_CALLBACK, 0, "HAM\nBANDS", menu_settings_ham_bands}, #endif @@ -2277,14 +2379,23 @@ static const menuitem_t menu_curve[] = { { MT_FORM | MT_CANCEL, 0, S_LARROW" BACK", NULL }, { MT_NONE, 0, NULL, NULL } // sentinel }; + +static const menuitem_t menu_curve_confirm[] = { + { MT_CALLBACK, 1, "OK", menu_curve_confirm_cb }, + { MT_CALLBACK, 0, "CANCEL", menu_curve_confirm_cb }, + { MT_NONE, 0, NULL, NULL } // sentinel +}; + #endif static const menuitem_t menu_actual_power[] = { - { MT_KEYPAD, KM_ACTUALPOWER, "INPUT\nLEVEL", "dBm"}, - { MT_ADV_CALLBACK, 0, "OUTPUT\nLEVEL", menu_output_level_acb}, + { MT_KEYPAD, KM_ACTUALPOWER, "INPUT\nLEVEL", "dBm"}, + { MT_ADV_CALLBACK, 0, "OUTPUT\nLEVEL", menu_output_level_acb}, #ifdef TINYSA4 - { MT_SUBMENU | MT_LOW,0, "OUTPUT\nCURVE", menu_curve}, + { MT_CALLBACK, 0, "INPUT\nCURVE", menu_input_curve_prepare_cb}, + { MT_CALLBACK, 0, "LNA\nCURVE", menu_lna_curve_prepare_cb}, + { MT_SUBMENU | MT_LOW, 0, "OUTPUT\nCURVE", menu_output_curve_prepare_cb}, #endif { MT_CANCEL, 0, S_LARROW" BACK", NULL }, { MT_NONE, 0, NULL, NULL } // sentinel @@ -2374,7 +2485,7 @@ const menuitem_t menu_serial_speed[] = { { MT_NONE, 0, NULL, NULL } // sentinel }; -const menuitem_t menu_connection[] = { +static const menuitem_t menu_connection[] = { { MT_ADV_CALLBACK, _MODE_USB, "USB", menu_connection_acb }, { MT_ADV_CALLBACK, _MODE_SERIAL, "SERIAL", menu_connection_acb }, { MT_SUBMENU, 0, "SERIAL\nSPEED", menu_serial_speed }, @@ -2400,9 +2511,6 @@ static const menuitem_t menu_config[] = { #ifdef __SPUR__ { MT_ADV_CALLBACK,0, "%s", menu_spur_acb}, #endif -#ifdef __USE_SERIAL_CONSOLE__ - { MT_SUBMENU, 0, "CONNECTION", menu_connection}, -#endif #ifdef TINYSA4 { MT_KEYPAD, KM_REPEAT, "SAMPLE\nREPEAT", "1..100"}, #endif