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

Last change on this file since 9249 was 9249, checked in by stuerze, 20 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.