#!/bin/sh # # Path tracking by GPS waypoints on Neo/Freerunner GTA02 # Use CTRL+C to stop # # $ gpx [sample-interval [fix-tryout-interval]] # # The intervals are measured in seconds. If no values are # given, the defaultvalues will be taken. # - sample-interval = 30sec # - fix-tryout-interval = 90sec # # 20090418 saves output as GPX file, validation can be made # xmllint --noout --schema http://www.topografix.com/GPX/1/1/gpx.xsd sample.gpx # intervals configurable by parameters # 20090511 saves output as GPX Waypoint and GPX Route # 20090705 bugfix invalid route xml format # ############################################################### # use only initialized variables set -o nounset GPSPOWER=/sys/bus/platform/devices/neo1973-pm-gps.0/pwron GPSDEVICE=/dev/ttySAC1 GPSDATATYPE=\$GPGLL GPSDATA="" GPSSTATE="" GPSWP=/media/card/gps/wp-`date +%Y%m%d-%H%M`.gpx GPSROUTE=/media/card/gps/route-`date +%Y%m%d-%H%M`.gpx GPSFIXRETRY=90 GPSINTERVAL=30 GPSLOG=/media/card/gps/gps.log GPSSIVTYPE=\$GPGSV APGSONLINE=/media/card/gps/gps-online if [ $# -ge 1 ]; then GPSINTERVAL=$1 echo "GPS sample interval ${GPSINTERVAL} sec" if [ $# -eq 2 ]; then GPSFIXRETRY=$2 fi fi ############################################################## CleanUp() { # shutdown GPS chip for powersaving echo "0" > $GPSPOWER # write gpx footer echo "" >> $GPSWP echo " " >> $GPSROUTE echo "" >> $GPSROUTE # manually sync the disk sync trap - INT TERM EXIT echo "GPS cleanup ..." exit } trap CleanUp INT TERM EXIT ############################################################## # begin trackrecording rm -f $GPSWP > /dev/null 2>&1 rm -f $GPSLOG > /dev/null 2>&1 # write gpx header echo "" >> $GPSWP echo "> $GPSWP echo " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"" >> $GPSWP echo " xsi:schemaLocation=\"http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd\"" >> $GPSWP echo ">" >> $GPSWP echo "" >> $GPSROUTE echo "> $GPSROUTE echo " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"" >> $GPSROUTE echo " xsi:schemaLocation=\"http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd\"" >> $GPSROUTE echo ">" >> $GPSROUTE echo "" >> $GPSROUTE ############################################################# # reset GPS chip - if necessary echo "Initializing gps ..." if [ $(cat $GPSPOWER) -eq 1 ]; then echo "Stop already running gps operations..." echo "0" > $GPSPOWER sleep 1 fi echo "1" > $GPSPOWER sleep 1 echo "Trying assisted-gps..." ONLINE=$(ping -c 1 194.116.196.131) if [ $? -eq 0 ]; then echo "Using online assisted-gps ..." . $APGSONLINE > $GPSDEVICE sleep 1 else echo "No assisted-gps found" fi ############################################################## while true; do FIX="" ############################################################ # wait till fix found before going on while true; do SAMPLE="" while [ -z $SAMPLE ]; do SAMPLE=$(head -n 3 $GPSDEVICE | grep $GPSDATATYPE) done echo $SAMPLE >> $GPSLOG # some converter needs the complete record echo "" >> $GPSWP FIX=$( echo $SAMPLE | grep ",A,") if [ -z "$FIX" ]; then echo "No gps fix yet - wait $GPSFIXRETRY seconds and retry ..." else break # fix found - continue fi # write some feedback SIV="" while [ -z $SIV ]; do SIV=$(head -n 3 $GPSDEVICE | grep $GPSSIVTYPE) done echo $SIV >> $GPSLOG SIVNOTNULL=$( echo $SIV | grep ",1,1,00") if [ -n "$SIVNOTNULL" ]; then echo "No satellites found yet..." else SIV=$(echo $SIV | sed 's/,/ /g' | awk '{ print $4 }' ) echo "$SIV satellites in view" fi sleep $GPSFIXRETRY # no fix - wait and retry done ############################################################ # analyze & save valid gps sample GPSDATA=$(echo $SAMPLE | sed 's/,/ /g') #echo "GPSDATA $GPSDATA" PART1=$( echo $GPSDATA | awk '{ print $1 }') PART2=$( echo $GPSDATA | awk '{ print $2 }') PART3=$( echo $GPSDATA | awk '{ print $3 }') PART4=$( echo $GPSDATA | awk '{ print $4 }') PART5=$( echo $GPSDATA | awk '{ print $5 }') PART6=$( echo $GPSDATA | awk '{ print $6 }') #PART7=$( echo $GPSDATA | awk '{ print $7 }') #PART8=$( echo $GPSDATA | awk '{ print $8 }') HOURS=$(echo $PART6 | cut -c1-2) MINUTES=$(echo $PART6 | cut -c3-4) SECONDS=$(echo $PART6 | cut -c5-6) PART6=$HOURS:$MINUTES:$SECONDS #echo "GPS ${PART2}${PART3} / ${PART4}${PART5} at ${PART6} GMT" >> $GPSWP echo "GPS ${PART2}${PART3} / ${PART4}${PART5} at ${PART6} GMT" GPSLATGRAD=$(echo $PART2 | cut -c1-2) GPSLATMIN=$(echo $PART2 | cut -c3-10) GPSLONGGRAD=$(echo $PART4 | cut -c1-3) GPSLONGMIN=$(echo $PART4 | cut -c4-11) GPXLAT=$(echo "$GPSLATGRAD $GPSLATMIN" | awk '{ dezimal = $1 + $2 / 60 } END { printf("%2.8f"), dezimal }' ) GPXLONG=$(echo "$GPSLONGGRAD $GPSLONGMIN" | awk '{ dezimal = $1 + $2 / 60 } END { printf("%3.8f"), dezimal }' ) echo "" >> $GPSWP echo " " >> $GPSWP echo "" >> $GPSWP echo " " >> $GPSROUTE echo " " >> $GPSROUTE echo " " >> $GPSROUTE # wait till time for next sample sleep $GPSINTERVAL done ############################################################## # EOF ##############################################################