void markmap_all_markers(void); static void menu_marker_modify_cb(int item, uint8_t data); extern const menuitem_t menu_marker_modify[]; void set_sweep_frequency(int type, uint32_t frequency); uint32_t get_sweep_frequency(int type); void clearDisplay(void); void reset_settings(int); //void ui_process_touch(void); void SetPowerGrid(int); void SetRefLevel(int); void set_refer_output(int); int get_refer_output(void); void SetAttenuation(int); int GetAttenuation(void); void set_harmonic(int); extern int setting_harmonic; int search_is_greater(void); void set_auto_attenuation(void); void set_auto_reflevel(void); int is_paused(void); void SetPowerLevel(int); void SetGenerate(int); void SetRBW(int); void SetDrive(int d); void SetIF(int f); void SetStepDelay(int t); extern int setting_rbw; #ifdef __ULTRA__ extern int setting_spur; void SetSpur(int v); #endif void SetAverage(int); int GetAverage(void); extern int setting_average; void SetStorage(void); void SetClearStorage(void); void SetSubtractStorage(void); void toggle_waterfall(void); void SetMode(int); int GetMode(void); void SetReflevel(int); void SetScale(int); void AllDirty(void); void MenuDirty(void); void ToggleLNA(void); void ToggleAGC(void); void redrawHisto(void); void self_test(void); void set_decay(int); void set_noise(int); void toggle_tracking_output(void); extern int32_t frequencyExtra; extern int setting_tracking; extern int setting_tracking_output; extern int setting_drive; extern int setting_lna; extern int setting_agc; extern int setting_decay; extern int setting_noise; extern int setting_auto_reflevel; extern int setting_auto_attenuation; extern int setting_reflevel; extern int setting_scale; extern int setting_10mhz; void set_10mhz(int); void SetModulation(int); extern int setting_modulation; void set_measurement(int); // extern int settingSpeed; extern int setting_step_delay; void blit16BitWidthBitmap(uint16_t x, uint16_t y, uint16_t width, uint16_t height, const uint16_t *bitmap); const uint16_t left_icons [] = { #define I_EMPTY 0*16 0x0000, 0x0000, 0x0000, 0x0001, 0x0001, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0001, 0x0001, 0x0000, 0x0000, 0x0000, #define I_HIGH_INPUT 1*16 /* +-----------------+ | | | ** | | *** | | ************ | | *** | | ** | | | | | | | | | | | | | | | | | | | | | +-----------------+ */ 0x0000, 0x0000, 0x0060, 0x0039, 0x0fff, 0x0039, 0x0060, 0x0000, 0x0000, 0x0000, 0x0001, 0x0001, 0x0001, 0x0000, 0x0000, 0x0000, #define I_LOW_INPUT 2*16 /* +-----------------+ | | | | | | | | | | | | | | | | | | | | | ** | | **** | | ************ | | **** | | ** | | | +-----------------+ */ 0x0000, 0x0000, 0x0000, 0x0001, 0x0001, 0x0001, 0x0000, 0x0000, 0x0000, 0x0060, 0x0039, 0x0fff, 0x0039, 0x0060, 0x0000, 0x0000, #define I_LOW_OUTPUT 3*16 0b0000000000000000, 0b0000000000000000, 0b0000000000000000, 0b0000000000000001, 0b0000000000000001, 0b0000000000000001, 0b0000000000000000, 0b0000000000000000, 0b0000000000000000, 0b0000000110000000, 0b0000011100000001, 0b0000111111111111, 0b0000011100000001, 0b0000000110000000, 0b0000000000000000, 0b0000000000000000, #define I_HIGH_OUTPUT 4*16 0b0000000000000000, 0b0000000000000000, 0b0000000110000000, 0b0000011100000001, 0b0000111111111111, 0b0000011100000001, 0b0000000110000000, 0b0000000000000000, 0b0000000000000000, 0b0000000000000000, 0b0000000000000001, 0b0000000000000001, 0b0000000000000001, 0b0000000000000000, 0b0000000000000000, 0b0000000000000000, #define I_CONNECT 5*16 0b0000000000000000, 0b0000000000000000, 0b0000000000110000, 0b0000000000111101, 0b0000001111111111, 0b0000010000111101, 0b0000100000110000, 0b0001000000000000, 0b0001000000000000, 0b0000100000110000, 0b0000010000111101, 0b0000001111111111, 0b0000000000111101, 0b0000000000110000, 0b0000000000000000, 0b0000000000000000, }; const uint16_t right_icons [] = { #define I_SA 0 /* Character 0 (0x00): width 16 +-----------------+ | | | *************** | | * * | |** * | | * * * | | * * * | | * * * * | | * * * * | | * * * * * | | * * * * * * | | * * * * * * * | | * * * * * * * | |** *********** * | | * * | | *************** | | | +-----------------+ */ 0x0000, 0x7fff, 0x4001, 0xc001, 0xc001, 0xc001, 0x4801, 0x4801, 0x4a89, 0x4aa9, 0xcaa9, 0xdffd, 0xc001, 0x4001, 0x7fff, 0x0000, #define I_GEN 1 /* Character 0 (0x00): width 16 +-----------------+ | | | *************** | | * * | |** * | | * ***** ** * | | * * * * * | | * * * * * | | * * * * * | | * * * * * | | * * * * * | | * * * * * | | * ** ***** * | |** * | | * * | | *************** | | | +-----------------+ */ 0x0000, 0x7fff, 0x4001, 0xc001, 0xcf8d, 0xc889, 0x4889, 0x4889, 0x4889, 0x4889, 0xc889, 0xd8f9, 0xc001, 0x4001, 0x7fff, 0x0000, #define I_CONFIG 2 0b0000000000000000, 0b0111111111111111, 0b0100000000000001, 0b1100000010000001, 0b1100001111000001, 0b1100011110001001, 0b0100011100011101, 0b0100011110111001, 0b0100001111111001, 0b0100011111110001, 0b1100111110000001, 0b1101111100000001, 0b1100111000000001, 0b0100000000000001, 0b0111111111111111, 0b0000000000000000, #define I_SINUS 3 0b0000000000000000, 0b0111111111111111, // 1 0b0100000000000001, // 2 0b1100000000000001, // 3 0b1100000000110001, // 4 0b1100000001001001, // 5 0b0100000010000101, // 6 0b0101000010000101, // 7 0b0101000010000101, // 8 0b0101000010000001, // 9 0b1100100100000001, //10 0b1100011000000001, //11 0b1100000000000001, //12 0b0100000000000001, //13 0b0111111111111111, //14 0b0000000000000000, }; enum { KM_START=1, KM_STOP, KM_CENTER, KM_SPAN, KM_CW, KM_REFPOS, KM_SCALE, KM_ATTENUATION, KM_ACTUALPOWER, KM_IF, KM_SAMPLETIME, KM_DRIVE, KM_LOWOUTLEVEL, KM_DECAY, KM_NOISE, KM_10MHZ }; #define KP_X(x) (48*(x) + 2 + (320-BUTTON_WIDTH-192)) #define KP_Y(y) (48*(y) + 2) #define KP_PERIOD 10 #define KP_MINUS 11 #define KP_X1 12 #define KP_K 13 #define KP_M 14 #define KP_G 15 #define KP_BS 16 #define KP_INF 17 #define KP_DB 18 #define KP_PLUSMINUS 19 #define KP_KEYPAD 20 #define KP_N 21 #define KP_P 22 typedef struct { uint8_t x:4; uint8_t y:4; int8_t c; } keypads_t; static const keypads_t *keypads; static uint8_t keypads_last_index; static const keypads_t keypads_freq[] = { { 1, 3, KP_PERIOD }, { 0, 3, 0 }, { 0, 2, 1 }, { 1, 2, 2 }, { 2, 2, 3 }, { 0, 1, 4 }, { 1, 1, 5 }, { 2, 1, 6 }, { 0, 0, 7 }, { 1, 0, 8 }, { 2, 0, 9 }, { 3, 0, KP_G }, { 3, 1, KP_M }, { 3, 2, KP_K }, { 3, 3, KP_X1 }, { 2, 3, KP_BS }, { 0, 0, -1 } }; static const keypads_t keypads_scale[] = { { 1, 3, KP_PERIOD }, { 0, 3, 0 }, { 0, 2, 1 }, { 1, 2, 2 }, { 2, 2, 3 }, { 0, 1, 4 }, { 1, 1, 5 }, { 2, 1, 6 }, { 0, 0, 7 }, { 1, 0, 8 }, { 2, 0, 9 }, { 3, 3, KP_X1 }, { 2, 3, KP_BS }, { 0, 0, -1 } }; static const keypads_t keypads_level[] = { { 1, 3, KP_PERIOD }, { 0, 3, 0 }, { 0, 2, 1 }, { 1, 2, 2 }, { 2, 2, 3 }, { 0, 1, 4 }, { 1, 1, 5 }, { 2, 1, 6 }, { 0, 0, 7 }, { 1, 0, 8 }, { 2, 0, 9 }, { 3, 2, KP_MINUS }, { 3, 3, KP_X1 }, { 2, 3, KP_BS }, { 0, 0, -1 } }; static const keypads_t * const keypads_mode_tbl[] = { NULL, // never used keypads_freq, // start keypads_freq, // stop keypads_freq, // center keypads_freq, // span keypads_freq, // cw freq keypads_level, // refpos keypads_scale, // scale keypads_scale, // attenuation keypads_level, // actual power keypads_freq, // IF keypads_level, // sample time keypads_scale, // drive keypads_level, // KM_LOWOUTLEVEL keypads_level, // KM_DECAY keypads_level, // KM_NOISE keypads_level, // KM_10MHz }; #ifdef __VNA__ static const char * const keypad_mode_label[] = { "START", "STOP", "CENTER", "SPAN", "CW FREQ", "SCALE", "REFPOS", "EDELAY", "VELOCITY%", "DELAY" }; #endif #ifdef __SA__ static const char * const keypad_mode_label[] = { "error", "START", "STOP", "CENTER", "SPAN", "FREQ", "REFPOS", "SCALE", // 0-7 "\2ATTENUATE\0 0-31dB", "ACTUALPOWER", "IF", "SAMPLE TIME", "DRIVE", "LEVEL", "LEVEL", "LEVEL", "OFFSET" // 8-16 }; #endif // ===[MENU CALLBACKS]========================================================= int generator_enabled = false; 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[]; extern const menuitem_t menu_topultra[]; static void menu_mode_cb(int item, uint8_t data) { (void)data; SetMode(item-1); // draw_cal_status(); switch (item) { case 1: menu_push_submenu(menu_top); break; case 2: menu_push_submenu(menu_tophigh); break; case 3: menu_push_submenu(menu_lowoutputmode); break; case 4: menu_push_submenu(menu_highoutputmode); break; #ifdef __ULTRA__ case 7: menu_push_submenu(menu_topultra); break; #endif } // draw_cal_status(); } extern int dirty; void menu_autosettings_cb(int item, uint8_t data) { (void)item; (void)data; reset_settings(GetMode()); active_marker = 0; for (int i = 1; i= 0 && item < MARKERS_MAX) { markers[item].enabled = true; active_marker_select(item); menu_push_submenu(menu_marker_modify); redraw_marker(active_marker); draw_menu(); } } static void menu_marker_modify_cb(int item, uint8_t data) { (void)item; if (markers[active_marker].enabled == M_ENABLED) { if (data == M_DELETE) { markers[active_marker].enabled = false; menu_move_back(); // ui_mode_normal(); // return; } else if (data == M_NORMAL) { markers[active_marker].mtype = M_NORMAL; } else if (data == M_REFERENCE) { for (int i = 0; i= 0 && markers[active_marker].enabled == M_ENABLED) { if (data & markers[active_marker].mtype) mark = true; else if (item < 5 && data==markers[active_marker].mtype) // This catches the M_NORMAL case mark = true; } else if (menu == menu_marker_search) { if (item == 0 && search_is_greater()) mark = true; if (item == 1 && !search_is_greater()) mark = true; if (item == 4 && markers[active_marker].mtype & M_TRACKING) mark = true; } else if (menu == menu_marker_sel || menu == menu_marker_select) { if (item < 4 && markers[item].enabled) mark = true; else if (item == 4 && uistat.marker_delta) mark = true; else if (item == 5 && uistat.marker_noise) mark = true; else if (item == 6 && uistat.marker_tracking) mark = true; } else if (menu == menu_reflevel) { if ((item == 0 && setting_auto_reflevel) || (item == 1 && !setting_auto_reflevel)) mark = true; } else if (menu == menu_atten) { if ((item == 0 && setting_auto_attenuation ) || (item == 1 && !setting_auto_attenuation)) mark = true; } if (mark) { *bg = DEFAULT_MENU_TEXT_COLOR; *fg = config.menu_normal_color; } if (ui_mode == UI_MENU && menu_is_form(menu)) { // if (item == 0) // redraw_frame(); if (item <= 1) { area_width = 0; } }else{ area_width = AREA_WIDTH_NORMAL - MENU_BUTTON_WIDTH; } } static void fetch_numeric_target(void) { switch (keypad_mode) { case KM_START: uistat.value = get_sweep_frequency(ST_START); plot_printf(uistat.text, sizeof uistat.text, "%3.3fMHz", uistat.value / 1000000.0); break; case KM_STOP: uistat.value = get_sweep_frequency(ST_STOP); plot_printf(uistat.text, sizeof uistat.text, "%3.3fMHz", uistat.value / 1000000.0); break; case KM_CENTER: uistat.value = get_sweep_frequency(ST_CENTER); plot_printf(uistat.text, sizeof uistat.text, "%3.3fMHz", uistat.value / 1000000.0); break; case KM_SPAN: uistat.value = get_sweep_frequency(ST_SPAN); plot_printf(uistat.text, sizeof uistat.text, "%3.3fMHz", uistat.value / 1000000.0); break; case KM_CW: uistat.value = get_sweep_frequency(ST_CW); plot_printf(uistat.text, sizeof uistat.text, "%3.3fMHz", uistat.value / 1000000.0); break; case KM_SCALE: uistat.value = setting_scale; plot_printf(uistat.text, sizeof uistat.text, "%ddB/", ((int32_t)uistat.value)); break; case KM_REFPOS: uistat.value = setting_reflevel; plot_printf(uistat.text, sizeof uistat.text, "%ddB", ((int32_t)uistat.value)); break; case KM_ATTENUATION: uistat.value = GetAttenuation(); plot_printf(uistat.text, sizeof uistat.text, "%ddB", ((int32_t)uistat.value)); break; case KM_ACTUALPOWER: uistat.value = settingLevelOffset(); plot_printf(uistat.text, sizeof uistat.text, "%ddB", ((int32_t)uistat.value)); break; case KM_IF: uistat.value = frequency_IF; plot_printf(uistat.text, sizeof uistat.text, "%3.3fMHz", uistat.value / 1000000.0); break; case KM_SAMPLETIME: uistat.value = setting_step_delay; plot_printf(uistat.text, sizeof uistat.text, "%3duS", ((int32_t)uistat.value)); break; case KM_DRIVE: uistat.value = setting_drive; plot_printf(uistat.text, sizeof uistat.text, "%3ddB", ((int32_t)uistat.value)); break; case KM_LOWOUTLEVEL: uistat.value = GetAttenuation(); // compensation for dB offset during low output mode plot_printf(uistat.text, sizeof uistat.text, "%ddB", ((int32_t)uistat.value)); break; case KM_DECAY: uistat.value = setting_decay; plot_printf(uistat.text, sizeof uistat.text, "%3d", ((int32_t)uistat.value)); break; case KM_NOISE: uistat.value = setting_noise; plot_printf(uistat.text, sizeof uistat.text, "%3d", ((int32_t)uistat.value)); break; case KM_10MHZ: uistat.value = setting_10mhz; plot_printf(uistat.text, sizeof uistat.text, "%3.6fMHz", uistat.value / 1000000.0); break; } { uint32_t x = uistat.value; int n = 0; for (; x >= 10 && n < 9; n++) x /= 10; uistat.digit = n; } // uistat.previous_value = uistat.value; } static void set_numeric_value(void) { switch (keypad_mode) { case KM_START: set_sweep_frequency(ST_START, uistat.value); break; case KM_STOP: set_sweep_frequency(ST_STOP, uistat.value); break; case KM_CENTER: set_sweep_frequency(ST_CENTER, uistat.value); break; case KM_SPAN: set_sweep_frequency(ST_SPAN, uistat.value); break; case KM_CW: set_sweep_frequency(ST_CW, uistat.value); break; case KM_SCALE: set_trace_scale(0, uistat.value / 1000.0); set_trace_scale(1, uistat.value / 1000.0); set_trace_scale(2, uistat.value / 1000.0); break; case KM_REFPOS: setting_auto_reflevel = false; SetReflevel(uistat.value); break; case KM_ATTENUATION: setting_auto_attenuation = false; SetAttenuation(uistat.value); break; case KM_ACTUALPOWER: SetPowerLevel(uistat.value); config_save(); break; case KM_IF: SetIF(uistat.value); config_save(); break; case KM_SAMPLETIME: SetStepDelay(uistat.value); break; case KM_DRIVE: SetDrive(uistat.value); break; case KM_LOWOUTLEVEL: SetAttenuation(uistat.value); break; case KM_DECAY: set_decay(uistat.value); break; case KM_NOISE: set_noise(uistat.value); break; case KM_10MHZ: if (uistat.value < 9000000) { set_10mhz(setting_10mhz + uistat.value); } else set_10mhz(uistat.value); dirty = true; break; } }