summaryrefslogtreecommitdiff
path: root/recipes-navigation/gpsd/gpsd/gpsd_fixed.sh
diff options
context:
space:
mode:
Diffstat (limited to 'recipes-navigation/gpsd/gpsd/gpsd_fixed.sh')
-rw-r--r--recipes-navigation/gpsd/gpsd/gpsd_fixed.sh125
1 files changed, 125 insertions, 0 deletions
diff --git a/recipes-navigation/gpsd/gpsd/gpsd_fixed.sh b/recipes-navigation/gpsd/gpsd/gpsd_fixed.sh
new file mode 100644
index 0000000..915c7be
--- /dev/null
+++ b/recipes-navigation/gpsd/gpsd/gpsd_fixed.sh
@@ -0,0 +1,125 @@
+#!/bin/bash
+# This script filters the gpspipe -w
+# (json) output from GPSD. The GPS fix
+# is taken from the mode parameter of
+# the GPSD TPV object in the json output.
+# Values are:
+#
+# 0 Unseen
+# 1 No fix
+# 2 2D
+# 3 3D
+#
+# Fix file creation for GPS.
+# If GPS reaches expected
+# fix level, file GSP_FIXFILE is created.
+# This is to know when to set the system
+# and hardware clock, and when
+# it is safe to start ntp.
+# DEBUG=1 to set debug
+NAME=gpsd_ubx_fixed
+shopt -s expand_aliases
+alias LG="logger -t ${NAME}"
+if [[ -r /etc/default/gpsd ]] ; then
+ . /etc/default/gpsd
+else
+ echo "Must configure GPSD requirements"
+ exit 1
+fi
+
+function rm_gps_file
+{
+ if [[ -n "${GPS_FIXFILE}" ]] && [[ -f ${GPS_FIXFILE} ]] ; then
+ rm -f "${GPS_FIXFILE}"
+ fi
+}
+function kill_it
+{
+ cmd=$1
+ pid=$2
+ sig=$3
+ ((DEBUG)) && LG -p user.info "terminating $cmd(${pid}) with SIG${sig}"
+ kill -SIG${sig} ${pid} >/dev/null 2>&1
+ result=$?
+ ((DEBUG)) && LG -p user.info "kill -SIG${sig} ${pid} result is $result"
+}
+
+# Most exits are errors, so remove the GPS fix file.
+trap rm_gps_file EXIT
+
+if ! [[ -x /usr/bin/gpspipe ]] ; then
+ LG -p user.err "Please install gpspipe"
+ exit 0
+fi
+
+# Terminate gpspipe after 10 seconds if it is our child
+# gpspipe has issues with terminals and stalling on terminal
+# read of the console.
+(
+ sleep 10
+ # We use BASHPID because our parent, $$, may have already exited, and
+ # then ps will not work. BASHPID is the current subshell.
+ ppid=$BASHPID
+ pgid=$(ps --no-heading -o pgid -p $ppid)
+
+ if ((${#pgid} == 0)) ; then
+ LG -p user.err "Could not find a pgid for $ppid"
+ ps -fjp $ppid | LG -p user.error
+ fi
+
+ # pgrep does not work during boot.
+ pgrpmemb=$(ps --no-heading -o pgid,pid,comm -e | grep '^ *'"${pgid}"' *' | sed -r 's/^ *[0-9]+ *//')
+ gpspipepid=$(echo "${pgrpmemb}" | egrep '[[:space:]]gpspipe$' | sed 's/[[:space:]].*//')
+
+ ((DEBUG)) && LG -p user.info "$pgid is pgid $gpspipepid is gpspipepid"
+ # Find the gpspipepid that is our grandchild
+ ((didkill=0))
+
+ # for loop is in case gpspipepid has children.
+ for p in ${gpspipepid} ; do
+ if ((${#p})) ; then
+ kill_it gpspipe $p TERM
+ ((didkill=p))
+ break
+ fi
+ done
+ if ((didkill == 0)) ; then
+ exit 0
+ fi
+ # Do a sigkill to be sure.
+ sleep 2
+ kill_it gpspipe $didkill KILL
+) &
+
+fix=""
+status=""
+
+# egrep in busybox has a horrible buffering issue.
+# echo My shell pid is $$
+# echo Place data fix, status
+fix="$(gpspipe -w | grep -m1 '{"class":"TPV","device":"/dev/gps0",.*"mode":' | sed -e 's/.*"mode"://' -e 's/[},].*//')"
+
+if ((${#fix} == 0)) ; then
+ LG -p user.err "No data from GPS"
+ exit 1
+fi
+
+
+# echo "status is $status. fixOK is $fixOK"
+
+
+# echo "fix is $fix. Is it in $GPSFIX?"
+# Test the GPS fixOK
+for x in $GPSFIX ; do
+ # echo test $x with $fix
+ if [[ $x == $fix ]] ; then
+ LG -p user.info "GPS has fix $fix found in list GPSFIX: $GPSFIX"
+ echo $x >"${GPS_FIXFILE}"
+ GPS_FIXFILE=""
+ exit 0
+ fi
+done
+
+LG -p user.info "GPS fix is bad: $fix and should be one of: $GPSFIX"
+# Start later
+exit 1