source: ntrip/trunk/BNC/src/bncsp3.cpp@ 10583

Last change on this file since 10583 was 10578, checked in by stuerze, 5 weeks ago

updates regarding RINEX version 4.02 navigation information

File size: 7.9 KB
RevLine 
[3176]1
2/* -------------------------------------------------------------------------
3 * BKG NTRIP Server
4 * -------------------------------------------------------------------------
5 *
6 * Class: bncSP3
7 *
8 * Purpose: writes SP3 files
9 *
10 * Author: L. Mervart
11 *
12 * Created: 25-Apr-2008
13 *
[8084]14 * Changes:
[3176]15 *
16 * -----------------------------------------------------------------------*/
17
18#include <iomanip>
[6331]19#include <sstream>
[9178]20#include <iostream>
[3176]21#include <math.h>
22
23#include "bncsp3.h"
24#include "bncutils.h"
25
26using namespace std;
27
28// Constructor
29////////////////////////////////////////////////////////////////////////////
[6331]30bncSP3::bncSP3(const QString& fileName) : bncoutf(QString(), QString(), 0) {
31 _inpOut = input;
32 _currEpoch = 0;
33 _prevEpoch = 0;
34
[8204]35 _stream.open(fileName.toLatin1().data());
[6331]36 if (!_stream.good()) {
37 throw "t_sp3File: cannot open file " + fileName;
[8084]38 }
[6331]39
40 while (_stream.good()) {
41 getline(_stream, _lastLine);
42 if (_lastLine[0] == '*') {
43 break;
44 }
45 }
46}
47
48// Constructor
49////////////////////////////////////////////////////////////////////////////
[8084]50bncSP3::bncSP3(const QString& sklFileName, const QString& intr, int sampl)
[3184]51 : bncoutf(sklFileName, intr, sampl) {
[6331]52 _inpOut = output;
53 _currEpoch = 0;
54 _prevEpoch = 0;
[3176]55}
56
57// Destructor
58////////////////////////////////////////////////////////////////////////////
59bncSP3::~bncSP3() {
[6331]60 delete _currEpoch;
61 delete _prevEpoch;
[3176]62}
63
64// Write One Epoch
65////////////////////////////////////////////////////////////////////////////
[8084]66t_irc bncSP3::write(int GPSweek, double GPSweeks, const QString& prn,
[8483]67 const ColumnVector& xCoM, double sp3Clk,
68 const ColumnVector& v, double sp3ClkRate) {
[3176]69
[3184]70 if (reopen(GPSweek, GPSweeks) == success) {
[3176]71
[4296]72 bncTime epoTime(GPSweek, GPSweeks);
73
74 if (epoTime != _lastEpoTime) {
75
76 // Check the sampling interval (print empty epochs)
77 // ------------------------------------------------
[4298]78 if (_lastEpoTime.valid() && _sampl > 0) {
[4296]79 for (bncTime ep = _lastEpoTime +_sampl; ep < epoTime; ep = ep +_sampl) {
[10127]80 _out << "\n* " << ep.datestr(' ') << ' ' << ep.timestr(8, ' ');
[4296]81 }
82 }
83
[8084]84 // Print the new epoch
[4296]85 // -------------------
[10127]86 _out << "\n* " << epoTime.datestr(' ') << ' ' << epoTime.timestr(8, ' ');
[4296]87
88 _lastEpoTime = epoTime;
[3176]89 }
[4296]90
[10127]91 _out << "\nP" << prn.toLatin1().data()
[8483]92 << setw(14) << setprecision(6) << xCoM(1) / 1000.0 // [km]
93 << setw(14) << setprecision(6) << xCoM(2) / 1000.0 // [km]
94 << setw(14) << setprecision(6) << xCoM(3) / 1000.0 // [km]
[10127]95 << setw(14) << setprecision(6) << sp3Clk * 1e6; // microseconds
[8084]96
[8483]97 if (sp3ClkRate) {
[10127]98 _out << "\nV" << prn.toLatin1().data()
[8483]99 << setw(14) << setprecision(6) << v(1) * 10.0 // [dm/s]
100 << setw(14) << setprecision(6) << v(2) * 10.0 // [dm/s]
101 << setw(14) << setprecision(6) << v(3) * 10.0 // [dm/s]
[10127]102 << setw(14) << setprecision(6) << sp3ClkRate * 1e2; // 10^⁻4 microseconds/sec
[8483]103 }
[3176]104 return success;
105 }
106 else {
107 return failure;
108 }
109}
110
111// Close File (write last line)
112////////////////////////////////////////////////////////////////////////////
113void bncSP3::closeFile() {
[10578]114 _out << "\nEOF" << endl;
[3176]115 bncoutf::closeFile();
116}
117
118// Write Header
119////////////////////////////////////////////////////////////////////////////
120void bncSP3::writeHeader(const QDateTime& datTim) {
121
122 int GPSWeek;
123 double GPSWeeks;
124 GPSweekFromDateAndTime(datTim, GPSWeek, GPSWeeks);
125
126 double sec = fmod(GPSWeeks, 60.0);
127
128 int mjd;
129 double dayfrac;
130 mjdFromDateAndTime(datTim, mjd, dayfrac);
[8084]131
[4382]132 int numEpo = _numSec;
133 if (_sampl > 0) {
134 numEpo /= _sampl;
135 }
[3176]136
[9418]137 _out << "#dP" << datTim.toString("yyyy MM dd hh mm").toLatin1().data()
[3176]138 << setw(12) << setprecision(8) << sec
[9908]139 << " " << setw(7) << numEpo << " ORBIT IGS20 HLM IGS" << endl;
[3176]140
[8084]141 _out << "## "
[3176]142 << setw(4) << GPSWeek
143 << setw(16) << setprecision(8) << GPSWeeks
144 << setw(15) << setprecision(8) << double(_sampl)
145 << setw(6) << mjd
146 << setw(16) << setprecision(13) << dayfrac << endl;
147
[9418]148 _out << "+ 177 G01G02G03G04G05G06G07G08G09G10G11G12G13G14G15G16G17\n"
[3714]149 << "+ G18G19G20G21G22G23G24G25G26G27G28G29G30G31G32R01R02\n"
150 << "+ R03R04R05R06R07R08R09R10R11R12R13R14R15R16R17R18R19\n"
[9418]151 << "+ R20R21R22R23R24R25R26E01E02E03E04E05E06E07E08E09E10\n"
152 << "+ E11E12E13E14E15E16E17E18E19E20E21E22E23E24E25E26E27\n"
153 << "+ E28E29E30E31E32E33E34E35E36C01C02C03C04C05C06C07C08\n"
154 << "+ C09C10C11C12C13C14C15C16C17C18C19C20C21C22C23C24C25\n"
155 << "+ C26C27C28C29C30C31C32C33C34C35C36C37C38C39C40C41C42\n"
156 << "+ C43C44C45C46C47C48C49C50C51C52C53C54C55C56C57C58C59\n"
157 << "+ C60C61C62C63J01J02J03J04I01I02I03I04I05I06I07S20S24\n"
158 << "+ S27S28S29S33S35S37S38 0 0 0 0 0 0 0 0 0 0\n"
[3176]159 << "++ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"
160 << "++ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"
161 << "++ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"
162 << "++ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"
163 << "++ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"
[9418]164 << "++ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"
165 << "++ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"
166 << "++ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"
167 << "++ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"
168 << "++ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"
169 << "++ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"
170 << "%c M cc GPS ccc cccc cccc cccc cccc ccccc ccccc ccccc ccccc\n"
[3176]171 << "%c cc cc ccc ccc cccc cccc cccc cccc ccccc ccccc ccccc ccccc\n"
172 << "%f 0.0000000 0.000000000 0.00000000000 0.000000000000000\n"
173 << "%f 0.0000000 0.000000000 0.00000000000 0.000000000000000\n"
174 << "%i 0 0 0 0 0 0 0 0 0\n"
175 << "%i 0 0 0 0 0 0 0 0 0\n"
176 << "/* \n"
177 << "/* \n"
178 << "/* \n"
179 << "/* \n";
180}
181
[6331]182// Read Next Epoch
183////////////////////////////////////////////////////////////////////////////
184const bncSP3::t_sp3Epoch* bncSP3::nextEpoch() {
185
186 delete _prevEpoch; _prevEpoch = _currEpoch; _currEpoch = 0;
187
[6354]188 if (_lastLine[0] == '*') {
189 _currEpoch = new t_sp3Epoch();
190 istringstream in(_lastLine.substr(1).c_str());
191 int YY, MM, DD, hh, mm;
192 double ss;
193 in >> YY >> MM >> DD >> hh >> mm >> ss;
194 _currEpoch->_tt.set(YY, MM, DD, hh, mm, ss);
195 }
196
[6440]197 while (_stream.good()) {
[6331]198 getline(_stream, _lastLine);
199 if (_stream.eof() || _lastLine.find("EOF") == 0) {
[6440]200 _stream.close();
[6331]201 break;
202 }
203 if (_lastLine[0] == '*') {
204 break;
205 }
[10123]206 if (_lastLine[0] == 'V') {
207 continue;
208 }
[6331]209 t_sp3Sat* sp3Sat = new t_sp3Sat();
210 istringstream in(_lastLine.substr(1).c_str());
[8084]211 in >> sp3Sat->_prn >> sp3Sat->_xyz(1) >> sp3Sat->_xyz(2) >> sp3Sat->_xyz(3) >> sp3Sat->_clk;
[10127]212 sp3Sat->_xyz *= 1.e3;
[6331]213
[10127]214 // Simple Check - check satellite radial distance
215 double rr = sp3Sat->_xyz.NormFrobenius();
216 const double MINDIST = 2.e7;
217 const double MAXDIST = 6.e7;
218 if (rr < MINDIST || rr > MAXDIST || std::isnan(rr)) {
[6533]219 delete sp3Sat;
220 continue;
221 }
222
[10127]223 // Simple Check - clock valid
[10128]224 if (sp3Sat->_clk == 999999.999999 ||
225 sp3Sat->_clk == 0.0) {
[6351]226 sp3Sat->_clkValid = false;
227 sp3Sat->_clk = 0.0;
228 }
229 else {
230 sp3Sat->_clkValid = true;
231 sp3Sat->_clk *= t_CST::c * 1.e-6;
232 }
[6331]233
234 _currEpoch->_sp3Sat.push_back(sp3Sat);
235 }
236
237 return _currEpoch;
238}
Note: See TracBrowser for help on using the repository browser.