Changeset 11130 in ntrip for trunk/BNC/tests/tools/mkcrafted.py
- Timestamp:
- Oct 28, 2026, 9:32:30 AM (5 days ago)
- File:
-
- 1 edited
-
trunk/BNC/tests/tools/mkcrafted.py (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/BNC/tests/tools/mkcrafted.py
r11125 r11130 6 6 CRAFT0IGS0 IGS-SSR VTEC (4076/201), decoded by SsrCorrIgs, followed by 7 7 RTCM 1300/1301/1302 with 31-character names (BNC's RTCM scan 8 lists them only for streams that also decode successfully) 8 lists them only for streams that also decode successfully); 9 in the first epoch also two RTCM 1033 (antenna and receiver 10 descriptors): a complete one and one whose receiver descriptor 11 length (200) runs beyond the end of the message 9 12 CRAFT0RTC0 RTCM-SSR VTEC (1264), decoded by SsrCorrRtcm 10 13 CRAFT0NEW0 new RTCM-SSR metadata (60), not dispatched by BNC at present; … … 12 15 - 7 entries (maximum), additional parameter of 40 and 0 bits 13 16 - 31 entries (5-bit count, more than META_MAXNUMENTRIES=7) 17 and satellite antenna messages (DF+010-DF+021): 18 - BDS (83): C01, C17, C33, C49, C64 (mask bits in all four 19 16-bit quarters of DF394), individual blocks 20 - GPS (80): G01, G02, G32 sharing one block and one frequency 21 block; nadir angle corrections incl. the invalid value 14 22 15 23 VTEC epochs (every 5 s): … … 22 30 by eye; the heights are 100 km * layer number. 23 31 32 With --rawfile, a raw file with hostile chunk headers is written instead 33 (test of the raw file reader, data/crafted_rawfile.raw): 34 ../ESCAPE0 station ID with a path: RTCM-SSR VTEC whose .ssr file must be 35 written inside the output directory 36 CRAFT0RTC0 RTCM-SSR VTEC, 5 s later 37 then a chunk header announcing 2000000000 bytes, which must be rejected 38 24 39 Usage: mkcrafted.py <out.raw> 40 mkcrafted.py --rawfile <out.raw> 25 41 """ 26 42 … … 140 156 141 157 158 def descriptors(strings, truncate=False): 159 """RTCM 1033: antenna, setup ID, serial, receiver, firmware, serial.""" 160 w = BitWriter() 161 w.u(1033, 12) 162 w.u(0, 12) # reference station ID 163 ant, antser, rec, firm, recser = strings 164 w.text(ant, 8) 165 w.u(0, 8) # antenna setup ID 166 w.text(antser, 8) 167 if truncate: 168 w.u(200, 8) # receiver descriptor length beyond the message 169 for c in rec.encode("ascii"): 170 w.u(c, 8) 171 else: 172 w.text(rec, 8) 173 w.text(firm, 8) 174 w.text(recser, 8) 175 return frame(w.payload()) 176 177 142 178 def metadata(entries): 143 179 """entries: list of None (default model) or number of additional bits.""" … … 163 199 164 200 201 def antenna(msg, sats, shared, nadir): 202 """Satellite antenna message; sats: PRNs (1..64) of the mask.""" 203 w = BitWriter() 204 w.u(msg, 12) 205 w.u(4711, 16) # provider ID 206 w.u(5, 6) # satellite antenna IOD 207 w.u(1, 1) # phase center information 208 w.u(0, 1) # group delay information 209 w.u(1, 1) # nadir angle dependent corrections follow 210 w.u(3, 5) # maximum off-nadir angle: corrections 0..3 deg 211 w.u(1, 4) # range extension: 3 + 1 = 4 bits 212 w.u(shared, 1) # satellite set indicator 213 mask = 0 214 for prn in sats: 215 mask |= 1 << (64 - prn) 216 w.u(mask, 64) 217 for n in range(1 if shared else len(sats)): 218 w.u(shared, 1) # frequency set indicator 219 w.u(0b101000, 6) # frequencies 0 and 2 220 for f in range(1 if shared else 2): 221 w.u(1, 1) # nadir correction follows 222 w.s(100 * n + 10 * f + 1, 12) # mm 223 for deg in range(4): 224 w.s(nadir[(n + f + deg) % len(nadir)], 4) # mm, -8: invalid 225 return frame(w.payload()) 226 227 228 def rawfile(path): 229 chunks = [] 230 for i, sta in enumerate(["../ESCAPE0", "CRAFT0RTC0"]): 231 t = T0 + datetime.timedelta(seconds=5 * i) 232 chunks.append((t.isoformat(), sta, "RTCM_3", vtec_rtcm(t, [(2, 2)]))) 233 write_chunks(path, chunks) 234 t = T0 + datetime.timedelta(seconds=10) 235 with open(path, "ab") as o: 236 o.write(("%s CRAFT0RTC0 RTCM_3 2000000000\n" % t.isoformat()).encode()) 237 o.write(vtec_rtcm(t, [(2, 2)]) + b"\n") 238 239 165 240 def main(): 241 if len(sys.argv) == 3 and sys.argv[1] == "--rawfile": 242 rawfile(sys.argv[2]) 243 return 166 244 if len(sys.argv) != 2: 167 245 sys.exit(__doc__) … … 175 253 t = T0 + datetime.timedelta(seconds=5 * i) 176 254 stamp = t.isoformat() 177 chunks.append((stamp, "CRAFT0IGS0", "RTCM_3", vtec_igs(t, layers) 178 + service_crs() + helmert() + rtcm_crs())) 255 data = vtec_igs(t, layers) + service_crs() + helmert() + rtcm_crs() 256 if i == 0: 257 data += descriptors(["LEIAR25.R4 LEIT", "12345", "SEPT POLARX5", 258 "5.5.0", "3001234"]) 259 data += descriptors(["TRUNCATED ANTENNA", "9", "RECEIVER", "", ""], 260 truncate=True) 261 chunks.append((stamp, "CRAFT0IGS0", "RTCM_3", data)) 179 262 chunks.append((stamp, "CRAFT0RTC0", "RTCM_3", vtec_rtcm(t, layers))) 180 263 stamp = (T0 + datetime.timedelta(seconds=15)).isoformat() 181 264 chunks.append((stamp, "CRAFT0NEW0", "RTCM_3", 182 metadata([40, 0] + [None] * 5) + metadata([None] * 31))) 265 metadata([40, 0] + [None] * 5) + metadata([None] * 31) 266 + antenna(83, [1, 17, 33, 49, 64], 0, [-7, 0, 7, 3]) 267 + antenna(80, [1, 2, 32], 1, [5, -8, -1, 2]))) 183 268 write_chunks(sys.argv[1], chunks) 184 269
Note:
See TracChangeset
for help on using the changeset viewer.
