source: ntrip/branches/BNC_2.12/src/rinex/reqcedit.cpp @ 8370

Last change on this file since 8370 was 8370, checked in by stuerze, 5 months ago

small bug fixes in 'reqc' ephemeris check

File size: 23.0 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 = defaultRnxObsVersion2;
67  }
68  else {
69    _rnxVersion = 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// Initialize input observation files, sort them according to start time
161////////////////////////////////////////////////////////////////////////////
162void t_reqcEdit::initRnxObsFiles(const QStringList& obsFileNames,
163                                 QVector<t_rnxObsFile*>& rnxObsFiles,
164                                 QTextStream* log) {
165
166  QStringListIterator it(obsFileNames);
167  while (it.hasNext()) {
168    QString fileName = it.next();
169    if (fileName.indexOf('*') != -1 || fileName.indexOf('?') != -1) {
170      QFileInfo fileInfo(fileName);
171      QDir dir = fileInfo.dir();
172      QStringList filters; filters << fileInfo.fileName();
173      QListIterator<QFileInfo> it(dir.entryInfoList(filters));
174      while (it.hasNext()) {
175        QString filePath = it.next().filePath();
176        t_rnxObsFile* rnxObsFile = 0;
177        try {
178          rnxObsFile = new t_rnxObsFile(filePath, t_rnxObsFile::input);
179          rnxObsFiles.append(rnxObsFile);
180        }
181        catch (...) {
182          delete rnxObsFile;
183          if (log) {
184            *log << "Error in rnxObsFile " << filePath.toAscii().data() << endl;
185          }
186        }
187      }
188    }
189    else {
190      t_rnxObsFile* rnxObsFile = 0;
191      try {
192        rnxObsFile = new t_rnxObsFile(fileName, t_rnxObsFile::input);
193        rnxObsFiles.append(rnxObsFile);
194      }
195      catch (...) {
196        if (log) {
197          *log << "Error in rnxObsFile " << fileName.toAscii().data() << endl;
198        }
199      }
200    }
201  }
202  qStableSort(rnxObsFiles.begin(), rnxObsFiles.end(),
203              t_rnxObsFile::earlierStartTime);
204}
205
206//
207////////////////////////////////////////////////////////////////////////////
208void t_reqcEdit::editObservations() {
209
210  // Easy Exit
211  // ---------
212  if (_obsFileNames.isEmpty() || _outObsFileName.isEmpty()) {
213    return;
214  }
215
216  t_reqcEdit::initRnxObsFiles(_obsFileNames, _rnxObsFiles, _log);
217
218  // Initialize output observation file
219  // ----------------------------------
220  t_rnxObsFile outObsFile(_outObsFileName, t_rnxObsFile::output);
221
222  // Select observation types
223  // ------------------------
224  bncSettings settings;
225  QStringList useObsTypes = settings.value("reqcUseObsTypes").toString().split(" ", QString::SkipEmptyParts);
226
227  // Put together all observation types
228  // ----------------------------------
229  if (_rnxObsFiles.size() > 1 && useObsTypes.size() == 0) {
230    for (int ii = 0; ii < _rnxObsFiles.size(); ii++) {
231      t_rnxObsFile* obsFile = _rnxObsFiles[ii];
232      for (int iSys = 0; iSys < obsFile->numSys(); iSys++) {
233        char sys = obsFile->system(iSys);
234        if (sys != ' ') {
235          for (int iType = 0; iType < obsFile->nTypes(sys); iType++) {
236            QString type = obsFile->obsType(sys, iType);
237            if (_rnxVersion < 3.0) {
238              useObsTypes << type;
239            }
240            else {
241              useObsTypes << QString(sys) + ":" + type;
242            }
243          }
244        }
245      }
246    }
247    useObsTypes.removeDuplicates();
248  }
249
250  // Put together all phase shifts
251  // -----------------------------
252  QStringList phaseShifts;
253  if (_rnxVersion >= 3.0 && _rnxObsFiles.size() > 1) {
254    for (int ii = 0; ii < _rnxObsFiles.size(); ii++) {
255      t_rnxObsFile* obsFile = _rnxObsFiles[ii];
256      phaseShifts << obsFile->phaseShifts();
257    }
258    phaseShifts.removeDuplicates();
259  }
260
261  // Put together all GLONASS biases
262  // -------------------------------
263  QStringList gloBiases;
264  if (_rnxVersion >= 3.0 && _rnxObsFiles.size() > 1) {
265    for (int ii = 0; ii < _rnxObsFiles.size(); ii++) {
266      t_rnxObsFile* obsFile = _rnxObsFiles[ii];
267      if (ii == 0 &&  obsFile->numGloBiases() == 4) {
268        break;
269      }
270      else {
271        gloBiases << obsFile->gloBiases();
272      }
273    }
274    gloBiases.removeDuplicates();
275  }
276
277  // Put together all GLONASS slots
278  // -----------------------------
279  QStringList gloSlots;
280  if (_rnxVersion >= 3.0 && _rnxObsFiles.size() > 1) {
281    for (int ii = 0; ii < _rnxObsFiles.size(); ii++) {
282      t_rnxObsFile* obsFile = _rnxObsFiles[ii];
283      if (ii == 0 &&
284          obsFile->numGloSlots() == signed(t_prn::MAXPRN_GLONASS)) {
285        break;
286      }
287      else {
288        gloSlots << obsFile->gloSlots();
289      }
290    }
291    gloSlots.removeDuplicates();
292  }
293
294  // Loop over all input observation files
295  // -------------------------------------
296  for (int ii = 0; ii < _rnxObsFiles.size(); ii++) {
297    t_rnxObsFile* obsFile = _rnxObsFiles[ii];
298    if (_log) {
299      *_log << "Processing File: " << obsFile->fileName() << "  start: "
300            << obsFile->startTime().datestr().c_str() << ' '
301            << obsFile->startTime().timestr(0).c_str() << endl;
302    }
303    if (ii == 0) {
304      outObsFile.setHeader(obsFile->header(), int(_rnxVersion), &useObsTypes,
305          &phaseShifts, &gloBiases, &gloSlots);
306      if (_begTime.valid() && _begTime > outObsFile.startTime()) {
307        outObsFile.setStartTime(_begTime);
308      }
309      if (_samplingRate > outObsFile.interval()) {
310        outObsFile.setInterval(_samplingRate);
311      }
312      editRnxObsHeader(outObsFile);
313      bncSettings settings;
314      QMap<QString, QString> txtMap;
315      QString runBy = settings.value("reqcRunBy").toString();
316      if (!runBy.isEmpty()) {
317        txtMap["RUN BY"]  = runBy;
318      }
319      QString comment = settings.value("reqcComment").toString();
320      if (!comment.isEmpty()) {
321        txtMap["COMMENT"]  = comment;
322      }
323      if (int(_rnxVersion) < int(obsFile->header().version())) {
324        addRnxConversionDetails(obsFile, txtMap);
325      }
326      outObsFile.header().write(outObsFile.stream(), &txtMap);
327    }
328    t_rnxObsFile::t_rnxEpo* epo = 0;
329    try {
330      while ( (epo = obsFile->nextEpoch()) != 0) {
331        if (_begTime.valid() && epo->tt < _begTime) {
332          continue;
333        }
334        if (_endTime.valid() && epo->tt > _endTime) {
335          break;
336        }
337
338        if (_samplingRate == 0 ||
339            fmod(round(epo->tt.gpssec()), _samplingRate) == 0) {
340          applyLLI(obsFile, epo);
341          outObsFile.writeEpoch(epo);
342        }
343        else {
344          rememberLLI(obsFile, epo);
345        }
346      }
347    }
348    catch (QString str) {
349      if (_log) {
350        *_log << "Exception " << str << endl;
351      }
352      else {
353        qDebug() << str;
354      }
355      return;
356    }
357    catch (...) {
358      if (_log) {
359        *_log << "Exception unknown" << endl;
360      }
361      else {
362        qDebug() << "Exception unknown";
363      }
364      return;
365    }
366  }
367}
368
369// Change RINEX Header Content
370////////////////////////////////////////////////////////////////////////////
371void t_reqcEdit::editRnxObsHeader(t_rnxObsFile& obsFile) {
372
373  bncSettings settings;
374
375  QString oldMarkerName   = settings.value("reqcOldMarkerName").toString();
376  QString newMarkerName   = settings.value("reqcNewMarkerName").toString();
377  if (!newMarkerName.isEmpty()) {
378    if (oldMarkerName.isEmpty() ||
379        QRegExp(oldMarkerName).exactMatch(obsFile.markerName())) {
380      obsFile.setMarkerName(newMarkerName);
381    }
382  }
383
384  QString oldAntennaName  = settings.value("reqcOldAntennaName").toString();
385  QString newAntennaName  = settings.value("reqcNewAntennaName").toString();
386  if (!newAntennaName.isEmpty()) {
387    if (oldAntennaName.isEmpty() ||
388        QRegExp(oldAntennaName).exactMatch(obsFile.antennaName())) {
389      obsFile.setAntennaName(newAntennaName);
390    }
391  }
392
393  QString oldAntennaNumber  = settings.value("reqcOldAntennaNumber").toString();
394  QString newAntennaNumber  = settings.value("reqcNewAntennaNumber").toString();
395  if (!newAntennaNumber.isEmpty()) {
396    if (oldAntennaNumber.isEmpty() ||
397        QRegExp(oldAntennaNumber).exactMatch(obsFile.antennaNumber())) {
398      obsFile.setAntennaNumber(newAntennaNumber);
399    }
400  }
401
402
403  const ColumnVector& obsFileAntNEU = obsFile.antNEU();
404  QString oldAntennadN = settings.value("reqcOldAntennadN").toString();
405  QString newAntennadN = settings.value("reqcNewAntennadN").toString();
406  if(!newAntennadN.isEmpty()) {
407    if (oldAntennadN.isEmpty() ||
408        oldAntennadN.toDouble() == obsFileAntNEU(1)) {
409      obsFile.setAntennaN(newAntennadN.toDouble());
410    }
411  }
412  QString oldAntennadE = settings.value("reqcOldAntennadE").toString();
413  QString newAntennadE = settings.value("reqcNewAntennadE").toString();
414  if(!newAntennadE.isEmpty()) {
415    if (oldAntennadE.isEmpty() ||
416        oldAntennadE.toDouble() == obsFileAntNEU(2)) {
417      obsFile.setAntennaE(newAntennadE.toDouble());
418    }
419  }
420  QString oldAntennadU = settings.value("reqcOldAntennadU").toString();
421  QString newAntennadU = settings.value("reqcNewAntennadU").toString();
422  if(!newAntennadU.isEmpty()) {
423    if (oldAntennadU.isEmpty() ||
424        oldAntennadU.toDouble() == obsFileAntNEU(3)) {
425      obsFile.setAntennaU(newAntennadU.toDouble());
426    }
427  }
428
429  QString oldReceiverType = settings.value("reqcOldReceiverName").toString();
430  QString newReceiverType = settings.value("reqcNewReceiverName").toString();
431  if (!newReceiverType.isEmpty()) {
432    if (oldReceiverType.isEmpty() ||
433        QRegExp(oldReceiverType).exactMatch(obsFile.receiverType())) {
434      obsFile.setReceiverType(newReceiverType);
435    }
436  }
437
438  QString oldReceiverNumber = settings.value("reqcOldReceiverNumber").toString();
439  QString newReceiverNumber = settings.value("reqcNewReceiverNumber").toString();
440  if (!newReceiverNumber.isEmpty()) {
441    if (oldReceiverNumber.isEmpty() ||
442        QRegExp(oldReceiverNumber).exactMatch(obsFile.receiverNumber())) {
443      obsFile.setReceiverNumber(newReceiverNumber);
444    }
445  }
446}
447
448//
449////////////////////////////////////////////////////////////////////////////
450void t_reqcEdit::rememberLLI(const t_rnxObsFile* obsFile,
451                             const t_rnxObsFile::t_rnxEpo* epo) {
452
453  if (_samplingRate == 0) {
454    return;
455  }
456
457  for (unsigned iSat = 0; iSat < epo->rnxSat.size(); iSat++) {
458    const t_rnxObsFile::t_rnxSat& rnxSat = epo->rnxSat[iSat];
459    char    sys = rnxSat.prn.system();
460    QString prn(rnxSat.prn.toString().c_str());
461
462    for (int iType = 0; iType < obsFile->nTypes(sys); iType++) {
463      QString type = obsFile->obsType(sys, iType);
464      if (!_lli[prn].contains(iType)) {
465        _lli[prn][iType] = 0;
466      }
467      if (rnxSat.obs.contains(type) && rnxSat.obs[type].lli & 1) {
468        _lli[prn][iType] |= 1;
469      }
470    }
471  }
472}
473
474//
475////////////////////////////////////////////////////////////////////////////
476void t_reqcEdit::applyLLI(const t_rnxObsFile* obsFile,
477                          t_rnxObsFile::t_rnxEpo* epo) {
478
479 if (_samplingRate == 0) {
480    return;
481  }
482
483  for (unsigned iSat = 0; iSat < epo->rnxSat.size(); iSat++) {
484    t_rnxObsFile::t_rnxSat& rnxSat = epo->rnxSat[iSat];
485    char    sys = rnxSat.prn.system();
486    QString prn(rnxSat.prn.toString().c_str());
487
488    for (int iType = 0; iType < obsFile->nTypes(sys); iType++) {
489      QString type = obsFile->obsType(sys, iType);
490      if (_lli[prn].contains(iType) && _lli[prn][iType] & 1) {
491        if (rnxSat.obs.contains(type)) {
492          rnxSat.obs[type].lli |= 1;
493        }
494      }
495    }
496  }
497
498  _lli.clear();
499}
500
501/// Read All Ephemerides
502////////////////////////////////////////////////////////////////////////////
503void t_reqcEdit::readEphemerides(const QStringList& navFileNames,
504                                 QVector<t_eph*>& ephs) {
505
506  QStringListIterator it(navFileNames);
507  while (it.hasNext()) {
508    QString fileName = it.next();
509    if (fileName.indexOf('*') != -1 || fileName.indexOf('?') != -1) {
510      QFileInfo fileInfo(fileName);
511      QDir dir = fileInfo.dir();
512      QStringList filters; filters << fileInfo.fileName();
513      QListIterator<QFileInfo> it(dir.entryInfoList(filters));
514      while (it.hasNext()) {
515        QString filePath = it.next().filePath();
516        appendEphemerides(filePath, ephs);
517      }
518    }
519    else {
520      appendEphemerides(fileName, ephs);
521    }
522  }
523  qStableSort(ephs.begin(), ephs.end(), t_eph::earlierTime);
524}
525
526//
527////////////////////////////////////////////////////////////////////////////
528void t_reqcEdit::editEphemerides() {
529
530  // Easy Exit
531  // ---------
532  if (_navFileNames.isEmpty() || _outNavFileName.isEmpty()) {
533    return;
534  }
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  QMap<t_eph::e_type, bool> haveGnss;
564  for (int ii = 0; ii < _ephs.size(); ii++) {
565    const t_eph* eph = _ephs[ii];
566    switch (eph->type()) {
567      case t_eph::GPS:
568        haveGPS = true;
569        haveGnss[t_eph::GLONASS] = true;
570        break;
571      case t_eph::GLONASS:
572        haveGlonass = true;
573        haveGnss[t_eph::GPS] = true;
574        break;
575      case t_eph::Galileo:
576        haveGnss[t_eph::Galileo] = true;
577        break;
578      case t_eph::BDS:
579        haveGnss[t_eph::BDS] = true;
580        break;
581      case t_eph::QZSS:
582        haveGnss[t_eph::QZSS] = true;
583        break;
584      case t_eph::IRNSS:
585        haveGnss[t_eph::IRNSS] = true;
586        break;
587      case t_eph::SBAS:
588        haveGnss[t_eph::SBAS] = true;
589        break;
590      default:
591        haveGnss[t_eph::unknown] = true;
592    }
593  }
594
595  // Initialize output navigation file
596  // ---------------------------------
597  t_rnxNavFile outNavFile(_outNavFileName, t_rnxNavFile::output);
598
599  outNavFile.setGlonass(haveGlonass);
600
601  if ( (haveGPS && haveGlonass) || _rnxVersion >= 3.0) {
602    outNavFile.setVersion(defaultRnxNavVersion3);
603  }
604  else {
605    outNavFile.setVersion(defaultRnxNavVersion2);
606  }
607
608  if (outNavFile.version() > 3.0) {
609    if (haveGnss.size() > 1) {
610      outNavFile.setGnssTypeV3(t_eph::unknown);
611    }
612    else if (haveGnss.size() == 1){
613      outNavFile.setGnssTypeV3(haveGnss.keys().first());
614    }
615  }
616
617  QMap<QString, QString> txtMap;
618  QString runBy = settings.value("reqcRunBy").toString();
619  if (!runBy.isEmpty()) {
620    txtMap["RUN BY"]  = runBy;
621  }
622  if (!comments.isEmpty()) {
623    txtMap["COMMENT"]  = comments.join("\\n");
624  }
625
626  outNavFile.writeHeader(&txtMap);
627
628  // Loop over all ephemerides
629  // -------------------------
630  for (int ii = 0; ii < _ephs.size(); ii++) {
631    const t_eph* eph = _ephs[ii];
632    bncTime begTime = _begTime;
633    bncTime endTime = _endTime;
634    if (eph->type() == t_eph::BDS) {
635      begTime += 14;
636      endTime += 14;
637    }
638    if (begTime.valid() && eph->TOC() < begTime) {
639      continue;
640    }
641    if (endTime.valid() && eph->TOC() > endTime) {
642      break;
643    }
644    if (eph->checkState() != t_eph::bad) {
645      continue;
646    }   
647    outNavFile.writeEph(eph);
648  }
649}
650
651//
652////////////////////////////////////////////////////////////////////////////
653void t_reqcEdit::appendEphemerides(const QString& fileName,
654                                   QVector<t_eph*>& ephs) {
655
656  t_rnxNavFile rnxNavFile(fileName, t_rnxNavFile::input);
657  for (unsigned ii = 0; ii < rnxNavFile.ephs().size(); ii++) {
658    t_eph* eph   = rnxNavFile.ephs()[ii];
659    bool   isNew = true;
660    for (int iOld = 0; iOld < ephs.size(); iOld++) {
661      const t_eph* ephOld = ephs[iOld];
662      if (ephOld->prn() == eph->prn() &&
663          ephOld->TOC() == eph->TOC()) {
664        isNew = false;
665        break;
666      }
667    }
668    if (isNew) {
669      if      (eph->type() == t_eph::GPS) {
670        ephs.append(new t_ephGPS(*dynamic_cast<t_ephGPS*>(eph)));
671      }
672      else if (eph->type() == t_eph::GLONASS) {
673        ephs.append(new t_ephGlo(*dynamic_cast<t_ephGlo*>(eph)));
674      }
675      else if (eph->type() == t_eph::Galileo) {
676        ephs.append(new t_ephGal(*dynamic_cast<t_ephGal*>(eph)));
677      }
678      else if (eph->type() == t_eph::QZSS) {
679        ephs.append(new t_ephGPS(*dynamic_cast<t_ephGPS*>(eph)));
680      }
681      else if (eph->type() == t_eph::SBAS) {
682        ephs.append(new t_ephSBAS(*dynamic_cast<t_ephSBAS*>(eph)));
683      }
684      else if (eph->type() == t_eph::BDS) {
685        ephs.append(new t_ephBDS(*dynamic_cast<t_ephBDS*>(eph)));
686      }
687      else if (eph->type() == t_eph::IRNSS) {
688        ephs.append(new t_ephGPS(*dynamic_cast<t_ephGPS*>(eph)));
689      }
690    }
691  }
692}
693
694void t_reqcEdit::addRnxConversionDetails(const t_rnxObsFile* obsFile,
695                                          QMap<QString, QString>& txtMap) {
696
697  int key = 0;
698  QString systems = obsFile->header().usedSystems();
699  QString comment = QString("Signal priorities for RINEX 3 => 2 conversion:");
700  QString commentKey = QString("COMMENT %1").arg(key, 3, 10, QChar('0'));
701  txtMap.insert(commentKey, comment);
702
703  for(int ii = 0; ii < obsFile->numSys(); ii++) {
704    char sys = systems[ii].toAscii();
705    txtMap.insert(commentKey, comment);
706    QMap <char, QString>  signalPriorityMap;
707    QStringList preferredAttribListSys = obsFile->signalPriorities(sys);
708    QStringList types = obsFile->header().obsTypes(sys);
709    for (int jj = 0; jj < types.size(); jj++) {
710      QString inType = types[jj];
711      char band = inType[1].toAscii();
712      for (int ii = 0; ii < preferredAttribListSys.size(); ii++) {
713        QString preferredAttrib;
714        if (preferredAttribListSys[ii].indexOf("&") != -1) {
715          QStringList hlp = preferredAttribListSys[ii].split("&", QString::SkipEmptyParts);
716          if (hlp.size() == 2 && hlp[0].contains(band)) {
717            preferredAttrib = hlp[1];
718          }
719        }
720        else {
721          preferredAttrib = preferredAttribListSys[ii];
722        }
723        if (!signalPriorityMap.contains(band) && !preferredAttrib.isEmpty()){
724          signalPriorityMap[band] = preferredAttrib;
725        }
726      }
727    }
728    QMapIterator<char, QString> it(signalPriorityMap);
729    while (it.hasNext()) {
730        it.next();
731        key++;
732        comment = QString("%1 band %2: %3").arg(sys).arg(it.key()).arg(it.value());
733        commentKey = QString("COMMENT %1").arg(key, 3, 10, QChar('0'));
734        txtMap.insert(commentKey, comment);
735    }
736  }
737}
Note: See TracBrowser for help on using the repository browser.