Changeset 11038 in ntrip for trunk/BNC/src/RTCM3/RTCM3coDecoder.cpp
- Timestamp:
- Sep 21, 2026, 3:25:48 PM (36 hours ago)
- File:
-
- 1 edited
-
trunk/BNC/src/RTCM3/RTCM3coDecoder.cpp (modified) (8 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/BNC/src/RTCM3/RTCM3coDecoder.cpp
r11031 r11038 89 89 BNC_CORE, SLOT(slotNewMetaData(t_metaData))); 90 90 91 connect(this, SIGNAL(newSatAntennas(QList<t_satAntenna>)), 92 BNC_CORE, SLOT(slotNewSatAntennas(QList<t_satAntenna>))); 93 91 94 connect(this, SIGNAL(providerIDChanged(QString)), 92 95 BNC_CORE, SIGNAL(providerIDChanged(QString))); … … 101 104 _providerID[2] = -1; 102 105 106 for (unsigned s = 0; s < CLOCKORBIT_SATNUM; s++) { 107 _antennaSentIOD[s] = UINT_MAX; // "never sent" 108 } 109 110 _stateSnapshot = new t_stateSnapshot; 103 111 _ssrCorr = 0; 104 112 … … 110 118 delete _out; 111 119 delete _ssrCorr; 120 delete _stateSnapshot; 112 121 _IODs.clear(); 113 122 _orbCorrections.clear(); … … 118 127 _vTecMap.clear(); 119 128 _metaDataMap.clear(); 129 _satAntennas.clear(); 120 130 } 121 131 … … 185 195 while(_buffer.size()) { 186 196 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;193 197 // save state 194 memcpy(& clkOrbSav,&_clkOrb, sizeof(clkOrbSav));195 memcpy(&codeBias Sav,&_codeBias, sizeof(codeBiasSav));196 memcpy(&phaseBias Sav,&_phaseBias, sizeof(phaseBiasSav));197 memcpy(& vTECSav,&_vTEC, sizeof(vTECSav));198 memcpy(&metaData Sav,&_metaData, sizeof(metaDataSav));199 memcpy(&antenna Sav,&_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)); 200 204 201 205 int bytesused = 0; … … 205 209 206 210 if (irc <= -30) { // not enough data - restore state and exit loop 207 memcpy(&_clkOrb, & clkOrbSav, sizeof(clkOrbSav));208 memcpy(&_codeBias, &codeBias Sav, sizeof(codeBiasSav));209 memcpy(&_phaseBias, &phaseBias Sav, sizeof(phaseBiasSav));210 memcpy(&_vTEC, & vTECSav, sizeof(vTECSav));211 memcpy(&_metaData, &metaData Sav, 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)); 212 216 break; 213 217 } … … 640 644 } 641 645 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 642 720 // Dump all older epochs 643 721 // --------------------- … … 694 772 t_metaData::write(_out, itMD.value()); 695 773 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(); 696 783 } 697 784 }
Note:
See TracChangeset
for help on using the changeset viewer.
