Showing posts with label Digital_Modes. Show all posts
Showing posts with label Digital_Modes. Show all posts

Saturday, September 23, 2023

JS8Call Band Hopping Script

Recently someone asked on the JS8Call group about band hopping or cycling through several bands on a 10 minute cycle.

Jordan the author of JS8Call suggested using the API to do this.

I decided to see what was around and found this well documented js8net API library, with that I was able to interact with the API from the command line, and could read and set the frequency.

Python is not something I'm familiar with, so I used ChatGPT to help me write a python script that would cycle through a list of frequencies changing to the next one every few minutes.

The result was JS8BandHop, a fairly simple Python script.

Friday, June 2, 2023

How to build WSJT-X from source on macOS

WSJT-X
Compile WSJT-X on Mac.

Works on my spare Late 2014 5K iMac running Big Sur 11.7.10 with Xcode 13.2.1.

Information was passed onto me from AA5SH - Notes on Building WSJT-X on my Mac. The main difference is this guide uses current stable release of Hamlib (4.5.5) from their Github repo.

The steps create a directory called /Users/<username>/wsjtx-build, with a sub-directory each for Hamlib and WSJT-X source code and building.

A detailed guide of how I have my rig control, logging, and digi mode apps configured is at:
https://lonneys-notebook.blogspot.com/2023/06/macloggerdx-flrig-with-wsjt-x-fldigi.html


Xcode


Xcode can be downloaded from the App Store, for older versions of macOS it can be downloaded from https://developer.apple.com/xcode/resources/ > Additional downloads > Search for the version number.

Supported version of Xcode for a given version of macOS see https://en.wikipedia.org/wiki/Xcode.

There are two parts to install Xcode one is just to install from the App Store or download from the Apple developer site, and then also from the command line run the following command:

xcode-select --install

Agree to the Xcode license agreement:

sudo xcodebuild -license


CMake


Download the latest CMake universal from http://www.cmake.org/download/

Open the DMG then drag and drop the application bundle onto the supplied /Applications link.

To complete the install process run:

sudo "/Applications/CMake.app/Contents/MacOS/cmake" --install


Homebrew


Install Homebrew from https://brew.sh/ 

Run the two commands shown at competition to add it to the path.

Install gcc@9:

brew install gcc@9


Mac Ports


Install Mac Ports from https://www.macports.org/

Quit and re-open terminal after installing. 

Install the required ports, answer yes to dependancies or use port -N (non interactive):

sudo port install autoconf
sudo port install automake
sudo port install libtool
sudo port install pkgconfig
sudo port install texinfo
sudo port install fftw-3-single +gcc9
sudo port install asciidoc
sudo port install asciidoctor
sudo port install libusb-devel
sudo port install boost
sudo port install qt5
sudo port install qt5-qtmultimedia
sudo port install qt5-qtwebsockets


Build Hamlib



This only needs to be done once.

Using the current stable release, 4.5.5 at this time.

mkdir -p ~/wsjtx-build/hamlib-prefix/build
cd ~/wsjtx-build/hamlib-prefix
git clone --depth 1 --branch 4.5.5 https://github.com/Hamlib/Hamlib.git src
cd src
./bootstrap
cd ../build

../src/configure \
   --enable-static \
   --disable-shared \
   --disable-winradio \
   --prefix=$HOME/wsjtx-build/hamlib-prefix \
   CFLAGS="-g -O2 -mmacosx-version-min=10.7 -I/opt/local/include" \
   LIBUSB_LIBS="-L/opt/local/lib -lusb-1.0"

make
make install-strip

If make install-strip fails, run make install


Build WSJT-X


Download source code tarball (.tgz) from:



Note: WSJT-X Improved includes additional features (some later make it into regular WSJT-X), and alternate layouts.

Extract the tarball file, you should see a folder named wsjtx-<version number>.

Open the src folder with-in this and extract wsjtx.tgz, this is the source code.

mkdir -p ~/wsjtx-build/wsjtx-prefix/src
mkdir -p ~/wsjtx-build/wsjtx-prefix/build

Copy the source code with in the expanded wsjtx folder into ~/wsjtx-build/wsjtx-prefix/src

cd ~/wsjtx-build/wsjtx-prefix/build

FC=/usr/local/Cellar/gcc@9/9.5.0/bin/gfortran-9 \
   cmake \
   -D CMAKE_PREFIX_PATH="/opt/local/libexec/qt5;~/wsjtx-build/hamlib-prefix;/opt/local" \
   -D CMAKE_INSTALL_PREFIX=~/wsjtx-build/wsjtx-prefix \
   -D CMAKE_OSX_SYSROOT=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.1.sdk/ \
   ~/wsjtx-build/wsjtx-prefix/src

Substitute the Mac OS X SDK version you have installed in the above command if you have a different version.

cmake --build .
cmake --build . --target install # Builds wsjt-x application bundle 
cmake --build . --target package # Builds .dmg file in build directory


Other Info





Misc Notes


Find QT version (installed via Mac Ports): /opt/local/libexec/qt5/bin/qmake -v


Build JS8Call on macOS



Not tried it my self yet.

Thursday, June 1, 2023

MacLoggerDX + Flrig with WSJT-X, Fldigi, JS8Call

How to configure MacLoggerDX and Flrig, with WSJT-X, Fldigi, JS8Call for rig control and one click log uploading to LoTW, QRZ, and Club Log.

Jump to:


Summary

My shack PC is an iMac 5K 27" (Late 2015), the rig is an Icom IC-7300. This is how I have it setup in the event anyone else finds it useful! This is a living post that I occasionally update.

MacLoggerDX is a well designed full featured logging application, it expects to own the rig CAT control with features that make use of rig control, and can share control with other applications via built-in DXLab TCP server.

Flrig is a nice rig control program providing control and feedback of most features. This is very useful when remoting into the shack mac, or directly. Flrig must own the CAT control and shares rig control with other applications via a TCP port (XMLRPC).

Fldigi is a well featured digital modes application, and supports many keyboard to keyboard modes such as DominoEX, Feld Hell, MFSK, Olivia, PSK31, RTTY, Thor, and more.

WSJT-X / WSJT-X Improved well known for FT8/FT4, I also use it for WSPR on HF, MSK144 and Q65-30A on 6m.

JS8Call / JS8 is a keyboard to keyboard chat mode which uses the FT8 protocol (with its error correcting/decoder tech) as the transport. JS8Call also supports mailbox, relays, position reports and email/sms via APRS (one way).

Problem:

  • MacLoggerDX does not support connecting to Flrig, nor can the serial port be shared.
  • Fldigi does not support MacLoggerDX's DXLab TCP server as a rig control option.
    • There is a work around for PTT control via included Apple script, and options that allow Fldigi to learn the rig frequency/mode via broadcasts from MacLoggerDX.
    • The included Apple script for logging from Fldigi to MacLoggerDX didn't work properly for me at least - not sure why.

Solution:

  • Flrig owns the CAT control.
  • Hamlib rigctld supports connecting to Flrig's xmlrpc server.
  • MacLoggerDX supports connecting to Hamlib NET rigctl.
  • Fldigi gains full function control via Flrig.
  • An alternate Fldigi to MacLoggerDX logging script written in Python.
  • The other digi mode apps support Flrig.
  • Any that don't support Flrig likely support Hamlib NET rigctl or the DXLab TCP server built into MacLoggerDX.

Hardware / Software versions as of 22-Sept-2025:

  • Icom IC-7300 firmware 1.4.
  • iMac 5K 27" (Late 2015), macOS 12.7.6 (Monterey).
  • MacLoggerDX 6.57.
  • WSJT-X 2.8.0 Improved (has some features I like).
    • Version 3 is garbage, becomes unresponsive and crashes after a few minutes.
  • JS8Call 2.3.1.
  • Fldigi 4.2.08.
  • Flrig 2.0.08.
  • Hamlib 4.5.5.

