Updating et-th-d74 for the new model

This commit is contained in:
William McKeehan
2025-03-20 13:57:17 -04:00
parent 24a9a1e7e2
commit 6e86e02b5d
+152 -86
View File
@@ -1,59 +1,60 @@
#!/bin/bash #!/bin/bash
# #
# Author : William McKeehan # Author : Gaston Gonzalez
# Date : 4 January 2025 # Date : 1 January 2025
# Based On : et-uv-pro # Updated : 20 March 2025
# Purpose : Utility for accessing the Bluetooth TNC on the # Purpose : Utility for accessing the Bluetooth TNC on the Kenwood TH-D74.
# 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" ACTIVE_RADIO="${ET_HOME}/conf/radios.d/kenwood-thd74.bt.json"
DEVICE_NAME=$(cat ${ACTIVE_RADIO} | jq -e -r .bluetooth.deviceName) DEVICE_NAME=$(cat ${ACTIVE_RADIO} | jq -e -r .bluetooth.deviceName)
BLUETOOTH_CHANNEL=$(cat ${ACTIVE_RADIO} | jq -e -r .bluetooth.channel) BLUETOOTH_CHANNEL=$(cat ${ACTIVE_RADIO} | jq -e -r .bluetooth.channel)
BT_DEVICE="/dev/rfcomm0" BT_DEVICE="/dev/rfcomm0"
AX25_PORT="pkt1200" AX25_PORT="wl2k"
AX25_CONF_FILE="/etc/ax25/axports" 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() { function usage() {
echo "Usage: $(basename $0) <command>" echo "Usage: $(basename $0) <command>"
echo " connect - Connect to radio via Bluetooth" echo " c, connect - Connect to radio via Bluetooth"
echo " pair - Pair radio (one-time operation)" echo " p, pair - Pair radio (one-time operation)"
echo " unpair - Unpair radio" echo " u, unpair - Unpair radio"
CLEAN_UP=0
} }
if [ $# -ne 1 ]; then if [[ $# -ne 1 ]]; then
usage usage
exit 1 exit 1
fi fi
error_message() { if [[ -e ${BT_DEVICE} ]]; then
echo -e "${RED}" echo -e "${YELLOW}Your ${BLUE}${DEVICE_NAME}${YELLOW} may have a connection that needs to be cleaned up."
et-log $* echo -e "Press ${WHITE}[ENTER]${YELLOW} to clean-up.${NC}"
echo -e "${NC}" read -p ""
}
info_message() { cleanup
echo -e "${BLUE}" fi
et-log $*
echo -e "${NC}"
}
success_message() { stop_all_services() {
echo -e "${GREEN}" et-kill-all
et-log $*
echo -e "${NC}"
} }
exit_if_no_active_radio () { exit_if_no_active_radio () {
if [ ! -e ${ACTIVE_RADIO} ]; then if [ ! -e ${ACTIVE_RADIO} ]; then
error_message "${ACTIVE_RADIO} file not found" echo "${ACTIVE_RADIO} file not found"
exit 1 exit 1
fi fi
} }
@@ -61,7 +62,7 @@ exit_if_no_active_radio () {
get_mac_or_exit () { get_mac_or_exit () {
MAC=$(cat ${ACTIVE_RADIO} | jq -e -r .bluetooth.mac) MAC=$(cat ${ACTIVE_RADIO} | jq -e -r .bluetooth.mac)
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
error_message "No MAC address found in ${ACTIVE_RADIO}." echo "No MAC address found in ${ACTIVE_RADIO}."
exit 1 exit 1
fi fi
} }
@@ -73,64 +74,100 @@ update_ax25_conf() {
CALLSIGN=$(cat ${ET_USER_CONFIG} | jq -r .callsign) CALLSIGN=$(cat ${ET_USER_CONFIG} | jq -r .callsign)
if [ "${CALLSIGN}" = "N0CALL" ]; then if [ "${CALLSIGN}" = "N0CALL" ]; then
error_message "No callsign set. Run et-user first." et-log "No callsign set. Run et-user first."
exit 1 exit 1
fi fi
GREP_OUT=$(grep ${AX25_PORT} ${AX25_CONF_FILE}) GREP_OUT=$(grep ${AX25_PORT} ${AX25_CONF_FILE})
if [ $? -eq 0 ]; then 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 # since we do not have permission to create a temporary file with
# inline replacement. ed modifies the file directly. # 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 fi
info_message "Adding AX25 port for ${CALLSIGN}" echo "${AX25_PORT} ${CALLSIGN} 1200 255 2 1200 Packet" >> ${AX25_CONF_FILE}
echo "pkt1200 ${CALLSIGN} 1200 255 2 1200 Packet" >> ${AX25_CONF_FILE}
} }
stop_all_services() { 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})
PS_OUT=$(ps -ef | grep [k]issattach) if [[ $? -ne 0 ]]; then
if [ $? -eq 0 ]; then echo -e "${RED}Failed to attach KISS port.${NC}"
info_message "Killing kissattach process(es)..." exit 1
sudo killall kissattach
fi fi
sleep 3 KISS_OUT=$(sudo kissparms -c 1 -p ${AX25_PORT})
}
PS2_OUT=$(ps -ef | grep -v krfcommd | grep [r]fcomm) exit_on_service_failure() {
if [ $? -eq 0 ]; then local systemd_unit_name="$1"
info_message "Killing rfcomm process(es)..." systemctl is-active --user --quiet "${systemd_unit_name}"
sudo killall rfcomm if [ $? -ne 0 ]; then
et-log "Can't start mode. ${systemd_unit_name} failed to start."
exit 1
fi 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 exit_if_no_active_radio
case $1 in case $1 in
pair) p|pair)
MAC=$(cat ${ACTIVE_RADIO} | jq -e -r .bluetooth.mac) MAC=$(cat ${ACTIVE_RADIO} | jq -e -r .bluetooth.mac)
if [ $? -eq 0 ]; then if [ $? -eq 0 ]; then
PAIR_STATUS=$(bluetoothctl info "${MAC}" | grep "Paired:" | awk '{print $2}') PAIR_STATUS=$(bluetoothctl info "${MAC}" | grep "Paired:" | awk '{print $2}')
if [ "${PAIR_STATUS}" == "yes" ]; then if [ "${PAIR_STATUS}" == "yes" ]; then
error_message "Device with MAC ${MAC} is already paired." echo "Device with MAC ${MAC} is already paired."
exit 1 exit 1
fi fi
fi fi
echo -e "${YELLOW}" echo -e "${YELLOW}"
echo -e "1. Turn on the Kenwood TH-D74" echo -e "1. Turn off your ${DEVICE_NAME}"
echo -e "2. Goto Menu > Configuration > Bluetooth > Pairing Mode" echo -e "2. Turn on your ${DEVICE_NAME}"
read -p "3. Press [ENTER] when done." 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}") HCI_OUT=$(hcitool scan | grep "${DEVICE_NAME}")
if [ $? -ne 0 ]; then 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 exit 1
fi fi
@@ -173,37 +210,39 @@ EOF
sleep 1 && chmod 755 ${PAIR_SCRIPT} && expect ${PAIR_SCRIPT} sleep 1 && chmod 755 ${PAIR_SCRIPT} && expect ${PAIR_SCRIPT}
;; ;;
unpair) u|unpair)
MAC=$(cat ${ACTIVE_RADIO} | jq -e -r .bluetooth.mac) MAC=$(cat ${ACTIVE_RADIO} | jq -e -r .bluetooth.mac)
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
error_message "No MAC found in radio configuration file." echo "No MAC found in radio configuration file."
exit 1 exit 1
fi fi
PAIR_STATUS=$(bluetoothctl info "${MAC}") PAIR_STATUS=$(bluetoothctl info "${MAC}")
if [ $? -ne 0 ]; then 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 exit 1
fi fi
info_message "Unpairing ${DEVICE_NAME}..." echo "Unpairing ${DEVICE_NAME}..."
bluetoothctl untrust ${MAC} bluetoothctl untrust ${MAC}
bluetoothctl remove ${MAC} bluetoothctl remove ${MAC}
echo -e "${YELLOW}" 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 > <select device> > Menu > Clear" echo -e "under Menu > Configuration > Bluetooth > Connect > <select device> > Menu > Clear"
echo -e "${NC}" echo -e "${NC}"
;; ;;
connect) c|connect)
get_mac_or_exit get_mac_or_exit
echo -e "${YELLOW}" echo -e "${YELLOW}"
echo -e "1. Turn on the Kenwood TH-D74" echo -e "1. Turn off your ${DEVICE_NAME}"
echo -e "2. Menu > Configuration > Bluetooth > On" echo -e "2. Turn on your ${DEVICE_NAME}"
echo -e "3. Menu > Configuration > Interface > KISS > Bluetooth" echo -e "3. Menu > Configuration > Bluetooth > On"
read -p "4. Press [ENTER] when done." echo -e "4. Menu > Configuration > Interface > KISS > Bluetooth"
echo -e "5. Press ${WHITE}[ENTER]${YELLOW} when done.${NC}"
read -p ""
is_paired=$(bluetoothctl info ${MAC} | grep "Paired" | awk '{print $2}') is_paired=$(bluetoothctl info ${MAC} | grep "Paired" | awk '{print $2}')
if [ "${is_paired}" != "yes" ]; then if [ "${is_paired}" != "yes" ]; then
@@ -213,43 +252,70 @@ EOF
exit 1 exit 1
fi fi
echo -e "${GREEN}Found ${DEVICE_NAME} with MAC address: ${MAC}" echo -e "Found ${DEVICE_NAME} with MAC address: ${MAC}"
stop_all_services
update_ax25_conf update_ax25_conf
echo -e "${BLUE}Connecting to radio..."
sudo rfcomm connect ${BT_DEVICE} ${MAC} ${BLUETOOTH_CHANNEL} 1>/dev/null 2>&1 & sudo rfcomm connect ${BT_DEVICE} ${MAC} ${BLUETOOTH_CHANNEL} 1>/dev/null 2>&1 &
sleep 10 && reset sleep 10 && reset
if [ -e "${BT_DEVICE}" ]; then if [[ ! -e "${BT_DEVICE}" ]]; then
echo -e "${GREEN}${DEVICE_NAME} connected via Bluetooth serial${NC}" echo -e "${RED}Failed to connect via Bluetooth${NC}"
else echo -e "${YELLOW}"
echo -e "${RED}${DEVICE_NAME} failed to connect via Bluetooth serial${NC}" echo -e "1. Try turning off and back on your radio."
echo -e "2. Check your radio and ensure that ${BLUE}$(hostname)${YELLOW} is listed under:"
echo -e " Menu > General Settings> Connection > Paired Devices: $(hostname)."
echo -e ""
echo -e " If it is not listed, re-run: ${WHITE}$(basename $0) pair${NC}\n"
exit 1 exit 1
fi fi
echo -e "${BLUE}Connecting KISS interface using ${BT_DEVICE} and AX.25 port: ${AX25_PORT}${NC}" stop_all_services
KISS_OUT=$(sudo kissattach ${BT_DEVICE} ${AX25_PORT})
if [ $? -eq 0 ]; then echo -e "\nSelect a packet application to start:"
echo -e "${GREEN}Packet port ready" options=("axcall" "QtTermTCP" "Winlink" "YAAC" "Exit")
else
echo -e "${RED}Failed to setup radio for packet.${NC}"
exit 1
fi
KISS_OUT=$(sudo kissparms -c 1 -p ${AX25_PORT})
select opt in "${options[@]}"
do
case $opt in
"axcall")
do_kiss_attach
echo -e "${YELLOW}" echo -e "${YELLOW}"
echo -e "SAMPLE COMMANDS DESCRIPTION " echo -e "SAMPLE COMMANDS DESCRIPTION "
echo -e "------------------------------- --------------------------------" echo -e "----------------------------- --------------------------------"
echo -e "axcall pkt1200 <STATION> Connect directly to a node " echo -e "axcall wl2k <STATION> Connect directly to a node "
echo -e "axcall pkt1200 <STATION> <DIGI> Connect to node via a digipeater" echo -e "axcall wl2k <STATION> <DIGI> Connect to node via a digipeater"
echo -e "sudo axlisten -a -tttt -c Monitor inbound and outbound traffic" echo -e "sudo axlisten -a -tttt -c Monitor inbound and outbound traffic"
echo -e "${NC}" echo -e "${NC}"
# We can't have the rfcomm and kiss processes killed.
CLEAN_UP=0
break
;;
"QtTermTCP")
et-qttermtcp start 1>/dev/null 2>&1
break
;;
"Winlink")
do_kiss_attach
start_and_wait_for_service et-service-winlink-native-packet
min http://localhost:8080 1>/dev/null 2>&1
break
;;
"YAAC")
et-yaac start
break
;;
"Exit")
break
;;
*)
echo "Invalid option, please select a number from the list."
;;
esac
done
;; ;;
*) *)
et-log "Invalid command." et-log "Invalid command."