1  #ifndef RTCM3_CLOCK_ORBIT_RTCM_H


2  #define RTCM3_CLOCK_ORBIT_RTCM_H


3 


4  /* Programheader


5 


6  Name: clock_orbit_rtcm.h


7  Project: RTCM3


8  Version: $Id: clock_orbit_rtcm.h 6845 20150522 07:37:20Z stuerze $


9  Authors: Dirk Stöcker


10  Description: state space approach for RTCM3


11  */


12 


13  #include <string.h>


14 


15  enum SatelliteReferenceDatum { DATUM_ITRF=0, DATUM_LOCAL=1 };


16 


17  enum COR_BASE {


18  COBBASE_GPS = 1057,


19  COBBASE_GLONASS = 1063,


20  COBBASE_GALILEO = 1240,


21  COBBASE_QZSS = 1246,


22  COBBASE_SBAS = 1252,


23  COBBASE_BDS = 1258,


24  };


25 


26  enum COR_OFFSET {


27  COBOFS_ORBIT = 0,


28  COBOFS_CLOCK,


29  COBOFS_BIAS,


30  COBOFS_COMBINED,


31  COBOFS_URA,


32  COBOFS_HR,


33  COBOFS_NUM


34  };


35 


36  enum ClockOrbitType {


37  COTYPE_GPSORBIT = COBBASE_GPS + COBOFS_ORBIT,


38  COTYPE_GPSCLOCK,


39  COTYPE_GPSCOMBINED = COBBASE_GPS + COBOFS_COMBINED,


40  COTYPE_GPSURA,


41  COTYPE_GPSHR,


42 


43  COTYPE_GLONASSORBIT = COBBASE_GLONASS + COBOFS_ORBIT,


44  COTYPE_GLONASSCLOCK,


45  COTYPE_GLONASSCOMBINED = COBBASE_GLONASS + COBOFS_COMBINED,


46  COTYPE_GLONASSURA,


47  COTYPE_GLONASSHR,


48 


49  COTYPE_GALILEOORBIT = COBBASE_GALILEO + COBOFS_ORBIT,


50  COTYPE_GALILEOCLOCK,


51  COTYPE_GALILEOCOMBINED = COBBASE_GALILEO + COBOFS_COMBINED,


52  COTYPE_GALILEOURA,


53  COTYPE_GALILEOHR,


54 


55  COTYPE_QZSSORBIT = COBBASE_QZSS + COBOFS_ORBIT,


56  COTYPE_QZSSCLOCK,


57  COTYPE_QZSSCOMBINED = COBBASE_QZSS + COBOFS_COMBINED,


58  COTYPE_QZSSURA,


59  COTYPE_QZSSHR,


60 


61  COTYPE_SBASORBIT = COBBASE_SBAS + COBOFS_ORBIT,


62  COTYPE_SBASCLOCK,


63  COTYPE_SBASCOMBINED = COBBASE_SBAS + COBOFS_COMBINED,


64  COTYPE_SBASURA,


65  COTYPE_SBASHR,


66 


67  COTYPE_BDSORBIT = COBBASE_BDS + COBOFS_ORBIT,


68  COTYPE_BDSCLOCK,


69  COTYPE_BDSCOMBINED = COBBASE_BDS + COBOFS_COMBINED,


70  COTYPE_BDSURA,


71  COTYPE_BDSHR,


72 


73  COTYPE_AUTO = 0,


74  };


75 


76  enum CodeBiasType {


77  BTYPE_GPS = COBBASE_GPS + COBOFS_BIAS,


78  BTYPE_GLONASS = COBBASE_GLONASS + COBOFS_BIAS,


79  BTYPE_GALILEO = COBBASE_GALILEO + COBOFS_BIAS,


80  BTYPE_QZSS = COBBASE_QZSS + COBOFS_BIAS,


81  BTYPE_SBAS = COBBASE_SBAS + COBOFS_BIAS,


82  BTYPE_BDS = COBBASE_BDS + COBOFS_BIAS,


83  BTYPE_AUTO = 0


84  };


85 


86  enum PhaseBiasType {


87  PBTYPE_BASE = 1265,


88  PBTYPE_GPS = PBTYPE_BASE,


89  PBTYPE_GLONASS,


90  PBTYPE_GALILEO,


91  PBTYPE_QZSS,


92  PBTYPE_SBAS,


93  PBTYPE_BDS,


94  PBTYPE_AUTO = 0


95  };


96 


97  enum VTECType {


98  VTEC_BASE = 1264


99  };


100 


101  /* if some systems aren't supported at all, change the following numbers to zero


102  for these systems to save space */


