Changeset 11127 in ntrip for trunk/BNC/tests/tools/ssr_harness.cpp
- Timestamp:
- Oct 24, 2026, 11:15:22 PM (7 days ago)
- File:
-
- 1 edited
-
trunk/BNC/tests/tools/ssr_harness.cpp (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/BNC/tests/tools/ssr_harness.cpp
r11125 r11127 6 6 // struct is a separate heap block here, so a write beyond a struct is 7 7 // reported by AddressSanitizer instead of silently corrupting the next member. 8 // 9 // Every decoded VTEC (all formats) and metadata message (new RTCM-SSR) is 10 // encoded again with the Make* function of the same class and decoded once 11 // more; the result must be identical (exit code 1 otherwise). 8 12 // 9 13 // Usage: ssr_harness <file> (BNC raw file or plain RTCM3 byte stream) … … 33 37 } 34 38 39 struct t_target { 40 t_target() : co(new SsrCorr::ClockOrbit()), cb(new SsrCorr::CodeBias()), 41 v(new SsrCorr::VTEC()), pb(new SsrCorr::PhaseBias()), 42 md(new SsrCorr::MetaData()), a(new SsrCorr::Antenna()) {} 43 ~t_target() {delete co; delete cb; delete v; delete pb; delete md; delete a;} 44 int decode(SsrCorr* ssr, const unsigned char* frame, size_t size) { 45 int bytesused = 0; 46 return ssr->GetSSR(co, cb, v, pb, md, a, (const char*)frame, size, &bytesused); 47 } 48 SsrCorr::ClockOrbit* co; 49 SsrCorr::CodeBias* cb; 50 SsrCorr::VTEC* v; 51 SsrCorr::PhaseBias* pb; 52 SsrCorr::MetaData* md; 53 SsrCorr::Antenna* a; 54 }; 55 56 static bool sameVTEC(const SsrCorr::VTEC* v1, const SsrCorr::VTEC* v2) { 57 if (v1->EpochTime != v2->EpochTime || v1->NumLayers != v2->NumLayers || 58 v1->Quality != v2->Quality) { 59 return false; 60 } 61 for (unsigned l = 0; l < v1->NumLayers; l++) { 62 const SsrCorr::VTEC::IonoLayers& l1 = v1->Layers[l]; 63 const SsrCorr::VTEC::IonoLayers& l2 = v2->Layers[l]; 64 if (l1.Height != l2.Height || l1.Degree != l2.Degree || l1.Order != l2.Order) { 65 return false; 66 } 67 for (unsigned d = 0; d <= l1.Degree; d++) { 68 for (unsigned o = 0; o <= l1.Order; o++) { 69 if (l1.Cosinus[d][o] != l2.Cosinus[d][o] || l1.Sinus[d][o] != l2.Sinus[d][o]) { 70 return false; 71 } 72 } 73 } 74 } 75 return true; 76 } 77 78 static bool sameMetaData(const SsrCorr::MetaData* m1, const SsrCorr::MetaData* m2) { 79 if (m1->SSRIOD != m2->SSRIOD || m1->SSRProviderID != m2->SSRProviderID || 80 m1->SSRSolutionID != m2->SSRSolutionID || m1->NumEntries != m2->NumEntries) { 81 return false; 82 } 83 for (unsigned i = 0; i < m1->NumEntries; i++) { 84 if (memcmp(&m1->Entries[i], &m2->Entries[i], sizeof(m1->Entries[i])) != 0) { 85 return false; 86 } 87 } 88 return true; 89 } 90 91 static int nFailed = 0; 92 93 // Decode, print a summary, encode the result again and compare 35 94 static void decode(const char* name, SsrCorr* ssr, const unsigned char* frame, size_t size) { 36 SsrCorr::ClockOrbit* co = new SsrCorr::ClockOrbit(); 37 SsrCorr::CodeBias* cb = new SsrCorr::CodeBias(); 38 SsrCorr::VTEC* v = new SsrCorr::VTEC(); 39 SsrCorr::PhaseBias* pb = new SsrCorr::PhaseBias(); 40 SsrCorr::MetaData* md = new SsrCorr::MetaData(); 41 SsrCorr::Antenna* a = new SsrCorr::Antenna(); 42 int bytesused = 0; 43 44 int irc = ssr->GetSSR(co, cb, v, pb, md, a, (const char*)frame, size, &bytesused); 95 t_target t1; 96 int irc = t1.decode(ssr, frame, size); 45 97 printf(" %-8s irc %3d", name, irc); 46 if (irc >= 0 && v->NumLayers) { 98 if (irc >= 0 && t1.v->NumLayers) { 47 99 double sum = 0.0; 48 100 printf(" VTEC"); 49 for (unsigned l = 0; l < v->NumLayers; l++) { 50 const SsrCorr::VTEC::IonoLayers& layer = v->Layers[l]; 101 for (unsigned l = 0; l < t1.v->NumLayers; l++) { 102 const SsrCorr::VTEC::IonoLayers& layer = t1.v->Layers[l]; 51 103 printf(" %u/%u", layer.Degree, layer.Order); 52 104 for (unsigned d = 0; d <= layer.Degree; d++) { … … 57 109 } 58 110 printf(" sum(C-S) %.3f", sum); 111 112 char buffer[CLOCKORBIT_BUFFERSIZE]; 113 size_t len = ssr->MakeVTEC(t1.v, 0, buffer, sizeof(buffer)); 114 t_target t2; 115 bool ok = len > 0 && t2.decode(ssr, (const unsigned char*)buffer, len) >= 0 && sameVTEC(t1.v, t2.v); 116 printf(" re-encoded: %s", ok ? "identical" : "DIFFERENT"); 117 nFailed += !ok; 59 118 } 60 if (irc >= 0 && md->NumEntries) { 61 printf(" META %u entries, additional data", md->NumEntries); 62 for (unsigned i = 0; i < md->NumEntries; i++) { 63 if (md->Entries[i].additionalParameterIndicator) { 64 printf(" %u:0x%x", md->Entries[i].additionalParameterNumBits, 65 md->Entries[i].additionalParameterData); 119 if (irc >= 0 && t1.md->NumEntries) { 120 printf(" META %u entries, additional data", t1.md->NumEntries); 121 for (unsigned i = 0; i < t1.md->NumEntries; i++) { 122 if (t1.md->Entries[i].additionalParameterIndicator) { 123 printf(" %u:0x%x", t1.md->Entries[i].additionalParameterNumBits, 124 t1.md->Entries[i].additionalParameterData); 66 125 } 126 } 127 SsrCorrRtcmNew* rtcmNew = dynamic_cast<SsrCorrRtcmNew*>(ssr); 128 if (rtcmNew) { 129 char buffer[CLOCKORBIT_BUFFERSIZE]; 130 size_t len = rtcmNew->MakeMetaData(t1.md, buffer, sizeof(buffer)); 131 t_target t2; 132 bool ok = len > 0 && t2.decode(ssr, (const unsigned char*)buffer, len) >= 0 && sameMetaData(t1.md, t2.md); 133 printf(" re-encoded: %s", ok ? "identical" : "DIFFERENT"); 134 nFailed += !ok; 67 135 } 68 136 } 69 137 printf("\n"); 70 71 delete co; delete cb; delete v; delete pb; delete md; delete a;72 138 } 73 139 … … 111 177 ii += len + 6; 112 178 } 179 if (nFailed) { 180 printf("%d decoded messages differ after re-encoding\n", nFailed); 181 return 1; 182 } 113 183 return 0; 114 184 }
Note:
See TracChangeset
for help on using the changeset viewer.
