mirror of
https://github.com/thetechprepper/emcomm-tools-os-community.git
synced 2026-09-17 15:41:44 -04:00
Merge branch 'release/r5' into feature/rtl-sdr-v4
This commit is contained in:
@@ -17,7 +17,7 @@ Miles=true
|
||||
MyCall=N0CALL
|
||||
MyGrid=DM33
|
||||
MyGroups=@@TTP,@@TTPNET
|
||||
MyInfo=ETC R3
|
||||
MyInfo=ETC R5
|
||||
Polling=1
|
||||
PSKReporter=false
|
||||
PTTMethod=@Variant(\0\0\0\x7f\0\0\0\x1eTransceiverFactory::PTTMethod\0\0\0\0\xfPTT_method_CAT\0)
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,23 @@
|
||||
# Author : Gaston Gonzalez
|
||||
# Date : 18 September 2025
|
||||
# Purpose : udev rules for the FX-4CR by BG2FX
|
||||
#
|
||||
# Preconditions:
|
||||
# 1. FX-4CR connected via USB cable
|
||||
#
|
||||
# Postconditions:
|
||||
# 1. /dev/et-cat created
|
||||
# 2. rigctld is started
|
||||
# 3. /dev/et-audio created
|
||||
|
||||
SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", ENV{ET_DEVICE}=="", \
|
||||
ACTION=="add", \
|
||||
ENV{ET_DEVICE}="FX-4CR", ENV{ET_SUBDEVICE}="CAT", GROUP="dialout", MODE="0660", SYMLINK+="et-cat", \
|
||||
RUN+="/usr/bin/systemctl start rigctld"
|
||||
|
||||
# PROGRAM="/opt/emcomm-tools/sbin/udev-tester.sh digirig-mobile", \
|
||||
SUBSYSTEM=="sound", ATTRS{idVendor}=="4c4a", ATTRS{idProduct}=="4155", \
|
||||
ACTION=="add", \
|
||||
ENV{ET_DEVICE}="FX-4CR", \
|
||||
ATTR{id}="ET_AUDIO", \
|
||||
ENV{ET_SUBDEVICE}="AUDIO", GROUP="audio", MODE="0660", SYMLINK+="et-audio"
|
||||
@@ -2,14 +2,14 @@
|
||||
#
|
||||
# Author : Gaston Gonzalez
|
||||
# Date : 31 October 2024
|
||||
# Updated : 31 May 2024
|
||||
# Updated : 26 September 2025
|
||||
# Purpose : Configures ET audio device with sane defaults
|
||||
#
|
||||
# Preconditions
|
||||
# 1. Supported audio interface is connected and properly detected
|
||||
#
|
||||
# Postconditions
|
||||
# 1. ASLA settings set on ET audio device
|
||||
# 1. ALSA settings set on ET audio device
|
||||
|
||||
usage() {
|
||||
echo "usage: $(basename $0) <command>"
|
||||
@@ -50,6 +50,8 @@ update-config () {
|
||||
|
||||
case ${ET_DEVICE_NAME} in
|
||||
"DIGIRIG_MOBILE")
|
||||
# TODO: 92% is needed for the TX-500MP. Revisit approach for setting speaker
|
||||
# out differently across radios definitions.
|
||||
# Unmute Speaker a set volume. Adjust if remote station can't decode you. Your TX controls.
|
||||
amixer -q -c ${AUDIO_CARD} sset Speaker Playback Switch 42% unmute
|
||||
# Unmute Mic
|
||||
@@ -97,6 +99,19 @@ update-config () {
|
||||
|
||||
et-log "Applied amixer settings for ${ET_DEVICE_NAME}"
|
||||
;;
|
||||
"FX-4CR")
|
||||
# Unmute the PCM and set the volume to 21% to get the full output power. This value is
|
||||
# dependent on the settings defined for the FX-4CR in the et-radio notes.
|
||||
amixer -q -c ${AUDIO_CARD} sset 'PCM' 31% unmute
|
||||
|
||||
# Set "L/R Capture" to 55%. Adjust if you can't decode received audio.
|
||||
amixer -q -c ${AUDIO_CARD} sset 'Mic' 67% unmute
|
||||
|
||||
# Disable Auto Gain Control
|
||||
amixer -q -c ${AUDIO_CARD} sset 'Auto Gain Control' mute
|
||||
|
||||
et-log "Applied amixer settings for ${ET_DEVICE_NAME}"
|
||||
;;
|
||||
*)
|
||||
et-log "No ALSA configuration specified for this ET_DEVICE."
|
||||
;;
|
||||
|
||||
Executable
+201
@@ -0,0 +1,201 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Author : Gaston Gonzalez
|
||||
# Date : 2 October 2025
|
||||
# Purpose : Wrapper script for starting fldigi with PnP support
|
||||
#
|
||||
# Preconditions
|
||||
# 1. Supported radio and audio interface are connected and properly detected
|
||||
#
|
||||
# Postconditions
|
||||
# 1. Stop all running EmComm Tools modes
|
||||
# 2. fldigi core settings updated (e.g., CAT, audio, user config and ETC defaults)
|
||||
# 3. fldigi started
|
||||
|
||||
usage() {
|
||||
echo "usage: $(basename $0) <command>"
|
||||
echo " start - Update config and start fldigi"
|
||||
echo " update-config - Update config"
|
||||
}
|
||||
|
||||
if [[ $# -ne 1 ]]; then
|
||||
usage
|
||||
exit 1
|
||||
fi
|
||||
|
||||
notify_user() {
|
||||
notify-send \
|
||||
-t 5000 \
|
||||
--app-name="EmComm Tools" \
|
||||
"$1"
|
||||
}
|
||||
|
||||
start() {
|
||||
/opt/emcomm-tools/bin/et-kill-all && update-config && /usr/local/bin/fldigi &
|
||||
}
|
||||
|
||||
update-config () {
|
||||
|
||||
# 1. Check if the audio device symlink was created by the udev rules
|
||||
if [[ -e /dev/et-audio ]]; then
|
||||
|
||||
# 2. Check that this device was properly tagged with the ET_AUDIO env variable
|
||||
APLAY_OUT=$(arecord -l | grep ET_AUDIO)
|
||||
if [[ $? -eq 0 ]]; then
|
||||
|
||||
## Configure ALSA settings for sound card
|
||||
/opt/emcomm-tools/bin/et-audio update-config
|
||||
|
||||
else
|
||||
et-log "No ET_AUDIO device detected."
|
||||
notify_user "Can't start fldigi. No ET_AUDIO device detected."
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
et-log "No ET_AUDIO device plugged in."
|
||||
notify_user "Can't start fldigi. No supported audio device plugged in."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
PORT_AUDIO_CONF=/tmp/conf.tmp
|
||||
GEO_CONF=/tmp/geo.tmp
|
||||
FLDIGI_CONF_DIR="${HOME}/.fldigi"
|
||||
FLDIGI_CONF_FILE="${FLDIGI_CONF_DIR}/fldigi_def.xml"
|
||||
|
||||
if [[ ! -e ${FLDIGI_CONF_DIR} ]]; then
|
||||
et-log "${FLDIGI_CONF_DIR} does not exist. Creating it from template."
|
||||
mkdir -v ${FLDIGI_CONF_DIR}
|
||||
cp -v /etc/skel/.fldigi/fldigi_def.xml ${FLDIGI_CONF_DIR}
|
||||
fi
|
||||
|
||||
[ -z "$ET_USER_CONFIG" ] && ET_USER_CONFIG="${HOME}/.config/emcomm-tools/user.json"
|
||||
|
||||
# clean up temporary config that may exist
|
||||
[[ -e ${PORT_AUDIO_CONF} ]] && rm ${PORT_AUDIO_CONF}
|
||||
|
||||
et-portaudio 2>/dev/null > ${PORT_AUDIO_CONF}
|
||||
|
||||
if [[ $? -ne 0 ]]; then
|
||||
et-log "No supported ET_AUDIO device found"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
DEVICE=$(jq -r -e '.device' ${PORT_AUDIO_CONF})
|
||||
if [[ $? -ne 0 ]]; then
|
||||
et-log "Error getting PulseAudio device name for ET_AUDIO device"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
INDEX=$(jq -r -e '.index' ${PORT_AUDIO_CONF})
|
||||
if [[ $? -ne 0 ]]; then
|
||||
et-log "Error getting PulseAudio device index for ET_AUDIO device"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
##############################################
|
||||
# Map ALSA ET_AUDIO device to PortAudio device
|
||||
##############################################
|
||||
et-log "Updating PortAudio device configuration..."
|
||||
|
||||
sed -i "s|^<AUDIOIO>.*|<AUDIOIO>1</AUDIOIO>|" ${FLDIGI_CONF_FILE}
|
||||
|
||||
sed -i "s|^<PORTINDEVICE>.*|<PORTINDEVICE>${DEVICE}</PORTINDEVICE>|" ${FLDIGI_CONF_FILE}
|
||||
sed -i "s|^<PORTININDEX>.*|<PORTININDEX>${INDEX}</PORTININDEX>|" ${FLDIGI_CONF_FILE}
|
||||
|
||||
sed -i "s|^<PORTOUTDEVICE>.*|<PORTOUTDEVICE>${DEVICE}</PORTOUTDEVICE>|" ${FLDIGI_CONF_FILE}
|
||||
sed -i "s|^<PORTOUTINDEX>.*|<PORTOUTINDEX>${INDEX}</PORTOUTINDEX>|" ${FLDIGI_CONF_FILE}
|
||||
|
||||
et-log "Using device '${DEVICE}' and device index '${INDEX}' for PortAudio configuration"
|
||||
|
||||
|
||||
#################
|
||||
# Update callsign
|
||||
#################
|
||||
et-log "Updating callsign configuration..."
|
||||
CALLSIGN=$(jq -r -e '.callsign' ${ET_USER_CONFIG})
|
||||
|
||||
if [[ "${CALLSIGN}" = "N0CALL" ]]; then
|
||||
et-log "Exiting early. No callsign set. Run: et-user."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
et-log "Using callsign '${CALLSIGN}'"
|
||||
sed -i "s|^<MYCALL>.*|<MYCALL>${CALLSIGN}</MYCALL>|" ${FLDIGI_CONF_FILE}
|
||||
|
||||
|
||||
###############################################
|
||||
# Update grid based on ETC geolocation services
|
||||
###############################################
|
||||
et-log "Updating your grid square..."
|
||||
curl -f -s "http://localhost:1981/api/geo/position" > ${GEO_CONF}
|
||||
|
||||
if [[ $? -eq 0 ]]; then
|
||||
GRID=$(jq -r -e '.position.gridSquare' ${GEO_CONF})
|
||||
if [[ $? -eq 0 ]]; then
|
||||
et-log "Using grid square '${GRID}' for your location"
|
||||
sed -i "s|^<MYLOC>.*|<MYLOC>${GRID}</MYLOC>|" ${FLDIGI_CONF_FILE}
|
||||
fi
|
||||
fi
|
||||
|
||||
[[ -e ${GEO_CONF} ]] && rm ${GEO_CONF}
|
||||
|
||||
|
||||
#####################################################################
|
||||
# Configure CAT interface using Hamlib's rig control daemon (rigctld)
|
||||
#####################################################################
|
||||
et-log "Updating CAT control configuration..."
|
||||
|
||||
sed -i "s|^<CHKUSEHAMLIBIS>.*|<CHKUSEHAMLIBIS>1</CHKUSEHAMLIBIS>|" ${FLDIGI_CONF_FILE}
|
||||
sed -i "s|^<HAMRIGMODEL>.*|<HAMRIGMODEL>2</HAMRIGMODEL>|" ${FLDIGI_CONF_FILE}
|
||||
sed -i "s|^<HAMLIBCMDPTT>.*|<HAMLIBCMDPTT>1</HAMLIBCMDPTT>|" ${FLDIGI_CONF_FILE}
|
||||
sed -i "s|^<HAMRIGDEVICE>.*|<HAMRIGDEVICE>localhost:4532</HAMRIGDEVICE>|" ${FLDIGI_CONF_FILE}
|
||||
|
||||
|
||||
######################################
|
||||
# Enable Reed Soloman ID for RX and TX
|
||||
######################################
|
||||
et-log "Enabling Reed Soloman ID for RX/TX..."
|
||||
|
||||
sed -i "s|^<RECEIVERSID>.*|<RECEIVERSID>1</RECEIVERSID>|" ${FLDIGI_CONF_FILE}
|
||||
sed -i "s|^<TRANSMITRSID>.*|<TRANSMITRSID>1</TRANSMITRSID>|" ${FLDIGI_CONF_FILE}
|
||||
|
||||
|
||||
###########################
|
||||
# Modem configuration: MT63
|
||||
###########################
|
||||
et-log "Updating MT63 modem configuration..."
|
||||
|
||||
sed -i "s|^<MT63INTEGRATION>.*|<MT63INTEGRATION>1</MT63INTEGRATION>|" ${FLDIGI_CONF_FILE}
|
||||
|
||||
|
||||
########################
|
||||
# Repeater configuration
|
||||
########################
|
||||
et-log "Updating settings for linked repeater systems..."
|
||||
|
||||
# Key up for 2 seconds before transmitting tone. Needed for linked repeater systems.
|
||||
sed -i "s|^<PRETONE>.*|<PRETONE>2</PRETONE>|" ${FLDIGI_CONF_FILE}
|
||||
|
||||
|
||||
#####################
|
||||
# NBEMS configuration
|
||||
#####################
|
||||
et-log "Updating settings for NBEMS..."
|
||||
|
||||
sed -i "s|^<OPEN_NBEMS_FOLDER>.*|<OPEN_NBEMS_FOLDER>1</OPEN_NBEMS_FOLDER>|" ${FLDIGI_CONF_FILE}
|
||||
sed -i "s|^<FLMSG_PATHNAME>.*|<FLMSG_PATHNAME>/usr/local/bin/flmsg</FLMSG_PATHNAME>|" ${FLDIGI_CONF_FILE}
|
||||
}
|
||||
|
||||
case $1 in
|
||||
start)
|
||||
start
|
||||
;;
|
||||
update-config)
|
||||
update-config
|
||||
;;
|
||||
*)
|
||||
echo "Invalid command."
|
||||
usage
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
@@ -2,7 +2,7 @@
|
||||
#
|
||||
# Author : Gaston Gonzalez
|
||||
# Date : 12 November 2024
|
||||
# Updated : 7 February 2025
|
||||
# Updated : 2 October 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.
|
||||
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"id": "bg2fx-fx4cr",
|
||||
"vendor": "BG2FX",
|
||||
"model": "FX-4CR",
|
||||
"rigctrl": {
|
||||
"id": "2031",
|
||||
"baud": "115200",
|
||||
"ptt": "RIG",
|
||||
"conf": "data_bits=8,serial_handshake=None,stop_bits=1,rts_state=OFF",
|
||||
"pttOnly": "false"
|
||||
},
|
||||
"notes": [
|
||||
"Short press [PWR], then rotate AF knob until POW = 5.0",
|
||||
"Toggle [SSB] button until both USB and DIG appear",
|
||||
"Short press [M. V] until VFOA is displayed",
|
||||
"Long press [MENU], rotate AF to BLUETOOTH, rotate TUNE and set to 0",
|
||||
"Set radio volume to 50",
|
||||
"Set mic gain to 50",
|
||||
"Set alsamixer PCM to 21",
|
||||
"Set alsamixer Mic to 55",
|
||||
"Set alsamixer AGC to mm"
|
||||
],
|
||||
"fieldNotes": [
|
||||
"Tested with FX-4CR firmware version: 1.7.3 (2025/09/01)",
|
||||
"You must force the RTS control line to low for audio output to work with the PTT",
|
||||
"This is handled with rts_state=OFF using the --set-conf argument of rigctld"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"id": "lab599-tx500mp",
|
||||
"vendor": "Lab599",
|
||||
"model": "TX-500MP (DigiRig Mobile)",
|
||||
"rigctrl": {
|
||||
"id": "2014",
|
||||
"baud": "9600",
|
||||
"ptt": "RTS",
|
||||
"pttOnly": "false"
|
||||
},
|
||||
"notes": [
|
||||
"1. Set MENU 36 CAT PROTOCOL = TS2000",
|
||||
"2. Set MODE = DIGI",
|
||||
"",
|
||||
"Do not enable VOX on radio"
|
||||
|
||||
],
|
||||
"fieldNotes": [
|
||||
]
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
#!/bin/bash
|
||||
# Author : Gaston Gonzalez
|
||||
# Date : 11 October 2024
|
||||
# Updated : 21 May 2025
|
||||
# Updated : 13 September 2025
|
||||
# Purpose : Perform tests that can be used by the udev subsystem to aid
|
||||
# in rule development. This is intended to by used with the PROGRAM
|
||||
# directive inside of a udev rule.
|
||||
@@ -81,6 +81,11 @@ test_digirig_mobile() {
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [[ "$ID" == "lab599-tx500mp" ]]; then
|
||||
et-log "Old DigiRig Mobile detected for TX-500MP"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
fi
|
||||
|
||||
exit 1
|
||||
|
||||
@@ -2,13 +2,16 @@
|
||||
#
|
||||
# Author : Gaston Gonzalez
|
||||
# Date : 9 October 2024
|
||||
# Updated : 31 May 2025
|
||||
# Updated : 26 September 2025
|
||||
# Purpose : Wrapper startup/shutdown script around systemd/rigctld
|
||||
|
||||
ET_HOME=/opt/emcomm-tools
|
||||
ACTIVE_RADIO="${ET_HOME}/conf/radios.d/active-radio.json"
|
||||
CAT_DEVICE=/dev/et-cat
|
||||
|
||||
# Additional configuration to pass to rigctld
|
||||
SET_CONF=""
|
||||
|
||||
do_full_auto() {
|
||||
et-log "Found ET_DEVICE='${ET_DEVICE}'"
|
||||
|
||||
@@ -95,8 +98,14 @@ start() {
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Handle optional configuration settings
|
||||
CONF=$(jq -e -r '.rigctrl.conf' "${ET_HOME}/conf/radios.d/active-radio.json")
|
||||
if [[ $? -eq 0 ]]; then
|
||||
SET_CONF="--set-conf=${CONF}"
|
||||
fi
|
||||
|
||||
# Generate command
|
||||
CMD="rigctld -m ${ID} -r ${CAT_DEVICE} -s ${BAUD} -P ${PTT} "
|
||||
CMD="rigctld -m ${ID} -r ${CAT_DEVICE} -s ${BAUD} -P ${PTT} ${SET_CONF}"
|
||||
et-log "Starting rigctld with: ${CMD}"
|
||||
$CMD
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@ show-desktop-icons = false
|
||||
picture-uri = 'file:///usr/share/backgrounds/emcomm-tools-wallpaper.png'
|
||||
|
||||
[org.gnome.shell]
|
||||
favorite-apps = ['emcomm-tools.desktop', 'js8call.desktop', 'et-aircraft.desktop', 'org.gnome.Terminal.desktop', 'navit.desktop', 'min.desktop', 'org.gnome.Nautilus.desktop']
|
||||
favorite-apps = ['emcomm-tools.desktop', 'js8call.desktop', 'fldigi.desktop', 'et-aircraft.desktop', 'org.gnome.Terminal.desktop', 'navit.desktop', 'min.desktop', 'org.gnome.Nautilus.desktop']
|
||||
last-selected-power-profile = 'performance'
|
||||
|
||||
[org.gnome.system.location]
|
||||
|
||||
Executable
+31
@@ -0,0 +1,31 @@
|
||||
#!/bin/bash
|
||||
# Author : Gaston Gonzalez
|
||||
# Date : 2 October 2025
|
||||
# Purpose : Builds and installs et-portaudio
|
||||
set -e
|
||||
trap 'last_command=$current_command; current_command=$BASH_COMMAND' DEBUG
|
||||
trap 'et-log "\"${last_command}\" command failed with exit code $?."' ERR
|
||||
|
||||
. ./env.sh
|
||||
|
||||
APP="et-portaudio"
|
||||
VERSION="1.0.0"
|
||||
APP_AND_VERSION="${APP}-${VERSION}"
|
||||
INSTALL_DIR="/opt/${APP_AND_VERSION}"
|
||||
LINK_PATH="/opt/${APP}"
|
||||
|
||||
et-log "Installing ${APP} ${VERSION}"
|
||||
|
||||
CWD_DIR=`pwd`
|
||||
|
||||
cd ../src/et-portaudio
|
||||
|
||||
# Compile
|
||||
make install
|
||||
|
||||
[[ -e ${LINK_PATH} ]] && rm ${LINK_PATH}
|
||||
ln -v -s ${INSTALL_DIR} ${LINK_PATH}
|
||||
|
||||
stow -v -d /opt ${APP} -t /usr/local
|
||||
|
||||
cd ${CWD}
|
||||
Executable
+49
@@ -0,0 +1,49 @@
|
||||
#!/bin/bash
|
||||
# Author : Gaston Gonzalez
|
||||
# Date : 17 September 2025
|
||||
# Updated : 2 October 2025
|
||||
# Purpose : Builds and installs fldigi
|
||||
set -e
|
||||
trap 'last_command=$current_command; current_command=$BASH_COMMAND' DEBUG
|
||||
trap 'et-log "\"${last_command}\" command failed with exit code $?."' ERR
|
||||
|
||||
. ./env.sh
|
||||
|
||||
APP="fldigi"
|
||||
VERSION="4.2.09"
|
||||
APP_AND_VERSION="${APP}-${VERSION}"
|
||||
GIT_TAG="v4.2.09"
|
||||
GIT_URL="https://git.code.sf.net/p/fldigi/fldigi"
|
||||
GIT_WORKSPACE="fldigi"
|
||||
INSTALL_DIR="/opt/${APP_AND_VERSION}"
|
||||
LINK_PATH="/opt/${APP}"
|
||||
|
||||
et-log "Installing ${APP} ${VERSION}"
|
||||
|
||||
CWD_DIR=`pwd`
|
||||
|
||||
cd ${ET_SRC_DIR}
|
||||
[[ ! -e ${GIT_WORKSPACE} ]] && git clone ${GIT_URL} ${GIT_WORKSPACE}
|
||||
|
||||
cd ${GIT_WORKSPACE}
|
||||
git checkout ${GIT_TAG}
|
||||
|
||||
# Generate config script
|
||||
autoreconf -i && ./configure --prefix=${INSTALL_DIR}
|
||||
|
||||
# Compile
|
||||
make
|
||||
|
||||
# Install
|
||||
make install
|
||||
|
||||
[[ -e ${LINK_PATH} ]] && rm ${LINK_PATH}
|
||||
ln -v -s ${INSTALL_DIR} ${LINK_PATH}
|
||||
|
||||
stow -v -d /opt ${APP} -t /usr/local
|
||||
|
||||
cd ${CWD}
|
||||
|
||||
# Use wrapper script as launcher executable
|
||||
sed -i 's|^Exec.*|Exec=/opt/emcomm-tools/bin/et-fldigi start|' /opt/fldigi/share/applications/fldigi.desktop
|
||||
|
||||
+7
-1
@@ -2,7 +2,7 @@
|
||||
#
|
||||
# Author : Gaston Gonzalez
|
||||
# Date : 16 March 2024
|
||||
# Updated : 16 August 2025
|
||||
# Updated : 2 October 2025
|
||||
# Purpose : Main installer for EmComm Tools Community (ETC)
|
||||
|
||||
. ./env.sh
|
||||
@@ -87,3 +87,9 @@ exitIfNotRoot
|
||||
|
||||
# Install prediction tools
|
||||
./install-voacap.sh
|
||||
|
||||
# Install fldigi suite
|
||||
./install-fldigi.sh
|
||||
./install-et-portaudio.sh
|
||||
|
||||
# TODO: add installers for flmsg and flamp
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
et-portaudio
|
||||
*.o
|
||||
@@ -0,0 +1,25 @@
|
||||
CC = gcc
|
||||
CFLAGS = -Wall -O2
|
||||
LDFLAGS = -lportaudio -lasound
|
||||
|
||||
TARGET = et-portaudio
|
||||
SRC = main.c
|
||||
VERSION=1.0.0
|
||||
INSTALL_DIR = /opt/et-portaudio-$(VERSION)/bin
|
||||
|
||||
.PHONY: install
|
||||
|
||||
all: $(TARGET)
|
||||
|
||||
$(TARGET): $(SRC)
|
||||
$(CC) $(CFLAGS) -o $(TARGET) $(SRC) $(LDFLAGS)
|
||||
|
||||
install: $(TARGET)
|
||||
@echo "Installing $(TARGET) to $(INSTALL_DIR)..."
|
||||
@mkdir -p $(INSTALL_DIR)
|
||||
@cp $(TARGET) $(INSTALL_DIR)/
|
||||
@chmod 755 $(INSTALL_DIR)/$(TARGET)
|
||||
@echo "Done."
|
||||
|
||||
clean:
|
||||
rm -f $(TARGET) *.o
|
||||
@@ -0,0 +1,32 @@
|
||||
# et-portaudio
|
||||
|
||||
A utility program intended for script use to convert a supported
|
||||
EmComm Tools ALSA audio device (i.e. `ET_AUDIO`) to a PulseAudio device.
|
||||
|
||||
## Usage
|
||||
|
||||
Returns a JSON object with the PulseAudio device details on success.
|
||||
|
||||
```bash
|
||||
./et-portaudio 2>/dev/null
|
||||
{
|
||||
"device": "USB Audio Device: - (hw:1,0)",
|
||||
"index": 6
|
||||
}
|
||||
```
|
||||
|
||||
If no supported device is found or on error, the utility exits with an
|
||||
exit status of 1.
|
||||
|
||||
|
||||
## Build
|
||||
|
||||
``bash
|
||||
make
|
||||
```
|
||||
|
||||
## Install
|
||||
|
||||
```bash
|
||||
sudo make install
|
||||
```
|
||||
Executable
+147
@@ -0,0 +1,147 @@
|
||||
#!/bin/bash
|
||||
# Author : Gaston Gonzalez
|
||||
# Date : 1 October 2025
|
||||
# Updated : 2 October 2025
|
||||
# Purpose : Temporary script to fast-fail dynamic fldigi config for PnP
|
||||
#
|
||||
# NOTE: THIS IS SCRIPT IS INTENDED FOR DEVELOPMENT OF THE PNP SOLUTION.
|
||||
|
||||
CMD=et-portaudio
|
||||
PORT_AUDIO_CONF=/tmp/conf.tmp
|
||||
GEO_CONF=/tmp/geo.tmp
|
||||
FLDIGI_CONF_DIR="${HOME}/.fldigi"
|
||||
FLDIGI_CONF_FILE="${FLDIGI_CONF_DIR}/fldigi_def.xml"
|
||||
|
||||
[ -z "$ET_USER_CONFIG" ] && ET_USER_CONFIG="${HOME}/.config/emcomm-tools/user.json"
|
||||
|
||||
# clean up temporary config that may exist
|
||||
[[ -e ${PORT_AUDIO_CONF} ]] && rm ${PORT_AUDIO_CONF}
|
||||
|
||||
[[ ! -e ${CMD} ]] && make
|
||||
./${CMD} 2>/dev/null > ${PORT_AUDIO_CONF}
|
||||
|
||||
if [[ $? -ne 0 ]]; then
|
||||
echo "No supported ET_AUDIO device found"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
DEVICE=$(jq -r -e '.device' ${PORT_AUDIO_CONF})
|
||||
if [[ $? -ne 0 ]]; then
|
||||
echo "Error getting PulseAudio device name for ET_AUDIO device"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
INDEX=$(jq -r -e '.index' ${PORT_AUDIO_CONF})
|
||||
if [[ $? -ne 0 ]]; then
|
||||
echo "Error getting PulseAudio device index for ET_AUDIO device"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
################################
|
||||
# Bootstrap fldigi configuration
|
||||
################################
|
||||
et-log "Checking for .fldigi directory"
|
||||
[[ ! -e ${FLDIGI_CONF_DIR} ]] && mkdir -v ${FLDIGI_CONF_DIR}
|
||||
|
||||
et-log "Copying fldigi template..."
|
||||
cp -v ../../overlay/etc/skel/.fldigi/fldigi_def.xml ~/.fldigi/
|
||||
|
||||
|
||||
##############################################
|
||||
# Map ALSA ET_AUDIO device to PortAudio device
|
||||
##############################################
|
||||
et-log "Updating PortAudio device configuration..."
|
||||
|
||||
sed -i "s|^<AUDIOIO>.*|<AUDIOIO>1</AUDIOIO>|" ${FLDIGI_CONF_FILE}
|
||||
|
||||
sed -i "s|^<PORTINDEVICE>.*|<PORTINDEVICE>${DEVICE}</PORTINDEVICE>|" ${FLDIGI_CONF_FILE}
|
||||
sed -i "s|^<PORTININDEX>.*|<PORTININDEX>${INDEX}</PORTININDEX>|" ${FLDIGI_CONF_FILE}
|
||||
|
||||
sed -i "s|^<PORTOUTDEVICE>.*|<PORTOUTDEVICE>${DEVICE}</PORTOUTDEVICE>|" ${FLDIGI_CONF_FILE}
|
||||
sed -i "s|^<PORTOUTINDEX>.*|<PORTOUTINDEX>${INDEX}</PORTOUTINDEX>|" ${FLDIGI_CONF_FILE}
|
||||
|
||||
et-log "Using device '${DEVICE}' and device index '${INDEX}' for PortAudio configuration"
|
||||
|
||||
|
||||
#################
|
||||
# Update callsign
|
||||
#################
|
||||
et-log "Updating callsign configuration..."
|
||||
CALLSIGN=$(jq -r -e '.callsign' ${ET_USER_CONFIG})
|
||||
|
||||
if [[ "${CALLSIGN}" = "N0CALL" ]]; then
|
||||
et-log "Exiting early. No callsign set. Run: et-user."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
et-log "Using callsign '${CALLSIGN}'"
|
||||
sed -i "s|^<MYCALL>.*|<MYCALL>${CALLSIGN}</MYCALL>|" ${FLDIGI_CONF_FILE}
|
||||
|
||||
|
||||
###############################################
|
||||
# Update grid based on ETC geolocation services
|
||||
###############################################
|
||||
et-log "Updating your grid square..."
|
||||
curl -f -s "http://localhost:1981/api/geo/position" > ${GEO_CONF}
|
||||
|
||||
if [[ $? -eq 0 ]]; then
|
||||
GRID=$(jq -r -e '.position.gridSquare' ${GEO_CONF})
|
||||
if [[ $? -eq 0 ]]; then
|
||||
et-log "Using grid square '${GRID}' for your location"
|
||||
sed -i "s|^<MYLOC>.*|<MYLOC>${GRID}</MYLOC>|" ${FLDIGI_CONF_FILE}
|
||||
fi
|
||||
fi
|
||||
|
||||
[[ -e ${GEO_CONF} ]] && rm ${GEO_CONF}
|
||||
|
||||
|
||||
#####################################################################
|
||||
# Configure CAT interface using Hamlib's rig control daemon (rigctld)
|
||||
#####################################################################
|
||||
et-log "Updating CAT control configuration..."
|
||||
|
||||
sed -i "s|^<CHKUSEHAMLIBIS>.*|<CHKUSEHAMLIBIS>1</CHKUSEHAMLIBIS>|" ${FLDIGI_CONF_FILE}
|
||||
sed -i "s|^<HAMRIGMODEL>.*|<HAMRIGMODEL>2</HAMRIGMODEL>|" ${FLDIGI_CONF_FILE}
|
||||
sed -i "s|^<HAMLIBCMDPTT>.*|<HAMLIBCMDPTT>1</HAMLIBCMDPTT>|" ${FLDIGI_CONF_FILE}
|
||||
sed -i "s|^<HAMRIGDEVICE>.*|<HAMRIGDEVICE>localhost:4532</HAMRIGDEVICE>|" ${FLDIGI_CONF_FILE}
|
||||
|
||||
|
||||
######################################
|
||||
# Enable Reed Soloman ID for RX and TX
|
||||
######################################
|
||||
et-log "Enabling Reed Soloman ID for RX/TX..."
|
||||
|
||||
sed -i "s|^<RECEIVERSID>.*|<RECEIVERSID>1</RECEIVERSID>|" ${FLDIGI_CONF_FILE}
|
||||
sed -i "s|^<TRANSMITRSID>.*|<TRANSMITRSID>1</TRANSMITRSID>|" ${FLDIGI_CONF_FILE}
|
||||
|
||||
|
||||
###########################
|
||||
# Modem configuration: MT63
|
||||
###########################
|
||||
et-log "Updating MT63 modem configuration..."
|
||||
|
||||
sed -i "s|^<MT63INTEGRATION>.*|<MT63INTEGRATION>1</MT63INTEGRATION>|" ${FLDIGI_CONF_FILE}
|
||||
|
||||
|
||||
########################
|
||||
# Repeater configuration
|
||||
########################
|
||||
et-log "Updating settings for linked repeater systems..."
|
||||
|
||||
# Key up for 2 seconds before transmitting tone. Needed for linked repeater systems.
|
||||
sed -i "s|^<PRETONE>.*|<PRETONE>2</PRETONE>|" ${FLDIGI_CONF_FILE}
|
||||
|
||||
|
||||
#####################
|
||||
# NBEMS configuration
|
||||
#####################
|
||||
et-log "Updating settings for NBEMS..."
|
||||
|
||||
sed -i "s|^<OPEN_NBEMS_FOLDER>.*|<OPEN_NBEMS_FOLDER>1</OPEN_NBEMS_FOLDER>|" ${FLDIGI_CONF_FILE}
|
||||
sed -i "s|^<FLMSG_PATHNAME>.*|<FLMSG_PATHNAME>/usr/local/bin/flmsg</FLMSG_PATHNAME>|" ${FLDIGI_CONF_FILE}
|
||||
|
||||
# TODO: Add flmsg to ETC installer
|
||||
# TODO: Add flamp to ETC installer
|
||||
# TODO: Revisit autostart configuration to start flamp
|
||||
# TODO: Revisit TCP/IP configuration when porting ETC R2 Build 56
|
||||
# TODO: Define TTP/ETC macros
|
||||
@@ -0,0 +1,89 @@
|
||||
/*
|
||||
* Author : Gaston Gonzalez
|
||||
* Date : 1 October 2025
|
||||
* Purpose : Maps an ET_AUDIO ALSA device to a PortAudio device.
|
||||
*
|
||||
* This utility enumerates all ALSA audio devices using PortAudio
|
||||
* to identify a currently plugged-in ET_AUDIO device. If a matching
|
||||
* device is found, it generates a JSON object on STDOUT containing:
|
||||
*
|
||||
* - PortAudio device name
|
||||
* - PortAudio device index
|
||||
*
|
||||
* Exit Status:
|
||||
* 0 - ET_AUDIO device found and JSON output generated successfully
|
||||
* 1 - ET_AUDIO device not found
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include "portaudio.h"
|
||||
|
||||
#define PROC_ALSA_PATH_FMT "/proc/asound/card%d/id"
|
||||
|
||||
// Read the ALSA card ID from the /proc filesystem
|
||||
int get_alsa_card_id(int card, char *id_buf, size_t buf_size) {
|
||||
char path[64];
|
||||
snprintf(path, sizeof(path), PROC_ALSA_PATH_FMT, card);
|
||||
FILE *f = fopen(path, "r");
|
||||
if (!f) return -1;
|
||||
if (!fgets(id_buf, buf_size, f)) {
|
||||
fclose(f);
|
||||
return -1;
|
||||
}
|
||||
id_buf[strcspn(id_buf, "\n")] = 0;
|
||||
fclose(f);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main(void) {
|
||||
PaError err;
|
||||
int i, numDevices;
|
||||
const PaDeviceInfo *deviceInfo;
|
||||
const PaHostApiInfo *hostApiInfo;
|
||||
int found = 0;
|
||||
|
||||
err = Pa_Initialize();
|
||||
if (err != paNoError) {
|
||||
fprintf(stderr, "PortAudio error: %s\n", Pa_GetErrorText(err));
|
||||
return 1;
|
||||
}
|
||||
|
||||
numDevices = Pa_GetDeviceCount();
|
||||
if (numDevices < 0) {
|
||||
fprintf(stderr, "No audio devices found");
|
||||
Pa_Terminate();
|
||||
return 1;
|
||||
}
|
||||
|
||||
for (i = 0; i < numDevices; i++) {
|
||||
deviceInfo = Pa_GetDeviceInfo(i);
|
||||
hostApiInfo = Pa_GetHostApiInfo(deviceInfo->hostApi);
|
||||
|
||||
// Only show ALSA devices
|
||||
if (hostApiInfo && strcmp(hostApiInfo->name, "ALSA") == 0) {
|
||||
int card = -1, device = -1;
|
||||
|
||||
// Extract ALSA card and device (hw:X,Y)
|
||||
if (sscanf(deviceInfo->name, "%*[^()](hw:%d,%d)", &card, &device) == 2) {
|
||||
char card_id[64];
|
||||
if (get_alsa_card_id(card, card_id, sizeof(card_id)) == 0) {
|
||||
|
||||
// Only print if card ID matches ET_AUDIO
|
||||
if (strcmp(card_id, "ET_AUDIO") == 0) {
|
||||
found = 1;
|
||||
printf("{\n");
|
||||
printf(" \"device\": \"%s\",\n", deviceInfo->name);
|
||||
printf(" \"index\": %d\n", i);
|
||||
printf("}\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Pa_Terminate();
|
||||
return found ? 0 : 1;
|
||||
}
|
||||
Executable
+7
@@ -0,0 +1,7 @@
|
||||
#!/bin/bash
|
||||
# Author : Gaston Gonzalez
|
||||
# Date : 2 October 2025
|
||||
# Purpose : Test et-portaudio installation
|
||||
|
||||
OUT=$(which et-portaudio)
|
||||
exit $?
|
||||
Executable
+7
@@ -0,0 +1,7 @@
|
||||
#!/bin/bash
|
||||
# Author : Gaston Gonzalez
|
||||
# Date : 2 October 2025
|
||||
# Purpose : Test fldigi installation
|
||||
|
||||
OUT=$(which fldigi)
|
||||
exit $?
|
||||
Reference in New Issue
Block a user