diff --git a/meson.build b/meson.build index 02e57ab6..8f483a9f 100644 --- a/meson.build +++ b/meson.build @@ -53,7 +53,6 @@ openrtx_src = ['openrtx/src/core/state.c', 'openrtx/src/core/memory_profiling.cpp', 'openrtx/src/ui/ui.c', 'openrtx/src/ui/ui_main.c', - 'openrtx/src/ui/ui_mode.c', 'openrtx/src/ui/ui_menu.c', 'openrtx/src/rtx/rtx.cpp', 'openrtx/src/rtx/OpMode_FM.cpp', diff --git a/openrtx/src/ui/ui.c b/openrtx/src/ui/ui.c index d4337706..23cb8c5c 100644 --- a/openrtx/src/ui/ui.c +++ b/openrtx/src/ui/ui.c @@ -85,11 +85,9 @@ extern void _ui_drawVFOMiddle(); extern void _ui_drawMEMMiddle(); extern void _ui_drawVFOBottom(); extern void _ui_drawMEMBottom(); -extern void _ui_drawMainVFO(); +extern void _ui_drawMainVFO(ui_state_t* ui_state); extern void _ui_drawMainVFOInput(ui_state_t* ui_state); -extern void _ui_drawMainMEM(); -extern void _ui_drawModeVFO(); -extern void _ui_drawModeMEM(); +extern void _ui_drawMainMEM(ui_state_t* ui_state); /* UI menu functions, their implementation is in "ui_menu.c" */ extern void _ui_drawMenuTop(ui_state_t* ui_state); extern void _ui_drawMenuBank(ui_state_t* ui_state); @@ -787,8 +785,6 @@ void _ui_fsm_menuMacro(kbd_msg_t msg, bool *sync_rtx) case 5: // Cycle through radio modes if(state.channel.mode == OPMODE_FM) - state.channel.mode = OPMODE_DMR; - else if(state.channel.mode == OPMODE_DMR) state.channel.mode = OPMODE_M17; else if(state.channel.mode == OPMODE_M17) state.channel.mode = OPMODE_FM; @@ -995,66 +991,109 @@ void ui_updateFSM(bool *sync_rtx) { // VFO screen case MAIN_VFO: - if(msg.keys & KEY_UP || msg.keys & KNOB_RIGHT) + // M17 Destination callsign input + if(ui_state.edit_mode) { - // Increment TX and RX frequency of 12.5KHz - if(_ui_freq_check_limits(state.channel.rx_frequency + 12500) && - _ui_freq_check_limits(state.channel.tx_frequency + 12500)) + if(state.channel.mode == OPMODE_M17) { - state.channel.rx_frequency += 12500; - state.channel.tx_frequency += 12500; - *sync_rtx = true; + 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_HASH) + { + // Save selected dst ID and disable input mode + strncpy(state.m17_data.dst_addr, "", 1); + 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); + break; } } - else if(msg.keys & KEY_DOWN || msg.keys & KNOB_LEFT) + else { - // Decrement TX and RX frequency of 12.5KHz - if(_ui_freq_check_limits(state.channel.rx_frequency - 12500) && - _ui_freq_check_limits(state.channel.tx_frequency - 12500)) + if(msg.keys & KEY_ENTER) { - state.channel.rx_frequency -= 12500; - state.channel.tx_frequency -= 12500; - *sync_rtx = true; + // Save current main state + ui_state.last_main_state = state.ui_screen; + // Open Menu + state.ui_screen = MENU_TOP; } - } - 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) - { - // Save VFO channel - state.vfo_channel = state.channel; - int result = _ui_fsm_loadChannel(state.channel_index, sync_rtx); - // Read successful and channel is valid - if(result != -1) + else if(msg.keys & KEY_HASH) { - // Switch to MEM screen - state.ui_screen = MAIN_MEM; + // Enable dst ID input + ui_state.edit_mode = true; + // Reset text input variables + _ui_textInputReset(ui_state.new_callsign); + } + else if(msg.keys & KEY_UP || msg.keys & KNOB_RIGHT) + { + // Increment TX and RX frequency of 12.5KHz + if(_ui_freq_check_limits(state.channel.rx_frequency + 12500) && + _ui_freq_check_limits(state.channel.tx_frequency + 12500)) + { + state.channel.rx_frequency += 12500; + state.channel.tx_frequency += 12500; + *sync_rtx = true; + } + } + else if(msg.keys & KEY_DOWN || msg.keys & KNOB_LEFT) + { + // Decrement TX and RX frequency of 12.5KHz + if(_ui_freq_check_limits(state.channel.rx_frequency - 12500) && + _ui_freq_check_limits(state.channel.tx_frequency - 12500)) + { + state.channel.rx_frequency -= 12500; + state.channel.tx_frequency -= 12500; + *sync_rtx = 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) + { + // Save VFO channel + state.vfo_channel = state.channel; + int result = _ui_fsm_loadChannel(state.channel_index, sync_rtx); + // Read successful and channel is valid + if(result != -1) + { + // Switch to MEM screen + state.ui_screen = MAIN_MEM; + } + } + else if(input_isNumberPressed(msg)) + { + // Open Frequency input screen + state.ui_screen = MAIN_VFO_INPUT; + // Reset input position and selection + ui_state.input_position = 1; + ui_state.input_set = SET_RX; + ui_state.new_rx_frequency = 0; + ui_state.new_tx_frequency = 0; + // Save pressed number to calculare frequency and show in GUI + ui_state.input_number = input_getPressedNumber(msg); + // Calculate portion of the new frequency + ui_state.new_rx_frequency = _ui_freq_add_digit(ui_state.new_rx_frequency, + ui_state.input_position, ui_state.input_number); } - } - else if(msg.keys & KEY_F1) - { - // Switch to Digital Mode VFO screen - state.ui_screen = MODE_VFO; - } - else if(input_isNumberPressed(msg)) - { - // Open Frequency input screen - state.ui_screen = MAIN_VFO_INPUT; - // Reset input position and selection - ui_state.input_position = 1; - ui_state.input_set = SET_RX; - ui_state.new_rx_frequency = 0; - ui_state.new_tx_frequency = 0; - // Save pressed number to calculare frequency and show in GUI - ui_state.input_number = input_getPressedNumber(msg); - // Calculate portion of the new frequency - ui_state.new_rx_frequency = _ui_freq_add_digit(ui_state.new_rx_frequency, - ui_state.input_position, ui_state.input_number); } break; // VFO frequency input screen @@ -1084,42 +1123,10 @@ void ui_updateFSM(bool *sync_rtx) break; // MEM screen case MAIN_MEM: - if(msg.keys & KEY_ENTER) + // M17 Destination callsign input + if(ui_state.edit_mode) { - // 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) - { - // Restore VFO channel - state.channel = state.vfo_channel; - // Update RTX configuration - *sync_rtx = true; - // 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); - } - else if(msg.keys & KEY_DOWN || msg.keys & KNOB_LEFT) - { - _ui_fsm_loadChannel(state.channel_index - 1, sync_rtx); - } - break; - // Digital Mode VFO screen - case MODE_VFO: - if(state.channel.mode == OPMODE_M17) - { - // Dst ID input - if(ui_state.edit_mode) + if(state.channel.mode == OPMODE_M17) { if(msg.keys & KEY_ENTER) { @@ -1129,6 +1136,13 @@ void ui_updateFSM(bool *sync_rtx) ui_state.edit_mode = false; *sync_rtx = true; } + else if(msg.keys & KEY_HASH) + { + // Save selected dst ID and disable input mode + strncpy(state.m17_data.dst_addr, "", 1); + 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; @@ -1137,35 +1151,7 @@ void ui_updateFSM(bool *sync_rtx) _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); - } + break; } } else @@ -1179,88 +1165,27 @@ void ui_updateFSM(bool *sync_rtx) } else if(msg.keys & KEY_ESC) { + // Restore VFO channel + state.channel = state.vfo_channel; + // Update RTX configuration + *sync_rtx = true; // Switch to VFO screen state.ui_screen = MAIN_VFO; } - else if(msg.keys & KEY_F1) + else if(msg.keys & KEY_HASH) { - // Switch to Main VFO screen - state.ui_screen = MAIN_VFO; + // Enable dst ID input + ui_state.edit_mode = true; + // Reset text input variables + _ui_textInputReset(ui_state.new_callsign); } - } - break; - // Digital Mode MEM screen - case MODE_MEM: - if(state.channel.mode == OPMODE_M17) - { - // Dst ID input - if(ui_state.edit_mode) + else if(msg.keys & KEY_UP || msg.keys & KNOB_RIGHT) { - 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); + _ui_fsm_loadChannel(state.channel_index + 1, sync_rtx); } - else + else if(msg.keys & KEY_DOWN || msg.keys & KNOB_LEFT) { - 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_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; + _ui_fsm_loadChannel(state.channel_index - 1, sync_rtx); } } break; @@ -1690,7 +1615,7 @@ bool ui_updateGUI() { // VFO main screen case MAIN_VFO: - _ui_drawMainVFO(); + _ui_drawMainVFO(&ui_state); break; // VFO frequency input screen case MAIN_VFO_INPUT: @@ -1698,15 +1623,7 @@ bool ui_updateGUI() break; // MEM main screen case MAIN_MEM: - _ui_drawMainMEM(); - break; - // Digital Mode VFO screen - case MODE_VFO: - _ui_drawModeVFO(&ui_state); - break; - // Digital Mode MEM screen - case MODE_MEM: - _ui_drawModeMEM(&ui_state); + _ui_drawMainMEM(&ui_state); break; // Top menu screen case MENU_TOP: diff --git a/openrtx/src/ui/ui_main.c b/openrtx/src/ui/ui_main.c index 6fe0f73b..2f0202a9 100644 --- a/openrtx/src/ui/ui_main.c +++ b/openrtx/src/ui/ui_main.c @@ -75,20 +75,68 @@ void _ui_drawMainTop() void _ui_drawBankChannel() { - // Print Bank name - if(!last_state.bank_enabled) - gfx_print(layout.line1_pos, layout.line1_font, TEXT_ALIGN_LEFT, - color_white, "bank: All channels"); - else { - bankHdr_t bank = { 0 }; - cps_readBankHeader(&bank, last_state.bank); - gfx_print(layout.line1_pos, layout.line1_font, TEXT_ALIGN_LEFT, - color_white, "bank: %.13s", bank.name); + // Print Bank number, channel number and Channel name + uint16_t b = (last_state.bank_enabled) ? last_state.bank : 0; + gfx_print(layout.line1_pos, layout.line1_font, TEXT_ALIGN_CENTER, + color_white, "%01d-%03d: %.12s", + b, last_state.channel_index + 1, last_state.channel.name); +} + +void _ui_drawModeInfo(ui_state_t* ui_state) +{ + char bw_str[8] = { 0 }; + char encdec_str[9] = { 0 }; + + rtxStatus_t cfg = rtx_getCurrentStatus(); + + switch(last_state.channel.mode) + { + case OPMODE_FM: + // Get Bandwidth string + if(last_state.channel.bandwidth == BW_12_5) + snprintf(bw_str, 8, "12.5"); + else if(last_state.channel.bandwidth == BW_20) + snprintf(bw_str, 8, "20"); + else if(last_state.channel.bandwidth == BW_25) + snprintf(bw_str, 8, "25"); + // Get encdec string + bool tone_tx_enable = last_state.channel.fm.txToneEn; + bool tone_rx_enable = last_state.channel.fm.rxToneEn; + if (tone_tx_enable && tone_rx_enable) + snprintf(encdec_str, 9, "E+D"); + else if (tone_tx_enable && !tone_rx_enable) + snprintf(encdec_str, 9, "E"); + else if (!tone_tx_enable && tone_rx_enable) + snprintf(encdec_str, 9, "D"); + else + snprintf(encdec_str, 9, " "); + + // Print Bandwidth, Tone and encdec info + gfx_print(layout.line2_pos, layout.line2_font, TEXT_ALIGN_CENTER, + color_white, "B:%s T:%4.1f S:%s", + bw_str, ctcss_tone[last_state.channel.fm.txTone]/10.0f, + encdec_str); + break; + case OPMODE_DMR: + // Print talkgroup + gfx_print(layout.line2_pos, layout.line2_font, TEXT_ALIGN_CENTER, + color_white, "TG:%s", + ""); + break; + case OPMODE_M17: + { + // Print M17 Destination ID on line 3 of 3 + char *dst = NULL; + if(ui_state->edit_mode) + dst = ui_state->new_callsign; + else + dst = (!strnlen(cfg.destination_address, 10)) ? + "Broadcast" : cfg.destination_address; + gfx_print(layout.line2_pos, layout.line2_font, TEXT_ALIGN_CENTER, + color_white, "#%s", dst); + break; + } } - // Print Channel name - gfx_print(layout.line2_pos, layout.line2_font, TEXT_ALIGN_LEFT, - color_white, " %03d: %.12s", - last_state.channel_index + 1, last_state.channel.name); } void _ui_drawFrequency() @@ -195,10 +243,11 @@ void _ui_drawMainBottom() } } -void _ui_drawMainVFO() +void _ui_drawMainVFO(ui_state_t* ui_state) { gfx_clearScreen(); _ui_drawMainTop(); + _ui_drawModeInfo(ui_state); _ui_drawFrequency(); _ui_drawMainBottom(); } @@ -211,11 +260,12 @@ void _ui_drawMainVFOInput(ui_state_t* ui_state) _ui_drawMainBottom(); } -void _ui_drawMainMEM() +void _ui_drawMainMEM(ui_state_t* ui_state) { gfx_clearScreen(); _ui_drawMainTop(); _ui_drawBankChannel(); + _ui_drawModeInfo(ui_state); _ui_drawFrequency(); _ui_drawMainBottom(); } diff --git a/openrtx/src/ui/ui_mode.c b/openrtx/src/ui/ui_mode.c deleted file mode 100644 index 68c6ca3b..00000000 --- a/openrtx/src/ui/ui_mode.c +++ /dev/null @@ -1,138 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2021 - 2022 by Federico Amedeo Izzo IU2NUO, * - * Niccolò Izzo IU2KIN * - * Frederik Saraci IU2NRO * - * Silvano Seva IU2KWO * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, see * - ***************************************************************************/ - -#include -#include -#include -#include -#include - -/* UI main screen helper functions, their implementation is in "ui_main.c" */ -extern void _ui_drawMainTop(); -extern void _ui_drawMainBottom(); - -void _ui_drawModeVFOFreq() -{ - // Print VFO RX Frequency on line 1 of 3 - gfx_printLine(1, 3, layout.top_h, SCREEN_HEIGHT - layout.bottom_h, - layout.horizontal_pad, layout.mode_font_big, - TEXT_ALIGN_CENTER, color_white, "%03lu.%05lu", - (unsigned long)last_state.channel.rx_frequency/1000000, - (unsigned long)last_state.channel.rx_frequency%1000000/10); -} - -void _ui_drawMEMChannel() -{ - // Print Channel name on line 1 of 3 - gfx_printLine(1, 3, layout.top_h, SCREEN_HEIGHT - layout.bottom_h, - layout.horizontal_pad, layout.mode_font_small, - TEXT_ALIGN_CENTER, color_white, "%03d: %.12s", - last_state.channel_index, last_state.channel.name); -} - -void _ui_drawModeDetails(ui_state_t* ui_state) -{ - char bw_str[8] = { 0 }; - char encdec_str[9] = { 0 }; - - rtxStatus_t cfg = rtx_getCurrentStatus(); - - switch(last_state.channel.mode) - { - case OPMODE_FM: - // Get Bandwith string - if(last_state.channel.bandwidth == BW_12_5) - snprintf(bw_str, 8, "12.5"); - else if(last_state.channel.bandwidth == BW_20) - snprintf(bw_str, 8, "20"); - else if(last_state.channel.bandwidth == BW_25) - snprintf(bw_str, 8, "25"); - // Get encdec string - bool tone_tx_enable = last_state.channel.fm.txToneEn; - bool tone_rx_enable = last_state.channel.fm.rxToneEn; - if (tone_tx_enable && tone_rx_enable) - snprintf(encdec_str, 9, "E+D"); - else if (tone_tx_enable && !tone_rx_enable) - snprintf(encdec_str, 9, "E"); - else if (!tone_tx_enable && tone_rx_enable) - snprintf(encdec_str, 9, "D"); - else - snprintf(encdec_str, 9, " "); - - // Print Bandwidth info - gfx_printLine(2, 3, layout.top_h, SCREEN_HEIGHT - layout.bottom_h, - layout.horizontal_pad, layout.mode_font_small, - TEXT_ALIGN_LEFT, color_white, "BW:%s", bw_str); - // Print Tone and encdec info - gfx_printLine(3, 3, layout.top_h, SCREEN_HEIGHT - layout.bottom_h, - layout.horizontal_pad, layout.mode_font_small, - TEXT_ALIGN_LEFT, color_white, "T:%4.1f S:%s", - ctcss_tone[last_state.channel.fm.txTone]/10.0f, - encdec_str); - break; - case OPMODE_DMR: - // Print talkgroup on line 2 of 3 - gfx_printLine(2, 3, layout.top_h, SCREEN_HEIGHT - layout.bottom_h, - layout.horizontal_pad, layout.mode_font_small, - TEXT_ALIGN_LEFT, color_white, "TG:"); - // Print User 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, "ID:"); - break; - case OPMODE_M17: - // Print M17 Source ID on line 2 of 3 - gfx_printLine(2, 3, layout.top_h, SCREEN_HEIGHT - layout.bottom_h, - 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 - 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(ui_state_t* ui_state) -{ - gfx_clearScreen(); - _ui_drawMainTop(); - _ui_drawModeVFOFreq(); - _ui_drawModeDetails(ui_state); - _ui_drawMainBottom(); -} - -void _ui_drawModeMEM(ui_state_t* ui_state) -{ - gfx_clearScreen(); - _ui_drawMainTop(); - _ui_drawMEMChannel(); - _ui_drawModeDetails(ui_state); - _ui_drawMainBottom(); -}