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

Last change on this file since 7984 was 7980, checked in by stuerze, 10 years ago

System and frequency specific signal priorities are added for RINEX3 to RINEX2 conversion and the default 'Signal priority' list is improved

File size: 21.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_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 << "Concatenation of RINEX Observation and/or Navigation Files\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
537 // Read Ephemerides
538 // ----------------
539 t_reqcEdit::readEphemerides(_navFileNames, _ephs);
540
541 // Check Satellite Systems
542 // -----------------------
543 bool haveGPS = false;
544 bool haveGlonass = false;
545 for (int ii = 0; ii < _ephs.size(); ii++) {
546 const t_eph* eph = _ephs[ii];
547 if (eph->type() == t_eph::GPS) {
548 haveGPS = true;
549 }
550 else if (eph->type() == t_eph::GLONASS) {
551 haveGlonass = true;
552 }
553 }
554
555 // Initialize output navigation file
556 // ---------------------------------
557 t_rnxNavFile outNavFile(_outNavFileName, t_rnxNavFile::output);
558
559 outNavFile.setGlonass(haveGlonass);
560
561 if ( (haveGPS && haveGlonass) || _rnxVersion >= 3.0) {
562 outNavFile.setVersion(t_rnxNavFile::defaultRnxNavVersion3);
563 }
564 else {
565 outNavFile.setVersion(t_rnxNavFile::defaultRnxNavVersion2);
566 }
567
568 bncSettings settings;
569 QMap<QString, QString> txtMap;
570 QString runBy = settings.value("reqcRunBy").toString();
571 if (!runBy.isEmpty()) {
572 txtMap["RUN BY"] = runBy;
573 }
574 QString comment = settings.value("reqcComment").toString();
575 if (!comment.isEmpty()) {
576 txtMap["COMMENT"] = comment;
577 }
578
579 outNavFile.writeHeader(&txtMap);
580
581 // Loop over all ephemerides
582 // -------------------------
583 for (int ii = 0; ii < _ephs.size(); ii++) {
584 const t_eph* eph = _ephs[ii];
585 bncTime begTime = _begTime;
586 bncTime endTime = _endTime;
587 if (eph->type() == t_eph::BDS) {
588 begTime += 14;
589 endTime += 14;
590 }
591 if (begTime.valid() && eph->TOC() < begTime) {
592 continue;
593 }
594 if (endTime.valid() && eph->TOC() > endTime) {
595 break;
596 }
597 outNavFile.writeEph(eph);
598 }
599}
600
601//
602////////////////////////////////////////////////////////////////////////////
603void t_reqcEdit::appendEphemerides(const QString& fileName,
604 QVector<t_eph*>& ephs) {
605
606 t_rnxNavFile rnxNavFile(fileName, t_rnxNavFile::input);
607 for (unsigned ii = 0; ii < rnxNavFile.ephs().size(); ii++) {
608 t_eph* eph = rnxNavFile.ephs()[ii];
609 bool isNew = true;
610 for (int iOld = 0; iOld < ephs.size(); iOld++) {
611 const t_eph* ephOld = ephs[iOld];
612 if (ephOld->prn() == eph->prn() &&
613 ephOld->TOC() == eph->TOC()) {
614 isNew = false;
615 break;
616 }
617 }
618 if (isNew) {
619 if (eph->type() == t_eph::GPS) {
620 ephs.append(new t_ephGPS(*dynamic_cast<t_ephGPS*>(eph)));
621 }
622 else if (eph->type() == t_eph::GLONASS) {
623 ephs.append(new t_ephGlo(*dynamic_cast<t_ephGlo*>(eph)));
624 }
625 else if (eph->type() == t_eph::Galileo) {
626 ephs.append(new t_ephGal(*dynamic_cast<t_ephGal*>(eph)));
627 }
628 else if (eph->type() == t_eph::QZSS) {
629 ephs.append(new t_ephGPS(*dynamic_cast<t_ephGPS*>(eph)));
630 }
631 else if (eph->type() == t_eph::SBAS) {
632 ephs.append(new t_ephSBAS(*dynamic_cast<t_ephSBAS*>(eph)));
633 }
634 else if (eph->type() == t_eph::BDS) {
635 ephs.append(new t_ephBDS(*dynamic_cast<t_ephBDS*>(eph)));
636 }
637 }
638 }
639}
640
641void t_reqcEdit::addRnxConversionDetails(const t_rnxObsFile* obsFile,
642 QMap<QString, QString>& txtMap) {
643
644 int key = 0;
645 QString systems = obsFile->header().usedSystems();
646 QString comment = QString("Signal priorities for RINEX 3 => 2 conversion:");
647 QString commentKey = QString("COMMENT %1").arg(key, 3, 10, QChar('0'));
648 txtMap.insert(commentKey, comment);
649
650 for(int ii = 0; ii < obsFile->numSys(); ii++) {
651 char sys = systems[ii].toAscii();
652 txtMap.insert(commentKey, comment);
653 QMap <char, QString> signalPriorityMap;
654 QStringList preferredAttribListSys = obsFile->signalPriorities(sys);
655 QStringList types = obsFile->header().obsTypes(sys);
656 for (int jj = 0; jj < types.size(); jj++) {
657 QString inType = types[jj];
658 char band = inType[1].toAscii();
659 for (int ii = 0; ii < preferredAttribListSys.size(); ii++) {
660 QString preferredAttrib;
661 if (preferredAttribListSys[ii].indexOf("&") != -1) {
662 QStringList hlp = preferredAttribListSys[ii].split("&", QString::SkipEmptyParts);
663 if (hlp.size() == 2 && hlp[0].contains(band)) {
664 preferredAttrib = hlp[1];
665 }
666 }
667 else {
668 preferredAttrib = preferredAttribListSys[ii];
669 }
670 if (!signalPriorityMap.contains(band) && !preferredAttrib.isEmpty()){
671 signalPriorityMap[band] = preferredAttrib;
672 }
673 }
674 }
675 QMapIterator<char, QString> it(signalPriorityMap);
676 while (it.hasNext()) {
677 it.next();
678 key++;
679 comment = QString("%1 band %2: %3").arg(sys).arg(it.key()).arg(it.value());
680 commentKey = QString("COMMENT %1").arg(key, 3, 10, QChar('0'));
681 txtMap.insert(commentKey, comment);
682 }
683 }
684}
Note: See TracBrowser for help on using the repository browser.