From 56cce661891770c989c03950d19caca6532b0321 Mon Sep 17 00:00:00 2001 From: erikkaashoek Date: Tue, 8 Oct 2024 13:19:42 +0200 Subject: [PATCH] Updated selftest and tables --- main.c | 52 +++++++++++++++++++++++++++++----------------------- nanovna.h | 10 ++++++---- sa_core.c | 25 +++++++++++++------------ ui.c | 44 +++++++++++++++++++++++++++++++++++++++----- 4 files changed, 87 insertions(+), 44 deletions(-) diff --git a/main.c b/main.c index f220059..7fc8dff 100644 --- a/main.c +++ b/main.c @@ -1269,34 +1269,34 @@ const float v5_2_lna_level_offset = 7; const freq_t v4_6_correction_frequency[CORRECTION_SIZE][CORRECTION_POINTS]= { - /* low */ { 100000, 1000000, 30000000, 220000000, 420000000, 750000000, 860000000, 900000000, 900000000, 900000000, 900000000, 900000000, 900000000, 900000000, 900000000, 900000000, 900000000, 900000000, 900000000, 900000000}, - /* low lna */ { 100000, 1000000, 30000000, 220000000, 360000000, 420000000, 630000000, 750000000, 810000000, 860000000, 900000000, 900000000, 900000000, 900000000, 900000000, 900000000, 900000000, 900000000, 900000000, 900000000}, + /* low */ { 100000, 1000000, 7000000, 30000000, 90000000, 220000000, 420000000, 460000000, 750000000, 860000000, 870000000, 880000000, 890000000, 900000000, 900000000, 900000000, 900000000, 900000000, 900000000, 900000000}, + /* low lna */ { 100000, 1000000, 30000000, 220000000, 360000000, 420000000, 630000000, 750000000, 810000000, 870000000, 880000000, 890000000, 900000000, 900000000, 900000000, 900000000, 900000000, 900000000, 900000000, 900000000}, /* ultra */ { 30000000, 700000000, 1270000000, 2090000000, 2620000000, 4130000000, 4710000000, 5090000000, 5410000000, 5410000000, 5410000000, 5410000000, 5410000000, 5410000000, 5410000000, 5410000000, 5410000000, 5410000000, 5410000000, 5410000000}, - /* ultra lna */ { 30000000, 1120000000, 2400000000, 3780000000, 3930000000, 4110000000, 4360000000, 4450000000, 4970000000, 5410000000, 5410000000, 5410000000, 5410000000, 5410000000, 5410000000, 5410000000, 5410000000, 5410000000, 5410000000, 5410000000}, - /* direct */ { 140000000, 180000000, 280000000, 330000000, 420000000, 560000000, 830000000, 910000000, 980000000, 1040000000, 1130000000, 1130000000, 1130000000, 1130000000, 1130000000, 1130000000, 1130000000, 1130000000, 1130000000, 1130000000}, - /* direct lna */ { 140000000, 180000000, 280000000, 330000000, 420000000, 560000000, 830000000, 910000000, 980000000, 1040000000, 1130000000, 1130000000, 1130000000, 1130000000, 1130000000, 1130000000, 1130000000, 1130000000, 1130000000, 1130000000, }, - /* harm */ { 30000000, 4000000000, 4601336303, 5095768374, 5296213808, 5496659243, 5804008909, 6298440980, 6806236080, 7193763920, 7501113586, 7701559020, 7995545657, 8302895323, 8797327394, 9104677060, 9305122494, 9505567929, 9799554566, 10000000000, }, - /* harm lna */ { 30000000, 4000000000, 4093541203, 4200445434, 4293986637, 4400890869, 4601336303, 5296213808, 5897550111, 6405345212, 6498886414, 6806236080, 7100222717, 7594654788, 7795100223, 8102449889, 8503340757, 8997772829, 9599109131, 10000000000, }, - /* out */ { 100000, 800000, 5000000, 20000000, 100000000, 230000000, 450000000, 700000000, 850000000, 890000000, 920000000, 920000000, 920000000, 920000000, 920000000, 920000000, 920000000, 920000000, 920000000, 920000000, }, - /* direct */ { 823000000, 1130000000, 1130000000, 1130000000, 1130000000, 1130000000, 1130000000, 1130000000, 1130000000, 1130000000, 1130000000, 1130000000, 1130000000, 1130000000, 1130000000, 1130000000, 1130000000, 1130000000, 1130000000, 1130000000, }, - /* adf */ { 140000000, 210000000, 260000000, 290000000, 340000000, 370000000, 410000000, 460000000, 500000000, 520000000, 570000000, 700000000, 1170000000, 1370000000, 2700000000, 3000000000, 3300000000, 4300000000, 4400000000, 4400000000, }, - /* ultra */ { 100000, 600000, 3000000, 40000000, 260000000, 730000000, 1020000000, 3600000000, 4700000000, 5400000000, 5400000000, 5400000000, 5400000000, 5400000000, 5400000000, 5400000000, 5400000000, 5400000000, 5400000000, 5400000000, }, + /* ultra lna */ { 30000000, 1120000000, 2400000000, 3540000000, 3780000000, 3930000000, 4110000000, 4360000000, 4450000000, 4540000000, 4700000000, 4970000000, 5410000000, 5410000000, 5410000000, 5410000000, 5410000000, 5410000000, 5410000000, 5410000000}, + /* direct */ { 140000000, 180000000, 280000000, 420000000, 560000000, 830000000, 920000000, 1000000000, 1130000000, 1130000000, 1130000000, 1130000000, 1130000000, 1130000000, 1130000000, 1130000000, 1130000000, 1130000000, 1130000000, 1130000000}, + /* direct lna */ { 140000000, 170000000, 180000000, 280000000, 330000000, 440000000, 560000000, 830000000, 900000000, 960000000, 1040000000, 1130000000, 1130000000, 1130000000, 1130000000, 1130000000, 1130000000, 1130000000, 1130000000, 1130000000}, + /* harm */ { 30000000, 5000000000, 5420000000, 6790000000, 7240000000, 7650000000, 7870000000, 8220000000, 8520000000, 8810000000, 9090000000, 9240000000, 9810000000, 10000000000, 10000000000, 10000000000, 10000000000, 10000000000, 10000000000, 10000000000}, + /* harm lna */ { 30000000, 5000000000, 5440000000, 5950000000, 6420000000, 6780000000, 7200000000, 7570000000, 7780000000, 7930000000, 8230000000, 8540000000, 9610000000, 9700000000, 10000000000, 10000000000, 10000000000, 10000000000, 10000000000, 10000000000}, + /* out */ { 100000, 800000, 3000000, 8000000, 80000000, 120000000, 200000000, 250000000, 550000000, 650000000, 780000000, 850000000, 890000000, 920000000, 920000000, 920000000, 920000000, 920000000, 920000000, 920000000,}, + /* direct */ { 823000000, 970000000, 1130000000, 1130000000, 1130000000, 1130000000, 1130000000, 1130000000, 1130000000, 1130000000, 1130000000, 1130000000, 1130000000, 1130000000, 1130000000, 1130000000, 1130000000, 1130000000, 1130000000, 1130000000}, + /* adf */ { 140000000, 230000000, 410000000, 510000000, 590000000, 740000000, 1150000000, 1320000000, 1390000000, 1700000000, 4500000000, 4500000000, 4500000000, 4500000000, 4500000000, 4500000000, 4500000000, 4500000000, 4500000000, 4400000000}, + /* ultra */ { 100000, 800000, 5000000, 80000000, 310000000, 700000000, 840000000, 1130000000, 2100000000, 3300000000, 4100000000, 4800000000, 5300000000, 5400000000, 5400000000, 5400000000, 5400000000, 5400000000, 5400000000, 5400000000} }; const float v4_6_correction_value[CORRECTION_SIZE][CORRECTION_POINTS]= { - /* low */ { 4, 0.25, 0.0001, 1, 0.0001, 0.0001, 1.5, 2.97, 2.97, 2.97, 2.97, 2.97, 2.97, 2.97, 2.97, 2.97, 2.97, 2.97, 2.97, 2.97, }, - /* low lna */ { 4.78, 0.12, 0.0001, 1, 1, 0.5, -0.5, 0.4, 0.5, 1.5, 2.97, 2.97, 2.97, 2.97, 2.97, 2.97, 2.97, 2.97, 2.97, 2.97, }, - /* ultra */ { 0.0001, 0.22, 1.5, 1.75, 3.4, 2.97, 6.97, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, }, - /* ultra lna */ { 0.0001, 1.5, 1.5, 6, 6.5, 8.5, 16, 16.5, 16.6, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, }, - /* direct */ { 53.7, 46, 34.2, 30.5, 24.3, 17.2, 4.46, 1.2, -0.34, -0.25, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, }, - /* direct lna */ { 54.5, 47, 35, 31, 25, 17.3, 5.62, 2.12, 1.1, 0.7, 2.16, 2.16, 2.16, 2.16, 2.16, 2.16, 2.16, 2.16, 2.16, 2.16, }, - /* harm */ { 2, 18.69, 21.69, 21.69, 20.69, 20.69, 23.1, 25.19, 29.7, 26.69, 26.19, 27.69, 33.69, 37.19, 40.69, 45.69, 48.19, 49.48, 47.7, 48.7, }, - /* harm lna */ { 2.8, 22.25, 23.25, 25.75, 29.75, 32.25, 34.25, 33.25, 36.25, 42.75, 43.75, 44.7, 42.7, 42.25, 43.75, 50.25, 55.75, 61.25, 65.25, 72.75, }, - /* out */ { 0.0001, -1.82, -3, -3.16, -3.5, -2.06, -3.68, -3.7, -2.74, -1.3, 1.28, 1.28, 1.28, 1.28, 1.28, 1.28, 1.28, 1.28, 1.28, 1.28, }, - /* direct */ { -3.14, 0.73, 0.73, 0.73, 0.73, 0.73, 0.73, 0.73, 0.73, 0.73, 0.73, 0.73, 0.73, 0.73, 0.73, 0.73, 0.73, 0.73, 0.73, 0.73, }, - /* adf */ { 31.4, 17.14, 15.46, 21.6, 14.3, 18.2, 30.7, 11.04, 1.74, -1.16, 1.67, -5.96, -6.55, -11.4, -7.34, -10.7, -5.4, -0.77, 3.07, 3.07, }, - /* ultra */ { -0.5, -2.15, -3.18, -3.45, -2.33, -3.48, -2.05, -0.01, 3.48, 0.73, 0.73, 0.73, 0.73, 0.73, 0.73, 0.73, 0.73, 0.73, 0.73, 0.73, }, + /* low */ { 4, 0.1, -1, -0.6, -1, 0.5, 0.0001, -1, -0.7, 0.5, 0.3, 1, 1.5, 2.28, 2.28, 2.28, 2.28, 2.28, 2.28, 2.28}, + /* low lna */ { 4.78, -0.5, -1.1, -0.05, 0.5, -0.2, -1, -0.5, -0.4, 0.2, 0.8, 1, 1.7, 1.7, 1.7, 1.7, 1.7, 1.7, 1.7, 1.7}, + /* ultra */ { 0.0001, 0.3, 2.4, 2.34, 3.3, 4.3, 8.3, 7.8, 8.4, 8.4, 8.4, 8.4, 8.4, 8.4, 8.4, 8.4, 8.4, 8.4, 8.4, 8.4}, + /* ultra lna */ { 0.0001, 1.8, 2.1, 7.1, 7.4, 8.02, 10, 17, 17.4, 18.3, 18.3, 17.7, 21, 21, 21, 21, 21, 21, 21, 21}, + /* direct */ { 55.9, 47.83, 35.46, 24.2, 15.84, 2.47, -0.03, -0.2, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5}, + /* direct lna */ { 55, 49.54, 48, 35.46, 31, 22.6, 15.49, 2.49, 0.001, -0.5, -0.5, 0.47, 0.47, 0.47, 0.47, 0.47, 0.47, 0.47, 0.47, 0.47}, + /* harm */ { 0, 15.5, 14.5, 21.5, 18, 17.5, 19.8, 27.6, 29.3, 33, 38.9, 39.4, 33.3, 31.47, 31.47, 31.47, 31.47, 31.47, 31.47, 31.47}, + /* harm lna */ { 0.01, 26.2, 25.26, 26.68, 33.02, 35.12, 32.01, 30.4, 30.87, 32.8, 40.46, 45.4, 54.47, 55.82, 68.5, 68.5, 68.5, 68.5, 68.5, 68.5}, + /* out */ { -1, -2.81, -4.11, -4.26, -5.15, -5.08, -3.57, -3.32, -5.24, -4.6, -4.88, -4.15, -3.27, -0.82, -0.82, -0.82, -0.82, -0.82, -0.82, -0.82}, + /* direct */ { -4.12, -2.58 , -0.48, -0.48, -0.48, -0.48, -0.48, -0.48, -0.48, -0.48, -0.48, -0.48, -0.48, -0.48, -0.48, -0.48, -0.48, -0.48, -0.48, -0.48}, + /* adf */ { 29.57, 17, 22.88, 0.1, 2, -4.5, -3.8, -9.43, -10, -10.9, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 3.07}, + /* ultra */ { -1.4, -3, -4.46, -5, -3.8, -5, -4.56, -3.38, -3.2, 1, 0.6, 4, 5, 2.53, 2.53, 2.53, 2.53, 2.53, 2.53, 2.53}, }; const float v4_6_harmonic_lna_level_offset = 0; // should be in correction table now -7; // Depends on where the transition to harmonic is done!!!!!! TODO find best frequency to transition to harmonic @@ -2404,7 +2404,9 @@ static const VNAShellCommand commands[] = {"touchcal" , cmd_touchcal , CMD_WAIT_MUTEX}, {"touchtest" , cmd_touchtest , CMD_WAIT_MUTEX}, {"pause" , cmd_pause , CMD_WAIT_MUTEX | CMD_RUN_IN_LOAD}, +#ifdef TINYSA4 {"restart" , cmd_restart , CMD_WAIT_MUTEX | CMD_RUN_IN_LOAD}, +#endif {"resume" , cmd_resume , CMD_WAIT_MUTEX | CMD_RUN_IN_LOAD}, {"wait" , cmd_wait , CMD_RUN_IN_LOAD}, // This lets the sweep continue {"repeat" , cmd_repeat , CMD_RUN_IN_LOAD}, @@ -3143,11 +3145,15 @@ int main(void) memcpy(config.correction_value, v4_6_correction_value, sizeof(config.correction_value)); config.harmonic_level_offset = v4_6_harmonic_level_offset; config.harmonic_lna_level_offset = v4_6_harmonic_lna_level_offset; + config.low_level_output_offset = 1; + // ULTRA_MAX_FREQ = 5450000000ULL; } // else // ULTRA_MAX_FREQ = 5340000000ULL; ULTRA_MAX_FREQ = 4350000000 + config.frequency_IF1; + config.direct_start = config.frequency_IF1 - 10000000; + config.direct_stop = config.frequency_IF1 + 10000000; } set_freq_boundaries(); #endif diff --git a/nanovna.h b/nanovna.h index ee077d8..74ac9d5 100644 --- a/nanovna.h +++ b/nanovna.h @@ -18,7 +18,7 @@ */ #include "ch.h" -#ifdef TINYSA_F303 +//#ifdef TINYSA_F303 #ifdef TINYSA_F072 #error "Remove comment for #ifdef TINYSA_F303" #endif @@ -26,7 +26,7 @@ #define TINYSA4 #endif #define TINYSA4_PROTO -#endif +//#endif #ifdef TINYSA_F072 #ifdef TINYSA_F303 @@ -143,6 +143,7 @@ typedef uint32_t freq_t; #define DEFAULT_IF 433800000 #define DEFAULT_SPUR_IF 434000000 #define DEFAULT_MAX_FREQ 350000000 +#define NORMAL_MAX_FREQ DEFAULT_MAX_FREQ #define MAX_LO_FREQ 959800000UL #define MIN_LO_FREQ 240000000UL #define MIN_BELOW_LO 550000000UL @@ -1355,6 +1356,7 @@ typedef struct setting #define PRESET_NAME_LENGTH 10 char preset_name[PRESET_NAME_LENGTH]; #endif + bool dBuV; int64_t test_argument; // used for tests uint32_t checksum; // must be last and at 4 byte boundary }setting_t; @@ -1491,8 +1493,8 @@ typedef struct properties { //sizeof(properties_t) == 0x1200 -#define CONFIG_MAGIC 0x434f4e69 -#define SETTING_MAGIC 0x434f4e69 +#define CONFIG_MAGIC 0x434f4e6a +#define SETTING_MAGIC 0x434f4e6a extern int16_t lastsaveid; //extern properties_t *active_props; diff --git a/sa_core.c b/sa_core.c index cbede0a..c50dc46 100644 --- a/sa_core.c +++ b/sa_core.c @@ -536,7 +536,7 @@ void update_min_max_freq(void) maxFreq = MAX_LOW_OUTPUT_FREQ; #endif #else - maxFreq = NORMAL_MAX_FREQ; + maxFreq = DEFAULT_MAX_FREQ; #endif break; case M_HIGH: @@ -4413,7 +4413,7 @@ again: // Spur redu ADF4351_R_counter(-3); } else { if (hw_if) - ADF4351_R_counter(5); + ADF4351_R_counter(4); else ADF4351_R_counter(4); } @@ -4488,6 +4488,8 @@ again: // Spur redu actual_drive = 3; // else if (lf < DRIVE0_MAX_FREQ) // below 600MHz // actual_drive = 0; + else if (setting.mode == M_GENLOW && hw_if) + actual_drive = 0; else if (lf < DRIVE1_MAX_FREQ || hw_if) // below 1.2GHz actual_drive = 1; else if (lf < DRIVE2_MAX_FREQ) // below 2GHz @@ -6392,18 +6394,17 @@ static float test_value; #ifdef TINYSA4 static freq_t spur_test_freq = 930000000; -static freq_t direct_test_freq = 870000000; // 180000000; +static freq_t direct_test_freq = 990000000; // 180000000; void determine_direct_test_freq(void) { - if (hw_if) - direct_test_freq = 870000000; - return; + if (!hw_if) + return; int old_ultra = config.ultra; config.ultra = true; float max_level = -150; set_refer_output(0); - for (freq_t test_freq = 900000000UL; test_freq < 1000000000UL; test_freq += 30000000) { + for (freq_t test_freq = 1020000000UL; test_freq < 1100000000UL; test_freq += 30000000) { dirty = true; float v = PURE_TO_float(perform(false, 0, test_freq, false)); if (v > max_level) { @@ -7780,7 +7781,7 @@ float get_jump_config(int i) { return 0; } -enum {CS_NORMAL, CS_LNA, CS_SWITCH, CS_ULTRA, CS_ULTRA_LNA, CS_DIRECT_REF, /* CS_DIRECT,*/ CS_DIRECT_LNA, CS_SPUR_REF, CS_SPUR_ERROR, CS_HARMONIC, CS_HARMONIC_LNA, /* CS_BPF_REF, CS_BPF, */ CS_CORRECTION_REF, CS_CORRECTION_LNA, CS_MAX }; +enum {CS_NORMAL, CS_LNA, CS_SWITCH, CS_ULTRA, CS_ULTRA_LNA, CS_DIRECT_REF, CS_DIRECT, CS_DIRECT_LNA, CS_SPUR_REF, CS_SPUR_ERROR, CS_HARMONIC, CS_HARMONIC_LNA, /* CS_BPF_REF, CS_BPF, */ CS_CORRECTION_REF, CS_CORRECTION_LNA, CS_MAX }; #define ULTRA_HARMONIC_CAL_FREQ 5340000000 #else enum {CS_NORMAL, CS_SWITCH, CS_MAX }; @@ -8010,7 +8011,7 @@ void calibrate(void) set_sweep_frequency(ST_CENTER, direct_test_freq); force_signal_path = true; break; -#if 0 +#if 1 case CS_DIRECT: test_path = 4; // Direct path at 900MHz goto direct_common; @@ -8126,11 +8127,11 @@ low_level: config.shift_level_offset = direct_level - marker_to_value(0); else if (calibration_stage == CS_DIRECT_REF) direct_level = marker_to_value(0); -// else if (calibration_stage == CS_DIRECT) -// offset = set_actual_power(direct_level); + else if (calibration_stage == CS_DIRECT) + offset = set_actual_power(direct_level); else if (calibration_stage == CS_DIRECT_LNA){ offset = set_actual_power(direct_level); - config.direct_level_offset = config.direct_lna_level_offset - (config.low_level_offset - config.lna_level_offset); +// config.direct_level_offset = config.direct_lna_level_offset - (config.low_level_offset - config.lna_level_offset); } else #endif diff --git a/ui.c b/ui.c index 11a9217..82cb6a6 100644 --- a/ui.c +++ b/ui.c @@ -2453,6 +2453,18 @@ static UI_FUNCTION_ADV_CALLBACK(menu_modulation_acb) // menu_move_back(false); // Don't move back } +static UI_FUNCTION_ADV_CALLBACK(menu_level_in_dBuV) +{ + (void)item; + (void)data; + if (b){ + b->icon = setting.dBuV ? BUTTON_ICON_CHECK : BUTTON_ICON_NOCHECK; + return; + } + setting.dBuV = !setting.dBuV; + menu_move_back(false); +} + static UI_FUNCTION_ADV_CALLBACK(menu_smodulation_acb){ (void)item; (void)data; @@ -4361,6 +4373,7 @@ static const menuitem_t menu_modulation[] = { { MT_FORM | MT_ADV_CALLBACK | MT_LOW, MO_EXTERNAL,MT_CUSTOM_LABEL, menu_modulation_acb}, { MT_FORM | MT_KEYPAD, KM_MODULATION, "FREQ: %s", "1Hz..5kHz"}, #endif + { MT_FORM | MT_ADV_CALLBACK, 0, "Level in dBuV", menu_level_in_dBuV}, { MT_FORM | MT_NONE, 0, NULL, menu_back} // next-> menu_back }; @@ -5435,19 +5448,31 @@ static void fetch_numeric_target(uint8_t mode) end_level = level_max(); uistat.value += setting.external_gain; end_level += setting.external_gain; + char *u = "m"; + float el = end_level; + if (setting.dBuV) { + u = "uV"; + uistat.value += 107; + el += 107; + } if (setting.level_sweep != 0) - plot_printf(uistat.text, sizeof uistat.text, "%.1f to %.1fdBm", uistat.value, end_level); + plot_printf(uistat.text, sizeof uistat.text, "%.1f to %.1fdBm", uistat.value, el); else #ifdef TINYSA4 - plot_printf(uistat.text, sizeof uistat.text, "%+.1fdBm %s", uistat.value, (setting.disable_correction?"Uncorrected":"")); + plot_printf(uistat.text, sizeof uistat.text, "%+.1fdB%s %s", uistat.value, u, (setting.disable_correction?"Uncorrected":"")); #else - plot_printf(uistat.text, sizeof uistat.text, "%+.1fdBm", uistat.value); + plot_printf(uistat.text, sizeof uistat.text, "%+.1fdB%s", uistat.value, u); #endif break; case KM_HIGHOUTLEVEL: uistat.value = get_level(); // compensation for dB offset during low output mode uistat.value += setting.external_gain; - plot_printf(uistat.text, sizeof uistat.text, "%+.1fdBm", uistat.value); + char *unit = "m"; + if (setting.dBuV) { + unit = "uV"; + uistat.value += 107; + } + plot_printf(uistat.text, sizeof uistat.text, "%+.1fdB%s", uistat.value, unit); break; case KM_DECAY: uistat.value = setting.decay; @@ -5711,9 +5736,13 @@ set_numeric_value(void) set_repeat(uistat.value); break; case KM_LOWOUTLEVEL: + if (setting.dBuV) + uistat.value -= 107; set_level(uistat.value - setting.external_gain); break; case KM_HIGHOUTLEVEL: + if (setting.dBuV) + uistat.value -= 107; set_level(uistat.value - setting.external_gain); break; case KM_DECAY: @@ -7015,7 +7044,6 @@ menu_select_touch(const menuitem_t * m, int i, int pos) while (touch_check() != EVT_TOUCH_NONE){ touch_position(&touch_x, &touch_y); if (abs(touch_x - prev_touch_x) < 2) continue; - fetch_numeric_target(keypad); int new_slider = touch_x - LCD_WIDTH/2; // Can have negative outcome if (new_slider < - (MENU_FORM_WIDTH-8)/2 - 1) @@ -7081,7 +7109,10 @@ menu_select_touch(const menuitem_t * m, int i, int pos) chThdSleepMilliseconds(100); } else if (keypad == KM_LOWOUTLEVEL) { uistat.value = setting.external_gain + ((touch_x - OFFSETX+4) * level_range() ) / (MENU_FORM_WIDTH-8) + level_min() ; + bool old_dBuV = setting.dBuV; + setting.dBuV = false; set_keypad_value(keypad); + setting.dBuV = old_dBuV;; draw_menu_mask(1<