Merge branch 'V4.3' of https://github.com/erikkaashoek/tinySA into DiSlord_browser

pull/52/head
DiSlord Live 3 years ago
commit fb4c9c5690

@ -5,7 +5,7 @@
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/> <provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/> <provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
<provider copy-of="extension" id="org.eclipse.cdt.managedbuilder.core.GCCBuildCommandParser"/> <provider copy-of="extension" id="org.eclipse.cdt.managedbuilder.core.GCCBuildCommandParser"/>
<provider class="org.eclipse.cdt.internal.build.crossgcc.CrossGCCBuiltinSpecsDetector" console="false" env-hash="317342379697931" id="org.eclipse.cdt.build.crossgcc.CrossGCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT Cross GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true"> <provider class="org.eclipse.cdt.internal.build.crossgcc.CrossGCCBuiltinSpecsDetector" console="false" env-hash="-376882430462109" id="org.eclipse.cdt.build.crossgcc.CrossGCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT Cross GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<language-scope id="org.eclipse.cdt.core.gcc"/> <language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/> <language-scope id="org.eclipse.cdt.core.g++"/>
</provider> </provider>
@ -17,7 +17,7 @@
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/> <provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/> <provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
<provider copy-of="extension" id="org.eclipse.cdt.managedbuilder.core.GCCBuildCommandParser"/> <provider copy-of="extension" id="org.eclipse.cdt.managedbuilder.core.GCCBuildCommandParser"/>
<provider class="org.eclipse.cdt.internal.build.crossgcc.CrossGCCBuiltinSpecsDetector" console="false" env-hash="317342379697931" id="org.eclipse.cdt.build.crossgcc.CrossGCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT Cross GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true"> <provider class="org.eclipse.cdt.internal.build.crossgcc.CrossGCCBuiltinSpecsDetector" console="false" env-hash="-376882430462109" id="org.eclipse.cdt.build.crossgcc.CrossGCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT Cross GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<language-scope id="org.eclipse.cdt.core.gcc"/> <language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/> <language-scope id="org.eclipse.cdt.core.g++"/>
</provider> </provider>

@ -471,12 +471,12 @@ const uint8_t x10x14_bits[(127-wFONT_START_CHAR)*wFONT_GET_HEIGHT*2] =
_BMP16(0b0111111110000000), // | ******** | _BMP16(0b0111111110000000), // | ******** |
_BMP16(0b1111001111000000), // |**** **** | _BMP16(0b1111001111000000), // |**** **** |
_BMP16(0b1110000111000000), // |*** *** | _BMP16(0b1110000111000000), // |*** *** |
_BMP16(0b1110001111000000), // |*** **** | _BMP16(0b1110000111000000), // |*** **** |
_BMP16(0b1110011111000000), // |*** ***** | _BMP16(0b1110000111000000), // |*** **** |
_BMP16(0b1110110111000000), // |*** ** *** | _BMP16(0b1110000111000000), // |*** *** |
_BMP16(0b1110110111000000), // |*** ** *** | _BMP16(0b1110000111000000), // |*** *** |
_BMP16(0b1111100111000000), // |***** *** | _BMP16(0b1110000111000000), // |*** *** |
_BMP16(0b1111000111000000), // |**** *** | _BMP16(0b1110000111000000), // |*** *** |
_BMP16(0b1110000111000000), // |*** *** | _BMP16(0b1110000111000000), // |*** *** |
_BMP16(0b1111001111000000), // |**** **** | _BMP16(0b1111001111000000), // |**** **** |
_BMP16(0b0111111110000000), // | ******** | _BMP16(0b0111111110000000), // | ******** |

@ -679,8 +679,8 @@ const uint8_t x7x11b_bits[] =
0b01111000, // | **** | 0b01111000, // | **** |
0b11001100, // |** ** | 0b11001100, // |** ** |
0b11001100, // |** ** | 0b11001100, // |** ** |
0b11011100, // |** *** | 0b11001100, // |** ** |
0b11101100, // |*** ** | 0b11001100, // |** ** |
0b11001100, // |** ** | 0b11001100, // |** ** |
0b11001100, // |** ** | 0b11001100, // |** ** |
0b11001100, // |** ** | 0b11001100, // |** ** |