103  enum COR_CONSTANTS {


104  CLOCKORBIT_BUFFERSIZE=2048,


105  CLOCKORBIT_NUMGPS=32,


106  CLOCKORBIT_NUMGLONASS=26,


107  CLOCKORBIT_NUMGALILEO=36,


108  CLOCKORBIT_NUMQZSS=10,


109  CLOCKORBIT_NUMSBAS=38,


110  CLOCKORBIT_NUMBDS=37,


111  CLOCKORBIT_NUMBIAS=17,


112  CLOCKORBIT_NUMIONOLAYERS=4,


113  CLOCKORBIT_MAXIONOORDER=8,


114  CLOCKORBIT_MAXIONODEGREE=8


115  };


116 


117  enum COR_SATSYSTEM {


118  CLOCKORBIT_SATGPS=0,


119  CLOCKORBIT_SATGLONASS,


120  CLOCKORBIT_SATGALILEO,


121  CLOCKORBIT_SATQZSS,


122  CLOCKORBIT_SATSBAS,


123  CLOCKORBIT_SATBDS,


124  CLOCKORBIT_SATNUM


125  };


126 


127  enum COR_OFFSETS {


128  CLOCKORBIT_OFFSETGPS=0,


129  CLOCKORBIT_OFFSETGLONASS=CLOCKORBIT_NUMGPS,


130  CLOCKORBIT_OFFSETGALILEO=CLOCKORBIT_NUMGPS+CLOCKORBIT_NUMGLONASS,


131  CLOCKORBIT_OFFSETQZSS=CLOCKORBIT_NUMGPS+CLOCKORBIT_NUMGLONASS


132  +CLOCKORBIT_NUMGALILEO,


133  CLOCKORBIT_OFFSETSBAS=CLOCKORBIT_NUMGPS+CLOCKORBIT_NUMGLONASS


134  +CLOCKORBIT_NUMGALILEO+CLOCKORBIT_NUMQZSS,


135  CLOCKORBIT_OFFSETBDS=CLOCKORBIT_NUMGPS+CLOCKORBIT_NUMGLONASS


136  +CLOCKORBIT_NUMGALILEO+CLOCKORBIT_NUMQZSS+CLOCKORBIT_NUMSBAS,


137  CLOCKORBIT_COUNTSAT=CLOCKORBIT_NUMGPS+CLOCKORBIT_NUMGLONASS


138  +CLOCKORBIT_NUMGALILEO+CLOCKORBIT_NUMQZSS+CLOCKORBIT_NUMSBAS


139  +CLOCKORBIT_NUMBDS


140  };


141 


142  enum CodeType {


143  CODETYPEGPS_L1_CA = 0,


144  CODETYPEGPS_L1_P = 1,


145  CODETYPEGPS_L1_Z = 2,


146  /*CODETYPEGPS_L1_Y = 3,


147  CODETYPEGPS_L1_M = 4,*/


148  CODETYPEGPS_L2_CA = 5,


149  CODETYPEGPS_SEMI_CODELESS = 6,


150  CODETYPEGPS_L2_CM = 7,


151  CODETYPEGPS_L2_CL = 8,


152  CODETYPEGPS_L2_CML = 9,


153  CODETYPEGPS_L2_P = 10,


154  CODETYPEGPS_L2_Z = 11,


155  /*CODETYPEGPS_L2_Y = 12,


156  CODETYPEGPS_L2_M = 13,*/


157  CODETYPEGPS_L5_I = 14,


158  CODETYPEGPS_L5_Q = 15,


159  CODETYPEGPS_L5_IQ = 16,


160 


161  CODETYPEGLONASS_L1_CA = 0,


162  CODETYPEGLONASS_L1_P = 1,


163  CODETYPEGLONASS_L2_CA = 2,


164  CODETYPEGLONASS_L2_P = 3,


165 


166  CODETYPEGALILEO_E1_A = 0,


167  CODETYPEGALILEO_E1_B = 1,


168  CODETYPEGALILEO_E1_C = 2,


169  CODETYPEGALILEO_E5A_I = 5,


170  CODETYPEGALILEO_E5A_Q = 6,


171  CODETYPEGALILEO_E5B_I = 8,


172  CODETYPEGALILEO_E5B_Q = 9,


173  CODETYPEGALILEO_E5_I = 11,


174  CODETYPEGALILEO_E5_Q = 12,


175  CODETYPEGALILEO_E6_A = 14,


176  CODETYPEGALILEO_E6_B = 15,


177  CODETYPEGALILEO_E6_C = 16,


178 


179  CODETYPEQZSS_L1_CA = 0,


180  CODETYPEQZSS_L1C_D = 1,


181  CODETYPEQZSS_L1C_P = 2,


182  CODETYPEQZSS_L2_CM = 3,


183  CODETYPEQZSS_L2_CL = 4,


184  CODETYPEQZSS_L2_CML = 5,


185  CODETYPEQZSS_L5_I = 6,


186  CODETYPEQZSS_L5_Q = 7,


187  CODETYPEQZSS_L5_IQ = 8,


188  CODETYPEQZSS_LEX_S = 9,


189  CODETYPEQZSS_LEX_L = 10,


190  CODETYPEQZSS_LEX_SL = 11,


191  CODETYPEQZSS_L1C_DP = 12,


192 


193  CODETYPE_SBAS_L1_CA = 0,


194  CODETYPE_SBAS_L5_I = 1,


195  CODETYPE_SBAS_L5_Q = 2,


196  CODETYPE_SBAS_L5_IQ = 3,


197 


198  CODETYPE_BDS_B1_I = 0,


199  CODETYPE_BDS_B1_Q = 1,


200  CODETYPE_BDS_B1_IQ = 2,


201  CODETYPE_BDS_B3_I = 3,


202  CODETYPE_BDS_B3_Q = 4,


203  CODETYPE_BDS_B3_IQ = 5,


204  CODETYPE_BDS_B2_I = 6,


205  CODETYPE_BDS_B2_Q = 7,


206  CODETYPE_BDS_B2_IQ = 8,


207  };


