Files
RiedelScripts/PTPLogger/PTPLogger.sh
T
bsncubed 71ab73a3f8 revert 3e88e25a87
revert Update PTPLogger/PTPLogger.sh
2026-06-17 18:33:02 +10:00

73 lines
2.0 KiB
Bash

#!/bin/bash
#### Tested running on a 1232
SOCK="/var/run/ptp4l_media1"
HOST=$(hostname)
LOGFILE="ptp_media1.log"
WINDOW=60
offsets=()
delays=()
freqs=()
prev_offset=""
prev_time=""
while true; do
now_fmt=$(date +"%b %d %T")
uptime=$(awk '{print $1}' /proc/uptime)
now_ns=$(date +%s%N)
# --- get offset ---
ts_np=$(pmc -u -s $SOCK "GET TIME_STATUS_NP")
offset=$(echo "$ts_np" | awk '/master_offset/ {print $2}')
# --- get delay ---
cds=$(pmc -u -s $SOCK "GET CURRENT_DATA_SET")
delay=$(echo "$cds" | awk '/meanPathDelay/ {print $2}')
# --- compute freq (ns/sec ≈ ppb-like behaviour) ---
if [[ -n "$prev_offset" ]]; then
dt=$((now_ns - prev_time))
doffset=$((offset - prev_offset))
freq=$(awk -v d="$doffset" -v t="$dt" 'BEGIN {printf "%.0f", (d / t) * 1e9}')
else
freq=0
fi
prev_offset=$offset
prev_time=$now_ns
# store
offsets+=("$offset")
delays+=("$delay")
freqs+=("$freq")
# trim window
if [ ${#offsets[@]} -gt $WINDOW ]; then
offsets=("${offsets[@]:1}")
delays=("${delays[@]:1}")
freqs=("${freqs[@]:1}")
fi
# --- stats ---
rms=$(printf "%s\n" "${offsets[@]}" | awk '{s+=$1*$1} END {printf "%.0f", sqrt(s/NR)}')
max=$(printf "%s\n" "${offsets[@]}" | \
awk 'BEGIN{m=0}{if($1>m)m=$1;if(-$1>m)m=-$1}END{print m}')
freq_avg=$(printf "%s\n" "${freqs[@]}" | awk '{s+=$1} END {printf "%.0f", s/NR}')
freq_std=$(printf "%s\n" "${freqs[@]}" | \
awk '{s+=$1; ss+=$1*$1} END {m=s/NR; printf "%.0f", sqrt(ss/NR - m*m)}')
delay_avg=$(printf "%s\n" "${delays[@]}" | awk '{s+=$1} END {printf "%.0f", s/NR}')
delay_std=$(printf "%s\n" "${delays[@]}" | \
awk '{s+=$1; ss+=$1*$1} END {m=s/NR; printf "%.0f", sqrt(ss/NR - m*m)}')
line="$now_fmt $HOST ptp4l@media1[$$]: [$uptime] rms $rms max $max freq $freq_avg +/- $freq_std delay $delay_avg +/- $delay_std"
echo "$line" | tee -a "$LOGFILE"
sleep 1
done