macOS desktop showing MacLoggerDX connected to Flrig, WSJT-X and Fldigi decoding
Flrig with MLDX connected, WSJT-X on 17m FT8, and Fldigi decoding end of ARRL digital broadcast on PSK31
(click for larger image - sorry the retina display makes for a large image)



Icom IC-7300 Setup

macOS contains the Silicon Labs drivers for Icom rigs, plug in the USB cable and it works.

Menu > Set > Connectors:

  • ACC/USB Output Select: AF.
  • ACC/USB AF Output Level: 25%.
  • ACC/USB AF SQL: OFF (Open).
  • ACC/USB AF Beep/Speech Output: OFF.
  • USB MOD Level: 50%.
  • DATA OFF MOD: MIC,ACC.
  • DATA MOD: USB.
  • CI-V:
    • CI-V Address: 94h.
    • CI-V Transceive: OFF.
    • CI-V USB Port: Unlink from [REMOTE].
    • CI-V USB Baud Rate: 115200.
    • CI-V USB Echo Back: ON (this should match the echo setting in Flrig).
  • USB Serial Function: CI-V.
  • USB SEND/Keying:
    • USB SEND: OFF.


Network Security!

MacLoggerDX's DXLab TCP server, Flrig's xmlrpc server, and rigctld's TCP server when started bind to and listen on all network interfaces.

Since for simplicity they offer no authentication or encryption system, anything else that can reach the machine over the network can interact with and issue commands to these rig control applications.

Unless you highly trust your local network (anyone and anything else connected to it), and these applications are all on the same machine, it would be recommended to turn on the macOS firewall under System Preferences > Security and Privacy > Firewall and only allow incoming connections specifically as needed. Once turned on a prompt about allowing incoming connections to these applications will be shown, clicking Deny will still allow local machine access via the loopback address (127.0.0.1).

Note: MacLoggerDX is a signed application, the macOS firewall will silently add an exception for it. If the DXLabs TCP server is enabled it will be reachable from the network unless it's set to deny under macOS firewall settings which would limit it to local machine access only.

One way to authenticate and secure the communication for these applications between different machines over untrusted networks would be to tunnel the ports over SSH.

Testing connectivity to TCP ports using netcat (nc) e.g:

nc -zv 192.168.1.100 12345


Flrig Setup

http://www.w1hkj.com

http://www.w1hkj.com/flrig-help - Users Manual

https://groups.io/g/linuxham - Email list/forum

Flrig offers control of various radio functions and displays feedback.

With Flrig and my IC-7300 this lets me control most of the useful front panel controls - volume, NB/NR, ATT, Pre amps, Tuner on/off, output power, and more. Also displays useful information including signal level, Po, SWR, ALC, voltage etc. 

The ALC reading is especially useful with digi mode apps to make sure audio drive levels are correct, e.g. no ALC action. SWR is also perhaps equally useful to know that things are working as expected - ALC action can also indicate high a SWR condition as well.

Very useful if you remote control the station, even if it's from another room in the house which I sometimes do.

Configure:

  • Xcvr:
    • Rig: IC-7300.
    • /dev/cu.usbserial-xxxxx.
    • Baud: 115200 (matches setting in radio)
    • 1 (one stop bit): checked.
    • Echo: checked (this setting should match the Echo setting in the rig).
    • Rest unchecked.
    • Poll intvl: 200 (ms/milliseconds, lower increases Flrig CPU use).
    • USB audio: checked.
  • Server:
    • Xmlrpc port: 12345 (can be anything, I use the default).
  • Poll:
    • All options checked except the two disable options.
  •  Restore:
    • Unchecked everything except Use xcvr data.

After configuring, close and re-open Flrig for the xmlrpc port change to take effect.


Hamlib NET rigctl Setup

Needed for MacLoggerDX rig control via Flrig

https://hamlib.github.io

https://hamlib.sourceforge.net/html/rigctld.1.html

Note: MacLoggerDX can be left disconnected to simply catch the logs which contain all the required info from digi mode apps. When on voice modes (SSB/AM/FM) digi mode apps and Flrig can be closed, rig control given to MacLoggerDX (check box top left on main screen) allowing it can capture and log mode/frequency automatically when manually logging a QSO. If that is sufficient then the rigctld setup is not needed. However MacLoggerDX has features that make use of rig control, and I like to minimize the number of steps/settings etc to do or change when changing modes..

How it works:

  • Flrig owns the CAT control.
  • Hamlib rigctld supports connecting to Flrig's xmlrpc server.
  • MacLoggerDX supports connecting to Hamlib NET rigctl.

Setup:

  • Install homebrew - https://brew.sh
  • Install hamlib - https://formulae.brew.sh/formula/hamlib - brew install hamlib.
  • Run from Terminal: /usr/local/bin/rigctld -m 4 -r 127.0.0.1:12345
    • "-m 4" is the rig type (flrig), "-r 127.0.0.1:12345" is flrig's xmlrpc IP:port.
  • Configure MacLoggerDX to use Hamlib NET rigctl on port 4532: Port type: Hamlib NET Rigctl, port 127.0.0.1:4532, radio Hamlib NET rigctl.

Here is a script to start Flrig and rigctld, then close rigctld when Flrig is no longer running:

#!/bin/bash
# Launch Flrig
open -a /Applications/flrig-2.0.02.app
# Wait for 2 seconds
sleep 2
# Launch rigctld
/usr/local/bin/rigctld -m 4 -r 127.0.0.1:12345 &
# Monitor Flrig and terminate rigctld when closed
while pgrep flrig > /dev/null; do sleep 2; done
killall rigctld 

Save as Flrig-Rigctld.sh, from Terminal run "chmod +x Flrig-Rigctld.sh" to make it executable, and "./Flrig-Rigctld.sh &" to run it in the background (&), allows you to keep using that terminal session.

When I figure out a nicer way, I'll update this. I had tried to wrap the script in an macOS application bundle, but the while loop causes the icon to bounce in the dock forever.

What would be nice is if Flrig supported running shell commands on startup and exit.


MacLoggerDX Setup

https://dogparksoftware.com/MacLoggerDX.html

https://dogparksoftware.com/MacLoggerDX Help/MacLoggerDX Help.html - Online Manual

https://groups.google.com/g/macloggerdx - Email list/forum

Preferences > Station:

  • WSJT-X checked.

Preferences > Radio:

  • Port Type: Hamlib NET rigctl.
  • Port 127.0.0.1:4532.
  • Radio: Hamlib Net rigctl.

First time MacLoggerDX errored, closed and reopened then it worked.

Preferences > Log > Use mode groups (uncheck - allows filtering by sub/digi modes in main log window)


Lookup and Logging Services

Preferences > Lookup > QRZ XML:

QRZ Logbook Upload API Key - QRZ forums.

The QRZ logbook can sync with LoTW to pull in confirmations.

https://logbook.qrz.com


Preferences > Look Up > Club Log:

Club Log among other things is good for tracking your progress, and requesting QSL cards if the op enables OQRS etc. Setup is simple, input your username and password, uncheck Show in comments (unless you want the date/time of the Club Log upload to be added to the comments).

Club Log can sync with LoTW to pull in confirmations.

https://clublog.org


Preferences > Look Up > LoTW:

Location name same as setup in TQSL.

Note: The location is useful for example if operating portable to activate a grid on 6m, setup the location in TQSL. Locations button under the Station tab can be used to manage different locations, or manually update grid on the Station tab, and the location name under Lookup > LoTW. Stations Prefs in the MacLoggerDX manual covers this.

Password is not needed unless one was set for the location in TQSL.

https://lotw.arrl.org

https://www.arrl.org/tqsl-download


It can take up-to a few minutes before the log entries appear in your QRZ logbook and LoTW.


One Click Log Uploads

For these Look Up and logging services, you can also enable the option to upload in real time for each or some. This removes of burden of constantly having to select and upload new log entries. If unsure about a log entry, uncheck Upload QSOs in Real Time (the main option above the different lookup tabs switches it on/off for all), log it, then decide what to do.