208 


209  #define SSR_MAXURA 5.5 /* > 5466.5mm in meter */


210 


211  /* satellite system data is stored with offset CLOCKORBIT_OFFSET...


212  in the data structures. So first GLONASS satellite is at


213  xxx>Sat[CLOCKORBIT_OFFSETGLONASS], first GPS satellite is


214  xxx>Sat[CLOCKORBIT_OFFSETGPS]. */


215 


216  #ifdef COR_LEGACY


217  /* old names */


218  #define NumberOfGPSSat NumberOfSat[CLOCKORBIT_SATGPS]


219  #define NumberOfGLONASSSat NumberOfSat[CLOCKORBIT_SATGLONASS]


220  #define GPSEpochTime EpochTime[CLOCKORBIT_SATGPS] /* 0 .. 604799 s */


221  #define GLONASSEpochTime EpochTime[CLOCKORBIT_SATGLONASS] /* 0 .. 86399 s (86400 for leap second) */


222  #define ClockDataSupplied Supplied[COBOFS_CLOCK]


223  #define HRDataSupplied Supplied[COBOFS_HR]


224  #define OrbitDataSupplied Supplied[COBOFS_ORBIT]


225  #define URADataSupplied Supplied[COBOFS_URA]


226  #define GetClockOrbitBias(a,b,c,d,e) GetSSR(a,b,0,0,c,d,e)


227  #endif /* COR_LEGACY */


228 


229  /* latency check code, disabled by default */


230  #ifdef COR_LATENCY


231  #define COR_LATENCYCOUNT 100


232  #endif


233 


234  struct ClockOrbit


235  {


236  enum ClockOrbitType messageType;


237  unsigned int EpochTime[CLOCKORBIT_SATNUM]; /* 0 .. system specific maximum */


238  unsigned int NumberOfSat[CLOCKORBIT_SATNUM]; /* 0 .. CLOCKORBIT_NUM... */


239 


240  unsigned int Supplied[COBOFS_NUM]; /* boolean */


241  #ifdef COR_LATENCY


242  unsigned int epochGPS[COR_LATENCYCOUNT+1]; /* Weber, for latency */


243  unsigned int epochSize; /* Weber, for latency */


244  #endif


245  unsigned int SSRIOD;


246  unsigned int SSRProviderID;


247  unsigned int SSRSolutionID;


248  unsigned int UpdateInterval;


249  enum SatelliteReferenceDatum SatRefDatum;


250  struct SatData {


251  unsigned int ID; /* all */


252  unsigned int IOD; /* all */


253  unsigned int toe; /* SBAS, BDS */


254  double UserRangeAccuracy; /* accuracy values in [m] */


255  double hrclock;


256  struct OrbitPart


257  {


258  double DeltaRadial; /* m */


259  double DeltaAlongTrack; /* m */


260  double DeltaCrossTrack; /* m */


261  double DotDeltaRadial; /* m/s */


262  double DotDeltaAlongTrack; /* m/s */


263  double DotDeltaCrossTrack; /* m/s */


264  } Orbit;


265  struct ClockPart


266  {


267  double DeltaA0; /* m */


268  double DeltaA1; /* m/s */


269  double DeltaA2; /* m/ss */


270  } Clock;


271  } Sat[CLOCKORBIT_COUNTSAT];


272  };


273 


274  struct CodeBias


