source: ntrip/branches/BNC_2.12/src/bncutils.h @ 9249

Last change on this file since 9249 was 9249, checked in by stuerze, 2 months ago

another check is added, to prevent the usage of not updated nav data sets during ssr upload

File size: 8.8 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 BNCUTILS_H
26#define BNCUTILS_H
27
28#include <vector>
29
30#include <QString>
31#include <QDateTime>
32
33#include <newmat.h>
34#include <bncconst.h>
35#include <ephemeris.h>
36
37void         expandEnvVar(QString& str);
38
39/**
40 * Return GPS leap seconds for a given UTC time
41 * @param year 4 digit year
42 * @param month month in year (1-12)
43 * @param day day in month (1-31)
44 * @return number of leap seconds since 6.1.1980
45 */
46int          gnumleap(int year, int month, int day);
47
48/**
49 * Convert Moscow time into GPS or UTC. Note that parts of a second are not preserved
50 * and must be handled separately.
51 * @param week GPS week number (must be prefilled, contains fixed value afterwards)
52 * @param secOfWeek seconds in GPS week (must be prefilled, contains fixed value afterwards)
53 * @param mSecOfWeek milli seconds in GLONASS time
54 * @param fixnumleap when <code>true</code> then result is UTC time, otherwise it is GPS
55 * @return does not return a value, but updates first two arguments
56 */
57void         updatetime(int *week, int *secOfWeek, int mSecOfWeek, bool fixnumleap);
58
59QDateTime    dateAndTimeFromGPSweek(int GPSWeek, double GPSWeeks);
60
61void         currentGPSWeeks(int& week, double& sec);
62
63QDateTime    currentDateAndTimeGPS();
64
65bool         checkForWrongObsEpoch(bncTime obsEpoch);
66
67bool         outDatedBcep(const t_eph *eph);
68
69QByteArray   ggaString(const QByteArray& latitude, const QByteArray& longitude,
70                       const QByteArray& height, const QString& ggaType);
71
72void         RSW_to_XYZ(const ColumnVector& rr, const ColumnVector& vv,
73                        const ColumnVector& rsw, ColumnVector& xyz);
74
75void         XYZ_to_RSW(const ColumnVector& rr, const ColumnVector& vv,
76                        const ColumnVector& xyz, ColumnVector& rsw);
77
78t_irc        xyz2ell(const double* XYZ, double* Ell);
79
80t_irc        xyz2geoc(const double* XYZ, double* Geoc);
81
82void         xyz2neu(const double* Ell, const double* xyz, double* neu);
83
84void         neu2xyz(const double* Ell, const double* neu, double* xyz);
85
86void         jacobiXYZ_NEU(const double* Ell, Matrix& jacobi);
87
88void         jacobiEll_XYZ(const double* Ell, Matrix& jacobi);
89
90void         covariXYZ_NEU(const SymmetricMatrix& Qxyz, const double* Ell,
91                           SymmetricMatrix& Qneu);
92
93void         covariNEU_XYZ(const SymmetricMatrix& Qneu, const double* Ell,
94                           SymmetricMatrix& Qxyz);
95
96double       Frac(double x);
97
98double       Modulo(double x, double y);
99
100double       nint(double val);
101
102ColumnVector rungeKutta4(double xi, const ColumnVector& yi, double dx, double* acc,
103                         ColumnVector (*der)(double x, const ColumnVector& y, double* acc));
104
105void         GPSweekFromDateAndTime(const QDateTime& dateTime, int& GPSWeek, double& GPSWeeks);
106
107void         GPSweekFromYMDhms(int year, int month, int day, int hour, int min, double sec,
108                               int& GPSWeek, double& GPSWeeks);
109
110void         mjdFromDateAndTime(const QDateTime& dateTime, int& mjd, double& dayfrac);
111
112bool         findInVector(const std::vector<QString>& vv, const QString& str);
113
114int          readInt(const QString& str, int pos, int len, int& value);
115
116int          readDbl(const QString& str, int pos, int len, double& value);
117
118void         topos(double xRec, double yRec, double zRec, double xSat, double ySat, double zSat,
119                   double& rho, double& eleSat, double& azSat);
120
121void         deg2DMS(double decDeg, int& deg, int& min, double& sec);
122
123QString      fortranFormat(double value, int width, int prec);
124
125void         kalman(const Matrix& AA, const ColumnVector& ll, const DiagonalMatrix& PP,
126                    SymmetricMatrix& QQ, ColumnVector& xx);
127
128double       djul(long j1, long m1, double tt);
129
130double       gpjd(double second, int nweek) ;
131
132void         jdgp(double tjul, double & second, long & nweek);
133
134void         jmt (double djul, long& jj, long& mm, double& dd);
135
136void         stripWhiteSpace(std::string& str);
137
138double       accuracyFromIndex(int index, t_eph::e_type type);
139
140int          indexFromAccuracy(double accuracy, t_eph::e_type type);
141
142double       fitIntervalFromFlag(int flag, double iodc, t_eph::e_type type);
143
144double       associatedLegendreFunction(int n, int m, double t);
145
146double       factorial(int n);
147
148/** Convert RTCM3 lock-time indicator to lock time in seconds
149* depending on input message format. Returns -1 if format is
150* unknown or indicator is invalid
151*/
152double       lti2sec(int type, int lti);
153
154// CRC24Q checksum calculation function (only full bytes supported).
155///////////////////////////////////////////////////////////////////
156unsigned long CRC24(long size, const unsigned char *buf);
157
158// RTCM3 GPS EPH encoding
159//////////////////////////////////////////////////////////
160#define GPSTOINT(type, value) static_cast<type>(round(value))
161
162#define GPSADDBITS(a, b) {bitbuffer = (bitbuffer<<(a)) \
163                       |(GPSTOINT(long long,b)&((1ULL<<a)-1)); \
164                       numbits += (a); \
165                       while(numbits >= 8) { \
166                       buffer[size++] = bitbuffer>>(numbits-8);numbits -= 8;}}
167
168#define GPSADDBITSFLOAT(a,b,c) {long long i = GPSTOINT(long long,(b)/(c)); \
169                             GPSADDBITS(a,i)};
170
171// RTCM3 GLONASS EPH encoding
172//////////////////////////////////////////////////////////
173#define GLONASSTOINT(type, value) static_cast<type>(round(value))
174#define GLONASSADDBITS(a, b) {bitbuffer = (bitbuffer<<(a)) \
175                       |(GLONASSTOINT(long long,b)&((1ULL<<(a))-1)); \
176                       numbits += (a); \
177                       while(numbits >= 8) { \
178                       buffer[size++] = bitbuffer>>(numbits-8);numbits -= 8;}}
179#define GLONASSADDBITSFLOATM(a,b,c) {int s; long long i; \
180                       if(b < 0.0) \
181                       { \
182                         s = 1; \
183                         i = GLONASSTOINT(long long,(-b)/(c)); \
184                         if(!i) s = 0; \
185                       } \
186                       else \
187                       { \
188                         s = 0; \
189                         i = GLONASSTOINT(long long,(b)/(c)); \
190                       } \
191                       GLONASSADDBITS(1,s) \
192                       GLONASSADDBITS(a-1,i)}
193
194// RTCM3 Galileo EPH encoding
195//////////////////////////////////////////////////////////
196#define GALILEOTOINT(type, value) static_cast<type>(round(value))
197#define GALILEOADDBITS(a, b) {bitbuffer = (bitbuffer<<(a)) \
198                       |(GALILEOTOINT(long long,b)&((1LL<<a)-1)); \
199                       numbits += (a); \
200                       while(numbits >= 8) { \
201                       buffer[size++] = bitbuffer>>(numbits-8);numbits -= 8;}}
202#define GALILEOADDBITSFLOAT(a,b,c) {long long i = GALILEOTOINT(long long,(b)/(c)); \
203                             GALILEOADDBITS(a,i)};
204
205// RTCM3 SBAS EPH encoding
206//////////////////////////////////////////////////////////
207#define SBASTOINT(type, value) static_cast<type>(round(value))
208#define SBASADDBITS(a, b) {bitbuffer = (bitbuffer<<(a)) \
209                       |(SBASTOINT(long long,b)&((1ULL<<a)-1)); \
210                       numbits += (a); \
211                       while(numbits >= 8) { \
212                       buffer[size++] = bitbuffer>>(numbits-8);numbits -= 8;}}
213#define SBASADDBITSFLOAT(a,b,c) {long long i = SBASTOINT(long long,(b)/(c)); \
214                             SBASADDBITS(a,i)};
215
216// RTCM3 BDS EPH encoding
217//////////////////////////////////////////////////////////
218#define BDSTOINT(type, value) static_cast<type>(round(value))
219#define BDSADDBITS(a, b) {bitbuffer = (bitbuffer<<(a)) \
220                       |(BDSTOINT(long long,b)&((1ULL<<a)-1)); \
221                       numbits += (a); \
222                       while(numbits >= 8) { \
223                       buffer[size++] = bitbuffer>>(numbits-8);numbits -= 8;}}
224#define BDSADDBITSFLOAT(a,b,c) {long long i = BDSTOINT(long long,(b)/(c)); \
225                             BDSADDBITS(a,i)};
226
227#endif
Note: See TracBrowser for help on using the repository browser.