In WSJT-X, JTDX under Preferences > Reporting > Prompt me to log QSO, when checked a prompt to log the QSO will appear when RR73/73 are sent/received as the QSO is completed. If real time log uploads are enabled in MacLoggerDX, one click and the QSO is logged and uploaded to the configured services.


Switch from UDP unicast to multicast

When more than one application will be consuming UDP packets, e.g. when WSJT-X and JT-Bridge are running together, switch from using a UDP unicast address (127.0.0.1) to a multicast address (224.0.0.1), open Terminal and run:

defaults write com.dogparksoftware.MacLoggerDX wsjtx_multicast_group "224.0.0.1"

For more info see
https://dogparksoftware.com/MacLoggerDX Help/mldxfc_wsjtx.html search the page for "multicast".

In WSJT-X, JS8Call, and JTDX > Reporting tab > UDP server, change 127.0.0.1 to 224.0.0.1


Band Plans

One annoyance I found with MacLoggerDX are its band plans (Preferences > Band Plan), if you go "out of band" to a "non-standard" FT8 frequency for example, then touch anything in MacLoggerDX it'll change modes on you to RTTY or CW - pretty annoying!

Fix is to edit/remove the CW and RTTY sub-bands, and add sub bands for USB-D mode to cover where you're likely to use digi modes.


iCloud Drive

The MacLoggerDX manual FAQ section recommends disabling iCloud Drive Documents and Desktop syncing.

I make use of iCloud Drive for my Documents, disabling it is not an option. I found that MLDX might be placing locks on some of the files it uses in the Documents/MLDX_Logs folder, this would cause syncing problems with iCloud Drive Documents where it would not always upload/download reliably and keep everything the same across multiple machines.

The work around I found was to rename MLDX_Logs to MLDX_Logs.nosync then create a symbolic link to it with the original folder name.

With MLDX closed, open terminal and run:

cd ~/Documents
mv MLDX_Logs MLDX_Logs.nosync
ln -s MLDX_Logs.nosync MLDX_Logs

iCloud Drive will ignore any file or folder names ending in .nosync, while it will sync the symbolic link, it doesn't do anything with files/folders the link points to.

To make a backup copy of the MLDX_Logs and store them in iCloud Drive, create a new folder in Documents called MLDX_Backup, close MLDX and periodically copy the contents of MLDX_Logs over to it, or rely on Time Machine backups, or both.

MLDX Backup is a script I wrote and use to create backups into a backup folder under Documents which iCloud Drive syncs.

I still find on occasion the iCloud Drive syncing gets out of step the service can be restarted by running: killall bird

The process will then automatically restart, and everything gets caught up.


Update Internet Files

When MLDX is left running, overnight it should perform an Update Internet Files. For me this doesn't appear to work.

Once a week or so I run it manually from the File menu.



WSJT-X Setup

https://wsjt.sourceforge.io/wsjtx.html

https://wsjt-x-improved.sourceforge.io - WSJT-X Improved

Preferences > General:

  • Decoded Text Font: Andale Mono 14 (nice easy font to read).

Preferences > Radio:

  • Rig: Flrig.
  • Network Server: 127.0.0.1:12345.
  • PTT Method: CAT.
  • Mode: Data/pkt (sets rig to USB-D and wide filter - should be 3000 Hz).
  • Split Operation: Fake it (WSJT-X will move the TX freq of rig so the audio is not passing near the filter edges).

Preferences > Audio:

  • Input: USB Audio Codec, Mono.
  • Output: USB Audo Codec, Mono.
  • Remember settings by band: Both unchecked.

Preferences > Reporting:

  • Enable UDP requests, UDP Server 224.0.0.1 port 2237.
  • Checking Prompt to log QSO will auto prompt to log it when WSJT-X sees/sends RR73 or 73. If MacLoggerDX is configured to auto upload, then QSOs are uploaded in real time as they are completed.


WSJT-X Audio Levels

Receive: On quiet band with no signals (e.g. 10m or 6m tuned away to a quiet spot), adjust AF output in rig and/or macOS sound device sliders (if supported) to show 30 dB. This is what the WSJT-X user guide suggests under section 5 Transceiver Setup > Receiver Noise Level.

When I've seen weak signal ops (160m and below, 6m and above) discussing receive levels, For FT8/FT4 they recommend setting the level to show 60 to 80 dB, and AGC set to fast for best performance. With the FT modes and ~60 dB, the quick and short reason is weaker signals will be with-in the dynamic range of the A/D converter, at 30 dB they wont be.

For MSK144 and Q65 I've seen 30 dB and AGC off recommended.

The setting to adjust in the IC-7300 is ACC/USB AF Output Level.

Clipping and over driving in the receive audio chain can also occur, be aware of that.. I had a local telling me on 6m FT8 I had harmonics all over the band with a screen shot to prove it (it looked awful), after some tests with another local said it was clean, if the issue was my transmit levels then everyone should see the problem.

What do I use? Currently 60 dB and AGC fast (0.1s) is the default I leave things set to, adjusting them for MSK144 and Q65 as needed (memory permitting). 

Transmit: Detailed document FT8 - Avoiding Harmonics and Audio Settings by W9MDB. Recommend reading and working through the document as it goes into good detail, including understanding ALC behavior which varies with different radios. This post by Bill G4WJS (SK) also talks about ALC.

Basic steps for reference:

  1. Rig RF Power set to 100% or max it is capable of for the duty cycle.
  2. WSJT-X Pwr slider set to 100% or 0 dB.
  3. WSJT-X Audio Settings > Mono.
  4. Applications > Utilities > Audio MIDI Setup > check/set rig audio (e.g. USB CODEC) format is 1 ch 16-bit integer 48.0 kHz for both mic/speaker (in/out).
  5. Operating System sound level slider for the rig's audio interface set to 0% - System Prefs > Sound > Output > select rig's audio device > adjust Output volume slider minimum.
  6. Click Tune in WSJT-X.
  7. Raise the OS sound level slider until ALC action occurs then back it off until zero ALC action, this should also be full RF output or very close.
  8. Re-select the speakers in System Prefs > Sound which sets the default output device for other apps and system sounds.
  9. RF output is now fully controlled via the slider in WSJT-X.
  10. Dropping Pwr slider in WSJT-X to -3 dB should half the RF output, -6 dB should be about 25%. I found this varies between bands with my IC-7300.
Note: The FT8 audio guide suggests using left channel for both speaker/mic, and 2 ch 16-bit integer 48.0 kHz (with out explaining why), I found when set to 2 ch, the configure speakers button is clickable - I wonder if this is applying audio processing? When set to 1 ch the button is greyed out. I also got no TX audio when set to left in WSJT-X, the tool tip in WSJT-X suggests using mono with a single radio.

Same process for other digi mode apps, but once it is set for one, the only adjustment needed should be the slider or level in the app it self.

After getting audio configured following these steps it "feels" like I get more successful QSO completions on FT8 or less that don't complete but don't have any actual data to prove this.


WSJT-X Frequency Calibration, and Waterfall Flattening

Optional, but nice to do.

https://lonneys-notebook.blogspot.com/2022/06/wsjt-x-freqcal-waterfall-flattening.html

CTY.DAT

WSJT-X includes cty.dat (Country data), this helps map callsigns to their actual locations/entity.

WSJT-X Improved 2.7.x (rc) has an option to download cty.dat in Preferences > Colors tab.

Otherwise updated cty.dat files can be placed in the log directory:

https://www.country-files.com/contest/wsjt-x

Big CTY: https://www.country-files.com/category/big-cty

The Big CTY file will also work, tested this with a KL7 station located in Oregon. They were calling CQ with CN84 grid, WSJT-X showed their entity as Alaska, checking QRZ showed they were located in Oregon/CN84. After dropping in the big cty.dat file into the log directory and restarting WSJT-X their entity was correctly shown as USA.


Q65 on 6m

Some notes on configuring and using Q65 on 6m for EME, terrestrial, and auroral scatter. 

