source: ntrip/trunk/BNC/src/satObs.cpp@ 7007

Last change on this file since 7007 was 7003, checked in by stuerze, 10 years ago

consideration of the eph flag in order to declare the Galileo clock and orbit corrections as to be valid for I/NAV

File size: 12.2 KB
Line 
1#include <iostream>
2#include <iomanip>
3#include <sstream>
4#include <newmatio.h>
5
6#include "satObs.h"
7
8using namespace std;
9
10// Constructor
11////////////////////////////////////////////////////////////////////////////
12t_clkCorr::t_clkCorr() {
13 _updateInt = 0;
14 _iod = 0;
15 _dClk = 0.0;
16 _dotDClk = 0.0;
17 _dotDotDClk = 0.0;
18}
19
20//
21////////////////////////////////////////////////////////////////////////////
22void t_clkCorr::writeEpoch(ostream* out, const QList<t_clkCorr>& corrList) {
23 if (!out || corrList.size() == 0) {
24 return;
25 }
26 out->setf(ios::fixed);
27 bncTime epoTime;
28 QListIterator<t_clkCorr> it(corrList);
29 while (it.hasNext()) {
30 const t_clkCorr& corr = it.next();
31 if (!epoTime.valid()) {
32 epoTime = corr._time;
33 *out << "> CLOCK " << epoTime.datestr(' ') << ' ' << epoTime.timestr(1,' ') << " "
34 << corr._updateInt << " "
35 << corrList.size() << ' ' << corr._staID << endl;
36 }
37 *out << corr._prn.toString() << ' ' << setw(3) << corr._iod << ' '
38 << setw(10) << setprecision(4) << corr._dClk * t_CST::c << ' '
39 << setw(10) << setprecision(4) << corr._dotDClk * t_CST::c << ' '
40 << setw(10) << setprecision(4) << corr._dotDotDClk * t_CST::c << endl;
41 }
42 out->flush();
43}
44
45//
46////////////////////////////////////////////////////////////////////////////
47void t_clkCorr::readEpoch(const string& epoLine, istream& inStream, QList<t_clkCorr>& corrList) {
48 bncTime epoTime;
49 unsigned int updateInt;
50 int numCorr;
51 string staID;
52 if (t_corrSSR::readEpoLine(epoLine, epoTime, updateInt, numCorr, staID) != t_corrSSR::clkCorr) {
53 return;
54 }
55 for (int ii = 0; ii < numCorr; ii++) {
56 t_clkCorr corr;
57 corr._time = epoTime;
58 corr._updateInt = updateInt;
59 corr._staID = staID;
60
61 string line;
62 getline(inStream, line);
63 istringstream in(line.c_str());
64
65 in >> corr._prn >> corr._iod >> corr._dClk >> corr._dotDClk >> corr._dotDotDClk;
66 if (corr._prn.system() == 'E') {
67 corr._prn.setFlags(1);// I/NAV
68 }
69
70 corr._dClk /= t_CST::c;
71 corr._dotDClk /= t_CST::c;
72 corr._dotDotDClk /= t_CST::c;
73
74 corrList.push_back(corr);
75 }
76}
77
78// Constructor
79////////////////////////////////////////////////////////////////////////////
80t_orbCorr::t_orbCorr() {
81 _updateInt = 0;
82 _iod = 0;
83 _system = 'R';
84 _xr.ReSize(3); _xr = 0.0;
85 _dotXr.ReSize(3); _dotXr = 0.0;
86}
87
88//
89////////////////////////////////////////////////////////////////////////////
90void t_orbCorr::writeEpoch(ostream* out, const QList<t_orbCorr>& corrList) {
91 if (!out || corrList.size() == 0) {
92 return;
93 }
94 out->setf(ios::fixed);
95 bncTime epoTime;
96 QListIterator<t_orbCorr> it(corrList);
97 while (it.hasNext()) {
98 const t_orbCorr& corr = it.next();
99 if (!epoTime.valid()) {
100 epoTime = corr._time;
101 *out << "> ORBIT " << epoTime.datestr(' ') << ' ' << epoTime.timestr(1,' ') << " "
102 << corr._updateInt << " "
103 << corrList.size() << ' ' << corr._staID << endl;
104 }
105 *out << corr._prn.toString() << ' ' << setw(3) << corr._iod << ' '
106 << setw(10) << setprecision(4) << corr._xr[0] << ' '
107 << setw(10) << setprecision(4) << corr._xr[1] << ' '
108 << setw(10) << setprecision(4) << corr._xr[2] << " "
109 << setw(10) << setprecision(4) << corr._dotXr[0] << ' '
110 << setw(10) << setprecision(4) << corr._dotXr[1] << ' '
111 << setw(10) << setprecision(4) << corr._dotXr[2] << endl;
112 }
113 out->flush();
114}
115
116//
117////////////////////////////////////////////////////////////////////////////
118void t_orbCorr::readEpoch(const string& epoLine, istream& inStream, QList<t_orbCorr>& corrList) {
119 bncTime epoTime;
120 unsigned int updateInt;
121 int numCorr;
122 string staID;
123 if (t_corrSSR::readEpoLine(epoLine, epoTime, updateInt, numCorr, staID) != t_corrSSR::orbCorr) {
124 return;
125 }
126 for (int ii = 0; ii < numCorr; ii++) {
127 t_orbCorr corr;
128 corr._time = epoTime;
129 corr._updateInt = updateInt;
130 corr._staID = staID;
131
132 string line;
133 getline(inStream, line);
134 istringstream in(line.c_str());
135
136 in >> corr._prn >> corr._iod
137 >> corr._xr[0] >> corr._xr[1] >> corr._xr[2]
138 >> corr._dotXr[0] >> corr._dotXr[1] >> corr._dotXr[2];
139
140 if (corr._prn.system() == 'E') {
141 corr._prn.setFlags(1);// I/NAV
142 }
143 corrList.push_back(corr);
144 }
145}
146
147//
148////////////////////////////////////////////////////////////////////////////
149void t_satCodeBias::writeEpoch(ostream* out, const QList<t_satCodeBias>& biasList) {
150 if (!out || biasList.size() == 0) {
151 return;
152 }
153 out->setf(ios::fixed);
154 bncTime epoTime;
155 QListIterator<t_satCodeBias> it(biasList);
156 while (it.hasNext()) {
157 const t_satCodeBias& satCodeBias = it.next();
158 if (!epoTime.valid()) {
159 epoTime = satCodeBias._time;
160 *out << "> CODE_BIAS " << epoTime.datestr(' ') << ' ' << epoTime.timestr(1,' ') << " "
161 << satCodeBias._updateInt << " "
162 << biasList.size() << ' ' << satCodeBias._staID << endl;
163 }
164 *out << satCodeBias._prn.toString() << " " << setw(2) << satCodeBias._bias.size();
165 for (unsigned ii = 0; ii < satCodeBias._bias.size(); ii++) {
166 const t_frqCodeBias& frqCodeBias = satCodeBias._bias[ii];
167 *out << " " << frqCodeBias._rnxType2ch << ' '
168 << setw(10) << setprecision(4) << frqCodeBias._value;
169 }
170 *out << endl;
171 }
172 out->flush();
173}
174
175//
176////////////////////////////////////////////////////////////////////////////
177void t_satCodeBias::readEpoch(const string& epoLine, istream& inStream, QList<t_satCodeBias>& biasList) {
178 bncTime epoTime;
179 unsigned int updateInt;
180 int numSat;
181 string staID;
182 if (t_corrSSR::readEpoLine(epoLine, epoTime, updateInt, numSat, staID) != t_corrSSR::codeBias) {
183 return;
184 }
185 for (int ii = 0; ii < numSat; ii++) {
186 t_satCodeBias satCodeBias;
187 satCodeBias._time = epoTime;
188 satCodeBias._updateInt = updateInt;
189 satCodeBias._staID = staID;
190
191 string line;
192 getline(inStream, line);
193 istringstream in(line.c_str());
194
195 int numBias;
196 in >> satCodeBias._prn >> numBias;
197
198 while (in.good()) {
199 t_frqCodeBias frqCodeBias;
200 in >> frqCodeBias._rnxType2ch >> frqCodeBias._value;
201 if (!frqCodeBias._rnxType2ch.empty()) {
202 satCodeBias._bias.push_back(frqCodeBias);
203 }
204 }
205
206 biasList.push_back(satCodeBias);
207 }
208}
209
210//
211////////////////////////////////////////////////////////////////////////////
212void t_satPhaseBias::writeEpoch(ostream* out, const QList<t_satPhaseBias>& biasList) {
213 if (!out || biasList.size() == 0) {
214 return;
215 }
216 out->setf(ios::fixed);
217 bncTime epoTime;
218 QListIterator<t_satPhaseBias> it(biasList);
219 while (it.hasNext()) {
220 const t_satPhaseBias& satPhaseBias = it.next();
221 if (!epoTime.valid()) {
222 epoTime = satPhaseBias._time;
223 *out << "> PHASE_BIAS " << epoTime.datestr(' ') << ' ' << epoTime.timestr(1,' ') << " "
224 << satPhaseBias._updateInt << " "
225 << biasList.size() << ' ' << satPhaseBias._staID << endl;
226 *out << " " << satPhaseBias._dispBiasConstistInd << " "
227 << satPhaseBias._MWConsistInd << endl;
228 }
229 *out << satPhaseBias._prn.toString() << ' '
230 << setw(12) << setprecision(8) << satPhaseBias._yawDeg << ' '
231 << setw(12) << setprecision(8) << satPhaseBias._yawDegRate << " "
232 << setw(2) << satPhaseBias._bias.size();
233 for (unsigned ii = 0; ii < satPhaseBias._bias.size(); ii++) {
234 const t_frqPhaseBias& frqPhaseBias = satPhaseBias._bias[ii];
235 *out << " " << frqPhaseBias._rnxType2ch << ' '
236 << setw(10) << setprecision(4) << frqPhaseBias._value << ' '
237 << setw(3) << frqPhaseBias._fixIndicator << ' '
238 << setw(3) << frqPhaseBias._fixWideLaneIndicator << ' '
239 << setw(3) << frqPhaseBias._jumpCounter;
240 }
241 *out << endl;
242 }
243 out->flush();
244}
245
246//
247////////////////////////////////////////////////////////////////////////////
248void t_satPhaseBias::readEpoch(const string& epoLine, istream& inStream, QList<t_satPhaseBias>& biasList) {
249 bncTime epoTime;
250 unsigned int updateInt;
251 int numSat;
252 string staID;
253 unsigned int dispInd;
254 unsigned int mwInd;
255 if (t_corrSSR::readEpoLine(epoLine, epoTime, updateInt, numSat, staID) != t_corrSSR::phaseBias) {
256 return;
257 }
258 for (int ii = 0; ii <= numSat; ii++) {
259 t_satPhaseBias satPhaseBias;
260 satPhaseBias._time = epoTime;
261 satPhaseBias._updateInt = updateInt;
262 satPhaseBias._staID = staID;
263
264 string line;
265 getline(inStream, line);
266 istringstream in(line.c_str());
267
268 if (ii == 0) {
269 in >> dispInd >> mwInd;
270 continue;
271 }
272 satPhaseBias._dispBiasConstistInd = dispInd;
273 satPhaseBias._MWConsistInd = mwInd;
274
275 int numBias;
276 in >> satPhaseBias._prn >> satPhaseBias._yawDeg >> satPhaseBias._yawDegRate
277 >> numBias;
278
279 while (in.good()) {
280 t_frqPhaseBias frqPhaseBias;
281 in >> frqPhaseBias._rnxType2ch >> frqPhaseBias._value
282 >> frqPhaseBias._fixIndicator >> frqPhaseBias._fixWideLaneIndicator
283 >> frqPhaseBias._jumpCounter;
284 if (!frqPhaseBias._rnxType2ch.empty()) {
285 satPhaseBias._bias.push_back(frqPhaseBias);
286 }
287 }
288
289 biasList.push_back(satPhaseBias);
290 }
291}
292
293//
294////////////////////////////////////////////////////////////////////////////
295void t_vTec::write(ostream* out, const t_vTec& vTec) {
296 if (!out || vTec._layers.size() == 0) {
297 return;
298 }
299 out->setf(ios::fixed);
300 bncTime epoTime = vTec._time;
301 *out << "> VTEC " << epoTime.datestr(' ') << ' ' << epoTime.timestr(1,' ') << " "
302 << vTec._updateInt << " "
303 << vTec._layers.size() << ' ' << vTec._staID << endl;
304 for (unsigned ii = 0; ii < vTec._layers.size(); ii++) {
305 const t_vTecLayer& layer = vTec._layers[ii];
306 *out << setw(2) << ii+1 << ' '
307 << setw(2) << layer._C.Nrows()-1 << ' '
308 << setw(2) << layer._C.Ncols()-1 << ' '
309 << setw(10) << setprecision(1) << layer._height << endl
310 << setw(10) << setprecision(4) << layer._C
311 << setw(10) << setprecision(4) << layer._S;
312 }
313 out->flush();
314}
315
316//
317////////////////////////////////////////////////////////////////////////////
318void t_vTec::read(const string& epoLine, istream& inStream, t_vTec& vTec) {
319 bncTime epoTime;
320 unsigned int updateInt;
321 int numLayers;
322 string staID;
323 if (t_corrSSR::readEpoLine(epoLine, epoTime, updateInt, numLayers, staID) != t_corrSSR::vTec) {
324 return;
325 }
326 if (numLayers <= 0) {
327 return;
328 }
329 vTec._time = epoTime;
330 vTec._updateInt = updateInt;
331 vTec._staID = staID;
332 for (int ii = 0; ii < numLayers; ii++) {
333 t_vTecLayer layer;
334
335 string line;
336 getline(inStream, line);
337 istringstream in(line.c_str());
338
339 int dummy, maxDeg, maxOrd;
340 in >> dummy >> maxDeg >> maxOrd >> layer._height;
341
342 layer._C.ReSize(maxDeg+1, maxOrd+1);
343 layer._S.ReSize(maxDeg+1, maxOrd+1);
344
345 for (int iDeg = 0; iDeg <= maxDeg; iDeg++) {
346 for (int iOrd = 0; iOrd <= maxOrd; iOrd++) {
347 inStream >> layer._C[iDeg][iOrd];
348 }
349 }
350 for (int iDeg = 0; iDeg <= maxDeg; iDeg++) {
351 for (int iOrd = 0; iOrd <= maxOrd; iOrd++) {
352 inStream >> layer._S[iDeg][iOrd];
353 }
354 }
355
356 vTec._layers.push_back(layer);
357 }
358}
359
360//
361////////////////////////////////////////////////////////////////////////////
362t_corrSSR::e_type t_corrSSR::readEpoLine(const string& line, bncTime& epoTime,
363 unsigned int& updateInt, int& numEntries,
364 string& staID) {
365
366 istringstream inLine(line.c_str());
367
368 char epoChar;
369 string typeString;
370 int year, month, day, hour, min;
371 double sec;
372
373 inLine >> epoChar >> typeString
374 >> year >> month >> day >> hour >> min >> sec >> updateInt >> numEntries >> staID;
375
376 if (epoChar == '>') {
377 epoTime.set(year, month, day, hour, min, sec);
378 if (typeString == "CLOCK") {
379 return clkCorr;
380 }
381 else if (typeString == "ORBIT") {
382 return orbCorr;
383 }
384 else if (typeString == "CODE_BIAS") {
385 return codeBias;
386 }
387 else if (typeString == "PHASE_BIAS") {
388 return phaseBias;
389 }
390 else if (typeString == "VTEC") {
391 return vTec;
392 }
393 }
394
395 return unknown;
396}
Note: See TracBrowser for help on using the repository browser.