From 6e86e02b5d5af3c6ec9b1df51b101514449cf4ca Mon Sep 17 00:00:00 2001 From: William McKeehan Date: Thu, 20 Mar 2025 13:57:17 -0400 Subject: [PATCH] Updating et-th-d74 for the new model --- overlay/opt/emcomm-tools/bin/et-th-d74 | 254 ++++++++++++++++--------- 1 file changed, 160 insertions(+), 94 deletions(-) diff --git a/overlay/opt/emcomm-tools/bin/et-th-d74 b/overlay/opt/emcomm-tools/bin/et-th-d74 index e9b5084..034db0c 100755 --- a/overlay/opt/emcomm-tools/bin/et-th-d74 +++ b/overlay/opt/emcomm-tools/bin/et-th-d74 @@ -1,59 +1,60 @@ #!/bin/bash # -# Author : William McKeehan -# Date : 4 January 2025 -# Based On : et-uv-pro -# Purpose : Utility for accessing the Bluetooth TNC on the -# Kenwood TH-D74. +# Author : Gaston Gonzalez +# Date : 1 January 2025 +# Updated : 20 March 2025 +# Purpose : Utility for accessing the Bluetooth TNC on the Kenwood TH-D74. +source /opt/emcomm-tools/bin/et-common + +CLEAN_UP=1 + +cleanup() { + # Note: We need to reconnect to the Bluetooth device on every mode change. + # As such, we need kill all the rfcomm and kiss process on exit. + if [[ ${CLEAN_UP} -eq 1 ]]; then + sudo /opt/emcomm-tools/bin/et-kill-bt + fi +} + +# Kill all Bluetooth TNC services on exit +trap cleanup EXIT ACTIVE_RADIO="${ET_HOME}/conf/radios.d/kenwood-thd74.bt.json" DEVICE_NAME=$(cat ${ACTIVE_RADIO} | jq -e -r .bluetooth.deviceName) BLUETOOTH_CHANNEL=$(cat ${ACTIVE_RADIO} | jq -e -r .bluetooth.channel) BT_DEVICE="/dev/rfcomm0" -AX25_PORT="pkt1200" +AX25_PORT="wl2k" AX25_CONF_FILE="/etc/ax25/axports" -ESC="\x1B" -RED="${ESC}[1;31m" -BLUE="${ESC}[1;34m" -GREEN="${ESC}[1;32m" -WHITE="${ESC}[97m" -YELLOW="${ESC}[1;33m" -NC="${ESC}[0m" - function usage() { echo "Usage: $(basename $0) " - echo " connect - Connect to radio via Bluetooth" - echo " pair - Pair radio (one-time operation)" - echo " unpair - Unpair radio" + echo " c, connect - Connect to radio via Bluetooth" + echo " p, pair - Pair radio (one-time operation)" + echo " u, unpair - Unpair radio" + + CLEAN_UP=0 } -if [ $# -ne 1 ]; then +if [[ $# -ne 1 ]]; then usage exit 1 fi -error_message() { - echo -e "${RED}" - et-log $* - echo -e "${NC}" -} +if [[ -e ${BT_DEVICE} ]]; then + echo -e "${YELLOW}Your ${BLUE}${DEVICE_NAME}${YELLOW} may have a connection that needs to be cleaned up." + echo -e "Press ${WHITE}[ENTER]${YELLOW} to clean-up.${NC}" + read -p "" + + cleanup +fi -info_message() { - echo -e "${BLUE}" - et-log $* - echo -e "${NC}" -} - -success_message() { - echo -e "${GREEN}" - et-log $* - echo -e "${NC}" +stop_all_services() { + et-kill-all } exit_if_no_active_radio () { if [ ! -e ${ACTIVE_RADIO} ]; then - error_message "${ACTIVE_RADIO} file not found" + echo "${ACTIVE_RADIO} file not found" exit 1 fi } @@ -61,7 +62,7 @@ exit_if_no_active_radio () { get_mac_or_exit () { MAC=$(cat ${ACTIVE_RADIO} | jq -e -r .bluetooth.mac) if [ $? -ne 0 ]; then - error_message "No MAC address found in ${ACTIVE_RADIO}." + echo "No MAC address found in ${ACTIVE_RADIO}." exit 1 fi } @@ -73,64 +74,100 @@ update_ax25_conf() { CALLSIGN=$(cat ${ET_USER_CONFIG} | jq -r .callsign) if [ "${CALLSIGN}" = "N0CALL" ]; then - error_message "No callsign set. Run et-user first." + et-log "No callsign set. Run et-user first." exit 1 fi GREP_OUT=$(grep ${AX25_PORT} ${AX25_CONF_FILE}) if [ $? -eq 0 ]; then - # Delete all existing pkt1200 entries. Note: we can't use sed here + # Delete all existing AX.25 port entries. Note: we can't use sed here # since we do not have permission to create a temporary file with # inline replacement. ed modifies the file directly. - printf "g/^pkt1200/d\nw\nq\n" | ed ${AX25_CONF_FILE} > /dev/null 2>&1 + printf "g/^${AX25_PORT}/d\nw\nq\n" | ed ${AX25_CONF_FILE} > /dev/null 2>&1 fi - info_message "Adding AX25 port for ${CALLSIGN}" - echo "pkt1200 ${CALLSIGN} 1200 255 2 1200 Packet" >> ${AX25_CONF_FILE} + echo "${AX25_PORT} ${CALLSIGN} 1200 255 2 1200 Packet" >> ${AX25_CONF_FILE} } -stop_all_services() { - - PS_OUT=$(ps -ef | grep [k]issattach) - if [ $? -eq 0 ]; then - info_message "Killing kissattach process(es)..." - sudo killall kissattach +do_kiss_attach() { + echo -e "${BLUE}Connecting KISS interface using ${BT_DEVICE} and AX.25 port: ${AX25_PORT}${NC}" + KISS_OUT=$(sudo kissattach ${BT_DEVICE} ${AX25_PORT}) + + if [[ $? -ne 0 ]]; then + echo -e "${RED}Failed to attach KISS port.${NC}" + exit 1 fi - - sleep 3 - PS2_OUT=$(ps -ef | grep -v krfcommd | grep [r]fcomm) - if [ $? -eq 0 ]; then - info_message "Killing rfcomm process(es)..." - sudo killall rfcomm + KISS_OUT=$(sudo kissparms -c 1 -p ${AX25_PORT}) +} + +exit_on_service_failure() { + local systemd_unit_name="$1" + systemctl is-active --user --quiet "${systemd_unit_name}" + if [ $? -ne 0 ]; then + et-log "Can't start mode. ${systemd_unit_name} failed to start." + exit 1 fi } +TIMEOUT=15 # Total time to wait in seconds +INTERVAL=2 # Interval between checks in seconds + +start_and_wait_for_service() { + local systemd_unit_name="$1" + local elapsed=0 + + et-log "Starting ${systemd_unit_name}..." + systemctl --user start ${systemd_unit_name} + + et-log "Waiting for ${systemd_unit_name} to become active..." + + while ! systemctl is-active --user --quiet "${systemd_unit_name}"; do + 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 ${systemd_unit_name} to become active..." + done + + # Some applications even when started still need a bit of extra time to be available. + # Add a short think time of 2 seconds. The ARDOP modem requies extra time. + sleep 2 + + # Do one more check to ensure that we are running, otherwise exit. + exit_on_service_failure ${systemd_unit_name} +} + + exit_if_no_active_radio case $1 in - pair) + p|pair) MAC=$(cat ${ACTIVE_RADIO} | jq -e -r .bluetooth.mac) if [ $? -eq 0 ]; then PAIR_STATUS=$(bluetoothctl info "${MAC}" | grep "Paired:" | awk '{print $2}') if [ "${PAIR_STATUS}" == "yes" ]; then - error_message "Device with MAC ${MAC} is already paired." + echo "Device with MAC ${MAC} is already paired." exit 1 fi fi echo -e "${YELLOW}" - echo -e "1. Turn on the Kenwood TH-D74" - echo -e "2. Goto Menu > Configuration > Bluetooth > Pairing Mode" - read -p "3. Press [ENTER] when done." + echo -e "1. Turn off your ${DEVICE_NAME}" + echo -e "2. Turn on your ${DEVICE_NAME}" + echo -e "3. Goto Menu > Configuration > Bluetooth > Pairing Mode" + echo -e "4. Press ${WHITE}[ENTER]${YELLOW} when done.${NC}" + read -p "" - info_message "Searching for ${DEVICE_NAME}..." + echo "Searching for ${DEVICE_NAME}..." HCI_OUT=$(hcitool scan | grep "${DEVICE_NAME}") if [ $? -ne 0 ]; then - error_message "Can't find ${DEVICE_NAME}. Make sure that the radio is on and in pairing mode." + echo "Can't find ${DEVICE_NAME}. Make sure that the radio is on and in pairing mode." exit 1 fi @@ -173,37 +210,39 @@ EOF sleep 1 && chmod 755 ${PAIR_SCRIPT} && expect ${PAIR_SCRIPT} ;; - unpair) + u|unpair) MAC=$(cat ${ACTIVE_RADIO} | jq -e -r .bluetooth.mac) if [ $? -ne 0 ]; then - error_message "No MAC found in radio configuration file." + echo "No MAC found in radio configuration file." exit 1 fi PAIR_STATUS=$(bluetoothctl info "${MAC}") if [ $? -ne 0 ]; then - error_message "No device with ${MAC} found. Can't unpair." + echo "No device with ${MAC} found. Can't unpair." exit 1 fi - info_message "Unpairing ${DEVICE_NAME}..." + echo "Unpairing ${DEVICE_NAME}..." bluetoothctl untrust ${MAC} bluetoothctl remove ${MAC} echo -e "${YELLOW}" - echo -e "You may also want to remove this device from your Kenwood TH-D74" + echo -e "You may also want to remove this device from your ${DEVICE_NAME}" echo -e "under Menu > Configuration > Bluetooth > Connect >