https://lonneys-notebook.blogspot.com/2022/04/try-out-6m-q65-eme-or-terrestrial.html


Build WSJT-X from source

WSJT-X can also be built from source on macOS.

https://lonneys-notebook.blogspot.com/2023/06/how-to-build-wsjt-x-from-source-on-macos.html


JTDX Setup

https://sourceforge.net/projects/jtdx/files

https://jtdx.freeforums.net (Support forum)


JTDX is an alternative to WSJT-X for some modes. Basic configuration is essentially the same as WSJT-X in JTDX v2.2.159.

I like consistency..

I was able to make the color coding match by having both WSJT-X and JTDX pref windows open, and use the eye-dropper tool to match the colors.

JTDX uses the same two log file names wsjtx.log and wsjtx_log.adi, one of the things these are used for is color coding what entities/stations/bands you've worked or not.

If like me you want to have the luxury of being-able to switch between these two apps have it all match up and be the same, this can be done by creating two symlinks:

  1. From JTDX, File > Open Log Directory, quit JTDX.
  2. Delete/move/rename wsjtx.log and wsjtx_log.adi
    1. These files can also be merged into the ones used by WSJT-X by removing duplicates and combining them if you want to get it all into one place.
  3. Open Terminal, change to the JTDX log directory, and create the symlinks:
    1. cd ~/Library/Application\ Support/JTDX
    2. ln -s ../WSJT-X/wsjtx.log wsjtx.log
    3. ln -s ../WSJT-X/wsjtx_log.adi wsjtx_log.adi
  4. ls -l will show where the symlinks point:
wsjtx.log -> ../WSJT-X/wsjtx.log
wsjtx_log.adi -> ../WSJT-X/wsjtx_log.adi

JTDX's S meter and Output power options (enable on the Radio settings tab) also work (displayed top right corner) when using Flrig for CAT control.


JT-Bridge Setup

https://jt-bridge.eller.nu

JT-Bridge is the Mac equivalent of JT-Alert. This tool becomes increasingly useful as you need to start looking for countries, states, or grid squares that are hard to get or have not yet been logged and confirmed, this helps filter all band activity down to what you're looking for or need by syncing with the MacLoggerDX log. As QSOs show confirmed in MacLoggerDX by running Log > LoTW Confirmations, JT-Bridge is kept in sync by running File > Sync with Logger.

Preferences > Network:

  • Multicast Group: 224.0.0.1.
  • Port: 2237.
  • Listen on port (leave empty).

There is also GridTracker, but I have not gotten into using it yet.


Stress Test FT8

https://jp1lrt.asablo.jp/blog/2021/06/25/9391328

With WSJT-X v2.5.4 I get 58 decodes, with JTDX defaults 62, and after tweaking the settings 68. My Late 2015 iMac has a 4 GHz Quad Core i7-6700K CPU - this was the highest CPU option available in these at the time!

On busy bands CPU performance makes a big difference. Further discussions I've seen also indicate more memory helps. If we want the bleeding edge of performance out of the FT modes then max the CPU and memory options, close all unnecessary applications etc. 

Since WSJT-X v2.6.0-rc became available for testing, it's very close to JTDX defaults with the number of stations decoded each cycle, sometimes a few more, a few less, but always fairly close from what I've seen.

With the sample file and WSJT-X 2.6.1 I get 67 decodes, but I've seen as many as 103 on a busy 10m band  (many JAs calling a V26 station) - that above file may not be the ideal test of the decoder performance? Perhaps what we need are set of test files better suited to use as benchmarks for WSJT-X.

Maybe we can squeeze a little more decoder success by renicing WSJT-X or JTDX to give it a higher priority?

I have used htop (brew install htop) to renice the WSJT-X jt9 process to -20 (maximum, yes less is more) - jt9 process appears to be doing the decoding as it spikes in CPU use during the decodes at the end of each FT8 sequence, wsjt-x process is the rest of the application from what I can tell, its CPU use increases when menus and options are clicked/changed etc


FT8 Operating Guide

https://www.g4ifb.com/FT8_Hinson_tips_for_HF_DXers.pdf - highly recommended reading!


JS8Call Setup

http://files.js8call.com/latest.html (2.2.0)

https://github.com/js8call/js8call/releases (2.3.0 and later)

https://groups.io/g/js8call - Email list/forum

Basically the same as WSJT-X, except the radio tab has two sub tabs - CAT Control and Rig Options. TCP server and port address is set under CAT Control but confusingly appears as a greyed out unchangeable option under Rig Options!

Preferences > Radio:

  • Rig: Flrig.
  • CAT Control tab > Network Server: 127.0.0.1:12345.
  • Rig Options tab:
    • PTT Method: CAT.
    • Mode Data/Pkt.
    • Split Operation: Fake it.
    • TX delay 0.2 s.
    • Hold PTT between frames (checked).

Preferences > Audio:

  • Input: USB Audio Codec.
  • Output: USB Audo Codec.
  • Remember settings by band: Both unchecked.

Prior to MLDX v6.46, in JS8Call if the UDP port was changed to 2237 under the Reporting tab, logging a QSO in JS8Call would also send the log to MLDX the same with WSJT-X, but WSJT-X changed the API and MLDX was updated to suit, which broke this functionality with JS8Call.

Since this change, log a QSO as per normal in JS8Call, then open the logs directory Log > Open Log Directory, right/control click the js8call.adi file > Open With > MacLogger DX to import any new QSOs from the ADI file.

I got into JS8Call a while back because I was interested in APRS over HF. I also enjoy the keyboard chat modes too.


Fldigi Setup

https://wikipedia.org/wiki/Fldigi

http://www.w1hkj.com - Downloads

http://www.w1hkj.com/FldigiHelp - Users Manual

http://www.w1hkj.com/beginners.html - Beginners guide to Fldigi

http://www.w1hkj.com/modes - Sights and sounds of digi modes

https://sourceforge.net/p/fldigi/wiki/osx_howto/ - How to compile Fldigi on macOS

https://groups.io/g/linuxham - Email list/forum


Configure:

  • Operator-Station:
    • Fill in as required.
    • Station Locator: <input 6 character grid>
  • Call > Lookup:
    • Database lookup: QRZ.com, enter QRZ user/pass.
  • Misc > PSK Reporter (check):
    • Automatically spot callsigns in decoded text.
    • Send reception report when logging a QSO.
    • Report rig frequency.
    • Logon to pskrep when starting Fldigi.
    • Note: 6 character grid is required under Configure > Operator-Station > Station Locator
    • Click Initialize.
  • Soundcard > Devices:
    • PortAudio: Checked.
    • Capture: USB Audio Codec.
    • Playback: USB Audio Codec.
    • Device support full duplex: Checked.
  • Rig Control > Flrig:
    • Enable flrig xcvr control with fldigi as client.
    • Poll Interval (msec): 200.
    • Flrig xmlrpc server: 127.0.0.1:12345.

TX Audio (adjust for zero ALC) and WF levels, bottom of Fldigi main window:

  • WF Uppser Signal Level (dB): -40 (0 if level set for 60 dB in WSJT-X).
  • WF Signal Range (dB): 60.
  • TX Level Attenuator (dB):  -8.


Logging

The _Log2MLDX.scpt included with the MacLoggerDX disk image didn't work properly for me.

Logging on MacLoggerDX with Fldigi is a Python script I found searching the MacLoggerDX Google group, it works perfectly.

The Nov 27, 2022 version uses an ADIF import, after clicking the macro button in Fldigi, MacLoggerDX will prompt to import the file and add it to the log, however MLDX will not auto upload imported logs (if this is enabled/used).

After an email with Fred it sounds like a future update may include UDP as an option again to eliminate the import prompt from MacLoggerDX.


Previous Setup?

If Fldigi was previously setup to work with MacLoggerDX using the work arounds, these can be undone:

  • PTT script can be removed from being auto started when Fldigi starts.
  • In MacLoggerDX > Prefs > Station, UDP Broadcast can be unchecked.
  • In Fldigi > Config > Logging > MacLogger, Connect to MacLogger can be unchecked.


