source: Sophya/trunk/Poubelle/archTOI.old/gpsparser.cc@ 372

Last change on this file since 372 was 350, checked in by ansari, 26 years ago

Gestion TRANGE, MJD0, PERECH....

File size: 3.1 KB
Line 
1// gpsparser.cc
2// Eric Aubourg CEA/DAPNIA/SPP juillet 1999
3
4
5#include <string.h>
6#include <stdio.h>
7
8#include "gpsparser.h"
9
10GPSParser::GPSParser() {
11 *gpsString = 0;
12 stringOk = false;
13 gpsutc = 0;
14 gpslat = 0;
15 gpslong = 0;
16 quality = 0;
17 nsat = 0;
18 hdop = 0;
19 alt = 0;
20 gsep = 0;
21}
22
23GPSParser::~GPSParser() {
24}
25
26bool GPSParser::hasTime() {
27 return (stringOk && gpsutc>0);
28}
29
30bool GPSParser::hasGPSTime() {
31 return (stringOk && gpsutc>0 && quality>0 && nsat>=3);
32}
33
34bool GPSParser::hasPosition() {
35 return (stringOk && quality>0 && nsat>=3);
36}
37
38bool GPSParser::hasAltitude() {
39 return (stringOk && quality>0 && nsat>=4);
40}
41
42double GPSParser::getUTC() {
43 if (!stringOk) return -99999;
44 return gpsutc;
45}
46
47double GPSParser::getLatitude() {
48 if (!stringOk) return -99999;
49 if (quality == 0 || nsat<3) return -99999;
50 return gpslat;
51}
52
53double GPSParser::getLongitude() {
54 if (!stringOk) return -99999;
55 if (quality == 0 || nsat<3) return -99999;
56 return gpslong;
57}
58
59double GPSParser::getAltitude() {
60 if (!stringOk) return -99999;
61 if (quality == 0 || nsat<4) return -99999;
62 return alt;
63}
64
65// GPGGA string :
66// $hhmmss.ss,ddmm.mmmm,n,dddmm.mmmm,e,q,ss,y.y,a.a,z,,
67// $104020,3740.712,N,00400.781,W,0,00,01.0,0003,M,-050,M,,
68
69#include <fstream.h>
70#include <iomanip.h>
71//ofstream gpsdump("gpsdump");
72//ofstream gpsdata("gpsdata");
73//double outc = 0; double jr = 0;
74
75void GPSParser::ProcessBlock(block_type_gps* blk) {
76 strncpy(gpsString, blk->gps, 80);
77 char* p = gpsString;
78// gpsdump << p ; if (p[strlen(p)-1] != '\n') gpsdump << '\n';
79 char* fence = p+80;
80 stringOk = false;
81 if (*p!='$') return;
82 p++;
83
84 // UTC
85 double t;
86 sscanf(p, "%lg", &t);
87 int h = int(t/10000); t -= h*10000;
88 int m = int(t/100); t -= m*100;
89 gpsutc = h*3600. + m*60. + t;
90 p += 6;
91 if (*p != ',') return;
92 p++;
93 if (p>=fence) return;
94
95 // LATITUDE
96 sscanf(p, "%lg", &t);
97 int d = int(t/100); t -= d*100;
98 t = d + t/60;
99 p += 8;
100 if (*p != ',') return;
101 p++;
102 if (*p == 'S') t = -t;
103 gpslat = t;
104 p++;
105 if (*p != ',') return;
106 p++;
107 if (p>=fence) return;
108
109 // LONGITUDE
110 sscanf(p, "%lg", &t);
111 d = int(t/100); t -= d*100;
112 t = d + t/60;
113 p += 9;
114 if (*p != ',') return;
115 p++;
116 if (*p == 'W') t = -t;
117 gpslong = t;
118 p++;
119 if (*p != ',') return;
120 p++;
121 if (p>=fence) return;
122
123 // QUALITY
124 quality = *p - '0';
125 if (quality < 0 || quality > 9) return;
126 p++;
127 if (*p != ',') return;
128 p++;
129 if (p>=fence) return;
130
131 // NSAT
132 sscanf(p, "%d", &nsat);
133 p += 2;
134 if (*p != ',') return;
135 p++;
136
137 // HDOP
138 sscanf(p, "%lg", &hdop);
139 while (*p != ',' && p<fence) p++;
140 if (*p != ',') return;
141 p++;
142
143 // Altitude
144 sscanf(p, "%lg", &alt);
145 while (*p != ',' && p<fence) p++;
146 if (*p != ',') return;
147 p++;
148 if (*p != 'M') return;
149 p++;
150 if (*p != ',') return;
151 p++;
152
153 // Geoid separation
154 sscanf(p, "%lg", &gsep);
155 while (*p != ',' && p<fence) p++;
156 if (*p != ',') return;
157 p++;
158 if (*p != 'M') return;
159
160// if (gpsutc < outc) jr += 86400;
161// outc = gpsutc;
162// gpsdata << setprecision(10) << gpsutc + jr << " " << gpslat << " " << gpslong << " " << quality << " " << nsat << '\n';
163
164 stringOk = true;
165}
Note: See TracBrowser for help on using the repository browser.