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
|
MyCall=N0CALL
|
||||||
MyGrid=DM33
|
MyGrid=DM33
|
||||||
MyGroups=@@TTP,@@TTPNET
|
MyGroups=@@TTP,@@TTPNET
|
||||||
MyInfo=ETC R3
|
MyInfo=ETC R5
|
||||||
Polling=1
|
Polling=1
|
||||||
PSKReporter=false
|
PSKReporter=false
|
||||||
PTTMethod=@Variant(\0\0\0\x7f\0\0\0\x1eTransceiverFactory::PTTMethod\0\0\0\0\xfPTT_method_CAT\0)
|
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
|
# Author : Gaston Gonzalez
|
||||||
# Date : 31 October 2024
|
# Date : 31 October 2024
|
||||||
# Updated : 31 May 2024
|
# Updated : 26 September 2025
|
||||||
# Purpose : Configures ET audio device with sane defaults
|
# Purpose : Configures ET audio device with sane defaults
|
||||||
#
|
#
|
||||||
# Preconditions
|
# Preconditions
|
||||||
# 1. Supported audio interface is connected and properly detected
|
# 1. Supported audio interface is connected and properly detected
|
||||||
#
|
#
|
||||||
# Postconditions
|
# Postconditions
|
||||||
# 1. ASLA settings set on ET audio device
|
# 1. ALSA settings set on ET audio device
|
||||||
|
|
||||||
usage() {
|
usage() {
|
||||||
echo "usage: $(basename $0) <command>"
|
echo "usage: $(basename $0) <command>"
|
||||||
@@ -50,6 +50,8 @@ update-config () {
|
|||||||
|
|
||||||
case ${ET_DEVICE_NAME} in
|
case ${ET_DEVICE_NAME} in
|
||||||
"DIGIRIG_MOBILE")
|
"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.
|
# 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
|
amixer -q -c ${AUDIO_CARD} sset Speaker Playback Switch 42% unmute
|
||||||
# Unmute Mic
|
# Unmute Mic
|
||||||
@@ -97,6 +99,19 @@ update-config () {
|
|||||||
|
|
||||||
et-log "Applied amixer settings for ${ET_DEVICE_NAME}"
|
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."
|
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
|
# Author : Gaston Gonzalez
|
||||||
# Date : 12 November 2024
|
# Date : 12 November 2024
|
||||||
# Updated : 7 February 2025
|
# Updated : 2 October 2025
|
||||||
# Purpose : Stops all EmComm Tools sound-based services (i.e. modems) and
|
# Purpose : Stops all EmComm Tools sound-based services (i.e. modems) and
|
||||||
# amatuer radio applications to ensure a clean start for the next mode.
|
# 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
|
#!/bin/bash
|
||||||
# Author : Gaston Gonzalez
|
# Author : Gaston Gonzalez
|
||||||
# Date : 11 October 2024
|
# 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
|
# 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
|
# in rule development. This is intended to by used with the PROGRAM
|
||||||
# directive inside of a udev rule.
|
# directive inside of a udev rule.
|
||||||
@@ -81,6 +81,11 @@ test_digirig_mobile() {
|
|||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [[ "$ID" == "lab599-tx500mp" ]]; then
|
||||||
|
et-log "Old DigiRig Mobile detected for TX-500MP"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
exit 1
|
exit 1
|
||||||
|
|||||||
@@ -2,13 +2,16 @@
|
|||||||
#
|
#
|
||||||
# Author : Gaston Gonzalez
|
# Author : Gaston Gonzalez
|
||||||
# Date : 9 October 2024
|
# Date : 9 October 2024
|
||||||
# Updated : 31 May 2025
|
# Updated : 26 September 2025
|
||||||
# Purpose : Wrapper startup/shutdown script around systemd/rigctld
|
# Purpose : Wrapper startup/shutdown script around systemd/rigctld
|
||||||
|
|
||||||
ET_HOME=/opt/emcomm-tools
|
ET_HOME=/opt/emcomm-tools
|
||||||
ACTIVE_RADIO="${ET_HOME}/conf/radios.d/active-radio.json"
|
ACTIVE_RADIO="${ET_HOME}/conf/radios.d/active-radio.json"
|
||||||
CAT_DEVICE=/dev/et-cat
|
CAT_DEVICE=/dev/et-cat
|
||||||
|
|
||||||
|
# Additional configuration to pass to rigctld
|
||||||
|
SET_CONF=""
|
||||||
|
|
||||||
do_full_auto() {
|
do_full_auto() {
|
||||||
et-log "Found ET_DEVICE='${ET_DEVICE}'"
|
et-log "Found ET_DEVICE='${ET_DEVICE}'"
|
||||||
|
|
||||||
@@ -95,8 +98,14 @@ start() {
|
|||||||
exit 0
|
exit 0
|
||||||
fi
|
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
|
# 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}"
|
et-log "Starting rigctld with: ${CMD}"
|
||||||
$CMD
|
$CMD
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ show-desktop-icons = false
|
|||||||
picture-uri = 'file:///usr/share/backgrounds/emcomm-tools-wallpaper.png'
|
picture-uri = 'file:///usr/share/backgrounds/emcomm-tools-wallpaper.png'
|
||||||
|
|
||||||
[org.gnome.shell]
|
[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'
|
last-selected-power-profile = 'performance'
|
||||||
|
|
||||||
[org.gnome.system.location]
|
[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
|
# Author : Gaston Gonzalez
|
||||||
# Date : 16 March 2024
|
# Date : 16 March 2024
|
||||||
# Updated : 16 August 2025
|
# Updated : 2 October 2025
|
||||||
# Purpose : Main installer for EmComm Tools Community (ETC)
|
# Purpose : Main installer for EmComm Tools Community (ETC)
|
||||||
|
|
||||||
. ./env.sh
|
. ./env.sh
|
||||||
@@ -87,3 +87,9 @@ exitIfNotRoot
|
|||||||
|
|
||||||
# Install prediction tools
|
# Install prediction tools
|
||||||
./install-voacap.sh
|
./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