More Info

Signal Identification Wiki.

QSO Today with Dave W1HKJ (author of Fldigi, Flrig, and more).

70 Years of Amateur Digital Modes - pretty interesting ! 

DominoEX and DominoEX FAQ.

Data & Text mode Digital Radio Communication - VU2NSB.

Feld Hell Club - Info about the mode, frequencies, and nets.

FSQ (Fast Simple QSO) - Info about the mode and frequencies.

Saturday, October 29, 2022

PSK31 Fldigi Macros for Field Day

PSK31 with waterfall

These are the PSK31 Fldigi macros I setup for Winter Field Day last year.

I came across a lot of PSK31 activity by chance (7.070, 14.070), but it took a while to figure out how to take part..

Frustratingly the information needed to simply get setup and get going is not found in one place. I like to give points to field day/contest stations but not seriously compete. Are they trying to get more people into contesting by keeping it mysterious?

Info collected from:


I set these up on an empty macro row in Fldigi:

ANS CQ (Answer CQ):

<TX>
<CALL> <CALL> de <MYCALL> <MYCALL> k
<RX>


W/FD Exch (Send exchange for your station, e.g. 1H is single home op, WWA is western WA):

<TX>
<CALL> 1H WWA 1H WWA de <MYCALL>
<RX>


73 (Send when your exchange was copied):

<TX>
73 de <MYCALL>
<RX>


QSO @>> (Start free text message):

<TX>
<CALL> de <MYCALL> <MYCALL>


RX (Go back to receive):

de <MYCALL> k
<RX>


Friday, June 17, 2022

WSJT-X FreqCal & Waterfall Flattening

Simple method using WSJT-X to do frequency calibration of an Icom IC-7300 (or any rig with a reference adjustment), and waterfall flattening.

Frequency Calibration

I got the idea from this post https://groups.io/g/icom705/message/532

Let the radio warm up for a couple hours or so in a room at average operating temperature. Mine is on 24/7 since I leave it running overnight on 160m FT8, or 6m MSK144 to spot meteor scatter stations, so there is no warming up and cooling down :-)

WSJT-X has a FreqCal mode - the manual covers how run a calibration cycle which will work with any radio by configuring WSJT-X to do an internal adjustment compensating for the radio, or it can also be used to align the radio it self - easy if it offers a reference adjustment via a menu option.

If in range of WWV or WWVH, or another (highly) accurate time standard broadcast, edit the FreqCal frequencies (Settings > Frequencies) to use only those you can receive.

Switch to FreqCal (Mode menu) and select one of the time standard frequencies from the frequency/band drop down.

WSJT-X sets the radio to USB mode and 1500 Hz below the carrier frequency, it then measures tone or heterodyne and displays the frequency.

If your radio has a frequency reference adjustment such an the Icom IC-7300 (Menu > Set > Function > REF Adjust) adjust it until you are close as possible to 1500 Hz in fMeas column or 0.0 in DF column.

WSJT-X FreqCal

Here I was able to get very close using WWV on 10 MHz, I see about the same DF on WWV at at 5 and 15 MHz. It will drift slightly with changes in room temp which you can see by repeating the measurement.

If the radio doesn't have a user setting for frequency reference, execute a WSJT-X frequency calibration cycle per the manual with the Measure box checked (this writes the fmt.all file in logs directory). I found I had to let it run for at least two or three cycles. Edit fmt.all and remove any lines with a * at the end, then run solve for calibration.

The latter may be more accurate, WSJT-X will apply the offset needed internally, but I didn't like it showing this offset subtracted/added to the WSJT-X frequency display (blame OCD) and it only applies to WSJT-X when it is running.

More words about FreqCal by AG6EE at WSJT-X Calibration.

Waterfall Flattening

A good guide by KA1GT - https://bobatkins.com/radio/wsjtx_wide_graph.html - while orientated for EME use the steps can be followed to optimize your waterfall.

After running through all that this is what my waterfall looks like

WSJT-X waterfall Ref Spec

The one signal at 1090 Hz is -17 dB on a quiet 6m band.

Sunday, April 10, 2022

Try Out 6m Q65-A EME or Terrestrial

With a 6m Yagi and weak signal digital mode Q65-A it's possible to receive EME (Earth Moon Earth) signals during moonrise or moonset.

Q65 can also be used for terrestrial contacts where other weak signal modes such as FT8 may not succeed.

It's also possible to do "QRP EME" on 2m and 70cm, see QRP EME - An incomplete Guide (KG5CCI).

Note: Unlike on FT8, WSJT-X wont make use of Split fake it/rig to keep the TX audio in the middle of the filters, if you get too far away from 1500 Hz power output will start to drop off.

More info


Configuring WSJT-X for Q65 and 6m terrestrial

Mode > Q65

6m > 50.275 MHz

File > Settings > Enable VHF and sub-mode features (not sure that is required)

File > Settings > Decode after EME delay - only used for EME, leave unchecked for terrestrial - though I’ve had this checked and its worked ok.

Decode > Fast for terrestrial (remember to set this back to normal or deep for FT8 and other modes). Enable averaging, and Auto clear AVG after decode on.

Terrestrial: On the main WSJT-X screen set the offset to 1500 Hz, F Tol to 100 or 200, Submode A, T/R 15 or 30 - these last two settings indicate the mode, e.g. Q65-15A, Q65-30A.

Once a QSO starts change F Tol to 100, 50, or 20.

WSJT-X Wide Graph has a Q65_Sync setting.

https://wsjtx.groups.io/g/main/topic/83263895 that post has a lot of info about terrestrial Q65. Suggests that using 15s T/R for Q65-15A is very close in performance to 30A, and twice as fast. Also covers other sub-mode combinations and QRP use.

In practice 30-A on 6m seems to be the most commonly used Q65 submode.


Here is a more recent QSO on 6m Q65-30A with W7OUU who is 500 mi / 800 km south east of me in Idaho, the band was otherwise closed with no FT8 activity.

They were running 1.1 kW with 7 elements, I was running 85 watts with 3 elements. This QSO took around 45 minutes to complete, and 15 minutes before I got the first decode (Q65 averaging at work):

WSJT-X Q65-30A QSO

I was able to reliably decode them on nearly every cycle after the first decode, with my much lower power output and lower gain antenna it took some time for them to decode my messages, but we got there in the end, and DN22 is a new grid on 6m for me too!

I've since worked W7OUU again, and WB7UNU in Spokane 200 miles east for another new grid with the band was otherwise closed.

Final thought: Since Q65 uses averaging to build confidence in subsequent decodes, and can take advantage of any propagation mode (tropo, aircraft scatter, meteor scatter, etc), this QSO may have used a combination of these to complete with enough "fragments" eventually making it though for a successful decode.


Auroral Propagation

With a recent Auroral opening (23-Mar-2023) on 6m was the first time I'd experienced this. On SSB and CW the signals were quite distorted which is normal, but they are readable.

It was then suggested to try Q65-30C or Q65-15B (same tone spacing, half the time). Listening to the tones with the volume up they sounded distorted, and yet it worked reliably. I was able to complete a couple of QSOs quite easily with good decodes on each sequence, and one on SSB:

Auroral 6m QSOs

This was quite a nice surprise, as the distorted FT8 signals I heard did not decode. Q65 certainly seems to be the magic mode for the magic band!


Earth Moon Earth

My interest in EME starts in the mid 90s when I was a freshly minted new ham, friend and I got invited (likely we invited our selves) to see Paul ZL1PE's 2m EME setup. Back then it was CW only (no digital modes existed then for EME, or much else).

Paul had built an H stack of four long boom 2m Yagi's with elevation and azimuth rotator, home brewed an amplifier using something along the lines of a 3CX1000 (I forget exactly), high gain masthead pre-amp and high powered coaxial relays, the feedline was hardline. Amazing stuff to see, and a lot of effort for a propagation mode where you could only use CW when the moon was up.

