source: ntrip/trunk/BNC/src/rinex/rnxnavfile.cpp@ 7637

Last change on this file since 7637 was 7208, checked in by stuerze, 10 years ago

minor changes to decide between erroneous and outdated ephemerides during the ephemeris check

File size: 8.7 KB
Line 
1// Part of BNC, a utility for retrieving decoding and
2// converting GNSS data streams from NTRIP broadcasters.
3//
4// Copyright (C) 2007
5// German Federal Agency for Cartography and Geodesy (BKG)
6// http://www.bkg.bund.de
7// Czech Technical University Prague, Department of Geodesy
8// http://www.fsv.cvut.cz
9//
10// Email: euref-ip@bkg.bund.de
11//
12// This program is free software; you can redistribute it and/or
13// modify it under the terms of the GNU General Public License
14// as published by the Free Software Foundation, version 2.
15//
16// This program is distributed in the hope that it will be useful,
17// but WITHOUT ANY WARRANTY; without even the implied warranty of
18// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19// GNU General Public License for more details.
20//
21// You should have received a copy of the GNU General Public License
22// along with this program; if not, write to the Free Software
23// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
24
25/* -------------------------------------------------------------------------
26 * BKG NTRIP Client
27 * -------------------------------------------------------------------------
28 *
29 * Class: t_rnxNavFile
30 *
31 * Purpose: Reads RINEX Navigation File
32 *
33 * Author: L. Mervart
34 *
35 * Created: 24-Jan-2012
36 *
37 * Changes:
38 *
39 * -----------------------------------------------------------------------*/
40
41#include <iostream>
42#include <newmatio.h>
43#include "rnxnavfile.h"
44#include "bnccore.h"
45#include "bncutils.h"
46#include "ephemeris.h"
47
48using namespace std;
49
50// Constructor
51////////////////////////////////////////////////////////////////////////////
52t_rnxNavFile::t_rnxNavHeader::t_rnxNavHeader() {
53 _version = 0.0;
54 _glonass = false;
55}
56
57// Destructor
58////////////////////////////////////////////////////////////////////////////
59t_rnxNavFile::t_rnxNavHeader::~t_rnxNavHeader() {
60}
61
62// Read Header
63////////////////////////////////////////////////////////////////////////////
64t_irc t_rnxNavFile::t_rnxNavHeader::read(QTextStream* stream) {
65 while (stream->status() == QTextStream::Ok && !stream->atEnd()) {
66 QString line = stream->readLine();
67 if (line.isEmpty()) {
68 continue;
69 }
70 QString value = line.left(60).trimmed();
71 QString key = line.mid(60).trimmed();
72 if (key == "END OF HEADER") {
73 break;
74 }
75 else if (key == "RINEX VERSION / TYPE") {
76 QTextStream in(value.toAscii(), QIODevice::ReadOnly);
77 in >> _version;
78 if (value.indexOf("GLONASS") != -1) {
79 _glonass = true;
80 }
81 }
82 }
83
84 return success;
85}
86
87// Constructor
88////////////////////////////////////////////////////////////////////////////
89t_rnxNavFile::t_rnxNavFile(const QString& fileName, e_inpOut inpOut) {
90 _inpOut = inpOut;
91 _stream = 0;
92 _file = 0;
93 if (_inpOut == input) {
94 openRead(fileName);
95 }
96 else {
97 openWrite(fileName);
98 }
99}
100
101// Open for input
102////////////////////////////////////////////////////////////////////////////
103void t_rnxNavFile::openRead(const QString& fileName) {
104
105 _fileName = fileName; expandEnvVar(_fileName);
106 _file = new QFile(_fileName);
107 _file->open(QIODevice::ReadOnly | QIODevice::Text);
108 _stream = new QTextStream();
109 _stream->setDevice(_file);
110
111 _header.read(_stream);
112 this->read(_stream);
113}
114
115// Open for output
116////////////////////////////////////////////////////////////////////////////
117void t_rnxNavFile::openWrite(const QString& fileName) {
118
119 _fileName = fileName; expandEnvVar(_fileName);
120 _file = new QFile(_fileName);
121 _file->open(QIODevice::WriteOnly | QIODevice::Text);
122 _stream = new QTextStream();
123 _stream->setDevice(_file);
124}
125
126// Destructor
127////////////////////////////////////////////////////////////////////////////
128t_rnxNavFile::~t_rnxNavFile() {
129 close();
130 for (unsigned ii = 0; ii < _ephs.size(); ii++) {
131 delete _ephs[ii];
132 }
133}
134
135// Close
136////////////////////////////////////////////////////////////////////////////
137void t_rnxNavFile::close() {
138 delete _stream; _stream = 0;
139 delete _file; _file = 0;
140}
141
142// Read File Content
143////////////////////////////////////////////////////////////////////////////
144void t_rnxNavFile::read(QTextStream* stream) {
145
146 while (stream->status() == QTextStream::Ok && !stream->atEnd()) {
147 QString line = stream->readLine();
148 if (line.isEmpty()) {
149 continue;
150 }
151 QStringList hlp = line.split(QRegExp("\\s+"), QString::SkipEmptyParts);
152 QString prn;
153 if (version() >= 3.0) {
154 prn = hlp.at(0);
155 }
156 else {
157 if (glonass()) {
158 prn = QString("R%1").arg(hlp.at(0).toInt(), 2, 10, QChar('0'));
159 }
160 else {
161 prn = QString("G%1").arg(hlp.at(0).toInt(), 2, 10, QChar('0'));
162 }
163 }
164 t_eph* eph = 0;
165 QStringList lines; lines << line;
166 if (prn[0] == 'G') {
167 for (int ii = 1; ii < 8; ii++) {
168 lines << stream->readLine();
169 }
170 eph = new t_ephGPS(version(), lines);
171 }
172 else if (prn[0] == 'R') {
173 for (int ii = 1; ii < 4; ii++) {
174 lines << stream->readLine();
175 }
176 eph = new t_ephGlo(version(), lines);
177 }
178 else if (prn[0] == 'E') {
179 for (int ii = 1; ii < 8; ii++) {
180 lines << stream->readLine();
181 }
182 eph = new t_ephGal(version(), lines);
183 }
184 else if (prn[0] == 'J') {
185 for (int ii = 1; ii < 8; ii++) {
186 lines << stream->readLine();
187 }
188 eph = new t_ephGPS(version(), lines);
189 }
190 else if (prn[0] == 'S') {
191 for (int ii = 1; ii < 4; ii++) {
192 lines << stream->readLine();
193 }
194 eph = new t_ephSBAS(version(), lines);
195 }
196 else if (prn[0] == 'C') {
197 for (int ii = 1; ii < 8; ii++) {
198 lines << stream->readLine();
199 }
200 eph = new t_ephBDS(version(), lines);
201 }
202 if (eph &&
203 eph->checkState() != t_eph::bad &&
204 eph->checkState() != t_eph::outdated) {
205 _ephs.push_back(eph);
206 }
207 else {
208 delete eph;
209 }
210 }
211}
212
213// Read Next Ephemeris
214////////////////////////////////////////////////////////////////////////////
215t_eph* t_rnxNavFile::getNextEph(const bncTime& tt,
216 const QMap<QString, unsigned int>* corrIODs) {
217
218 // Get Ephemeris according to IOD
219 // ------------------------------
220 if (corrIODs) {
221 QMapIterator<QString, unsigned int> itIOD(*corrIODs);
222 while (itIOD.hasNext()) {
223 itIOD.next();
224 QString prn = itIOD.key();
225 unsigned int iod = itIOD.value();
226 vector<t_eph*>::iterator it = _ephs.begin();
227 while (it != _ephs.end()) {
228 t_eph* eph = *it;
229 double dt = eph->TOC() - tt;
230 if (dt < 8*3600.0 && QString(eph->prn().toInternalString().c_str()) == prn && eph->IOD() == iod) {
231 it = _ephs.erase(it);
232 return eph;
233 }
234 ++it;
235 }
236 }
237 }
238
239 // Get Ephemeris according to time
240 // -------------------------------
241 else {
242 vector<t_eph*>::iterator it = _ephs.begin();
243 while (it != _ephs.end()) {
244 t_eph* eph = *it;
245
246 double dt = eph->TOC() - tt;
247
248 if (dt < 2*3600.0) {
249 it = _ephs.erase(it);
250 return eph;
251 }
252 ++it;
253 }
254 }
255
256 return 0;
257}
258
259//
260////////////////////////////////////////////////////////////////////////////
261void t_rnxNavFile::writeHeader(const QMap<QString, QString>* txtMap) {
262
263 QString runBy = BNC_CORE->userName();
264 QStringList comments;
265
266 if (txtMap) {
267 QMapIterator<QString, QString> it(*txtMap);
268 while (it.hasNext()) {
269 it.next();
270 if (it.key() == "RUN BY") {
271 runBy = it.value();
272 }
273 else if (it.key() == "COMMENT") {
274 comments = it.value().split("\\n", QString::SkipEmptyParts);
275 }
276 }
277 }
278
279 if (version() < 3.0) {
280 const QString fmt = glonass() ? "%1 GLONASS navigation data"
281 : "%1 Navigation data";
282 *_stream << QString(fmt)
283 .arg(_header._version, 9, 'f', 2)
284 .leftJustified(60)
285 << "RINEX VERSION / TYPE\n";
286 }
287 else {
288 *_stream << QString("%1 N: GNSS NAV DATA M: MIXED")
289 .arg(_header._version, 9, 'f', 2)
290 .leftJustified(60)
291 << "RINEX VERSION / TYPE\n";
292 }
293
294 const QString fmtDate = (version() < 3.0) ? "dd-MMM-yy hh:mm"
295 : "yyyyMMdd hhmmss UTC";
296 *_stream << QString("%1%2%3")
297 .arg(BNC_CORE->pgmName(), -20)
298 .arg(runBy.trimmed().left(20), -20)
299 .arg(QDateTime::currentDateTime().toUTC().toString(fmtDate), -20)
300 .leftJustified(60)
301 << "PGM / RUN BY / DATE\n";
302
303 QStringListIterator itCmnt(comments);
304 while (itCmnt.hasNext()) {
305 *_stream << itCmnt.next().trimmed().left(60).leftJustified(60) << "COMMENT\n";
306 }
307
308 *_stream << QString()
309 .leftJustified(60)
310 << "END OF HEADER\n";
311}
312
313//
314////////////////////////////////////////////////////////////////////////////
315void t_rnxNavFile::writeEph(const t_eph* eph) {
316 *_stream << eph->toString(version());
317}
Note: See TracBrowser for help on using the repository browser.