Changeset 11004 in ntrip for trunk


Ignore:
Timestamp:
Sep 3, 2026, 9:38:44 PM (10 days ago)
Author:
stuerze
Message:

updates regarding RTCM-SSR

Location:
trunk/BNC/src/RTCM3
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/BNC/src/RTCM3/RTCM3coDecoder.cpp

    r11003 r11004  
    181181    struct SsrCorr::PhaseBias  phaseBiasSav;
    182182    struct SsrCorr::VTEC       vTECSav;
    183     memcpy(&clkOrbSav,     &_clkOrb,    sizeof(clkOrbSav)); // save state
     183    struct SsrCorr::MetaData   metaDataSav;
     184    // save state
     185    memcpy(&clkOrbSav,     &_clkOrb,    sizeof(clkOrbSav));
    184186    memcpy(&codeBiasSav,   &_codeBias,  sizeof(codeBiasSav));
    185187    memcpy(&phaseBiasSav,  &_phaseBias, sizeof(phaseBiasSav));
    186188    memcpy(&vTECSav,       &_vTEC,      sizeof(vTECSav));
     189    memcpy(&metaDataSav,   &_metaData,  sizeof(metaDataSav));
    187190
    188191    int bytesused = 0;
    189192
    190     GCOB_RETURN irc = _ssrCorr->GetSSR(&_clkOrb, &_codeBias, &_vTEC, &_phaseBias,
     193    GCOB_RETURN irc = _ssrCorr->GetSSR(&_clkOrb, &_codeBias, &_vTEC, &_phaseBias, &_metaData,
    191194                                       _buffer.data(), _buffer.size(), &bytesused);
    192195
    193196    if      (irc <= -30) { // not enough data - restore state and exit loop
    194       memcpy(&_clkOrb,    &clkOrbSav,    sizeof(clkOrbSav));
    195       memcpy(&_codeBias,  &codeBiasSav,  sizeof(codeBiasSav));
    196       memcpy(&_phaseBias, &phaseBiasSav, sizeof(phaseBiasSav));
    197       memcpy(&_vTEC,      &vTECSav,      sizeof(vTECSav));
     197      memcpy(&_clkOrb,     &clkOrbSav,    sizeof(clkOrbSav));
     198      memcpy(&_codeBias,   &codeBiasSav,  sizeof(codeBiasSav));
     199      memcpy(&_phaseBias,  &phaseBiasSav, sizeof(phaseBiasSav));
     200      memcpy(&_vTEC,       &vTECSav,      sizeof(vTECSav));
     201      memcpy(&metaDataSav, &_metaData,    sizeof(metaDataSav));
    198202      break;
    199203    }
    200204
    201205    else if (irc < 0) {    // error - skip this message (or 1 byte if the
    202                             // frame itself couldn't be recognized) and retry
     206                           // frame itself couldn't be recognized) and retry
    203207      if (irc != GCOBR_UNKNOWNTYPE) {
    204208        // A recognized-but-unimplemented message (e.g. Tropospheric or
  • trunk/BNC/src/RTCM3/RTCM3coDecoder.h

    r11002 r11004  
    8383  SsrCorr::PhaseBias                    _phaseBias;
    8484  SsrCorr::VTEC                         _vTEC;
     85  SsrCorr::MetaData                     _metaData;
    8586  int                                   _providerID[3];
    8687  e_type                                _type;
  • trunk/BNC/src/RTCM3/clock_and_orbit/clock_orbit.h

    r10997 r11004  
    2121enum IGS_NUMBERS {
    2222  RTCM_MESSAGE_NUMBER_IGS = 4076,
    23   IGS_SSR_VERSION = 3
     23  IGS_SSR_VERSION         = 3
    2424};
    2525
     
    2727 for these systems to save space */
    2828enum COR_CONSTANTS {
    29   CLOCKORBIT_BUFFERSIZE    = 8192,
    30   CLOCKORBIT_NUMGPS        = t_prn::MAXPRN_GPS,
    31   CLOCKORBIT_NUMGLONASS    = t_prn::MAXPRN_GLONASS,
    32   CLOCKORBIT_NUMGALILEO    = t_prn::MAXPRN_GALILEO,
    33   CLOCKORBIT_NUMQZSS       = t_prn::MAXPRN_QZSS,
    34   CLOCKORBIT_NUMSBAS       = t_prn::MAXPRN_SBAS,
    35   CLOCKORBIT_NUMBDS        = t_prn::MAXPRN_BDS,
    36   CLOCKORBIT_NUMBIAS       = 150,
    37   CLOCKORBIT_NUMIONOLAYERS =   4,
    38   CLOCKORBIT_MAXIONOORDER  =  16,
    39   CLOCKORBIT_MAXIONODEGREE =  16
     29  COBOFS_MAXNUM          =   10,
     30  CLOCKORBIT_BUFFERSIZE  = 8192,
     31  CLOCKORBIT_NUMGPS      = t_prn::MAXPRN_GPS,
     32  CLOCKORBIT_NUMGLONASS  = t_prn::MAXPRN_GLONASS,
     33  CLOCKORBIT_NUMGALILEO  = t_prn::MAXPRN_GALILEO,
     34  CLOCKORBIT_NUMQZSS     = t_prn::MAXPRN_QZSS,
     35  CLOCKORBIT_NUMSBAS     = t_prn::MAXPRN_SBAS,
     36  CLOCKORBIT_NUMBDS      = t_prn::MAXPRN_BDS,
     37  CLOCKORBIT_NUMBIAS     =  150,
     38  VTEC_NUMIONOLAYERS     =    4,
     39  VTEC_MAXIONOORDER      =   16,
     40  VTEC_MAXIONODEGREE     =   16,
     41  META_MAXNUMENTRIES     =    7
    4042};
    4143
     
    112114  CorBase COBBASE_NUM;
    113115
     116
    114117  typedef unsigned int CorOffset;
    115118  CorOffset COBOFS_ORBIT;
     
    349352
    350353#define SSR_MAXURA 5.5 /* > 5466.5mm in meter */
    351 #define COBOFS_MAXNUM 7
     354
    352355
    353356  /* satellite system data is stored with offset CLOCKORBIT_OFFSET...
     
    448451      unsigned int Degree; /* 1-16 */
    449452      unsigned int Order;  /* 1-16 */
    450       double Sinus[CLOCKORBIT_MAXIONODEGREE][CLOCKORBIT_MAXIONOORDER];
    451       double Cosinus[CLOCKORBIT_MAXIONODEGREE][CLOCKORBIT_MAXIONOORDER];
    452     } Layers[CLOCKORBIT_NUMIONOLAYERS];
     453      double Sinus[VTEC_MAXIONODEGREE][VTEC_MAXIONOORDER];
     454      double Cosinus[VTEC_MAXIONODEGREE][VTEC_MAXIONOORDER];
     455    } Layers[VTEC_NUMIONOLAYERS];
     456  };
     457
     458    struct MetaData {
     459    unsigned int EpochTime; /* GPS */
     460    unsigned int SSRIOD;
     461    unsigned int SSRProviderID;
     462    unsigned int SSRSolutionID;
     463    unsigned int NumEntries; /* 1-7 */
     464    struct ModelPart {
     465      unsigned int TypeIndicator;
     466      unsigned int ApplicationIndicator;
     467      unsigned int nonDefaultIndicator;
     468      unsigned int nonDefaultIdentifier;
     469      unsigned int DataIODIndicator;
     470      unsigned int DataIOD;
     471      unsigned int additionalParameterIndicator;
     472      unsigned int additionalParameterNumBits;
     473      unsigned int additionalParameterData;
     474    } Entries[META_MAXNUMENTRIES];
    453475  };
    454476
     
    458480  virtual size_t MakePhaseBias(const struct PhaseBias *b, CodeBiasType type, int moremessagesfollow, char *buffer, size_t size) = 0;
    459481  virtual size_t MakeVTEC(const struct VTEC *v, int moremessagesfollow, char *buffer, size_t size) = 0;
    460 
    461482  /* buffer should point to a RTCM3 block */
    462   virtual enum GCOB_RETURN GetSSR(struct ClockOrbit *co, struct CodeBias *b, struct VTEC *v, struct PhaseBias *pb,
     483  virtual enum GCOB_RETURN GetSSR(struct ClockOrbit *co,
     484                                  struct CodeBias *b, struct VTEC *v,
     485                                  struct PhaseBias *pb,
     486                                  struct MetaData *md, 
    463487                                  const char *buffer, size_t size, int *bytesused) = 0;
     488
     489  virtual std::string metaTypeToStr(unsigned int ind) = 0;
    464490  virtual std::string codeTypeToRnxType(char system, CodeType type) = 0;
    465   virtual CodeType    rnxTypeToCodeType(char system, std::string type) = 0;
     491  virtual CodeType rnxTypeToCodeType(char system, std::string type) = 0;
     492
    466493
    467494#define MPI         3.141592653589793
  • trunk/BNC/src/RTCM3/clock_and_orbit/clock_orbit_igs.cpp

    r10997 r11004  
    315315
    316316enum GCOB_RETURN SsrCorrIgs::GetSSR(struct ClockOrbit *co, struct CodeBias *b,struct VTEC *v,
    317     struct PhaseBias *pb, const char *buffer, size_t size, int *bytesused) {
     317    struct PhaseBias *pb, struct MetaData *md, const char *buffer, size_t size, int *bytesused) {
    318318  int mmi = 0, h, rs;
    319319  unsigned int igstype, pos, i, j, s, nums, id;
     
    920920  return CODETYPE_RESERVED;
    921921}
    922 
     922//
     923////////////////////////////////////////////////////////////////////////////
     924std::string SsrCorrIgs::metaTypeToStr(unsigned int) {
     925  // This format does not decode Metadata message content (see md/GetSSR
     926  // above); only present to satisfy SsrCorr's interface.
     927  return "";
     928}
     929
  • trunk/BNC/src/RTCM3/clock_and_orbit/clock_orbit_igs.h

    r10997 r11004  
    217217   };
    218218
    219    std::string       codeTypeToRnxType(char system, CodeType type);
     219   std::string metaTypeToStr(unsigned int ind);
     220   std::string codeTypeToRnxType(char system, CodeType type);
    220221   SsrCorr::CodeType rnxTypeToCodeType(char system, std::string type);
    221222
     
    229230       size_t size);
    230231   enum GCOB_RETURN GetSSR(struct ClockOrbit *co, struct CodeBias *b,
    231        struct VTEC *v, struct PhaseBias *pb, const char *buffer, size_t size,
    232        int *bytesused);
     232       struct VTEC *v, struct PhaseBias *pb, struct MetaData *md,
     233       const char *buffer, size_t size, int *bytesused);
    233234};
    234235
  • trunk/BNC/src/RTCM3/clock_and_orbit/clock_orbit_rtcm.cpp

    r10997 r11004  
    496496
    497497enum GCOB_RETURN SsrCorrRtcm::GetSSR(struct ClockOrbit *co, struct CodeBias *b,struct VTEC *v,
    498     struct PhaseBias *pb, const char *buffer, size_t size, int *bytesused) {
     498    struct PhaseBias *pb, struct MetaData *md, const char *buffer, size_t size, int *bytesused) {
    499499  int mmi = 0, h, rs;
    500500  unsigned int type, pos, i, j, s, nums, id;
     
    13751375  return CODETYPE_RESERVED;
    13761376}
    1377 
     1377//
     1378////////////////////////////////////////////////////////////////////////////
     1379std::string SsrCorrRtcm::metaTypeToStr(unsigned int) {
     1380  // Metadata messages are not defined in (old) RTCM-SSR, so this format
     1381  // never decodes model-correction-type codes; only present to satisfy
     1382  // SsrCorr's interface.
     1383  return "";
     1384}
     1385
  • trunk/BNC/src/RTCM3/clock_and_orbit/clock_orbit_rtcm.h

    r10997 r11004  
    214214    CODETYPE_BDS_B2a_P          = 13;
    215215    CODETYPE_BDS_B2a_DP         = 14;
    216 
    217 
    218 
    219 
    220216  }
    221217
    222   std::string       codeTypeToRnxType(char system, CodeType type);
     218  std::string metaTypeToStr(unsigned int ind);
     219  std::string codeTypeToRnxType(char system, CodeType type);
    223220  SsrCorr::CodeType rnxTypeToCodeType(char system, std::string type);
    224221
     
    232229      size_t size);
    233230  enum GCOB_RETURN GetSSR(struct ClockOrbit *co, struct CodeBias *b,
    234       struct VTEC *v, struct PhaseBias *pb, const char *buffer, size_t size,
     231      struct VTEC *v, struct PhaseBias *pb, struct MetaData *md,
     232      const char *buffer, size_t size,
    235233      int *bytesused);
    236234 };
  • trunk/BNC/src/RTCM3/clock_and_orbit/clock_orbit_rtcm_new.cpp

    r11002 r11004  
    459459}
    460460
    461 enum GCOB_RETURN SsrCorrRtcmNew::GetSSR(struct ClockOrbit *co, struct CodeBias *b,struct VTEC *v,
    462     struct PhaseBias *pb, const char *buffer, size_t size, int *bytesused) {
     461enum GCOB_RETURN SsrCorrRtcmNew::GetSSR(struct ClockOrbit *co, struct CodeBias *b, struct VTEC *v,
     462    struct PhaseBias *pb, struct MetaData *md, const char *buffer, size_t size, int *bytesused) {
    463463  int mmi = 0, h, rs;
    464464  unsigned int type, pos, i, j, s, nums, id;
     
    501501    *bytesused = sizeofrtcmblock + 6;
    502502   
    503   if (type == VTEC_BASE) {
    504     unsigned int l, o, d;
    505     if (!v)
     503  if (type == METADATATYPE_BASE) {
     504    unsigned int i;
     505    if (!md)
    506506      return GCOBR_NOVTECPARAMETER;
    507     memset(v, 0, sizeof(*v));
    508     D_GPS_EPOCH_TIME(v->EpochTime)
    509     D_SSR_UPDATE_INTERVAL(v->UpdateInterval)
    510     D_MULTIPLE_MESSAGE_INDICATOR(mmi)
    511     D_SSR_IOD(v->SSRIOD)
    512     D_SSR_PROVIDER_ID(v->SSRProviderID)
    513     D_SSR_SOLUTION_ID(v->SSRSolutionID)
    514     D_VTEC_QUALITY_INDICATOR(v->Quality)
    515     D_NO_IONO_LAYERS(v->NumLayers)
    516 #ifdef BNC_DEBUG_SSR
    517           fprintf(stderr, "epochTime %d ui %d mmi %d ssrIod %d providerId %d solId %d vtecQ %8.3f numLay %d \n",
    518                           v->EpochTime, v->UpdateInterval, mmi,
    519                                   v->SSRIOD, v->SSRProviderID, v->SSRSolutionID, v->Quality, v->NumLayers);
    520 #endif
    521     for (l = 0; l < v->NumLayers; ++l) {
    522       D_IONO_HEIGHT(v->Layers[l].Height)
    523       D_IONO_DEGREE(v->Layers[l].Degree)
    524       D_IONO_ORDER(v->Layers[l].Order)
    525 #ifdef BNC_DEBUG_SSR
    526           fprintf(stderr, "h  %8.3f deg %d ord %d \n",
    527                           v->Layers[l].Height, v->Layers[l].Degree, v->Layers[l].Order);
    528 #endif
    529       for (o = 0; o <= v->Layers[l].Order; ++o) {
    530         for (d = o; d <= v->Layers[l].Degree; ++d) {
    531           D_IONO_COEFF_C(v->Layers[l].Cosinus[d][o])
    532 #ifdef BNC_DEBUG_SSR
    533           fprintf(stderr, "C[%02d][%02d]  %8.3f \n",
    534                           d, o, v->Layers[l].Cosinus[d][o]);
    535 #endif
    536         }
    537       }
    538       for (o = 1; o <= v->Layers[l].Order; ++o) {
    539         for (d = o; d <= v->Layers[l].Degree; ++d) {
    540           D_IONO_COEFF_S(v->Layers[l].Sinus[d][o])
    541 #ifdef BNC_DEBUG_SSR
    542           fprintf(stderr, "S[%02d][%02d]  %8.3f \n",
    543                           d, o, v->Layers[l].Sinus[d][o]);
    544 #endif
    545         }
    546       }
     507    memset(md, 0, sizeof(*md));
     508    D_SSR_IOD(md->SSRIOD)
     509    D_SSR_PROVIDER_ID(md->SSRProviderID)
     510    D_SSR_SOLUTION_ID(md->SSRSolutionID)
     511    D_NUMBER_OF_SSR_MODEL_CORRECTION_ENTRIES(md->NumEntries)
     512#ifdef BNC_DEBUG_SSR
     513          fprintf(stderr, "ssrIod %d providerId %d solId %d numEntries %d \n",
     514                              md->SSRIOD, md->SSRProviderID, md->SSRSolutionID, md->NumEntries);
     515#endif
     516    for (i = 0; i < md->NumEntries; ++i) {
     517      unsigned int numbits;
     518      D_MODEL_CORRECTION_TYPE_INDICATOR(md->Entries[i].TypeIndicator)
     519      D_MODEL_CORRECTION_APPLICATION_INDICATOR(md->Entries[i].ApplicationIndicator)
     520
     521      D_NON_DEFAULT_MODEL_CORRECTION_INDICATOR(md->Entries[i].nonDefaultIndicator)
     522      if (md->Entries[i].ApplicationIndicator) {
     523        D_NON_DEFAULT_MODEL_CORRECTION_IDENTIFIER(md->Entries[i].nonDefaultIdentifier)
     524      }
     525      D_MODEL_CORRECTION_DATA_IOD_INDICATOR(md->Entries[i].DataIODIndicator)
     526      if (md->Entries[i].DataIODIndicator) {
     527        D_MODEL_CORRECTION_DATA_IOD(md->Entries[i].DataIOD)
     528      }
     529      if (md->Entries[i].nonDefaultIndicator) {
     530        D_ADDITIONAL_MODEL_PARAMETER_INDICATOR(md->Entries[i].additionalParameterIndicator)
     531      }
     532      if (md->Entries[i].additionalParameterIndicator) {
     533        D_NUMBER_OF_ADDITIONAL_MODEL_PARAMETER_BITS(numbits)
     534        md->Entries[i].additionalParameterNumBits = numbits;
     535      }
     536      if (md->Entries[i].nonDefaultIndicator &&
     537          md->Entries[i].additionalParameterIndicator) {
     538        D_ADDITIONAL_MODEL_PARAMETER_DATA(md->Entries[i].additionalParameterData, numbits)
     539      }
     540     
     541#ifdef BNC_DEBUG_SSR
     542      fprintf(stderr, "entry %d type (%s) apply: %s \n",
     543                          i, md->Entries[i].TypeIndicator, metaTypeToStr(md->Entries[i].TypeIndicator),
     544              md->Entries[i].ApplicationIndicator ? "yes" : "no");
     545#endif
     546
    547547    }
    548548#ifdef BNC_DEBUG_SSR
     
    10501050          }
    10511051    }
     1052    //else if (kind == COBOFS_)
    10521053    else {
    1053       /* COBOFS_PBEXT / COBOFS_SATANT / COBOFS_REGIONO: message numbers are
     1054      /* COBOFS_SATANT / COBOFS_REGIONO: message numbers are
    10541055         recognized (see setCorType()) but decoding is not implemented yet */
    10551056      return GCOBR_UNKNOWNTYPE;
     
    12341235  return CODETYPE_RESERVED;
    12351236}
    1236 
     1237//
     1238////////////////////////////////////////////////////////////////////////////
     1239std::string SsrCorrRtcmNew::metaTypeToStr(unsigned int ind) {
     1240      if (ind == 1) return "satellite antenna PCV: ";
     1241      if (ind == 2) return "satellite antenna GDV: ";
     1242      if (ind == 3) return "solid earth tides: ";
     1243      if (ind == 4) return "ocean loading: ";
     1244      if (ind == 5) return "pole tides: ";
     1245      if (ind == 6) return "relativity: ";
     1246      if (ind == 7) return "GNSS BE reference: ";     
     1247
     1248  return "reserved!";     
     1249}
  • trunk/BNC/src/RTCM3/clock_and_orbit/clock_orbit_rtcm_new.h

    r10997 r11004  
    269269    }
    270270  }
    271 
    272   std::string       codeTypeToRnxType(char system, CodeType type);
     271 
     272  std::string metaTypeToStr(unsigned int ind);
     273  std::string codeTypeToRnxType(char system, CodeType type);
    273274  SsrCorr::CodeType rnxTypeToCodeType(char system, std::string type);
    274275
     
    277278  size_t MakePhaseBias(const struct PhaseBias *b, PhaseBiasType type, int moremessagesfollow, char *buffer, size_t size);
    278279  size_t MakeVTEC(const struct VTEC *v, int moremessagesfollow, char *buffer, size_t size);
    279   enum GCOB_RETURN GetSSR(struct ClockOrbit *co, struct CodeBias *b, struct VTEC *v, struct PhaseBias *pb, const char *buffer, size_t size, int *bytesused);
     280  enum GCOB_RETURN GetSSR(struct ClockOrbit *co, struct CodeBias *b, struct VTEC *v,
     281                          struct PhaseBias *pb, struct MetaData *md,
     282                          const char *buffer, size_t size, int *bytesused);
    280283 };
    281284
Note: See TracChangeset for help on using the changeset viewer.