With the advent of digital modes and home computers faster than we could imagine 30 years ago and now take for granted, the barrier to entry for EME is much much lower.


Much thanks to Bob ZL1RS for most of the EME information.


Where is the moon?

Find when and where the moon is with something like https://www.timeanddate.com/moon/


Antennas, ground gain

With a Yagi pointed at the horizon (a regular horizontal Yagi installation) the added advantage of ground gain can be made use of during moonrise and moonset.

Antenna height, higher not always better! Consider these two 4NEC2 plots of 7 element Yagis at different heights, one at 7 meters / 23 feet vs 18 meters / 60 feet:

4NEC2 Yagi elevation plots
Plot by Bob ZL1RS


Red is the Yagi at 7 meters, it has one broad lobe that will cover between the horizon and about 15 to 20 degrees elevation. The same antenna at 18 meters, has 3 lobes, the moon will pass through each of those much quicker and be "lost" in the nulls.


Assessing the local noise floor for EME

Test 1 - Disconnect the antenna and with WSJT-X note the noise floor with the dB meter bottom left. If there is a difference of more than 10 dB when connected, the local noise floor might be too high.

Test 2 - Preamps - With antenna aimed at moonrise/set direction, turn preamp(s) on and AGC to fastest setting. If any signal level is registered on the S meter (indicating AGC action in the receiver) the local noise floor might be too high.

For me living in city my local noise floor is too high based on the second test as I get AGC action in the receiver. I'd need use to higher gain Yagi(s) with elevation rotators to get away from the noise sources when the moon is (much) higher in the sky.


Configuring WSJT-X for Q65 and 6m EME

Mode > Q65

File > Settings > Enable VHF and sub-mode features (not sure that is required)

File > Settings > Decode after EME delay (that one is important)

Decode > Deep (some say fast is more sensitive). Enable averaging, and Auto clear AVG after decode on

On the main WSJT-X screen set the offset to 1500 Hz, F Tol to 100 or 200, Submode A, T/R 60 (these last two settings indicate the mode, e.g. Q65-60A).

WSJT-X Wide Graph has a Q65_Sync setting.


Frequencies, where to find others on EME

Most EME activity is in the 50.180 to 50.210 area with 50.188 to 50.208 being most popular for sked arrangements. You wont find it tuning around.

A DT of 2.5 seconds indicates EME, DT of 0.0 or 0.1 indicates terrestrial propagation modes.

ON4KST runs an online chat service (runs in browser), goto http://www.on4kst.info/chat/start.php and choose EME all bands/mode, this is where coordination between stations happens.

HB9Q EME Logger is another.


Transmitter Power with EME

Receiving Q65 via EME is the first step, transmitting typically power levels around 1 kW are used.


Wednesday, December 1, 2021

FT8 - Now it makes sense!

Dark side cookies

For a time FT8 seemed pointless to simply log the minimum for a contact in an automated way and move on, the social side and having a chat getting to know someone, and share ideas is removed from the equation.

I always did see FT8's good points and purpose, its a weak signal mode, efficient, and gets the job done neat and tidy. 

Ideal for contesting, special events, or working a DX-Pedition for example to get that rare one in the log where all that is happening is exchanging of callsigns and signal reports anyway. FT8 simply took that function, and made it efficient. No problem with that.

But I was being a Curmudgeon, so back in April this year I tried out FT8 to at least figure out how to drive it. With a busy summer out of the way and fall around the corner I decided time to get a little more serious and start using logging software and maybe work towards getting awards, and QSL cards to stick on the wall.

The result was MacLoggerDX, WSJT-X, JS8Call, Fldigi and Flrig Integration. MacLoggerDX does the right things, and once configured makes rig control, and logging contacts with WSJT-X, JS8Call, and Fldigi seamless, couple mouse clicks and its all done. Now there is no excuse, the tools are in-front me to get to work.

Now it makes sense, a lot of sense. Most FT8 ops upload logs to LoTW, which is appreciated if like me you want them to also count towards awards for example. After a few weeks I had logged and confirmed contacts all over the world, and sent and received a number of QSL cards.

This reminded me how much I enjoyed sending and receiving paper QSL cards too. Today when everything is electronic and instant, it's nice to receive a physical object from somewhere that took a journey.

This mode also spurred me to upgrade my antenna systems. The OCFD was replaced with 130 ft doublet fed with 600 ohm line into a remote auto tuner which is interfaced to the rigs ATU port. This makes band changes seamless, and enables me to operate on all bands 160-10m. I finally assembled the 6m 3 element LFA Yagi I had bought, which then blew down in strong winds a few weeks later, and since tediously unbent with a vice, straight edge and a mallet. See Thats the end of Six meters for a while..

Maybe the spark gap ops didn't like the new kids running vacuum tubes at the time either. It's just an evolution of technology that enables us to set the bar higher. DXCC is easier, so we get that then set the next goal and keep going, and/or set goals with friends and compete.

For example, KL2R and I set the goal of a clean sweep, logging and confirming a contact on every band. This turned out to be quite fun.

I've also logged contacts with friends I've since not heard from in a long time, and follow ups via email sometimes result which is a nice surprise.

All the same I enjoy text chats on JS8, PSK31, and talking to people on voice modes just like always. Remember to stop and smell the roses.

I've simply added an additional mode I can use for awards and other goals, and to get some of those nice QSL cards that would otherwise be much harder or if not impossible to get.

100 countries confirmed in LoTW under three months - I started on September 10th, and 100th country was confirmed on December 1 by E75C. Simply from putting in a consistent effort with a modest station - a single wire antenna, 80W, sometimes 350W when needed.

Time for a break from chasing DX, work on some other projects and think about the next goal..


8J1RL QSL card

Tuesday, April 6, 2021

Trying out FT8..

I got around to trying out FT8, the HF digital mode that everyone seems to be doing these days. I guess don't knock it until you try it..

It makes completing a contact very easy after setting some options.

Answering a CQ just double click station calling CQ, from there the process of your station answering, the exchange of callsigns, grid square and signal report are fully automated.

Calling CQ is simply clicking enable TX and waiting for others to answer, the same automated process takes over and completes the contact.

I can see this has it's uses with contesting, working a DX-Pedition under trying conditions to get that rare one for example since its simple, automated and completes a contact in five 15 second T/R sequences.

WSJT-X FT8 QSO

Here on the 17m band yesterday evening completed my very first ever FT8 contact with ZL2DD.

Thursday, February 20, 2020

HF APRS with JS8Call

How to configure JS8Call to report your location into the APRS network


JS8Call is a derivative of the WSJT-X application, based on the robustness of FT8 it's primarily for keyboard-to-keyboard message passing. See the JS8Call homepage and JS8Call Groups.io site.

JS8Call activity (last 15 mins) - pskreporter.

Among some of its features is the ability to report your position into the APRS network via other stations running JS8Call:
  1. Find your 10 character grid square, K7FRY has a great tool Find QTH or map square built in Google maps that lets you find your location, click on the map and it displays your 10 character grid square.
  2. In JS8Call, File > Settings > General, enter the grid square in the My Maidenhead Grid Locator box.
  3. In JS8Call, File > Settings > Save messages > add a new message: @APRSIS GRID <MYGRID10> and OK to save. Note: JS8Call will replace "<MYGRID10>" with the value from My Maidenhead Grid Locator set in step 2 when the saved message is selected and sent next. The number sets the number of grid square characters to send, 4 being the minimum. Higher the number higher the accuracy of the location reported.
  4. In the main JS8Call window right click in the Message(s) or outgoing message box > Saved Messages > select your saved @APRSIS message to send it.
When I selected the saved message to send, my location appeared on aprs.fi with-in about a minute:


(Click for larger/clearer image)
KL3NO was my previous callsign

Here I am, shows it came from JS8, was on 30m band, and a SNR of -12dB. It was received by one of WB6CXC's dedicated gateway receivers.

