From a0e163bb01bca2f456d1079d0b4965e095a7948e Mon Sep 17 00:00:00 2001 From: Gaston Gonzalez Date: Fri, 7 Feb 2025 02:30:32 -0700 Subject: [PATCH] VARA - Added experimental support for VARA over Winlink. Also addeded support for native AX.25 packet for Bluetooth connected TNCs --- overlay/etc/sudoers.d/et-rfcomm | 1 - overlay/opt/emcomm-tools/bin/et-kill-all | 7 +- overlay/opt/emcomm-tools/bin/et-mode | 58 ++++++++++++- overlay/opt/emcomm-tools/bin/et-radio | 6 +- overlay/opt/emcomm-tools/bin/et-system-info | 10 ++- overlay/opt/emcomm-tools/bin/et-winlink | 37 ++++++++- .../template.d/winlink/config.vara-fm.json | 83 +++++++++++++++++++ .../template.d/winlink/config.vara-hf.json | 83 +++++++++++++++++++ 8 files changed, 274 insertions(+), 11 deletions(-) create mode 100644 overlay/opt/emcomm-tools/conf/template.d/winlink/config.vara-fm.json create mode 100644 overlay/opt/emcomm-tools/conf/template.d/winlink/config.vara-hf.json diff --git a/overlay/etc/sudoers.d/et-rfcomm b/overlay/etc/sudoers.d/et-rfcomm index b0704af..1d88dbf 100644 --- a/overlay/etc/sudoers.d/et-rfcomm +++ b/overlay/etc/sudoers.d/et-rfcomm @@ -2,6 +2,5 @@ %bluetooth ALL=(ALL) NOPASSWD: /usr/sbin/kissattach /dev/rfcomm0 * %bluetooth ALL=(ALL) NOPASSWD: /usr/sbin/kissparms * -%bluetooth ALL=(ALL) NOPASSWD: /usr/bin/killall kissattach %bluetooth ALL=(ALL) NOPASSWD: /usr/bin/killall kissattach %bluetooth ALL=(ALL) NOPASSWD: /usr/bin/killall rfcomm diff --git a/overlay/opt/emcomm-tools/bin/et-kill-all b/overlay/opt/emcomm-tools/bin/et-kill-all index cb1c84f..0e57b69 100755 --- a/overlay/opt/emcomm-tools/bin/et-kill-all +++ b/overlay/opt/emcomm-tools/bin/et-kill-all @@ -2,7 +2,7 @@ # # Author : Gaston Gonzalez # Date : 12 November 2024 -# Updated : 3 February 2025 +# Updated : 7 February 2025 # Purpose : Stops all EmComm Tools sound-based services (i.e. modems) and # amatuer radio applications to ensure a clean start for the next mode. @@ -18,6 +18,11 @@ stop_all_services() { systemctl --user stop et-service-direwolf-simple systemctl --user stop et-service-direwolf-aprs-digipeater systemctl --user stop et-service-direwolf-packet-digipeater + + # Stop VARA with a sledge hammer + pkill et-winlink + pkill et-vara + pkill VARA } et-log "Stopping all services" diff --git a/overlay/opt/emcomm-tools/bin/et-mode b/overlay/opt/emcomm-tools/bin/et-mode index 2dd35d6..7fe5581 100755 --- a/overlay/opt/emcomm-tools/bin/et-mode +++ b/overlay/opt/emcomm-tools/bin/et-mode @@ -2,7 +2,7 @@ # # Author : Gaston Gonzalez # Date : 6 November 2024 -# Updated : 3 February 2025 +# Updated : 5 February 2025 # Purpose : Configures the system for a specific mode of operation # Use a simple text file to save the state of the last mode selected @@ -18,6 +18,8 @@ MODE_ID_CHAT_CLIENT="chat-chattervox" MODE_ID_PACKET_DIGIPEATER="packet-digipeater" MODE_ID_WINLINK_ARDOP="winlink-ardop" MODE_ID_WINLINK_PACKET="winlink-packet" +MODE_ID_WINLINK_VARA_HF="winlink-vara-hf" +MODE_ID_WINLINK_VARA_FM="winlink-vara-fm" # Default to 1200 baud PACKET_MODE=simple @@ -66,6 +68,31 @@ start_and_wait_for_service() { exit_on_service_failure ${systemd_unit_name} } +start_and_wait_for_vara() { + local vara_cmd="$1" + local elapsed=0 + + et-log "Starting ${vara_cmd}..." + ${vara_cmd} & + + et-log "Waiting for ${vara_cmd} to become active..." + + while true; do + CHECK_VARA=$(ps -ef | grep "[V]ARA") + if [ $? -eq 0 ]; then + break + fi + + sleep "$INTERVAL" + elapsed=$((elapsed + INTERVAL)) + if [ "$elapsed" -ge "$TIMEOUT" ]; then + et-log "Timeout reached. ${systemd_unit_name} failed to start." + exit 1 + fi + et-log "Waiting for ${vara_cmd} to become active..." + done +} + select_direwolf_mode () { packet_mode=() packet_mode+=("simple" "1200 baud (default for VHF/UHF)") @@ -108,11 +135,20 @@ options+=("${MODE_ID_BBS_CLIENT2}" "BBS Client (QtTermTCP)") options+=("${MODE_ID_CHAT_CLIENT}" "Chat (chattervox)") options+=("${MODE_ID_APRS_DIGIPEATER}" "APRS Digipeater") options+=("${MODE_ID_PACKET_DIGIPEATER}" "Packet Digipeater") -options+=("${MODE_ID_WINLINK_ARDOP}" "Winlink over HF (ARDOP)") options+=("${MODE_ID_WINLINK_PACKET}" "Winlink over VHF/UHF (AX.25 Packet)") +if [ -e "${HOME}/.wine32/drive_c/VARA FM/VARAFM.exe" ]; then + options+=("${MODE_ID_WINLINK_VARA_FM}" "Winlink over VHF/UHF (VARA FM)") +fi + +options+=("${MODE_ID_WINLINK_ARDOP}" "Winlink over HF (ARDOP)") + +if [ -e "${HOME}/.wine32/drive_c/VARA/VARA.exe" ]; then + options+=("${MODE_ID_WINLINK_VARA_HF}" "Winlink over HF (VARA HF)") +fi + # Prompt user for option and save exit status -SELECTED_MODE=$(dialog --clear --menu "Select a mode:" 16 65 10 "${options[@]}" 3>&1 1>&2 2>&3) +SELECTED_MODE=$(dialog --clear --menu "Select a mode:" 18 65 10 "${options[@]}" 3>&1 1>&2 2>&3) exit_status=$? tput sgr 0 && clear @@ -173,6 +209,22 @@ if [ $exit_status -eq 0 ]; then start_and_wait_for_service et-service-winlink-packet min http://localhost:8080 ;; + ${MODE_ID_WINLINK_VARA_FM}) + dialog --title "User Action Required" --msgbox "VARA FM is not a plug and play mode. You must configure VARA manually." 10 50 + tput sgr 0 && clear + start_and_wait_for_vara et-vara-fm + et-winlink start-vara-fm & + sleep 1 + min http://localhost:8080 2>/dev/null + ;; + ${MODE_ID_WINLINK_VARA_HF}) + dialog --title "User Action Required" --msgbox "VARA HF is not a plug and play mode. You must configure VARA manually." 10 50 + tput sgr 0 && clear + start_and_wait_for_vara et-vara-hf + et-winlink start-vara-hf & + sleep 1 + min http://localhost:8080 + ;; *) et-log "Mode ${SELECTED_MODE} not yet supported" exit 1 diff --git a/overlay/opt/emcomm-tools/bin/et-radio b/overlay/opt/emcomm-tools/bin/et-radio index 5d81e5d..f93119b 100755 --- a/overlay/opt/emcomm-tools/bin/et-radio +++ b/overlay/opt/emcomm-tools/bin/et-radio @@ -2,7 +2,7 @@ # # Author : Gaston Gonzalez # Date : 11 October 2024 -# Updated : 3 February 2025 +# Updated : 5 February 2025 # Purpose : A script for managaing plug-and-play radios set -e @@ -51,8 +51,8 @@ if [ $exit_status -eq 0 ]; then BLUETOOTH_TNC_CHECK=$(ps -ef | grep "[r]fcomm connect") if [[ $? -eq 0 ]]; then et-log "Killing running processes for Bluetooth TNC" - sudo killall kissattach - sudo killall rfcomm + sudo /usr/bin/killall kissattach + sudo /usr/bin/killall rfcomm fi printf "%-20s %-10s %-10s\n" "Radio ID" "Vendor" "Model" diff --git a/overlay/opt/emcomm-tools/bin/et-system-info b/overlay/opt/emcomm-tools/bin/et-system-info index 4a915ec..529de30 100755 --- a/overlay/opt/emcomm-tools/bin/et-system-info +++ b/overlay/opt/emcomm-tools/bin/et-system-info @@ -2,7 +2,7 @@ # # Author : Gaston Gonzalez # Date : 6 October 2024 -# Updated : 17 December 2024 +# Updated : 7 February 2025 # Purpose : Utility script for dumping system information function usage() { @@ -183,6 +183,8 @@ case $1 in MODE_ID_APRS_CLIENT="aprs-client" MODE_ID_WINLINK_ARDOP="winlink-ardop" MODE_ID_WINLINK_PACKET="winlink-packet" + MODE_ID_WINLINK_VARA_HF="winlink-vara-hf" + MODE_ID_WINLINK_VARA_FM="winlink-vara-fm" if [ ! -e /dev/et-audio ]; then echo "Run 'et-mode' to set" @@ -218,6 +220,12 @@ case $1 in ${MODE_ID_WINLINK_PACKET}) echo "Winlink Packet" ;; + ${MODE_ID_WINLINK_VARA_FM}) + echo "Winlink VARA FM" + ;; + ${MODE_ID_WINLINK_VARA_HF}) + echo "Winlink VARA HF" + ;; *) echo "Unknown" ;; diff --git a/overlay/opt/emcomm-tools/bin/et-winlink b/overlay/opt/emcomm-tools/bin/et-winlink index 783fe8e..1089a8b 100755 --- a/overlay/opt/emcomm-tools/bin/et-winlink +++ b/overlay/opt/emcomm-tools/bin/et-winlink @@ -2,7 +2,7 @@ # # Author : Gaston Gonzalez # Date : 4 November 2024 -# Updated : 3 February 2025 +# Updated : 4 February 2025 # Purpose : Wrapper script for starting YAAC with PnP support # # Preconditions: @@ -24,6 +24,8 @@ usage() { echo " start-ardop - Start Pat Winlink in ardop mode" echo " start-packet - Start Pat Winlink in packet mode" echo " start-native-packet - Start Pat Winlink in native AX.25 packet mode" + echo " start-vara-fm - Start Pat Winlink in VARA FM mode" + echo " start-vara-hf - Start Pat Winlink in VARA HF mode" } if [ $# -ne 1 ]; then @@ -90,6 +92,26 @@ start_native_packet() { ${CMD} } +start_vara_fm() { + + update_config vara-fm + + CMD="pat http" + et-log "Starting Pat with: ${CMD}" + + ${CMD} +} + +start_vara_hf() { + + update_config vara-hf + + CMD="pat http" + et-log "Starting Pat with: ${CMD}" + + ${CMD} +} + update_config () { [ -z "$ET_USER_CONFIG" ] && ET_USER_CONFIG="${HOME}/.config/emcomm-tools/user.json" @@ -113,6 +135,12 @@ update_config () { native-packet) PAT_CONF_FILE_TEMPLATE=/opt/emcomm-tools/conf/template.d/winlink/config.ax25-native.json ;; + vara-fm) + PAT_CONF_FILE_TEMPLATE=/opt/emcomm-tools/conf/template.d/winlink/config.vara-fm.json + ;; + vara-hf) + PAT_CONF_FILE_TEMPLATE=/opt/emcomm-tools/conf/template.d/winlink/config.vara-hf.json + ;; esac et-log "Updating Pat configuration file: ${PAT_CONF_FILE}..." @@ -121,7 +149,6 @@ update_config () { sed -i "s|{{ET_CALLSIGN}}|${CALLSIGN}|g" ${PAT_CONF_FILE} sed -i "s|{{ET_WINLINK_PASSWD}}|${WINLINK_PASSWD}|g" ${PAT_CONF_FILE} sed -i "s|{{ET_GRID}}|${GRID}|g" ${PAT_CONF_FILE} - } case $1 in @@ -134,6 +161,12 @@ case $1 in start-native-packet) start_native_packet ;; + start-vara-fm) + start_vara_fm + ;; + start-vara-hf) + start_vara_hf + ;; *) echo "Invalid command." usage diff --git a/overlay/opt/emcomm-tools/conf/template.d/winlink/config.vara-fm.json b/overlay/opt/emcomm-tools/conf/template.d/winlink/config.vara-fm.json new file mode 100644 index 0000000..0f9930a --- /dev/null +++ b/overlay/opt/emcomm-tools/conf/template.d/winlink/config.vara-fm.json @@ -0,0 +1,83 @@ +{ + "mycall": "{{ET_CALLSIGN}}", + "secure_login_password": "{{ET_WINLINK_PASSWD}}", + "auxiliary_addresses": [], + "locator": "{{ET_GRID}}", + "service_codes": [ + "PUBLIC" + ], + "http_addr": "localhost:8080", + "motd": [ + "Open source Winlink client - getpat.io" + ], + "connect_aliases": { + "telnet": "telnet://{mycall}:CMSTelnet@cms.winlink.org:8772/wl2k" + }, + "listen": [], + "hamlib_rigs": { + "et-rig": { + "address": "localhost:4532", + "network": "tcp" + } + }, + "ax25": { + "engine": "agwpe", + "beacon": { + "every": 3600, + "message": "Winlink P2P", + "destination": "IDENT" + }, + "agwpe": {"addr": "localhost:8000", "radio_port": 0} + }, + "serial-tnc": { + "path": "/dev/ttyUSB0", + "serial_baud": 9600, + "hbaud": 1200, + "type": "Kenwood" + }, + "ardop": { + "addr": "localhost:8515", + "arq_bandwidth": { + "Forced": false, + "Max": 500 + }, + "rig": "et-rig", + "ptt_ctrl": true, + "beacon_interval": 0, + "cwid_enabled": true + }, + "pactor": { + "path": "/dev/ttyUSB0", + "baudrate": 57600, + "rig": "", + "custom_init_script": "" + }, + "telnet": { + "listen_addr": ":8774", + "password": "" + }, + "varahf": { + "host": "localhost", + "cmdPort": 8300, + "dataPort": 8301, + "bandwidth": 2300, + "rig": "et-rig", + "ptt_ctrl": true + }, + "varafm": { + "host": "localhost", + "cmdPort": 8300, + "dataPort": 8301, + "bandwidth": 0, + "rig": "et-rig", + "ptt_ctrl": true + }, + "gpsd": { + "enable_http": false, + "allow_forms": false, + "use_server_time": false, + "addr": "localhost:2947" + }, + "schedule": {}, + "version_reporting_disabled": false +} diff --git a/overlay/opt/emcomm-tools/conf/template.d/winlink/config.vara-hf.json b/overlay/opt/emcomm-tools/conf/template.d/winlink/config.vara-hf.json new file mode 100644 index 0000000..0f9930a --- /dev/null +++ b/overlay/opt/emcomm-tools/conf/template.d/winlink/config.vara-hf.json @@ -0,0 +1,83 @@ +{ + "mycall": "{{ET_CALLSIGN}}", + "secure_login_password": "{{ET_WINLINK_PASSWD}}", + "auxiliary_addresses": [], + "locator": "{{ET_GRID}}", + "service_codes": [ + "PUBLIC" + ], + "http_addr": "localhost:8080", + "motd": [ + "Open source Winlink client - getpat.io" + ], + "connect_aliases": { + "telnet": "telnet://{mycall}:CMSTelnet@cms.winlink.org:8772/wl2k" + }, + "listen": [], + "hamlib_rigs": { + "et-rig": { + "address": "localhost:4532", + "network": "tcp" + } + }, + "ax25": { + "engine": "agwpe", + "beacon": { + "every": 3600, + "message": "Winlink P2P", + "destination": "IDENT" + }, + "agwpe": {"addr": "localhost:8000", "radio_port": 0} + }, + "serial-tnc": { + "path": "/dev/ttyUSB0", + "serial_baud": 9600, + "hbaud": 1200, + "type": "Kenwood" + }, + "ardop": { + "addr": "localhost:8515", + "arq_bandwidth": { + "Forced": false, + "Max": 500 + }, + "rig": "et-rig", + "ptt_ctrl": true, + "beacon_interval": 0, + "cwid_enabled": true + }, + "pactor": { + "path": "/dev/ttyUSB0", + "baudrate": 57600, + "rig": "", + "custom_init_script": "" + }, + "telnet": { + "listen_addr": ":8774", + "password": "" + }, + "varahf": { + "host": "localhost", + "cmdPort": 8300, + "dataPort": 8301, + "bandwidth": 2300, + "rig": "et-rig", + "ptt_ctrl": true + }, + "varafm": { + "host": "localhost", + "cmdPort": 8300, + "dataPort": 8301, + "bandwidth": 0, + "rig": "et-rig", + "ptt_ctrl": true + }, + "gpsd": { + "enable_http": false, + "allow_forms": false, + "use_server_time": false, + "addr": "localhost:2947" + }, + "schedule": {}, + "version_reporting_disabled": false +}