From 1e19574fd6dabfbec0c324204da0ec9519f06a2a Mon Sep 17 00:00:00 2001 From: Federico Amedeo Izzo Date: Sat, 9 Oct 2021 18:35:42 +0200 Subject: [PATCH] Add destination callsign input for M17, Add -/ to keypad input --- openrtx/include/interfaces/keyboard.h | 4 +- openrtx/include/state.h | 1 + openrtx/src/threads.c | 2 +- openrtx/src/ui/ui.c | 175 +++++++++++++++++++++----- openrtx/src/ui/ui_mode.c | 25 ++-- 5 files changed, 166 insertions(+), 41 deletions(-) diff --git a/openrtx/include/interfaces/keyboard.h b/openrtx/include/interfaces/keyboard.h index ce3fd8cd..f376bb11 100644 --- a/openrtx/include/interfaces/keyboard.h +++ b/openrtx/include/interfaces/keyboard.h @@ -73,9 +73,9 @@ static const uint16_t kbd_long_interval = TICK_FREQ * 0.7; /** * Mask for the numeric keys in a key map - * Numeric keys: bit0->bit9 = 0x3FF + * Numeric keys: bit0->bit11 = 0xFFF */ -static const uint32_t kbd_num_mask = 0x3FF; +static const uint32_t kbd_num_mask = 0xFFF; /** * Structure that represents a keyboard event payload diff --git a/openrtx/include/state.h b/openrtx/include/state.h index 4adfe729..0a167cbe 100644 --- a/openrtx/include/state.h +++ b/openrtx/include/state.h @@ -66,6 +66,7 @@ gps_t; typedef struct { char callsign[10]; + char dst_addr[10]; } m17_t; diff --git a/openrtx/src/threads.c b/openrtx/src/threads.c index 9487ed04..fe68c373 100644 --- a/openrtx/src/threads.c +++ b/openrtx/src/threads.c @@ -106,7 +106,7 @@ void *ui_task(void *arg) // Copy new M17 source and destination addresses strncpy(rtx_cfg.source_address, state.m17_data.callsign, 10); - strncpy(rtx_cfg.destination_address, "", 10); + strncpy(rtx_cfg.destination_address, state.m17_data.dst_addr, 10); rtx_configure(&rtx_cfg); sync_rtx = false; diff --git a/openrtx/src/ui/ui.c b/openrtx/src/ui/ui.c index ed3ab268..6ae794d3 100644 --- a/openrtx/src/ui/ui.c +++ b/openrtx/src/ui/ui.c @@ -183,7 +183,7 @@ const char *symbols_ITU_T_E161[] = "pqrs7PQRS", "tuv8TUV", "wxyz9WXYZ", - "*", + "-/*", "#" }; @@ -199,7 +199,7 @@ const char *symbols_ITU_T_E161_callsign[] = "PQRS7", "TUV8", "WXYZ9", - "", + "-/", "" }; @@ -973,6 +973,11 @@ void ui_updateFSM(event_t event, bool *sync_rtx) // Switch to VFO screen state.ui_screen = MAIN_VFO; } + else if(msg.keys & KEY_F1) + { + // Switch to Digital Mode MEM screen + state.ui_screen = MODE_MEM; + } else if(msg.keys & KEY_UP || msg.keys & KNOB_RIGHT) { _ui_fsm_loadChannel(state.channel_index + 1, sync_rtx); @@ -984,42 +989,152 @@ void ui_updateFSM(event_t event, bool *sync_rtx) break; // Digital Mode VFO screen case MODE_VFO: - if(msg.keys & KEY_ENTER) + if(state.channel.mode == M17) { - // Save current main state - ui_state.last_main_state = state.ui_screen; - // Open Menu - state.ui_screen = MENU_TOP; + // Dst ID input + if(ui_state.edit_mode) + { + if(msg.keys & KEY_ENTER) + { + _ui_textInputConfirm(ui_state.new_callsign); + // Save selected dst ID and disable input mode + strncpy(state.m17_data.dst_addr, ui_state.new_callsign, 10); + ui_state.edit_mode = false; + *sync_rtx = true; + } + else if(msg.keys & KEY_ESC) + // Discard selected dst ID and disable input mode + ui_state.edit_mode = false; + else if(msg.keys & KEY_UP || msg.keys & KEY_DOWN || + msg.keys & KEY_LEFT || msg.keys & KEY_RIGHT) + _ui_textInputDel(ui_state.new_callsign); + else if(input_isNumberPressed(msg)) + _ui_textInputKeypad(ui_state.new_callsign, 9, msg, true); + } + else + { + if(msg.keys & KEY_ENTER) + { + // Save current main state + ui_state.last_main_state = state.ui_screen; + // Open Menu + state.ui_screen = MENU_TOP; + } + else if(msg.keys & KEY_ESC) + { + // Switch to VFO screen + state.ui_screen = MAIN_VFO; + } + else if(msg.keys & KEY_F1) + { + // Switch to Main VFO screen + state.ui_screen = MAIN_VFO; + } + else if(input_isNumberPressed(msg)) + { + // Enable dst ID input + ui_state.edit_mode = true; + // Reset text input variables + _ui_textInputReset(ui_state.new_callsign); + // Type first character + _ui_textInputKeypad(ui_state.new_callsign, 9, msg, true); + } + } } - else if(msg.keys & KEY_ESC) + else { - // Switch to VFO screen - state.ui_screen = MAIN_VFO; - } - else if(msg.keys & KEY_F1) - { - // Switch to Main VFO screen - state.ui_screen = MAIN_VFO; + if(msg.keys & KEY_ENTER) + { + // Save current main state + ui_state.last_main_state = state.ui_screen; + // Open Menu + state.ui_screen = MENU_TOP; + } + else if(msg.keys & KEY_ESC) + { + // Switch to VFO screen + state.ui_screen = MAIN_VFO; + } + else if(msg.keys & KEY_F1) + { + // Switch to Main VFO screen + state.ui_screen = MAIN_VFO; + } } break; // Digital Mode MEM screen case MODE_MEM: - if(msg.keys & KEY_ENTER) + if(state.channel.mode == M17) { - // Save current main state - ui_state.last_main_state = state.ui_screen; - // Open Menu - state.ui_screen = MENU_TOP; + // Dst ID input + if(ui_state.edit_mode) + { + if(msg.keys & KEY_ENTER) + { + _ui_textInputConfirm(ui_state.new_callsign); + // Save selected dst ID and disable input mode + strncpy(state.m17_data.dst_addr, ui_state.new_callsign, 10); + ui_state.edit_mode = false; + *sync_rtx = true; + } + else if(msg.keys & KEY_ESC) + // Discard selected dst ID and disable input mode + ui_state.edit_mode = false; + else if(msg.keys & KEY_UP || msg.keys & KEY_DOWN || + msg.keys & KEY_LEFT || msg.keys & KEY_RIGHT) + _ui_textInputDel(ui_state.new_callsign); + else if(input_isNumberPressed(msg)) + _ui_textInputKeypad(ui_state.new_callsign, 9, msg, true); + } + else + { + if(msg.keys & KEY_ENTER) + { + // Save current main state + ui_state.last_main_state = state.ui_screen; + // Open Menu + state.ui_screen = MENU_TOP; + } + else if(msg.keys & KEY_ESC) + { + // Switch to MEM screen + state.ui_screen = MAIN_MEM; + } + else if(msg.keys & KEY_F1) + { + // Switch to Main MEM screen + state.ui_screen = MAIN_MEM; + } + else if(input_isNumberPressed(msg)) + { + // Enable dst ID input + ui_state.edit_mode = true; + // Reset text input variables + _ui_textInputReset(ui_state.new_callsign); + // Type first character + _ui_textInputKeypad(ui_state.new_callsign, 9, msg, true); + } + } } - else if(msg.keys & KEY_ESC) + else { - // Switch to MEM screen - state.ui_screen = MAIN_MEM; - } - else if(msg.keys & KEY_F1) - { - // Switch to Main MEM screen - state.ui_screen = MAIN_MEM; + if(msg.keys & KEY_ENTER) + { + // Save current main state + ui_state.last_main_state = state.ui_screen; + // Open Menu + state.ui_screen = MENU_TOP; + } + else if(msg.keys & KEY_ESC) + { + // Switch to MEM screen + state.ui_screen = MAIN_MEM; + } + else if(msg.keys & KEY_F1) + { + // Switch to Main MEM screen + state.ui_screen = MAIN_MEM; + } } break; // Top menu screen @@ -1387,11 +1502,11 @@ void ui_updateGUI() break; // Digital Mode VFO screen case MODE_VFO: - _ui_drawModeVFO(); + _ui_drawModeVFO(&ui_state); break; // Digital Mode MEM screen case MODE_MEM: - _ui_drawModeMEM(); + _ui_drawModeMEM(&ui_state); break; // Top menu screen case MENU_TOP: diff --git a/openrtx/src/ui/ui_mode.c b/openrtx/src/ui/ui_mode.c index 2f0f231a..4d2a5ee4 100644 --- a/openrtx/src/ui/ui_mode.c +++ b/openrtx/src/ui/ui_mode.c @@ -47,7 +47,7 @@ void _ui_drawMEMChannel() last_state.channel_index, last_state.channel.name); } -void _ui_drawModeDetails() +void _ui_drawModeDetails(ui_state_t* ui_state) { char bw_str[8] = { 0 }; char encdec_str[9] = { 0 }; @@ -103,27 +103,36 @@ void _ui_drawModeDetails() layout.horizontal_pad, layout.mode_font_small, TEXT_ALIGN_LEFT, color_white, "Src ID: %s", cfg.source_address); // Print M17 Destination ID on line 3 of 3 - gfx_printLine(3, 3, layout.top_h, SCREEN_HEIGHT - layout.bottom_h, - layout.horizontal_pad, layout.mode_font_small, - TEXT_ALIGN_LEFT, color_white, "Dst ID: %s", cfg.destination_address); + if(ui_state->edit_mode) + { + gfx_printLine(3, 3, layout.top_h, SCREEN_HEIGHT - layout.bottom_h, + layout.horizontal_pad, layout.mode_font_small, + TEXT_ALIGN_LEFT, color_white, "Dst ID: %s_", ui_state->new_callsign); + } + else + { + gfx_printLine(3, 3, layout.top_h, SCREEN_HEIGHT - layout.bottom_h, + layout.horizontal_pad, layout.mode_font_small, + TEXT_ALIGN_LEFT, color_white, "Dst ID: %s", cfg.destination_address); + } break; } } -void _ui_drawModeVFO() +void _ui_drawModeVFO(ui_state_t* ui_state) { gfx_clearScreen(); _ui_drawMainTop(); _ui_drawModeVFOFreq(); - _ui_drawModeDetails(); + _ui_drawModeDetails(ui_state); _ui_drawMainBottom(); } -void _ui_drawModeMEM() +void _ui_drawModeMEM(ui_state_t* ui_state) { gfx_clearScreen(); _ui_drawMainTop(); _ui_drawMEMChannel(); - _ui_drawModeDetails(); + _ui_drawModeDetails(ui_state); _ui_drawMainBottom(); }