During 2020 which was still fairly low in the solar cycle 40m was the most reliable at any time, even during the daytime where the range is limited due to D-layer absorption.

In 2024 where we're coming into a solar maximum 20m is the better band during the day time, and even into the evening and night. 40m would still be a better choice at night when the daytime D-layer absorption is no longer present.


Taking it Mobile


Note: This project was recently posted on Hackaday, the comments have interesting and useful info related to APRS.

The VHF APRS coverage is usually very good in many places, but also non-existent in more remote and sparsely populated areas. An alternative is to use HF radio and JS8Call to send position reports.

This was work in progress in 2020 then the project got shelved. The original setup used a Raspberry Pi running Buster Desktop. I resurrected the project again in Feb 2024, this time around I'm using a Dell Latitude 7490 laptop (with a car charger) running Debian 12 (Bookworm) with MATE desktop.

Taking it mobile to draw lines on a map (aprs.fi) is fairly easy as the software to do this exists, it's just a matter of plugging the pieces together, and configuring the options.

Using JS8Call for this has a number good points:
  • The software to do this already exists.
  • JS8 is FT8 re-worked for chat and message handling, it retains the weak signal and decoder performance of FT8, including FEC (forward error correction) and robustness against noise, QRM, and ionospheric effects.
  • It takes two frames to transmit the position report, 30 seconds on normal mode (50 Hz).
  • Anyone running JS8Call is a monitor for the @APRSIS messages, so we have plenty of stations who can receive and pass the position report into the APRS network for us.
  • All we have to do is configure the transmitting end.

JS8CallUtilities_V2 is used to read the GPS data, which then sends the @APRSIS GRID message to JS8Call to transmit. Both can be configured to do this on start up (set and forget).

The only custom part I had to do was write a shell script to handle power disruptions to the rig (vehicle starts) which will cause a rig control error. The script monitors for rig control errors, closes down and then restarts the applications when the rig USB port is detected (rig has power again).

Below there are both bash shell (Linux) and PowerShell (Windows) versions of the script needed to handle power disruptions to the radio.

My mobile IC-7100 and Hamstick antenna install / setup info here.


-----


Debian 12 (Bookworm), on a Dell Latitude 7490.

This is what I chose to use / had available.


Text install, SSH server, MATE desktop. I tried XFCE first, but its power management caused problems with digi apps functioning when the screen saver ran / screen was blanked.

Specific to the Dell Latitude 7490, the Intel 915 graphics causes the system to lockup during boot or after starting the GUI (related to power management - Intel Graphics - ArchWiki):
  • Grub boot menu > e > append i915.enable_dc=0 to the end of the linux /boot/vmlinuz line. 
  • After system boots up, edit /etc/default/grub, append i915.enable_dc=0 to the end of  GRUB_CMDLINE_LINUX_DEFAULT= line.
  • Run update-grub

IP Addresses: ip -c a

Groups, add our selves to dialout (needed for USB/serial port access), and sudo:
  • su -
  • Enter root password
  • usermod -aG dialout,sudo <user name>
  • logout ; logout

Update vi to vim, I'm old fashioned and like vi/vim editor: sudo apt-get install vim


VNC, for remote console session access (I find it useful during setup/testing etc):
  • sudo apt-get install tigervnc-scraping-server tigervncpasswd
  • vncpasswd
  • x0vncserver -display :0 -localhost no
  • Note: The console session needs to be logged in first.
  • Connect VNC client (port 5900), note the connection is not secured or encrypted. If thats a problem, either start x0vncserver with -localhost yes option and tunnel the port over SSH or figure out TLS etc.
  • killall x0vncserver (quit the vnc server).
  • Having the VNC server start / allow access to the console session with-out having to log it in first would be nice.
    • Systemd unit for x0vncserver (TigerVNC Wiki), the x0vnc.sh script works when manually run, but the systemd unit fails to start it.
    • Changed PARAMS="-display :0 -localhost no" and copied .vnc/passwd from my home dir to /root/.vnc/passwd 
    • Out of everything I have searched for and tried, this gets the closest, but requires x0vnc.sh to be manually run from an SSH session after a reboot or logout from the desktop.
    • At least there is now the ability to logout of the desktop or reboot, run x0vnc.sh via SSH to restart the vnc server, and regain access to the desktop with out physically logging in the console session.


Edit MATE Menus

The digi mode apps get added to different Applications menu groups.

System (menu) > Preferences > Look and Feel > Main Menu

If not present install Mozo menu editor

sudo apt-get install mozo


This is the end of Debian 12 specific configuration, below ~ should ~ work on any Debian based system (Linux Mint, Raspberry Pi OS, Ubuntu etc).

-----


GPS


GlobalSat BU-353-S4 USB GPS Receiver is what I got/have/used.