@ -237,6 +237,7 @@ caldata_recall(uint16_t id)
set_reflevel(setting.reflevel); set_reflevel(setting.reflevel);
set_waterfall(); set_waterfall();
set_level_meter(); set_level_meter();
sweep_mode = SWEEP_ENABLE;
#ifdef __ULTRA__ #ifdef __ULTRA__
ultra_start = (config.ultra_start == ULTRA_AUTO ? DEFAULT_ULTRA_THRESHOLD : config.ultra_start); ultra_start = (config.ultra_start == ULTRA_AUTO ? DEFAULT_ULTRA_THRESHOLD : config.ultra_start);
#endif #endif

@ -109,6 +109,14 @@ int32_t scan_after_dirty = 0;
uint8_t completed = false; uint8_t completed = false;
uint8_t enable_after_complete = 0; uint8_t enable_after_complete = 0;
void clear_backup(void) {
uint32_t *f = &backup; // Clear backup when no valid config data
int i = USED_BACKUP_SIZE;
while (i--)
*f++ = 0;
}
#ifdef TINYSA4 #ifdef TINYSA4
static THD_WORKING_AREA(waThread1, 1224); static THD_WORKING_AREA(waThread1, 1224);
#else #else
@ -162,11 +170,19 @@ static THD_FUNCTION(Thread1, arg)
while (i--) while (i--)
*t++ = *f++; *t++ = *f++;
completed = sweep(true); #ifdef __LISTEN__
if (sweep_once_count>1) { if (setting.listen && markers[active_marker].enabled == M_ENABLED) {
sweep_once_count--; perform(false, 0, getFrequency(markers[active_marker].index), false);
SI4432_Listen(MODE_SELECT(setting.mode));
} else } else
sweep_mode&=~SWEEP_ONCE; #endif
{
completed = sweep(true);
if (sweep_once_count>1) {
sweep_once_count--;
} else
sweep_mode&=~SWEEP_ONCE;
}
} else if (sweep_mode & SWEEP_SELFTEST) { } else if (sweep_mode & SWEEP_SELFTEST) {
// call from lowest level to save stack space // call from lowest level to save stack space
self_test(setting.test); self_test(setting.test);
@ -176,13 +192,6 @@ static THD_FUNCTION(Thread1, arg)
} else if (sweep_mode & SWEEP_REMOTE) { } else if (sweep_mode & SWEEP_REMOTE) {
sweep_remote(); sweep_remote();
#endif #endif
#ifdef __LISTEN__
} else if (sweep_mode & SWEEP_LISTEN) {
if (markers[active_marker].enabled == M_ENABLED) {
perform(false, 0, getFrequency(markers[active_marker].index), false);
SI4432_Listen(MODE_SELECT(setting.mode));
}
#endif
#ifdef __CALIBRATE__ #ifdef __CALIBRATE__
} else if (sweep_mode & SWEEP_CALIBRATE) { } else if (sweep_mode & SWEEP_CALIBRATE) {
// call from lowest level to save stack space // call from lowest level to save stack space
@ -2671,10 +2680,7 @@ int main(void)
config.switch_offset = -5.0; config.switch_offset = -5.0;
#endif #endif
if(config_recall()) { if(config_recall()) {
uint32_t *f = &backup; // Clear backup when no valid config data clear_backup();
int i = USED_BACKUP_SIZE;
while (i--)
*f++ = 0;
} }
config.cor_am = 0; // Should be removed from config config.cor_am = 0; // Should be removed from config
config.cor_nfm = 0; config.cor_nfm = 0;
@ -2729,7 +2735,7 @@ int main(void)
load_LCD_properties(); load_LCD_properties();
} }
ui_mode_normal(); ui_mode_normal();
{ if (!(config._mode & _MODE_DONT_SAVE_STATE)) {
backup_t b; backup_t b;
uint32_t *f = &backup; uint32_t *f = &backup;
uint32_t *t = (uint32_t *)&b; uint32_t *t = (uint32_t *)&b;

@ -18,7 +18,7 @@
*/ */
#include "ch.h" #include "ch.h"
//#ifdef TINYSA_F303 #ifdef TINYSA_F303
#ifdef TINYSA_F072 #ifdef TINYSA_F072
#error "Remove comment for #ifdef TINYSA_F303" #error "Remove comment for #ifdef TINYSA_F303"
#endif #endif
@ -26,7 +26,7 @@
#define TINYSA4 #define TINYSA4
#endif #endif
#define TINYSA4_PROTO #define TINYSA4_PROTO
//#endif #endif
#ifdef TINYSA_F072 #ifdef TINYSA_F072
#ifdef TINYSA_F303 #ifdef TINYSA_F303
@ -250,6 +250,7 @@ float my_atof(const char *p);
freq_t my_atoui(const char *p); freq_t my_atoui(const char *p);
int shell_printf(const char *fmt, ...); int shell_printf(const char *fmt, ...);
int usage_printf(const char *fmt, ...); int usage_printf(const char *fmt, ...);
void clear_backup(void);
#ifdef __REMOTE_DESKTOP__ #ifdef __REMOTE_DESKTOP__
extern uint8_t remote_mouse_down; extern uint8_t remote_mouse_down;
@ -319,10 +320,10 @@ enum {
#define SWEEP_SELFTEST 0x08 #define SWEEP_SELFTEST 0x08
#define SWEEP_REMOTE 0x10 #define SWEEP_REMOTE 0x10
#ifdef __LISTEN__ #ifdef __LISTEN__
#define SWEEP_LISTEN 0x20 //#define SWEEP_LISTEN 0x20
#define SWEEP_CALIBRATE_HARMONIC 0x40
//#define SWEEP_FACTORY 0x20 //#define SWEEP_FACTORY 0x20
#endif #endif
#define SWEEP_CALIBRATE_HARMONIC 0x40
#define SWEEP_UI_MODE 0x80 #define SWEEP_UI_MODE 0x80
extern uint8_t sweep_mode; extern uint8_t sweep_mode;
@ -731,9 +732,10 @@ float marker_to_value(const int i);
#define _MODE_CONNECTION_MASK 0x04 #define _MODE_CONNECTION_MASK 0x04
#define _MODE_SERIAL 0x04 #define _MODE_SERIAL 0x04
#define _MODE_USB 0x00 #define _MODE_USB 0x00
// don't save state
#define _MODE_DONT_SAVE_STATE 0x08
// auto name // auto name
#define _MODE_AUTO_FILENAME 0x08 #define _MODE_AUTO_FILENAME 0x10
#pragma pack(push, 4) #pragma pack(push, 4)
typedef struct config { typedef struct config {
@ -1164,6 +1166,7 @@ typedef struct setting
uint8_t spur_removal; // enum uint8_t spur_removal; // enum
uint8_t disable_correction; uint8_t disable_correction;
int8_t normalized_trace; int8_t normalized_trace;
uint8_t listen;
int8_t tracking; // -1...1 Can NOT convert to bool!!!!!! int8_t tracking; // -1...1 Can NOT convert to bool!!!!!!
uint8_t atten_step; // 0...1 !!! need convert to bool uint8_t atten_step; // 0...1 !!! need convert to bool
@ -1381,7 +1384,7 @@ typedef struct properties {
//sizeof(properties_t) == 0x1200 //sizeof(properties_t) == 0x1200
#define CONFIG_MAGIC 0x434f4e5B /* 'CONF' */ #define CONFIG_MAGIC 0x434f4e5C /* 'CONF' */
extern int16_t lastsaveid; extern int16_t lastsaveid;
//extern properties_t *active_props; //extern properties_t *active_props;

@ -978,7 +978,7 @@ VNA_SHELL_FUNCTION(cmd_z)
return; return;
} }
if (argc == 1) { if (argc == 1) {
setting.step_delay = atoi(argv[0]); setting.step_delay = my_atoi(argv[0]);
dirty = true; dirty = true;
} }
} }
@ -990,7 +990,7 @@ VNA_SHELL_FUNCTION(cmd_n)
return; return;
} }
if (argc == 1) { if (argc == 1) {
setting.offset_delay = atoi(argv[0]); setting.offset_delay = my_atoi(argv[0]);
dirty = true; dirty = true;
} }
} }
@ -1321,8 +1321,8 @@ again:
switch (m) { switch (m) {
default: goto usage; default: goto usage;
case 's': test_output_switch = *a - '0'; break; case 's': test_output_switch = *a - '0'; break;
case 'd': test_output_drive = atoi(a); break; case 'd': test_output_drive = my_atoi(a); break;
case 'a': test_output_attenuate = atoi(a); break; case 'a': test_output_attenuate = my_atoi(a); break;
#ifdef TINYSA4 #ifdef TINYSA4
case 'p': test_path = *a - '0'; break; case 'p': test_path = *a - '0'; break;
#endif #endif

@ -18,6 +18,7 @@
#include "si4432.h" // comment out for simulation #include "si4432.h" // comment out for simulation
//#endif //#endif
#include "stdlib.h" #include "stdlib.h"
//#define TINYSA4
#pragma GCC push_options #pragma GCC push_options
#ifdef TINYSA4 #ifdef TINYSA4
@ -2795,7 +2796,7 @@ void interpolate_maximum(int m)
const INTER_TYPE y1 = ref_marker_levels[idx - 1]; const INTER_TYPE y1 = ref_marker_levels[idx - 1];
const INTER_TYPE y2 = ref_marker_levels[idx + 0]; const INTER_TYPE y2 = ref_marker_levels[idx + 0];
const INTER_TYPE y3 = ref_marker_levels[idx + 1]; const INTER_TYPE y3 = ref_marker_levels[idx + 1];
const INTER_TYPE d = abs(delta_Hz) * 0.5 * (y1 - y3) / ((y1 - (2 * y2) + y3) + 1e-12); const INTER_TYPE d = fabs(delta_Hz) * 0.5 * (y1 - y3) / ((y1 - (2 * y2) + y3) + 1e-12);
//const float bin = (float)idx + d; //const float bin = (float)idx + d;
markers[m].frequency += d; markers[m].frequency += d;
} }
@ -7450,7 +7451,6 @@ void calibrate(void)
{ {
int local_test_status; int local_test_status;
int old_sweep_points = setting._sweep_points; int old_sweep_points = setting._sweep_points;
reset_calibration();
#ifdef TINYSA4 #ifdef TINYSA4
int old_ultra = config.ultra; int old_ultra = config.ultra;
config.ultra = true; config.ultra = true;
@ -7516,6 +7516,7 @@ void calibrate(void)
#endif #endif
#endif #endif
reset_calibration();
in_calibration = true; in_calibration = true;
for (calibration_stage = CS_NORMAL; calibration_stage < CS_MAX ; calibration_stage++) { for (calibration_stage = CS_NORMAL; calibration_stage < CS_MAX ; calibration_stage++) {
for (int k = 0; k<3; k++) { for (int k = 0; k<3; k++) {
@ -7594,7 +7595,7 @@ void calibrate(void)
local_test_status = test_validate(test_case); local_test_status = test_validate(test_case);
calibration_busy(); calibration_busy();
} }
local_test_status = TS_PASS; local_test_status = TS_PASS; // Must be forced because test_validate calculates pass band wrong
#else #else
// set_RBW(power_rbw[j]); // set_RBW(power_rbw[j]);
// set_sweep_points(21); // set_sweep_points(21);
@ -7634,7 +7635,13 @@ void calibrate(void)
local_test_status = test_validate(test_case); // Validate test also sets attenuation if zero span local_test_status = test_validate(test_case); // Validate test also sets attenuation if zero span
#endif #endif
#endif #endif
if (calibration_stage == CS_NORMAL && peakLevel < -40) { if ((calibration_stage == CS_NORMAL && peakLevel < -40)
#ifdef TINYSA4
|| (calibration_stage == CS_LNA && peakLevel < -40)
|| (calibration_stage == CS_ULTRA && peakLevel < -40)
|| (calibration_stage == CS_DIRECT && peakLevel < direct_level - 10)
#endif
) {
#ifdef TINYSA4 #ifdef TINYSA4
low_level: low_level:
#endif #endif

42
ui.c

@ -542,7 +542,7 @@ show_version(void)
ili9341_drawstring_7x13(info_about[i++], x, y+=bFONT_STR_HEIGHT+2-5); ili9341_drawstring_7x13(info_about[i++], x, y+=bFONT_STR_HEIGHT+2-5);
} }
lcd_set_font(FONT_NORMAL); lcd_set_font(FONT_NORMAL);
lcd_printf(x, y+=bFONT_STR_HEIGHT, "HW Version:%s", get_hw_version_text()); lcd_printf(x, y+=bFONT_STR_HEIGHT, "HW Version:%s (%d)", get_hw_version_text(), adc1_single_read(0));
extern const char *states[]; extern const char *states[];
#define ENABLE_THREADS_COMMAND #define ENABLE_THREADS_COMMAND
@ -1523,10 +1523,12 @@ static UI_FUNCTION_ADV_CALLBACK(menu_curve_acb)
reset_settings(old_m); reset_settings(old_m);
break; break;
case CORRECTION_LNA: case CORRECTION_LNA:
case CORRECTION_LNA_ULTRA:
reset_settings(M_LOW); reset_settings(M_LOW);
setting.extra_lna = true; setting.extra_lna = true;
goto common; goto common;
case CORRECTION_LOW: case CORRECTION_LOW:
case CORRECTION_LOW_ULTRA:
reset_settings(M_LOW); reset_settings(M_LOW);
common: common:
set_sweep_frequency(ST_SPAN, 1000000); set_sweep_frequency(ST_SPAN, 1000000);
@ -1820,10 +1822,11 @@ static UI_FUNCTION_ADV_CALLBACK(menu_store_preset_acb)
b->param_1.u = data; b->param_1.u = data;
return; return;
} }
if (data == 100) { if (data >= 100) {
reset_settings(M_LOW); // Restore all defaults in Low mode reset_settings(M_LOW); // Restore all defaults in Low mode
set_refer_output(-1); set_refer_output(-1);
// setting.mode = -1; // setting.mode = -1;
if (data == 101) clear_backup();
data = 0; data = 0;
} }
caldata_save(data); caldata_save(data);
@ -1956,26 +1959,13 @@ static UI_FUNCTION_ADV_CALLBACK(menu_listen_acb)
(void)data; (void)data;
(void)item; (void)item;
if (b){ if (b){
b->icon = (sweep_mode & SWEEP_LISTEN) ? BUTTON_ICON_CHECK : BUTTON_ICON_NOCHECK; b->icon = (setting.listen) ? BUTTON_ICON_CHECK : BUTTON_ICON_NOCHECK;
return; return;
} }
if (sweep_mode & SWEEP_LISTEN) { setting.listen = !setting.listen;
sweep_mode = SWEEP_ENABLE;
} else {
sweep_mode = SWEEP_LISTEN;
}
ui_mode_normal(); ui_mode_normal();
redraw_frame(); redraw_frame();
request_to_redraw_grid(); request_to_redraw_grid();
#if 0
if (markers[active_marker].enabled == M_ENABLED) {
do {
perform(false,0,frequencies[markers[active_marker].index], false);
SI4432_Listen(MODE_SELECT(setting.mode));
} while (ui_process_listen_lever());
}
#endif
} }
#endif #endif
#ifdef TINYSA4 #ifdef TINYSA4
@ -3210,6 +3200,7 @@ static UI_FUNCTION_ADV_CALLBACK(menu_harmonic_acb)
return; return;
} }
set_harmonic(data); set_harmonic(data);
config_save();
} }
#endif #endif
@ -3290,6 +3281,17 @@ static UI_FUNCTION_ADV_CALLBACK(menu_settings_pulse_acb){
toggle_pulse(); toggle_pulse();
} }
static UI_FUNCTION_ADV_CALLBACK(menu_save_state_acb){
(void)item;
(void)data;
if(b){
b->icon = (config._mode & _MODE_DONT_SAVE_STATE) ? BUTTON_ICON_NOCHECK : BUTTON_ICON_CHECK;
return;
}
config._mode ^= _MODE_DONT_SAVE_STATE;
config_save();
}
#ifdef __DRAW_LINE__ #ifdef __DRAW_LINE__
static UI_FUNCTION_ADV_CALLBACK(menu_settings_draw_line_acb){ static UI_FUNCTION_ADV_CALLBACK(menu_settings_draw_line_acb){
(void)item; (void)item;
@ -3628,10 +3630,11 @@ static const menuitem_t menu_load_preset[] =
{ {
{ MT_ADV_CALLBACK, 0, "LOAD\nSTARTUP", menu_load_preset_acb}, { MT_ADV_CALLBACK, 0, "LOAD\nSTARTUP", menu_load_preset_acb},
{ MT_ADV_CALLBACK|MT_REPEATS, DATA_STARTS_REPEATS(1,4), MT_CUSTOM_LABEL, menu_load_preset_acb}, { MT_ADV_CALLBACK|MT_REPEATS, DATA_STARTS_REPEATS(1,4), MT_CUSTOM_LABEL, menu_load_preset_acb},
{ MT_ADV_CALLBACK, 101, "LOAD\nDEFAULTS",menu_store_preset_acb},
{ MT_ADV_CALLBACK, _MODE_DONT_SAVE_STATE, "SAVE\nSTATE", menu_save_state_acb},
#ifdef __SD_FILE_BROWSER__ #ifdef __SD_FILE_BROWSER__
{ MT_CALLBACK, FMT_PRS_FILE, "LOAD FROM\n SD", menu_sdcard_browse_cb }, { MT_CALLBACK, FMT_PRS_FILE, "LOAD FROM\n SD", menu_sdcard_browse_cb },
#endif #endif
{ MT_SUBMENU, 0, "STORE" , menu_store_preset}, { MT_SUBMENU, 0, "STORE" , menu_store_preset},
{ MT_NONE, 0, NULL, menu_back} // next-> menu_back { MT_NONE, 0, NULL, menu_back} // next-> menu_back
}; };
@ -4088,6 +4091,9 @@ static const menuitem_t menu_settings[] =
{ MT_ADV_CALLBACK,0, "PROGRESS\nBAR", menu_progress_bar_acb}, { MT_ADV_CALLBACK,0, "PROGRESS\nBAR", menu_progress_bar_acb},
{ MT_ADV_CALLBACK, 0, "DIRECT\nMODE", menu_direct_acb}, { MT_ADV_CALLBACK, 0, "DIRECT\nMODE", menu_direct_acb},
{ MT_ADV_CALLBACK, 0, "LINEAR\nAVERAGING", menu_linear_averaging_acb}, { MT_ADV_CALLBACK, 0, "LINEAR\nAVERAGING", menu_linear_averaging_acb},
#ifdef __HARMONIC__
{ MT_SUBMENU ,0, "HARMONIC", menu_harmonic},
#endif
{ MT_KEYPAD, KM_FREQ_CORR, "FREQ CORR\n\b%s", "Enter ppb correction"}, { MT_KEYPAD, KM_FREQ_CORR, "FREQ CORR\n\b%s", "Enter ppb correction"},
// { MT_SUBMENU, 0, "CALIBRATE\nHARMONIC", menu_calibrate_harmonic}, // { MT_SUBMENU, 0, "CALIBRATE\nHARMONIC", menu_calibrate_harmonic},
#ifdef __NOISE_FIGURE__ #ifdef __NOISE_FIGURE__

Loading…
Cancel
Save

Powered by TurnKey Linux.