From 1a7d62fb4299f43365ce5446ee776334e6f91655 Mon Sep 17 00:00:00 2001 From: Marco <49691247+marcoSchr@users.noreply.github.com> Date: Tue, 5 Sep 2023 20:38:22 +0200 Subject: [PATCH] Add UI and check for CAN on RX --- openrtx/include/core/settings.h | 4 +- openrtx/include/rtx/rtx.h | 3 +- openrtx/include/ui/ui_default.h | 3 +- openrtx/include/ui/ui_mod17.h | 5 +- openrtx/src/core/threads.c | 3 +- openrtx/src/rtx/OpMode_M17.cpp | 7 +- openrtx/src/ui/default/ui.c | 105 +++++++++++++++++------------- openrtx/src/ui/default/ui_menu.c | 5 ++ openrtx/src/ui/module17/ui.c | 9 ++- openrtx/src/ui/module17/ui_menu.c | 3 + 10 files changed, 94 insertions(+), 53 deletions(-) diff --git a/openrtx/include/core/settings.h b/openrtx/include/core/settings.h index f5e99804..851a0b5b 100644 --- a/openrtx/include/core/settings.h +++ b/openrtx/include/core/settings.h @@ -59,6 +59,7 @@ typedef struct uint8_t vpLevel : 3, // Voice prompt level vpPhoneticSpell : 1, // Phonetic spell enabled _reserved : 4; + bool m17_can_rx; // Check M17 CAN on RX } __attribute__((packed)) settings_t; @@ -80,7 +81,8 @@ static const settings_t default_settings = 0, // M17 CAN 0, // Voice prompts off 0, // Phonetic spell off - 0 // not used + 0, // not used + false // Check M17 CAN on RX }; #endif /* SETTINGS_H */ diff --git a/openrtx/include/rtx/rtx.h b/openrtx/include/rtx/rtx.h index 35c0ce0a..20ada43b 100644 --- a/openrtx/include/rtx/rtx.h +++ b/openrtx/include/rtx/rtx.h @@ -53,7 +53,8 @@ typedef struct txTone : 15; /**< TX CTC/DCS tone */ uint8_t can : 4, /**< M17 Channel Access Number */ - _unused : 4; + canRxEn : 1, /**< M17 Check CAN on RX */ + _unused : 3; char source_address[10]; /**< M17 call source address */ char destination_address[10]; /**< M17 call routing address */ diff --git a/openrtx/include/ui/ui_default.h b/openrtx/include/ui/ui_default.h index fe57e62d..edf57da5 100644 --- a/openrtx/include/ui/ui_default.h +++ b/openrtx/include/ui/ui_default.h @@ -136,7 +136,8 @@ enum settingsVoicePromptItems enum settingsM17Items { M17_CALLSIGN = 0, - M17_CAN + M17_CAN, + M17_CAN_RX }; /** diff --git a/openrtx/include/ui/ui_mod17.h b/openrtx/include/ui/ui_mod17.h index 848cb153..d2048389 100644 --- a/openrtx/include/ui/ui_mod17.h +++ b/openrtx/include/ui/ui_mod17.h @@ -128,8 +128,9 @@ enum settingsGPSItems enum m17Items { - M_CALLSIGN = 0 - ,M_CAN + M_CALLSIGN = 0, + M_CAN, + M_CAN_RX }; enum module17Items diff --git a/openrtx/src/core/threads.c b/openrtx/src/core/threads.c index 6c4badd3..1d433762 100644 --- a/openrtx/src/core/threads.c +++ b/openrtx/src/core/threads.c @@ -97,8 +97,9 @@ void *ui_threadFunc(void *arg) rtx_cfg.txToneEn = state.channel.fm.txToneEn; rtx_cfg.txTone = ctcss_tone[state.channel.fm.txTone]; - // Copy new M17 CAN, source and destination addresses + // Copy new M17 CAN, M17 CAN RX check,source and destination addresses rtx_cfg.can = state.settings.m17_can; + rtx_cfg.canRxEn = state.settings.m17_can_rx; strncpy(rtx_cfg.source_address, state.settings.callsign, 10); strncpy(rtx_cfg.destination_address, state.m17_dest, 10); diff --git a/openrtx/src/rtx/OpMode_M17.cpp b/openrtx/src/rtx/OpMode_M17.cpp index 2ae8c83d..2abe6557 100644 --- a/openrtx/src/rtx/OpMode_M17.cpp +++ b/openrtx/src/rtx/OpMode_M17.cpp @@ -238,8 +238,13 @@ void OpMode_M17::rxState(rtxStatus_t *const status) strncpy(status->M17_refl, exCall2.c_str(), 10); } + // Check CAN on RX, if enabled. + // If check is disabled, force match to true. + bool canMatch = (streamType.fields.CAN == status->can) + || (status->canRxEn == false); + // Extract audio data - if((type == M17FrameType::STREAM) && (pthSts == PATH_OPEN)) + if((type == M17FrameType::STREAM) && (pthSts == PATH_OPEN) && (canMatch == true)) { M17StreamFrame sf = decoder.getStreamFrame(); codec_pushFrame(sf.payload().data(), false); diff --git a/openrtx/src/ui/default/ui.c b/openrtx/src/ui/default/ui.c index 76464a39..234ba870 100644 --- a/openrtx/src/ui/default/ui.c +++ b/openrtx/src/ui/default/ui.c @@ -166,7 +166,8 @@ const char *settings_gps_items[] = const char * settings_m17_items[] = { "Callsign", - "CAN" + "CAN", + "CAN RX Check" }; const char * settings_voice_items[] = @@ -1970,51 +1971,65 @@ void ui_updateFSM(bool *sync_rtx) case SETTINGS_M17: if(ui_state.edit_mode) { - if(ui_state.menu_selected == M17_CALLSIGN) + switch (ui_state.menu_selected) { - // Handle text input for M17 callsign - if(msg.keys & KEY_ENTER) - { - _ui_textInputConfirm(ui_state.new_callsign); - // Save selected callsign and disable input mode - strncpy(state.settings.callsign, ui_state.new_callsign, 10); - ui_state.edit_mode = false; - vp_announceBuffer(¤tLanguage->callsign, - false, true, state.settings.callsign); - } - else if(msg.keys & KEY_ESC) - { - // Discard selected callsign and disable input mode - ui_state.edit_mode = false; - vp_announceBuffer(¤tLanguage->callsign, - false, true, state.settings.callsign); - } - 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.long_press && (msg.keys & KEY_F1) && (state.settings.vpLevel > vpBeep)) - { - vp_announceBuffer(¤tLanguage->callsign, - true, true, ui_state.new_callsign); - f1Handled=true; - } - } - else - { - if(msg.keys & KEY_DOWN || msg.keys & KNOB_LEFT) - _ui_changeM17Can(-1); - else if(msg.keys & KEY_UP || msg.keys & KNOB_RIGHT) - _ui_changeM17Can(+1); - else if(msg.keys & KEY_ENTER) - ui_state.edit_mode = !ui_state.edit_mode; - else if(msg.keys & KEY_ESC) - ui_state.edit_mode = false; + case M17_CALLSIGN: + // Handle text input for M17 callsign + if(msg.keys & KEY_ENTER) + { + _ui_textInputConfirm(ui_state.new_callsign); + // Save selected callsign and disable input mode + strncpy(state.settings.callsign, ui_state.new_callsign, 10); + ui_state.edit_mode = false; + vp_announceBuffer(¤tLanguage->callsign, + false, true, state.settings.callsign); + } + else if(msg.keys & KEY_ESC) + { + // Discard selected callsign and disable input mode + ui_state.edit_mode = false; + vp_announceBuffer(¤tLanguage->callsign, + false, true, state.settings.callsign); + } + 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.long_press && (msg.keys & KEY_F1) && (state.settings.vpLevel > vpBeep)) + { + vp_announceBuffer(¤tLanguage->callsign, + true, true, ui_state.new_callsign); + f1Handled=true; + } + break; + case M17_CAN: + if(msg.keys & KEY_DOWN || msg.keys & KNOB_LEFT) + _ui_changeM17Can(-1); + else if(msg.keys & KEY_UP || msg.keys & KNOB_RIGHT) + _ui_changeM17Can(+1); + else if(msg.keys & KEY_ENTER) + ui_state.edit_mode = !ui_state.edit_mode; + else if(msg.keys & KEY_ESC) + ui_state.edit_mode = false; + break; + case M17_CAN_RX: + if(msg.keys & KEY_LEFT || msg.keys & KEY_RIGHT || + (ui_state.edit_mode && + (msg.keys & KEY_DOWN || msg.keys & KNOB_LEFT || + msg.keys & KEY_UP || msg.keys & KNOB_RIGHT))) + { + state.settings.m17_can_rx = + !state.settings.m17_can_rx; + } + else if(msg.keys & KEY_ENTER) + ui_state.edit_mode = !ui_state.edit_mode; + else if(msg.keys & KEY_ESC) + ui_state.edit_mode = false; } } else diff --git a/openrtx/src/ui/default/ui_menu.c b/openrtx/src/ui/default/ui_menu.c index e1efea66..b2b6fbec 100644 --- a/openrtx/src/ui/default/ui_menu.c +++ b/openrtx/src/ui/default/ui_menu.c @@ -353,6 +353,11 @@ int _ui_getM17ValueName(char *buf, uint8_t max_len, uint8_t index) case M17_CAN: snprintf(buf, max_len, "%d", last_state.settings.m17_can); break; + case M17_CAN_RX: + snprintf(buf, max_len, "%s", (last_state.settings.m17_can_rx) ? + currentLanguage->on : + currentLanguage->off); + break; } return 0; diff --git a/openrtx/src/ui/module17/ui.c b/openrtx/src/ui/module17/ui.c index ea8d209b..ecfbedb8 100644 --- a/openrtx/src/ui/module17/ui.c +++ b/openrtx/src/ui/module17/ui.c @@ -97,7 +97,8 @@ const char *display_items[] = const char *m17_items[] = { "Callsign", - "CAN" + "CAN", + "CAN RX Check" }; const char *module17_items[] = @@ -967,6 +968,9 @@ void ui_updateFSM(bool *sync_rtx) case M_CAN: _ui_changeCAN(-1); break; + case M_CAN_RX: + state.settings.m17_can_rx = !state.settings.m17_can_rx; + break; default: state.ui_screen = SETTINGS_M17; } @@ -978,6 +982,9 @@ void ui_updateFSM(bool *sync_rtx) case M_CAN: _ui_changeCAN(+1); break; + case M_CAN_RX: + state.settings.m17_can_rx = !state.settings.m17_can_rx; + break; default: state.ui_screen = SETTINGS_M17; } diff --git a/openrtx/src/ui/module17/ui_menu.c b/openrtx/src/ui/module17/ui_menu.c index c6cd19c0..fca8a648 100644 --- a/openrtx/src/ui/module17/ui_menu.c +++ b/openrtx/src/ui/module17/ui_menu.c @@ -210,6 +210,9 @@ int _ui_getM17ValueName(char *buf, uint8_t max_len, uint8_t index) case M_CAN: snprintf(buf, max_len, "%d", last_state.settings.m17_can); break; + case M_CAN_RX: + snprintf(buf, max_len, "%s", (last_state.settings.m17_can_rx) ? "on" : "off"); + break; } return 0;