From df6dab6965cebb112fca1f761fa1d980134bf667 Mon Sep 17 00:00:00 2001 From: Ben Nicholson Date: Tue, 9 Jun 2026 11:03:29 +1000 Subject: [PATCH] Add PTPLogger/PTPLogger.sh --- PTPLogger/PTPLogger.sh | 73 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 PTPLogger/PTPLogger.sh diff --git a/PTPLogger/PTPLogger.sh b/PTPLogger/PTPLogger.sh new file mode 100644 index 0000000..000e8f9 --- /dev/null +++ b/PTPLogger/PTPLogger.sh @@ -0,0 +1,73 @@ +#!/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 \ No newline at end of file