#!/bin/bash # Check PPS and if GPS NMEA is Acquired # Files; # Acquired status count file ACNTFILE="/var/local/lib/gps-chk/acqrd-cnt" # Previous acquired status file ASTATFILE="/var/local/lib/gps-chk/acqrd-stat" # PPS count file PCNTFILE="/var/local/lib/gps-chk/pps-cnt" # Serial port DEV="/dev/Your_TtySx" # Current acquired status CURASTAT=$( /usr/local/sbin/chk-gps-acqrd.sh ) # Previous status PREVASTAT=$( /bin/cat "${ASTATFILE}" ) # Not acquired status count ASTATCNT=$( /bin/cat "${ACNTFILE}" ) # Max not acquired count MAXACNT=2 # Current sync quality CURSYNC=$( /usr/local/sbin/ntpeval ) # PPS count PPSCNT=$( /bin/cat "${PCNTFILE}" ) # PPS Reset delay. RSTDLY=8 # Check PPS; REACH=$( /usr/bin/ntpq -p | egrep "^[ *+](SHM|127[.]127[.]28[.])" | awk '{print $7}' ) # Force REACH 0 if not spresent if [ ! $REACH ] then REACH=0 fi # Convert to decimal REACH=$(( 8#$REACH )) # Check PPS reach if [ $(( $REACH%2 )) -eq 0 ] then # Bits xxxx xxx0; even => Missing logger "chk-gps: PPS Failed" if [ $PPSCNT -gt 0 ] && [ $(( $PPSCNT%$RSTDLY )) -eq 0 ] then # Garmin may have crashed: Reset Garmin sleep 10 echo $REACH | mail -s "Garmin PPS Reset" Your_Email_Address logger "chk-gps: PPS Reset" /usr/local/sbin/sndnul -d "${DEV}" -t 2 sleep 5 fi let PPSCNT+=1 echo $PPSCNT > "${PCNTFILE}" # Exit script exit 0 else # Bits xxxx xxx1; odd => OK if [ $PPSCNT -ne 0 ] then # Was missing logger "chk-gps: PPS OK" echo 0 > "${PCNTFILE}" fi fi # Check NMEA if [ $CURASTAT -eq 0 ] then # Not acquired let ASTATCNT+=1 echo $ASTATCNT > "${ACNTFILE}" if [ $ASTATCNT -gt $MAXACNT ] && [ $CURSYNC -eq 0 ] && [ $PREVASTAT -ne 0 ] then # Reset Garmin logger "chk-gps: NMEA Failed" /usr/local/sbin/sndnul -d "${DEV}" -t 2 sleep 5 echo 0 > "${ASTATFILE}" fi else # Acquired if [ $ASTATCNT -ne 0 ] then # Was not acquired echo 0 > "${ACNTFILE}" fi if [ $PREVASTAT -ne 1 ] then logger "chk-gps: NMEA OK" echo 1 > "${ASTATFILE}" fi fi