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

Last change on this file since 8351 was 8351, checked in by stuerze, 11 months ago

individual satellite system will be considerred now during concatenation of ephemeris files

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    outNavFile.writeEph(eph);
645  }
646}
647
648//
649////////////////////////////////////////////////////////////////////////////
650void t_reqcEdit::appendEphemerides(const QString& fileName,
651                                   QVector<t_eph*>& ephs) {
652
653  t_rnxNavFile rnxNavFile(fileName, t_rnxNavFile::input);
654  for (unsigned ii = 0; ii < rnxNavFile.ephs().size(); ii++) {
655    t_eph* eph   = rnxNavFile.ephs()[ii];
656    bool   isNew = true;
657    for (int iOld = 0; iOld < ephs.size(); iOld++) {
658      const t_eph* ephOld = ephs[iOld];
659      if (ephOld->prn() == eph->prn() &&
660          ephOld->TOC() == eph->TOC()) {
661        isNew = false;
662        break;
663      }
664    }
665    if (isNew) {
666      if      (eph->type() == t_eph::GPS) {
667        ephs.append(new t_ephGPS(*dynamic_cast<t_ephGPS*>(eph)));
668      }
669      else if (eph->type() == t_eph::GLONASS) {
670        ephs.append(new t_ephGlo(*dynamic_cast<t_ephGlo*>(eph)));
671      }
672      else if (eph->type() == t_eph::Galileo) {
673        ephs.append(new t_ephGal(*dynamic_cast<t_ephGal*>(eph)));
674      }
675      else if (eph->type() == t_eph::QZSS) {
676        ephs.append(new t_ephGPS(*dynamic_cast<t_ephGPS*>(eph)));
677      }
678      else if (eph->type() == t_eph::SBAS) {
679        ephs.append(new t_ephSBAS(*dynamic_cast<t_ephSBAS*>(eph)));
680      }
681      else if (eph->type() == t_eph::BDS) {
682        ephs.append(new t_ephBDS(*dynamic_cast<t_ephBDS*>(eph)));
683      }
684      else if (eph->type() == t_eph::IRNSS) {
685        ephs.append(new t_ephGPS(*dynamic_cast<t_ephGPS*>(eph)));
686      }
687    }
688  }
689}
690
691void t_reqcEdit::addRnxConversionDetails(const t_rnxObsFile* obsFile,
692                                          QMap<QString, QString>& txtMap) {
693
694  int key = 0;
695  QString systems = obsFile->header().usedSystems();
696  QString comment = QString("Signal priorities for RINEX 3 => 2 conversion:");
697  QString commentKey = QString("COMMENT %1").arg(key, 3, 10, QChar('0'));
698  txtMap.insert(commentKey, comment);
699
700  for(int ii = 0; ii < obsFile->numSys(); ii++) {
701    char sys = systems[ii].toAscii();
702    txtMap.insert(commentKey, comment);
703    QMap <char, QString>  signalPriorityMap;
704    QStringList preferredAttribListSys = obsFile->signalPriorities(sys);
705    QStringList types = obsFile->header().obsTypes(sys);
706    for (int jj = 0; jj < types.size(); jj++) {
707      QString inType = types[jj];
708      char band = inType[1].toAscii();
709      for (int ii = 0; ii < preferredAttribListSys.size(); ii++) {
710        QString preferredAttrib;
711        if (preferredAttribListSys[ii].indexOf("&") != -1) {
712          QStringList hlp = preferredAttribListSys[ii].split("&", QString::SkipEmptyParts);
713          if (hlp.size() == 2 && hlp[0].contains(band)) {
714            preferredAttrib = hlp[1];
715          }
716        }
717        else {
718          preferredAttrib = preferredAttribListSys[ii];
719        }
720        if (!signalPriorityMap.contains(band) && !preferredAttrib.isEmpty()){
721          signalPriorityMap[band] = preferredAttrib;
722        }
723      }
724    }
725    QMapIterator<char, QString> it(signalPriorityMap);
726    while (it.hasNext()) {
727        it.next();
728        key++;
729        comment = QString("%1 band %2: %3").arg(sys).arg(it.key()).arg(it.value());
730        commentKey = QString("COMMENT %1").arg(key, 3, 10, QChar('0'));
731        txtMap.insert(commentKey, comment);
732    }
733  }
734}
Note: See TracBrowser for help on using the repository browser.