source: ntrip/trunk/BNC/src/bncutils.h@ 8452

Last change on this file since 8452 was 8011, checked in by stuerze, 10 years ago

check regarding wrong observation epochs is done in latencychecker as well to prevent erroneous latencies

File size: 8.5 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
67QByteArray ggaString(const QByteArray& latitude, const QByteArray& longitude,
68 const QByteArray& height, const QString& ggaType);
69
70void RSW_to_XYZ(const ColumnVector& rr, const ColumnVector& vv,
71 const ColumnVector& rsw, ColumnVector& xyz);
72
73void XYZ_to_RSW(const ColumnVector& rr, const ColumnVector& vv,
74 const ColumnVector& xyz, ColumnVector& rsw);
75
76t_irc xyz2ell(const double* XYZ, double* Ell);
77
78t_irc xyz2geoc(const double* XYZ, double* Geoc);
79
80void xyz2neu(const double* Ell, const double* xyz, double* neu);
81
82void neu2xyz(const double* Ell, const double* neu, double* xyz);
83
84void jacobiXYZ_NEU(const double* Ell, Matrix& jacobi);
85
86void jacobiEll_XYZ(const double* Ell, Matrix& jacobi);
87
88void covariXYZ_NEU(const SymmetricMatrix& Qxyz, const double* Ell,
89 SymmetricMatrix& Qneu);
90
91void covariNEU_XYZ(const SymmetricMatrix& Qneu, const double* Ell,
92 SymmetricMatrix& Qxyz);
93
94double Frac(double x);
95
96double Modulo(double x, double y);
97
98double nint(double val);
99
100ColumnVector rungeKutta4(double xi, const ColumnVector& yi, double dx, double* acc,
101 ColumnVector (*der)(double x, const ColumnVector& y, double* acc));
102
103void GPSweekFromDateAndTime(const QDateTime& dateTime, int& GPSWeek, double& GPSWeeks);
104
105void GPSweekFromYMDhms(int year, int month, int day, int hour, int min, double sec,
106 int& GPSWeek, double& GPSWeeks);
107
108void mjdFromDateAndTime(const QDateTime& dateTime, int& mjd, double& dayfrac);
109
110bool findInVector(const std::vector<QString>& vv, const QString& str);
111
112int readInt(const QString& str, int pos, int len, int& value);
113
114int readDbl(const QString& str, int pos, int len, double& value);
115
116void topos(double xRec, double yRec, double zRec, double xSat, double ySat, double zSat,
117 double& rho, double& eleSat, double& azSat);
118
119void deg2DMS(double decDeg, int& deg, int& min, double& sec);
120
121QString fortranFormat(double value, int width, int prec);
122
123void kalman(const Matrix& AA, const ColumnVector& ll, const DiagonalMatrix& PP,
124 SymmetricMatrix& QQ, ColumnVector& xx);
125
126double djul(long j1, long m1, double tt);
127
128double gpjd(double second, int nweek) ;
129
130void jdgp(double tjul, double & second, long & nweek);
131
132void jmt (double djul, long& jj, long& mm, double& dd);
133
134void stripWhiteSpace(std::string& str);
135
136double accuracyFromIndex(int index, t_eph::e_type type);
137
138int indexFromAccuracy(double accuracy, t_eph::e_type type);
139
140double associatedLegendreFunction(int n, int m, double t);
141
142int factorial(int n);
143
144
145// CRC24Q checksum calculation function (only full bytes supported).
146///////////////////////////////////////////////////////////////////
147unsigned long CRC24(long size, const unsigned char *buf);
148
149// RTCM3 GPS EPH encoding
150//////////////////////////////////////////////////////////
151#define GPSTOINT(type, value) static_cast<type>(round(value))
152
153#define GPSADDBITS(a, b) {bitbuffer = (bitbuffer<<(a)) \
154 |(GPSTOINT(long long,b)&((1ULL<<a)-1)); \
155 numbits += (a); \
156 while(numbits >= 8) { \
157 buffer[size++] = bitbuffer>>(numbits-8);numbits -= 8;}}
158
159#define GPSADDBITSFLOAT(a,b,c) {long long i = GPSTOINT(long long,(b)/(c)); \
160 GPSADDBITS(a,i)};
161
162// RTCM3 GLONASS EPH encoding
163//////////////////////////////////////////////////////////
164#define GLONASSTOINT(type, value) static_cast<type>(round(value))
165#define GLONASSADDBITS(a, b) {bitbuffer = (bitbuffer<<(a)) \
166 |(GLONASSTOINT(long long,b)&((1ULL<<(a))-1)); \
167 numbits += (a); \
168 while(numbits >= 8) { \
169 buffer[size++] = bitbuffer>>(numbits-8);numbits -= 8;}}
170#define GLONASSADDBITSFLOATM(a,b,c) {int s; long long i; \
171 if(b < 0.0) \
172 { \
173 s = 1; \
174 i = GLONASSTOINT(long long,(-b)/(c)); \
175 if(!i) s = 0; \
176 } \
177 else \
178 { \
179 s = 0; \
180 i = GLONASSTOINT(long long,(b)/(c)); \
181 } \
182 GLONASSADDBITS(1,s) \
183 GLONASSADDBITS(a-1,i)}
184
185// RTCM3 Galileo EPH encoding
186//////////////////////////////////////////////////////////
187#define GALILEOTOINT(type, value) static_cast<type>(round(value))
188#define GALILEOADDBITS(a, b) {bitbuffer = (bitbuffer<<(a)) \
189 |(GALILEOTOINT(long long,b)&((1LL<<a)-1)); \
190 numbits += (a); \
191 while(numbits >= 8) { \
192 buffer[size++] = bitbuffer>>(numbits-8);numbits -= 8;}}
193#define GALILEOADDBITSFLOAT(a,b,c) {long long i = GALILEOTOINT(long long,(b)/(c)); \
194 GALILEOADDBITS(a,i)};
195
196// RTCM3 SBAS EPH encoding
197//////////////////////////////////////////////////////////
198#define SBASTOINT(type, value) static_cast<type>(round(value))
199#define SBASADDBITS(a, b) {bitbuffer = (bitbuffer<<(a)) \
200 |(SBASTOINT(long long,b)&((1ULL<<a)-1)); \
201 numbits += (a); \
202 while(numbits >= 8) { \
203 buffer[size++] = bitbuffer>>(numbits-8);numbits -= 8;}}
204#define SBASADDBITSFLOAT(a,b,c) {long long i = SBASTOINT(long long,(b)/(c)); \
205 SBASADDBITS(a,i)};
206
207// RTCM3 BDS EPH encoding
208//////////////////////////////////////////////////////////
209#define BDSTOINT(type, value) static_cast<type>(round(value))
210#define BDSADDBITS(a, b) {bitbuffer = (bitbuffer<<(a)) \
211 |(BDSTOINT(long long,b)&((1ULL<<a)-1)); \
212 numbits += (a); \
213 while(numbits >= 8) { \
214 buffer[size++] = bitbuffer>>(numbits-8);numbits -= 8;}}
215#define BDSADDBITSFLOAT(a,b,c) {long long i = BDSTOINT(long long,(b)/(c)); \
216 BDSADDBITS(a,i)};
217
218#endif
Note: See TracBrowser for help on using the repository browser.