mirror of
				https://github.com/gnss-sdr/gnss-sdr
				synced 2025-11-04 09:13:05 +00:00 
			
		
		
		
	Revert "Refactor of constants, remove defines"
This reverts commit 27ab390944.
			
			
This commit is contained in:
		@@ -217,8 +217,8 @@ bool rtklib_solver::get_PVT(std::map<int,Gnss_Synchro> gnss_observables_map, dou
 | 
			
		||||
        nav_data.n=valid_obs;
 | 
			
		||||
        for (int i=0; i< MAXSAT;i++)
 | 
			
		||||
        {
 | 
			
		||||
            nav_data.lam[i][0]=SPEED_OF_LIGHT/FREQ1; /* L1/E1 */
 | 
			
		||||
            nav_data.lam[i][1]=SPEED_OF_LIGHT/FREQ2; /* L2 */
 | 
			
		||||
            nav_data.lam[i][0]=CLIGHT/FREQ1; /* L1/E1 */
 | 
			
		||||
            nav_data.lam[i][1]=CLIGHT/FREQ2; /* L2 */
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        result=pntpos(obs_data, valid_obs, &nav_data, &rtklib_opt, &old_pvt_sol, NULL, NULL,rtklib_msg);
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
# Copyright (C) 2012-2017  (see AUTHORS file for a list of contributors)
 | 
			
		||||
# Copyright (C) 2012-2015  (see AUTHORS file for a list of contributors)
 | 
			
		||||
#
 | 
			
		||||
# This file is part of GNSS-SDR.
 | 
			
		||||
#
 | 
			
		||||
@@ -38,13 +38,14 @@ include_directories(
 | 
			
		||||
     ${GFlags_INCLUDE_DIRS}
 | 
			
		||||
     ${GLOG_INCLUDE_DIRS}
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
file(GLOB RTKLIB_LIB_HEADERS "*.h")
 | 
			
		||||
list(SORT RTKLIB_LIB_HEADERS)
 | 
			
		||||
add_library(rtklib_lib ${RTKLIB_LIB_SOURCES} ${RTKLIB_LIB_HEADERS})
 | 
			
		||||
source_group(Headers FILES ${RTKLIB_LIB_HEADERS})
 | 
			
		||||
add_dependencies(rtklib_lib armadillo-${armadillo_RELEASE} glog-${glog_RELEASE})
 | 
			
		||||
 | 
			
		||||
#set_property(SOURCE rtklib_rtkcmn.cc APPEND_STRING PROPERTY COMPILE_FLAGS " -Wno-missing-field-initializers ")
 | 
			
		||||
 | 
			
		||||
target_link_libraries(
 | 
			
		||||
    rtklib_lib 
 | 
			
		||||
    ${Boost_LIBRARIES} 
 | 
			
		||||
@@ -54,4 +55,6 @@ target_link_libraries(
 | 
			
		||||
    ${BLAS}
 | 
			
		||||
    ${LAPACK}
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
#MESSAGE( STATUS "*****************BLAS:         " ${BLAS} )
 | 
			
		||||
    
 | 
			
		||||
 
 | 
			
		||||
@@ -48,300 +48,356 @@
 | 
			
		||||
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef GNSS_SDR_RTKLIB_H_
 | 
			
		||||
#define GNSS_SDR_RTKLIB_H_
 | 
			
		||||
#ifndef RTKLIB_H_
 | 
			
		||||
#define RTKLIB_H_
 | 
			
		||||
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <stdarg.h>
 | 
			
		||||
#include <cstring>
 | 
			
		||||
#include <cmath>
 | 
			
		||||
#include <math.h>
 | 
			
		||||
#include <time.h>
 | 
			
		||||
#include <ctype.h>
 | 
			
		||||
#include "MATH_CONSTANTS.h"
 | 
			
		||||
#include "gnss_frequencies.h"
 | 
			
		||||
 | 
			
		||||
#define thread_t    pthread_t
 | 
			
		||||
#define lock_t      pthread_mutex_t
 | 
			
		||||
#define initlock(f) pthread_mutex_init(f,NULL)
 | 
			
		||||
#define lock(f)     pthread_mutex_lock(f)
 | 
			
		||||
#define unlock(f)   pthread_mutex_unlock(f)
 | 
			
		||||
#define FILEPATHSEP '/'
 | 
			
		||||
 | 
			
		||||
const int FILEPATHSEP = '/';
 | 
			
		||||
#define PI          3.1415926535897932  /* pi */
 | 
			
		||||
#define D2R         (PI/180.0)          /* deg to rad */
 | 
			
		||||
#define R2D         (180.0/PI)          /* rad to deg */
 | 
			
		||||
#define CLIGHT      299792458.0         /* speed of light (m/s) */
 | 
			
		||||
#define SC2RAD      3.1415926535898     /* semi-circle to radian (IS-GPS) */
 | 
			
		||||
#define AU          149597870691.0      /* 1 AU (m) */
 | 
			
		||||
#define AS2R        (D2R/3600.0)        /* arc sec to radian */
 | 
			
		||||
 | 
			
		||||
const double RE_WGS84 = 6378137.0;             //!< earth semimajor axis (WGS84) (m)
 | 
			
		||||
const double FE_WGS84 = (1.0 / 298.257223563); //!< earth flattening (WGS84)
 | 
			
		||||
#define OMGE        7.2921151467E-5     /* earth angular velocity (IS-GPS) (rad/s) */
 | 
			
		||||
 | 
			
		||||
const double HION = 350000.0;                  //!<  ionosphere height (m)
 | 
			
		||||
#define RE_WGS84    6378137.0           /* earth semimajor axis (WGS84) (m) */
 | 
			
		||||
#define FE_WGS84    (1.0/298.257223563) /* earth flattening (WGS84) */
 | 
			
		||||
 | 
			
		||||
const unsigned int POLYCRC32 = 0xEDB88320u;    //!<  CRC32 polynomial
 | 
			
		||||
const unsigned int POLYCRC24Q = 0x1864CFBu;    //!<  CRC24Q polynomial
 | 
			
		||||
#define HION        350000.0            /* ionosphere height (m) */
 | 
			
		||||
 | 
			
		||||
const unsigned int PMODE_SINGLE = 0;           //!<  positioning mode: single
 | 
			
		||||
const unsigned int PMODE_DGPS = 1;             //!<  positioning mode: DGPS/DGNSS
 | 
			
		||||
const unsigned int PMODE_KINEMA = 2;           //!<  positioning mode: kinematic
 | 
			
		||||
const unsigned int PMODE_STATIC = 3;           //!<  positioning mode: static
 | 
			
		||||
const unsigned int PMODE_MOVEB = 4;            //!<  positioning mode: moving-base
 | 
			
		||||
const unsigned int PMODE_FIXED = 5;            //!<  positioning mode: fixed
 | 
			
		||||
const unsigned int PMODE_PPP_KINEMA = 6;       //!<  positioning mode: PPP-kinemaric
 | 
			
		||||
const unsigned int PMODE_PPP_STATIC = 7;       //!<  positioning mode: PPP-static
 | 
			
		||||
const unsigned int PMODE_PPP_FIXED = 8;        //!<  positioning mode: PPP-fixed
 | 
			
		||||
#define P2_5        0.03125             /* 2^-5 */
 | 
			
		||||
#define P2_6        0.015625            /* 2^-6 */
 | 
			
		||||
#define P2_11       4.882812500000000E-04 /* 2^-11 */
 | 
			
		||||
#define P2_15       3.051757812500000E-05 /* 2^-15 */
 | 
			
		||||
#define P2_17       7.629394531250000E-06 /* 2^-17 */
 | 
			
		||||
#define P2_19       1.907348632812500E-06 /* 2^-19 */
 | 
			
		||||
#define P2_20       9.536743164062500E-07 /* 2^-20 */
 | 
			
		||||
#define P2_21       4.768371582031250E-07 /* 2^-21 */
 | 
			
		||||
#define P2_23       1.192092895507810E-07 /* 2^-23 */
 | 
			
		||||
#define P2_24       5.960464477539063E-08 /* 2^-24 */
 | 
			
		||||
#define P2_27       7.450580596923828E-09 /* 2^-27 */
 | 
			
		||||
#define P2_29       1.862645149230957E-09 /* 2^-29 */
 | 
			
		||||
#define P2_30       9.313225746154785E-10 /* 2^-30 */
 | 
			
		||||
#define P2_31       4.656612873077393E-10 /* 2^-31 */
 | 
			
		||||
#define P2_32       2.328306436538696E-10 /* 2^-32 */
 | 
			
		||||
#define P2_33       1.164153218269348E-10 /* 2^-33 */
 | 
			
		||||
#define P2_35       2.910383045673370E-11 /* 2^-35 */
 | 
			
		||||
#define P2_38       3.637978807091710E-12 /* 2^-38 */
 | 
			
		||||
#define P2_39       1.818989403545856E-12 /* 2^-39 */
 | 
			
		||||
#define P2_40       9.094947017729280E-13 /* 2^-40 */
 | 
			
		||||
#define P2_43       1.136868377216160E-13 /* 2^-43 */
 | 
			
		||||
#define P2_48       3.552713678800501E-15 /* 2^-48 */
 | 
			
		||||
#define P2_50       8.881784197001252E-16 /* 2^-50 */
 | 
			
		||||
#define P2_55       2.775557561562891E-17 /* 2^-55 */
 | 
			
		||||
 | 
			
		||||
const unsigned int SOLF_LLH = 0;               //!<  solution format: lat/lon/height
 | 
			
		||||
const unsigned int SOLF_XYZ = 1;               //!<  solution format: x/y/z-ecef
 | 
			
		||||
const unsigned int SOLF_ENU = 2;               //!<  solution format: e/n/u-baseline
 | 
			
		||||
const unsigned int SOLF_NMEA = 3;              //!<  solution format: NMEA-183
 | 
			
		||||
const unsigned int SOLF_STAT = 4;              //!<  solution format: solution status
 | 
			
		||||
const unsigned int SOLF_GSIF = 5;              //!<  solution format: GSI F1/F2
 | 
			
		||||
#define POLYCRC32   0xEDB88320u /* CRC32 polynomial */
 | 
			
		||||
#define POLYCRC24Q  0x1864CFBu  /* CRC24Q polynomial */
 | 
			
		||||
 | 
			
		||||
const unsigned int SOLQ_NONE = 0;              //!<  solution status: no solution
 | 
			
		||||
const unsigned int SOLQ_FIX = 1;               //!<  solution status: fix
 | 
			
		||||
const unsigned int SOLQ_FLOAT = 2;             //!<  solution status: float
 | 
			
		||||
const unsigned int SOLQ_SBAS = 3;              //!<  solution status: SBAS
 | 
			
		||||
const unsigned int SOLQ_DGPS = 4;              //!<  solution status: DGPS/DGNSS
 | 
			
		||||
const unsigned int SOLQ_SINGLE = 5;            //!<  solution status: single
 | 
			
		||||
const unsigned int SOLQ_PPP = 6;               //!<  solution status: PPP
 | 
			
		||||
const unsigned int SOLQ_DR = 7;                //!<  solution status: dead reckoning
 | 
			
		||||
const unsigned int MAXSOLQ = 7;                //!<  max number of solution status
 | 
			
		||||
#define PMODE_SINGLE 0                  /* positioning mode: single */
 | 
			
		||||
#define PMODE_DGPS   1                  /* positioning mode: DGPS/DGNSS */
 | 
			
		||||
#define PMODE_KINEMA 2                  /* positioning mode: kinematic */
 | 
			
		||||
#define PMODE_STATIC 3                  /* positioning mode: static */
 | 
			
		||||
#define PMODE_MOVEB  4                  /* positioning mode: moving-base */
 | 
			
		||||
#define PMODE_FIXED  5                  /* positioning mode: fixed */
 | 
			
		||||
#define PMODE_PPP_KINEMA 6              /* positioning mode: PPP-kinemaric */
 | 
			
		||||
#define PMODE_PPP_STATIC 7              /* positioning mode: PPP-static */
 | 
			
		||||
#define PMODE_PPP_FIXED 8               /* positioning mode: PPP-fixed */
 | 
			
		||||
 | 
			
		||||
const unsigned int TIMES_GPST = 0;             //!<  time system: gps time
 | 
			
		||||
const unsigned int TIMES_UTC = 1;              //!<  time system: utc
 | 
			
		||||
const unsigned int TIMES_JST = 2;              //!<  time system: jst
 | 
			
		||||
#define SOLF_LLH    0                   /* solution format: lat/lon/height */
 | 
			
		||||
#define SOLF_XYZ    1                   /* solution format: x/y/z-ecef */
 | 
			
		||||
#define SOLF_ENU    2                   /* solution format: e/n/u-baseline */
 | 
			
		||||
#define SOLF_NMEA   3                   /* solution format: NMEA-183 */
 | 
			
		||||
#define SOLF_STAT   4                   /* solution format: solution status */
 | 
			
		||||
#define SOLF_GSIF   5                   /* solution format: GSI F1/F2 */
 | 
			
		||||
 | 
			
		||||
const unsigned int MAXFREQ = 7;                //!<  max NFREQ
 | 
			
		||||
#define SOLQ_NONE   0                   /* solution status: no solution */
 | 
			
		||||
#define SOLQ_FIX    1                   /* solution status: fix */
 | 
			
		||||
#define SOLQ_FLOAT  2                   /* solution status: float */
 | 
			
		||||
#define SOLQ_SBAS   3                   /* solution status: SBAS */
 | 
			
		||||
#define SOLQ_DGPS   4                   /* solution status: DGPS/DGNSS */
 | 
			
		||||
#define SOLQ_SINGLE 5                   /* solution status: single */
 | 
			
		||||
#define SOLQ_PPP    6                   /* solution status: PPP */
 | 
			
		||||
#define SOLQ_DR     7                   /* solution status: dead reconing */
 | 
			
		||||
#define MAXSOLQ     7                   /* max number of solution status */
 | 
			
		||||
 | 
			
		||||
const unsigned int MAXLEAPS = 64;              //!<  max number of leap seconds table */
 | 
			
		||||
const double DTTOL = 0.005;                    //!<  tolerance of time difference (s) */
 | 
			
		||||
#define TIMES_GPST  0                   /* time system: gps time */
 | 
			
		||||
#define TIMES_UTC   1                   /* time system: utc */
 | 
			
		||||
#define TIMES_JST   2                   /* time system: jst */
 | 
			
		||||
 | 
			
		||||
const unsigned int NFREQ = 3;
 | 
			
		||||
const unsigned int NEXOBS = 0;                 //!<  number of extended obs codes */
 | 
			
		||||
const unsigned int MAXANT = 64;                //!<  max length of station name/antenna type */
 | 
			
		||||
#define MAXFREQ     7                   /* max NFREQ */
 | 
			
		||||
 | 
			
		||||
const unsigned int MINPRNGPS = 1;              //!<   min satellite PRN number of GPS */
 | 
			
		||||
const unsigned int MAXPRNGPS = 32;             //!<   max satellite PRN number of GPS */
 | 
			
		||||
const unsigned int NSATGPS = (MAXPRNGPS - MINPRNGPS + 1); //!<   number of GPS satellites */
 | 
			
		||||
const unsigned int NSYSGPS = 1;
 | 
			
		||||
#define FREQ1       1.57542E9           /* L1/E1  frequency (Hz) */
 | 
			
		||||
#define FREQ2       1.22760E9           /* L2     frequency (Hz) */
 | 
			
		||||
#define FREQ5       1.17645E9           /* L5/E5a frequency (Hz) */
 | 
			
		||||
#define FREQ6       1.27875E9           /* E6/LEX frequency (Hz) */
 | 
			
		||||
#define FREQ7       1.20714E9           /* E5b    frequency (Hz) */
 | 
			
		||||
#define FREQ8       1.191795E9          /* E5a+b  frequency (Hz) */
 | 
			
		||||
#define FREQ9       2.492028E9          /* S      frequency (Hz) */
 | 
			
		||||
#define FREQ1_GLO   1.60200E9           /* GLONASS G1 base frequency (Hz) */
 | 
			
		||||
#define DFRQ1_GLO   0.56250E6           /* GLONASS G1 bias frequency (Hz/n) */
 | 
			
		||||
#define FREQ2_GLO   1.24600E9           /* GLONASS G2 base frequency (Hz) */
 | 
			
		||||
#define DFRQ2_GLO   0.43750E6           /* GLONASS G2 bias frequency (Hz/n) */
 | 
			
		||||
#define FREQ3_GLO   1.202025E9          /* GLONASS G3 frequency (Hz) */
 | 
			
		||||
#define FREQ1_CMP   1.561098E9          /* BeiDou B1 frequency (Hz) */
 | 
			
		||||
#define FREQ2_CMP   1.20714E9           /* BeiDou B2 frequency (Hz) */
 | 
			
		||||
#define FREQ3_CMP   1.26852E9           /* BeiDou B3 frequency (Hz) */
 | 
			
		||||
 | 
			
		||||
const int SYS_NONE = 0x00;               //!<   navigation system: none */
 | 
			
		||||
const int SYS_GPS = 0x01;                //!<   navigation system: GPS */
 | 
			
		||||
const int SYS_SBS = 0x02;                //!<   navigation system: SBAS */
 | 
			
		||||
const int SYS_GLO = 0x04;                //!<   navigation system: GLONASS */
 | 
			
		||||
const int SYS_GAL = 0x08;                //!<   navigation system: Galileo */
 | 
			
		||||
const int SYS_QZS = 0x10;                //!<   navigation system: QZSS */
 | 
			
		||||
const int SYS_BDS = 0x20;                //!<   navigation system: BeiDou */
 | 
			
		||||
const int SYS_IRN = 0x40;                //!<   navigation system: IRNS */
 | 
			
		||||
const int SYS_LEO = 0x80;                //!<   navigation system: LEO */
 | 
			
		||||
const int SYS_ALL = 0xFF;                //!<   navigation system: all */
 | 
			
		||||
#define MAXLEAPS    64                  /* max number of leap seconds table */
 | 
			
		||||
#define DTTOL       0.005               /* tolerance of time difference (s) */
 | 
			
		||||
 | 
			
		||||
const unsigned int CODE_NONE = 0;        //!<   obs code: none or unknown */
 | 
			
		||||
const unsigned int CODE_L1C = 1;         //!<   obs code: L1C/A,G1C/A,E1C (GPS,GLO,GAL,QZS,SBS) */
 | 
			
		||||
const unsigned int CODE_L1P = 2;         //!<   obs code: L1P,G1P    (GPS,GLO) */
 | 
			
		||||
const unsigned int CODE_L1W = 3;         //!<   obs code: L1 Z-track (GPS) */
 | 
			
		||||
const unsigned int CODE_L1Y = 4;         //!<   obs code: L1Y        (GPS) */
 | 
			
		||||
const unsigned int CODE_L1M = 5;         //!<   obs code: L1M        (GPS) */
 | 
			
		||||
const unsigned int CODE_L1N = 6;         //!<   obs code: L1codeless (GPS) */
 | 
			
		||||
const unsigned int CODE_L1S = 7;         //!<   obs code: L1C(D)     (GPS,QZS) */
 | 
			
		||||
const unsigned int CODE_L1L = 8;         //!<   obs code: L1C(P)     (GPS,QZS) */
 | 
			
		||||
const unsigned int CODE_L1E = 9;         //!<   (not used) */
 | 
			
		||||
const unsigned int CODE_L1A = 10;        //!<   obs code: E1A        (GAL) */
 | 
			
		||||
const unsigned int CODE_L1B = 11;        //!<   obs code: E1B        (GAL) */
 | 
			
		||||
const unsigned int CODE_L1X = 12;        //!<   obs code: E1B+C,L1C(D+P) (GAL,QZS) */
 | 
			
		||||
const unsigned int CODE_L1Z = 13;        //!<   obs code: E1A+B+C,L1SAIF (GAL,QZS) */
 | 
			
		||||
const unsigned int CODE_L2C = 14;        //!<   obs code: L2C/A,G1C/A (GPS,GLO) */
 | 
			
		||||
const unsigned int CODE_L2D = 15;        //!<   obs code: L2 L1C/A-(P2-P1) (GPS) */
 | 
			
		||||
const unsigned int CODE_L2S = 16;        //!<   obs code: L2C(M)     (GPS,QZS) */
 | 
			
		||||
const unsigned int CODE_L2L = 17;        //!<   obs code: L2C(L)     (GPS,QZS) */
 | 
			
		||||
const unsigned int CODE_L2X = 18;        //!<   obs code: L2C(M+L),B1I+Q (GPS,QZS,BDS) */
 | 
			
		||||
const unsigned int CODE_L2P = 19;        //!<   obs code: L2P,G2P    (GPS,GLO) */
 | 
			
		||||
const unsigned int CODE_L2W = 20;        //!<   obs code: L2 Z-track (GPS) */
 | 
			
		||||
const unsigned int CODE_L2Y = 21;        //!<   obs code: L2Y        (GPS) */
 | 
			
		||||
const unsigned int CODE_L2M = 22;        //!<   obs code: L2M        (GPS) */
 | 
			
		||||
const unsigned int CODE_L2N = 23;        //!<   obs code: L2codeless (GPS) */
 | 
			
		||||
const unsigned int CODE_L5I = 24;        //!<   obs code: L5/E5aI    (GPS,GAL,QZS,SBS) */
 | 
			
		||||
const unsigned int CODE_L5Q = 25;        //!<   obs code: L5/E5aQ    (GPS,GAL,QZS,SBS) */
 | 
			
		||||
const unsigned int CODE_L5X = 26;        //!<   obs code: L5/E5aI+Q/L5B+C (GPS,GAL,QZS,IRN,SBS) */
 | 
			
		||||
const unsigned int CODE_L7I = 27;        //!<   obs code: E5bI,B2I   (GAL,BDS) */
 | 
			
		||||
const unsigned int CODE_L7Q = 28;        //!<   obs code: E5bQ,B2Q   (GAL,BDS) */
 | 
			
		||||
const unsigned int CODE_L7X = 29;        //!<   obs code: E5bI+Q,B2I+Q (GAL,BDS) */
 | 
			
		||||
const unsigned int CODE_L6A = 30;        //!<   obs code: E6A        (GAL) */
 | 
			
		||||
const unsigned int CODE_L6B = 31;        //!<   obs code: E6B        (GAL) */
 | 
			
		||||
const unsigned int CODE_L6C = 32;        //!<   obs code: E6C        (GAL) */
 | 
			
		||||
const unsigned int CODE_L6X = 33;        //!<   obs code: E6B+C,LEXS+L,B3I+Q (GAL,QZS,BDS) */
 | 
			
		||||
const unsigned int CODE_L6Z = 34;        //!<   obs code: E6A+B+C    (GAL) */
 | 
			
		||||
const unsigned int CODE_L6S = 35;        //!<   obs code: LEXS       (QZS) */
 | 
			
		||||
const unsigned int CODE_L6L = 36;        //!<   obs code: LEXL       (QZS) */
 | 
			
		||||
const unsigned int CODE_L8I = 37;        //!<   obs code: E5(a+b)I   (GAL) */
 | 
			
		||||
const unsigned int CODE_L8Q = 38;        //!<   obs code: E5(a+b)Q   (GAL) */
 | 
			
		||||
const unsigned int CODE_L8X = 39;        //!<   obs code: E5(a+b)I+Q (GAL) */
 | 
			
		||||
const unsigned int CODE_L2I = 40;        //!<   obs code: B1I        (BDS) */
 | 
			
		||||
const unsigned int CODE_L2Q = 41;        //!<   obs code: B1Q        (BDS) */
 | 
			
		||||
const unsigned int CODE_L6I = 42;        //!<   obs code: B3I        (BDS) */
 | 
			
		||||
const unsigned int CODE_L6Q = 43;        //!<   obs code: B3Q        (BDS) */
 | 
			
		||||
const unsigned int CODE_L3I = 44;        //!<   obs code: G3I        (GLO) */
 | 
			
		||||
const unsigned int CODE_L3Q = 45;        //!<   obs code: G3Q        (GLO) */
 | 
			
		||||
const unsigned int CODE_L3X = 46;        //!<   obs code: G3I+Q      (GLO) */
 | 
			
		||||
const unsigned int CODE_L1I = 47;        //!<   obs code: B1I        (BDS) */
 | 
			
		||||
const unsigned int CODE_L1Q = 48;        //!<   obs code: B1Q        (BDS) */
 | 
			
		||||
const unsigned int CODE_L5A = 49;        //!<   obs code: L5A SPS    (IRN) */
 | 
			
		||||
const unsigned int CODE_L5B = 50;        //!<   obs code: L5B RS(D)  (IRN) */
 | 
			
		||||
const unsigned int CODE_L5C = 51;        //!<   obs code: L5C RS(P)  (IRN) */
 | 
			
		||||
const unsigned int CODE_L9A = 52;        //!<   obs code: SA SPS     (IRN) */
 | 
			
		||||
const unsigned int CODE_L9B = 53;        //!<   obs code: SB RS(D)   (IRN) */
 | 
			
		||||
const unsigned int CODE_L9C = 54;        //!<   obs code: SC RS(P)   (IRN) */
 | 
			
		||||
const unsigned int CODE_L9X = 55;        //!<   obs code: SB+C       (IRN) */
 | 
			
		||||
const unsigned int MAXCODE = 55;         //!<   max number of obs code */
 | 
			
		||||
#define NFREQ 	3
 | 
			
		||||
#define NEXOBS	0                   /* number of extended obs codes */
 | 
			
		||||
#define MAXANT      64                  /* max length of station name/antenna type */
 | 
			
		||||
 | 
			
		||||
#define MINPRNGPS   1                   /* min satellite PRN number of GPS */
 | 
			
		||||
#define MAXPRNGPS   32                  /* max satellite PRN number of GPS */
 | 
			
		||||
#define NSATGPS     (MAXPRNGPS-MINPRNGPS+1) /* number of GPS satellites */
 | 
			
		||||
#define NSYSGPS     1
 | 
			
		||||
 | 
			
		||||
#define SYS_NONE    0x00                /* navigation system: none */
 | 
			
		||||
#define SYS_GPS     0x01                /* navigation system: GPS */
 | 
			
		||||
#define SYS_SBS     0x02                /* navigation system: SBAS */
 | 
			
		||||
#define SYS_GLO     0x04                /* navigation system: GLONASS */
 | 
			
		||||
#define SYS_GAL     0x08                /* navigation system: Galileo */
 | 
			
		||||
#define SYS_QZS     0x10                /* navigation system: QZSS */
 | 
			
		||||
#define SYS_CMP     0x20                /* navigation system: BeiDou */
 | 
			
		||||
#define SYS_IRN     0x40                /* navigation system: IRNS */
 | 
			
		||||
#define SYS_LEO     0x80                /* navigation system: LEO */
 | 
			
		||||
#define SYS_ALL     0xFF                /* navigation system: all */
 | 
			
		||||
 | 
			
		||||
#define CODE_NONE   0                   /* obs code: none or unknown */
 | 
			
		||||
#define CODE_L1C    1                   /* obs code: L1C/A,G1C/A,E1C (GPS,GLO,GAL,QZS,SBS) */
 | 
			
		||||
#define CODE_L1P    2                   /* obs code: L1P,G1P    (GPS,GLO) */
 | 
			
		||||
#define CODE_L1W    3                   /* obs code: L1 Z-track (GPS) */
 | 
			
		||||
#define CODE_L1Y    4                   /* obs code: L1Y        (GPS) */
 | 
			
		||||
#define CODE_L1M    5                   /* obs code: L1M        (GPS) */
 | 
			
		||||
#define CODE_L1N    6                   /* obs code: L1codeless (GPS) */
 | 
			
		||||
#define CODE_L1S    7                   /* obs code: L1C(D)     (GPS,QZS) */
 | 
			
		||||
#define CODE_L1L    8                   /* obs code: L1C(P)     (GPS,QZS) */
 | 
			
		||||
#define CODE_L1E    9                   /* (not used) */
 | 
			
		||||
#define CODE_L1A    10                  /* obs code: E1A        (GAL) */
 | 
			
		||||
#define CODE_L1B    11                  /* obs code: E1B        (GAL) */
 | 
			
		||||
#define CODE_L1X    12                  /* obs code: E1B+C,L1C(D+P) (GAL,QZS) */
 | 
			
		||||
#define CODE_L1Z    13                  /* obs code: E1A+B+C,L1SAIF (GAL,QZS) */
 | 
			
		||||
#define CODE_L2C    14                  /* obs code: L2C/A,G1C/A (GPS,GLO) */
 | 
			
		||||
#define CODE_L2D    15                  /* obs code: L2 L1C/A-(P2-P1) (GPS) */
 | 
			
		||||
#define CODE_L2S    16                  /* obs code: L2C(M)     (GPS,QZS) */
 | 
			
		||||
#define CODE_L2L    17                  /* obs code: L2C(L)     (GPS,QZS) */
 | 
			
		||||
#define CODE_L2X    18                  /* obs code: L2C(M+L),B1I+Q (GPS,QZS,CMP) */
 | 
			
		||||
#define CODE_L2P    19                  /* obs code: L2P,G2P    (GPS,GLO) */
 | 
			
		||||
#define CODE_L2W    20                  /* obs code: L2 Z-track (GPS) */
 | 
			
		||||
#define CODE_L2Y    21                  /* obs code: L2Y        (GPS) */
 | 
			
		||||
#define CODE_L2M    22                  /* obs code: L2M        (GPS) */
 | 
			
		||||
#define CODE_L2N    23                  /* obs code: L2codeless (GPS) */
 | 
			
		||||
#define CODE_L5I    24                  /* obs code: L5/E5aI    (GPS,GAL,QZS,SBS) */
 | 
			
		||||
#define CODE_L5Q    25                  /* obs code: L5/E5aQ    (GPS,GAL,QZS,SBS) */
 | 
			
		||||
#define CODE_L5X    26                  /* obs code: L5/E5aI+Q/L5B+C (GPS,GAL,QZS,IRN,SBS) */
 | 
			
		||||
#define CODE_L7I    27                  /* obs code: E5bI,B2I   (GAL,CMP) */
 | 
			
		||||
#define CODE_L7Q    28                  /* obs code: E5bQ,B2Q   (GAL,CMP) */
 | 
			
		||||
#define CODE_L7X    29                  /* obs code: E5bI+Q,B2I+Q (GAL,CMP) */
 | 
			
		||||
#define CODE_L6A    30                  /* obs code: E6A        (GAL) */
 | 
			
		||||
#define CODE_L6B    31                  /* obs code: E6B        (GAL) */
 | 
			
		||||
#define CODE_L6C    32                  /* obs code: E6C        (GAL) */
 | 
			
		||||
#define CODE_L6X    33                  /* obs code: E6B+C,LEXS+L,B3I+Q (GAL,QZS,CMP) */
 | 
			
		||||
#define CODE_L6Z    34                  /* obs code: E6A+B+C    (GAL) */
 | 
			
		||||
#define CODE_L6S    35                  /* obs code: LEXS       (QZS) */
 | 
			
		||||
#define CODE_L6L    36                  /* obs code: LEXL       (QZS) */
 | 
			
		||||
#define CODE_L8I    37                  /* obs code: E5(a+b)I   (GAL) */
 | 
			
		||||
#define CODE_L8Q    38                  /* obs code: E5(a+b)Q   (GAL) */
 | 
			
		||||
#define CODE_L8X    39                  /* obs code: E5(a+b)I+Q (GAL) */
 | 
			
		||||
#define CODE_L2I    40                  /* obs code: B1I        (BDS) */
 | 
			
		||||
#define CODE_L2Q    41                  /* obs code: B1Q        (BDS) */
 | 
			
		||||
#define CODE_L6I    42                  /* obs code: B3I        (BDS) */
 | 
			
		||||
#define CODE_L6Q    43                  /* obs code: B3Q        (BDS) */
 | 
			
		||||
#define CODE_L3I    44                  /* obs code: G3I        (GLO) */
 | 
			
		||||
#define CODE_L3Q    45                  /* obs code: G3Q        (GLO) */
 | 
			
		||||
#define CODE_L3X    46                  /* obs code: G3I+Q      (GLO) */
 | 
			
		||||
#define CODE_L1I    47                  /* obs code: B1I        (BDS) */
 | 
			
		||||
#define CODE_L1Q    48                  /* obs code: B1Q        (BDS) */
 | 
			
		||||
#define CODE_L5A    49                  /* obs code: L5A SPS    (IRN) */
 | 
			
		||||
#define CODE_L5B    50                  /* obs code: L5B RS(D)  (IRN) */
 | 
			
		||||
#define CODE_L5C    51                  /* obs code: L5C RS(P)  (IRN) */
 | 
			
		||||
#define CODE_L9A    52                  /* obs code: SA SPS     (IRN) */
 | 
			
		||||
#define CODE_L9B    53                  /* obs code: SB RS(D)   (IRN) */
 | 
			
		||||
#define CODE_L9C    54                  /* obs code: SC RS(P)   (IRN) */
 | 
			
		||||
#define CODE_L9X    55                  /* obs code: SB+C       (IRN) */
 | 
			
		||||
#define MAXCODE     55                  /* max number of obs code */
 | 
			
		||||
 | 
			
		||||
#ifdef ENAGLO
 | 
			
		||||
const unsigned int MINPRNGLO = 1;                   //!<   min satellite slot number of GLONASS */
 | 
			
		||||
const unsigned int MAXPRNGLO = 27;                  //!<   max satellite slot number of GLONASS */
 | 
			
		||||
const unsigned int NSATGLO = (MAXPRNGLO - MINPRNGLO + 1); //!<   number of GLONASS satellites */
 | 
			
		||||
const unsigned int NSYSGLO = 1;
 | 
			
		||||
#define MINPRNGLO   1                   /* min satellite slot number of GLONASS */
 | 
			
		||||
#define MAXPRNGLO   27                  /* max satellite slot number of GLONASS */
 | 
			
		||||
#define NSATGLO     (MAXPRNGLO-MINPRNGLO+1) /* number of GLONASS satellites */
 | 
			
		||||
#define NSYSGLO     1
 | 
			
		||||
#else
 | 
			
		||||
const unsigned int MINPRNGLO = 0;
 | 
			
		||||
const unsigned int MAXPRNGLO = 0;
 | 
			
		||||
const unsigned int NSATGLO = 0;
 | 
			
		||||
const unsigned int NSYSGLO = 0;
 | 
			
		||||
#define MINPRNGLO   0
 | 
			
		||||
#define MAXPRNGLO   0
 | 
			
		||||
#define NSATGLO     0
 | 
			
		||||
#define NSYSGLO     0
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef ENAGAL
 | 
			
		||||
const unsigned int MINPRNGAL = 1;                   //!<   min satellite PRN number of Galileo */
 | 
			
		||||
const unsigned int MAXPRNGAL = 30;                  //!<   max satellite PRN number of Galileo */
 | 
			
		||||
const unsigned int NSATGAL = (MAXPRNGAL - MINPRNGAL + 1); //!<   number of Galileo satellites */
 | 
			
		||||
const unsigned int NSYSGAL = 1;
 | 
			
		||||
#define MINPRNGAL   1                   /* min satellite PRN number of Galileo */
 | 
			
		||||
#define MAXPRNGAL   30                  /* max satellite PRN number of Galileo */
 | 
			
		||||
#define NSATGAL    (MAXPRNGAL-MINPRNGAL+1) /* number of Galileo satellites */
 | 
			
		||||
#define NSYSGAL     1
 | 
			
		||||
#else
 | 
			
		||||
const unsigned int MINPRNGAL = 0;
 | 
			
		||||
const unsigned int MAXPRNGAL = 0;
 | 
			
		||||
const unsigned int NSATGAL = 0;
 | 
			
		||||
const unsigned int NSYSGAL =  0;
 | 
			
		||||
#define MINPRNGAL   0
 | 
			
		||||
#define MAXPRNGAL   0
 | 
			
		||||
#define NSATGAL     0
 | 
			
		||||
#define NSYSGAL     0
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef ENAQZS
 | 
			
		||||
const unsigned int MINPRNQZS = 193;                 //!<  min satellite PRN number of QZSS */
 | 
			
		||||
const unsigned int MAXPRNQZS = 199;                 //!<   max satellite PRN number of QZSS */
 | 
			
		||||
const unsigned int MINPRNQZS_S = 183;               //!<   min satellite PRN number of QZSS SAIF */
 | 
			
		||||
const unsigned int MAXPRNQZS_S = 189;               //!<   max satellite PRN number of QZSS SAIF */
 | 
			
		||||
const unsigned int NSATQZS  = (MAXPRNQZS - MINPRNQZS + 1); //!<   number of QZSS satellites */
 | 
			
		||||
const unsigned int NSYSQZS = 1;
 | 
			
		||||
#define MINPRNQZS   193                 /* min satellite PRN number of QZSS */
 | 
			
		||||
#define MAXPRNQZS   199                 /* max satellite PRN number of QZSS */
 | 
			
		||||
#define MINPRNQZS_S 183                 /* min satellite PRN number of QZSS SAIF */
 | 
			
		||||
#define MAXPRNQZS_S 189                 /* max satellite PRN number of QZSS SAIF */
 | 
			
		||||
#define NSATQZS     (MAXPRNQZS-MINPRNQZS+1) /* number of QZSS satellites */
 | 
			
		||||
#define NSYSQZS     1
 | 
			
		||||
#else
 | 
			
		||||
const unsigned int MINPRNQZS = 0;
 | 
			
		||||
const unsigned int MAXPRNQZS = 0;
 | 
			
		||||
const unsigned int MINPRNQZS_S = 0;
 | 
			
		||||
const unsigned int MAXPRNQZS_S = 0;
 | 
			
		||||
const unsigned int NSATQZS = 0;
 | 
			
		||||
const unsigned int NSYSQZS = 0;
 | 
			
		||||
#define MINPRNQZS   0
 | 
			
		||||
#define MAXPRNQZS   0
 | 
			
		||||
#define MINPRNQZS_S 0
 | 
			
		||||
#define MAXPRNQZS_S 0
 | 
			
		||||
#define NSATQZS     0
 | 
			
		||||
#define NSYSQZS     0
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef ENABDS
 | 
			
		||||
const unsigned int MINPRNBDS = 1;                   //!<   min satellite sat number of BeiDou */
 | 
			
		||||
const unsigned int MAXPRNBDS = 35;                  //!<   max satellite sat number of BeiDou */
 | 
			
		||||
const unsigned int NSATBDS = (MAXPRNBDS - MINPRNCM + 1); //!<   number of BeiDou satellites */
 | 
			
		||||
const unsigned int NSYSBDS = 1;
 | 
			
		||||
#ifdef ENACMP
 | 
			
		||||
#define MINPRNCMP   1                   /* min satellite sat number of BeiDou */
 | 
			
		||||
#define MAXPRNCMP   35                  /* max satellite sat number of BeiDou */
 | 
			
		||||
#define NSATCMP     (MAXPRNCMP-MINPRNCMP+1) /* number of BeiDou satellites */
 | 
			
		||||
#define NSYSCMP     1
 | 
			
		||||
#else
 | 
			
		||||
const unsigned int MINPRNBDS = 0;
 | 
			
		||||
const unsigned int MAXPRNBDS = 0;
 | 
			
		||||
const unsigned int NSATBDS = 0;
 | 
			
		||||
const unsigned int NSYSBDS = 0;
 | 
			
		||||
#define MINPRNCMP   0
 | 
			
		||||
#define MAXPRNCMP   0
 | 
			
		||||
#define NSATCMP     0
 | 
			
		||||
#define NSYSCMP     0
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef ENAIRN
 | 
			
		||||
const unsigned int MINPRNIRN = 1;                   //!<   min satellite sat number of IRNSS */
 | 
			
		||||
const unsigned int MAXPRNIRN = 7;                   //!<  max satellite sat number of IRNSS */
 | 
			
		||||
const unsigned int NSATIRN = (MAXPRNIRN - MINPRNIRN + 1); //!<   number of IRNSS satellites */
 | 
			
		||||
const unsigned int NSYSIRN = 1;
 | 
			
		||||
#define MINPRNIRN   1                   /* min satellite sat number of IRNSS */
 | 
			
		||||
#define MAXPRNIRN   7                   /* max satellite sat number of IRNSS */
 | 
			
		||||
#define NSATIRN     (MAXPRNIRN-MINPRNIRN+1) /* number of IRNSS satellites */
 | 
			
		||||
#define NSYSIRN     1
 | 
			
		||||
#else
 | 
			
		||||
const unsigned int MINPRNIRN = 0;
 | 
			
		||||
const unsigned int MAXPRNIRN = 0;
 | 
			
		||||
const unsigned int NSATIRN = 0;
 | 
			
		||||
const unsigned int NSYSIRN = 0;
 | 
			
		||||
#define MINPRNIRN   0
 | 
			
		||||
#define MAXPRNIRN   0
 | 
			
		||||
#define NSATIRN     0
 | 
			
		||||
#define NSYSIRN     0
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef ENALEO
 | 
			
		||||
const unsigned int MINPRNLEO = 1;                  //!<   min satellite sat number of LEO */
 | 
			
		||||
const unsigned int NSATLEO = 10;                   //!<   max satellite sat number of LEO */
 | 
			
		||||
const unsigned int NSATLEO = (MAXPRNLEO - MINPRNLEO + 1); //!<   number of LEO satellites */
 | 
			
		||||
const unsigned int NSYSLEO = 1;
 | 
			
		||||
#define MINPRNLEO   1                   /* min satellite sat number of LEO */
 | 
			
		||||
#define MAXPRNLEO   10                  /* max satellite sat number of LEO */
 | 
			
		||||
#define NSATLEO     (MAXPRNLEO-MINPRNLEO+1) /* number of LEO satellites */
 | 
			
		||||
#define NSYSLEO     1
 | 
			
		||||
#else
 | 
			
		||||
const unsigned int MINPRNLEO = 0;
 | 
			
		||||
const unsigned int MAXPRNLEO = 0;
 | 
			
		||||
const unsigned int NSATLEO = 0;
 | 
			
		||||
const unsigned int NSYSLEO = 0;
 | 
			
		||||
#define MINPRNLEO   0
 | 
			
		||||
#define MAXPRNLEO   0
 | 
			
		||||
#define NSATLEO     0
 | 
			
		||||
#define NSYSLEO     0
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
const unsigned int NSYS = (NSYSGPS + NSYSGLO + NSYSGAL + NSYSQZS + NSYSBDS + NSYSIRN + NSYSLEO); /* number of systems */
 | 
			
		||||
#define NSYS        (NSYSGPS+NSYSGLO+NSYSGAL+NSYSQZS+NSYSCMP+NSYSIRN+NSYSLEO) /* number of systems */
 | 
			
		||||
 | 
			
		||||
const unsigned int MINPRNSBS = 120;                 //!<   min satellite PRN number of SBAS */
 | 
			
		||||
const unsigned int MAXPRNSBS = 142;                 //!<   max satellite PRN number of SBAS */
 | 
			
		||||
const unsigned int NSATSBS = (MAXPRNSBS - MINPRNSBS + 1); //!<   number of SBAS satellites */
 | 
			
		||||
#define MINPRNSBS   120                 /* min satellite PRN number of SBAS */
 | 
			
		||||
#define MAXPRNSBS   142                 /* max satellite PRN number of SBAS */
 | 
			
		||||
#define NSATSBS     (MAXPRNSBS-MINPRNSBS+1) /* number of SBAS satellites */
 | 
			
		||||
 | 
			
		||||
const unsigned int MAXSAT = (NSATGPS + NSATGLO + NSATGAL + NSATQZS + NSATBDS + NSATIRN + NSATSBS + NSATLEO);
 | 
			
		||||
#define MAXSAT      (NSATGPS+NSATGLO+NSATGAL+NSATQZS+NSATCMP+NSATIRN+NSATSBS+NSATLEO)
 | 
			
		||||
 | 
			
		||||
const unsigned int MAXSTA = 255;
 | 
			
		||||
#define MAXNIGP     201                 /* max number of IGP in SBAS band */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define MAXCODE     55                  /* max number of obs code */
 | 
			
		||||
 | 
			
		||||
#define MAXSTA      255
 | 
			
		||||
 | 
			
		||||
#ifndef MAXOBS
 | 
			
		||||
const unsigned int MAXOBS = 64;          //!<    max number of obs in an epoch */
 | 
			
		||||
#define MAXOBS      64                  /* max number of obs in an epoch */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
const unsigned int MAXRCV = 64;          //!<    max receiver number (1 to MAXRCV) */
 | 
			
		||||
const unsigned int MAXOBSTYPE = 64;      //!<    max number of obs type in RINEX */
 | 
			
		||||
const double MAXDTOE = 7200.0;           //!<    max time difference to GPS Toe (s) */
 | 
			
		||||
const double MAXDTOE_QZS = 7200.0;       //!<    max time difference to QZSS Toe (s) */
 | 
			
		||||
const double MAXDTOE_GAL = 10800.0;      //!<    max time difference to Galileo Toe (s) */
 | 
			
		||||
const double MAXDTOE_BDS = 21600.0;      //!<    max time difference to BeiDou Toe (s) */
 | 
			
		||||
const double MAXDTOE_GLO = 1800.0;       //!<    max time difference to GLONASS Toe (s) */
 | 
			
		||||
const double MAXDTOE_SBS = 360.0;        //!<    max time difference to SBAS Toe (s) */
 | 
			
		||||
const double MAXDTOE_S =  86400.0;       //!<    max time difference to ephem toe (s) for other */
 | 
			
		||||
const double MAXGDOP = 300.0;            //!<    max GDOP */
 | 
			
		||||
#define MAXRCV      64                  /* max receiver number (1 to MAXRCV) */
 | 
			
		||||
#define MAXOBSTYPE  64                  /* max number of obs type in RINEX */
 | 
			
		||||
#define DTTOL       0.005               /* tolerance of time difference (s) */
 | 
			
		||||
#define MAXDTOE     7200.0              /* max time difference to GPS Toe (s) */
 | 
			
		||||
#define MAXDTOE_QZS 7200.0              /* max time difference to QZSS Toe (s) */
 | 
			
		||||
#define MAXDTOE_GAL 10800.0             /* max time difference to Galileo Toe (s) */
 | 
			
		||||
#define MAXDTOE_CMP 21600.0             /* max time difference to BeiDou Toe (s) */
 | 
			
		||||
#define MAXDTOE_GLO 1800.0              /* max time difference to GLONASS Toe (s) */
 | 
			
		||||
#define MAXDTOE_SBS 360.0               /* max time difference to SBAS Toe (s) */
 | 
			
		||||
#define MAXDTOE_S   86400.0             /* max time difference to ephem toe (s) for other */
 | 
			
		||||
#define MAXGDOP     300.0               /* max GDOP */
 | 
			
		||||
 | 
			
		||||
const unsigned int MAXSBSURA = 8;        //!<    max URA of SBAS satellite */
 | 
			
		||||
const unsigned int MAXBAND = 10;         //!<    max SBAS band of IGP */
 | 
			
		||||
const unsigned int MAXNIGP = 201;        //!<    max number of IGP in SBAS band */
 | 
			
		||||
const unsigned int MAXNGEO = 4;          //!<    max number of GEO satellites */
 | 
			
		||||
#define MAXSBSAGEF  30.0                /* max age of SBAS fast correction (s) */
 | 
			
		||||
#define MAXSBSAGEL  1800.0              /* max age of SBAS long term corr (s) */
 | 
			
		||||
#define MAXSBSURA   8                   /* max URA of SBAS satellite */
 | 
			
		||||
#define MAXBAND     10                  /* max SBAS band of IGP */
 | 
			
		||||
#define MAXNIGP     201                 /* max number of IGP in SBAS band */
 | 
			
		||||
#define MAXNGEO     4                   /* max number of GEO satellites */
 | 
			
		||||
 | 
			
		||||
const unsigned int MAXSOLMSG = 8191;     //!<    max length of solution message */
 | 
			
		||||
const unsigned int MAXERRMSG = 4096;     //!<    max length of error/warning message */
 | 
			
		||||
#define MAXSOLMSG   8191                /* max length of solution message */
 | 
			
		||||
#define MAXERRMSG   4096                /* max length of error/warning message */
 | 
			
		||||
 | 
			
		||||
const unsigned int IONOOPT_OFF = 0;      //!<    ionosphere option: correction off */
 | 
			
		||||
const unsigned int IONOOPT_BRDC = 1;     //!<    ionosphere option: broadcast model */
 | 
			
		||||
const unsigned int IONOOPT_SBAS = 2;     //!<    ionosphere option: SBAS model */
 | 
			
		||||
const unsigned int IONOOPT_IFLC = 3;     //!<    ionosphere option: L1/L2 or L1/L5 iono-free LC */
 | 
			
		||||
const unsigned int IONOOPT_EST = 4;      //!<    ionosphere option: estimation */
 | 
			
		||||
const unsigned int IONOOPT_TEC = 5;      //!<    ionosphere option: IONEX TEC model */
 | 
			
		||||
const unsigned int IONOOPT_QZS = 6;      //!<    ionosphere option: QZSS broadcast model */
 | 
			
		||||
const unsigned int IONOOPT_LEX = 7;      //!<    ionosphere option: QZSS LEX ionospehre */
 | 
			
		||||
const unsigned int IONOOPT_STEC = 8;     //!<    ionosphere option: SLANT TEC model */
 | 
			
		||||
#define IONOOPT_OFF 0                   /* ionosphere option: correction off */
 | 
			
		||||
#define IONOOPT_BRDC 1                  /* ionosphere option: broadcast model */
 | 
			
		||||
#define IONOOPT_SBAS 2                  /* ionosphere option: SBAS model */
 | 
			
		||||
#define IONOOPT_IFLC 3                  /* ionosphere option: L1/L2 or L1/L5 iono-free LC */
 | 
			
		||||
#define IONOOPT_EST 4                   /* ionosphere option: estimation */
 | 
			
		||||
#define IONOOPT_TEC 5                   /* ionosphere option: IONEX TEC model */
 | 
			
		||||
#define IONOOPT_QZS 6                   /* ionosphere option: QZSS broadcast model */
 | 
			
		||||
#define IONOOPT_LEX 7                   /* ionosphere option: QZSS LEX ionospehre */
 | 
			
		||||
#define IONOOPT_STEC 8                  /* ionosphere option: SLANT TEC model */
 | 
			
		||||
 | 
			
		||||
const unsigned int TROPOPT_OFF = 0;      //!<    troposphere option: correction off */
 | 
			
		||||
const unsigned int TROPOPT_SAAS = 1;     //!<    troposphere option: Saastamoinen model */
 | 
			
		||||
const unsigned int TROPOPT_SBAS = 2;     //!<    troposphere option: SBAS model */
 | 
			
		||||
const unsigned int TROPOPT_EST = 3;      //!<    troposphere option: ZTD estimation */
 | 
			
		||||
const unsigned int TROPOPT_ESTG = 4;     //!<    troposphere option: ZTD+grad estimation */
 | 
			
		||||
const unsigned int TROPOPT_ZTD = 5;      //!<    troposphere option: ZTD correction */
 | 
			
		||||
#define TROPOPT_OFF 0                   /* troposphere option: correction off */
 | 
			
		||||
#define TROPOPT_SAAS 1                  /* troposphere option: Saastamoinen model */
 | 
			
		||||
#define TROPOPT_SBAS 2                  /* troposphere option: SBAS model */
 | 
			
		||||
#define TROPOPT_EST 3                   /* troposphere option: ZTD estimation */
 | 
			
		||||
#define TROPOPT_ESTG 4                  /* troposphere option: ZTD+grad estimation */
 | 
			
		||||
#define TROPOPT_ZTD 5                   /* troposphere option: ZTD correction */
 | 
			
		||||
 | 
			
		||||
const unsigned int EPHOPT_BRDC = 0;      //!<    ephemeris option: broadcast ephemeris */
 | 
			
		||||
const unsigned int EPHOPT_PREC = 1;      //!<    ephemeris option: precise ephemeris */
 | 
			
		||||
const unsigned int EPHOPT_SBAS = 2;      //!<    ephemeris option: broadcast + SBAS */
 | 
			
		||||
const unsigned int EPHOPT_SSRAPC = 3;    //!<    ephemeris option: broadcast + SSR_APC */
 | 
			
		||||
const unsigned int EPHOPT_SSRCOM = 4;    //!<    ephemeris option: broadcast + SSR_COM */
 | 
			
		||||
const unsigned int EPHOPT_LEX = 5;       //!<    ephemeris option: QZSS LEX ephemeris */
 | 
			
		||||
#define EPHOPT_BRDC 0                   /* ephemeris option: broadcast ephemeris */
 | 
			
		||||
#define EPHOPT_PREC 1                   /* ephemeris option: precise ephemeris */
 | 
			
		||||
#define EPHOPT_SBAS 2                   /* ephemeris option: broadcast + SBAS */
 | 
			
		||||
#define EPHOPT_SSRAPC 3                 /* ephemeris option: broadcast + SSR_APC */
 | 
			
		||||
#define EPHOPT_SSRCOM 4                 /* ephemeris option: broadcast + SSR_COM */
 | 
			
		||||
#define EPHOPT_LEX  5                   /* ephemeris option: QZSS LEX ephemeris */
 | 
			
		||||
 | 
			
		||||
const double EFACT_GPS = 1.0;            //!<    error factor: GPS */
 | 
			
		||||
const double EFACT_GLO = 1.5;            //!<    error factor: GLONASS */
 | 
			
		||||
const double EFACT_GAL = 1.0;            //!<    error factor: Galileo */
 | 
			
		||||
const double EFACT_QZS = 1.0;            //!<    error factor: QZSS */
 | 
			
		||||
const double EFACT_BDS = 1.0;            //!<    error factor: BeiDou */
 | 
			
		||||
const double EFACT_IRN = 1.5;            //!<    error factor: IRNSS */
 | 
			
		||||
const double EFACT_SBS = 3.0;            //!<    error factor: SBAS */
 | 
			
		||||
#define EFACT_GPS   1.0                 /* error factor: GPS */
 | 
			
		||||
#define EFACT_GLO   1.5                 /* error factor: GLONASS */
 | 
			
		||||
#define EFACT_GAL   1.0                 /* error factor: Galileo */
 | 
			
		||||
#define EFACT_QZS   1.0                 /* error factor: QZSS */
 | 
			
		||||
#define EFACT_CMP   1.0                 /* error factor: BeiDou */
 | 
			
		||||
#define EFACT_IRN   1.5                 /* error factor: IRNSS */
 | 
			
		||||
#define EFACT_SBS   3.0                 /* error factor: SBAS */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
const unsigned int MAXEXFILE = 1024;     //!<    max number of expanded files */
 | 
			
		||||
const double MAXSBSAGEF = 30.0;          //!<    max age of SBAS fast correction (s) */
 | 
			
		||||
const double MAXSBSAGEL = 1800.0;        //!<    max age of SBAS long term corr (s) */
 | 
			
		||||
 | 
			
		||||
#define MAXEXFILE   1024                /* max number of expanded files */
 | 
			
		||||
#define MAXSBSAGEF  30.0                /* max age of SBAS fast correction (s) */
 | 
			
		||||
#define MAXSBSAGEL  1800.0              /* max age of SBAS long term corr (s) */
 | 
			
		||||
#define MAXSBSURA   8                   /* max URA of SBAS satellite */
 | 
			
		||||
#define MAXBAND     10                  /* max SBAS band of IGP */
 | 
			
		||||
#define MAXNIGP     201                 /* max number of IGP in SBAS band */
 | 
			
		||||
 | 
			
		||||
typedef void fatalfunc_t(const char *); /* fatal callback function type */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct {        /* time struct */
 | 
			
		||||
    time_t time;        /* time (s) expressed by standard time_t */
 | 
			
		||||
    double sec;         /* fraction of second under 1 s */
 | 
			
		||||
} gtime_t;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct {        /* observation data record */
 | 
			
		||||
    gtime_t time;       /* receiver sampling time (GPST) */
 | 
			
		||||
    unsigned char sat,rcv; /* satellite/receiver number */
 | 
			
		||||
@@ -353,13 +409,11 @@ typedef struct {        /* observation data record */
 | 
			
		||||
    float  D[NFREQ+NEXOBS]; /* observation data doppler frequency (Hz) */
 | 
			
		||||
} obsd_t;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct {        /* observation data */
 | 
			
		||||
    int n,nmax;         /* number of obervation data/allocated */
 | 
			
		||||
    obsd_t *data;       /* observation data records */
 | 
			
		||||
} obs_t;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct {        /* earth rotation parameter data type */
 | 
			
		||||
    double mjd;         /* mjd (days) */
 | 
			
		||||
    double xp,yp;       /* pole offset (rad) */
 | 
			
		||||
@@ -368,13 +422,11 @@ typedef struct {        /* earth rotation parameter data type */
 | 
			
		||||
    double lod;         /* length of day (s/day) */
 | 
			
		||||
} erpd_t;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct {        /* earth rotation parameter type */
 | 
			
		||||
    int n,nmax;         /* number and max number of data */
 | 
			
		||||
    erpd_t *data;       /* earth rotation parameter data */
 | 
			
		||||
} erp_t;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct {        /* antenna parameter type */
 | 
			
		||||
    int sat;            /* satellite number (0:receiver) */
 | 
			
		||||
    char type[MAXANT];  /* antenna type */
 | 
			
		||||
@@ -385,13 +437,11 @@ typedef struct {        /* antenna parameter type */
 | 
			
		||||
                        /* el=90,85,...,0 or nadir=0,1,2,3,... (deg) */
 | 
			
		||||
} pcv_t;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct {        /* antenna parameters type */
 | 
			
		||||
    int n,nmax;         /* number of data/allocated */
 | 
			
		||||
    pcv_t *pcv;         /* antenna parameters data */
 | 
			
		||||
} pcvs_t;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct {        /* almanac type */
 | 
			
		||||
    int sat;            /* satellite number */
 | 
			
		||||
    int svh;            /* sv health (0:ok) */
 | 
			
		||||
@@ -404,15 +454,14 @@ typedef struct {        /* almanac type */
 | 
			
		||||
    double f0,f1;       /* SV clock parameters (af0,af1) */
 | 
			
		||||
} alm_t;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct {        /* GPS/QZS/GAL broadcast ephemeris type */
 | 
			
		||||
    int sat;            /* satellite number */
 | 
			
		||||
    int iode,iodc;      /* IODE,IODC */
 | 
			
		||||
    int sva;            /* SV accuracy (URA index) */
 | 
			
		||||
    int svh;            /* SV health (0:ok) */
 | 
			
		||||
    int week;           /* GPS/QZS: gps week, GAL: galileo week */
 | 
			
		||||
    int code;           /* GPS/QZS: code on L2, GAL/BDS: data sources */
 | 
			
		||||
    int flag;           /* GPS/QZS: L2 P data flag, BDS: nav type */
 | 
			
		||||
    int code;           /* GPS/QZS: code on L2, GAL/CMP: data sources */
 | 
			
		||||
    int flag;           /* GPS/QZS: L2 P data flag, CMP: nav type */
 | 
			
		||||
    gtime_t toe,toc,ttr; /* Toe,Toc,T_trans */
 | 
			
		||||
                        /* SV orbit parameters */
 | 
			
		||||
    double A,e,i0,OMG0,omg,M0,deln,OMGd,idot;
 | 
			
		||||
@@ -423,11 +472,10 @@ typedef struct {        /* GPS/QZS/GAL broadcast ephemeris type */
 | 
			
		||||
    double tgd[4];      /* group delay parameters */
 | 
			
		||||
                        /* GPS/QZS:tgd[0]=TGD */
 | 
			
		||||
                        /* GAL    :tgd[0]=BGD E5a/E1,tgd[1]=BGD E5b/E1 */
 | 
			
		||||
                        /* BDS    :tgd[0]=BGD1,tgd[1]=BGD2 */
 | 
			
		||||
                        /* CMP    :tgd[0]=BGD1,tgd[1]=BGD2 */
 | 
			
		||||
    double Adot,ndot;   /* Adot,ndot for CNAV */
 | 
			
		||||
} eph_t;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct {        /* GLONASS broadcast ephemeris type */
 | 
			
		||||
    int sat;            /* satellite number */
 | 
			
		||||
    int iode;           /* IODE (0-6 bit of tb field) */
 | 
			
		||||
@@ -453,7 +501,6 @@ typedef struct {        /* precise ephemeris type */
 | 
			
		||||
    float  vco[MAXSAT][3]; /* satellite velocity covariance (m^2) */
 | 
			
		||||
} peph_t;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct {        /* precise clock type */
 | 
			
		||||
    gtime_t time;       /* time (GPST) */
 | 
			
		||||
    int index;          /* clock index for multiple files */
 | 
			
		||||
@@ -461,7 +508,6 @@ typedef struct {        /* precise clock type */
 | 
			
		||||
    float  std[MAXSAT][1]; /* satellite clock std (s) */
 | 
			
		||||
} pclk_t;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct {        /* SBAS ephemeris type */
 | 
			
		||||
    int sat;            /* satellite number */
 | 
			
		||||
    gtime_t t0;         /* reference epoch time (GPST) */
 | 
			
		||||
@@ -474,7 +520,6 @@ typedef struct {        /* SBAS ephemeris type */
 | 
			
		||||
    double af0,af1;     /* satellite clock-offset/drift (s,s/s) */
 | 
			
		||||
} seph_t;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct {        /* norad two line element data type */
 | 
			
		||||
    char name [32];     /* common name */
 | 
			
		||||
    char alias[32];     /* alias name */
 | 
			
		||||
@@ -496,13 +541,11 @@ typedef struct {        /* norad two line element data type */
 | 
			
		||||
    int rev;            /* revolution number at epoch */
 | 
			
		||||
} tled_t;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct {        /* norad two line element type */
 | 
			
		||||
    int n,nmax;         /* number/max number of two line element data */
 | 
			
		||||
    tled_t *data;       /* norad two line element data */
 | 
			
		||||
} tle_t;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct {        /* TEC grid type */
 | 
			
		||||
    gtime_t time;       /* epoch time (GPST) */
 | 
			
		||||
    int ndata[3];       /* TEC grid data size {nlat,nlon,nhgt} */
 | 
			
		||||
@@ -514,27 +557,23 @@ typedef struct {        /* TEC grid type */
 | 
			
		||||
    float *rms;         /* RMS values (tecu) */
 | 
			
		||||
} tec_t;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct {        /* satellite fcb data type */
 | 
			
		||||
    gtime_t ts,te;      /* start/end time (GPST) */
 | 
			
		||||
    double bias[MAXSAT][3]; /* fcb value   (cyc) */
 | 
			
		||||
    double std [MAXSAT][3]; /* fcb std-dev (cyc) */
 | 
			
		||||
} fcbd_t;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct {        /* SBAS message type */
 | 
			
		||||
    int week,tow;       /* receiption time */
 | 
			
		||||
    int prn;            /* SBAS satellite PRN number */
 | 
			
		||||
    unsigned char msg[29]; /* SBAS message (226bit) padded by 0 */
 | 
			
		||||
} sbsmsg_t;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct {        /* SBAS messages type */
 | 
			
		||||
    int n,nmax;         /* number of SBAS messages/allocated */
 | 
			
		||||
    sbsmsg_t *msgs;     /* SBAS messages */
 | 
			
		||||
} sbs_t;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct {        /* SBAS fast correction type */
 | 
			
		||||
    gtime_t t0;         /* time of applicability (TOF) */
 | 
			
		||||
    double prc;         /* pseudorange correction (PRC) (m) */
 | 
			
		||||
@@ -545,7 +584,6 @@ typedef struct {        /* SBAS fast correction type */
 | 
			
		||||
    short ai;           /* degradation factor indicator */
 | 
			
		||||
} sbsfcorr_t;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct {        /* SBAS long term satellite error correction type */
 | 
			
		||||
    gtime_t t0;         /* correction time */
 | 
			
		||||
    int iode;           /* IODE (issue of date ephemeris) */
 | 
			
		||||
@@ -554,14 +592,12 @@ typedef struct {        /* SBAS long term satellite error correction type */
 | 
			
		||||
    double daf0,daf1;   /* delta clock-offset/drift (s,s/s) */
 | 
			
		||||
} sbslcorr_t;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct {        /* SBAS satellite correction type */
 | 
			
		||||
    int sat;            /* satellite number */
 | 
			
		||||
    sbsfcorr_t fcorr;   /* fast correction */
 | 
			
		||||
    sbslcorr_t lcorr;   /* long term correction */
 | 
			
		||||
} sbssatp_t;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct {        /* SBAS satellite corrections type */
 | 
			
		||||
    int iodp;           /* IODP (issue of date mask) */
 | 
			
		||||
    int nsat;           /* number of satellites */
 | 
			
		||||
@@ -569,7 +605,6 @@ typedef struct {        /* SBAS satellite corrections type */
 | 
			
		||||
    sbssatp_t sat[MAXSAT]; /* satellite correction */
 | 
			
		||||
} sbssat_t;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct {        /* SBAS ionospheric correction type */
 | 
			
		||||
    gtime_t t0;         /* correction time */
 | 
			
		||||
    short lat,lon;      /* latitude/longitude (deg) */
 | 
			
		||||
@@ -577,7 +612,6 @@ typedef struct {        /* SBAS ionospheric correction type */
 | 
			
		||||
    float delay;        /* vertical delay estimate (m) */
 | 
			
		||||
} sbsigp_t;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct {        /* IGP band type */
 | 
			
		||||
    short x;            /* longitude/latitude (deg) */
 | 
			
		||||
    const short *y;     /* latitudes/longitudes (deg) */
 | 
			
		||||
@@ -585,14 +619,12 @@ typedef struct {        /* IGP band type */
 | 
			
		||||
    unsigned char bite; /* IGP mask end bit */
 | 
			
		||||
} sbsigpband_t;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct {        /* SBAS ionospheric corrections type */
 | 
			
		||||
    int iodi;           /* IODI (issue of date ionos corr) */
 | 
			
		||||
    int nigp;           /* number of igps */
 | 
			
		||||
    sbsigp_t igp[MAXNIGP]; /* ionospheric correction */
 | 
			
		||||
} sbsion_t;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct {        /* DGPS/GNSS correction type */
 | 
			
		||||
    gtime_t t0;         /* correction time */
 | 
			
		||||
    double prc;         /* pseudorange correction (PRC) (m) */
 | 
			
		||||
@@ -601,7 +633,6 @@ typedef struct {        /* DGPS/GNSS correction type */
 | 
			
		||||
    double udre;        /* UDRE */
 | 
			
		||||
} dgps_t;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct {        /* SSR correction type */
 | 
			
		||||
    gtime_t t0[6];      /* epoch time (GPST) {eph,clk,hrclk,ura,bias,pbias} */
 | 
			
		||||
    double udi[6];      /* SSR update interval (s) */
 | 
			
		||||
@@ -621,7 +652,6 @@ typedef struct {        /* SSR correction type */
 | 
			
		||||
    unsigned char update; /* update flag (0:no update,1:update) */
 | 
			
		||||
} ssr_t;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct {        /* QZSS LEX message type */
 | 
			
		||||
    int prn;            /* satellite PRN number */
 | 
			
		||||
    int type;           /* message type */
 | 
			
		||||
@@ -632,13 +662,11 @@ typedef struct {        /* QZSS LEX message type */
 | 
			
		||||
    unsigned char msg[212]; /* LEX message data part 1695 bits */
 | 
			
		||||
} lexmsg_t;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct {        /* QZSS LEX messages type */
 | 
			
		||||
    int n,nmax;         /* number of LEX messages and allocated */
 | 
			
		||||
    lexmsg_t *msgs;     /* LEX messages */
 | 
			
		||||
} lex_t;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct {        /* QZSS LEX ephemeris type */
 | 
			
		||||
    gtime_t toe;        /* epoch time (GPST) */
 | 
			
		||||
    gtime_t tof;        /* message frame time (GPST) */
 | 
			
		||||
@@ -654,7 +682,6 @@ typedef struct {        /* QZSS LEX ephemeris type */
 | 
			
		||||
    double isc[8];      /* ISC */
 | 
			
		||||
} lexeph_t;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct {        /* QZSS LEX ionosphere correction type */
 | 
			
		||||
    gtime_t t0;         /* epoch time (GPST) */
 | 
			
		||||
    double tspan;       /* valid time span (s) */
 | 
			
		||||
@@ -662,7 +689,6 @@ typedef struct {        /* QZSS LEX ionosphere correction type */
 | 
			
		||||
    double coef[3][2];  /* coefficients lat x lon (3 x 2) */
 | 
			
		||||
} lexion_t;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct {        /* stec data type */
 | 
			
		||||
    gtime_t time;       /* time (GPST) */
 | 
			
		||||
    unsigned char sat;  /* satellite number */
 | 
			
		||||
@@ -672,14 +698,12 @@ typedef struct {        /* stec data type */
 | 
			
		||||
    unsigned char flag; /* fix flag */
 | 
			
		||||
} stec_t;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct {        /* trop data type */
 | 
			
		||||
    gtime_t time;       /* time (GPST) */
 | 
			
		||||
    double trp[3];      /* zenith tropos delay/gradient (m) */
 | 
			
		||||
    float std[3];       /* std-dev (m) */
 | 
			
		||||
} trop_t;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct {        /* ppp corrections type */
 | 
			
		||||
    int nsta;           /* number of stations */
 | 
			
		||||
    char stas[MAXSTA][8]; /* station names */
 | 
			
		||||
@@ -690,7 +714,6 @@ typedef struct {        /* ppp corrections type */
 | 
			
		||||
    trop_t *trop[MAXSTA]; /* trop data */
 | 
			
		||||
} pppcorr_t;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct {        /* navigation data type */
 | 
			
		||||
    int n,nmax;         /* number of broadcast ephemeris */
 | 
			
		||||
    int ng,ngmax;       /* number of glonass ephemeris */
 | 
			
		||||
@@ -738,7 +761,6 @@ typedef struct {        /* navigation data type */
 | 
			
		||||
    pppcorr_t pppcorr;  /* ppp corrections */
 | 
			
		||||
} nav_t;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct {        /* station parameter type */
 | 
			
		||||
    char name   [MAXANT]; /* marker name */
 | 
			
		||||
    char marker [MAXANT]; /* marker number */
 | 
			
		||||
@@ -755,7 +777,6 @@ typedef struct {        /* station parameter type */
 | 
			
		||||
    double hgt;         /* antenna height (m) */
 | 
			
		||||
} sta_t;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct {        /* solution type */
 | 
			
		||||
    gtime_t time;       /* time (GPST) */
 | 
			
		||||
    double rr[6];       /* position/velocity (m|m/s) */
 | 
			
		||||
@@ -772,7 +793,6 @@ typedef struct {        /* solution type */
 | 
			
		||||
    float thres;        /* AR ratio threshold for valiation */
 | 
			
		||||
} sol_t;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct {        /* solution buffer type */
 | 
			
		||||
    int n,nmax;         /* number of solution/max number of buffer */
 | 
			
		||||
    int cyclic;         /* cyclic buffer flag */
 | 
			
		||||
@@ -784,7 +804,6 @@ typedef struct {        /* solution buffer type */
 | 
			
		||||
    int nb;             /* number of byte in message buffer */
 | 
			
		||||
} solbuf_t;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct {        /* solution status type */
 | 
			
		||||
    gtime_t time;       /* time (GPST) */
 | 
			
		||||
    unsigned char sat;  /* satellite number */
 | 
			
		||||
@@ -800,13 +819,11 @@ typedef struct {        /* solution status type */
 | 
			
		||||
    unsigned short rejc;  /* reject counter */
 | 
			
		||||
} solstat_t;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct {        /* solution status buffer type */
 | 
			
		||||
    int n,nmax;         /* number of solution/max number of buffer */
 | 
			
		||||
    solstat_t *data;    /* solution status data */
 | 
			
		||||
} solstatbuf_t;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct {        /* RTCM control struct type */
 | 
			
		||||
    int staid;          /* station id */
 | 
			
		||||
    int stah;           /* station health */
 | 
			
		||||
@@ -838,7 +855,6 @@ typedef struct {        /* RTCM control struct type */
 | 
			
		||||
    char opt[256];      /* RTCM dependent options */
 | 
			
		||||
} rtcm_t;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct {        /* download url type */
 | 
			
		||||
    char type[32];      /* data type */
 | 
			
		||||
    char path[1024];    /* url path */
 | 
			
		||||
@@ -846,7 +862,6 @@ typedef struct {        /* download url type */
 | 
			
		||||
    double tint;        /* time interval (s) */
 | 
			
		||||
} url_t;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct {        /* option type */
 | 
			
		||||
    const char *name;   /* option name */
 | 
			
		||||
    int format;         /* option format (0:int,1:double,2:string,3:enum) */
 | 
			
		||||
@@ -854,7 +869,6 @@ typedef struct {        /* option type */
 | 
			
		||||
    const char *comment; /* option comment/enum labels/unit */
 | 
			
		||||
} opt_t;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct {        /* extended receiver error model */
 | 
			
		||||
    int ena[4];         /* model enabled */
 | 
			
		||||
    double cerr[4][NFREQ*2]; /* code errors (m) */
 | 
			
		||||
@@ -863,13 +877,11 @@ typedef struct {        /* extended receiver error model */
 | 
			
		||||
    double gloicb [NFREQ]; /* glonass interchannel bias (m/fn) */
 | 
			
		||||
} exterr_t;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct {        /* SNR mask type */
 | 
			
		||||
    int ena[2];         /* enable flag {rover,base} */
 | 
			
		||||
    double mask[NFREQ][9]; /* mask (dBHz) at 5,10,...85 deg */
 | 
			
		||||
} snrmask_t;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct {        /* processing options type */
 | 
			
		||||
    int mode;           /* positioning mode (PMODE_???) */
 | 
			
		||||
    int soltype;        /* solution type (0:forward,1:backward,2:combined) */
 | 
			
		||||
@@ -932,7 +944,6 @@ typedef struct {        /* processing options type */
 | 
			
		||||
    char pppopt[256];   /* ppp option */
 | 
			
		||||
} prcopt_t;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct {        /* solution options type */
 | 
			
		||||
    int posf;           /* solution format (SOLF_???) */
 | 
			
		||||
    int times;          /* time system (TIMES_???) */
 | 
			
		||||
@@ -955,6 +966,7 @@ typedef struct {        /* solution options type */
 | 
			
		||||
} solopt_t;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct {        /* satellite status type */
 | 
			
		||||
    unsigned char sys;  /* navigation system */
 | 
			
		||||
    unsigned char vs;   /* valid satellite flag single */
 | 
			
		||||
@@ -978,7 +990,6 @@ typedef struct {        /* satellite status type */
 | 
			
		||||
    double  ph[2][NFREQ]; /* previous carrier-phase observable (cycle) */
 | 
			
		||||
} ssat_t;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct {        /* ambiguity control type */
 | 
			
		||||
    gtime_t epoch[4];   /* last epoch */
 | 
			
		||||
    int n[4];           /* number of epochs */
 | 
			
		||||
@@ -988,7 +999,6 @@ typedef struct {        /* ambiguity control type */
 | 
			
		||||
    char flags[MAXSAT]; /* fix flags */
 | 
			
		||||
} ambc_t;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct {        /* RTK control/result type */
 | 
			
		||||
    sol_t  sol;         /* RTK solution */
 | 
			
		||||
    double rb[6];       /* base position/velocity (ecef) (m|m/s) */
 | 
			
		||||
@@ -1004,7 +1014,6 @@ typedef struct {        /* RTK control/result type */
 | 
			
		||||
    prcopt_t opt;       /* processing options */
 | 
			
		||||
} rtk_t;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct half_cyc_tag {  /* half-cycle correction list type */
 | 
			
		||||
    unsigned char sat;  /* satellite number */
 | 
			
		||||
    unsigned char freq; /* frequency number (0:L1,1:L2,2:L5) */
 | 
			
		||||
@@ -1015,23 +1024,21 @@ typedef struct half_cyc_tag {  /* half-cycle correction list type */
 | 
			
		||||
} half_cyc_t;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
const double chisqr[100] = {      /* chi-sqr(n) (alpha=0.001) */
 | 
			
		||||
    10.8, 13.8, 16.3, 18.5, 20.5, 22.5, 24.3, 26.1, 27.9, 29.6,
 | 
			
		||||
    31.3, 32.9, 34.5, 36.1, 37.7, 39.3, 40.8, 42.3, 43.8, 45.3,
 | 
			
		||||
    46.8, 48.3, 49.7, 51.2, 52.6, 54.1, 55.5, 56.9, 58.3, 59.7,
 | 
			
		||||
    61.1, 62.5, 63.9, 65.2, 66.6, 68.0, 69.3, 70.7, 72.1, 73.4,
 | 
			
		||||
    74.7, 76.0, 77.3, 78.6, 80.0, 81.3, 82.6, 84.0, 85.4, 86.7,
 | 
			
		||||
    88.0, 89.3, 90.6, 91.9, 93.3, 94.7, 96.0, 97.4, 98.7, 100 ,
 | 
			
		||||
    101 , 102 , 103 , 104 , 105 , 107 , 108 , 109 , 110 , 112 ,
 | 
			
		||||
    113 , 114 , 115 , 116 , 118 , 119 , 120 , 122 , 123 , 125 ,
 | 
			
		||||
    126 , 127 , 128 , 129 , 131 , 132 , 133 , 134 , 135 , 137 ,
 | 
			
		||||
    138 , 139 , 140 , 142 , 143 , 144 , 145 , 147 , 148 , 149
 | 
			
		||||
const double chisqr[100]={      /* chi-sqr(n) (alpha=0.001) */
 | 
			
		||||
    10.8,13.8,16.3,18.5,20.5,22.5,24.3,26.1,27.9,29.6,
 | 
			
		||||
    31.3,32.9,34.5,36.1,37.7,39.3,40.8,42.3,43.8,45.3,
 | 
			
		||||
    46.8,48.3,49.7,51.2,52.6,54.1,55.5,56.9,58.3,59.7,
 | 
			
		||||
    61.1,62.5,63.9,65.2,66.6,68.0,69.3,70.7,72.1,73.4,
 | 
			
		||||
    74.7,76.0,77.3,78.6,80.0,81.3,82.6,84.0,85.4,86.7,
 | 
			
		||||
    88.0,89.3,90.6,91.9,93.3,94.7,96.0,97.4,98.7,100 ,
 | 
			
		||||
    101 ,102 ,103 ,104 ,105 ,107 ,108 ,109 ,110 ,112 ,
 | 
			
		||||
    113 ,114 ,115 ,116 ,118 ,119 ,120 ,122 ,123 ,125 ,
 | 
			
		||||
    126 ,127 ,128 ,129 ,131 ,132 ,133 ,134 ,135 ,137 ,
 | 
			
		||||
    138 ,139 ,140 ,142 ,143 ,144 ,145 ,147 ,148 ,149
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
const double lam_carr[MAXFREQ] = { /* carrier wave length (m) */
 | 
			
		||||
    SPEED_OF_LIGHT / FREQ1, SPEED_OF_LIGHT / FREQ2, SPEED_OF_LIGHT / FREQ5, SPEED_OF_LIGHT / FREQ6, SPEED_OF_LIGHT / FREQ7,
 | 
			
		||||
    SPEED_OF_LIGHT / FREQ8, SPEED_OF_LIGHT / FREQ9
 | 
			
		||||
const double lam_carr[MAXFREQ]={ /* carrier wave length (m) */
 | 
			
		||||
    CLIGHT/FREQ1,CLIGHT/FREQ2,CLIGHT/FREQ5,CLIGHT/FREQ6,CLIGHT/FREQ7,
 | 
			
		||||
    CLIGHT/FREQ8,CLIGHT/FREQ9
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
@@ -53,162 +53,158 @@
 | 
			
		||||
obsd_t obs_to_rtklib(Gnss_Synchro gnss_synchro, int week)
 | 
			
		||||
{
 | 
			
		||||
    obsd_t rtklib_obs;
 | 
			
		||||
    rtklib_obs.D[0] = gnss_synchro.Carrier_Doppler_hz;
 | 
			
		||||
    rtklib_obs.P[0] = gnss_synchro.Pseudorange_m;
 | 
			
		||||
    rtklib_obs.L[0] = gnss_synchro.Carrier_phase_rads;//todo: check units
 | 
			
		||||
    //rtklib_obs.SNR = gnss_synchro.CN0_dB_hz;
 | 
			
		||||
    rtklib_obs.sat = gnss_synchro.PRN;
 | 
			
		||||
    rtklib_obs.time = gpst2time(adjgpsweek(week),gnss_synchro.RX_time);
 | 
			
		||||
    rtklib_obs.D[0]=gnss_synchro.Carrier_Doppler_hz;
 | 
			
		||||
    rtklib_obs.P[0]=gnss_synchro.Pseudorange_m;
 | 
			
		||||
    rtklib_obs.L[0]=gnss_synchro.Carrier_phase_rads;//todo: check units
 | 
			
		||||
    //rtklib_obs.SNR=gnss_synchro.CN0_dB_hz;
 | 
			
		||||
    rtklib_obs.sat=gnss_synchro.PRN;
 | 
			
		||||
    rtklib_obs.time=gpst2time(adjgpsweek(week),gnss_synchro.RX_time);
 | 
			
		||||
    //printf("OBS RX TIME [%i]: %s,%f\n\r",rtklib_obs.sat,time_str(rtklib_obs.time,3),rtklib_obs.time.sec);
 | 
			
		||||
    return rtklib_obs;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
eph_t eph_to_rtklib(Galileo_Ephemeris gal_eph)
 | 
			
		||||
{
 | 
			
		||||
    eph_t rtklib_sat;
 | 
			
		||||
    rtklib_sat.sat = gal_eph.i_satellite_PRN;
 | 
			
		||||
    rtklib_sat.A = gal_eph.A_1*gal_eph.A_1;
 | 
			
		||||
    rtklib_sat.M0 = gal_eph.M0_1;
 | 
			
		||||
    rtklib_sat.deln = gal_eph.delta_n_3;
 | 
			
		||||
    rtklib_sat.OMG0 = gal_eph.OMEGA_0_2;
 | 
			
		||||
    rtklib_sat.OMGd = gal_eph.OMEGA_dot_3;
 | 
			
		||||
    rtklib_sat.omg = gal_eph.omega_2;
 | 
			
		||||
    rtklib_sat.i0 = gal_eph.i_0_2;
 | 
			
		||||
    rtklib_sat.idot = gal_eph.iDot_2;
 | 
			
		||||
    rtklib_sat.e = gal_eph.e_1;
 | 
			
		||||
    rtklib_sat.Adot = 0; //only in CNAV;
 | 
			
		||||
    rtklib_sat.ndot = 0; //only in CNAV;
 | 
			
		||||
    rtklib_sat.A=gal_eph.A_1*gal_eph.A_1;
 | 
			
		||||
    rtklib_sat.M0=gal_eph.M0_1;
 | 
			
		||||
    rtklib_sat.deln=gal_eph.delta_n_3;
 | 
			
		||||
    rtklib_sat.OMG0=gal_eph.OMEGA_0_2;
 | 
			
		||||
    rtklib_sat.OMGd=gal_eph.OMEGA_dot_3;
 | 
			
		||||
    rtklib_sat.omg=gal_eph.omega_2;
 | 
			
		||||
    rtklib_sat.i0=gal_eph.i_0_2;
 | 
			
		||||
    rtklib_sat.idot=gal_eph.iDot_2;
 | 
			
		||||
    rtklib_sat.e=gal_eph.e_1;
 | 
			
		||||
    rtklib_sat.Adot=0; //only in CNAV;
 | 
			
		||||
    rtklib_sat.ndot=0; //only in CNAV;
 | 
			
		||||
 | 
			
		||||
    rtklib_sat.week = adjgpsweek(gal_eph.WN_5); /* week of tow */
 | 
			
		||||
    rtklib_sat.cic = gal_eph.C_ic_4;
 | 
			
		||||
    rtklib_sat.cis = gal_eph.C_is_4;
 | 
			
		||||
    rtklib_sat.cuc = gal_eph.C_uc_3;
 | 
			
		||||
    rtklib_sat.cus = gal_eph.C_us_3;
 | 
			
		||||
    rtklib_sat.crc = gal_eph.C_rc_3;
 | 
			
		||||
    rtklib_sat.crs = gal_eph.C_rs_3;
 | 
			
		||||
    rtklib_sat.f0 = gal_eph.af0_4;
 | 
			
		||||
    rtklib_sat.f1 = gal_eph.af1_4;
 | 
			
		||||
    rtklib_sat.f2 = gal_eph.af2_4;
 | 
			
		||||
    rtklib_sat.tgd[0] = 0;
 | 
			
		||||
    rtklib_sat.tgd[1] = 0;
 | 
			
		||||
    rtklib_sat.tgd[2] = 0;
 | 
			
		||||
    rtklib_sat.tgd[3] = 0;
 | 
			
		||||
    rtklib_sat.toes = gal_eph.t0e_1;
 | 
			
		||||
    rtklib_sat.toc = gpst2time(rtklib_sat.week,gal_eph.t0c_4);
 | 
			
		||||
    rtklib_sat.ttr = gpst2time(rtklib_sat.week,gal_eph.TOW_5);
 | 
			
		||||
    rtklib_sat.week=adjgpsweek(gal_eph.WN_5); /* week of tow */
 | 
			
		||||
    rtklib_sat.cic=gal_eph.C_ic_4;
 | 
			
		||||
    rtklib_sat.cis=gal_eph.C_is_4;
 | 
			
		||||
    rtklib_sat.cuc=gal_eph.C_uc_3;
 | 
			
		||||
    rtklib_sat.cus=gal_eph.C_us_3;
 | 
			
		||||
    rtklib_sat.crc=gal_eph.C_rc_3;
 | 
			
		||||
    rtklib_sat.crs=gal_eph.C_rs_3;
 | 
			
		||||
    rtklib_sat.f0=gal_eph.af0_4;
 | 
			
		||||
    rtklib_sat.f1=gal_eph.af1_4;
 | 
			
		||||
    rtklib_sat.f2=gal_eph.af2_4;
 | 
			
		||||
    rtklib_sat.tgd[0]=0;
 | 
			
		||||
    rtklib_sat.tgd[1]=0;
 | 
			
		||||
    rtklib_sat.tgd[2]=0;
 | 
			
		||||
    rtklib_sat.tgd[3]=0;
 | 
			
		||||
    rtklib_sat.toes=gal_eph.t0e_1;
 | 
			
		||||
    rtklib_sat.toc=gpst2time(rtklib_sat.week,gal_eph.t0c_4);
 | 
			
		||||
    rtklib_sat.ttr=gpst2time(rtklib_sat.week,gal_eph.TOW_5);
 | 
			
		||||
 | 
			
		||||
    /* adjustment for week handover */
 | 
			
		||||
    double tow, toc;
 | 
			
		||||
    tow = time2gpst(rtklib_sat.ttr,&rtklib_sat.week);
 | 
			
		||||
    toc = time2gpst(rtklib_sat.toc,NULL);
 | 
			
		||||
    tow=time2gpst(rtklib_sat.ttr,&rtklib_sat.week);
 | 
			
		||||
    toc=time2gpst(rtklib_sat.toc,NULL);
 | 
			
		||||
    if      (rtklib_sat.toes<tow-302400.0) {rtklib_sat.week++; tow-=604800.0;}
 | 
			
		||||
    else if (rtklib_sat.toes>tow+302400.0) {rtklib_sat.week--; tow+=604800.0;}
 | 
			
		||||
    rtklib_sat.toe = gpst2time(rtklib_sat.week,rtklib_sat.toes);
 | 
			
		||||
    rtklib_sat.toc = gpst2time(rtklib_sat.week,toc);
 | 
			
		||||
    rtklib_sat.ttr = gpst2time(rtklib_sat.week,tow);
 | 
			
		||||
    rtklib_sat.toe=gpst2time(rtklib_sat.week,rtklib_sat.toes);
 | 
			
		||||
    rtklib_sat.toc=gpst2time(rtklib_sat.week,toc);
 | 
			
		||||
    rtklib_sat.ttr=gpst2time(rtklib_sat.week,tow);
 | 
			
		||||
 | 
			
		||||
    return rtklib_sat;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
eph_t eph_to_rtklib(Gps_Ephemeris gps_eph)
 | 
			
		||||
{
 | 
			
		||||
    eph_t rtklib_sat;
 | 
			
		||||
    rtklib_sat.sat = gps_eph.i_satellite_PRN;
 | 
			
		||||
    rtklib_sat.A = gps_eph.d_sqrt_A*gps_eph.d_sqrt_A;
 | 
			
		||||
    rtklib_sat.M0 = gps_eph.d_M_0;
 | 
			
		||||
    rtklib_sat.deln = gps_eph.d_Delta_n;
 | 
			
		||||
    rtklib_sat.OMG0 = gps_eph.d_OMEGA0;
 | 
			
		||||
    rtklib_sat.OMGd = gps_eph.d_OMEGA_DOT;
 | 
			
		||||
    rtklib_sat.omg = gps_eph.d_OMEGA;
 | 
			
		||||
    rtklib_sat.i0 = gps_eph.d_i_0;
 | 
			
		||||
    rtklib_sat.idot = gps_eph.d_IDOT;
 | 
			
		||||
    rtklib_sat.e = gps_eph.d_e_eccentricity;
 | 
			
		||||
    rtklib_sat.Adot = 0; //only in CNAV;
 | 
			
		||||
    rtklib_sat.ndot = 0; //only in CNAV;
 | 
			
		||||
    rtklib_sat.A=gps_eph.d_sqrt_A*gps_eph.d_sqrt_A;
 | 
			
		||||
    rtklib_sat.M0=gps_eph.d_M_0;
 | 
			
		||||
    rtklib_sat.deln=gps_eph.d_Delta_n;
 | 
			
		||||
    rtklib_sat.OMG0=gps_eph.d_OMEGA0;
 | 
			
		||||
    rtklib_sat.OMGd=gps_eph.d_OMEGA_DOT;
 | 
			
		||||
    rtklib_sat.omg=gps_eph.d_OMEGA;
 | 
			
		||||
    rtklib_sat.i0=gps_eph.d_i_0;
 | 
			
		||||
    rtklib_sat.idot=gps_eph.d_IDOT;
 | 
			
		||||
    rtklib_sat.e=gps_eph.d_e_eccentricity;
 | 
			
		||||
    rtklib_sat.Adot=0; //only in CNAV;
 | 
			
		||||
    rtklib_sat.ndot=0; //only in CNAV;
 | 
			
		||||
 | 
			
		||||
    rtklib_sat.week = adjgpsweek(gps_eph.i_GPS_week); /* week of tow */
 | 
			
		||||
    rtklib_sat.cic = gps_eph.d_Cic;
 | 
			
		||||
    rtklib_sat.cis = gps_eph.d_Cis;
 | 
			
		||||
    rtklib_sat.cuc = gps_eph.d_Cuc;
 | 
			
		||||
    rtklib_sat.cus = gps_eph.d_Cus;
 | 
			
		||||
    rtklib_sat.crc = gps_eph.d_Crc;
 | 
			
		||||
    rtklib_sat.crs = gps_eph.d_Crs;
 | 
			
		||||
    rtklib_sat.f0 = gps_eph.d_A_f0;
 | 
			
		||||
    rtklib_sat.f1 = gps_eph.d_A_f1;
 | 
			
		||||
    rtklib_sat.f2 = gps_eph.d_A_f2;
 | 
			
		||||
    rtklib_sat.tgd[0] = gps_eph.d_TGD;
 | 
			
		||||
    rtklib_sat.tgd[1] = 0;
 | 
			
		||||
    rtklib_sat.tgd[2] = 0;
 | 
			
		||||
    rtklib_sat.tgd[3] = 0;
 | 
			
		||||
    rtklib_sat.toes = gps_eph.d_Toe;
 | 
			
		||||
    rtklib_sat.toc = gpst2time(rtklib_sat.week,gps_eph.d_Toc);
 | 
			
		||||
    rtklib_sat.ttr = gpst2time(rtklib_sat.week,gps_eph.d_TOW);
 | 
			
		||||
    rtklib_sat.week=adjgpsweek(gps_eph.i_GPS_week); /* week of tow */
 | 
			
		||||
    rtklib_sat.cic=gps_eph.d_Cic;
 | 
			
		||||
    rtklib_sat.cis=gps_eph.d_Cis;
 | 
			
		||||
    rtklib_sat.cuc=gps_eph.d_Cuc;
 | 
			
		||||
    rtklib_sat.cus=gps_eph.d_Cus;
 | 
			
		||||
    rtklib_sat.crc=gps_eph.d_Crc;
 | 
			
		||||
    rtklib_sat.crs=gps_eph.d_Crs;
 | 
			
		||||
    rtklib_sat.f0=gps_eph.d_A_f0;
 | 
			
		||||
    rtklib_sat.f1=gps_eph.d_A_f1;
 | 
			
		||||
    rtklib_sat.f2=gps_eph.d_A_f2;
 | 
			
		||||
    rtklib_sat.tgd[0]=gps_eph.d_TGD;
 | 
			
		||||
    rtklib_sat.tgd[1]=0;
 | 
			
		||||
    rtklib_sat.tgd[2]=0;
 | 
			
		||||
    rtklib_sat.tgd[3]=0;
 | 
			
		||||
    rtklib_sat.toes=gps_eph.d_Toe;
 | 
			
		||||
    rtklib_sat.toc=gpst2time(rtklib_sat.week,gps_eph.d_Toc);
 | 
			
		||||
    rtklib_sat.ttr=gpst2time(rtklib_sat.week,gps_eph.d_TOW);
 | 
			
		||||
 | 
			
		||||
    /* adjustment for week handover */
 | 
			
		||||
    double tow, toc;
 | 
			
		||||
    tow = time2gpst(rtklib_sat.ttr,&rtklib_sat.week);
 | 
			
		||||
    toc = time2gpst(rtklib_sat.toc,NULL);
 | 
			
		||||
    tow=time2gpst(rtklib_sat.ttr,&rtklib_sat.week);
 | 
			
		||||
    toc=time2gpst(rtklib_sat.toc,NULL);
 | 
			
		||||
    if      (rtklib_sat.toes<tow-302400.0) {rtklib_sat.week++; tow-=604800.0;}
 | 
			
		||||
    else if (rtklib_sat.toes>tow+302400.0) {rtklib_sat.week--; tow+=604800.0;}
 | 
			
		||||
    rtklib_sat.toe = gpst2time(rtklib_sat.week,rtklib_sat.toes);
 | 
			
		||||
    rtklib_sat.toc = gpst2time(rtklib_sat.week,toc);
 | 
			
		||||
    rtklib_sat.ttr = gpst2time(rtklib_sat.week,tow);
 | 
			
		||||
    rtklib_sat.toe=gpst2time(rtklib_sat.week,rtklib_sat.toes);
 | 
			
		||||
    rtklib_sat.toc=gpst2time(rtklib_sat.week,toc);
 | 
			
		||||
    rtklib_sat.ttr=gpst2time(rtklib_sat.week,tow);
 | 
			
		||||
 | 
			
		||||
    //printf("EPHEMERIS TIME [%i]: %s,%f\n\r",rtklib_sat.sat,time_str(rtklib_sat.toe,3),rtklib_sat.toe.sec);
 | 
			
		||||
 | 
			
		||||
    return rtklib_sat;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
eph_t eph_to_rtklib(Gps_CNAV_Ephemeris gps_cnav_eph)
 | 
			
		||||
{
 | 
			
		||||
    eph_t rtklib_sat;
 | 
			
		||||
    rtklib_sat.sat = gps_cnav_eph.i_satellite_PRN;
 | 
			
		||||
    const double A_REF = 26559710.0; // See IS-GPS-200H,  pp. 170
 | 
			
		||||
    rtklib_sat.A = A_REF + gps_cnav_eph.d_DELTA_A;
 | 
			
		||||
    rtklib_sat.M0 = gps_cnav_eph.d_M_0;
 | 
			
		||||
    rtklib_sat.deln = gps_cnav_eph.d_Delta_n;
 | 
			
		||||
    rtklib_sat.OMG0 = gps_cnav_eph.d_OMEGA0;
 | 
			
		||||
    rtklib_sat.A=A_REF + gps_cnav_eph.d_DELTA_A;
 | 
			
		||||
    rtklib_sat.M0=gps_cnav_eph.d_M_0;
 | 
			
		||||
    rtklib_sat.deln=gps_cnav_eph.d_Delta_n;
 | 
			
		||||
    rtklib_sat.OMG0=gps_cnav_eph.d_OMEGA0;
 | 
			
		||||
    // Compute the angle between the ascending node and the Greenwich meridian
 | 
			
		||||
    const double OMEGA_DOT_REF = -2.6e-9; // semicircles / s, see IS-GPS-200H pp. 164
 | 
			
		||||
    double d_OMEGA_DOT = OMEGA_DOT_REF*GPS_L2_PI + gps_cnav_eph.d_DELTA_OMEGA_DOT;
 | 
			
		||||
    rtklib_sat.OMGd = d_OMEGA_DOT;
 | 
			
		||||
    rtklib_sat.omg = gps_cnav_eph.d_OMEGA;
 | 
			
		||||
    rtklib_sat.i0 = gps_cnav_eph.d_i_0;
 | 
			
		||||
    rtklib_sat.idot = gps_cnav_eph.d_IDOT;
 | 
			
		||||
    rtklib_sat.e = gps_cnav_eph.d_e_eccentricity;
 | 
			
		||||
    rtklib_sat.Adot = gps_cnav_eph.d_A_DOT; //only in CNAV;
 | 
			
		||||
    rtklib_sat.ndot = gps_cnav_eph.d_DELTA_DOT_N; //only in CNAV;
 | 
			
		||||
    rtklib_sat.OMGd=d_OMEGA_DOT;
 | 
			
		||||
    rtklib_sat.omg=gps_cnav_eph.d_OMEGA;
 | 
			
		||||
    rtklib_sat.i0=gps_cnav_eph.d_i_0;
 | 
			
		||||
    rtklib_sat.idot=gps_cnav_eph.d_IDOT;
 | 
			
		||||
    rtklib_sat.e=gps_cnav_eph.d_e_eccentricity;
 | 
			
		||||
    rtklib_sat.Adot=gps_cnav_eph.d_A_DOT; //only in CNAV;
 | 
			
		||||
    rtklib_sat.ndot=gps_cnav_eph.d_DELTA_DOT_N; //only in CNAV;
 | 
			
		||||
 | 
			
		||||
    rtklib_sat.week = adjgpsweek(gps_cnav_eph.i_GPS_week); /* week of tow */
 | 
			
		||||
    rtklib_sat.cic = gps_cnav_eph.d_Cic;
 | 
			
		||||
    rtklib_sat.cis = gps_cnav_eph.d_Cis;
 | 
			
		||||
    rtklib_sat.cuc = gps_cnav_eph.d_Cuc;
 | 
			
		||||
    rtklib_sat.cus = gps_cnav_eph.d_Cus;
 | 
			
		||||
    rtklib_sat.crc = gps_cnav_eph.d_Crc;
 | 
			
		||||
    rtklib_sat.crs = gps_cnav_eph.d_Crs;
 | 
			
		||||
    rtklib_sat.f0 = gps_cnav_eph.d_A_f0;
 | 
			
		||||
    rtklib_sat.f1 = gps_cnav_eph.d_A_f1;
 | 
			
		||||
    rtklib_sat.f2 = gps_cnav_eph.d_A_f2;
 | 
			
		||||
    rtklib_sat.tgd[0] = gps_cnav_eph.d_TGD;
 | 
			
		||||
    rtklib_sat.tgd[1] = 0;
 | 
			
		||||
    rtklib_sat.tgd[2] = 0;
 | 
			
		||||
    rtklib_sat.tgd[3] = 0;
 | 
			
		||||
    rtklib_sat.toes = gps_cnav_eph.d_Toe1;
 | 
			
		||||
    rtklib_sat.toc = gpst2time(rtklib_sat.week,gps_cnav_eph.d_Toc);
 | 
			
		||||
    rtklib_sat.ttr = gpst2time(rtklib_sat.week,gps_cnav_eph.d_TOW);
 | 
			
		||||
    rtklib_sat.week=adjgpsweek(gps_cnav_eph.i_GPS_week); /* week of tow */
 | 
			
		||||
    rtklib_sat.cic=gps_cnav_eph.d_Cic;
 | 
			
		||||
    rtklib_sat.cis=gps_cnav_eph.d_Cis;
 | 
			
		||||
    rtklib_sat.cuc=gps_cnav_eph.d_Cuc;
 | 
			
		||||
    rtklib_sat.cus=gps_cnav_eph.d_Cus;
 | 
			
		||||
    rtklib_sat.crc=gps_cnav_eph.d_Crc;
 | 
			
		||||
    rtklib_sat.crs=gps_cnav_eph.d_Crs;
 | 
			
		||||
    rtklib_sat.f0=gps_cnav_eph.d_A_f0;
 | 
			
		||||
    rtklib_sat.f1=gps_cnav_eph.d_A_f1;
 | 
			
		||||
    rtklib_sat.f2=gps_cnav_eph.d_A_f2;
 | 
			
		||||
    rtklib_sat.tgd[0]=gps_cnav_eph.d_TGD;
 | 
			
		||||
    rtklib_sat.tgd[1]=0;
 | 
			
		||||
    rtklib_sat.tgd[2]=0;
 | 
			
		||||
    rtklib_sat.tgd[3]=0;
 | 
			
		||||
    rtklib_sat.toes=gps_cnav_eph.d_Toe1;
 | 
			
		||||
    rtklib_sat.toc=gpst2time(rtklib_sat.week,gps_cnav_eph.d_Toc);
 | 
			
		||||
    rtklib_sat.ttr=gpst2time(rtklib_sat.week,gps_cnav_eph.d_TOW);
 | 
			
		||||
 | 
			
		||||
    /* adjustment for week handover */
 | 
			
		||||
    double tow, toc;
 | 
			
		||||
    tow = time2gpst(rtklib_sat.ttr,&rtklib_sat.week);
 | 
			
		||||
    toc = time2gpst(rtklib_sat.toc,NULL);
 | 
			
		||||
    tow=time2gpst(rtklib_sat.ttr,&rtklib_sat.week);
 | 
			
		||||
    toc=time2gpst(rtklib_sat.toc,NULL);
 | 
			
		||||
    if      (rtklib_sat.toes<tow-302400.0) {rtklib_sat.week++; tow-=604800.0;}
 | 
			
		||||
    else if (rtklib_sat.toes>tow+302400.0) {rtklib_sat.week--; tow+=604800.0;}
 | 
			
		||||
    rtklib_sat.toe = gpst2time(rtklib_sat.week,rtklib_sat.toes);
 | 
			
		||||
    rtklib_sat.toc = gpst2time(rtklib_sat.week,toc);
 | 
			
		||||
    rtklib_sat.ttr = gpst2time(rtklib_sat.week,tow);
 | 
			
		||||
    rtklib_sat.toe=gpst2time(rtklib_sat.week,rtklib_sat.toes);
 | 
			
		||||
    rtklib_sat.toc=gpst2time(rtklib_sat.week,toc);
 | 
			
		||||
    rtklib_sat.ttr=gpst2time(rtklib_sat.week,tow);
 | 
			
		||||
 | 
			
		||||
    return rtklib_sat;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -47,10 +47,8 @@
 | 
			
		||||
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifndef GNSS_SDR_RTKLIB_CONVERSIONS_H_
 | 
			
		||||
#define GNSS_SDR_RTKLIB_CONVERSIONS_H_
 | 
			
		||||
#ifndef SRC_ALGORITHMS_PVT_LIBS_RTKLIB_CONVERSIONS_H_
 | 
			
		||||
#define SRC_ALGORITHMS_PVT_LIBS_RTKLIB_CONVERSIONS_H_
 | 
			
		||||
 | 
			
		||||
#include "rtklib_rtkcmn.h"
 | 
			
		||||
#include "gnss_synchro.h"
 | 
			
		||||
@@ -64,4 +62,4 @@ eph_t eph_to_rtklib(Gps_CNAV_Ephemeris gps_cnav_eph);
 | 
			
		||||
 | 
			
		||||
obsd_t obs_to_rtklib(Gnss_Synchro gnss_synchro, int week);
 | 
			
		||||
 | 
			
		||||
#endif /* GNSS_SDR_RTKLIB_CONVERSIONS_H_ */
 | 
			
		||||
#endif /* SRC_ALGORITHMS_PVT_LIBS_RTKLIB_CONVERSIONS_H_ */
 | 
			
		||||
 
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -47,12 +47,38 @@
 | 
			
		||||
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 *
 | 
			
		||||
 *-----------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
* history : 2010/07/28 1.1  moved from rtkcmn.c
 | 
			
		||||
*                           added api:
 | 
			
		||||
*                               eph2clk(),geph2clk(),seph2clk(),satantoff()
 | 
			
		||||
*                               satposs()
 | 
			
		||||
*                           changed api:
 | 
			
		||||
*                               eph2pos(),geph2pos(),satpos()
 | 
			
		||||
*                           deleted api:
 | 
			
		||||
*                               satposv(),satposiode()
 | 
			
		||||
*           2010/08/26 1.2  add ephemeris option EPHOPT_LEX
 | 
			
		||||
*           2010/09/09 1.3  fix problem when precise clock outage
 | 
			
		||||
*           2011/01/12 1.4  add api alm2pos()
 | 
			
		||||
*                           change api satpos(),satposs()
 | 
			
		||||
*                           enable valid unhealthy satellites and output status
 | 
			
		||||
*                           fix bug on exception by glonass ephem computation
 | 
			
		||||
*           2013/01/10 1.5  support beidou (compass)
 | 
			
		||||
*                           use newton's method to solve kepler eq.
 | 
			
		||||
*                           update ssr correction algorithm
 | 
			
		||||
*           2013/03/20 1.6  fix problem on ssr clock relativitic correction
 | 
			
		||||
*           2013/09/01 1.7  support negative pseudorange
 | 
			
		||||
*                           fix bug on variance in case of ura ssr = 63
 | 
			
		||||
*           2013/11/11 1.8  change constant MAXAGESSR 70.0 -> 90.0
 | 
			
		||||
*           2014/10/24 1.9  fix bug on return of var_uraeph() if ura<0||15<ura
 | 
			
		||||
*           2014/12/07 1.10 modify MAXDTOE for qzss,gal and bds
 | 
			
		||||
*                           test max number of iteration for Kepler
 | 
			
		||||
*           2015/08/26 1.11 update RTOL_ELPLER 1E-14 -> 1E-13
 | 
			
		||||
*                           set MAX_ITER_KEPLER for alm2pos()
 | 
			
		||||
*-----------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifndef GNSS_SDR_RTKLIB_EPHEMERIS_H_
 | 
			
		||||
#define GNSS_SDR_RTKLIB_EPHEMERIS_H_
 | 
			
		||||
#ifndef RTKLIB_EPHEMERIS_H_
 | 
			
		||||
#define RTKLIB_EPHEMERIS_H_
 | 
			
		||||
 | 
			
		||||
#include "rtklib.h"
 | 
			
		||||
#include "rtklib_rtkcmn.h"
 | 
			
		||||
@@ -96,4 +122,4 @@ void satposs(gtime_t teph, const obsd_t *obs, int n, const nav_t *nav,
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif /* GNSS_SDR_RTKLIB_EPHEMERIS_H_ */
 | 
			
		||||
#endif /* RTKLIB_EPHEMERIS_H_ */
 | 
			
		||||
 
 | 
			
		||||
@@ -55,536 +55,462 @@
 | 
			
		||||
*         Maps based on GPS Carrier Phase Data Routinely producted by CODE
 | 
			
		||||
*         Analysis Center, Proceeding of the IGS Analysis Center Workshop, 1996
 | 
			
		||||
*
 | 
			
		||||
* version : $Revision:$ $Date:$
 | 
			
		||||
* history : 2011/03/29 1.0 new
 | 
			
		||||
*           2013/03/05 1.1 change api readtec()
 | 
			
		||||
*                          fix problem in case of lat>85deg or lat<-85deg
 | 
			
		||||
*           2014/02/22 1.2 fix problem on compiled as C++
 | 
			
		||||
*-----------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
#include "rtklib_ionex.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* get index -----------------------------------------------------------------*/
 | 
			
		||||
int getindex(double value, const double *range)
 | 
			
		||||
{
 | 
			
		||||
    if (range[2] == 0.0) return 0;
 | 
			
		||||
    if (range[1] > 0.0 && (value < range[0] || range[1]<value)) return -1;
 | 
			
		||||
    if (range[1] < 0.0 && (value < range[1] || range[0]<value)) return -1;
 | 
			
		||||
    return (int)floor((value - range[0]) / range[2] + 0.5);
 | 
			
		||||
    if (range[2]==0.0) return 0;
 | 
			
		||||
    if (range[1]>0.0&&(value<range[0]||range[1]<value)) return -1;
 | 
			
		||||
    if (range[1]<0.0&&(value<range[1]||range[0]<value)) return -1;
 | 
			
		||||
    return (int)floor((value-range[0])/range[2]+0.5);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* get number of items -------------------------------------------------------*/
 | 
			
		||||
int nitem(const double *range)
 | 
			
		||||
{
 | 
			
		||||
    return getindex(range[1], range) + 1;
 | 
			
		||||
    return getindex(range[1],range)+1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* data index (i:lat,j:lon,k:hgt) --------------------------------------------*/
 | 
			
		||||
int dataindex(int i, int j, int k, const int *ndata)
 | 
			
		||||
{
 | 
			
		||||
    if (i < 0 || ndata[0] <= i || j < 0 || ndata[1] <= j || k < 0 || ndata[2] <= k) return -1;
 | 
			
		||||
    return i + ndata[0] * (j + ndata[1] * k);
 | 
			
		||||
    if (i<0||ndata[0]<=i||j<0||ndata[1]<=j||k<0||ndata[2]<=k) return -1;
 | 
			
		||||
    return i+ndata[0]*(j+ndata[1]*k);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* add tec data to navigation data -------------------------------------------*/
 | 
			
		||||
tec_t *addtec(const double *lats, const double *lons, const double *hgts,
 | 
			
		||||
        double rb, nav_t *nav)
 | 
			
		||||
                     double rb, nav_t *nav)
 | 
			
		||||
{
 | 
			
		||||
    tec_t *p, *nav_tec;
 | 
			
		||||
    gtime_t time0 = {};
 | 
			
		||||
    int i, n, ndata[3];
 | 
			
		||||
 | 
			
		||||
    trace(3, "addtec  :\n");
 | 
			
		||||
 | 
			
		||||
    ndata[0] = nitem(lats);
 | 
			
		||||
    ndata[1] = nitem(lons);
 | 
			
		||||
    ndata[2] = nitem(hgts);
 | 
			
		||||
    if (ndata[0] <= 1 || ndata[1] <= 1 || ndata[2] <= 0) return NULL;
 | 
			
		||||
 | 
			
		||||
    if (nav->nt >= nav->ntmax)
 | 
			
		||||
        {
 | 
			
		||||
            nav->ntmax+=256;
 | 
			
		||||
            if (!(nav_tec = (tec_t *)realloc(nav->tec, sizeof(tec_t)*nav->ntmax)))
 | 
			
		||||
                {
 | 
			
		||||
                    trace(1, "readionex malloc error ntmax=%d\n", nav->ntmax);
 | 
			
		||||
                    free(nav->tec); nav->tec = NULL; nav->nt = nav->ntmax = 0;
 | 
			
		||||
                    return NULL;
 | 
			
		||||
                }
 | 
			
		||||
            nav->tec = nav_tec;
 | 
			
		||||
        }
 | 
			
		||||
    p = nav->tec+nav->nt;
 | 
			
		||||
    p->time = time0;
 | 
			
		||||
    p->rb = rb;
 | 
			
		||||
    for (i = 0; i < 3; i++)
 | 
			
		||||
        {
 | 
			
		||||
            p->ndata[i] = ndata[i];
 | 
			
		||||
            p->lats[i] = lats[i];
 | 
			
		||||
            p->lons[i] = lons[i];
 | 
			
		||||
            p->hgts[i] = hgts[i];
 | 
			
		||||
        }
 | 
			
		||||
    n = ndata[0] * ndata[1] * ndata[2];
 | 
			
		||||
 | 
			
		||||
    if (!(p->data = (double *)malloc(sizeof(double) * n)) ||
 | 
			
		||||
            !(p->rms  = (float *)malloc(sizeof(float ) * n)))
 | 
			
		||||
        {
 | 
			
		||||
    tec_t *p,*nav_tec;
 | 
			
		||||
    gtime_t time0={};
 | 
			
		||||
    int i,n,ndata[3];
 | 
			
		||||
    
 | 
			
		||||
    trace(3,"addtec  :\n");
 | 
			
		||||
    
 | 
			
		||||
    ndata[0]=nitem(lats);
 | 
			
		||||
    ndata[1]=nitem(lons);
 | 
			
		||||
    ndata[2]=nitem(hgts);
 | 
			
		||||
    if (ndata[0]<=1||ndata[1]<=1||ndata[2]<=0) return NULL;
 | 
			
		||||
    
 | 
			
		||||
    if (nav->nt>=nav->ntmax) {
 | 
			
		||||
        nav->ntmax+=256;
 | 
			
		||||
        if (!(nav_tec=(tec_t *)realloc(nav->tec,sizeof(tec_t)*nav->ntmax))) {
 | 
			
		||||
            trace(1,"readionex malloc error ntmax=%d\n",nav->ntmax);
 | 
			
		||||
            free(nav->tec); nav->tec=NULL; nav->nt=nav->ntmax=0;
 | 
			
		||||
            return NULL;
 | 
			
		||||
        }
 | 
			
		||||
    for (i = 0; i < n; i++)
 | 
			
		||||
        {
 | 
			
		||||
            p->data[i] = 0.0;
 | 
			
		||||
            p->rms [i] = 0.0f;
 | 
			
		||||
        }
 | 
			
		||||
        nav->tec=nav_tec;
 | 
			
		||||
    }
 | 
			
		||||
    p=nav->tec+nav->nt;
 | 
			
		||||
    p->time=time0;
 | 
			
		||||
    p->rb=rb;
 | 
			
		||||
    for (i=0;i<3;i++) {
 | 
			
		||||
        p->ndata[i]=ndata[i];
 | 
			
		||||
        p->lats[i]=lats[i];
 | 
			
		||||
        p->lons[i]=lons[i];
 | 
			
		||||
        p->hgts[i]=hgts[i];
 | 
			
		||||
    }
 | 
			
		||||
    n=ndata[0]*ndata[1]*ndata[2];
 | 
			
		||||
    
 | 
			
		||||
    if (!(p->data=(double *)malloc(sizeof(double)*n))||
 | 
			
		||||
        !(p->rms =(float  *)malloc(sizeof(float )*n))) {
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
    for (i=0;i<n;i++) {
 | 
			
		||||
        p->data[i]=0.0;
 | 
			
		||||
        p->rms [i]=0.0f;
 | 
			
		||||
    }
 | 
			
		||||
    nav->nt++;
 | 
			
		||||
    return p;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* read ionex dcb aux data ----------------------------------------------------*/
 | 
			
		||||
void readionexdcb(FILE *fp, double *dcb, double *rms)
 | 
			
		||||
{
 | 
			
		||||
    int i, sat;
 | 
			
		||||
    char buff[1024], id[32], *label;
 | 
			
		||||
 | 
			
		||||
    trace(3, "readionexdcb:\n");
 | 
			
		||||
 | 
			
		||||
    for (i = 0; i < MAXSAT; i++) dcb[i] = rms[i] = 0.0;
 | 
			
		||||
 | 
			
		||||
    while (fgets(buff, sizeof(buff), fp))
 | 
			
		||||
        {
 | 
			
		||||
            if (strlen(buff) < 60) continue;
 | 
			
		||||
            label = buff + 60;
 | 
			
		||||
 | 
			
		||||
            if (strstr(label, "PRN / BIAS / RMS") == label)
 | 
			
		||||
                {
 | 
			
		||||
                    strncpy(id, buff+3, 3); id[3] = '\0';
 | 
			
		||||
 | 
			
		||||
                    if (!(sat = satid2no(id)))
 | 
			
		||||
                        {
 | 
			
		||||
                            trace(2, "ionex invalid satellite: %s\n", id);
 | 
			
		||||
                            continue;
 | 
			
		||||
                        }
 | 
			
		||||
                    dcb[sat-1] = str2num(buff,  6, 10);
 | 
			
		||||
                    rms[sat-1] = str2num(buff, 16, 10);
 | 
			
		||||
                }
 | 
			
		||||
            else if (strstr(label, "END OF AUX DATA") == label) break;
 | 
			
		||||
    int i,sat;
 | 
			
		||||
    char buff[1024],id[32],*label;
 | 
			
		||||
    
 | 
			
		||||
    trace(3,"readionexdcb:\n");
 | 
			
		||||
    
 | 
			
		||||
    for (i=0;i<MAXSAT;i++) dcb[i]=rms[i]=0.0;
 | 
			
		||||
    
 | 
			
		||||
    while (fgets(buff,sizeof(buff),fp)) {
 | 
			
		||||
        if (strlen(buff)<60) continue;
 | 
			
		||||
        label=buff+60;
 | 
			
		||||
        
 | 
			
		||||
        if (strstr(label,"PRN / BIAS / RMS")==label) {
 | 
			
		||||
            
 | 
			
		||||
            strncpy(id,buff+3,3); id[3]='\0';
 | 
			
		||||
            
 | 
			
		||||
            if (!(sat=satid2no(id))) {
 | 
			
		||||
                trace(2,"ionex invalid satellite: %s\n",id);
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
            dcb[sat-1]=str2num(buff, 6,10);
 | 
			
		||||
            rms[sat-1]=str2num(buff,16,10);
 | 
			
		||||
        }
 | 
			
		||||
        else if (strstr(label,"END OF AUX DATA")==label) break;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* read ionex header ---------------------------------------------------------*/
 | 
			
		||||
double readionexh(FILE *fp, double *lats, double *lons, double *hgts,
 | 
			
		||||
        double *rb, double *nexp, double *dcb, double *rms)
 | 
			
		||||
                         double *rb, double *nexp, double *dcb, double *rms)
 | 
			
		||||
{
 | 
			
		||||
    double ver = 0.0;
 | 
			
		||||
    char buff[1024], *label;
 | 
			
		||||
 | 
			
		||||
    trace(3, "readionexh:\n");
 | 
			
		||||
 | 
			
		||||
    while (fgets(buff, sizeof(buff), fp))
 | 
			
		||||
        {
 | 
			
		||||
 | 
			
		||||
            if (strlen(buff) < 60) continue;
 | 
			
		||||
            label = buff + 60;
 | 
			
		||||
 | 
			
		||||
            if (strstr(label, "IONEX VERSION / TYPE") == label)
 | 
			
		||||
                {
 | 
			
		||||
                    if (buff[20] == 'I') ver = str2num(buff, 0, 8);
 | 
			
		||||
                }
 | 
			
		||||
            else if (strstr(label, "BASE RADIUS") == label)
 | 
			
		||||
                {
 | 
			
		||||
                    *rb = str2num(buff, 0, 8);
 | 
			
		||||
                }
 | 
			
		||||
            else if (strstr(label, "HGT1 / HGT2 / DHGT") == label)
 | 
			
		||||
                {
 | 
			
		||||
                    hgts[0] = str2num(buff,  2, 6);
 | 
			
		||||
                    hgts[1] = str2num(buff,  8, 6);
 | 
			
		||||
                    hgts[2] = str2num(buff, 14, 6);
 | 
			
		||||
                }
 | 
			
		||||
            else if (strstr(label, "LAT1 / LAT2 / DLAT") == label)
 | 
			
		||||
                {
 | 
			
		||||
                    lats[0] = str2num(buff,  2, 6);
 | 
			
		||||
                    lats[1] = str2num(buff,  8, 6);
 | 
			
		||||
                    lats[2] = str2num(buff, 14, 6);
 | 
			
		||||
                }
 | 
			
		||||
            else if (strstr(label,"LON1 / LON2 / DLON") == label)
 | 
			
		||||
                {
 | 
			
		||||
                    lons[0] = str2num(buff,  2, 6);
 | 
			
		||||
                    lons[1] = str2num(buff,  8, 6);
 | 
			
		||||
                    lons[2] = str2num(buff, 14, 6);
 | 
			
		||||
                }
 | 
			
		||||
            else if (strstr(label, "EXPONENT") == label)
 | 
			
		||||
                {
 | 
			
		||||
                    *nexp = str2num(buff, 0, 6);
 | 
			
		||||
                }
 | 
			
		||||
            else if (strstr(label, "START OF AUX DATA") == label &&
 | 
			
		||||
                    strstr(buff, "DIFFERENTIAL CODE BIASES"))
 | 
			
		||||
                {
 | 
			
		||||
                    readionexdcb(fp, dcb, rms);
 | 
			
		||||
                }
 | 
			
		||||
            else if (strstr(label, "END OF HEADER") == label)
 | 
			
		||||
                {
 | 
			
		||||
                    return ver;
 | 
			
		||||
                }
 | 
			
		||||
    double ver=0.0;
 | 
			
		||||
    char buff[1024],*label;
 | 
			
		||||
    
 | 
			
		||||
    trace(3,"readionexh:\n");
 | 
			
		||||
    
 | 
			
		||||
    while (fgets(buff,sizeof(buff),fp)) {
 | 
			
		||||
        
 | 
			
		||||
        if (strlen(buff)<60) continue;
 | 
			
		||||
        label=buff+60;
 | 
			
		||||
        
 | 
			
		||||
        if (strstr(label,"IONEX VERSION / TYPE")==label) {
 | 
			
		||||
            if (buff[20]=='I') ver=str2num(buff,0,8);
 | 
			
		||||
        }
 | 
			
		||||
        else if (strstr(label,"BASE RADIUS")==label) {
 | 
			
		||||
            *rb=str2num(buff,0,8);
 | 
			
		||||
        }
 | 
			
		||||
        else if (strstr(label,"HGT1 / HGT2 / DHGT")==label) {
 | 
			
		||||
            hgts[0]=str2num(buff, 2,6);
 | 
			
		||||
            hgts[1]=str2num(buff, 8,6);
 | 
			
		||||
            hgts[2]=str2num(buff,14,6);
 | 
			
		||||
        }
 | 
			
		||||
        else if (strstr(label,"LAT1 / LAT2 / DLAT")==label) {
 | 
			
		||||
            lats[0]=str2num(buff, 2,6);
 | 
			
		||||
            lats[1]=str2num(buff, 8,6);
 | 
			
		||||
            lats[2]=str2num(buff,14,6);
 | 
			
		||||
        }
 | 
			
		||||
        else if (strstr(label,"LON1 / LON2 / DLON")==label) {
 | 
			
		||||
            lons[0]=str2num(buff, 2,6);
 | 
			
		||||
            lons[1]=str2num(buff, 8,6);
 | 
			
		||||
            lons[2]=str2num(buff,14,6);
 | 
			
		||||
        }
 | 
			
		||||
        else if (strstr(label,"EXPONENT")==label) {
 | 
			
		||||
            *nexp=str2num(buff,0,6);
 | 
			
		||||
        }
 | 
			
		||||
        else if (strstr(label,"START OF AUX DATA")==label&&
 | 
			
		||||
                 strstr(buff,"DIFFERENTIAL CODE BIASES")) {
 | 
			
		||||
            readionexdcb(fp,dcb,rms);
 | 
			
		||||
        }
 | 
			
		||||
        else if (strstr(label,"END OF HEADER")==label) {
 | 
			
		||||
            return ver;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return 0.0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* read ionex body -----------------------------------------------------------*/
 | 
			
		||||
int readionexb(FILE *fp, const double *lats, const double *lons,
 | 
			
		||||
        const double *hgts, double rb, double nexp, nav_t *nav)
 | 
			
		||||
                      const double *hgts, double rb, double nexp, nav_t *nav)
 | 
			
		||||
{
 | 
			
		||||
    tec_t *p = NULL;
 | 
			
		||||
    gtime_t time = {};
 | 
			
		||||
    double lat, lon[3], hgt, x;
 | 
			
		||||
    int i, j, k, n, m, index, type = 0;
 | 
			
		||||
    char buff[1024], *label = buff + 60;
 | 
			
		||||
 | 
			
		||||
    trace(3, "readionexb:\n");
 | 
			
		||||
 | 
			
		||||
    while (fgets(buff, sizeof(buff), fp))
 | 
			
		||||
        {
 | 
			
		||||
            if (strlen(buff) < 60) continue;
 | 
			
		||||
 | 
			
		||||
            if (strstr(label, "START OF TEC MAP") == label)
 | 
			
		||||
                {
 | 
			
		||||
                    if ((p = addtec(lats, lons, hgts, rb, nav))) type = 1;
 | 
			
		||||
                }
 | 
			
		||||
            else if (strstr(label, "END OF TEC MAP") == label)
 | 
			
		||||
                {
 | 
			
		||||
                    type = 0;
 | 
			
		||||
                    p = NULL;
 | 
			
		||||
                }
 | 
			
		||||
            else if (strstr(label, "START OF RMS MAP") == label)
 | 
			
		||||
                {
 | 
			
		||||
                    type = 2;
 | 
			
		||||
                    p = NULL;
 | 
			
		||||
                }
 | 
			
		||||
            else if (strstr(label, "END OF RMS MAP") == label)
 | 
			
		||||
                {
 | 
			
		||||
                    type = 0;
 | 
			
		||||
                    p = NULL;
 | 
			
		||||
                }
 | 
			
		||||
            else if (strstr(label, "EPOCH OF CURRENT MAP") == label)
 | 
			
		||||
                {
 | 
			
		||||
                    if (str2time(buff, 0, 36, &time))
 | 
			
		||||
                        {
 | 
			
		||||
                            trace(2, "ionex epoch invalid: %-36.36s\n", buff);
 | 
			
		||||
                            continue;
 | 
			
		||||
                        }
 | 
			
		||||
                    if (type == 2)
 | 
			
		||||
                        {
 | 
			
		||||
                            for (i = nav->nt-1; i >= 0; i--)
 | 
			
		||||
                                {
 | 
			
		||||
                                    if (fabs(timediff(time, nav->tec[i].time)) >= 1.0) continue;
 | 
			
		||||
                                    p = nav->tec + i;
 | 
			
		||||
                                    break;
 | 
			
		||||
                                }
 | 
			
		||||
                        }
 | 
			
		||||
                    else if (p) p->time = time;
 | 
			
		||||
                }
 | 
			
		||||
            else if (strstr(label, "LAT/LON1/LON2/DLON/H") == label && p)
 | 
			
		||||
                {
 | 
			
		||||
                    lat    = str2num(buff,  2, 6);
 | 
			
		||||
                    lon[0] = str2num(buff,  8, 6);
 | 
			
		||||
                    lon[1] = str2num(buff, 14, 6);
 | 
			
		||||
                    lon[2] = str2num(buff, 20, 6);
 | 
			
		||||
                    hgt    = str2num(buff, 26, 6);
 | 
			
		||||
 | 
			
		||||
                    i = getindex(lat, p->lats);
 | 
			
		||||
                    k = getindex(hgt, p->hgts);
 | 
			
		||||
                    n = nitem(lon);
 | 
			
		||||
 | 
			
		||||
                    for (m = 0; m < n; m++)
 | 
			
		||||
                        {
 | 
			
		||||
                            if (m%16 == 0 && !fgets(buff, sizeof(buff), fp)) break;
 | 
			
		||||
 | 
			
		||||
                            j = getindex(lon[0] + lon[2] * m, p->lons);
 | 
			
		||||
                            if ((index = dataindex(i, j, k, p->ndata)) < 0) continue;
 | 
			
		||||
 | 
			
		||||
                            if ((x = str2num(buff, m%16*5, 5)) == 9999.0) continue;
 | 
			
		||||
 | 
			
		||||
                            if (type == 1) p->data[index] = x * pow(10.0, nexp);
 | 
			
		||||
                            else p->rms[index] = (float)(x * pow(10.0, nexp));
 | 
			
		||||
                        }
 | 
			
		||||
                }
 | 
			
		||||
    tec_t *p=NULL;
 | 
			
		||||
    gtime_t time={};
 | 
			
		||||
    double lat,lon[3],hgt,x;
 | 
			
		||||
    int i,j,k,n,m,index,type=0;
 | 
			
		||||
    char buff[1024],*label=buff+60;
 | 
			
		||||
    
 | 
			
		||||
    trace(3,"readionexb:\n");
 | 
			
		||||
    
 | 
			
		||||
    while (fgets(buff,sizeof(buff),fp)) {
 | 
			
		||||
        
 | 
			
		||||
        if (strlen(buff)<60) continue;
 | 
			
		||||
        
 | 
			
		||||
        if (strstr(label,"START OF TEC MAP")==label) {
 | 
			
		||||
            if ((p=addtec(lats,lons,hgts,rb,nav))) type=1;
 | 
			
		||||
        }
 | 
			
		||||
        else if (strstr(label,"END OF TEC MAP")==label) {
 | 
			
		||||
            type=0;
 | 
			
		||||
            p=NULL;
 | 
			
		||||
        }
 | 
			
		||||
        else if (strstr(label,"START OF RMS MAP")==label) {
 | 
			
		||||
            type=2;
 | 
			
		||||
            p=NULL;
 | 
			
		||||
        }
 | 
			
		||||
        else if (strstr(label,"END OF RMS MAP")==label) {
 | 
			
		||||
            type=0;
 | 
			
		||||
            p=NULL;
 | 
			
		||||
        }
 | 
			
		||||
        else if (strstr(label,"EPOCH OF CURRENT MAP")==label) {
 | 
			
		||||
            if (str2time(buff,0,36,&time)) {
 | 
			
		||||
                trace(2,"ionex epoch invalid: %-36.36s\n",buff);
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
            if (type==2) {
 | 
			
		||||
                for (i=nav->nt-1;i>=0;i--) {
 | 
			
		||||
                    if (fabs(timediff(time,nav->tec[i].time))>=1.0) continue;
 | 
			
		||||
                    p=nav->tec+i;
 | 
			
		||||
                    break;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            else if (p) p->time=time;
 | 
			
		||||
        }
 | 
			
		||||
        else if (strstr(label,"LAT/LON1/LON2/DLON/H")==label&&p) {
 | 
			
		||||
            lat   =str2num(buff, 2,6);
 | 
			
		||||
            lon[0]=str2num(buff, 8,6);
 | 
			
		||||
            lon[1]=str2num(buff,14,6);
 | 
			
		||||
            lon[2]=str2num(buff,20,6);
 | 
			
		||||
            hgt   =str2num(buff,26,6);
 | 
			
		||||
            
 | 
			
		||||
            i=getindex(lat,p->lats);
 | 
			
		||||
            k=getindex(hgt,p->hgts);
 | 
			
		||||
            n=nitem(lon);
 | 
			
		||||
            
 | 
			
		||||
            for (m=0;m<n;m++) {
 | 
			
		||||
                if (m%16==0&&!fgets(buff,sizeof(buff),fp)) break;
 | 
			
		||||
                
 | 
			
		||||
                j=getindex(lon[0]+lon[2]*m,p->lons);
 | 
			
		||||
                if ((index=dataindex(i,j,k,p->ndata))<0) continue;
 | 
			
		||||
                
 | 
			
		||||
                if ((x=str2num(buff,m%16*5,5))==9999.0) continue;
 | 
			
		||||
                
 | 
			
		||||
                if (type==1) p->data[index]=x*pow(10.0,nexp);
 | 
			
		||||
                else p->rms[index]=(float)(x*pow(10.0,nexp));
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* combine tec grid data -----------------------------------------------------*/
 | 
			
		||||
void combtec(nav_t *nav)
 | 
			
		||||
{
 | 
			
		||||
    tec_t tmp;
 | 
			
		||||
    int i, j, n = 0;
 | 
			
		||||
 | 
			
		||||
    trace(3, "combtec : nav->nt=%d\n", nav->nt);
 | 
			
		||||
 | 
			
		||||
    for (i = 0; i < nav->nt - 1; i++)
 | 
			
		||||
        {
 | 
			
		||||
            for (j = i + 1; j < nav->nt; j++)
 | 
			
		||||
                {
 | 
			
		||||
                    if (timediff(nav->tec[j].time, nav->tec[i].time) < 0.0)
 | 
			
		||||
                        {
 | 
			
		||||
                            tmp = nav->tec[i];
 | 
			
		||||
                            nav->tec[i] = nav->tec[j];
 | 
			
		||||
                            nav->tec[j] = tmp;
 | 
			
		||||
                        }
 | 
			
		||||
                }
 | 
			
		||||
    int i,j,n=0;
 | 
			
		||||
    
 | 
			
		||||
    trace(3,"combtec : nav->nt=%d\n",nav->nt);
 | 
			
		||||
    
 | 
			
		||||
    for (i=0;i<nav->nt-1;i++) {
 | 
			
		||||
        for (j=i+1;j<nav->nt;j++) {
 | 
			
		||||
            if (timediff(nav->tec[j].time,nav->tec[i].time)<0.0) {
 | 
			
		||||
                tmp=nav->tec[i];
 | 
			
		||||
                nav->tec[i]=nav->tec[j];
 | 
			
		||||
                nav->tec[j]=tmp;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    for (i = 0; i < nav->nt; i++)
 | 
			
		||||
        {
 | 
			
		||||
            if (i > 0 && timediff(nav->tec[i].time, nav->tec[n - 1].time) == 0.0)
 | 
			
		||||
                {
 | 
			
		||||
                    free(nav->tec[n - 1].data);
 | 
			
		||||
                    free(nav->tec[n - 1].rms );
 | 
			
		||||
                    nav->tec[n - 1] = nav->tec[i];
 | 
			
		||||
                    continue;
 | 
			
		||||
                }
 | 
			
		||||
            nav->tec[n++] = nav->tec[i];
 | 
			
		||||
    }
 | 
			
		||||
    for (i=0;i<nav->nt;i++) {
 | 
			
		||||
        if (i>0&&timediff(nav->tec[i].time,nav->tec[n-1].time)==0.0) {
 | 
			
		||||
            free(nav->tec[n-1].data);
 | 
			
		||||
            free(nav->tec[n-1].rms );
 | 
			
		||||
            nav->tec[n-1]=nav->tec[i];
 | 
			
		||||
            continue;
 | 
			
		||||
        }
 | 
			
		||||
    nav->nt = n;
 | 
			
		||||
 | 
			
		||||
    trace(4, "combtec : nav->nt=%d\n", nav->nt);
 | 
			
		||||
        nav->tec[n++]=nav->tec[i];
 | 
			
		||||
    }
 | 
			
		||||
    nav->nt=n;
 | 
			
		||||
    
 | 
			
		||||
    trace(4,"combtec : nav->nt=%d\n",nav->nt);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* read ionex tec grid file ----------------------------------------------------
 | 
			
		||||
 * read ionex ionospheric tec grid file
 | 
			
		||||
 * args   : char   *file       I   ionex tec grid file
 | 
			
		||||
 *                                 (wind-card * is expanded)
 | 
			
		||||
 *          nav_t  *nav        IO  navigation data
 | 
			
		||||
 *                                 nav->nt, nav->ntmax and nav->tec are modified
 | 
			
		||||
 *          int    opt         I   read option (1: no clear of tec data,0:clear)
 | 
			
		||||
 * return : none
 | 
			
		||||
 * notes  : see ref [1]
 | 
			
		||||
 *-----------------------------------------------------------------------------*/
 | 
			
		||||
* read ionex ionospheric tec grid file
 | 
			
		||||
* args   : char   *file       I   ionex tec grid file
 | 
			
		||||
*                                 (wind-card * is expanded)
 | 
			
		||||
*          nav_t  *nav        IO  navigation data
 | 
			
		||||
*                                 nav->nt, nav->ntmax and nav->tec are modified
 | 
			
		||||
*          int    opt         I   read option (1: no clear of tec data,0:clear)
 | 
			
		||||
* return : none
 | 
			
		||||
* notes  : see ref [1]
 | 
			
		||||
*-----------------------------------------------------------------------------*/
 | 
			
		||||
void readtec(const char *file, nav_t *nav, int opt)
 | 
			
		||||
{
 | 
			
		||||
    FILE *fp;
 | 
			
		||||
    double lats[3] = {0}, lons[3] = {0}, hgts[3] = {0}, rb = 0.0, nexp = -1.0;
 | 
			
		||||
    double dcb[MAXSAT] = {0}, rms[MAXSAT] = {0};
 | 
			
		||||
    int i, n;
 | 
			
		||||
    double lats[3]={0},lons[3]={0},hgts[3]={0},rb=0.0,nexp=-1.0;
 | 
			
		||||
    double dcb[MAXSAT]={0},rms[MAXSAT]={0};
 | 
			
		||||
    int i,n;
 | 
			
		||||
    char *efiles[MAXEXFILE];
 | 
			
		||||
 | 
			
		||||
    trace(3, "readtec : file=%s\n", file);
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
    trace(3,"readtec : file=%s\n",file);
 | 
			
		||||
    
 | 
			
		||||
    /* clear of tec grid data option */
 | 
			
		||||
    if (!opt)
 | 
			
		||||
        {
 | 
			
		||||
            free(nav->tec);
 | 
			
		||||
            nav->tec = NULL;
 | 
			
		||||
            nav->nt = nav->ntmax = 0;
 | 
			
		||||
        }
 | 
			
		||||
    for (i = 0; i < MAXEXFILE; i++)
 | 
			
		||||
        {
 | 
			
		||||
            if (!(efiles[i] = (char *)malloc(1024)))
 | 
			
		||||
                {
 | 
			
		||||
                    for (i--; i >=  0; i--) free(efiles[i]);
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
    if (!opt) {
 | 
			
		||||
        free(nav->tec); nav->tec=NULL; nav->nt=nav->ntmax=0;
 | 
			
		||||
    }
 | 
			
		||||
    for (i=0;i<MAXEXFILE;i++) {
 | 
			
		||||
        if (!(efiles[i]=(char *)malloc(1024))) {
 | 
			
		||||
            for (i--;i>=0;i--) free(efiles[i]);
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    /* expand wild card in file path */
 | 
			
		||||
    n = expath(file, efiles, MAXEXFILE);
 | 
			
		||||
 | 
			
		||||
    for (i = 0; i < n; i++)
 | 
			
		||||
        {
 | 
			
		||||
            if (!(fp = fopen(efiles[i], "r")))
 | 
			
		||||
                {
 | 
			
		||||
                    trace(2, "ionex file open error %s\n", efiles[i]);
 | 
			
		||||
                    continue;
 | 
			
		||||
                }
 | 
			
		||||
            /* read ionex header */
 | 
			
		||||
            if (readionexh(fp, lats, lons, hgts, &rb, &nexp, dcb, rms) <= 0.0)
 | 
			
		||||
                {
 | 
			
		||||
                    trace(2, "ionex file format error %s\n", efiles[i]);
 | 
			
		||||
                    continue;
 | 
			
		||||
                }
 | 
			
		||||
            /* read ionex body */
 | 
			
		||||
            readionexb(fp, lats, lons, hgts, rb, nexp, nav);
 | 
			
		||||
 | 
			
		||||
            fclose(fp);
 | 
			
		||||
    n=expath(file,efiles,MAXEXFILE);
 | 
			
		||||
    
 | 
			
		||||
    for (i=0;i<n;i++) {
 | 
			
		||||
        if (!(fp=fopen(efiles[i],"r"))) {
 | 
			
		||||
            trace(2,"ionex file open error %s\n",efiles[i]);
 | 
			
		||||
            continue;
 | 
			
		||||
        }
 | 
			
		||||
    for (i = 0; i < MAXEXFILE; i++) free(efiles[i]);
 | 
			
		||||
 | 
			
		||||
        /* read ionex header */
 | 
			
		||||
        if (readionexh(fp,lats,lons,hgts,&rb,&nexp,dcb,rms)<=0.0) {
 | 
			
		||||
            trace(2,"ionex file format error %s\n",efiles[i]);
 | 
			
		||||
            continue;
 | 
			
		||||
        }
 | 
			
		||||
        /* read ionex body */
 | 
			
		||||
        readionexb(fp,lats,lons,hgts,rb,nexp,nav);
 | 
			
		||||
        
 | 
			
		||||
        fclose(fp);
 | 
			
		||||
    }
 | 
			
		||||
    for (i=0;i<MAXEXFILE;i++) free(efiles[i]);
 | 
			
		||||
    
 | 
			
		||||
    /* combine tec grid data */
 | 
			
		||||
    if (nav->nt > 0) combtec(nav);
 | 
			
		||||
 | 
			
		||||
    if (nav->nt>0) combtec(nav);
 | 
			
		||||
    
 | 
			
		||||
    /* P1-P2 dcb */
 | 
			
		||||
    for (i = 0; i < MAXSAT; i++)
 | 
			
		||||
        {
 | 
			
		||||
            nav->cbias[i][0] = SPEED_OF_LIGHT * dcb[i] * 1e-9; /* ns->m */
 | 
			
		||||
        }
 | 
			
		||||
    for (i=0;i<MAXSAT;i++) {
 | 
			
		||||
        nav->cbias[i][0]=CLIGHT*dcb[i]*1E-9; /* ns->m */
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* interpolate tec grid data -------------------------------------------------*/
 | 
			
		||||
int interptec(const tec_t *tec, int k, const double *posp, double *value,
 | 
			
		||||
        double *rms)
 | 
			
		||||
                     double *rms)
 | 
			
		||||
{
 | 
			
		||||
    double dlat, dlon, a, b, d[4] = {0}, r[4] = {0};
 | 
			
		||||
    int i, j, n, index;
 | 
			
		||||
 | 
			
		||||
    trace(3, "interptec: k=%d posp=%.2f %.2f\n", k, posp[0] * R2D, posp[1] * R2D);
 | 
			
		||||
    *value = *rms = 0.0;
 | 
			
		||||
 | 
			
		||||
    if (tec->lats[2] == 0.0 || tec->lons[2] == 0.0) return 0;
 | 
			
		||||
 | 
			
		||||
    dlat = posp[0] * R2D - tec->lats[0];
 | 
			
		||||
    dlon = posp[1] * R2D - tec->lons[0];
 | 
			
		||||
    if (tec->lons[2] > 0.0) dlon -= floor( dlon / 360) * 360.0; /*  0 <= dlon<360 */
 | 
			
		||||
    else dlon += floor(-dlon / 360) * 360.0; /* -360<dlon <= 0 */
 | 
			
		||||
 | 
			
		||||
    a = dlat / tec->lats[2];
 | 
			
		||||
    b = dlon / tec->lons[2];
 | 
			
		||||
    i = (int)floor(a);
 | 
			
		||||
    a -= i;
 | 
			
		||||
    j = (int)floor(b);
 | 
			
		||||
    b -= j;
 | 
			
		||||
 | 
			
		||||
    double dlat,dlon,a,b,d[4]={0},r[4]={0};
 | 
			
		||||
    int i,j,n,index;
 | 
			
		||||
    
 | 
			
		||||
    trace(3,"interptec: k=%d posp=%.2f %.2f\n",k,posp[0]*R2D,posp[1]*R2D);
 | 
			
		||||
    *value=*rms=0.0;
 | 
			
		||||
    
 | 
			
		||||
    if (tec->lats[2]==0.0||tec->lons[2]==0.0) return 0;
 | 
			
		||||
    
 | 
			
		||||
    dlat=posp[0]*R2D-tec->lats[0];
 | 
			
		||||
    dlon=posp[1]*R2D-tec->lons[0];
 | 
			
		||||
    if (tec->lons[2]>0.0) dlon-=floor( dlon/360)*360.0; /*  0<=dlon<360 */
 | 
			
		||||
    else                  dlon+=floor(-dlon/360)*360.0; /* -360<dlon<=0 */
 | 
			
		||||
    
 | 
			
		||||
    a=dlat/tec->lats[2];
 | 
			
		||||
    b=dlon/tec->lons[2];
 | 
			
		||||
    i=(int)floor(a); a-=i;
 | 
			
		||||
    j=(int)floor(b); b-=j;
 | 
			
		||||
    
 | 
			
		||||
    /* get gridded tec data */
 | 
			
		||||
    for (n = 0; n < 4; n++)
 | 
			
		||||
        {
 | 
			
		||||
            if ((index = dataindex(i + (n % 2), j + (n < 2 ? 0 : 1), k, tec->ndata)) < 0) continue;
 | 
			
		||||
            d[n] = tec->data[index];
 | 
			
		||||
            r[n] = tec->rms[index];
 | 
			
		||||
        }
 | 
			
		||||
    if (d[0] > 0.0 && d[1] > 0.0 && d[2] > 0.0 && d[3] > 0.0)
 | 
			
		||||
        {
 | 
			
		||||
            /* bilinear interpolation (inside of grid) */
 | 
			
		||||
            *value = (1.0 - a) * (1.0 - b) * d[0] + a*(1.0  -b) * d[1] + (1.0 - a) * b * d[2] + a * b * d[3];
 | 
			
		||||
            *rms   = (1.0 - a) * (1.0 - b) * r[0] + a*(1.0 - b) * r[1] + (1.0 - a) * b * r[2] + a * b * r[3];
 | 
			
		||||
        }
 | 
			
		||||
    for (n=0;n<4;n++) {
 | 
			
		||||
        if ((index=dataindex(i+(n%2),j+(n<2?0:1),k,tec->ndata))<0) continue;
 | 
			
		||||
        d[n]=tec->data[index];
 | 
			
		||||
        r[n]=tec->rms [index];
 | 
			
		||||
    }
 | 
			
		||||
    if (d[0]>0.0&&d[1]>0.0&&d[2]>0.0&&d[3]>0.0) {
 | 
			
		||||
        
 | 
			
		||||
        /* bilinear interpolation (inside of grid) */
 | 
			
		||||
        *value=(1.0-a)*(1.0-b)*d[0]+a*(1.0-b)*d[1]+(1.0-a)*b*d[2]+a*b*d[3];
 | 
			
		||||
        *rms  =(1.0-a)*(1.0-b)*r[0]+a*(1.0-b)*r[1]+(1.0-a)*b*r[2]+a*b*r[3];
 | 
			
		||||
    }
 | 
			
		||||
    /* nearest-neighbour extrapolation (outside of grid) */
 | 
			
		||||
    else if (a <= 0.5 && b <= 0.5 && d[0] > 0.0) {*value = d[0]; *rms = r[0];}
 | 
			
		||||
    else if (a > 0.5 && b <= 0.5 && d[1] > 0.0) {*value = d[1]; *rms = r[1];}
 | 
			
		||||
    else if (a <= 0.5 && b > 0.5 && d[2] > 0.0) {*value = d[2]; *rms = r[2];}
 | 
			
		||||
    else if (a > 0.5 && b > 0.5 && d[3] > 0.0) {*value = d[3]; *rms = r[3];}
 | 
			
		||||
    else
 | 
			
		||||
        {
 | 
			
		||||
            i = 0;
 | 
			
		||||
            for (n = 0; n < 4; n++) if (d[n] > 0.0) {i++; *value += d[n]; *rms += r[n];}
 | 
			
		||||
            if(i == 0) return 0;
 | 
			
		||||
            *value /= i;
 | 
			
		||||
            *rms /= i;
 | 
			
		||||
        }
 | 
			
		||||
    else if (a<=0.5&&b<=0.5&&d[0]>0.0) {*value=d[0]; *rms=r[0];}
 | 
			
		||||
    else if (a> 0.5&&b<=0.5&&d[1]>0.0) {*value=d[1]; *rms=r[1];}
 | 
			
		||||
    else if (a<=0.5&&b> 0.5&&d[2]>0.0) {*value=d[2]; *rms=r[2];}
 | 
			
		||||
    else if (a> 0.5&&b> 0.5&&d[3]>0.0) {*value=d[3]; *rms=r[3];}
 | 
			
		||||
    else {
 | 
			
		||||
        i=0;
 | 
			
		||||
        for (n=0;n<4;n++) if (d[n]>0.0) {i++; *value+=d[n]; *rms+=r[n];}
 | 
			
		||||
        if(i==0) return 0;
 | 
			
		||||
        *value/=i; *rms/=i;
 | 
			
		||||
    }
 | 
			
		||||
    return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* ionosphere delay by tec grid data -----------------------------------------*/
 | 
			
		||||
int iondelay(gtime_t time, const tec_t *tec, const double *pos,
 | 
			
		||||
        const double *azel, int opt, double *delay, double *var)
 | 
			
		||||
                    const double *azel, int opt, double *delay, double *var)
 | 
			
		||||
{
 | 
			
		||||
    const double fact = 40.30E16 / FREQ1 / FREQ1; /* tecu->L1 iono (m) */
 | 
			
		||||
    double fs, posp[3] = {0}, vtec, rms, hion, rp;
 | 
			
		||||
    const double fact=40.30E16/FREQ1/FREQ1; /* tecu->L1 iono (m) */
 | 
			
		||||
    double fs,posp[3]={0},vtec,rms,hion,rp;
 | 
			
		||||
    int i;
 | 
			
		||||
 | 
			
		||||
    trace(3, "iondelay: time=%s pos=%.1f %.1f azel=%.1f %.1f\n", time_str(time, 0),
 | 
			
		||||
            pos[0]*R2D, pos[1]*R2D, azel[0]*R2D, azel[1]*R2D);
 | 
			
		||||
 | 
			
		||||
    *delay = *var = 0.0;
 | 
			
		||||
 | 
			
		||||
    for (i = 0;i < tec->ndata[2]; i++)
 | 
			
		||||
        { /* for a layer */
 | 
			
		||||
            hion = tec->hgts[0] + tec->hgts[2] * i;
 | 
			
		||||
 | 
			
		||||
            /* ionospheric pierce point position */
 | 
			
		||||
            fs = ionppp(pos, azel, tec->rb, hion, posp);
 | 
			
		||||
 | 
			
		||||
            if (opt&2)
 | 
			
		||||
                {
 | 
			
		||||
                    /* modified single layer mapping function (M-SLM) ref [2] */
 | 
			
		||||
                    rp = tec->rb / (tec->rb + hion) * sin(0.9782 * (PI / 2.0 - azel[1]));
 | 
			
		||||
                    fs = 1.0 / sqrt(1.0 - rp * rp);
 | 
			
		||||
                }
 | 
			
		||||
            if (opt&1)
 | 
			
		||||
                {
 | 
			
		||||
                    /* earth rotation correction (sun-fixed coordinate) */
 | 
			
		||||
                    posp[1] += 2.0 * PI * timediff(time, tec->time) / 86400.0;
 | 
			
		||||
                }
 | 
			
		||||
            /* interpolate tec grid data */
 | 
			
		||||
            if (!interptec(tec, i, posp, &vtec, &rms)) return 0;
 | 
			
		||||
 | 
			
		||||
            *delay += fact * fs * vtec;
 | 
			
		||||
            *var += fact * fact * fs * fs * rms * rms;
 | 
			
		||||
    
 | 
			
		||||
    trace(3,"iondelay: time=%s pos=%.1f %.1f azel=%.1f %.1f\n",time_str(time,0),
 | 
			
		||||
          pos[0]*R2D,pos[1]*R2D,azel[0]*R2D,azel[1]*R2D);
 | 
			
		||||
    
 | 
			
		||||
    *delay=*var=0.0;
 | 
			
		||||
    
 | 
			
		||||
    for (i=0;i<tec->ndata[2];i++) { /* for a layer */
 | 
			
		||||
        
 | 
			
		||||
        hion=tec->hgts[0]+tec->hgts[2]*i;
 | 
			
		||||
        
 | 
			
		||||
        /* ionospheric pierce point position */
 | 
			
		||||
        fs=ionppp(pos,azel,tec->rb,hion,posp);
 | 
			
		||||
        
 | 
			
		||||
        if (opt&2) {
 | 
			
		||||
            /* modified single layer mapping function (M-SLM) ref [2] */
 | 
			
		||||
            rp=tec->rb/(tec->rb+hion)*sin(0.9782*(PI/2.0-azel[1]));
 | 
			
		||||
            fs=1.0/sqrt(1.0-rp*rp);
 | 
			
		||||
        }
 | 
			
		||||
    trace(4, "iondelay: delay=%7.2f std=%6.2f\n", *delay, sqrt(*var));
 | 
			
		||||
 | 
			
		||||
        if (opt&1) {
 | 
			
		||||
            /* earth rotation correction (sun-fixed coordinate) */
 | 
			
		||||
            posp[1]+=2.0*PI*timediff(time,tec->time)/86400.0;
 | 
			
		||||
        }
 | 
			
		||||
        /* interpolate tec grid data */
 | 
			
		||||
        if (!interptec(tec,i,posp,&vtec,&rms)) return 0;
 | 
			
		||||
        
 | 
			
		||||
        *delay+=fact*fs*vtec;
 | 
			
		||||
        *var+=fact*fact*fs*fs*rms*rms;
 | 
			
		||||
    }
 | 
			
		||||
    trace(4,"iondelay: delay=%7.2f std=%6.2f\n",*delay,sqrt(*var));
 | 
			
		||||
    
 | 
			
		||||
    return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* ionosphere model by tec grid data -------------------------------------------
 | 
			
		||||
 * compute ionospheric delay by tec grid data
 | 
			
		||||
 * args   : gtime_t time     I   time (gpst)
 | 
			
		||||
 *          nav_t  *nav      I   navigation data
 | 
			
		||||
 *          double *pos      I   receiver position {lat,lon,h} (rad,m)
 | 
			
		||||
 *          double *azel     I   azimuth/elevation angle {az,el} (rad)
 | 
			
		||||
 *          int    opt       I   model option
 | 
			
		||||
 *                                bit0: 0:earth-fixed,1:sun-fixed
 | 
			
		||||
 *                                bit1: 0:single-layer,1:modified single-layer
 | 
			
		||||
 *          double *delay    O   ionospheric delay (L1) (m)
 | 
			
		||||
 *          double *var      O   ionospheric dealy (L1) variance (m^2)
 | 
			
		||||
 * return : status (1:ok,0:error)
 | 
			
		||||
 * notes  : before calling the function, read tec grid data by calling readtec()
 | 
			
		||||
 *          return ok with delay=0 and var=VAR_NOTEC if el<MIN_EL or h<MIN_HGT
 | 
			
		||||
 *-----------------------------------------------------------------------------*/
 | 
			
		||||
* compute ionospheric delay by tec grid data
 | 
			
		||||
* args   : gtime_t time     I   time (gpst)
 | 
			
		||||
*          nav_t  *nav      I   navigation data
 | 
			
		||||
*          double *pos      I   receiver position {lat,lon,h} (rad,m)
 | 
			
		||||
*          double *azel     I   azimuth/elevation angle {az,el} (rad)
 | 
			
		||||
*          int    opt       I   model option
 | 
			
		||||
*                                bit0: 0:earth-fixed,1:sun-fixed
 | 
			
		||||
*                                bit1: 0:single-layer,1:modified single-layer
 | 
			
		||||
*          double *delay    O   ionospheric delay (L1) (m)
 | 
			
		||||
*          double *var      O   ionospheric dealy (L1) variance (m^2)
 | 
			
		||||
* return : status (1:ok,0:error)
 | 
			
		||||
* notes  : before calling the function, read tec grid data by calling readtec()
 | 
			
		||||
*          return ok with delay=0 and var=VAR_NOTEC if el<MIN_EL or h<MIN_HGT
 | 
			
		||||
*-----------------------------------------------------------------------------*/
 | 
			
		||||
int iontec(gtime_t time, const nav_t *nav, const double *pos,
 | 
			
		||||
        const double *azel, int opt, double *delay, double *var)
 | 
			
		||||
                  const double *azel, int opt, double *delay, double *var)
 | 
			
		||||
{
 | 
			
		||||
    double dels[2], vars[2], a, tt;
 | 
			
		||||
    int i, stat[2];
 | 
			
		||||
 | 
			
		||||
    trace(3, "iontec  : time=%s pos=%.1f %.1f azel=%.1f %.1f\n", time_str(time, 0),
 | 
			
		||||
            pos[0] * R2D, pos[1] * R2D, azel[0] * R2D, azel[1] * R2D);
 | 
			
		||||
 | 
			
		||||
    if (azel[1] < MIN_EL || pos[2] < MIN_HGT)
 | 
			
		||||
        {
 | 
			
		||||
            *delay = 0.0;
 | 
			
		||||
            *var = VAR_NOTEC;
 | 
			
		||||
            return 1;
 | 
			
		||||
        }
 | 
			
		||||
    for (i = 0; i < nav->nt; i++)
 | 
			
		||||
        {
 | 
			
		||||
            if (timediff(nav->tec[i].time, time) > 0.0) break;
 | 
			
		||||
        }
 | 
			
		||||
    if (i == 0 || i >= nav->nt)
 | 
			
		||||
        {
 | 
			
		||||
            trace(2, "%s: tec grid out of period\n", time_str(time, 0));
 | 
			
		||||
            return 0;
 | 
			
		||||
        }
 | 
			
		||||
    if ((tt = timediff(nav->tec[i].time, nav->tec[i-1].time)) == 0.0)
 | 
			
		||||
        {
 | 
			
		||||
            trace(2, "tec grid time interval error\n");
 | 
			
		||||
            return 0;
 | 
			
		||||
        }
 | 
			
		||||
    double dels[2],vars[2],a,tt;
 | 
			
		||||
    int i,stat[2];
 | 
			
		||||
    
 | 
			
		||||
    trace(3,"iontec  : time=%s pos=%.1f %.1f azel=%.1f %.1f\n",time_str(time,0),
 | 
			
		||||
          pos[0]*R2D,pos[1]*R2D,azel[0]*R2D,azel[1]*R2D);
 | 
			
		||||
    
 | 
			
		||||
    if (azel[1]<MIN_EL||pos[2]<MIN_HGT) {
 | 
			
		||||
        *delay=0.0;
 | 
			
		||||
        *var=VAR_NOTEC;
 | 
			
		||||
        return 1;
 | 
			
		||||
    }
 | 
			
		||||
    for (i=0;i<nav->nt;i++) {
 | 
			
		||||
        if (timediff(nav->tec[i].time,time)>0.0) break;
 | 
			
		||||
    }
 | 
			
		||||
    if (i==0||i>=nav->nt) {
 | 
			
		||||
        trace(2,"%s: tec grid out of period\n",time_str(time,0));
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
    if ((tt=timediff(nav->tec[i].time,nav->tec[i-1].time))==0.0) {
 | 
			
		||||
        trace(2,"tec grid time interval error\n");
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
    /* ionospheric delay by tec grid data */
 | 
			
		||||
    stat[0] = iondelay(time, nav->tec+i-1, pos, azel, opt, dels  , vars  );
 | 
			
		||||
    stat[1] = iondelay(time, nav->tec+i  , pos, azel, opt, dels+1, vars+1);
 | 
			
		||||
 | 
			
		||||
    if (!stat[0] && !stat[1])
 | 
			
		||||
        {
 | 
			
		||||
            trace(2, "%s: tec grid out of area pos=%6.2f %7.2f azel=%6.1f %5.1f\n",
 | 
			
		||||
                    time_str(time, 0), pos[0] * R2D, pos[1] * R2D, azel[0] * R2D, azel[1] * R2D);
 | 
			
		||||
            return 0;
 | 
			
		||||
        }
 | 
			
		||||
    if (stat[0] && stat[1])
 | 
			
		||||
        { /* linear interpolation by time */
 | 
			
		||||
            a = timediff(time, nav->tec[i-1].time) / tt;
 | 
			
		||||
            *delay = dels[0] * (1.0 - a) + dels[1] * a;
 | 
			
		||||
            *var   = vars[0] * (1.0 - a) + vars[1] * a;
 | 
			
		||||
        }
 | 
			
		||||
    else if (stat[0])
 | 
			
		||||
        { /* nearest-neighbour extrapolation by time */
 | 
			
		||||
            *delay = dels[0];
 | 
			
		||||
            *var   = vars[0];
 | 
			
		||||
        }
 | 
			
		||||
    else
 | 
			
		||||
        {
 | 
			
		||||
            *delay = dels[1];
 | 
			
		||||
            *var   = vars[1];
 | 
			
		||||
        }
 | 
			
		||||
    trace(3, "iontec  : delay=%5.2f std=%5.2f\n", *delay, sqrt(*var));
 | 
			
		||||
    stat[0]=iondelay(time,nav->tec+i-1,pos,azel,opt,dels  ,vars  );
 | 
			
		||||
    stat[1]=iondelay(time,nav->tec+i  ,pos,azel,opt,dels+1,vars+1);
 | 
			
		||||
    
 | 
			
		||||
    if (!stat[0]&&!stat[1]) {
 | 
			
		||||
        trace(2,"%s: tec grid out of area pos=%6.2f %7.2f azel=%6.1f %5.1f\n",
 | 
			
		||||
              time_str(time,0),pos[0]*R2D,pos[1]*R2D,azel[0]*R2D,azel[1]*R2D);
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
    if (stat[0]&&stat[1]) { /* linear interpolation by time */
 | 
			
		||||
        a=timediff(time,nav->tec[i-1].time)/tt;
 | 
			
		||||
        *delay=dels[0]*(1.0-a)+dels[1]*a;
 | 
			
		||||
        *var  =vars[0]*(1.0-a)+vars[1]*a;
 | 
			
		||||
    }
 | 
			
		||||
    else if (stat[0]) { /* nearest-neighbour extrapolation by time */
 | 
			
		||||
        *delay=dels[0];
 | 
			
		||||
        *var  =vars[0];
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
        *delay=dels[1];
 | 
			
		||||
        *var  =vars[1];
 | 
			
		||||
    }
 | 
			
		||||
    trace(3,"iontec  : delay=%5.2f std=%5.2f\n",*delay,sqrt(*var));
 | 
			
		||||
    return 1;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*!
 | 
			
		||||
 * \file rtklib_ionex.h
 | 
			
		||||
 * \file rtklib_ionex.cc
 | 
			
		||||
 * \brief ionex functions
 | 
			
		||||
 * \authors <ul>
 | 
			
		||||
 *          <li> 2007-2013, T. Takasu
 | 
			
		||||
@@ -47,24 +47,29 @@
 | 
			
		||||
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 *
 | 
			
		||||
 * References:
 | 
			
		||||
 *     [1] S.Schear, W.Gurtner and J.Feltens, IONEX: The IONosphere Map EXchange
 | 
			
		||||
 *         Format Version 1, February 25, 1998
 | 
			
		||||
 *     [2] S.Schaer, R.Markus, B.Gerhard and A.S.Timon, Daily Global Ionosphere
 | 
			
		||||
 *         Maps based on GPS Carrier Phase Data Routinely producted by CODE
 | 
			
		||||
 *         Analysis Center, Proceeding of the IGS Analysis Center Workshop, 1996
 | 
			
		||||
 *
 | 
			
		||||
 *-----------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
#ifndef GNSS_SDR_RTKLIB_IONEX_H_
 | 
			
		||||
#define GNSS_SDR_RTKLIB_IONEX_H_
 | 
			
		||||
*
 | 
			
		||||
* references:
 | 
			
		||||
*     [1] S.Schear, W.Gurtner and J.Feltens, IONEX: The IONosphere Map EXchange
 | 
			
		||||
*         Format Version 1, February 25, 1998
 | 
			
		||||
*     [2] S.Schaer, R.Markus, B.Gerhard and A.S.Timon, Daily Global Ionosphere
 | 
			
		||||
*         Maps based on GPS Carrier Phase Data Routinely producted by CODE
 | 
			
		||||
*         Analysis Center, Proceeding of the IGS Analysis Center Workshop, 1996
 | 
			
		||||
*
 | 
			
		||||
* version : $Revision:$ $Date:$
 | 
			
		||||
* history : 2011/03/29 1.0 new
 | 
			
		||||
*           2013/03/05 1.1 change api readtec()
 | 
			
		||||
*                          fix problem in case of lat>85deg or lat<-85deg
 | 
			
		||||
*           2014/02/22 1.2 fix problem on compiled as C++
 | 
			
		||||
*-----------------------------------------------------------------------------*/
 | 
			
		||||
#ifndef RTKLIB_IONEX_H_
 | 
			
		||||
#define RTKLIB_IONEX_H_
 | 
			
		||||
 | 
			
		||||
#include "rtklib_rtkcmn.h"
 | 
			
		||||
 | 
			
		||||
const double VAR_NOTEC = 30.0 * 30.0;   /* variance of no tec */
 | 
			
		||||
const double MIN_EL = 0.0;         /* min elevation angle (rad) */
 | 
			
		||||
const double MIN_HGT = -1000.0;     /* min user height (m) */
 | 
			
		||||
#define SQR(x)      ((x)*(x))
 | 
			
		||||
#define VAR_NOTEC   SQR(30.0)   /* variance of no tec */
 | 
			
		||||
#define MIN_EL      0.0         /* min elevation angle (rad) */
 | 
			
		||||
#define MIN_HGT     -1000.0     /* min user height (m) */
 | 
			
		||||
 | 
			
		||||
int getindex(double value, const double *range);
 | 
			
		||||
 | 
			
		||||
@@ -87,4 +92,4 @@ int iondelay(gtime_t time, const tec_t *tec, const double *pos,
 | 
			
		||||
int iontec(gtime_t time, const nav_t *nav, const double *pos,
 | 
			
		||||
                  const double *azel, int opt, double *delay, double *var);
 | 
			
		||||
 | 
			
		||||
#endif /* GNSS_SDR_RTKLIB_IONEX_H_ */
 | 
			
		||||
#endif /* SRC_ALGORITHMS_PVT_LIBS_RTKLIB_IONEX_H_ */
 | 
			
		||||
 
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -48,10 +48,22 @@
 | 
			
		||||
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 *
 | 
			
		||||
 *-----------------------------------------------------------------------------*/
 | 
			
		||||
* history : 2010/07/28 1.0  moved from rtkcmn.c
 | 
			
		||||
*                           changed api:
 | 
			
		||||
*                               pntpos()
 | 
			
		||||
*                           deleted api:
 | 
			
		||||
*                               pntvel()
 | 
			
		||||
*           2011/01/12 1.1  add option to include unhealthy satellite
 | 
			
		||||
*                           reject duplicated observation data
 | 
			
		||||
*                           changed api: ionocorr()
 | 
			
		||||
*           2011/11/08 1.2  enable snr mask for single-mode (rtklib_2.4.1_p3)
 | 
			
		||||
*           2012/12/25 1.3  add variable snr mask
 | 
			
		||||
*           2014/05/26 1.4  support galileo and beidou
 | 
			
		||||
*           2015/03/19 1.5  fix bug on ionosphere correction for GLO and BDS
 | 
			
		||||
*-----------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
#ifndef GNSS_SDR_RTKLIB_PNTPOS_H_
 | 
			
		||||
#define GNSS_SDR_RTKLIB_PNTPOS_H_
 | 
			
		||||
#ifndef RTKLIB_PNTPOS_H_
 | 
			
		||||
#define RTKLIB_PNTPOS_H_
 | 
			
		||||
 | 
			
		||||
#include "rtklib.h"
 | 
			
		||||
#include "rtklib_rtkcmn.h"
 | 
			
		||||
@@ -165,4 +177,4 @@ int pntpos(const obsd_t *obs, int n, const nav_t *nav,
 | 
			
		||||
                  const prcopt_t *opt, sol_t *sol, double *azel, ssat_t *ssat,
 | 
			
		||||
                  char *msg);
 | 
			
		||||
 | 
			
		||||
#endif /* GNSS_SDR_RTKLIB_PNTPOS_H_ */
 | 
			
		||||
#endif /* RTKLIB_PNTPOS_H_ */
 | 
			
		||||
 
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -48,29 +48,57 @@
 | 
			
		||||
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 *
 | 
			
		||||
 *
 | 
			
		||||
 * References :
 | 
			
		||||
 *     [1] S.Hilla, The Extended Standard Product 3 Orbit Format (SP3-c),
 | 
			
		||||
 *         12 February, 2007
 | 
			
		||||
 *     [2] J.Ray, W.Gurtner, RINEX Extensions to Handle Clock Information,
 | 
			
		||||
 *         27 August, 1998
 | 
			
		||||
 *     [3] D.D.McCarthy, IERS Technical Note 21, IERS Conventions 1996, July 1996
 | 
			
		||||
 *     [4] D.A.Vallado, Fundamentals of Astrodynamics and Applications 2nd ed,
 | 
			
		||||
 *         Space Technology Library, 2004
 | 
			
		||||
 *
 | 
			
		||||
 *-----------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
#ifndef GNSS_SDR_RTKLIB_PRECEPH_H_
 | 
			
		||||
#define GNSS_SDR_RTKLIB_PRECEPH_H_
 | 
			
		||||
*
 | 
			
		||||
* references :
 | 
			
		||||
*     [1] S.Hilla, The Extended Standard Product 3 Orbit Format (SP3-c),
 | 
			
		||||
*         12 February, 2007
 | 
			
		||||
*     [2] J.Ray, W.Gurtner, RINEX Extensions to Handle Clock Information,
 | 
			
		||||
*         27 August, 1998
 | 
			
		||||
*     [3] D.D.McCarthy, IERS Technical Note 21, IERS Conventions 1996, July 1996
 | 
			
		||||
*     [4] D.A.Vallado, Fundamentals of Astrodynamics and Applications 2nd ed,
 | 
			
		||||
*         Space Technology Library, 2004
 | 
			
		||||
*
 | 
			
		||||
* version : $Revision: 1.1 $ $Date: 2008/07/17 21:48:06 $
 | 
			
		||||
* history : 2009/01/18 1.0  new
 | 
			
		||||
*           2009/01/31 1.1  fix bug on numerical error to read sp3a ephemeris
 | 
			
		||||
*           2009/05/15 1.2  support glonass,galileo,qzs
 | 
			
		||||
*           2009/12/11 1.3  support wild-card expansion of file path
 | 
			
		||||
*           2010/07/21 1.4  added api:
 | 
			
		||||
*                               eci2ecef(),sunmoonpos(),peph2pos(),satantoff(),
 | 
			
		||||
*                               readdcb()
 | 
			
		||||
*                           changed api:
 | 
			
		||||
*                               readsp3()
 | 
			
		||||
*                           deleted api:
 | 
			
		||||
*                               eph2posp()
 | 
			
		||||
*           2010/09/09 1.5  fix problem when precise clock outage
 | 
			
		||||
*           2011/01/23 1.6  support qzss satellite code
 | 
			
		||||
*           2011/09/12 1.7  fix problem on precise clock outage
 | 
			
		||||
*                           move sunmmonpos() to rtkcmn.c
 | 
			
		||||
*           2011/12/01 1.8  modify api readsp3()
 | 
			
		||||
*                           precede later ephemeris if ephemeris is NULL
 | 
			
		||||
*                           move eci2ecef() to rtkcmn.c
 | 
			
		||||
*           2013/05/08 1.9  fix bug on computing std-dev of precise clocks
 | 
			
		||||
*           2013/11/20 1.10 modify option for api readsp3()
 | 
			
		||||
*           2014/04/03 1.11 accept extenstion including sp3,eph,SP3,EPH
 | 
			
		||||
*           2014/05/23 1.12 add function to read sp3 velocity records
 | 
			
		||||
*                           change api: satantoff()
 | 
			
		||||
*           2014/08/31 1.13 add member cov and vco in peph_t sturct
 | 
			
		||||
*           2014/10/13 1.14 fix bug on clock error variance in peph2pos()
 | 
			
		||||
*           2015/05/10 1.15 add api readfcb()
 | 
			
		||||
*                           modify api readdcb()
 | 
			
		||||
*-----------------------------------------------------------------------------*/
 | 
			
		||||
#ifndef RTKLIB_PRECEPH_H_
 | 
			
		||||
#define RTKLIB_PRECEPH_H_
 | 
			
		||||
 | 
			
		||||
#include "rtklib.h"
 | 
			
		||||
#include "rtklib_rtkcmn.h"
 | 
			
		||||
 | 
			
		||||
#define SQR(x)      ((x)*(x))
 | 
			
		||||
 | 
			
		||||
const int NMAX = 10;              /* order of polynomial interpolation */
 | 
			
		||||
const double MAXDTE = 900.0;      /* max time difference to ephem time (s) */
 | 
			
		||||
const double EXTERR_CLK = 1e-3;   /* extrapolation error for clock (m/s) */
 | 
			
		||||
const double EXTERR_EPH = 5e-7;   /* extrapolation error for ephem (m/s^2) */
 | 
			
		||||
#define NMAX        10              /* order of polynomial interpolation */
 | 
			
		||||
#define MAXDTE      900.0           /* max time difference to ephem time (s) */
 | 
			
		||||
#define EXTERR_CLK  1E-3            /* extrapolation error for clock (m/s) */
 | 
			
		||||
#define EXTERR_EPH  5E-7            /* extrapolation error for ephem (m/s^2) */
 | 
			
		||||
 | 
			
		||||
int code2sys(char code);
 | 
			
		||||
int readsp3h(FILE *fp, gtime_t *time, char *type, int *sats,
 | 
			
		||||
@@ -105,4 +133,4 @@ void satantoff(gtime_t time, const double *rs, int sat, const nav_t *nav,
 | 
			
		||||
int peph2pos(gtime_t time, int sat, const nav_t *nav, int opt,
 | 
			
		||||
                    double *rs, double *dts, double *var);
 | 
			
		||||
 | 
			
		||||
#endif // GNSS_SDR_RTKLIB_PRECEPH_H_
 | 
			
		||||
#endif //RTKLIB_PRECEPH_H_
 | 
			
		||||
 
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -48,44 +48,132 @@
 | 
			
		||||
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 *
 | 
			
		||||
 *
 | 
			
		||||
 * options : -DLAPACK   use LAPACK/BLAS
 | 
			
		||||
 *           -DMKL      use Intel MKL
 | 
			
		||||
 *           -DTRACE    enable debug trace
 | 
			
		||||
 *           -DWIN32    use WIN32 API
 | 
			
		||||
 *           -DNOCALLOC no use calloc for zero matrix
 | 
			
		||||
 *           -DIERS_MODEL use GMF instead of NMF
 | 
			
		||||
 *           -DDLL      built for shared library
 | 
			
		||||
 *           -DCPUTIME_IN_GPST cputime operated in gpst
 | 
			
		||||
 *
 | 
			
		||||
 * references :
 | 
			
		||||
 *     [1] IS-GPS-200D, Navstar GPS Space Segment/Navigation User Interfaces,
 | 
			
		||||
 *         7 March, 2006
 | 
			
		||||
 *     [2] RTCA/DO-229C, Minimum operational performanc standards for global
 | 
			
		||||
 *         positioning system/wide area augmentation system airborne equipment,
 | 
			
		||||
 *         RTCA inc, November 28, 2001
 | 
			
		||||
 *     [3] M.Rothacher, R.Schmid, ANTEX: The Antenna Exchange Format Version 1.4,
 | 
			
		||||
 *         15 September, 2010
 | 
			
		||||
 *     [4] A.Gelb ed., Applied Optimal Estimation, The M.I.T Press, 1974
 | 
			
		||||
 *     [5] A.E.Niell, Global mapping functions for the atmosphere delay at radio
 | 
			
		||||
 *         wavelengths, Jounal of geophysical research, 1996
 | 
			
		||||
 *     [6] W.Gurtner and L.Estey, RINEX The Receiver Independent Exchange Format
 | 
			
		||||
 *         Version 3.00, November 28, 2007
 | 
			
		||||
 *     [7] J.Kouba, A Guide to using International GNSS Service (IGS) products,
 | 
			
		||||
 *         May 2009
 | 
			
		||||
 *     [8] China Satellite Navigation Office, BeiDou navigation satellite system
 | 
			
		||||
 *         signal in space interface control document, open service signal B1I
 | 
			
		||||
 *         (version 1.0), Dec 2012
 | 
			
		||||
 *     [9] J.Boehm, A.Niell, P.Tregoning and H.Shuh, Global Mapping Function
 | 
			
		||||
 *         (GMF): A new empirical mapping function base on numerical weather
 | 
			
		||||
 *         model data, Geophysical Research Letters, 33, L07304, 2006
 | 
			
		||||
 *     [10] GLONASS/GPS/Galileo/Compass/SBAS NV08C receiver series BINR interface
 | 
			
		||||
 *         protocol specification ver.1.3, August, 2012
 | 
			
		||||
 *
 | 
			
		||||
 *-----------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
#ifndef GNSS_SDR_RTKLIB_RTKCMN_H_
 | 
			
		||||
#define GNSS_SDR_RTKLIB_RTKCMN_H_
 | 
			
		||||
*
 | 
			
		||||
* options : -DLAPACK   use LAPACK/BLAS
 | 
			
		||||
*           -DMKL      use Intel MKL
 | 
			
		||||
*           -DTRACE    enable debug trace
 | 
			
		||||
*           -DWIN32    use WIN32 API
 | 
			
		||||
*           -DNOCALLOC no use calloc for zero matrix
 | 
			
		||||
*           -DIERS_MODEL use GMF instead of NMF
 | 
			
		||||
*           -DDLL      built for shared library
 | 
			
		||||
*           -DCPUTIME_IN_GPST cputime operated in gpst
 | 
			
		||||
*
 | 
			
		||||
* references :
 | 
			
		||||
*     [1] IS-GPS-200D, Navstar GPS Space Segment/Navigation User Interfaces,
 | 
			
		||||
*         7 March, 2006
 | 
			
		||||
*     [2] RTCA/DO-229C, Minimum operational performanc standards for global
 | 
			
		||||
*         positioning system/wide area augmentation system airborne equipment,
 | 
			
		||||
*         RTCA inc, November 28, 2001
 | 
			
		||||
*     [3] M.Rothacher, R.Schmid, ANTEX: The Antenna Exchange Format Version 1.4,
 | 
			
		||||
*         15 September, 2010
 | 
			
		||||
*     [4] A.Gelb ed., Applied Optimal Estimation, The M.I.T Press, 1974
 | 
			
		||||
*     [5] A.E.Niell, Global mapping functions for the atmosphere delay at radio
 | 
			
		||||
*         wavelengths, Jounal of geophysical research, 1996
 | 
			
		||||
*     [6] W.Gurtner and L.Estey, RINEX The Receiver Independent Exchange Format
 | 
			
		||||
*         Version 3.00, November 28, 2007
 | 
			
		||||
*     [7] J.Kouba, A Guide to using International GNSS Service (IGS) products,
 | 
			
		||||
*         May 2009
 | 
			
		||||
*     [8] China Satellite Navigation Office, BeiDou navigation satellite system
 | 
			
		||||
*         signal in space interface control document, open service signal B1I
 | 
			
		||||
*         (version 1.0), Dec 2012
 | 
			
		||||
*     [9] J.Boehm, A.Niell, P.Tregoning and H.Shuh, Global Mapping Function
 | 
			
		||||
*         (GMF): A new empirical mapping function base on numerical weather
 | 
			
		||||
*         model data, Geophysical Research Letters, 33, L07304, 2006
 | 
			
		||||
*     [10] GLONASS/GPS/Galileo/Compass/SBAS NV08C receiver series BINR interface
 | 
			
		||||
*         protocol specification ver.1.3, August, 2012
 | 
			
		||||
*
 | 
			
		||||
* version : $Revision: 1.1 $ $Date: 2008/07/17 21:48:06 $
 | 
			
		||||
* history : 2007/01/12 1.0 new
 | 
			
		||||
*           2007/03/06 1.1 input initial rover pos of pntpos()
 | 
			
		||||
*                          update only effective states of filter()
 | 
			
		||||
*                          fix bug of atan2() domain error
 | 
			
		||||
*           2007/04/11 1.2 add function antmodel()
 | 
			
		||||
*                          add gdop mask for pntpos()
 | 
			
		||||
*                          change constant MAXDTOE value
 | 
			
		||||
*           2007/05/25 1.3 add function execcmd(),expandpath()
 | 
			
		||||
*           2008/06/21 1.4 add funciton sortobs(),uniqeph(),screent()
 | 
			
		||||
*                          replace geodist() by sagnac correction way
 | 
			
		||||
*           2008/10/29 1.5 fix bug of ionosphereic mapping function
 | 
			
		||||
*                          fix bug of seasonal variation term of tropmapf
 | 
			
		||||
*           2008/12/27 1.6 add function tickget(), sleepms(), tracenav(),
 | 
			
		||||
*                          xyz2enu(), satposv(), pntvel(), covecef()
 | 
			
		||||
*           2009/03/12 1.7 fix bug on error-stop when localtime() returns NULL
 | 
			
		||||
*           2009/03/13 1.8 fix bug on time adjustment for summer time
 | 
			
		||||
*           2009/04/10 1.9 add function adjgpsweek(),getbits(),getbitu()
 | 
			
		||||
*                          add function geph2pos()
 | 
			
		||||
*           2009/06/08 1.10 add function seph2pos()
 | 
			
		||||
*           2009/11/28 1.11 change function pntpos()
 | 
			
		||||
*                           add function tracegnav(),tracepeph()
 | 
			
		||||
*           2009/12/22 1.12 change default parameter of ionos std
 | 
			
		||||
*                           valid under second for timeget()
 | 
			
		||||
*           2010/07/28 1.13 fix bug in tropmapf()
 | 
			
		||||
*                           added api:
 | 
			
		||||
*                               obs2code(),code2obs(),cross3(),normv3(),
 | 
			
		||||
*                               gst2time(),time2gst(),time_str(),timeset(),
 | 
			
		||||
*                               deg2dms(),dms2deg(),searchpcv(),antmodel_s(),
 | 
			
		||||
*                               tracehnav(),tracepclk(),reppath(),reppaths(),
 | 
			
		||||
*                               createdir()
 | 
			
		||||
*                           changed api:
 | 
			
		||||
*                               readpcv(),
 | 
			
		||||
*                           deleted api:
 | 
			
		||||
*                               uniqeph()
 | 
			
		||||
*           2010/08/20 1.14 omit to include mkl header files
 | 
			
		||||
*                           fix bug on chi-sqr(n) table
 | 
			
		||||
*           2010/12/11 1.15 added api:
 | 
			
		||||
*                               freeobs(),freenav(),ionppp()
 | 
			
		||||
*           2011/05/28 1.16 fix bug on half-hour offset by time2epoch()
 | 
			
		||||
*                           added api:
 | 
			
		||||
*                               uniqnav()
 | 
			
		||||
*           2012/06/09 1.17 add a leap second after 2012-6-30
 | 
			
		||||
*           2012/07/15 1.18 add api setbits(),setbitu(),utc2gmst()
 | 
			
		||||
*                           fix bug on interpolation of antenna pcv
 | 
			
		||||
*                           fix bug on str2num() for string with over 256 char
 | 
			
		||||
*                           add api readblq(),satexclude(),setcodepri(),
 | 
			
		||||
*                           getcodepri()
 | 
			
		||||
*                           change api obs2code(),code2obs(),antmodel()
 | 
			
		||||
*           2012/12/25 1.19 fix bug on satwavelen(),code2obs(),obs2code()
 | 
			
		||||
*                           add api testsnr()
 | 
			
		||||
*           2013/01/04 1.20 add api gpst2bdt(),bdt2gpst(),bdt2time(),time2bdt()
 | 
			
		||||
*                           readblq(),readerp(),geterp(),crc16()
 | 
			
		||||
*                           change api eci2ecef(),sunmoonpos()
 | 
			
		||||
*           2013/03/26 1.21 tickget() uses clock_gettime() for linux
 | 
			
		||||
*           2013/05/08 1.22 fix bug on nutation coefficients for ast_args()
 | 
			
		||||
*           2013/06/02 1.23 add #ifdef for undefined CLOCK_MONOTONIC_RAW
 | 
			
		||||
*           2013/09/01 1.24 fix bug on interpolation of satellite antenna pcv
 | 
			
		||||
*           2013/09/06 1.25 fix bug on extrapolation of erp
 | 
			
		||||
*           2014/04/27 1.26 add SYS_LEO for satellite system
 | 
			
		||||
*                           add BDS L1 code for RINEX 3.02 and RTCM 3.2
 | 
			
		||||
*                           support BDS L1 in satwavelen()
 | 
			
		||||
*           2014/05/29 1.27 fix bug on obs2code() to search obs code table
 | 
			
		||||
*           2014/08/26 1.28 fix problem on output of uncompress() for tar file
 | 
			
		||||
*                           add function to swap trace file with keywords
 | 
			
		||||
*           2014/10/21 1.29 strtok() -> strtok_r() in expath() for thread-safe
 | 
			
		||||
*                           add bdsmodear in procopt_default
 | 
			
		||||
*           2015/03/19 1.30 fix bug on interpolation of erp values in geterp()
 | 
			
		||||
*                           add leap second insertion before 2015/07/01 00:00
 | 
			
		||||
*                           add api read_leaps()
 | 
			
		||||
*           2015/05/31 1.31 delte api windupcorr()
 | 
			
		||||
*           2015/08/08 1.32 add compile option CPUTIME_IN_GPST
 | 
			
		||||
*                           add api add_fatal()
 | 
			
		||||
*                           support usno leapsec.dat for api read_leaps()
 | 
			
		||||
*           2016/01/23 1.33 enable septentrio
 | 
			
		||||
*           2016/02/05 1.34 support GLONASS for savenav(), loadnav()
 | 
			
		||||
*           2016/06/11 1.35 delete trace() in reppath() to avoid deadlock
 | 
			
		||||
*           2016/07/01 1.36 support IRNSS
 | 
			
		||||
*                           add leap second before 2017/1/1 00:00:00
 | 
			
		||||
*           2016/07/29 1.37 rename api compress() -> rtk_uncompress()
 | 
			
		||||
*                           rename api crc16()    -> rtk_crc16()
 | 
			
		||||
*                           rename api crc24q()   -> rtk_crc24q()
 | 
			
		||||
*                           rename api crc32()    -> rtk_crc32()
 | 
			
		||||
*           2016/08/20 1.38 fix type incompatibility in win64 environment
 | 
			
		||||
*                           change constant _POSIX_C_SOURCE 199309 -> 199506
 | 
			
		||||
*           2016/08/21 1.39 fix bug on week overflow in time2gpst()/gpst2time()
 | 
			
		||||
*           2016/09/05 1.40 fix bug on invalid nav data read in readnav()
 | 
			
		||||
*           2016/09/17 1.41 suppress warnings
 | 
			
		||||
*           2016/09/19 1.42 modify api deg2dms() to consider numerical error
 | 
			
		||||
*-----------------------------------------------------------------------------*/
 | 
			
		||||
#ifndef RTKLIB_RTKCMN_H_
 | 
			
		||||
#define RTKLIB_RTKCMN_H_
 | 
			
		||||
 | 
			
		||||
#include "rtklib.h"
 | 
			
		||||
 | 
			
		||||
@@ -272,4 +360,4 @@ void csmooth(obs_t *obs, int ns);
 | 
			
		||||
int rtk_uncompress(const char *file, char *uncfile);
 | 
			
		||||
int expath(const char *path, char *paths[], int nmax);
 | 
			
		||||
 | 
			
		||||
#endif /* GNSS_SDR_RTKLIB_RTKCMN_H_ */
 | 
			
		||||
#endif /* RTKLIB_RTKCMN_H_ */
 | 
			
		||||
 
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -48,21 +48,43 @@
 | 
			
		||||
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 *
 | 
			
		||||
 *
 | 
			
		||||
 * option : -DRRCENA  enable rrc correction
 | 
			
		||||
 *
 | 
			
		||||
 * References :
 | 
			
		||||
 *     [1] RTCA/DO-229C, Minimum operational performanc standards for global
 | 
			
		||||
 *         positioning system/wide area augmentation system airborne equipment,
 | 
			
		||||
 *         RTCA inc, November 28, 2001
 | 
			
		||||
 *     [2] IS-QZSS v.1.1, Quasi-Zenith Satellite System Navigation Service
 | 
			
		||||
 *         Interface Specification for QZSS, Japan Aerospace Exploration Agency,
 | 
			
		||||
 *         July 31, 2009
 | 
			
		||||
 *
 | 
			
		||||
 *-----------------------------------------------------------------------------*/
 | 
			
		||||
*
 | 
			
		||||
* option : -DRRCENA  enable rrc correction
 | 
			
		||||
*
 | 
			
		||||
* references :
 | 
			
		||||
*     [1] RTCA/DO-229C, Minimum operational performanc standards for global
 | 
			
		||||
*         positioning system/wide area augmentation system airborne equipment,
 | 
			
		||||
*         RTCA inc, November 28, 2001
 | 
			
		||||
*     [2] IS-QZSS v.1.1, Quasi-Zenith Satellite System Navigation Service
 | 
			
		||||
*         Interface Specification for QZSS, Japan Aerospace Exploration Agency,
 | 
			
		||||
*         July 31, 2009
 | 
			
		||||
*
 | 
			
		||||
* version : $Revision: 1.1 $ $Date: 2008/07/17 21:48:06 $
 | 
			
		||||
* history : 2007/10/14 1.0  new
 | 
			
		||||
*           2009/01/24 1.1  modify sbspntpos() api
 | 
			
		||||
*                           improve fast/ion correction update
 | 
			
		||||
*           2009/04/08 1.2  move function crc24q() to rcvlog.c
 | 
			
		||||
*                           support glonass, galileo and qzss
 | 
			
		||||
*           2009/06/08 1.3  modify sbsupdatestat()
 | 
			
		||||
*                           delete sbssatpos()
 | 
			
		||||
*           2009/12/12 1.4  support glonass
 | 
			
		||||
*           2010/01/22 1.5  support ems (egnos message service) format
 | 
			
		||||
*           2010/06/10 1.6  added api:
 | 
			
		||||
*                               sbssatcorr(),sbstropcorr(),sbsioncorr(),
 | 
			
		||||
*                               sbsupdatecorr()
 | 
			
		||||
*                           changed api:
 | 
			
		||||
*                               sbsreadmsgt(),sbsreadmsg()
 | 
			
		||||
*                           deleted api:
 | 
			
		||||
*                               sbspntpos(),sbsupdatestat()
 | 
			
		||||
*           2010/08/16 1.7  not reject udre==14 or give==15 correction message
 | 
			
		||||
*                           (2.4.0_p4)
 | 
			
		||||
*           2011/01/15 1.8  use api ionppp()
 | 
			
		||||
*                           add prn mask of qzss for qzss L1SAIF
 | 
			
		||||
*           2016/07/29 1.9  crc24q() -> rtk_crc24q()
 | 
			
		||||
*-----------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
#ifndef GNSS_SDR_RTKLIB_SBAS_H_
 | 
			
		||||
#define GNSS_SDR_RTKLIB_SBAS_H_
 | 
			
		||||
#ifndef RTKLIB_SBAS_H_
 | 
			
		||||
#define RTKLIB_SBAS_H_
 | 
			
		||||
 | 
			
		||||
#include "rtklib.h"
 | 
			
		||||
#include "rtklib_rtkcmn.h"
 | 
			
		||||
@@ -72,51 +94,51 @@
 | 
			
		||||
 | 
			
		||||
/* sbas igp definition -------------------------------------------------------*/
 | 
			
		||||
static const short
 | 
			
		||||
x1[] = {-75, -65, -55, -50, -45, -40, -35, -30, -25, -20, -15, -10, - 5,  0,  5, 10, 15, 20,
 | 
			
		||||
x1[]={-75,-65,-55,-50,-45,-40,-35,-30,-25,-20,-15,-10,- 5,  0,  5, 10, 15, 20,
 | 
			
		||||
       25, 30, 35, 40, 45, 50, 55, 65, 75, 85},
 | 
			
		||||
x2[] = {-55, -50, -45, -40, -35, -30, -25, -20, -15, -10, -5,  0,  5, 10, 15, 20, 25, 30,
 | 
			
		||||
x2[]={-55,-50,-45,-40,-35,-30,-25,-20,-15,-10, -5,  0,  5, 10, 15, 20, 25, 30,
 | 
			
		||||
       35, 40, 45, 50, 55},
 | 
			
		||||
x3[] = {-75, -65, -55, -50, -45, -40, -35, -30, -25, -20, -15, -10, - 5,  0,  5, 10, 15, 20,
 | 
			
		||||
x3[]={-75,-65,-55,-50,-45,-40,-35,-30,-25,-20,-15,-10,- 5,  0,  5, 10, 15, 20,
 | 
			
		||||
       25, 30, 35, 40, 45, 50, 55, 65, 75},
 | 
			
		||||
x4[] = {-85, -75, -65, -55, -50, -45, -40, -35, -30, -25, -20, -15, -10, - 5,  0,  5, 10, 15,
 | 
			
		||||
x4[]={-85,-75,-65,-55,-50,-45,-40,-35,-30,-25,-20,-15,-10,- 5,  0,  5, 10, 15,
 | 
			
		||||
       20, 25, 30, 35, 40, 45, 50, 55, 65, 75},
 | 
			
		||||
x5[] = {-180, -175, -170, -165, -160, -155, -150, -145, -140, -135, -130, -125, -120, -115,
 | 
			
		||||
      -110, -105, -100, - 95, - 90, - 85, - 80, - 75, - 70, - 65, - 60, - 55, - 50, - 45,
 | 
			
		||||
      - 40, - 35, - 30, - 25, - 20, - 15, - 10, -  5,   0,   5,  10,  15,  20,  25,
 | 
			
		||||
x5[]={-180,-175,-170,-165,-160,-155,-150,-145,-140,-135,-130,-125,-120,-115,
 | 
			
		||||
      -110,-105,-100,- 95,- 90,- 85,- 80,- 75,- 70,- 65,- 60,- 55,- 50,- 45,
 | 
			
		||||
      - 40,- 35,- 30,- 25,- 20,- 15,- 10,-  5,   0,   5,  10,  15,  20,  25,
 | 
			
		||||
        30,  35,  40,  45,  50,  55,  60,  65,  70,  75,  80,  85,  90,  95,
 | 
			
		||||
       100, 105, 110, 115, 120, 125, 130, 135, 140, 145, 150, 155, 160, 165,
 | 
			
		||||
       170, 175},
 | 
			
		||||
x6[] = {-180, -170, -160, -150, -140, -130, -120, -110, -100, - 90, - 80, - 70, - 60, - 50,
 | 
			
		||||
      - 40, - 30, - 20, - 10,   0,  10,  20,  30,  40,  50,  60,  70,  80,  90,
 | 
			
		||||
x6[]={-180,-170,-160,-150,-140,-130,-120,-110,-100,- 90,- 80,- 70,- 60,- 50,
 | 
			
		||||
      - 40,- 30,- 20,- 10,   0,  10,  20,  30,  40,  50,  60,  70,  80,  90,
 | 
			
		||||
       100, 110, 120, 130, 140, 150, 160, 170},
 | 
			
		||||
x7[] = {-180, -150, -120, - 90, - 60, - 30,   0,  30,  60,  90, 120, 150},
 | 
			
		||||
x8[] = {-170, -140, -110, - 80, - 50, - 20,  10,  40,  70, 100, 130, 160};
 | 
			
		||||
x7[]={-180,-150,-120,- 90,- 60,- 30,   0,  30,  60,  90, 120, 150},
 | 
			
		||||
x8[]={-170,-140,-110,- 80,- 50,- 20,  10,  40,  70, 100, 130, 160};
 | 
			
		||||
 | 
			
		||||
const sbsigpband_t igpband1[9][8] = { /* band 0-8 */
 | 
			
		||||
    {{-180, x1,  1, 28}, {-175, x2, 29, 51}, {-170, x3, 52, 78}, {-165, x2, 79, 101},
 | 
			
		||||
     {-160, x3, 102, 128}, {-155, x2, 129, 151}, {-150, x3, 152, 178}, {-145, x2, 179, 201}},
 | 
			
		||||
    {{-140, x4,  1, 28}, {-135, x2, 29, 51}, {-130, x3, 52, 78}, {-125, x2, 79, 101},
 | 
			
		||||
     {-120, x3, 102, 128}, {-115, x2, 129, 151}, {-110, x3, 152, 178}, {-105, x2, 179, 201}},
 | 
			
		||||
    {{-100, x3,  1, 27}, {- 95,x2, 28, 50},{- 90, x1, 51, 78}, {- 85, x2, 79, 101},
 | 
			
		||||
     {- 80, x3, 102, 128}, {- 75, x2, 129, 151}, {- 70, x3, 152, 178}, {- 65, x2,179, 201}},
 | 
			
		||||
    {{- 60, x3,  1, 27}, {- 55, x2, 28, 50}, {- 50,x4, 51, 78}, {- 45, x2, 79, 101},
 | 
			
		||||
     {- 40, x3, 102, 128}, {- 35, x2, 129, 151}, {- 30, x3, 152, 178}, {- 25, x2, 179, 201}},
 | 
			
		||||
    {{- 20, x3,  1, 27}, {- 15, x2, 28, 50}, {- 10, x3, 51, 77}, {-  5, x2, 78, 100},
 | 
			
		||||
     {   0, x1, 101, 128}, {   5, x2, 129, 151}, {  10, x3, 152, 178}, {  15, x2, 179, 201}},
 | 
			
		||||
    {{  20, x3,  1, 27}, {  25, x2, 28, 50}, {  30, x3, 51, 77}, {  35, x2, 78, 100},
 | 
			
		||||
     {  40, x4, 101, 128}, {  45, x2, 129, 151},{  50, x3, 152, 178}, {  55, x2, 179, 201}},
 | 
			
		||||
    {{  60, x3,  1, 27}, {  65, x2, 28, 50}, {  70, x3, 51, 77}, {  75, x2, 78, 100},
 | 
			
		||||
     {  80, x3, 101, 127}, {  85, x2, 128, 150}, {  90,x1, 151, 178}, {  95, x2, 179, 201}},
 | 
			
		||||
    {{ 100, x3,  1, 27}, { 105, x2, 28, 50}, { 110, x3, 51, 77}, { 115, x2, 78 ,100},
 | 
			
		||||
     { 120, x3, 101, 127}, { 125, x2, 128, 150}, { 130, x4, 151, 178}, { 135, x2, 179, 201}},
 | 
			
		||||
    {{ 140, x3,  1, 27}, { 145, x2, 28, 50}, { 150, x3, 51, 77}, { 155, x2, 78, 100},
 | 
			
		||||
     { 160, x3, 101, 127}, { 165, x2,128, 150}, { 170, x3,151,177}, { 175, x2, 178, 200}}
 | 
			
		||||
const sbsigpband_t igpband1[9][8]={ /* band 0-8 */
 | 
			
		||||
    {{-180,x1,  1, 28},{-175,x2, 29, 51},{-170,x3, 52, 78},{-165,x2, 79,101},
 | 
			
		||||
     {-160,x3,102,128},{-155,x2,129,151},{-150,x3,152,178},{-145,x2,179,201}},
 | 
			
		||||
    {{-140,x4,  1, 28},{-135,x2, 29, 51},{-130,x3, 52, 78},{-125,x2, 79,101},
 | 
			
		||||
     {-120,x3,102,128},{-115,x2,129,151},{-110,x3,152,178},{-105,x2,179,201}},
 | 
			
		||||
    {{-100,x3,  1, 27},{- 95,x2, 28, 50},{- 90,x1, 51, 78},{- 85,x2, 79,101},
 | 
			
		||||
     {- 80,x3,102,128},{- 75,x2,129,151},{- 70,x3,152,178},{- 65,x2,179,201}},
 | 
			
		||||
    {{- 60,x3,  1, 27},{- 55,x2, 28, 50},{- 50,x4, 51, 78},{- 45,x2, 79,101},
 | 
			
		||||
     {- 40,x3,102,128},{- 35,x2,129,151},{- 30,x3,152,178},{- 25,x2,179,201}},
 | 
			
		||||
    {{- 20,x3,  1, 27},{- 15,x2, 28, 50},{- 10,x3, 51, 77},{-  5,x2, 78,100},
 | 
			
		||||
     {   0,x1,101,128},{   5,x2,129,151},{  10,x3,152,178},{  15,x2,179,201}},
 | 
			
		||||
    {{  20,x3,  1, 27},{  25,x2, 28, 50},{  30,x3, 51, 77},{  35,x2, 78,100},
 | 
			
		||||
     {  40,x4,101,128},{  45,x2,129,151},{  50,x3,152,178},{  55,x2,179,201}},
 | 
			
		||||
    {{  60,x3,  1, 27},{  65,x2, 28, 50},{  70,x3, 51, 77},{  75,x2, 78,100},
 | 
			
		||||
     {  80,x3,101,127},{  85,x2,128,150},{  90,x1,151,178},{  95,x2,179,201}},
 | 
			
		||||
    {{ 100,x3,  1, 27},{ 105,x2, 28, 50},{ 110,x3, 51, 77},{ 115,x2, 78,100},
 | 
			
		||||
     { 120,x3,101,127},{ 125,x2,128,150},{ 130,x4,151,178},{ 135,x2,179,201}},
 | 
			
		||||
    {{ 140,x3,  1, 27},{ 145,x2, 28, 50},{ 150,x3, 51, 77},{ 155,x2, 78,100},
 | 
			
		||||
     { 160,x3,101,127},{ 165,x2,128,150},{ 170,x3,151,177},{ 175,x2,178,200}}
 | 
			
		||||
};
 | 
			
		||||
const sbsigpband_t igpband2[2][5] = { /* band 9-10 */
 | 
			
		||||
    {{  60, x5,  1, 72}, {  65, x6, 73, 108}, {  70, x6, 109, 144}, {  75, x6, 145, 180},
 | 
			
		||||
     {  85, x7, 181, 192}},
 | 
			
		||||
    {{- 60, x5,  1, 72}, {- 65, x6, 73, 108}, {- 70, x6, 109, 144}, {- 75 ,x6, 145, 180},
 | 
			
		||||
     {- 85, x8, 181, 192}}
 | 
			
		||||
const sbsigpband_t igpband2[2][5]={ /* band 9-10 */
 | 
			
		||||
    {{  60,x5,  1, 72},{  65,x6, 73,108},{  70,x6,109,144},{  75,x6,145,180},
 | 
			
		||||
     {  85,x7,181,192}},
 | 
			
		||||
    {{- 60,x5,  1, 72},{- 65,x6, 73,108},{- 70,x6,109,144},{- 75,x6,145,180},
 | 
			
		||||
     {- 85,x8,181,192}}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -124,7 +146,6 @@ char *getfield(char *p, int pos);
 | 
			
		||||
double varfcorr(int udre);
 | 
			
		||||
double varicorr(int give);
 | 
			
		||||
double degfcorr(int ai);
 | 
			
		||||
 | 
			
		||||
int decode_sbstype1(const sbsmsg_t *msg, sbssat_t *sbssat);
 | 
			
		||||
int decode_sbstype2(const sbsmsg_t *msg, sbssat_t *sbssat);
 | 
			
		||||
int decode_sbstype6(const sbsmsg_t *msg, sbssat_t *sbssat);
 | 
			
		||||
@@ -137,7 +158,6 @@ int decode_longcorrh(const sbsmsg_t *msg, int p, sbssat_t *sbssat);
 | 
			
		||||
int decode_sbstype24(const sbsmsg_t *msg, sbssat_t *sbssat);
 | 
			
		||||
int decode_sbstype25(const sbsmsg_t *msg, sbssat_t *sbssat);
 | 
			
		||||
int decode_sbstype26(const sbsmsg_t *msg, sbsion_t *sbsion);
 | 
			
		||||
 | 
			
		||||
int sbsupdatecorr(const sbsmsg_t *msg, nav_t *nav);
 | 
			
		||||
void readmsgs(const char *file, int sel, gtime_t ts, gtime_t te,sbs_t *sbs);
 | 
			
		||||
int cmpmsgs(const void *p1, const void *p2);
 | 
			
		||||
@@ -164,4 +184,4 @@ int sbsdecodemsg(gtime_t time, int prn, const unsigned int *words,
 | 
			
		||||
                        sbsmsg_t *sbsmsg);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif /* GNSS_SDR_RTKLIB_SBAS_H_ */
 | 
			
		||||
#endif /* RTKLIB_SBAS_H_ */
 | 
			
		||||
 
 | 
			
		||||
@@ -35,20 +35,19 @@
 | 
			
		||||
#include <vector>
 | 
			
		||||
#include <utility> // std::pair
 | 
			
		||||
#include "MATH_CONSTANTS.h"
 | 
			
		||||
#include "gnss_frequencies.h"
 | 
			
		||||
 | 
			
		||||
// Physical constants
 | 
			
		||||
const double GPS_C_m_s       = SPEED_OF_LIGHT;   //!< The speed of light, [m/s]
 | 
			
		||||
const double GPS_C_m_s       = 299792458.0;      //!< The speed of light, [m/s]
 | 
			
		||||
const double GPS_C_m_ms      = 299792.4580;      //!< The speed of light, [m/ms]
 | 
			
		||||
const double GPS_PI          = 3.1415926535898;  //!< Pi as defined in IS-GPS-200E
 | 
			
		||||
const double GPS_TWO_PI      = 6.283185307179586;//!< 2Pi as defined in IS-GPS-200E
 | 
			
		||||
const double OMEGA_EARTH_DOT = DEFAULT_OMEGA_EARTH_DOT;  //!< Earth rotation rate, [rad/s]
 | 
			
		||||
const double OMEGA_EARTH_DOT = 7.2921151467e-5;  //!< Earth rotation rate, [rad/s]
 | 
			
		||||
const double GM              = 3.986005e14;      //!< Universal gravitational constant times the mass of the Earth, [m^3/s^2]
 | 
			
		||||
const double F               = -4.442807633e-10; //!< Constant, [s/(m)^(1/2)]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// carrier and code frequencies
 | 
			
		||||
const double GPS_L1_FREQ_HZ              = FREQ1; //!< L1 [Hz]
 | 
			
		||||
const double GPS_L1_FREQ_HZ              = 1.57542e9; //!< L1 [Hz]
 | 
			
		||||
const double GPS_L1_CA_CODE_RATE_HZ      = 1.023e6;   //!< GPS L1 C/A code rate [chips/s]
 | 
			
		||||
const double GPS_L1_CA_CODE_LENGTH_CHIPS = 1023.0;    //!< GPS L1 C/A code length [chips]
 | 
			
		||||
const double GPS_L1_CA_CODE_PERIOD       = 0.001;     //!< GPS L1 C/A code period [seconds]
 | 
			
		||||
 
 | 
			
		||||
@@ -36,7 +36,6 @@
 | 
			
		||||
#include <vector>
 | 
			
		||||
#include <utility> // std::pair
 | 
			
		||||
#include "MATH_CONSTANTS.h"
 | 
			
		||||
#include "gnss_frequencies.h"
 | 
			
		||||
 | 
			
		||||
// Physical constants
 | 
			
		||||
const double GPS_L2_C_m_s       = 299792458.0;      //!< The speed of light, [m/s]
 | 
			
		||||
@@ -49,7 +48,7 @@ const double GPS_L2_F               = -4.442807633e-10; //!< Constant, [s/(m)^(1
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// carrier and code frequencies
 | 
			
		||||
const double GPS_L2_FREQ_HZ = FREQ2;          //!< L2 [Hz]
 | 
			
		||||
const double GPS_L2_FREQ_HZ = 1.2276e9;          //!< L2 [Hz]
 | 
			
		||||
 | 
			
		||||
const double GPS_L2_M_CODE_RATE_HZ = 0.5115e6;   //!< GPS L2 M code rate [chips/s]
 | 
			
		||||
const int GPS_L2_M_CODE_LENGTH_CHIPS = 10230;    //!< GPS L2 M code length [chips]
 | 
			
		||||
 
 | 
			
		||||
@@ -37,7 +37,6 @@
 | 
			
		||||
#include <vector>
 | 
			
		||||
#include <utility> // std::pair
 | 
			
		||||
#include "MATH_CONSTANTS.h"
 | 
			
		||||
#include "gnss_frequencies.h"
 | 
			
		||||
 | 
			
		||||
// Physical constants
 | 
			
		||||
const double GALILEO_PI = 3.1415926535898; //!< Pi as defined in GALILEO ICD
 | 
			
		||||
@@ -49,7 +48,7 @@ const double GALILEO_C_m_ms = 299792.4580; //!< The speed of light, [m/ms]
 | 
			
		||||
const double GALILEO_F = -4.442807309e-10; //!< Constant, [s/(m)^(1/2)]
 | 
			
		||||
 | 
			
		||||
// carrier and code frequencies
 | 
			
		||||
const double Galileo_E1_FREQ_HZ = FREQ1;             //!< Galileo E1 carrier frequency [Hz]
 | 
			
		||||
const double Galileo_E1_FREQ_HZ = 1.57542e9;             //!< Galileo E1 carrier frequency [Hz]
 | 
			
		||||
const double Galileo_E1_CODE_CHIP_RATE_HZ = 1.023e6;     //!< Galileo E1 code rate [chips/s]
 | 
			
		||||
const double Galileo_E1_CODE_PERIOD = 0.004;             //!< Galileo E1 code period [s]
 | 
			
		||||
const double Galileo_E1_SUB_CARRIER_A_RATE_HZ = 1.023e6; //!< Galileo E1 sub-carrier 'a' rate [Hz]
 | 
			
		||||
 
 | 
			
		||||
@@ -35,11 +35,11 @@
 | 
			
		||||
#include <vector>
 | 
			
		||||
#include <utility> // std::pair
 | 
			
		||||
#include "MATH_CONSTANTS.h"
 | 
			
		||||
#include "gnss_frequencies.h"
 | 
			
		||||
 | 
			
		||||
// Physical constants already defined in E1
 | 
			
		||||
 | 
			
		||||
// Carrier and code frequencies
 | 
			
		||||
const double Galileo_E5a_FREQ_HZ = FREQ5;             //!< Galileo E5a carrier frequency [Hz]
 | 
			
		||||
const double Galileo_E5a_FREQ_HZ = 1.176450e9;             //!< Galileo E5a carrier frequency [Hz]
 | 
			
		||||
const double Galileo_E5a_CODE_CHIP_RATE_HZ = 1.023e7;     //!< Galileo E5a code rate [chips/s]
 | 
			
		||||
const double Galileo_E5a_I_TIERED_CODE_PERIOD = 0.020;             //!< Galileo E5a-I tiered code period [s]
 | 
			
		||||
const double Galileo_E5a_Q_TIERED_CODE_PERIOD = 0.100;             //!< Galileo E5a-Q tiered code period [s]
 | 
			
		||||
 
 | 
			
		||||
@@ -40,9 +40,6 @@
 | 
			
		||||
        PI_TWO_PX ==> Pi*2^X
 | 
			
		||||
        ONE_PI_TWO_PX = (1/Pi)*2^X
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
const double PI = 3.1415926535897932;             //!<  pi
 | 
			
		||||
 | 
			
		||||
const double TWO_P4 = (16);                       //!< 2^4
 | 
			
		||||
const double TWO_P11 = (2048);                    //!< 2^11
 | 
			
		||||
const double TWO_P12 = (4096);                    //!< 2^12
 | 
			
		||||
@@ -56,7 +53,6 @@ const double TWO_P57 = (1.441151880758559e+017);  //!< 2^57
 | 
			
		||||
 | 
			
		||||
const double TWO_N2 = (0.25);                     //!< 2^-2
 | 
			
		||||
const double TWO_N5 = (0.03125);                  //!< 2^-5
 | 
			
		||||
const double TWO_N6 = (0.015625);                 //!< 2^-6
 | 
			
		||||
const double TWO_N8 = (0.00390625);               //!< 2^-8
 | 
			
		||||
const double TWO_N9 = (0.001953125);              //!< 2^-9
 | 
			
		||||
const double TWO_N10 = (0.0009765625);            //!< 2^-10
 | 
			
		||||
@@ -64,11 +60,9 @@ const double TWO_N11 = (4.882812500000000e-004);  //!< 2^-11
 | 
			
		||||
const double TWO_N14 = (0.00006103515625);        //!< 2^-14
 | 
			
		||||
const double TWO_N15 = (0.00003051757813);        //!< 2^-15
 | 
			
		||||
const double TWO_N16 = (0.0000152587890625);      //!< 2^-16
 | 
			
		||||
const double TWO_N17 = (7.629394531250000e-006);  //!< 2^-17
 | 
			
		||||
const double TWO_N19 = (1.907348632812500e-006);  //!< 2^-19
 | 
			
		||||
const double TWO_N20 = (9.536743164062500e-007);  //!< 2^-20
 | 
			
		||||
const double TWO_N21 = (4.768371582031250e-007);  //!< 2^-21
 | 
			
		||||
const double TWO_N23 = (1.192092895507810e-007);  //!< 2^-23
 | 
			
		||||
const double TWO_N24 = (5.960464477539063e-008);  //!< 2^-24
 | 
			
		||||
const double TWO_N25 = (2.980232238769531e-008);  //!< 2^-25
 | 
			
		||||
const double TWO_N27 = (7.450580596923828e-009);  //!< 2^-27
 | 
			
		||||
@@ -79,9 +73,8 @@ const double TWO_N32 = (2.328306436538696e-010);  //!< 2^-32
 | 
			
		||||
const double TWO_N33 = (1.164153218269348e-010);  //!< 2^-33
 | 
			
		||||
const double TWO_N34 = (5.82076609134674e-011);   //!< 2^-34
 | 
			
		||||
const double TWO_N35 = (2.91038304567337e-011);   //!< 2^-35
 | 
			
		||||
 | 
			
		||||
const double TWO_N38 = (3.637978807091713e-012);  //!< 2^-38
 | 
			
		||||
const double TWO_N39 = (1.818989403545856e-012);  //!< 2^-39
 | 
			
		||||
const double TWO_N40 = (9.094947017729280e-013);  //!< 2^-40
 | 
			
		||||
const double TWO_N43 = (1.136868377216160e-013);  //!< 2^-43
 | 
			
		||||
const double TWO_N44 = (5.684341886080802e-14);   //!< 2^-44
 | 
			
		||||
const double TWO_N46 = (1.4210854715202e-014);    //!< 2^-46
 | 
			
		||||
@@ -102,13 +95,4 @@ const double PI_TWO_N31 = (1.462918079267160e-009);  //!< Pi*2^-31
 | 
			
		||||
const double PI_TWO_N38 = (1.142904749427469e-011);  //!< Pi*2^-38
 | 
			
		||||
const double PI_TWO_N23 = (3.745070282923929e-007);  //!< Pi*2^-23
 | 
			
		||||
 | 
			
		||||
const double D2R = (PI/180.0);          //!< deg to rad */
 | 
			
		||||
const double R2D = (180.0/PI);          //!< rad to deg */
 | 
			
		||||
const double SC2RAD = 3.1415926535898;  //!<  semi-circle to radian (IS-GPS)
 | 
			
		||||
const double AS2R = (D2R / 3600.0);     //!<  arc sec to radian
 | 
			
		||||
 | 
			
		||||
const double DEFAULT_OMEGA_EARTH_DOT = 7.2921151467e-5; //!< Default Earth rotation rate, [rad/s]
 | 
			
		||||
const double SPEED_OF_LIGHT = 299792458.0;              //!<  [m/s]
 | 
			
		||||
const double AU = 149597870691.0;                       //!<  1 Astronomical Unit AU (m) distance from Earth to the Sun.
 | 
			
		||||
 | 
			
		||||
#endif /* GNSS_SDR_MATH_CONSTANTS_H_ */
 | 
			
		||||
 
 | 
			
		||||
@@ -1,53 +0,0 @@
 | 
			
		||||
/*!
 | 
			
		||||
 * \file gnss_frequencies.h
 | 
			
		||||
 * \brief  GNSS Frequencies
 | 
			
		||||
 * \author Carles Fernandez, 2017. cfernandez(at)cttc.es
 | 
			
		||||
 *
 | 
			
		||||
 *
 | 
			
		||||
 * -------------------------------------------------------------------------
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2010-2017  (see AUTHORS file for a list of contributors)
 | 
			
		||||
 *
 | 
			
		||||
 * GNSS-SDR is a software defined Global Navigation
 | 
			
		||||
 *          Satellite Systems receiver
 | 
			
		||||
 *
 | 
			
		||||
 * This file is part of GNSS-SDR.
 | 
			
		||||
 *
 | 
			
		||||
 * GNSS-SDR is free software: you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * GNSS-SDR is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with GNSS-SDR. If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 *
 | 
			
		||||
 * -------------------------------------------------------------------------
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifndef GNSS_SDR_GNSS_FREQUENCIES_H_
 | 
			
		||||
#define GNSS_SDR_GNSS_FREQUENCIES_H_
 | 
			
		||||
 | 
			
		||||
const double FREQ1 = 1.57542e9;                //!<  L1/E1  frequency (Hz)
 | 
			
		||||
const double FREQ2 = 1.22760e9;                //!<  L2     frequency (Hz)
 | 
			
		||||
const double FREQ5 = 1.17645e9;                //!<  L5/E5a frequency (Hz)
 | 
			
		||||
const double FREQ6 = 1.27875e9;                //!<  E6/LEX frequency (Hz)
 | 
			
		||||
const double FREQ7 = 1.20714e9;                //!<  E5b    frequency (Hz)
 | 
			
		||||
const double FREQ8 = 1.191795e9;               //!<  E5a+b  frequency (Hz)
 | 
			
		||||
const double FREQ9 = 2.492028e9;               //!<  S      frequency (Hz)
 | 
			
		||||
const double FREQ1_GLO = 1.60200e9;            //!<  GLONASS G1 base frequency (Hz)
 | 
			
		||||
const double DFRQ1_GLO = 0.56250e6;            //!<  GLONASS G1 bias frequency (Hz/n)
 | 
			
		||||
const double FREQ2_GLO = 1.24600e9;            //!<  GLONASS G2 base frequency (Hz)
 | 
			
		||||
const double DFRQ2_GLO = 0.43750e6;            //!<  GLONASS G2 bias frequency (Hz/n)
 | 
			
		||||
const double FREQ3_GLO = 1.202025e9;           //!<  GLONASS G3 frequency (Hz)
 | 
			
		||||
const double FREQ1_BDS = 1.561098e9;           //!<  BeiDou B1 frequency (Hz)
 | 
			
		||||
const double FREQ2_BDS = 1.20714e9;            //!<  BeiDou B2 frequency (Hz)
 | 
			
		||||
const double FREQ3_BDS = 1.26852e9;            //!<  BeiDou B3 frequency (Hz)
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user