- Timestamp:
- Sep 9, 2026, 2:54:43 PM (2 days ago)
- Location:
- trunk/BNC/src/RTCM3
- Files:
-
- 2 edited
-
RTCM3coDecoder.cpp (modified) (16 diffs)
-
RTCM3coDecoder.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/BNC/src/RTCM3/RTCM3coDecoder.cpp
r11008 r11010 41 41 #include <stdio.h> 42 42 #include <math.h> 43 #include <climits> 43 44 44 45 #include "RTCM3coDecoder.h" … … 126 127 if (resetPhaseBias) { 127 128 memset(&_phaseBias, 0, sizeof(_phaseBias)); 129 for (unsigned s = 0; s < CLOCKORBIT_SATNUM; s++) { 130 _phaseBiasSentEpoch[s] = UINT_MAX; // "never sent" 131 } 128 132 } 129 133 memset(&_vTEC, 0, sizeof(_vTEC)); … … 476 480 // Phase Biases 477 481 // ----------- 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 } 478 497 for (unsigned ii = 0; ii < CLOCKORBIT_NUMGPS 479 498 + CLOCKORBIT_NUMGLONASS … … 487 506 int flag = 0; 488 507 if (ii < _phaseBias.NumberOfSat[CLOCKORBIT_SATGPS]) { 508 if (!phaseBiasFresh[CLOCKORBIT_SATGPS]) continue; 489 509 sys = 'G'; 490 510 flag = t_eph::LNAV; … … 492 512 else if (ii >= CLOCKORBIT_OFFSETGLONASS && 493 513 ii < CLOCKORBIT_OFFSETGLONASS + _phaseBias.NumberOfSat[CLOCKORBIT_SATGLONASS]) { 514 if (!phaseBiasFresh[CLOCKORBIT_SATGLONASS]) continue; 494 515 sys = 'R'; 495 516 flag = t_eph::FDMA_M; … … 497 518 else if (ii >= CLOCKORBIT_OFFSETGALILEO && 498 519 ii < CLOCKORBIT_OFFSETGALILEO + _phaseBias.NumberOfSat[CLOCKORBIT_SATGALILEO]) { 520 if (!phaseBiasFresh[CLOCKORBIT_SATGALILEO]) continue; 499 521 sys = 'E'; 500 522 flag = t_eph::INAV; … … 502 524 else if (ii >= CLOCKORBIT_OFFSETQZSS && 503 525 ii < CLOCKORBIT_OFFSETQZSS + _phaseBias.NumberOfSat[CLOCKORBIT_SATQZSS]) { 526 if (!phaseBiasFresh[CLOCKORBIT_SATQZSS]) continue; 504 527 sys = 'J'; 505 528 flag = t_eph::LNAV; … … 507 530 else if (ii >= CLOCKORBIT_OFFSETSBAS && 508 531 ii < CLOCKORBIT_OFFSETSBAS + _phaseBias.NumberOfSat[CLOCKORBIT_SATSBAS]) { 532 if (!phaseBiasFresh[CLOCKORBIT_SATSBAS]) continue; 509 533 sys = 'S'; 510 534 flag = t_eph::SBASL1; … … 512 536 else if (ii >= CLOCKORBIT_OFFSETBDS && 513 537 ii < CLOCKORBIT_OFFSETBDS + _phaseBias.NumberOfSat[CLOCKORBIT_SATBDS]) { 538 if (!phaseBiasFresh[CLOCKORBIT_SATBDS]) continue; 514 539 sys = 'C'; 515 540 if (num < 6) {// GEO … … 854 879 void RTCM3coDecoder::setEpochTime() { 855 880 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; 856 889 _lastTime.reset(); 857 890 … … 868 901 epoSecGPS = _codeBias.EpochTime[CLOCKORBIT_SATGPS]; // 0 .. 604799 s 869 902 } 870 else if (_phaseBias.NumberOfSat[CLOCKORBIT_SATGPS] > 0) { 903 else if (_phaseBias.NumberOfSat[CLOCKORBIT_SATGPS] > 0 && 904 _phaseBias.EpochTime[CLOCKORBIT_SATGPS] != _phaseBiasSentEpoch[CLOCKORBIT_SATGPS]) { 871 905 epoSecGPS = _phaseBias.EpochTime[CLOCKORBIT_SATGPS]; // 0 .. 604799 s 872 906 } … … 880 914 epoSecGlo = _codeBias.EpochTime[CLOCKORBIT_SATGLONASS]; // 0 .. 86399 s 881 915 } 882 else if (_phaseBias.NumberOfSat[CLOCKORBIT_SATGLONASS] > 0) { 916 else if (_phaseBias.NumberOfSat[CLOCKORBIT_SATGLONASS] > 0 && 917 _phaseBias.EpochTime[CLOCKORBIT_SATGLONASS] != _phaseBiasSentEpoch[CLOCKORBIT_SATGLONASS]) { 883 918 epoSecGlo = _phaseBias.EpochTime[CLOCKORBIT_SATGLONASS]; // 0 .. 86399 s 884 919 } … … 889 924 epoSecGal = _codeBias.EpochTime[CLOCKORBIT_SATGALILEO]; 890 925 } 891 else if (_phaseBias.NumberOfSat[CLOCKORBIT_SATGALILEO] > 0) { 926 else if (_phaseBias.NumberOfSat[CLOCKORBIT_SATGALILEO] > 0 && 927 _phaseBias.EpochTime[CLOCKORBIT_SATGALILEO] != _phaseBiasSentEpoch[CLOCKORBIT_SATGALILEO]) { 892 928 epoSecGal = _phaseBias.EpochTime[CLOCKORBIT_SATGALILEO]; 893 929 } … … 898 934 epoSecQzss = _codeBias.EpochTime[CLOCKORBIT_SATQZSS]; 899 935 } 900 else if (_phaseBias.NumberOfSat[CLOCKORBIT_SATQZSS] > 0) { 936 else if (_phaseBias.NumberOfSat[CLOCKORBIT_SATQZSS] > 0 && 937 _phaseBias.EpochTime[CLOCKORBIT_SATQZSS] != _phaseBiasSentEpoch[CLOCKORBIT_SATQZSS]) { 901 938 epoSecQzss = _phaseBias.EpochTime[CLOCKORBIT_SATQZSS]; 902 939 } … … 907 944 epoSecSbas = _codeBias.EpochTime[CLOCKORBIT_SATSBAS]; 908 945 } 909 else if (_phaseBias.NumberOfSat[CLOCKORBIT_SATSBAS] > 0) { 946 else if (_phaseBias.NumberOfSat[CLOCKORBIT_SATSBAS] > 0 && 947 _phaseBias.EpochTime[CLOCKORBIT_SATSBAS] != _phaseBiasSentEpoch[CLOCKORBIT_SATSBAS]) { 910 948 epoSecSbas = _phaseBias.EpochTime[CLOCKORBIT_SATSBAS]; 911 949 } … … 916 954 epoSecBds = _codeBias.EpochTime[CLOCKORBIT_SATBDS]; 917 955 } 918 else if (_phaseBias.NumberOfSat[CLOCKORBIT_SATBDS] > 0) { 956 else if (_phaseBias.NumberOfSat[CLOCKORBIT_SATBDS] > 0 && 957 _phaseBias.EpochTime[CLOCKORBIT_SATBDS] != _phaseBiasSentEpoch[CLOCKORBIT_SATBDS]) { 919 958 epoSecBds = _phaseBias.EpochTime[CLOCKORBIT_SATBDS]; 920 959 } -
trunk/BNC/src/RTCM3/RTCM3coDecoder.h
r11008 r11010 97 97 QMap<bncTime, t_vTec> _vTecMap; 98 98 QMap<bncTime, t_metaData> _metaDataMap; 99 unsigned int _phaseBiasSentEpoch[CLOCKORBIT_SATNUM]; 99 100 }; 100 101
Note:
See TracChangeset
for help on using the changeset viewer.
