source: ntrip/branches/BNC_2.12/src/rinex/rnxobsfile.h @ 8295

Last change on this file since 8295 was 8295, checked in by stuerze, 18 months ago

minor changes to allow GPS, GLONASS, Galileo and SBAS observations in RINEX v2.11 only

File size: 8.9 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#ifndef RNXOBSFILE_H
26#define RNXOBSFILE_H
27
28#include <QtCore>
29
30#include <fstream>
31#include <vector>
32#include <map>
33
34#include "newmat.h"
35#include "bncconst.h"
36#include "bnctime.h"
37#include "t_prn.h"
38#include "satObs.h"
39
40#define defaultRnxObsVersion2 2.11
41#define defaultRnxObsVersion3 3.03
42
43class t_rnxObsHeader {
44
45 friend class t_rnxObsFile;
46
47 public:
48 
49  t_rnxObsHeader();
50  ~t_rnxObsHeader();
51
52  double      version() const {return _version;}
53  t_irc       read(QTextStream* stream, int maxLines = 0);
54  void        setDefault(const QString& markerName, int version);
55  void        set(const t_rnxObsHeader& header, int version,
56                  const QStringList* useObsTypes = 0, const QStringList* phaseShifts = 0,
57                  const QStringList* gloBiases = 0, const QStringList* gloSlots = 0);
58  int         numSys() const;
59  char        system(int iSys) const;
60  int         nTypes(char sys) const;
61  int         numGloBiases() const;
62  int         numGloSlots() const;
63  QString     obsType(char sys, int index, double version = 0.0) const;
64  QString     usedSystems() const;
65  QStringList obsTypes(char sys) const;
66  QStringList phaseShifts() const;
67  QStringList gloBiases() const;
68  QStringList gloSlots() const;
69  void        write(QTextStream* stream, const QMap<QString, QString>* txtMap = 0) const;
70  bncTime     startTime() const {return _startTime;}
71  void        setStartTime(const bncTime& startTime) {_startTime = startTime;}
72
73 private:
74  QStringList obsTypesStrings() const;
75  QString         _usedSystems;
76  double          _version;
77  double          _interval;
78  QString         _antennaNumber;
79  QString         _antennaName;
80  QString         _markerName;
81  QString         _markerNumber;
82  QString         _markerType;
83  QString         _observer;
84  QString         _agency;
85  QString         _receiverNumber;
86  QString         _receiverType;
87  QString         _receiverVersion;
88  QStringList     _comments;
89  ColumnVector    _antNEU;
90  ColumnVector    _antXYZ;
91  ColumnVector    _antBSG;
92  ColumnVector    _xyz;
93  QMap<char, QStringList> _obsTypes;
94  QMap<t_prn, int>        _gloSlots;
95  QMap<QString, double>   _gloBiases;
96  int                     _wlFactorsL1[t_prn::MAXPRN_GPS+1];
97  int                     _wlFactorsL2[t_prn::MAXPRN_GPS+1];
98  bncTime                 _startTime;
99  bool                    _writeRinexOnlyWithSklObsTypes;
100
101  QMap<QString, QPair<double, QStringList> > _phaseShifts;
102};
103
104class t_rnxObsFile {
105 public:
106
107  static bool earlierStartTime(const t_rnxObsFile* file1, const t_rnxObsFile* file2) {
108    return file1->startTime() < file2->startTime();
109  }
110
111  class t_rnxObs {
112   public:
113    t_rnxObs() {
114      value = 0.0; lli = 0; snr = 0;
115    }
116    double value;
117    int    lli;
118    int    snr;
119  };
120
121  class t_rnxSat {
122   public:
123    t_prn                   prn;
124    QMap<QString, t_rnxObs> obs;
125  };
126
127  class t_rnxEpo {
128   public:
129    t_rnxEpo() {clear();}
130    void clear() {
131      tt.reset();
132      rnxSat.clear();
133    }
134    bncTime               tt;
135    std::vector<t_rnxSat> rnxSat;
136  };
137
138  enum e_inpOut {input, output};
139
140  t_rnxObsFile(const QString& fileName, e_inpOut inpOut);
141  ~t_rnxObsFile();
142
143  double         version() const {return _header._version;}
144  double         interval() const {return _header._interval;}
145  int            numSys() const {return _header.numSys();}
146  char           system(int iSys) const {return _header.system(iSys);}
147  int            nTypes(char sys) const {return _header.nTypes(sys);}
148  int            numGloBiases() const {return _header.numGloBiases();}
149  int            numGloSlots() const {return _header.numGloSlots();}
150  const QString& fileName() const {return _fileName;}
151  QString obsType(char sys, int index, double version = 0.0) const {
152    return _header.obsType(sys, index, version);
153  }
154  QStringList phaseShifts() const {return _header.phaseShifts();}
155  QStringList gloBiases() const {return _header.gloBiases();}
156  QStringList gloSlots() const {return _header.gloSlots();}
157  const QString& antennaName() const {return _header._antennaName;}
158  const QString& antennaNumber() const {return _header._antennaNumber;}
159  const QString& markerName() const {return _header._markerName;}
160  const QString& markerNumber() const {return _header._markerNumber;}
161  const QString& receiverType() const {return _header._receiverType;}
162  const QString& receiverNumber() const {return _header._receiverNumber;}
163
164  void setInterval(double interval) {_header._interval = interval;}
165  void setAntennaName(const QString& antennaName) {_header._antennaName = antennaName;}
166  void setAntennaNumber(const QString& antennaNumber) {_header._antennaNumber = antennaNumber;}
167  void setAntennaN(double antN) {_header._antNEU(1) = antN;}
168  void setAntennaE(double antE) {_header._antNEU(2) = antE;}
169  void setAntennaU(double antU) {_header._antNEU(3) = antU;}
170
171  void setMarkerName(const QString& markerName) {_header._markerName = markerName;}
172  void setReceiverType(const QString& receiverType) {_header._receiverType = receiverType;}
173  void setReceiverNumber(const QString& receiverNumber) {_header._receiverNumber = receiverNumber;}
174
175  const ColumnVector& xyz() const {return _header._xyz;}
176  const ColumnVector& antNEU() const {return _header._antNEU;}
177  const ColumnVector& antXYZ() const {return _header._antXYZ;}
178  const ColumnVector& antBSG() const {return _header._antBSG;}
179
180  const bncTime&      startTime() const {return _header._startTime;}
181  void  setStartTime(const bncTime& startTime) {_header._startTime = startTime;}
182
183  t_rnxEpo* nextEpoch();
184
185  int wlFactorL1(unsigned iPrn) {
186    return iPrn <= t_prn::MAXPRN_GPS ? _header._wlFactorsL1[iPrn] : 1;
187  }
188  int wlFactorL2(unsigned iPrn) {
189    return iPrn <= t_prn::MAXPRN_GPS ? _header._wlFactorsL2[iPrn] : 1;
190  }
191
192  const t_rnxObsHeader& header() const {return _header;}
193
194  void setHeader(const t_rnxObsHeader& header, int version,
195      const QStringList* useObsTypes = 0, const QStringList* phaseShifts = 0,
196      const QStringList* gloBiases = 0, const QStringList* gloSlots = 0) {
197    _header.set(header, version, useObsTypes, phaseShifts, gloBiases, gloSlots);
198  }
199
200  void writeEpoch(const t_rnxEpo* epo);
201
202  QTextStream* stream() {return _stream;}
203
204  static void setObsFromRnx(const t_rnxObsFile* rnxObsFile, const t_rnxObsFile::t_rnxEpo* epo,
205                            const t_rnxObsFile::t_rnxSat& rnxSat, t_satObs& obs);
206
207  static QString type2to3(char sys, const QString& typeV2);
208  static QString type3to2(char sys, const QString& typeV3);
209  static QStringList signalPriorities(char sys);
210
211  static void writeEpoch(QTextStream* stream, const t_rnxObsHeader& header, const t_rnxEpo* epo) {
212    if (epo == 0) {
213      return;
214    }
215    t_rnxEpo epoLocal;
216    epoLocal.tt = epo->tt;
217    for (unsigned ii = 0; ii < epo->rnxSat.size(); ii++) {
218      const t_rnxSat& rnxSat = epo->rnxSat[ii];
219      if (header._obsTypes[rnxSat.prn.system()].size() > 0) {
220        if (header.version() < 3.0) { // exclude new GNSS such as BDS, QZSS, IRNSS, etc.
221            if (rnxSat.prn.system() != 'G' && rnxSat.prn.system() != 'R' &&
222                rnxSat.prn.system() != 'E' && rnxSat.prn.system() != 'S') {
223              continue;
224            }
225        }
226        epoLocal.rnxSat.push_back(rnxSat);
227      }
228    }
229    if (header.version() >= 3.0) {
230      writeEpochV3(stream, header, &epoLocal);
231    }
232    else {
233      writeEpochV2(stream, header, &epoLocal);
234    }
235  }
236
237 private:
238  static void writeEpochV2(QTextStream* stream, const t_rnxObsHeader& header, const t_rnxEpo* epo);
239  static void writeEpochV3(QTextStream* stream, const t_rnxObsHeader& header, const t_rnxEpo* epo);
240  t_rnxObsFile() {};
241  void openRead(const QString& fileName);
242  void openWrite(const QString& fileName);
243  void close();
244  t_rnxEpo* nextEpochV2();
245  t_rnxEpo* nextEpochV3();
246  void handleEpochFlag(int flag, const QString& line, bool& headerReRead);
247
248  e_inpOut       _inpOut;
249  QFile*         _file;
250  QString        _fileName;
251  QTextStream*   _stream;
252  t_rnxObsHeader _header;
253  t_rnxEpo       _currEpo;
254  bool           _flgPowerFail;
255};
256
257#endif
Note: See TracBrowser for help on using the repository browser.