73 lines
2.0 KiB
Bash
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 |