275  {


276  enum CodeBiasType messageType;


277  unsigned int EpochTime[CLOCKORBIT_SATNUM]; /* 0 .. system specific maximum */


278  unsigned int NumberOfSat[CLOCKORBIT_SATNUM]; /* 0 .. CLOCKORBIT_NUM... */


279  unsigned int UpdateInterval;


280  unsigned int SSRIOD;


281  unsigned int SSRProviderID;


282  unsigned int SSRSolutionID;


283  struct BiasSat


284  {


285  unsigned int ID; /* all */


286  unsigned int NumberOfCodeBiases;


287  struct CodeBiasEntry


288  {


289  enum CodeType Type;


290  float Bias; /* m */


291  } Biases[CLOCKORBIT_NUMBIAS];


292  } Sat[CLOCKORBIT_COUNTSAT];


293  };


294 


295  struct PhaseBias


296  {


297  enum PhaseBiasType messageType;


298  unsigned int EpochTime[CLOCKORBIT_SATNUM]; /* 0 .. system specific maximum */


299  unsigned int NumberOfSat[CLOCKORBIT_SATNUM]; /* 0 .. CLOCKORBIT_NUM... */


300  unsigned int UpdateInterval;


301  unsigned int SSRIOD;


302  unsigned int SSRProviderID;


303  unsigned int SSRSolutionID;


304  unsigned int DispersiveBiasConsistencyIndicator;


305  unsigned int MWConsistencyIndicator;


306  struct PhaseBiasSat


307  {


308  unsigned int ID; /* all */


309  unsigned int NumberOfPhaseBiases;


310  double YawAngle; /* radiant */


311  double YawRate; /* radiant/s */


312  struct PhaseBiasEntry


313  {


314  enum CodeType Type;


315  unsigned int SignalIntegerIndicator;


316  unsigned int SignalsWideLaneIntegerIndicator;


317  unsigned int SignalDiscontinuityCounter;


318  float Bias; /* m */


319  } Biases[CLOCKORBIT_NUMBIAS];


320  } Sat[CLOCKORBIT_COUNTSAT];


321  };


322 


323  struct VTEC


324  {


325  unsigned int EpochTime; /* GPS */


326  unsigned int UpdateInterval;


327  unsigned int SSRIOD;


328  unsigned int SSRProviderID;


329  unsigned int SSRSolutionID;


330  unsigned int NumLayers; /* 14 */


331  double Quality;


332  struct IonoLayers {


333  double Height; /* m */


334  unsigned int Degree; /* 18 */


335  unsigned int Order; /* 18 */


336  double Sinus[CLOCKORBIT_MAXIONODEGREE][CLOCKORBIT_MAXIONOORDER];


337  double Cosinus[CLOCKORBIT_MAXIONODEGREE][CLOCKORBIT_MAXIONOORDER];


338  } Layers[CLOCKORBIT_NUMIONOLAYERS];


339  };


340 


341  /* return size of resulting data or 0 in case of an error */


342  size_t MakeClockOrbit(const struct ClockOrbit *co, enum ClockOrbitType type,


343  int moremessagesfollow, char *buffer, size_t size);


344  size_t MakeCodeBias(const struct CodeBias *b, enum CodeBiasType type,


345  int moremessagesfollow, char *buffer, size_t size);


346  size_t MakePhaseBias(const struct PhaseBias *b, enum PhaseBiasType type,


347  int moremessagesfollow, char *buffer, size_t size);


348  size_t MakeVTEC(const struct VTEC *b, int moremessagesfollow, char *buffer,


349  size_t size);


350 


351  enum GCOB_RETURN {


352  /* all well */


353  GCOBR_MESSAGEFOLLOWS = 1,


354  GCOBR_OK = 0,


355  /* unknown data, a warning */


356  GCOBR_UNKNOWNTYPE = 1,


357  GCOBR_UNKNOWNDATA = 2,


358  GCOBR_CRCMISMATCH = 3,


359  GCOBR_SHORTMESSAGE = 4,


360  /* failed to do the work */


361  GCOBR_NOCLOCKORBITPARAMETER = 10,


362  GCOBR_NOCODEBIASPARAMETER = 11,


363  GCOBR_NOPHASEBIASPARAMETER = 12,


364  GCOBR_NOVTECPARAMETER = 13,


365  /* data mismatch  data in storage does not match new data */


366  GCOBR_TIMEMISMATCH = 20,


367  GCOBR_DATAMISMATCH = 21,


368  /* not enough data  can decode the block completely */


369  GCOBR_SHORTBUFFER = 30,


370  GCOBR_MESSAGEEXCEEDSBUFFER = 31};


371 


372  /* NOTE: When an error message has been emitted, the output structures may have been modified. Make a copy of the previous variant before calling the


373  function to have a clean state. */


374 


375  /* buffer should point to a RTCM3 block */


376  enum GCOB_RETURN GetSSR(struct ClockOrbit *co, struct CodeBias *b, struct VTEC *v,


377  struct PhaseBias *pb, const char *buffer, size_t size, int *bytesused);


378 


379  #endif /* RTCM3_CLOCK_ORBIT_RTCM_H */

