pavi  0.0
Map Path Viewer
parser_nmea.bas
Go to the documentation of this file.
1 
9 
10 #INCLUDE ONCE "Gir/GLib-2.0.bi"
11 #INCLUDE ONCE "parser_nmea.bi"
12 #INCLUDE ONCE "track_loader.bi"
13 #INCLUDE ONCE "datetime.bi"
14 
15 
16 
40 CONSTRUCTOR NMEA(BYVAL Par AS TrackLoader PTR)
41 WITH *Par
42  VAR i = 0, tind = 28, t = @.Buff[0], s = CAST(ZSTRING PTR, t), check = 0
43  Dat = t
44  DO
45  SELECT CASE AS CONST t[i]
46  CASE 0 : EXIT DO
47  CASE 1 TO 31 : t[i] = 0
48  CASE ASC(",") : t[i] = 0 : Tok(tind) = @t[i+1] : tind += 1
49  CASE ASC("*")
50  IF check <> VALINT("&h" & LEFT(S[i+1], 2)) _
51  THEN Enr += 1 : ?"invalid checksum (" & Lin & "): &h";HEX(check, 2);" <> &h";LEFT(S[i+1], 2)
52  i += 2
53  CASE ASC("$")
54  check = 0 ' reset checksum
55  FOR j AS INTEGER = i+1 TO i+72
56  SELECT CASE AS CONST t[j]
57  CASE 0, 42 : EXIT FOR ' exit on end of buffer or asterix character
58  END SELECT : check XOR= t[j]
59  NEXT
60  IF t[i+3] = ASC("G") THEN
61  IF tind <> 28 THEN Enr += 1 : ?"RMC check failed (" & Lin & ") " & tind
62  tind = 0
63  IF Lin THEN Eval(@Tok(0)) ': ?hey(DaTi(@Tok(0))),hey(LaLo(@Tok(2))),hey(LaLo(@Tok(4)))
64  ELSE
65  IF tind <> 15 THEN tind = 15 : Enr += 1 : ?"GGA check failed (" & Lin & ") " & tind
66  END IF : Lin += 1
67  Tok(tind) = @t[i]
68  tind += 1
69  i += 5
70  END SELECT : i += 1
71  LOOP : .Byt = i : IF Lin THEN Eval(@Tok(0))
72  .Siz = Dat - CAST(ANY PTR, .Buff)
73 END WITH
74 END CONSTRUCTOR
75 
76 
77 
87 FUNCTION NMEA.Val_(BYVAL S AS ZSTRING PTR) AS float
88  IF S[0] = 0 THEN Enr += 1 : ?"missing number (" & Lin & ")" : RETURN NaN
89  RETURN g_ascii_strtod(*S, NULL)
90 END FUNCTION
91 
92 
93 
103 FUNCTION NMEA.DaTi(BYVAL S AS ZSTRING PTR PTR) AS DOUBLE
104  IF 6 <> LEN(*S[1]) ORELSE _
105  6 <> LEN(*S[24]) THEN Enr += 1 : ?"invalid date/time (" & Lin & ")" : RETURN NaN
106  RETURN _
107  DATESERIAL( _
108  VALINT(MID(*S[24], 5, 2)) + 2000 _
109  , VALINT(MID(*S[24], 3, 2)) _
110  , VALINT(MID(*S[24], 1, 2)) ) _
111  + TIMESERIAL( _
112  VALINT(MID(*S[1], 1, 2)) _
113  , VALINT(MID(*S[1], 3, 2)) _
114  , VALINT(MID(*S[1], 5, 2)) )
115 END FUNCTION
116 
117 
118 
130 FUNCTION NMEA.LaLo(BYVAL S AS ZSTRING PTR PTR) AS DOUBLE
131  VAR p = INSTR(*S[0], ".") - 2, f = NaN
132  SELECT CASE AS CONST PEEK(UBYTE, S[1])
133  CASE ASC("N"), ASC("E") : IF p > 1 THEN f = Deg2Rad
134  CASE ASC("S"), ASC("W") : IF p > 1 THEN f = -Deg2Rad
135  END SELECT
136  RETURN f * (g_ascii_strtod(MID(*S[0], p), NULL) / 60 + VALINT(LEFT(*S[0], p-1)))
137 END FUNCTION
138 
139 
140 
150 FUNCTION NMEA.Eval(BYVAL S AS ZSTRING PTR PTR) AS TrP PTR
151  IF *S[2] <> *S[18] ORELSE _
152  *S[3] <> *S[19] ORELSE _
153  *S[4] <> *S[20] ORELSE _
154  *S[5] <> *S[21] THEN Enr += 1 : ?"location mismatch (" & Lin & ")" : RETURN Dat
155  VAR r = NEW(Dat) TrP ( _
156  DaTi(S) _
157  , LaLo(@S[2]) _
158  , LaLo(@S[4]) _
159  , Val_(*S[9]) _
160  , Val_(*S[22]) * 1.852 _
161  , Val_(*S[23]) _
162  , 0 ,0)
163  Dat += SIZEOF(TrP)
164  RETURN r
165 END FUNCTION
166 
NMEA::Eval
FUNCTION_AS_TrP_PTR Eval(BYVAL_AS_ZSTRING_PTR_PTR)
Evaluate the lines data.
Definition: parser_nmea.bas:150
parser_nmea.bi
Header code for NMEA parser.
track_loader.bi
Header for TrackLoader,loading track files.
NMEA::NMEA
NMEA(BYVAL_AS_TrackLoader_PTR)
CTOR parsing the context of a *.NMEA file.
Definition: parser_nmea.bas:40
NMEA::LaLo
FUNCTION_AS_DOUBLE LaLo(BYVAL_AS_ZSTRING_PTR_PTR)
Evaluate longitude or latitude from text.
Definition: parser_nmea.bas:130
NMEA::Val_
FUNCTION_AS_float Val_(BYVAL_AS_ZSTRING_PTR)
Evaluate a number from a string.
Definition: parser_nmea.bas:87
NMEA::DaTi
FUNCTION_AS_DOUBLE DaTi(BYVAL_AS_ZSTRING_PTR_PTR)
Evaluate the date and time for input lines.
Definition: parser_nmea.bas:103