| 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 | class t_rnxObsHeader {
 | 
|---|
| 41 | 
 | 
|---|
| 42 |  friend class t_rnxObsFile;
 | 
|---|
| 43 | 
 | 
|---|
| 44 |  public:
 | 
|---|
| 45 |   static const double  defaultRnxObsVersion2 = 2.11;
 | 
|---|
| 46 |   static const double  defaultRnxObsVersion3 = 3.02;
 | 
|---|
| 47 |   static const QString defaultSystems;
 | 
|---|
| 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, const QStringList* useObsTypes = 0);
 | 
|---|
| 56 |   int         numSys() const;
 | 
|---|
| 57 |   char        system(int iSys) const;
 | 
|---|
| 58 |   int         nTypes(char sys) const;
 | 
|---|
| 59 |   QString     obsType(char sys, int index, double version = 0.0) const;
 | 
|---|
| 60 |   void        write(QTextStream* stream, const QMap<QString, QString>* txtMap = 0) const;
 | 
|---|
| 61 |   bncTime     startTime() const {return _startTime;}
 | 
|---|
| 62 |   void        setStartTime(const bncTime& startTime) {_startTime = startTime;}
 | 
|---|
| 63 | 
 | 
|---|
| 64 |  private:
 | 
|---|
| 65 |   QStringList obsTypesStrings() const;
 | 
|---|
| 66 |   QString                 _usedSystems;
 | 
|---|
| 67 |   double                  _version;
 | 
|---|
| 68 |   double                  _interval;
 | 
|---|
| 69 |   QString                 _antennaNumber;
 | 
|---|
| 70 |   QString                 _antennaName;
 | 
|---|
| 71 |   QString                 _markerName;
 | 
|---|
| 72 |   QString                 _markerNumber;
 | 
|---|
| 73 |   QString                 _observer;
 | 
|---|
| 74 |   QString                 _agency;
 | 
|---|
| 75 |   QString                 _receiverNumber;
 | 
|---|
| 76 |   QString                 _receiverType;
 | 
|---|
| 77 |   QString                 _receiverVersion;
 | 
|---|
| 78 |   QStringList             _comments;
 | 
|---|
| 79 |   ColumnVector            _antNEU;
 | 
|---|
| 80 |   ColumnVector            _antXYZ;
 | 
|---|
| 81 |   ColumnVector            _antBSG;
 | 
|---|
| 82 |   ColumnVector            _xyz;
 | 
|---|
| 83 |   QMap<char, QStringList> _obsTypes;
 | 
|---|
| 84 |   int                     _wlFactorsL1[t_prn::MAXPRN_GPS+1];
 | 
|---|
| 85 |   int                     _wlFactorsL2[t_prn::MAXPRN_GPS+1];
 | 
|---|
| 86 |   bncTime                 _startTime;
 | 
|---|
| 87 | };
 | 
|---|
| 88 | 
 | 
