diff --git a/main.c b/main.c index 8a4007f..02d8b92 100644 --- a/main.c +++ b/main.c @@ -786,8 +786,8 @@ config_t config = { .harmonic_freq_threshold = 300000000, #endif .vbat_offset = 500, - .low_level_offset = 0, - .high_level_offset = 0, + .low_level_offset = 100, // Uncalibrated + .high_level_offset = 100, // Uncalibrated }; properties_t current_props; diff --git a/plot.c b/plot.c index f8ee6e2..7cb98a6 100644 --- a/plot.c +++ b/plot.c @@ -1900,6 +1900,9 @@ draw_frequencies(void) { char buf1[32]; char buf2[32]; buf2[0] = 0; + if (MODE_OUTPUT(settingMode)) // No frequencies during output + return; + #ifdef __VNA__ if ((domain_mode & DOMAIN_MODE) == DOMAIN_FREQ) { #endif diff --git a/sa_core.c b/sa_core.c index d9813f5..cbf5e67 100644 --- a/sa_core.c +++ b/sa_core.c @@ -69,7 +69,7 @@ int settingBandwidth = 0; //int settingLevelOffset = 0; -int settingRefer = 1; +int settingRefer = -1; // Off by default int refferFreq[] = {30000000, 15000000, 10000000, 4000000, 3000000, 2000000, 1000000}; int settingSpur = 0; int settingAverage = 0; @@ -139,10 +139,13 @@ void SetMode(int m) case M_LOW: set_sweep_frequency(ST_START, (int32_t) 0); set_sweep_frequency(ST_STOP, (int32_t) 300000000); + SetRefpos(-10); goto min_max_low; case M_GENLOW: set_sweep_frequency(ST_CENTER, (int32_t) 10000000); set_sweep_frequency(ST_SPAN, 0); + settingSpur = 0; // Not for output mode + settingRefer = -1; // No refer output in output mode min_max_low: minFreq = 0; maxFreq = 520000000; @@ -150,15 +153,20 @@ void SetMode(int m) case M_HIGH: set_sweep_frequency(ST_START, (int32_t) 300000000); set_sweep_frequency(ST_STOP, (int32_t) 960000000); + SetRefpos(-30); goto min_max_high; case M_GENHIGH: set_sweep_frequency(ST_CENTER, (int32_t) 300000000); set_sweep_frequency(ST_SPAN, 0); + settingRefer = -1; // No refer output in output mode min_max_high: minFreq = 240000000; maxFreq = 960000000; + extraVFO = false; // Not possible in high mode + settingSpur = 0; // Not possible in high mode break; } + settingAttenuate = 0; dirty = true; } @@ -224,18 +232,33 @@ void SetPowerLevel(int o) config.low_level_offset = o - peakLevel - settingAttenuate + settingLevelOffset(); } else { - config.low_level_offset = 0; - config.high_level_offset = 0; + config.low_level_offset = 100; + config.high_level_offset = 100; } dirty = true; } int settingLevelOffset(void) { - if (settingMode == M_HIGH) - return(config.high_level_offset); - if (settingMode == M_LOW) + if (settingMode == M_HIGH) { + if (config.high_level_offset == 100) + return 0; return(config.high_level_offset); + } + if (settingMode == M_LOW) { + if (config.low_level_offset == 100) + return 0; + return(config.low_level_offset); + } + return(0); +} + +int level_is_calibrated(void) +{ + if (settingMode == M_HIGH && config.high_level_offset != 100) + return 1; + if (settingMode == M_LOW && config.low_level_offset != 100) + return 1; return(0); } @@ -306,6 +329,13 @@ int GetAGC(void) return(settingAGC); } +void SetRefpos(int level) +{ + set_trace_refpos(0, NGRIDY - level / get_trace_scale(0)); + set_trace_refpos(1, NGRIDY - level / get_trace_scale(0)); + set_trace_refpos(2, NGRIDY - level / get_trace_scale(0)); + dirty = true; +} //------------------------------------------ @@ -320,197 +350,6 @@ int temppeakIndex; int vbwSteps = 1; -#if 0 -int inData = 0; -unsigned long startFreq = 250000000; -unsigned long stopFreq = 300000000; -unsigned long lastFreq[6] = { 300000000, 300000000,0,0,0,0}; -int lastParameter[10]; -int parameter; -unsigned long reg = 0; -long offset=0; -long offset2=0; -static unsigned int spacing = 10000; -double delta=0.0; -int phase=0; -int deltaPhase; -int delaytime = 50; -#endif - - -#if 0 -void displayHisto () -{ - // clearDisplay(); - //int settingMax = 0; - //int settingMin = -120; - - if (old_settingMax != settingMax || old_settingMin != settingMin) { - // Display levels at left of screen - tft.fillRect(0, 0, oX-2, tft.height(), DISPLAY_BLACK); - textWhite(); - tft.setCursor(0,oY); // Start at top-left corner - tft.println(settingMax); - tft.setCursor(0,tft.height() - 16); - tft.println(settingMin); - // tft.setCursor(0,tft.height()/2); - // tft.println("dB"); - old_settingMax = settingMax; - old_settingMin = settingMin; - } - - if (old_startFreq != startFreq || old_stopFreq != stopFreq) { - // Dsiplay frequencies - // Bottom of screen - tft.fillRect(0, tft.height()-8, tft.width(), tft.height()-1, DISPLAY_BLACK); - tft.setTextColor(DISPLAY_WHITE); // Draw white text - tft.setCursor(oX+2,tft.height()-8); // Start at top-left corner - double f = (((double)(startFreq - lastFreq[0]))/ 1000000.0); - tft.print(f); - tft.print("MHz"); - tft.setCursor(tft.width() - 58,tft.height()-8); - f = (((double)(stopFreq - lastFreq[0]))/ 1000000.0); - tft.print(f); - tft.print("MHz"); - - tft.setCursor(tft.width()/2 - 80 + oX,tft.height()-8); - tft.print("center:"); - f = (double)((stopFreq/2 + startFreq/2 - lastFreq[0]) / 1000000.0); - tft.print(f); - tft.print("MHz"); - old_startFreq = startFreq; - old_stopFreq = stopFreq; - } - - // Top of screen - - if (old_settingAttenuate != settingAttenuate || old_settingPowerGrid != settingPowerGrid) { - tft.fillRect(0, 0, 8*6, oY-2, DISPLAY_BLACK); - tft.setCursor(0,0); // Start at top-left corner - tft.setTextColor(DISPLAY_WHITE); // Draw white text - tft.print("Atten:"); - tft.print(settingAttenuate); - tft.setCursor(0,8); // Start at top-left corner - tft.print(settingPowerGrid); - tft.print("dB/"); - old_settingAttenuate = settingAttenuate; - old_settingPowerGrid = settingPowerGrid; - old_rbw = -1; - } - - if (old_rbw != rbw || old_vbw != vbw) { - tft.fillRect(56, 0, 99, oY-2, DISPLAY_BLACK); - tft.setCursor(56,0); // Start at top-left corner - tft.setTextColor(DISPLAY_WHITE); // Draw white text - tft.print("RBW:"); - tft.print(rbw); - tft.print("kHz"); - tft.setCursor(56,8); // Start at top-left corner - tft.print("VBW:"); - tft.print(vbw); - tft.print("kHz"); - old_rbw = rbw; - old_vbw = vbw; - } - - if (peakLevel > -150) { - tft.fillRect(oX+100, 0, 100, 8-1, DISPLAY_BLACK); - tft.setCursor(oX + 100,0); // Start at top-left corner - tft.setTextColor(DISPLAY_WHITE); // Draw white text - tft.print("Max="); - tft.print((int)((peakLevel/ 2.0 - settingAttenuate) - 120.0)+settingLevelOffset); - tft.print("dB, "); - tft.print(peakFreq/ 1000000.0); - tft.print("MHz"); - } - - if (old_settingAverage != settingAverage || abs(old_settingSpur) != abs(settingSpur)) { - int x = tft.width() - 60; - tft.fillRect( x, 0, 60, oY-2, DISPLAY_BLACK); - tft.setTextColor(DISPLAY_WHITE); // Draw white text - if (settingAverage) { - tft.setCursor( x,0); // Start at top-left corner - tft.print("AVR:"); - tft.print(averageText[settingAverage]); - } - if (settingSpur) { - tft.setCursor(x,8); // Start at top-left corner - tft.print("SPUR:"); - tft.print("ON"); - } - old_settingAverage = settingAverage; - old_settingSpur = settingSpur; - } - - - - /* - for (int i=0; i= Y_GRID * dY) f = Y_GRID * dY-1; - if (f < 0) f = 0; - double f2 = ((actual_t[i+1] / 2.0 - settingAttenuate) - 120.0) + settingLevelOffset; - f2 = (f2 - settingMin) * Y_GRID * dY / delta; - if (f2 >= Y_GRID * dY) f2 = Y_GRID * dY-1; - if (f2 < 0) f2 = 0; - int x = i; - int Y1 = Y_GRID * dY - 1 - (int)f; - int Y2 = Y_GRID * dY - 1 - (int)f2; - tft.drawLine(x+oX, oY+Y1, x+oX+1, oY+Y2, DISPLAY_YELLOW); -// tft.drawLine(x+oX, oY+Y1+1, x+oX+1, oY+Y2, DISPLAY_YELLOW); - } - - - */ - sendDisplay(); -} - -void DisplayPoint(unsigned char *data, int i, int color) -{ - if (i == 0) - return; - int x = i-1; - int delta=settingMax - settingMin; - double f = ((data[x] / 2.0 - settingAttenuate) - 120.0) + settingLevelOffset; - f = (f - settingMin) * Y_GRID * dY / delta; - if (f >= Y_GRID * dY) f = Y_GRID * dY-1; - if (f < 0) f = 0; - double f2 = ((data[x+1] / 2.0 - settingAttenuate) - 120.0) + settingLevelOffset; - f2 = (f2 - settingMin) * Y_GRID * dY / delta; - if (f2 >= Y_GRID * dY) f2 = Y_GRID * dY-1; - if (f2 < 0) f2 = 0; - int Y1 = Y_GRID * dY - 1 - (int)f; - int Y2 = Y_GRID * dY - 1 - (int)f2; - DrawDirty(x,min(Y2,Y1)); - DrawDirty(x+1,min(Y2,Y1)); - tft.drawLine(x+oX, oY+Y1, x+oX+1, oY+Y2, color); - // tft.drawLine(x+oX, oY+Y1+1, x+oX+1, oY+Y2, DISPLAY_YELLOW); - sendDisplay(); -} - -void DisplayPeakData(void) -{ - double f = ((((float)actual_t[peakIndex]) / 2.0 - settingAttenuate) - 120.0) + settingLevelOffset; - int delta=settingMax - settingMin; - f = (f - settingMin) * Y_GRID * dY / delta; - if (f >= Y_GRID * dY) f = Y_GRID * dY-1; - if (f < 0) f = 0; - int Y1 = Y_GRID * dY - 1 - (int)f; - tft.setCursor(oX+peakIndex+5,oY+Y1); // Start at top-left corner - tft.setTextColor(DISPLAY_WHITE); // Draw white text - tft.print(peakFreq/ 1000000.0); - tft.setCursor(oX+peakIndex+5,oY+Y1+8); // Start at top-left corner - tft.print((int)((peakLevel/ 2.0 - settingAttenuate) - 120.0)+settingLevelOffset); - tft.print("dB"); - for (int x=peakIndex+5;x RSSI) actual_t[i] = RSSI; break; - case AV_MAX: if (actual_t[i] < RSSI) actual_t[i] = RSSI; break; - case AV_2: actual_t[i] = (actual_t[i] + RSSI) / 2.0; break; - case AV_4: actual_t[i] = (actual_t[i]*3 + RSSI) / 4.0; break; - case AV_8: actual_t[i] = (actual_t[i]*7 + RSSI) / 8.0; break; - } + continue; // Skip all other processing + } + if (settingSpur == -1) // Second pass + RSSI = ( RSSI < temp_t[i] ? RSSI : temp_t[i]); // Minimum of two passes + temp_t[i] = RSSI; + if (settingSubtractStorage) { + RSSI = RSSI - stored_t[i] ; + } + // stored_t[i] = (SI4432_Read_Byte(0x69) & 0x0f) * 3.0 - 90.0; // Display the AGC value in thestored trace + if (scandirty || settingAverage == AV_OFF) + actual_t[i] = RSSI; + else { + switch(settingAverage) { + case AV_MIN: if (actual_t[i] > RSSI) actual_t[i] = RSSI; break; + case AV_MAX: if (actual_t[i] < RSSI) actual_t[i] = RSSI; break; + case AV_2: actual_t[i] = (actual_t[i] + RSSI) / 2.0; break; + case AV_4: actual_t[i] = (actual_t[i]*3 + RSSI) / 4.0; break; + case AV_8: actual_t[i] = (actual_t[i]*7 + RSSI) / 8.0; break; } - if (frequencies[i] > 1000000) { - if (temppeakLevel < actual_t[i]) { - temppeakIndex = i; - temppeakLevel = actual_t[i]; - } + } + if (frequencies[i] > 1000000) { + if (temppeakLevel < actual_t[i]) { + temppeakIndex = i; + temppeakLevel = actual_t[i]; } } if (i == sweep_points -1) { - if (settingSpur == 1) { - settingSpur = -1; - i = 0; - goto again; - } if (scandirty) { scandirty = false; } @@ -767,6 +600,10 @@ again: if (operation_requested && break_on_operation) return false; } + if (settingSpur == 1) { + settingSpur = -1; + goto again; + } palSetPad(GPIOC, GPIOC_LED); return true; } @@ -854,13 +691,22 @@ void draw_cal_status(void) // if (!sweep_enabled) // perform(true, 0, frequencies[0], false); + ili9341_fill(x, y, OFFSETX, HEIGHT, 0x0000); + + if (MODE_OUTPUT(settingMode)) // No cal status during output + return; + ili9341_set_background(DEFAULT_BG_COLOR); int yMax = (NGRIDY - get_trace_refpos(0)) * get_trace_scale(0); plot_printf(buf, BLEN, "%ddB", yMax); buf[5]=0; - ili9341_set_foreground(DEFAULT_FG_COLOR); + if (level_is_calibrated()) + color = DEFAULT_FG_COLOR; + else + color = BRIGHT_COLOR_RED; + ili9341_set_foreground(color); ili9341_drawstring(buf, x, y); y += YSTEP*2; @@ -950,7 +796,11 @@ void draw_cal_status(void) y = HEIGHT-7 + OFFSETY; plot_printf(buf, BLEN, "%ddB", (int)(yMax - get_trace_scale(0) * NGRIDY)); buf[5]=0; - ili9341_set_foreground(DEFAULT_FG_COLOR); + if (level_is_calibrated()) + color = DEFAULT_FG_COLOR; + else + color = BRIGHT_COLOR_RED; + ili9341_set_foreground(color); ili9341_drawstring(buf, x, y); } diff --git a/ui_sa.c b/ui_sa.c index 2735799..a000baa 100644 --- a/ui_sa.c +++ b/ui_sa.c @@ -29,6 +29,7 @@ void SetSubtractStorage(void); void toggle_waterfall(void); void SetMode(int); int GetMode(void); +void SetRefpos(int); void AllDirty(void); void MenuDirty(void); void redrawHisto(void); @@ -177,6 +178,7 @@ extern const menuitem_t menu_lowoutputmode[]; extern const menuitem_t menu_highoutputmode[]; extern const menuitem_t menu_modulation[]; extern const menuitem_t menu_top[]; +extern const menuitem_t menu_tophigh[]; static void menu_mode_cb(int item, uint8_t data) { @@ -188,7 +190,7 @@ static void menu_mode_cb(int item, uint8_t data) menu_push_submenu(menu_top); break; case 2: - menu_push_submenu(menu_top); + menu_push_submenu(menu_tophigh); break; case 3: menu_push_submenu(menu_lowoutputmode); @@ -205,7 +207,7 @@ void menu_autosettings_cb(int item, uint8_t data) { (void)item; (void)data; - SetMode(M_LOW); + SetMode(GetMode()); // set_sweep_frequency(ST_START, (int32_t) 0); // set_sweep_frequency(ST_STOP, (int32_t) 300000000); @@ -428,16 +430,12 @@ static void menu_scale_cb(int item, uint8_t data) { (void)data; int status; - int km = KM_REFPOS + item; -// if (km == KM_SCALE && trace[uistat.current_trace].type == TRC_DELAY) { -// km = KM_SCALEDELAY; -// } status = btn_wait_release(); if (status & EVT_BUTTON_DOWN_LONG) { - ui_mode_numeric(km); + ui_mode_numeric(data); // ui_process_numeric(); } else { - ui_mode_keypad(km); + ui_mode_keypad(data); ui_process_keypad(); } draw_cal_status(); @@ -498,13 +496,12 @@ static void menu_settings_cb(int item, uint8_t data) { (void)data; int status; - int km = KM_ACTUALPOWER+item; status = btn_wait_release(); if (status & EVT_BUTTON_DOWN_LONG) { - ui_mode_numeric(km); + ui_mode_numeric(data); // ui_process_numeric(); } else { - ui_mode_keypad(km); + ui_mode_keypad(data); ui_process_keypad(); } draw_cal_status(); @@ -515,10 +512,10 @@ static void menu_settings2_cb(int item, uint8_t data) (void)data; switch(item) { case 0: - settingAGC = !settingAGC; + ToggleAGC(); break; case 1: - settingLNA = !settingLNA; + ToggleLNA();; break; case 2: extraVFO = !extraVFO; @@ -687,16 +684,27 @@ static const menuitem_t menu_reffer[] = { }; static const menuitem_t menu_scale[] = { - { MT_CALLBACK, 0, "\2REF\0LEVEL", menu_scale_cb}, - { MT_SUBMENU, 0, "\2SCALE/\0DIV", menu_dBper}, - { MT_CALLBACK, 0, "ATTEN", menu_scale_cb}, - { MT_SUBMENU, 0, "AVERAGE", menu_average}, - { MT_CALLBACK, 0, "\2SPUR\0REDUCT.",menu_spur_cb}, - { MT_SUBMENU, 0, "RBW", menu_rbw}, + { MT_CALLBACK, KM_REFPOS, "\2REF\0LEVEL", menu_scale_cb}, + { MT_SUBMENU, 0, "\2SCALE/\0DIV", menu_dBper}, + { MT_CALLBACK, KM_ATTENUATION, "ATTEN", menu_scale_cb}, + { MT_SUBMENU, 0, "AVERAGE", menu_average}, + { MT_CALLBACK, 0, "\2SPUR\0REDUCT.",menu_spur_cb}, + { MT_SUBMENU, 0, "RBW", menu_rbw}, + { MT_CANCEL, 0, S_LARROW" BACK", NULL }, + { MT_NONE, 0, NULL, NULL } // sentinel +}; + +static const menuitem_t menu_scalehigh[] = { + { MT_CALLBACK, KM_REFPOS, "\2REF\0LEVEL", menu_scale_cb}, + { MT_SUBMENU, 0, "\2SCALE/\0DIV", menu_dBper}, + { MT_SUBMENU, 0, "AVERAGE", menu_average}, + { MT_SUBMENU, 0, "RBW", menu_rbw}, { MT_CANCEL, 0, S_LARROW" BACK", NULL }, { MT_NONE, 0, NULL, NULL } // sentinel }; + + static const menuitem_t menu_stimulus[] = { { MT_CALLBACK, 0, "START", menu_stimulus_cb}, { MT_CALLBACK, 0, "STOP", menu_stimulus_cb}, @@ -740,14 +748,13 @@ static const menuitem_t menu_marker[] = { }; static const menuitem_t menu_dfu[] = { - { MT_CALLBACK, 0, "ENTER DFU", menu_dfu_cb}, - { MT_CANCEL, 0, S_LARROW" BACK", NULL }, + { MT_FORM | MT_CALLBACK, 0, "ENTER DFU", menu_dfu_cb}, + { MT_FORM | MT_CANCEL, 0, S_LARROW" BACK", NULL }, { MT_NONE, 0, NULL, NULL } // sentinel }; static const menuitem_t menu_settings2[] = { -// { MT_CALLBACK, 0, "TRACK", menu_settings2_cb}, { MT_CALLBACK, 0, "AGC", menu_settings2_cb}, { MT_CALLBACK, 0, "LNA", menu_settings2_cb}, { MT_CALLBACK, 0, "BPF", menu_settings2_cb}, @@ -757,36 +764,53 @@ static const menuitem_t menu_settings2[] = static const menuitem_t menu_settings[] = { - { MT_CALLBACK, 0, "\2ACTUAL\0POWER", menu_settings_cb}, - { MT_CALLBACK, 0, "\2IF\0FREQ", menu_settings_cb}, - { MT_CALLBACK, 0, "\2SAMPLE\0TIME", menu_settings_cb}, - { MT_CALLBACK, 0, "\2LO\0DRIVE", menu_settings_cb}, - { MT_SUBMENU, 0, S_RARROW" MORE", menu_settings2}, + { MT_CALLBACK, KM_ACTUALPOWER, "\2ACTUAL\0POWER", menu_settings_cb}, + { MT_CALLBACK, KM_IF, "\2IF\0FREQ", menu_settings_cb}, + { MT_CALLBACK, KM_SAMPLETIME, "\2SAMPLE\0TIME", menu_settings_cb}, + { MT_CALLBACK, KM_DRIVE, "\2LO\0DRIVE", menu_settings_cb}, + { MT_SUBMENU, 0, S_RARROW" MORE", menu_settings2}, + { MT_CANCEL, 0, S_LARROW" BACK", NULL }, + { MT_NONE, 0, NULL, NULL } // sentinel +}; -// { MT_SUBMENU, 0, "RBW", menu_rbw}, + +static const menuitem_t menu_settingshigh2[] = +{ + { MT_CALLBACK, 0, "AGC", menu_settings2_cb}, + { MT_CALLBACK, 0, "LNA", menu_settings2_cb}, { MT_CANCEL, 0, S_LARROW" BACK", NULL }, { MT_NONE, 0, NULL, NULL } // sentinel }; +static const menuitem_t menu_settingshigh[] = +{ + { MT_CALLBACK, KM_ACTUALPOWER, "\2ACTUAL\0POWER", menu_settings_cb}, + { MT_CALLBACK, KM_SAMPLETIME, "\2SAMPLE\0TIME", menu_settings_cb}, + { MT_SUBMENU, 0, S_RARROW" MORE", menu_settingshigh2}, + { MT_CANCEL, 0, S_LARROW" BACK", NULL }, + { MT_NONE, 0, NULL, NULL } // sentinel +}; + static const menuitem_t menu_config[] = { - { MT_CALLBACK, 0, "\2TOUCH\0CAL", menu_config_cb}, - { MT_CALLBACK, 0, "\2TOUCH\0TEST", menu_config_cb}, - { MT_CALLBACK, 0, "\2SELF\0TEST", menu_config_cb}, - { MT_CALLBACK, 0, "VERSION", menu_config_cb}, - { MT_SUBMENU, 0, "SETTINGS", menu_settings}, + { MT_FORM | MT_CALLBACK, 0, "TOUCH CAL", menu_config_cb}, + { MT_FORM | MT_CALLBACK, 0, "TOUCH TEST", menu_config_cb}, + { MT_FORM | MT_CALLBACK, 0, "SELF TEST", menu_config_cb}, + { MT_FORM | MT_CALLBACK, 0, "VERSION", menu_config_cb}, +// { MT_SUBMENU, 0, "SETTINGS", menu_settings}, // { MT_SUBMENU, 0, "RBW", menu_rbw}, - { MT_SUBMENU, 0, S_RARROW"DFU", menu_dfu}, - { MT_CANCEL, 0, S_LARROW" BACK", NULL }, + { MT_FORM | MT_SUBMENU, 0, S_RARROW"DFU", menu_dfu}, + { MT_FORM | MT_CANCEL, 0, S_LARROW" BACK", NULL }, { MT_NONE, 0, NULL, NULL } // sentinel }; static const menuitem_t menu_mode[] = { - { MT_FORM | MT_TITLE, 0, "MODE", NULL}, - { MT_FORM | MT_CALLBACK, 0, "LOW INPUT", menu_mode_cb}, - { MT_FORM | MT_CALLBACK, 0, "HIGH INPUT",menu_mode_cb}, - { MT_FORM | MT_CALLBACK, 0, "LOW OUTPUT", menu_mode_cb}, - { MT_FORM | MT_CALLBACK, 0, "HIGH OUTPUT",menu_mode_cb}, - { MT_FORM | MT_SUBMENU, 0, "CAL OUTPUT: %s",menu_reffer}, + { MT_FORM | MT_TITLE, 0, "MODE", NULL}, + { MT_FORM | MT_CALLBACK, 0, "LOW INPUT", menu_mode_cb}, + { MT_FORM | MT_CALLBACK, 0, "HIGH INPUT", menu_mode_cb}, + { MT_FORM | MT_CALLBACK, 0, "LOW OUTPUT", menu_mode_cb}, + { MT_FORM | MT_CALLBACK, 0, "HIGH OUTPUT", menu_mode_cb}, + { MT_FORM | MT_SUBMENU, 0, "CAL OUTPUT: %s", menu_reffer}, + { MT_FORM | MT_SUBMENU, 0, "CONFIG", menu_config}, // { MT_CANCEL, 0, S_LARROW" BACK", NULL }, { MT_NONE, 0, NULL, NULL } // sentinel }; @@ -797,7 +821,19 @@ const menuitem_t menu_top[] = { { MT_SUBMENU, 0, "MARKER", menu_marker}, { MT_SUBMENU, 0, "DISPLAY", menu_scale}, { MT_SUBMENU, 0, "STORAGE", menu_storage}, - { MT_SUBMENU, 0, "CONFIG", menu_config}, + { MT_SUBMENU, 0, "SETTINGS", menu_settings}, + { MT_CANCEL, 0, S_LARROW" MODE",NULL}, + { MT_NONE, 0, NULL, NULL } // sentinel, + // MENUITEM_CLOSE, +}; + +const menuitem_t menu_tophigh[] = { + { MT_CALLBACK, 0, "AUTO", menu_autosettings_cb}, + { MT_SUBMENU, 0, "SCAN", menu_stimulus}, + { MT_SUBMENU, 0, "MARKER", menu_marker}, + { MT_SUBMENU, 0, "DISPLAY", menu_scalehigh}, + { MT_SUBMENU, 0, "STORAGE", menu_storage}, + { MT_SUBMENU, 0, "SETTINGS", menu_settingshigh}, { MT_CANCEL, 0, S_LARROW" MODE",NULL}, { MT_NONE, 0, NULL, NULL } // sentinel, // MENUITEM_CLOSE, @@ -884,7 +920,7 @@ static void menu_item_modify_attribute( *bg = DEFAULT_MENU_TEXT_COLOR; *fg = config.menu_normal_color; } - } else if (menu == menu_settings2) { + } else if (menu == menu_settings2 || menu == menu_settingshigh2) { if (item ==0 && settingAGC){ *bg = DEFAULT_MENU_TEXT_COLOR; *fg = config.menu_normal_color; @@ -893,7 +929,7 @@ static void menu_item_modify_attribute( *bg = DEFAULT_MENU_TEXT_COLOR; *fg = config.menu_normal_color; } - if (item == 2 && extraVFO){ + if (item == 2 && extraVFO){ // should not happen in high mode *bg = DEFAULT_MENU_TEXT_COLOR; *fg = config.menu_normal_color; } @@ -1041,9 +1077,7 @@ set_numeric_value(void) set_trace_scale(2, uistat.value / 1000.0); break; case KM_REFPOS: - set_trace_refpos(0, NGRIDY - uistat.value / get_trace_scale(0)); - set_trace_refpos(1, NGRIDY - uistat.value / get_trace_scale(0)); - set_trace_refpos(2, NGRIDY - uistat.value / get_trace_scale(0)); + SetRefpos(uistat.value); break; case KM_ATTENUATION: SetAttenuation(uistat.value);