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

Last change on this file since 10412 was 10330, checked in by stuerze, 10 months ago

another test is added in PPP and combination mode to check if stored ephemerides were outdated and/or not updated in between

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
[10330]78bool outDatedBcep(const t_eph *eph, bncTime tt);
[9245]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// Extracts k bits from position p and returns the extracted value as integer
170///////////////////////////////////////////////////////////////////
171int bitExtracted(int number, int k, int p);
172
[7053]173// RTCM3 GPS EPH encoding
174//////////////////////////////////////////////////////////
175#define GPSTOINT(type, value) static_cast<type>(round(value))
176
177#define GPSADDBITS(a, b) {bitbuffer = (bitbuffer<<(a)) \
178 |(GPSTOINT(long long,b)&((1ULL<<a)-1)); \
179 numbits += (a); \
180 while(numbits >= 8) { \
181 buffer[size++] = bitbuffer>>(numbits-8);numbits -= 8;}}
182
183#define GPSADDBITSFLOAT(a,b,c) {long long i = GPSTOINT(long long,(b)/(c)); \
184 GPSADDBITS(a,i)};
185
186// RTCM3 GLONASS EPH encoding
187//////////////////////////////////////////////////////////
188#define GLONASSTOINT(type, value) static_cast<type>(round(value))
189#define GLONASSADDBITS(a, b) {bitbuffer = (bitbuffer<<(a)) \
190 |(GLONASSTOINT(long long,b)&((1ULL<<(a))-1)); \
191 numbits += (a); \
192 while(numbits >= 8) { \
193 buffer[size++] = bitbuffer>>(numbits-8);numbits -= 8;}}
194#define GLONASSADDBITSFLOATM(a,b,c) {int s; long long i; \
195 if(b < 0.0) \
196 { \
197 s = 1; \
198 i = GLONASSTOINT(long long,(-b)/(c)); \
199 if(!i) s = 0; \
200 } \
201 else \
202 { \
203 s = 0; \
204 i = GLONASSTOINT(long long,(b)/(c)); \
205 } \
206 GLONASSADDBITS(1,s) \
207 GLONASSADDBITS(a-1,i)}
208
209// RTCM3 Galileo EPH encoding
210//////////////////////////////////////////////////////////
211#define GALILEOTOINT(type, value) static_cast<type>(round(value))
212#define GALILEOADDBITS(a, b) {bitbuffer = (bitbuffer<<(a)) \
213 |(GALILEOTOINT(long long,b)&((1LL<<a)-1)); \
214 numbits += (a); \
215 while(numbits >= 8) { \
216 buffer[size++] = bitbuffer>>(numbits-8);numbits -= 8;}}
217#define GALILEOADDBITSFLOAT(a,b,c) {long long i = GALILEOTOINT(long long,(b)/(c)); \
218 GALILEOADDBITS(a,i)};
219
220// RTCM3 SBAS EPH encoding
221//////////////////////////////////////////////////////////
222#define SBASTOINT(type, value) static_cast<type>(round(value))
223#define SBASADDBITS(a, b) {bitbuffer = (bitbuffer<<(a)) \
224 |(SBASTOINT(long long,b)&((1ULL<<a)-1)); \
225 numbits += (a); \
226 while(numbits >= 8) { \
227 buffer[size++] = bitbuffer>>(numbits-8);numbits -= 8;}}
228#define SBASADDBITSFLOAT(a,b,c) {long long i = SBASTOINT(long long,(b)/(c)); \
229 SBASADDBITS(a,i)};
230
231// RTCM3 BDS EPH encoding
232//////////////////////////////////////////////////////////
233#define BDSTOINT(type, value) static_cast<type>(round(value))
234#define BDSADDBITS(a, b) {bitbuffer = (bitbuffer<<(a)) \
235 |(BDSTOINT(long long,b)&((1ULL<<a)-1)); \
236 numbits += (a); \
237 while(numbits >= 8) { \
238 buffer[size++] = bitbuffer>>(numbits-8);numbits -= 8;}}
239#define BDSADDBITSFLOAT(a,b,c) {long long i = BDSTOINT(long long,(b)/(c)); \
240 BDSADDBITS(a,i)};
241
[83]242#endif
Note: See TracBrowser for help on using the repository browser.