Changeset 11010 in ntrip for trunk


Ignore:
Timestamp:
Sep 9, 2026, 2:54:43 PM (2 days ago)
Author:
stuerze
Message:

updates regarding RTCM-SSR

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

Legend:

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

    r11008 r11010  
    4141#include <stdio.h>
    4242#include <math.h>
     43#include <climits>
    4344
    4445#include "RTCM3coDecoder.h"
     
    126127  if (resetPhaseBias) {
    127128    memset(&_phaseBias, 0, sizeof(_phaseBias));
     129    for (unsigned s = 0; s < CLOCKORBIT_SATNUM; s++) {
     130      _phaseBiasSentEpoch[s] = UINT_MAX; // "never sent"
     131    }
    128132  }
    129133  memset(&_vTEC,      0, sizeof(_vTEC));
     
    476480  // Phase Biases
    477481  // -----------
     482  // _phaseBias is no longer wiped between messages (kept alive so a later
     483  // Extended Phase Bias message can correlate against it - see
     484  // COBOFS_PBEXT), so without this guard the block below would re-append
     485  // the same system's satellites into the output on every other message
     486  // decoded in between two actual phase-bias messages. Only emit a
     487  // system's satellites once per epoch, tracked per system by comparing
     488  // against the epoch we last actually sent for it.
     489  bool phaseBiasFresh[CLOCKORBIT_SATNUM];
     490  for (unsigned s = 0; s < CLOCKORBIT_SATNUM; s++) {
     491    phaseBiasFresh[s] = _phaseBias.NumberOfSat[s] > 0 &&
     492                         _phaseBias.EpochTime[s] != _phaseBiasSentEpoch[s];
     493    if (phaseBiasFresh[s]) {
     494      _phaseBiasSentEpoch[s] = _phaseBias.EpochTime[s];
     495    }
     496  }
    478497  for (unsigned ii = 0; ii <  CLOCKORBIT_NUMGPS
    479498                            + CLOCKORBIT_NUMGLONASS
     
    487506    int flag = 0;
    488507    if      (ii < _phaseBias.NumberOfSat[CLOCKORBIT_SATGPS]) {
     508      if (!phaseBiasFresh[CLOCKORBIT_SATGPS]) continue;
    489509      sys = 'G';
    490510      flag = t_eph::LNAV;
     
    492512    else if (ii >= CLOCKORBIT_OFFSETGLONASS &&
    493513        ii < CLOCKORBIT_OFFSETGLONASS + _phaseBias.NumberOfSat[CLOCKORBIT_SATGLONASS]) {
     514      if (!phaseBiasFresh[CLOCKORBIT_SATGLONASS]) continue;
    494515      sys = 'R';
    495516      flag = t_eph::FDMA_M;
     
    497518    else if (ii >= CLOCKORBIT_OFFSETGALILEO &&
    498519        ii < CLOCKORBIT_OFFSETGALILEO + _phaseBias.NumberOfSat[CLOCKORBIT_SATGALILEO]) {
     520      if (!phaseBiasFresh[CLOCKORBIT_SATGALILEO]) continue;
    499521      sys = 'E';
    500522      flag = t_eph::INAV;
     
    502524    else if (ii >= CLOCKORBIT_OFFSETQZSS &&
    503525        ii < CLOCKORBIT_OFFSETQZSS + _phaseBias.NumberOfSat[CLOCKORBIT_SATQZSS]) {
     526      if (!phaseBiasFresh[CLOCKORBIT_SATQZSS]) continue;
    504527      sys = 'J';
    505528      flag = t_eph::LNAV;
     
    507530    else if (ii >= CLOCKORBIT_OFFSETSBAS &&
    508531        ii < CLOCKORBIT_OFFSETSBAS + _phaseBias.NumberOfSat[CLOCKORBIT_SATSBAS]) {
     532      if (!phaseBiasFresh[CLOCKORBIT_SATSBAS]) continue;
    509533      sys = 'S';
    510534      flag = t_eph::SBASL1;
     
    512536    else if (ii >= CLOCKORBIT_OFFSETBDS &&
    513537        ii < CLOCKORBIT_OFFSETBDS + _phaseBias.NumberOfSat[CLOCKORBIT_SATBDS]) {
     538      if (!phaseBiasFresh[CLOCKORBIT_SATBDS]) continue;
    514539      sys = 'C';
    515540      if (num < 6) {// GEO
     
    854879void RTCM3coDecoder::setEpochTime() {
    855880
     881  // _phaseBias is no longer wiped between messages (kept alive so a later
     882  // Extended Phase Bias message can correlate against it), so
     883  // NumberOfSat[s] > 0 alone no longer means "phase bias was just decoded
     884  // this cycle" - it can be stale from many messages ago. Gate each
     885  // phase-bias fallback below on the same per-system freshness tracking
     886  // sendResults() uses (_phaseBiasSentEpoch), so a stale leftover value
     887  // never gets picked as this cycle's epoch.
     888  bncTime prevTime = _lastTime;
    856889  _lastTime.reset();
    857890
     
    868901    epoSecGPS = _codeBias.EpochTime[CLOCKORBIT_SATGPS];      // 0 .. 604799 s
    869902  }
    870   else if (_phaseBias.NumberOfSat[CLOCKORBIT_SATGPS] > 0) {
     903  else if (_phaseBias.NumberOfSat[CLOCKORBIT_SATGPS] > 0 &&
     904           _phaseBias.EpochTime[CLOCKORBIT_SATGPS] != _phaseBiasSentEpoch[CLOCKORBIT_SATGPS]) {
    871905    epoSecGPS = _phaseBias.EpochTime[CLOCKORBIT_SATGPS];     // 0 .. 604799 s
    872906  }
     
    880914    epoSecGlo = _codeBias.EpochTime[CLOCKORBIT_SATGLONASS];  // 0 .. 86399 s
    881915  }
    882   else if (_phaseBias.NumberOfSat[CLOCKORBIT_SATGLONASS] > 0) {
     916  else if (_phaseBias.NumberOfSat[CLOCKORBIT_SATGLONASS] > 0 &&
     917           _phaseBias.EpochTime[CLOCKORBIT_SATGLONASS] != _phaseBiasSentEpoch[CLOCKORBIT_SATGLONASS]) {
    883918    epoSecGlo = _phaseBias.EpochTime[CLOCKORBIT_SATGLONASS]; // 0 .. 86399 s
    884919  }
     
    889924    epoSecGal = _codeBias.EpochTime[CLOCKORBIT_SATGALILEO];
    890925  }
    891   else if (_phaseBias.NumberOfSat[CLOCKORBIT_SATGALILEO] > 0) {
     926  else if (_phaseBias.NumberOfSat[CLOCKORBIT_SATGALILEO] > 0 &&
     927           _phaseBias.EpochTime[CLOCKORBIT_SATGALILEO] != _phaseBiasSentEpoch[CLOCKORBIT_SATGALILEO]) {
    892928    epoSecGal = _phaseBias.EpochTime[CLOCKORBIT_SATGALILEO];
    893929  }
     
    898934    epoSecQzss = _codeBias.EpochTime[CLOCKORBIT_SATQZSS];
    899935  }
    900   else if (_phaseBias.NumberOfSat[CLOCKORBIT_SATQZSS] > 0) {
     936  else if (_phaseBias.NumberOfSat[CLOCKORBIT_SATQZSS] > 0 &&
     937           _phaseBias.EpochTime[CLOCKORBIT_SATQZSS] != _phaseBiasSentEpoch[CLOCKORBIT_SATQZSS]) {
    901938    epoSecQzss = _phaseBias.EpochTime[CLOCKORBIT_SATQZSS];
    902939  }
     
    907944    epoSecSbas = _codeBias.EpochTime[CLOCKORBIT_SATSBAS];
    908945  }
    909   else if (_phaseBias.NumberOfSat[CLOCKORBIT_SATSBAS] > 0) {
     946  else if (_phaseBias.NumberOfSat[CLOCKORBIT_SATSBAS] > 0 &&
     947           _phaseBias.EpochTime[CLOCKORBIT_SATSBAS] != _phaseBiasSentEpoch[CLOCKORBIT_SATSBAS]) {
    910948    epoSecSbas = _phaseBias.EpochTime[CLOCKORBIT_SATSBAS];
    911949  }
     
    916954    epoSecBds = _codeBias.EpochTime[CLOCKORBIT_SATBDS];
    917955  }
    918   else if (_phaseBias.NumberOfSat[CLOCKORBIT_SATBDS] > 0) {
     956  else if (_phaseBias.NumberOfSat[CLOCKORBIT_SATBDS] > 0 &&
     957           _phaseBias.EpochTime[CLOCKORBIT_SATBDS] != _phaseBiasSentEpoch[CLOCKORBIT_SATBDS]) {
    919958    epoSecBds = _phaseBias.EpochTime[CLOCKORBIT_SATBDS];
    920959  }
  • trunk/BNC/src/RTCM3/RTCM3coDecoder.h

    r11008 r11010  
    9797  QMap<bncTime, t_vTec>                 _vTecMap;
    9898  QMap<bncTime, t_metaData>             _metaDataMap;
     99  unsigned int                          _phaseBiasSentEpoch[CLOCKORBIT_SATNUM];
    99100};
    100101
Note: See TracChangeset for help on using the changeset viewer.