source: ntrip/trunk/BNC/src/rinex/reqcedit.cpp@ 8078

Last change on this file since 8078 was 7999, checked in by stuerze, 10 years ago

some informations about the data source of RINEX navigation files is added into the RINEX header

File size: 22.1 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_reqcEdit
30 *
31 * Purpose: Edit/Concatenate RINEX Files
32 *
33 * Author: L. Mervart
34 *
35 * Created: 11-Apr-2012
36 *
37 * Changes:
38 *
39 * -----------------------------------------------------------------------*/
40
41#include <iostream>
42#include "reqcedit.h"
43#include "bnccore.h"
44#include "bncsettings.h"
45#include "bncutils.h"
46#include "rnxobsfile.h"
47#include "rnxnavfile.h"
48
49using namespace std;
50
51// Constructor
52////////////////////////////////////////////////////////////////////////////
53t_reqcEdit::t_reqcEdit(QObject* parent) : QThread(parent) {
54
55 bncSettings settings;
56
57 _logFileName = settings.value("reqcOutLogFile").toString(); expandEnvVar(_logFileName);
58 _logFile = 0;
59 _log = 0;
60 _obsFileNames = settings.value("reqcObsFile").toString().split(",", QString::SkipEmptyParts);
61 _outObsFileName = settings.value("reqcOutObsFile").toString();
62 _navFileNames = settings.value("reqcNavFile").toString().split(",", QString::SkipEmptyParts);
63 _outNavFileName = settings.value("reqcOutNavFile").toString();
64 int version = settings.value("reqcRnxVersion").toInt();
65 if (version < 3) {
66 _rnxVersion = t_rnxObsHeader::defaultRnxObsVersion2;
67 }
68 else {
69 _rnxVersion = t_rnxObsHeader::defaultRnxObsVersion3;
70 }
71 _samplingRate = settings.value("reqcSampling").toInt();
72 _begTime = bncTime(settings.value("reqcStartDateTime").toString().toAscii().data());
73 _endTime = bncTime(settings.value("reqcEndDateTime").toString().toAscii().data());
74
75}
76
77// Destructor
78////////////////////////////////////////////////////////////////////////////
79t_reqcEdit::~t_reqcEdit() {
80 for (int ii = 0; ii < _rnxObsFiles.size(); ii++) {
81 delete _rnxObsFiles[ii];
82 }
83 for (int ii = 0; ii < _ephs.size(); ii++) {
84 delete _ephs[ii];
85 }
86 delete _log; _log = 0;
87 delete _logFile; _logFile = 0;
88}
89
90//
91////////////////////////////////////////////////////////////////////////////
92void t_reqcEdit::run() {
93
94 // Open Log File
95 // -------------
96 if (!_logFileName.isEmpty()) {
97 _logFile = new QFile(_logFileName);
98 if (_logFile->open(QIODevice::WriteOnly | QIODevice::Text)) {
99 _log = new QTextStream();
100 _log->setDevice(_logFile);
101 }
102 }
103
104 // Log File Header
105 // ---------------
106 if (_log) {
107 *_log << QByteArray(78, '-') << endl;
108 *_log << "RINEX File Editing\n";
109 *_log << QByteArray(78, '-') << endl;
110
111 *_log << QByteArray("Program").leftJustified(15) << ": "
112 << BNC_CORE->pgmName() << endl;
113 *_log << QByteArray("Run by").leftJustified(15) << ": "
114 << BNC_CORE->userName() << endl;
115 *_log << QByteArray("Date").leftJustified(15) << ": "
116 << QDateTime::currentDateTime().toUTC().toString("yyyy-MM-dd hh:mm:ss") << endl;
117 *_log << QByteArray("RINEX Version").leftJustified(15) << ": "
118 << _rnxVersion << endl;
119 *_log << QByteArray("Sampling").leftJustified(15) << ": "
120 << _samplingRate << endl;
121 *_log << QByteArray("Start time").leftJustified(15) << ": "
122 << _begTime.datestr().c_str() << ' '
123 << _begTime.timestr(0).c_str() << endl;
124 *_log << QByteArray("End time").leftJustified(15) << ": "
125 << _endTime.datestr().c_str() << ' '
126 << _endTime.timestr(0).c_str() << endl;
127 *_log << QByteArray("Input Obs Files").leftJustified(15) << ": "
128 << _obsFileNames.join(",") << endl;
129 *_log << QByteArray("Input Nav Files").leftJustified(15) << ": "
130 << _navFileNames.join(",") << endl;
131 *_log << QByteArray("Output Obs File").leftJustified(15) << ": "
132 << _outObsFileName << endl;
133 *_log << QByteArray("Output Nav File").leftJustified(15) << ": "
134 << _outNavFileName << endl;
135
136 *_log << QByteArray(78, '-') << endl;
137 _log->flush();
138 }
139
140 // Handle Observation Files
141 // ------------------------
142 editObservations();
143
144 // Handle Navigations Files
145 // ------------------------
146 editEphemerides();
147
148 // Exit (thread)
149 // -------------
150 if (BNC_CORE->mode() != t_bncCore::interactive) {
151 qApp->exit(0);
152 msleep(100); //sleep 0.1 sec
153 }
154 else {
155 emit finished();
156 deleteLater();
157 }
158
159}
160
161// Initialize input observation files, sort them according to start time
162////////////////////////////////////////////////////////////////////////////
163void t_reqcEdit::initRnxObsFiles(const QStringList& obsFileNames,
164 QVector<t_rnxObsFile*>& rnxObsFiles,
165 QTextStream* log) {
166
167 QStringListIterator it(obsFileNames);
168 while (it.hasNext()) {
169 QString fileName = it.next();
170 if (fileName.indexOf('*') != -1 || fileName.indexOf('?') != -1) {
171 QFileInfo fileInfo(fileName);
172 QDir dir = fileInfo.dir();
173 QStringList filters; filters << fileInfo.fileName();
174 QListIterator<QFileInfo> it(dir.entryInfoList(filters));
175 while (it.hasNext()) {
176 QString filePath = it.next().filePath();
177 t_rnxObsFile* rnxObsFile = 0;
178 try {
179 rnxObsFile = new t_rnxObsFile(filePath, t_rnxObsFile::input);
180 rnxObsFiles.append(rnxObsFile);
181 }
182 catch (...) {
183 delete rnxObsFile;
184 if (log) {
185 *log << "Error in rnxObsFile " << filePath.toAscii().data() << endl;
186 }
187 }
188 }
189 }
190 else {
191 t_rnxObsFile* rnxObsFile = 0;
192 try {
193 rnxObsFile = new t_rnxObsFile(fileName, t_rnxObsFile::input);
194 rnxObsFiles.append(rnxObsFile);
195 }
196 catch (...) {
197 if (log) {
198 *log << "Error in rnxObsFile " << fileName.toAscii().data() << endl;
199 }
200 }
201 }
202 }
203 qStableSort(rnxObsFiles.begin(), rnxObsFiles.end(),
204 t_rnxObsFile::earlierStartTime);
205}
206
207//
208////////////////////////////////////////////////////////////////////////////
209void t_reqcEdit::editObservations() {
210
211 // Easy Exit
212 // ---------
213 if (_obsFileNames.isEmpty() || _outObsFileName.isEmpty()) {
214 return;
215 }
216
217 t_reqcEdit::initRnxObsFiles(_obsFileNames, _rnxObsFiles, _log);
218
219 // Initialize output observation file
220 // ----------------------------------
221 t_rnxObsFile outObsFile(_outObsFileName, t_rnxObsFile::output);
222
223 // Select observation types
224 // ------------------------
225 bncSettings settings;
226 QStringList useObsTypes = settings.value("reqcUseObsTypes").toString().split(" ", QString::SkipEmptyParts);
227
228 // Put together all observation types
229 // ----------------------------------
230 if (_rnxObsFiles.size() > 1 && useObsTypes.size() == 0) {
231 for (int ii = 0; ii < _rnxObsFiles.size(); ii++) {
232 t_rnxObsFile* obsFile = _rnxObsFiles[ii];
233 for (int iSys = 0; iSys < obsFile->numSys(); iSys++) {
234 char sys = obsFile->system(iSys);
235 if (sys != ' ') {
236 for (int iType = 0; iType < obsFile->nTypes(sys); iType++) {
237 QString type = obsFile->obsType(sys, iType);
238 if (_rnxVersion < 3.0) {
239 useObsTypes << type;
240 }
241 else {
242 useObsTypes << QString(sys) + ":" + type;
243 }
244 }
245 }
246 }
247 }
248 useObsTypes.removeDuplicates();
249 }
250
251 // Put together all phase shifts
252 // -----------------------------
253 QStringList phaseShifts;
254 if (_rnxVersion >= 3.0 && _rnxObsFiles.size() > 1) {
255 for (int ii = 0; ii < _rnxObsFiles.size(); ii++) {
256 t_rnxObsFile* obsFile = _rnxObsFiles[ii];
257 phaseShifts << obsFile->phaseShifts();
258 }
259 phaseShifts.removeDuplicates();
260 }
261
262 // Put together all GLONASS biases
263 // -------------------------------
264 QStringList gloBiases;
265 if (_rnxVersion >= 3.0 && _rnxObsFiles.size() > 1) {
266 for (int ii = 0; ii < _rnxObsFiles.size(); ii++) {
267 t_rnxObsFile* obsFile = _rnxObsFiles[ii];
268 if (ii == 0 && obsFile->numGloBiases() == 4) {
269 break;
270 }
271 else {
272 gloBiases << obsFile->gloBiases();
273 }
274 }
275 gloBiases.removeDuplicates();
276 }
277
278 // Put together all GLONASS slots
279 // -----------------------------
280 QStringList gloSlots;
281 if (_rnxVersion >= 3.0 && _rnxObsFiles.size() > 1) {
282 for (int ii = 0; ii < _rnxObsFiles.size(); ii++) {
283 t_rnxObsFile* obsFile = _rnxObsFiles[ii];
284 if (ii == 0 &&
285 obsFile->numGloSlots() == signed(t_prn::MAXPRN_GLONASS)) {
286 break;
287 }
288 else {
289 gloSlots << obsFile->gloSlots();
290 }
291 }
292 gloSlots.removeDuplicates();
293 }
294
295 // Loop over all input observation files
296 // -------------------------------------
297 for (int ii = 0; ii < _rnxObsFiles.size(); ii++) {
298 t_rnxObsFile* obsFile = _rnxObsFiles[ii];
299 if (_log) {
300 *_log << "Processing File: " << obsFile->fileName() << " start: "
301 << obsFile->startTime().datestr().c_str() << ' '
302 << obsFile->startTime().timestr(0).c_str() << endl;
303 }
304 if (ii == 0) {
305 outObsFile.setHeader(obsFile->header(), int(_rnxVersion), &useObsTypes,
306 &phaseShifts, &gloBiases, &gloSlots);
307 if (_begTime.valid() && _begTime > outObsFile.startTime()) {
308 outObsFile.setStartTime(_begTime);
309 }
310 if (_samplingRate > outObsFile.interval()) {
311 outObsFile.setInterval(_samplingRate);
312 }
313 editRnxObsHeader(outObsFile);
314 bncSettings settings;
315 QMap<QString, QString> txtMap;
316 QString runBy = settings.value("reqcRunBy").toString();
317 if (!runBy.isEmpty()) {
318 txtMap["RUN BY"] = runBy;
319 }
320 QString comment = settings.value("reqcComment").toString();
321 if (!comment.isEmpty()) {
322 txtMap["COMMENT"] = comment;
323 }
324 if (int(_rnxVersion) < int(obsFile->header().version())) {
325 addRnxConversionDetails(obsFile, txtMap);
326 }
327 outObsFile.header().write(outObsFile.stream(), &txtMap);
328 }
329 t_rnxObsFile::t_rnxEpo* epo = 0;
330 try {
331 while ( (epo = obsFile->nextEpoch()) != 0) {
332 if (_begTime.valid() && epo->tt < _begTime) {
333 continue;
334 }
335 if (_endTime.valid() && epo->tt > _endTime) {
336 break;
337 }
338
339 if (_samplingRate == 0 ||
340 fmod(round(epo->tt.gpssec()), _samplingRate) == 0) {
341 applyLLI(obsFile, epo);
342 outObsFile.writeEpoch(epo);
343 }
344 else {
345 rememberLLI(obsFile, epo);
346 }
347 }
348 }
349 catch (QString str) {
350 if (_log) {
351 *_log << "Exception " << str << endl;
352 }
353 else {
354 qDebug() << str;
355 }
356 return;
357 }
358 catch (...) {
359 if (_log) {
360 *_log << "Exception unknown" << endl;
361 }
362 else {
363 qDebug() << "Exception unknown";
364 }
365 return;
366 }
367 }
368}
369
370// Change RINEX Header Content
371////////////////////////////////////////////////////////////////////////////
372void t_reqcEdit::editRnxObsHeader(t_rnxObsFile& obsFile) {
373
374 bncSettings settings;
375
376 QString oldMarkerName = settings.value("reqcOldMarkerName").toString();
377 QString newMarkerName = settings.value("reqcNewMarkerName").toString();
378 if (!newMarkerName.isEmpty()) {
379 if (oldMarkerName.isEmpty() ||
380 QRegExp(oldMarkerName).exactMatch(obsFile.markerName())) {
381 obsFile.setMarkerName(newMarkerName);
382 }
383 }
384
385 QString oldAntennaName = settings.value("reqcOldAntennaName").toString();
386 QString newAntennaName = settings.value("reqcNewAntennaName").toString();
387 if (!newAntennaName.isEmpty()) {
388 if (oldAntennaName.isEmpty() ||
389 QRegExp(oldAntennaName).exactMatch(obsFile.antennaName())) {
390 obsFile.setAntennaName(newAntennaName);
391 }
392 }
393
394 QString oldAntennaNumber = settings.value("reqcOldAntennaNumber").toString();
395 QString newAntennaNumber = settings.value("reqcNewAntennaNumber").toString();
396 if (!newAntennaNumber.isEmpty()) {
397 if (oldAntennaNumber.isEmpty() ||
398 QRegExp(oldAntennaNumber).exactMatch(obsFile.antennaNumber())) {
399 obsFile.setAntennaNumber(newAntennaNumber);
400 }
401 }
402
403
404 const ColumnVector& obsFileAntNEU = obsFile.antNEU();
405 QString oldAntennadN = settings.value("reqcOldAntennadN").toString();
406 QString newAntennadN = settings.value("reqcNewAntennadN").toString();
407 if(!newAntennadN.isEmpty()) {
408 if (oldAntennadN.isEmpty() ||
409 oldAntennadN.toDouble() == obsFileAntNEU(1)) {
410 obsFile.setAntennaN(newAntennadN.toDouble());
411 }
412 }
413 QString oldAntennadE = settings.value("reqcOldAntennadE").toString();
414 QString newAntennadE = settings.value("reqcNewAntennadE").toString();
415 if(!newAntennadE.isEmpty()) {
416 if (oldAntennadE.isEmpty() ||
417 oldAntennadE.toDouble() == obsFileAntNEU(2)) {
418 obsFile.setAntennaE(newAntennadE.toDouble());
419 }
420 }
421 QString oldAntennadU = settings.value("reqcOldAntennadU").toString();
422 QString newAntennadU = settings.value("reqcNewAntennadU").toString();
423 if(!newAntennadU.isEmpty()) {
424 if (oldAntennadU.isEmpty() ||
425 oldAntennadU.toDouble() == obsFileAntNEU(3)) {
426 obsFile.setAntennaU(newAntennadU.toDouble());
427 }
428 }
429
430 QString oldReceiverType = settings.value("reqcOldReceiverName").toString();
431 QString newReceiverType = settings.value("reqcNewReceiverName").toString();
432 if (!newReceiverType.isEmpty()) {
433 if (oldReceiverType.isEmpty() ||
434 QRegExp(oldReceiverType).exactMatch(obsFile.receiverType())) {
435 obsFile.setReceiverType(newReceiverType);
436 }
437 }
438
439 QString oldReceiverNumber = settings.value("reqcOldReceiverNumber").toString();
440 QString newReceiverNumber = settings.value("reqcNewReceiverNumber").toString();
441 if (!newReceiverNumber.isEmpty()) {
442 if (oldReceiverNumber.isEmpty() ||
443 QRegExp(oldReceiverNumber).exactMatch(obsFile.receiverNumber())) {
444 obsFile.setReceiverNumber(newReceiverNumber);
445 }
446 }
447}
448
449//
450////////////////////////////////////////////////////////////////////////////
451void t_reqcEdit::rememberLLI(const t_rnxObsFile* obsFile,
452 const t_rnxObsFile::t_rnxEpo* epo) {
453
454 if (_samplingRate == 0) {
455 return;
456 }
457
458 for (unsigned iSat = 0; iSat < epo->rnxSat.size(); iSat++) {
459 const t_rnxObsFile::t_rnxSat& rnxSat = epo->rnxSat[iSat];
460 char sys = rnxSat.prn.system();
461 QString prn(rnxSat.prn.toString().c_str());
462
463 for (int iType = 0; iType < obsFile->nTypes(sys); iType++) {
464 QString type = obsFile->obsType(sys, iType);
465 if (!_lli[prn].contains(iType)) {
466 _lli[prn][iType] = 0;
467 }
468 if (rnxSat.obs.contains(type) && rnxSat.obs[type].lli & 1) {
469 _lli[prn][iType] |= 1;
470 }
471 }
472 }
473}
474
475//
476////////////////////////////////////////////////////////////////////////////
477void t_reqcEdit::applyLLI(const t_rnxObsFile* obsFile,
478 t_rnxObsFile::t_rnxEpo* epo) {
479
480 if (_samplingRate == 0) {
481 return;
482 }
483
484 for (unsigned iSat = 0; iSat < epo->rnxSat.size(); iSat++) {
485 t_rnxObsFile::t_rnxSat& rnxSat = epo->rnxSat[iSat];
486 char sys = rnxSat.prn.system();
487 QString prn(rnxSat.prn.toString().c_str());
488
489 for (int iType = 0; iType < obsFile->nTypes(sys); iType++) {
490 QString type = obsFile->obsType(sys, iType);
491 if (_lli[prn].contains(iType) && _lli[prn][iType] & 1) {
492 if (rnxSat.obs.contains(type)) {
493 rnxSat.obs[type].lli |= 1;
494 }
495 }
496 }
497 }
498
499 _lli.clear();
500}
501
502/// Read All Ephemerides
503////////////////////////////////////////////////////////////////////////////
504void t_reqcEdit::readEphemerides(const QStringList& navFileNames,
505 QVector<t_eph*>& ephs) {
506
507 QStringListIterator it(navFileNames);
508 while (it.hasNext()) {
509 QString fileName = it.next();
510 if (fileName.indexOf('*') != -1 || fileName.indexOf('?') != -1) {
511 QFileInfo fileInfo(fileName);
512 QDir dir = fileInfo.dir();
513 QStringList filters; filters << fileInfo.fileName();
514 QListIterator<QFileInfo> it(dir.entryInfoList(filters));
515 while (it.hasNext()) {
516 QString filePath = it.next().filePath();
517 appendEphemerides(filePath, ephs);
518 }
519 }
520 else {
521 appendEphemerides(fileName, ephs);
522 }
523 }
524 qStableSort(ephs.begin(), ephs.end(), t_eph::earlierTime);
525}
526
527//
528////////////////////////////////////////////////////////////////////////////
529void t_reqcEdit::editEphemerides() {
530
531 // Easy Exit
532 // ---------
533 if (_navFileNames.isEmpty() || _outNavFileName.isEmpty()) {
534 return;
535 }
536 // Concatenate all comments
537 // ------------------------
538 QStringList comments;
539 bncSettings settings;
540 QString comment = settings.value("reqcComment").toString();
541 if (!comment.isEmpty()) {
542 comments.append(comment);
543 }
544 QStringListIterator it(_navFileNames);
545 while (it.hasNext()) {
546 QString fileName = it.next();
547 t_rnxNavFile rnxNavFile(fileName, t_rnxNavFile::input);
548 QStringListIterator itCmnt(rnxNavFile.comments());
549 while (itCmnt.hasNext()) {
550 comments.append(itCmnt.next());
551 }
552 }
553 comments.removeDuplicates();
554
555 // Read Ephemerides
556 // ----------------
557 t_reqcEdit::readEphemerides(_navFileNames, _ephs);
558
559 // Check Satellite Systems
560 // -----------------------
561 bool haveGPS = false;
562 bool haveGlonass = false;
563 for (int ii = 0; ii < _ephs.size(); ii++) {
564 const t_eph* eph = _ephs[ii];
565 if (eph->type() == t_eph::GPS) {
566 haveGPS = true;
567 }
568 else if (eph->type() == t_eph::GLONASS) {
569 haveGlonass = true;
570 }
571 }
572
573 // Initialize output navigation file
574 // ---------------------------------
575 t_rnxNavFile outNavFile(_outNavFileName, t_rnxNavFile::output);
576
577 outNavFile.setGlonass(haveGlonass);
578
579 if ( (haveGPS && haveGlonass) || _rnxVersion >= 3.0) {
580 outNavFile.setVersion(t_rnxNavFile::defaultRnxNavVersion3);
581 }
582 else {
583 outNavFile.setVersion(t_rnxNavFile::defaultRnxNavVersion2);
584 }
585
586 QMap<QString, QString> txtMap;
587 QString runBy = settings.value("reqcRunBy").toString();
588 if (!runBy.isEmpty()) {
589 txtMap["RUN BY"] = runBy;
590 }
591 if (!comments.isEmpty()) {
592 txtMap["COMMENT"] = comments.join("\\n");
593 }
594
595 outNavFile.writeHeader(&txtMap);
596
597 // Loop over all ephemerides
598 // -------------------------
599 for (int ii = 0; ii < _ephs.size(); ii++) {
600 const t_eph* eph = _ephs[ii];
601 bncTime begTime = _begTime;
602 bncTime endTime = _endTime;
603 if (eph->type() == t_eph::BDS) {
604 begTime += 14;
605 endTime += 14;
606 }
607 if (begTime.valid() && eph->TOC() < begTime) {
608 continue;
609 }
610 if (endTime.valid() && eph->TOC() > endTime) {
611 break;
612 }
613 outNavFile.writeEph(eph);
614 }
615}
616
617//
618////////////////////////////////////////////////////////////////////////////
619void t_reqcEdit::appendEphemerides(const QString& fileName,
620 QVector<t_eph*>& ephs) {
621
622 t_rnxNavFile rnxNavFile(fileName, t_rnxNavFile::input);
623 for (unsigned ii = 0; ii < rnxNavFile.ephs().size(); ii++) {
624 t_eph* eph = rnxNavFile.ephs()[ii];
625 bool isNew = true;
626 for (int iOld = 0; iOld < ephs.size(); iOld++) {
627 const t_eph* ephOld = ephs[iOld];
628 if (ephOld->prn() == eph->prn() &&
629 ephOld->TOC() == eph->TOC()) {
630 isNew = false;
631 break;
632 }
633 }
634 if (isNew) {
635 if (eph->type() == t_eph::GPS) {
636 ephs.append(new t_ephGPS(*dynamic_cast<t_ephGPS*>(eph)));
637 }
638 else if (eph->type() == t_eph::GLONASS) {
639 ephs.append(new t_ephGlo(*dynamic_cast<t_ephGlo*>(eph)));
640 }
641 else if (eph->type() == t_eph::Galileo) {
642 ephs.append(new t_ephGal(*dynamic_cast<t_ephGal*>(eph)));
643 }
644 else if (eph->type() == t_eph::QZSS) {
645 ephs.append(new t_ephGPS(*dynamic_cast<t_ephGPS*>(eph)));
646 }
647 else if (eph->type() == t_eph::SBAS) {
648 ephs.append(new t_ephSBAS(*dynamic_cast<t_ephSBAS*>(eph)));
649 }
650 else if (eph->type() == t_eph::BDS) {
651 ephs.append(new t_ephBDS(*dynamic_cast<t_ephBDS*>(eph)));
652 }
653 }
654 }
655}
656
657void t_reqcEdit::addRnxConversionDetails(const t_rnxObsFile* obsFile,
658 QMap<QString, QString>& txtMap) {
659
660 int key = 0;
661 QString systems = obsFile->header().usedSystems();
662 QString comment = QString("Signal priorities for RINEX 3 => 2 conversion:");
663 QString commentKey = QString("COMMENT %1").arg(key, 3, 10, QChar('0'));
664 txtMap.insert(commentKey, comment);
665
666 for(int ii = 0; ii < obsFile->numSys(); ii++) {
667 char sys = systems[ii].toAscii();
668 txtMap.insert(commentKey, comment);
669 QMap <char, QString> signalPriorityMap;
670 QStringList preferredAttribListSys = obsFile->signalPriorities(sys);
671 QStringList types = obsFile->header().obsTypes(sys);
672 for (int jj = 0; jj < types.size(); jj++) {
673 QString inType = types[jj];
674 char band = inType[1].toAscii();
675 for (int ii = 0; ii < preferredAttribListSys.size(); ii++) {
676 QString preferredAttrib;
677 if (preferredAttribListSys[ii].indexOf("&") != -1) {
678 QStringList hlp = preferredAttribListSys[ii].split("&", QString::SkipEmptyParts);
679 if (hlp.size() == 2 && hlp[0].contains(band)) {
680 preferredAttrib = hlp[1];
681 }
682 }
683 else {
684 preferredAttrib = preferredAttribListSys[ii];
685 }
686 if (!signalPriorityMap.contains(band) && !preferredAttrib.isEmpty()){
687 signalPriorityMap[band] = preferredAttrib;
688 }
689 }
690 }
691 QMapIterator<char, QString> it(signalPriorityMap);
692 while (it.hasNext()) {
693 it.next();
694 key++;
695 comment = QString("%1 band %2: %3").arg(sys).arg(it.key()).arg(it.value());
696 commentKey = QString("COMMENT %1").arg(key, 3, 10, QChar('0'));
697 txtMap.insert(commentKey, comment);
698 }
699 }
700}
Note: See TracBrowser for help on using the repository browser.