|---|
| 89 | class t_rnxObsFile {
 | 
|---|
| 90 |  public:
 | 
|---|
| 91 | 
 | 
|---|
| 92 |   static bool earlierStartTime(const t_rnxObsFile* file1, const t_rnxObsFile* file2) {
 | 
|---|
| 93 |     return file1->startTime() < file2->startTime();
 | 
|---|
| 94 |   }
 | 
|---|
| 95 | 
 | 
|---|
| 96 |   class t_rnxObs {
 | 
|---|
| 97 |    public:
 | 
|---|
| 98 |     t_rnxObs() {
 | 
|---|
| 99 |       value = 0.0; lli = 0; snr = 0;
 | 
|---|
| 100 |     }
 | 
|---|
| 101 |     double value;
 | 
|---|
| 102 |     int    lli;
 | 
|---|
| 103 |     int    snr;
 | 
|---|
| 104 |   };
 | 
|---|
| 105 | 
 | 
|---|
| 106 |   class t_rnxSat {
 | 
|---|
| 107 |    public:
 | 
|---|
| 108 |     t_prn                   prn;
 | 
|---|
| 109 |     QMap<QString, t_rnxObs> obs;
 | 
|---|
| 110 |   };
 | 
|---|
| 111 | 
 | 
|---|
| 112 |   class t_rnxEpo {
 | 
|---|
| 113 |    public:
 | 
|---|
| 114 |     t_rnxEpo() {clear();}
 | 
|---|
| 115 |     void clear() {
 | 
|---|
| 116 |       tt.reset();
 | 
|---|
| 117 |       rnxSat.clear();
 | 
|---|
| 118 |     }
 | 
|---|
| 119 |     bncTime               tt;
 | 
|---|
| 120 |     std::vector<t_rnxSat> rnxSat;
 | 
|---|
| 121 |   };
 | 
|---|
| 122 | 
 | 
|---|
| 123 |   enum e_inpOut {input, output};
 | 
|---|
| 124 | 
 | 
|---|
| 125 |   t_rnxObsFile(const QString& fileName, e_inpOut inpOut);
 | 
|---|
| 126 |   ~t_rnxObsFile();
 | 
|---|
| 127 |   
 | 
|---|
| 128 |   double         version() const {return _header._version;}
 | 
|---|
| 129 |   double         interval() const {return _header._interval;}
 | 
|---|
| 130 |   int            numSys() const {return _header.numSys();}
 | 
|---|
| 131 |   char           system(int iSys) const {return _header.system(iSys);}
 | 
|---|
| 132 |   int            nTypes(char sys) const {return _header.nTypes(sys);}
 | 
|---|
| 133 |   const QString& fileName() const {return _fileName;}
 | 
|---|
| 134 |   QString obsType(char sys, int index, double version = 0.0) const {
 | 
|---|
| 135 |     return _header.obsType(sys, index, version);
 | 
|---|
| 136 |   }
 | 
|---|
| 137 |   const QString& antennaName() const {return _header._antennaName;}
 | 
|---|
| 138 |   const QString& markerName() const {return _header._markerName;}
 | 
|---|
| 139 |   const QString& receiverType() const {return _header._receiverType;}
 | 
|---|
| 140 | 
 | 
|---|
| 141 |   void setInterval(double interval) {_header._interval = interval;}
 | 
|---|
| 142 |   void setAntennaName(const QString& antennaName) {_header._antennaName = antennaName;}
 | 
|---|
| 143 |   void setMarkerName(const QString& markerName) {_header._markerName = markerName;}
 | 
|---|
| 144 |   void setReceiverType(const QString& receiverType) {_header._receiverType = receiverType;}
 | 
|---|
| 145 | 
 | 
|---|
| 146 |   const ColumnVector& xyz() const {return _header._xyz;}
 | 
|---|
| 147 |   const ColumnVector& antNEU() const {return _header._antNEU;}
 | 
|---|
| 148 |   const ColumnVector& antXYZ() const {return _header._antXYZ;}
 | 
|---|
| 149 |   const ColumnVector& antBSG() const {return _header._antBSG;}
 | 
|---|
| 150 | 
 | 
|---|
| 151 |   const bncTime&      startTime() const {return _header._startTime;}
 | 
|---|
| 152 |   void  setStartTime(const bncTime& startTime) {_header._startTime = startTime;}
 | 
|---|
| 153 | 
 | 
|---|
| 154 |   t_rnxEpo* nextEpoch(); 
 | 
|---|
| 155 | 
 | 
|---|
| 156 |   int wlFactorL1(unsigned iPrn) {
 | 
|---|
| 157 |     return iPrn <= t_prn::MAXPRN_GPS ? _header._wlFactorsL1[iPrn] : 1;
 | 
|---|
| 158 |   }
 | 
|---|
| 159 |   int wlFactorL2(unsigned iPrn) {
 | 
|---|
| 160 |     return iPrn <= t_prn::MAXPRN_GPS ? _header._wlFactorsL2[iPrn] : 1;
 | 
|---|
| 161 |   }
 | 
|---|
| 162 | 
 | 
|---|
| 163 |   const t_rnxObsHeader& header() const {return _header;}
 | 
|---|
| 164 | 
 | 
|---|
| 165 |   void setHeader(const t_rnxObsHeader& header, int version, const QStringList* useObsTypes = 0) {
 | 
|---|
| 166 |     _header.set(header, version, useObsTypes);
 | 
|---|
| 167 |   }
 | 
|---|
| 168 | 
 | 
|---|
| 169 |   void writeEpoch(const t_rnxEpo* epo);
 | 
|---|
| 170 | 
 | 
|---|
| 171 |   QTextStream* stream() {return _stream;}
 | 
|---|
| 172 | 
 | 
|---|
| 173 |   static void setObsFromRnx(const t_rnxObsFile* rnxObsFile, const t_rnxObsFile::t_rnxEpo* epo, 
 | 
|---|
| 174 |                             const t_rnxObsFile::t_rnxSat& rnxSat, t_satObs& obs);
 | 
|---|
| 175 | 
 | 
|---|
| 176 |   static QString type2to3(char sys, const QString& typeV2);
 | 
|---|
| 177 |   static QString type3to2(char sys, const QString& typeV3);
 | 
|---|
| 178 | 
 | 
|---|
| 179 |   static void writeEpoch(QTextStream* stream, const t_rnxObsHeader& header, const t_rnxEpo* epo) {
 | 
|---|
| 180 |     if (header.version() >= 3.0) {
 | 
|---|
| 181 |       writeEpochV3(stream, header, epo);
 | 
|---|
| 182 |     }
 | 
|---|
| 183 |     else {
 | 
|---|
| 184 |       writeEpochV2(stream, header, epo);
 | 
|---|
| 185 |     }
 | 
|---|
| 186 |   }
 | 
|---|
| 187 | 
 | 
|---|
| 188 |  private:
 | 
|---|
| 189 |   static void writeEpochV2(QTextStream* stream, const t_rnxObsHeader& header, const t_rnxEpo* epo);
 | 
|---|
| 190 |   static void writeEpochV3(QTextStream* stream, const t_rnxObsHeader& header, const t_rnxEpo* epo);
 | 
|---|
| 191 |   static QString signalPriorities(char sys);
 | 
|---|
| 192 |   t_rnxObsFile() {};
 | 
|---|
| 193 |   void openRead(const QString& fileName);
 | 
|---|
| 194 |   void openWrite(const QString& fileName);
 | 
|---|
| 195 |   void close();
 | 
|---|
| 196 |   t_rnxEpo* nextEpochV2();
 | 
|---|
| 197 |   t_rnxEpo* nextEpochV3();
 | 
|---|
| 198 |   void handleEpochFlag(int flag, const QString& line, bool& headerReRead);
 | 
|---|
| 199 | 
 | 
|---|
| 200 |   e_inpOut       _inpOut;
 | 
|---|
| 201 |   QFile*         _file;
 | 
|---|
| 202 |   QString        _fileName;
 | 
|---|
| 203 |   QTextStream*   _stream;
 | 
|---|
| 204 |   t_rnxObsHeader _header;
 | 
|---|
| 205 |   t_rnxEpo       _currEpo;
 | 
|---|
| 206 |   bool           _flgPowerFail;
 | 
|---|
| 207 | };
 | 
|---|
| 208 | 
 | 
|---|
| 209 | #endif
 | 
|---|