source: ntrip/trunk/BNC/src/bnctime.cpp@ 8373

Last change on this file since 8373 was 8372, checked in by stuerze, 6 years ago

minor changes to allow 10 Hz observation data processing (latency checker) and resampling (RINEX files, feed engine)

File size: 9.8 KB
RevLine 
[3986]1
2#include <qdatetime.h>
[2123]3#include <time.h>
4#include <cmath>
5#include <cstdio>
6#include <sstream>
7#include <iomanip>
8
9#include "bnctime.h"
[5886]10#include "bncutils.h"
[2123]11
12using namespace std;
13
14// Constructor
15//////////////////////////////////////////////////////////////////////////////
16bncTime::bncTime(int gpsw, double gpssec) {
17 this->set(gpsw, gpssec);
18}
[8372]19
[3986]20// Constructor (from ISO String yyyy-mm-ddThh:mm:ss)
21//////////////////////////////////////////////////////////////////////////////
22bncTime::bncTime(const std::string& isoString) {
23 if (!isoString.empty()) {
[3988]24 QDateTime dt = QDateTime::fromString(isoString.c_str(), Qt::ISODate);
25 this->set(dt.date().year(), dt.date().month(), dt.date().day(),
[8372]26 dt.time().hour(), dt.time().minute(),
[3988]27 dt.time().second() + dt.time().msec()/1000.0);
[3986]28 }
[3987]29 else {
30 this->reset();
31 }
[3986]32}
33
[8372]34//
[2123]35//////////////////////////////////////////////////////////////////////////////
36bncTime& bncTime::set(int gpsw, double gpssec) {
37 int deltad;
38 int dow = 0;
[8372]39 while ( gpssec >= 86400.0 ) {
40 gpssec-=86400.0;
[2123]41 dow++;
42 }
[8372]43 while ( gpssec < 0.0 ) {
44 gpssec+=86400.0;
[2123]45 dow--;
46 }
47 deltad = gpsw*7 + dow;
48 _mjd = 44244 + deltad;
49 _sec = gpssec;
50 return *this;
51}
52
[7138]53
54//
55//////////////////////////////////////////////////////////////////////////////
56bncTime& bncTime::setBDS(int gpsw, double gpssec) {
57 int deltad;
58 int dow = 0;
59 gpssec += 14.0;
60 gpsw += 1356.0;
[8372]61 while ( gpssec >= 86400.0 ) {
62 gpssec-=86400.0;
[7138]63 dow++;
64 }
[8372]65 while ( gpssec < 0.0 ) {
66 gpssec+=86400.0;
[7138]67 dow--;
68 }
69 deltad = gpsw*7 + dow;
70 _mjd = 44244 + deltad;
71 _sec = gpssec;
72 return *this;
73}
74
[8372]75//
[2123]76//////////////////////////////////////////////////////////////////////////////
[6812]77bncTime &bncTime::set(int msec) {
78 int week;
79 double sec;
80
81 currentGPSWeeks(week, sec);
82 if(msec/1000.0 < sec - 86400.0)
83 ++week;
84 return set(week, msec/1000.0);
85}
86
[8372]87//
[6812]88//////////////////////////////////////////////////////////////////////////////
89bncTime &bncTime::setTOD(int msec) {
90 int week;
91 double sec;
92
93 currentGPSWeeks(week, sec);
94 int intsec = sec;
95 int day = intsec/(24*60*60);
96 int tod = (intsec%(24*60*60))*1000;
97 if(msec > 19*60*60*1000 && tod < 5*60*60*1000)
98 --day;
99 else if(msec < 5*60*60 && tod > 19*60*60*1000)
100 ++day;
101 msec += day*24*60*60*1000;
102 if(msec < 0.0) {
103 msec += 7*24*60*60*1000;
104 --week;
105 }
106
107 return set(week, msec/1000.0);
108}
109
[8372]110//
[6812]111//////////////////////////////////////////////////////////////////////////////
112bncTime &bncTime::setTk(int msec) {
113 int week;
114 double sec;
115 int intsec;
116
117 currentGPSWeeks(week, sec);
118 intsec = sec;
119 updatetime(&week, &intsec, msec, 0); /* Moscow -> GPS */
120 sec = intsec+(msec%1000)/1000.0;
121 return set(week, sec);
122}
123
[8372]124//
[6812]125//////////////////////////////////////////////////////////////////////////////
126bncTime &bncTime::setBDS(int msec) {
127 int week;
128 double sec;
129
130 msec += 14000;
131 if(msec >= 7*24*60*60*1000)
132 msec -= 7*24*60*60*1000;
133 currentGPSWeeks(week, sec);
134 if(msec/1000.0 < sec - 86400.0)
135 ++week;
136 return set(week, msec/1000.0);
137}
138
[8372]139//
[6812]140//////////////////////////////////////////////////////////////////////////////
[2123]141bncTime& bncTime::setmjd(double daysec, int mjd) {
142 _sec = daysec;
143 _mjd = mjd;
[8372]144 while ( _sec >= 86400.0 ) {
145 _sec-=86400.0;
[2123]146 _mjd++;
147 }
[8372]148 while ( _sec < 0.0 ) {
149 _sec+=86400.0;
[2123]150 _mjd--;
151 }
152 return *this;
153}
154
[8372]155//
[2123]156//////////////////////////////////////////////////////////////////////////////
[4586]157bncTime& bncTime::setmjd(double mjddec) {
158 _mjd = static_cast<unsigned int>(mjddec);
159 _sec = (mjddec - _mjd)*86400.0;
160 return *this;
161}
162
[8372]163//
[4586]164//////////////////////////////////////////////////////////////////////////////
[2123]165unsigned int bncTime::mjd() const {
166 return _mjd;
167}
[8372]168
[2123]169//
170//////////////////////////////////////////////////////////////////////////////
171double bncTime::daysec() const {
172 return _sec;
173}
174
175//
176//////////////////////////////////////////////////////////////////////////////
177unsigned int bncTime::gpsw() const {
178 double gsec;
179 long gpsw;
180 jdgp(_mjd, gsec, gpsw);
181 return (int)gpsw;
182}
183
[8372]184//
[2123]185//////////////////////////////////////////////////////////////////////////////
186double bncTime::gpssec() const {
187 double gsec;
188 long gpsw;
189 jdgp(_mjd, gsec, gpsw);
190 return gsec + _sec;
191}
192
[6812]193//
194//////////////////////////////////////////////////////////////////////////////
195unsigned int bncTime::bdsw() const {
196 double gsec;
197 long gpsw;
198 jdgp(_mjd, gsec, gpsw);
199 if(gsec <= 14.0)
200 gpsw -= 1;
201 return (int)gpsw-1356;
202}
203
[8372]204//
[2123]205//////////////////////////////////////////////////////////////////////////////
[6812]206double bncTime::bdssec() const {
207 double gsec;
208 long gpsw;
209 jdgp(_mjd, gsec, gpsw);
210 if(gsec <= 14.0)
211 gsec += 7.0*24.0*60.0*60.0-14.0;
212 else
213 gsec -= 14.0;
214 return gsec + _sec;
215}
216
[8372]217//
[6812]218//////////////////////////////////////////////////////////////////////////////
[2123]219bool bncTime::operator!=(const bncTime &time1) const {
[6812]220 if ( fabs((*this) - time1) > 0.000000000001 ) {
[2923]221 return true;
222 }
223 else {
224 return false;
225 }
[2123]226}
227
[8372]228//
[2123]229//////////////////////////////////////////////////////////////////////////////
[2917]230bool bncTime::operator==(const bncTime &time1) const {
[6812]231 if ( fabs((*this) - time1) < 0.000000000001 ) {
[2923]232 return true;
233 }
234 else {
235 return false;
236 }
[2917]237}
238
[8372]239//
[2917]240//////////////////////////////////////////////////////////////////////////////
[2923]241bool bncTime::operator>(const bncTime &time1) const {
242 if ( ((*this) - time1) > 0.0 ) {
243 return true;
244 }
245 else {
246 return false;
247 }
248}
249
[8372]250//
[2923]251//////////////////////////////////////////////////////////////////////////////
252bool bncTime::operator>=(const bncTime &time1) const {
253 if ( ((*this) - time1) >= 0.0 ) {
254 return true;
255 }
256 else {
257 return false;
258 }
259}
260
[8372]261//
[2923]262//////////////////////////////////////////////////////////////////////////////
263bool bncTime::operator<(const bncTime &time1) const {
264 if ( ((*this) - time1) < 0.0 ) {
265 return true;
266 }
267 else {
268 return false;
269 }
270}
271
[8372]272//
[2923]273//////////////////////////////////////////////////////////////////////////////
274bool bncTime::operator<=(const bncTime &time1) const {
275 if ( ((*this) - time1) <= 0.0 ) {
276 return true;
277 }
278 else {
279 return false;
280 }
281}
282
[8372]283//
[2923]284//////////////////////////////////////////////////////////////////////////////
[2123]285bncTime bncTime::operator+(double sec) const {
286 int mjd = this->mjd();
287 double daysec = this->daysec();
288 daysec+=sec;
289 return bncTime().setmjd(daysec, mjd);
290}
291
[8372]292//
[2123]293//////////////////////////////////////////////////////////////////////////////
294bncTime bncTime::operator-(double sec) const {
295 return (*this) + (-sec);
296}
297
[8372]298//
[2123]299//////////////////////////////////////////////////////////////////////////////
300double bncTime::operator-(const bncTime &time1) const {
301 int mjdDiff = this->_mjd - time1._mjd;
302 if ( mjdDiff != 0 ) {
303 return mjdDiff * 86400.0 + this->_sec - time1._sec;
304 }
305 else {
306 return this->_sec - time1._sec;
307 }
308}
309
[5756]310bncTime& bncTime::operator+=(double sec) {
311 _sec+=sec;
312
313 while ( _sec >= 86400 ) {
314 _sec-=86400;
315 _mjd++;
316 }
317 while ( _sec < 0 ) {
318 _sec+=86400;
319 _mjd--;
320 }
321
322 return *this;
323}
324
[8372]325//
[2123]326//////////////////////////////////////////////////////////////////////////////
[2566]327void bncTime::civil_date (unsigned int& year, unsigned int& month,
328 unsigned int& day) const {
329 double day_d;
330 long int yy, mm;
331 jmt(_mjd, yy, mm, day_d);
332 year = yy;
333 month = mm;
334 day = static_cast<unsigned int>(day_d);
335}
336
[8372]337//
[2566]338//////////////////////////////////////////////////////////////////////////////
[8372]339void bncTime::civil_time(unsigned int &hour, unsigned int &min,
[2123]340 double &sec) const {
341 hour = static_cast<unsigned int>(_sec/3600.0);
342 min = static_cast<unsigned int>((_sec - hour*3600)/60.0);
343 sec = _sec - min*60 - hour*3600;
344 if (sec==60.0) {
345 min++;
346 sec=0;
347 }
348 if (min==60) {
349 hour++;
350 min=0;
351 }
352}
353
[8372]354//
[2123]355//////////////////////////////////////////////////////////////////////////////
356string bncTime::timestr(unsigned numdec, char sep) const {
357 ostringstream str;
358 unsigned int hour, minute;
359 double sec;
360 this->civil_time(hour, minute, sec);
361 unsigned sw;
362 if (numdec == 0) {
363 sw = 2;
364 }
365 else {
366 sw = numdec + 3;
367 }
368 double chk = 0.5;
369 for (unsigned int ii=0; ii<numdec; ii++) chk *= 0.1;
370 if (sec > (60.0-chk)) {
371 sec = 0;
372 minute++;
373 if (minute == 60) {
374 minute = 0;
375 hour++;
376 }
377 }
378 str.setf(ios::fixed);
379 str << setfill('0');
380 str << setw(2) << hour;
381 if (sep) str << sep;
382 str << setw(2) << minute;
383 if (sep) str << sep;
384 str << setw(sw) << setprecision(numdec) << sec;
385 return str.str();
386}
387
[8372]388//
[2566]389//////////////////////////////////////////////////////////////////////////////
390string bncTime::datestr(char sep) const {
391 unsigned int year, month, day;
392 civil_date(year,month,day);
393 ostringstream str;
394 str.setf(ios::fixed);
395 str << setfill('0');
396 str << setw(4) << year;
397 if (sep) str << sep;
398 str << setw(2) << month;
399 if (sep) str << sep;
400 str << setw(2) << day;
401 return str.str();
402}
[2251]403
[8372]404//
[2251]405//////////////////////////////////////////////////////////////////////////////
[6812]406bncTime::operator std::string() const {
[5756]407 return datestr() + '_' + timestr();
408}
409
[8372]410//
[5756]411//////////////////////////////////////////////////////////////////////////////
[8372]412bncTime& bncTime::set(int year, int month, int day,
[2251]413 int hour, int min, double sec) {
414 return set(year, month, day, hour*3600 + min*60 + sec);
415}
416
[8372]417//
[2251]418//////////////////////////////////////////////////////////////////////////////
[8372]419bncTime& bncTime::setBDS(int year, int month, int day,
[6812]420 int hour, int min, double sec) {
421 return set(year, month, day, hour*3600 + min*60 + sec+14.0);
422}
423
[8372]424//
[6812]425//////////////////////////////////////////////////////////////////////////////
[2251]426bncTime& bncTime::set(int year, int month, int day, double daysec) {
427 _sec = daysec;
[8372]428
[2251]429 _mjd = (unsigned int)djul(year, month, day);
[8372]430
[2251]431 while ( _sec >= 86400 ) {
432 _sec-=86400;
433 _mjd++;
434 }
435 while ( _sec < 0 ) {
436 _sec+=86400;
437 _mjd--;
438 }
439
440 return *this;
441}
Note: See TracBrowser for help on using the repository browser.