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

Last change on this file since 9369 was 9369, checked in by stuerze, 3 years ago

some additions regarding rinexV305: navigation data

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