To get this GPS working:
Plug the GPS in
    sudo dmesg

    Note the /dev/ttyUSBx device name the GPS was mounted with.
      ls -l /dev/serial/by-id/

      Note the name of the link pointing to the /dev/ttyUSBx device name.
      sudo apt-get install gpsd gpsd-clients
      Edit /etc/default/gpsd to match

      START_DAEMON="false"
      USBAUTO="false"
      DEVICES="/dev/serial/by-id/usb-Prolific_Technology_Inc._USB-Serial_Controller_D-if00-port0"
      GPSD_OPTIONS="-n -G -b"
      GPSD_SOCKET="/var/run/gpsd.sock"

      DEVICES matches the GPS serial link name, one line.

      USBAUTO="false" disables hot plugging. If enabled (true) gpsd will attempt to get GPS data from any serial device that is connected and prevents other applications from accessing the port, including the radio USB port!

      Restart the GPSD service:
      1. sudo systemctl restart gpsd
      2. gpsmon
        Had a GPS fix, Ctrl C to quit.

        Enable the service to start at boot:
        • sudo systemctl enable gpsd

        An alternative to using the symlink as above is to use udev rules, https://github.com/gm-stack/radioconsole/blob/main/carpi-notes/gpsd-difficulties.md shows how to set these up. 
         

        Sync Time via GPS 

        I got the details from here:
        1. Install Chrony: sudo apt-get install chrony
        2. Edit /etc/chrony/chrony.conf add this to end of file (one line): refclock SHM 0 offset 0.5 delay 0.2 refid NMEA
        3. Restart Chrony:
          1. sudo systemctl restart chrony
        4. Check Chrony's sources: chronyc sources -v
        5. Or to have it update every second in a terminal window: watch -n 1 chronyc sources

        The offset is specific to the GPS, in my case using 0.5 put it off by about 200ms compared to NTP servers, Chrony marked source state as 'maybe be in error', but would switch to using it ok with no internet connection.

        See Millisecond accurate Chrony... for a dive into tuning the config with the GPS.

        To figure out the offset for my specific GPS:
        • I commented out the pool address.
        • Temporally added three of the nearest NIST time servers.
        • Enabled logging.
        • Set makestep to 0.1 3 (helps quickly change time if its off more than 100ms on startup).
        • Set the GPS offset to 0.000 noselect.
        • Restarted Chrony, let it run for an hour (longer gets a better average).
        Followed the steps to get the data into Excel and averaged the time offset column. The figure I got was 3.05E-01 or 305ms

        I changed the Chrony conf back to using the pool address, commented out the NIST servers, updated the GPS refclock line and remove noselect, only changes to the file in the end are:

        makestep 0.1 3
        refclock SHM 0 refid NMEA offset 0.300

        Restart Chrony, delete the log files.

        Even after performing the time "calibration" room temperature changes (I assume) cause it to drift around +/- 50ms.



        Rig Control


        I like Flrig, it gives you nice on screen control of most rig functions, digi mode apps connect using the Flrig option over a TCP port (e.g. 127.0.0.1:12345 default port).

        Flrig is also used with a shell script (below) to monitor for and recover from rig control errors caused by vehicle starts cutting power to the rig for a few seconds.

        sudo apt-get install flrig

        This installs an older version 1.4.7, Debian testing repo appears to have the current version, or compile it from source. To keep things simple I just use 1.4.7 from the Debian stable repo.

        Configure > Xcvr
        Rig IC-7100
        /dev/serial/by-id/usb-Silicon_Labs_CP2102_USB_to_UART_Bridge_Controller_IC-7100_22001383_A-if00-port0
        Baud 19200 (Set IC-7100 to match in Set > Connections > CI-V)

        Config > UI > Smaller Sliders
        Config > Restore > Use xcvr data checked, uncheck everything else

        Flrig can also sync the clock in the radio, Show/Hide controls (down arrow bottom left) > Misc




        Digi Mode Apps

        Only JS8Call and JS8CallUtilities_V2 are needed for the APRS stuff.

        The packages downloaded and installed below are for Debian.

        Correctly setting the audio levels see the WSJT-X Audio Levels section in MacLoggerDX + Flrig with WSJT-X, Fldigi, JS8Call. This setup process only needs to be done once using any digi mode app's tune command.

        Basically adjusting the USB MOD level and OS sound card mixer levels so that with the rig RF power set to 100% and the slider is at the top in WSJT-X or JS8Call you have 100% power output with no ALC action. We should not be pulling the slider down in the app to meet that goal, it means something else is set too high in the audio chain, which can be a source of IMD.



        JS8Call

        Get js8call_2.2.0_20.04_amd64.deb from http://files.js8call.com/latest.html

        sudo dpkg -i js8call_2.2.0_20.04_amd64.deb

        If there is an missing dependencies error:

        sudo apt-get install -f
        sudo dpkg -i js8call_2.2.0_20.04_amd64.deb

        Settings > Radio > Rig: FLrig
        CAT Control > Network Server: 127.0.0.1:12345
        Rig Options > PTT CAT, Mode Data/pkt, Split Operation Fake it, Hold PTT between frames.



        JS8CallUtilities_V2


        Now the magic part, some software to glue it all together and send updated positions via JS8Call.

        Mark M0IAX created an app written in Python called JS8CallUtilities_V2.

        This can be configured to automatically start with the TX timer enabled, Auto TX Grid to APRSIS enabled, and the position precision increased to 5, which sends fairly precise 10 character grid squares.

        For this to work, in JS8Call:
        • Enable the UDP API options in JS8Call under Settings > Reporting.
        • Enable Auto reply at startup under Settings > General > Networking & Autoreply.
        • Disable Idle timeout under Settings > General > Networking & Autoreply.
        • Settings > Radio > Rig Options > Hold PTT between frames. I don't see a use having the rig go back to receive for 2 seconds between frames

        Revisiting this in Feb/2024 on a Debian 12 (Bookworm) system I was unable to get v2 working (possibly related to having to setup an Python venv for the pip3 modules).

        I was able to get the compiled binary version from https://m0iax.com/downloadfiles/ (Ubuntu2004) to run no problem.

        Download, unzip, run the binary, open Settings, configure GPS settings (GPSD), update the precision to 5 which sends a fairly precise 10 character grid (or not if you want to be less accurate), set the other options as needed. Save.



        Script to handle start up and power disruptions

        Vehicle stop/start causes the rig to turn off and back on again, which causes Flrig to lose rig control.

        Startup and monitor script flrig_aprs_start.sh.
        PowerShell script for Windows use - flrig_aprs_start.ps1.

        This starts Flrig, JS8Call, and JS8CallUtilities, then monitors Flrig for rig control errors (radio has no power). When rig control error is detected it closes down the applications and waits for the rig's USB port to come back (indicating it has power again) then restarts the applications.

        This is done by monitoring the receiver DBM value from Flrig, -127 or higher is normal. If it goes to -128 rig control is lost, this is how it works with my Icom rigs.

        If JS8CallUtilities options are configured to automatically start sending the position reports to JS8Call for transmission when started, everything resumes in a running state with out intervention.



        Testing it out..

        Where on the waterfall / Hz offiset should be used? I use 2500 Hz which is above the general chat area. 

        To avoid the TX audio passing through the filter edges, enable Settings > Radio > Rig Options > Split Operation (Fake it works well with Icom rigs). JS8Call will shift the VFO and recalculate the offset on the fly so the TX audio is centered in the filters. Another option with out using Split Operation would to set the offset to 1500 Hz, and the rig VFO one kHz higher so it ends up at 2500 Hz.

        Sending a position report every 3 minutes, fairly good track from a test (aprs.fi):

        HF APRS Mobile track via JS8


        Stations which heard my 20m mobile during test - 50W into a 20m Hamstick (pskreporter.info):

        HF APRS Mobile via JS8 PSKr reports


        I decided 20m was the better band choice for now, increased solar cycle 25 activity results in good propagation during daytime and into the evening and night. A 20m hamstick matched with an un-un will cover most of the band which gives the option of SSB/voice further up the band.

        40m may be a better choice at night when D-layer absorption is not a limiting factor, and during solar minimums during the day time where it might out perform 20m. At 40m the bandwidth of a hamstick becomes quite narrow (due to the amount of loading needed) limiting operation to a small segment with the digi modes which is a trade off.


        The Ultimate Test

        HF APRS 20m JS8 Seattle WA to Fairbanks AK


        Mid May 2024 I ran this system on a road trip from Seattle WA to Fairbanks AK over 8 days and it worked perfectly!

        I got some reports via ZL1RS in New Zealand using a temporary beverage, usually earlier in the morning local time (maybe long path?).


        WSJT-X

        Maybe we get bored somewhere and want to work some digi mode DX for fun, or even put a 6m antenna on and activate a rare grid for the 6m grid chasers.


        Stable version is currently 2.7.0-rc3

        Get wsjtx_2.7.0-rc3_improved_PLUS_LINUX_amd64.deb from https://sourceforge.net/projects/wsjt-x-improved/files/WSJT-X_v2.7.0/Linux/ 

        sudo dpkg -i wsjtx_2.7.0-rc3_improved_PLUS_LINUX_amd64.deb

        If there is an missing dependancies error:

        sudo apt-get install -f
        sudo dpkg -i wsjtx_2.7.0-rc3_improved_PLUS_LINUX_amd64.deb



        Fldigi

        Fldigi supports a number of digi chat modes. 

        sudo apt-get install fldigi

        Configure the waterfall level (bottom bar > upper signal level) so its visible, and the TX level (bottom bar), if the levels are setup correctly, -3 dB should be 50% RF output power.


        Raspberry Pi Automated Startup


        In 2020 I had originally planned on using a Raspberry Pi, and wanted it auto start the applications when it was powered on and boots. I put together a couple scripts to do this, see https://github.com/lonney9/JS8AprsStart which includes some partly outdated setup info for the previous version of JS8CallUtilities.

        The missing part is having the Pi power on and off as needed


        Backstory..


        For some time I've been intrigued with APRS over HF, while the VHF APRS system is very good, and easy to use with modern rigs like my Kenwood TH-D72A you're limited to being in range of an iGate or digipeater - normally not a problem in most populated places, and even many sparsely populated places.

        When I drove from Fairbanks Alaska to Seattle in May 2014, I ran VHF APRS with a 50W rig and decent antenna on the car, with a couple of exceptions (Tok AK and Whitehorse YT) once I was out of range of the digipeater in Fairbanks the coverage was non-existent until I was half way through British Columbia where the coverage was excellent all the way to Seattle. During the trip I shared the tracking link on aprs.fi with friends, and some of them got a real kick out of watching my trip progress on a map each day, including a couple goofups I made with wrong turns, one where I had to back the car with trailer back down a street the GPS "thought" looped around, but was a dead end.

        APRS on HF? There have been a few flavors around from what I have been able to find, 300 baud packet on 30m, and PSK63 (now defunct) were the main two. There is also now APRS over VARA but it seems more complex to setup and requires a dedicated monitoring station as well.

        JS8Call overall seems to be the best choice. The functionality is built in, every station running JS8Call is a monitor, and JS8 is based on FT8 with all of its weak signal and narrow bandwidth advantages.