gps: test_gps

File test_gps, 6.7 KB (added by tharvey, 15 months ago)

NMEA test script

Line 
1#!/bin/sh
2#
3# NMEA references:
4# - http://www.gpsinformation.org/dale/nmea.htm
5# - http://aprs.gids.nl/nmea
6
7# see http://trac.gateworks.com/wiki/gps#hardware
8DEV=${1:-/dev/ttymxc4}
9BAUD=${2:-4800}
10# Type: GPS|GLONASS
11[ "$TYPE" ] || TYPE=GPS
12
13# verbosity
14[ $VERBOSE ] || VERBOSE=0
15
16#Estimated Moving Avgerage: EMA = EMA * (1 – APLHA) + NEWAVG * ALPHA
17#Variables for calculating moving averages:
18#SRN_EMA: EMA for sattellite signal strength
19#SAT_EMA: EMA for number of visible sattellites
20SRN_AVG=0 #srn_sum / srn_cnt
21ALPHA=$(echo ${3:-10} | awk '{alph = 1/$1; print alph}') #default of last 10
22
23echo "Dev :$DEV"
24echo "Baud:$BAUD"
25echo "Type:$TYPE"
26
27# configure serial port
28stty -F $DEV $BAUD cs8
29
30# $1 level
31# $2 message
32debug() {
33        [ $VERBOSE -ge $1 ] && echo $2
34}
35
36# GPS DOP and active satellites
37# see http://www.gpsinformation.org/dale/nmea.htm#GSA
38gsa() {
39        local i x sats type fix pdop hdop vdop
40
41        debug 1 "gsa: $1"
42        oIFS=${IFS}
43        IFS=','
44        i=0
45        sats=
46        for x in $1; do
47                case $i in
48                        0) id=${x:1:2};;
49                        1) type=$x;;
50                        2) fix=$x;;
51                        3) sats="$sats$x ";;
52                        4) sats="$sats$x ";;
53                        5) sats="$sats$x ";;
54                        6) sats="$sats$x ";;
55                        7) sats="$sats$x ";;
56                        8) sats="$sats$x ";;
57                        9) sats="$sats$x ";;
58                        10) sats="$sats$x ";;
59                        11) sats="$sats$x ";;
60                        12) sats="$sats$x ";;
61                        13) sats="$sats$x ";;
62                        14) sats="$sats$x ";;
63                        15) pdop=$x;;
64                        16) hdop=$x;;
65                        17) vdop=$x;;
66                esac
67                i=$((i+1))
68        done
69
70        case $type in
71                M) type=manual;;
72                A) type=automatic;;
73        esac
74        case $fix in
75                2) qual=2D;; #2D
76                3) qual=3D;; #3D
77                *) qual=;;
78        esac
79
80        [ ${fix} -ne 1 ] && echo "GSA: $qual $type $sats"
81        IFS=${oIFS}
82}
83
84# Fix data
85# see http://www.gpsinformation.org/dale/nmea.htm#GGA
86gga() {
87        local i x time lat lon type svs prec alt altm
88
89        debug 1 "gga: $1"
90        oIFS=${IFS}
91        IFS=','
92        i=0
93        for x in $1; do
94                case $i in
95                        0) id=${x:1:2};;
96                        1) time=$x;;
97                        2) lat=$x;;
98                        3) lat=$lat$x;;
99                        4) lon=$x;;
100                        5) lon=$lon$x;;
101                        6) type=$x;;
102                        7) svs=$x;;
103                        8) prec=$x;;
104                        9) alt=$x;;
105                esac
106                i=$((i+1))
107        done
108
109        case $type in
110                1) qual=GPS;; #GPS 2D/3D
111                2) qual=DGPS;; #DGPS
112                6) qual=Estimaed;;
113                *) qual=;;
114        esac
115
116        [ ${type} -ne 0 ] && echo "$qual Fix: $time: $svs $lat/$lon/$alt"
117        IFS=${oIFS}
118}
119
120# Satellites in View
121# see http://www.gpsinformation.org/dale/nmea.htm#GGA
122gsv() {
123        local i x s msgtot msgnum inview crc id line
124        local prn1 elev1 az1 snr1
125        local prn2 elev2 az2 snr2
126        local prn3 elev3 az3 snr3
127        local prn4 elev4 az4 snr4
128
129        debug 1 "gsv: $1"
130        line=${1%%\**}
131        oIFS=${IFS}
132        IFS=','
133        i=0
134        for x in $line; do
135                case $i in
136                        0) id=${x:1:2};;
137                        1) msgtot=$x;;
138                        2) msgnum=$x
139                                [ $msgnum -eq 1 ] && {
140                                        debug 2 "GPS DATA BEGINS:"
141                                        srn_cnt=0
142                                        srn_sum=0
143                                        sat_cnt=0
144                                }
145                                ;;
146                        3) inview=$x;;
147                        4) prn1=$x;;
148                        5) elev1=$x;;
149                        6) sz1=$x;;
150                        7) snr1=$x;;
151                        8) prn2=$x;;
152                        9) elev2=$x;;
153                        10) sz2=$x;;
154                        11) snr2=$x;;
155                        12) prn3=$x;;
156                        13) elev3=$x;;
157                        14) sz3=$x;;
158                        15) snr3=$x;;
159                        16) prn4=$x;;
160                        17) elev4=$x;;
161                        18) sz4=$x;;
162                        19) snr4=${x%%\**}; crc=${x##*\*};;
163                esac
164                case $i in
165                        7|11|15|19) 
166                                [ $i -eq 19 ] && x=$snr4
167                                [ "$x" ] && [ $x -gt 0 ] && {
168                                        srn_cnt=$(( srn_cnt + 1 ))
169                                        srn_sum=$(( srn_sum + $((10#$x)) ))
170                                };;
171                esac
172                i=$((i+1))
173        done
174
175        case $TYPE in
176                GPS) [ "$id" = "GP" ] || continue;;
177                GLONASS) [ "$id" = "GL" ] || continue;;
178        esac
179
180        s=$(( ((msgnum-1)) *4))
181        #debug 2 "gsv: $1"
182        debug 2 "Message $msgnum of $msgtot"
183        [ "$snr1" -o "$snr2" -o "$snr3" -o "$snr4" ] || echo "-- No Satellites --"
184        [ "$snr1" ] && sat_cnt=$((sat_cnt+1)) && [ $VERBOSE -gt 0 ] && printf "%02d:%s:%s:%s:%s\n" $((s+1)) $prn1 $elev1 $sz1 $snr1
185        [ "$snr2" ] && sat_cnt=$((sat_cnt+1)) && [ $VERBOSE -gt 0 ] && printf "%02d:%s:%s:%s:%s\n" $((s+2)) $prn2 $elev2 $sz2 $snr2
186        [ "$snr3" ] && sat_cnt=$((sat_cnt+1)) && [ $VERBOSE -gt 0 ] && printf "%02d:%s:%s:%s:%s\n" $((s+3)) $prn3 $elev3 $sz3 $snr3
187        [ "$snr4" ] && sat_cnt=$((sat_cnt+1)) && [ $VERBOSE -gt 0 ] && printf "%02d:%s:%s:%s:%s\n" $((s+4)) $prn4 $elev4 $sz4 $snr4
188
189        [ $msgnum -eq $msgtot ] && {
190                # echo "srn_cnt is $srn_cnt"
191                [ "$srn_cnt" -eq 0 ] && SRN_AVG=0
192                [ "$srn_cnt" -ne 0 ] && SRN_AVG=$(echo "$srn_sum $srn_cnt" | awk '{avg = $1/$2; print avg}')
193                [ "$SRN_EMA" ] || SRN_EMA=$SRN_AVG
194                SRN_EMA=$(echo "$SRN_AVG $SRN_EMA $ALPHA" | awk '{EMA = $2 * (1 - $3) + $1 * $3; print EMA}')
195                [ "$SAT_EMA" ] || SAT_EMA=$srn_cnt
196                SAT_EMA=$(echo "$srn_cnt $SAT_EMA $ALPHA" | awk '{EMA = $2 * (1 - $3) + $1 * $3; print EMA}')
197                printf "GSV: %s: SNR avg: %s, Visible avg: %s,\
198 Current: %s\n" $TYPE $SRN_EMA $SAT_EMA $sat_cnt
199        }
200
201        IFS=${oIFS}
202}
203
204oIFS=${IFS}
205
206while [ 1 ]; do
207        IFS='' read -r line
208        debug 3 "${#line}: $line"
209
210        # use case statement for easy regex
211        case "$line" in
212                *GSV,*) gsv "$line";;
213                *GSA,*) gsa "$line";;
214                *GGA,*) gga "$line";;
215        esac
216done < $DEV
217
218IFS=$oIFS