Changeset 11038 in ntrip


Ignore:
Timestamp:
Sep 21, 2026, 3:25:48 PM (36 hours ago)
Author:
stuerze
Message:

updates regarding RTCM-SSR and bug fixed in RTCM3coDecoder

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

Legend:

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

    r11031 r11038  
    8989          BNC_CORE, SLOT(slotNewMetaData(t_metaData)));
    9090
     91  connect(this, SIGNAL(newSatAntennas(QList<t_satAntenna>)),
     92          BNC_CORE, SLOT(slotNewSatAntennas(QList<t_satAntenna>)));
     93
    9194  connect(this, SIGNAL(providerIDChanged(QString)),
    9295          BNC_CORE, SIGNAL(providerIDChanged(QString)));
     
    101104  _providerID[2] = -1;
    102105
     106  for (unsigned s = 0; s < CLOCKORBIT_SATNUM; s++) {
     107    _antennaSentIOD[s] = UINT_MAX; // "never sent"
     108  }
     109
     110  _stateSnapshot = new t_stateSnapshot;
    103111  _ssrCorr = 0;
    104112
     
    110118  delete _out;
    111119  delete _ssrCorr;
     120  delete _stateSnapshot;
    112121  _IODs.clear();
    113122  _orbCorrections.clear();
     
    118127  _vTecMap.clear();
    119128  _metaDataMap.clear();
     129  _satAntennas.clear();
    120130}
    121131
     
    185195  while(_buffer.size()) {
    186196
    187     struct SsrCorr::ClockOrbit clkOrbSav;
    188     struct SsrCorr::CodeBias   codeBiasSav;
    189     struct SsrCorr::PhaseBias  phaseBiasSav;
    190     struct SsrCorr::VTEC       vTECSav;
    191     struct SsrCorr::MetaData   metaDataSav;
    192     struct SsrCorr::Antenna    antennaSav;
    193197    // save state
    194     memcpy(&clkOrbSav,     &_clkOrb,    sizeof(clkOrbSav));
    195     memcpy(&codeBiasSav,   &_codeBias,  sizeof(codeBiasSav));
    196     memcpy(&phaseBiasSav, &_phaseBias, sizeof(phaseBiasSav));
    197     memcpy(&vTECSav,       &_vTEC,      sizeof(vTECSav));
    198     memcpy(&metaDataSav,   &_metaData,  sizeof(metaDataSav));
    199     memcpy(&antennaSav,    &_antenna,   sizeof(antennaSav));
     198    memcpy(&_stateSnapshot->clkOrb,    &_clkOrb,    sizeof(_clkOrb));
     199    memcpy(&_stateSnapshot->codeBias,  &_codeBias,  sizeof(_codeBias));
     200    memcpy(&_stateSnapshot->phaseBias, &_phaseBias, sizeof(_phaseBias));
     201    memcpy(&_stateSnapshot->vTEC,      &_vTEC,      sizeof(_vTEC));
     202    memcpy(&_stateSnapshot->metaData,  &_metaData,  sizeof(_metaData));
     203    memcpy(&_stateSnapshot->antenna,   &_antenna,   sizeof(_antenna));
    200204
    201205    int bytesused = 0;
     
    205209
    206210    if      (irc <= -30) { // not enough data - restore state and exit loop
    207       memcpy(&_clkOrb,     &clkOrbSav,    sizeof(clkOrbSav));
    208       memcpy(&_codeBias,   &codeBiasSav,  sizeof(codeBiasSav));
    209       memcpy(&_phaseBias,  &phaseBiasSav, sizeof(phaseBiasSav));
    210       memcpy(&_vTEC,       &vTECSav,      sizeof(vTECSav));
    211       memcpy(&_metaData,   &metaDataSav,  sizeof(metaDataSav));
     211      memcpy(&_clkOrb,     &_stateSnapshot->clkOrb,    sizeof(_clkOrb));
     212      memcpy(&_codeBias,   &_stateSnapshot->codeBias,  sizeof(_codeBias));
     213      memcpy(&_phaseBias,  &_stateSnapshot->phaseBias, sizeof(_phaseBias));
     214      memcpy(&_vTEC,       &_stateSnapshot->vTEC,      sizeof(_vTEC));
     215      memcpy(&_metaData,   &_stateSnapshot->metaData,  sizeof(_metaData));
    212216      break;
    213217    }
     
    640644  }
    641645
     646  // Satellite Antenna corrections
     647  // ------------------------------
     648  // _antenna, like _metaData, carries no epoch field of its own and is never
     649  // wiped by reset(), so each system's data persists across unrelated
     650  // messages. _antennaSentIOD tracks the last SatelliteAntennaIOD actually
     651  // emitted per system, so unrelated messages (and unchanged retransmissions
     652  // of the same antenna data) don't cause duplicate output - the same
     653  // freshness problem _phaseBiasSentEpoch solves for phase biases.
     654  {
     655    struct SysInfo { unsigned sysIdx; char sysChar; unsigned numSat; unsigned offset; };
     656    const SysInfo sysInfos[] = {
     657      { CLOCKORBIT_SATGPS,     'G', CLOCKORBIT_NUMGPS,     CLOCKORBIT_OFFSETGPS },
     658      { CLOCKORBIT_SATGLONASS, 'R', CLOCKORBIT_NUMGLONASS, CLOCKORBIT_OFFSETGLONASS },
     659      { CLOCKORBIT_SATGALILEO, 'E', CLOCKORBIT_NUMGALILEO, CLOCKORBIT_OFFSETGALILEO },
     660      { CLOCKORBIT_SATQZSS,    'J', CLOCKORBIT_NUMQZSS,    CLOCKORBIT_OFFSETQZSS },
     661      { CLOCKORBIT_SATBDS,     'C', CLOCKORBIT_NUMBDS,     CLOCKORBIT_OFFSETBDS },
     662    };
     663    for (const SysInfo& si : sysInfos) {
     664      unsigned s = si.sysIdx;
     665      if (_antenna.SatelliteAntennaIOD[s] == _antennaSentIOD[s]) {
     666        continue; // nothing new for this system since the last emit
     667      }
     668      if (_antenna.SatelliteMask[s] == 0) {
     669        continue; // this system's antenna data was never decoded
     670      }
     671      for (unsigned k = 0; k < si.numSat; k++) {
     672        if (!((_antenna.SatelliteMask[s] >> (63 - k)) & 1ULL)) {
     673          continue;
     674        }
     675        int num  = k + 1; // PRN within this system, DF394 MSB-first convention
     676        int flag = 0;
     677        switch (si.sysChar) {
     678        case 'G': flag = t_eph::LNAV;    break;
     679        case 'R': flag = t_eph::FDMA_M;  break;
     680        case 'E': flag = t_eph::INAV;    break;
     681        case 'J': flag = t_eph::LNAV;    break;
     682        case 'C': flag = (num < 6 || (num > 58 && num < 63)) ? t_eph::D2 : t_eph::D1; break;
     683        }
     684
     685        t_satAntenna satAntenna;
     686        satAntenna._prn.set(si.sysChar, num, flag);
     687        satAntenna._staID                     = _staID.toStdString();
     688        satAntenna._time                      = _lastTime;
     689        satAntenna._ssrProviderID             = _antenna.SSRProviderID[s];
     690        satAntenna._satelliteAntennaIOD       = _antenna.SatelliteAntennaIOD[s];
     691        satAntenna._phaseCenterInfoInd        = _antenna.PhaseCenterInformationIndicator[s];
     692        satAntenna._groupDelayInfoInd         = _antenna.GroupDelayInformationIndicator[s];
     693        satAntenna._nadirAngleDependentCorrInd = _antenna.NadirAngleDependentCorrectionIndicator[s];
     694        satAntenna._maximumOffNadirAngle      = _antenna.maximumOffNadirAngle[s];
     695        satAntenna._nadirAngleRangeExtension  = _antenna.NadirAngleDependentCorrectionRangeExtension[s];
     696
     697        const SsrCorr::Antenna::SatellitePart& satPart = _antenna.Sat[si.offset + k];
     698        for (unsigned f = 0; f < ANT_MAXFREQUENCIES; f++) {
     699          if (!((satPart.GnssFrequencyMask >> (ANT_MAXFREQUENCIES - 1 - f)) & 1U)) {
     700            continue;
     701          }
     702          t_frqAntenna frqAntenna;
     703          frqAntenna._freqIndex                = f;
     704          frqAntenna._nadirCorrectionIndicator = satPart.Freq[f].NadirCorrectionIndicator;
     705          frqAntenna._nadirCorrection          = satPart.Freq[f].NadirCorrection;
     706          if (satAntenna._nadirAngleDependentCorrInd) {
     707            unsigned count = satAntenna._maximumOffNadirAngle + 1;
     708            for (unsigned deg = 0; deg < count && deg < ANT_MAXNADIRDEGREES; deg++) {
     709              frqAntenna._nadirAngleCorrection.push_back(satPart.Freq[f].NadirAngleCorrection[deg]);
     710            }
     711          }
     712          satAntenna._freq.push_back(frqAntenna);
     713        }
     714        _satAntennas[_lastTime].append(satAntenna);
     715      }
     716      _antennaSentIOD[s] = _antenna.SatelliteAntennaIOD[s];
     717    }
     718  }
     719
    642720  // Dump all older epochs
    643721  // ---------------------
     
    694772      t_metaData::write(_out, itMD.value());
    695773      itMD.remove();
     774    }
     775  }
     776  QMutableMapIterator<bncTime, QList<t_satAntenna> > itAnt(_satAntennas);
     777  while (itAnt.hasNext()) {
     778    itAnt.next();
     779    if (itAnt.key() < _lastTime) {
     780      emit newSatAntennas(itAnt.value());
     781      t_satAntenna::writeEpoch(_out, itAnt.value());
     782      itAnt.remove();
    696783    }
    697784  }
  • trunk/BNC/src/RTCM3/RTCM3coDecoder.h

    r11031 r11038  
    6464  void newTec(t_vTec);
    6565  void newMetaData(t_metaData);
     66  void newSatAntennas(QList<t_satAntenna>);
    6667  void newMessage(QByteArray msg, bool showOnScreen);
    6768  void providerIDChanged(QString staID);
     
    7475  void checkProviderID();
    7576  bool corrIsOutOfRange(const SsrCorr::ClockOrbit::SatData& coSat);
     77
     78  struct t_stateSnapshot {
     79    SsrCorr::ClockOrbit clkOrb;
     80    SsrCorr::CodeBias   codeBias;
     81    SsrCorr::PhaseBias  phaseBias;
     82    SsrCorr::VTEC       vTEC;
     83    SsrCorr::MetaData   metaData;
     84    SsrCorr::Antenna    antenna;
     85  };
    7686
    7787  std::ofstream*                        _out;
     
    8696  SsrCorr::MetaData                     _metaData;
    8797  SsrCorr::Antenna                      _antenna;
     98  t_stateSnapshot*                      _stateSnapshot;
    8899  int                                   _providerID[3];
    89100  e_type                                _type;
     
    98109  QMap<bncTime, t_vTec>                 _vTecMap;
    99110  QMap<bncTime, t_metaData>             _metaDataMap;
     111  QMap<bncTime, QList<t_satAntenna> >   _satAntennas;
    100112  unsigned int                          _phaseBiasSentEpoch[CLOCKORBIT_SATNUM];
     113  unsigned int                          _antennaSentIOD[CLOCKORBIT_SATNUM];
    101114};
    102115
Note: See TracChangeset for help on using the changeset viewer.