I have set up 12 different machines for automated testing of SatPulse. I have chosen the hardware to provide coverage along multiple dimensions: CPU architecture, OS, PHC, GPS protocol and serial connection type.

Hostname Machine OS Ethernet GPS
abondance ASUS S500SD Debian 13 I225-T1 ZED-F9P
I225-T1 BG7TBL CM55
brie Intel 12th Gen PC Ubuntu 24.04 E810-XXVDA4T NEO-F10T
gubbeen Raspberry Pi 5 Debian 13 I210-T1 M10050-KB
maasdam Minisforum MS-01 Fedora 43 I226-T1 ZED-F9T-20B
morbier Raspberry Pi CM4 Debian 11 onboard LEA-M8F
pecorino Raspberry Pi CM4 Fedora 42 onboard LEA-6T
roquefort Raspberry Pi CM4 Debian 12 onboard ZED-X20P
serpa Raspberry Pi CM5 Debian 13 onboard UM980
taleggio Raspberry Pi 5 Debian 12 TimeHAT NEO-M9N
valencay Raspberry Pi CM5 Debian 12 onboard LEA-M8T
valtellina Raspberry Pi CM5 Debian 13 onboard NEO-F10N
wensleydale Raspberry Pi CM4 Debian 12 onboard UM960

More details:

abondance
ASUS S500SD desktop (Intel B660 chipset) with an Intel i5-12400 and 64 GB RAM. It has two Intel I225-T1 PCIe cards: one is connected to an internal ArduSimple simpleRTK2B M.2, which has a u-blox ZED-F9P, and the other is connected over RS232 to a BG7TBL CM55 GPSDO, which has a LEA-M8T. This supports cross-timestamping with PTM.
brie
MSI Z690I motherboard with an Intel i9-12900K and 32 GB RAM. It has an Intel E810-XXVDA4T PCIe card. GPS is a u-blox EVK-F10T connected by USB.
gubbeen
Raspberry Pi 5 with 16 GB RAM in a Geekworm X1010 expansion board with PCIe slot, which contains an Intel I210-T1. GPS is a u-blox M10050-KB (u-blox M10 standard-precision) connected to UART0.
maasdam
Minisforum MS-01 with an Intel i5-12600H and 32 GB RAM. It has an I226-T1 PCIe card. GPS is a u-blox ZED-F9T-20B in a gnss.store USB dongle. This supports cross-timestamping with PTM.
morbier
Raspberry Pi CM4 with 8 GB RAM and 32 GB eMMC, on the official IO board. GPS is a u-blox LEA-M8F on a Timebeat sandwich board.
pecorino
Raspberry Pi CM4 with 8 GB RAM and 32 GB eMMC, on the official IO board. GPS is a u-blox LEA-6T connected to UART3.
roquefort
Raspberry Pi CM4 with 4 GB RAM and 8 GB eMMC, on a Waveshare PoE board. GPS is a u-blox EVK-X20P connected by USB.
serpa
Raspberry Pi CM5 with 2 GB RAM and NVMe SSD, on a Geekworm X1500 carrier board. GPS is a Unicore UM980 connected to UART0.
taleggio
Raspberry Pi 5 with 4 GB RAM with a Timebeat TimeHAT, which uses an Intel I226-LM. GPS is a u-blox NEO-M9N in the TimeHAT’s M.2 slot.
valencay
Raspberry Pi CM5 with 2 GB RAM and 16 GB eMMC, on the official IO board. GPS is a u-blox LEA-M8T connected to UART0.
valtellina
Raspberry Pi CM5 Lite with 8 GB RAM and NVMe SSD, on the official IO board. GPS is a u-blox NEO-F10N connected to UART0.
wensleydale
Raspberry Pi CM4 with 8 GB RAM and 8 GB eMMC, on the official IO board. GPS is a Unicore UM960 connected to UART0.

The testing uses the Ansible playbooks in the systest directory. It runs both satpulsed and chrony on the target machines, with satpulsed supplying samples for chrony. The main checks are that

  • satpulsed logs show that synchronization has been established and not lost; and
  • chrony has selected the satpulsed refclock; chrony is also configured to use highly-accurate NTP servers on the LAN, and won’t select the satpulsed refclock if it diverges too much from those NTP servers.

It also uses the clocklog.py script to produce some statistics from the clock.log about the quality of synchronization.

I also have a Grafana dashboard which shows metrics from each test machine.

Grafana dashboard showing metrics from each test machine

Updated: