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 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, KM_REPEAT, KM_OFFSET, }; #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 keypads_level, // KM_REPEA keypads_level, // KM_OFFSET }; #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" , "REPEATS", "OFFSET"// 8-17 }; #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[]; void menu_mode_cb(int item, uint8_t data) { (void)data; set_mode(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(); } void menu_load_preset_cb(int item, uint8_t data) { (void)item; if (caldata_recall(data) == -1) { if (data == 0) reset_settings(setting.mode); // Restore all defaults else { draw_menu(); return; } } menu_move_back(); ui_mode_normal(); } void menu_store_preset_cb(int item, uint8_t data) { (void)item; if (data == 100) { setting.mode = -1; data = 0; } caldata_save(data); menu_move_back(); ui_mode_normal(); } 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, "%f/", uistat.value); break; case KM_REFPOS: uistat.value = setting.reflevel; plot_printf(uistat.text, sizeof uistat.text, "%f", uistat.value); break; case KM_ATTENUATION: uistat.value = get_attenuation(); plot_printf(uistat.text, sizeof uistat.text, "%ddB", ((int32_t)uistat.value)); break; case KM_ACTUALPOWER: uistat.value = get_level_offset(); plot_printf(uistat.text, sizeof uistat.text, "%ddB", ((int32_t)uistat.value)); break; case KM_IF: uistat.value = setting.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_REPEAT: uistat.value = setting.repeat; plot_printf(uistat.text, sizeof uistat.text, "%2d", ((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 = get_attenuation(); // 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_frequency_10mhz; plot_printf(uistat.text, sizeof uistat.text, "%3.6fMHz", uistat.value / 1000000.0); break; case KM_OFFSET: uistat.value = setting.offset; plot_printf(uistat.text, sizeof uistat.text, "%fdB", uistat.value); 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_scale(uistat.value); break; case KM_REFPOS: setting.auto_reflevel = false; set_reflevel(uistat.value); break; case KM_ATTENUATION: setting.auto_attenuation = false; set_attenuation(uistat.value); break; case KM_ACTUALPOWER: set_power_level(uistat.value); config_save(); break; case KM_IF: set_IF(uistat.value); config_save(); break; case KM_SAMPLETIME: set_step_delay(uistat.value); break; case KM_REPEAT: set_repeat(uistat.value); break; case KM_DRIVE: set_drive(uistat.value); break; case KM_LOWOUTLEVEL: set_attenuation(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_frequency_10mhz + uistat.value); } else set_10mhz(uistat.value); dirty = true; break; case KM_OFFSET: set_offset(uistat.value); break; } }