1414import os
1515from pathlib import Path
1616
17- from cssrlib .gnss import uGNSS , uTYP , rSigRnx , Obs , gtime_t , timediff
17+ from cssrlib .gnss import uGNSS , uTYP , rSigRnx , Obs , gtime_t , timediff , sat2prn
1818from cssrlib .rawnav import rcvDec , rcvOpt
1919
2020from cssrlib .rtcm import rtcm
@@ -41,11 +41,11 @@ def __init__(self, opt=None, prefix='', gnss_t='GECJ'):
4141
4242 if 'G' in gnss_t :
4343 self .sig_tab [uGNSS .GPS ] = {
44- uTYP .C : [rSigRnx ('GC1C' ), rSigRnx ('GC1W' ), rSigRnx ( ' GC2W' ),
44+ uTYP .C : [rSigRnx ('GC1C' ), rSigRnx ('GC2W' ),
4545 rSigRnx ('GC2L' ), rSigRnx ('GC5Q' ), rSigRnx ('GC1L' )],
46- uTYP .L : [rSigRnx ('GL1C' ), rSigRnx ('GL1W' ), rSigRnx ( ' GL2W' ),
46+ uTYP .L : [rSigRnx ('GL1C' ), rSigRnx ('GL2W' ),
4747 rSigRnx ('GL2L' ), rSigRnx ('GL5Q' ), rSigRnx ('GL1L' )],
48- uTYP .S : [rSigRnx ('GS1C' ), rSigRnx ('GS1W' ), rSigRnx ( ' GS2W' ),
48+ uTYP .S : [rSigRnx ('GS1C' ), rSigRnx ('GS2W' ),
4949 rSigRnx ('GS2L' ), rSigRnx ('GS5Q' ), rSigRnx ('GS1L' )],
5050 }
5151
@@ -108,16 +108,18 @@ def __init__(self, opt=None, prefix='', gnss_t='GECJ'):
108108
109109 self .rtcm = rtcm (foutname = foutname )
110110 self .time_p = gtime_t ()
111- self .obs = None
112111
113112 if opt is not None :
114113 self .init_param (opt = opt , prefix = prefix )
115114
116115 def add_obs (self , obs ):
116+ sys = list (obs .sig )[0 ]
117+ if sys not in self .sig_tab :
118+ return
119+
117120 self .obs .sat = np .hstack ((self .obs .sat , obs .sat ))
118121 nsat = len (obs .sat )
119122
120- sys = list (obs .sig )[0 ]
121123 if sys not in self .obs .sig :
122124 self .obs .sig [sys ] = obs .sig [sys ]
123125
@@ -132,14 +134,30 @@ def add_obs(self, obs):
132134 obs .L [np .isnan (obs .L )] = 0.0
133135
134136 for k , sig in enumerate (obs .sig [sys ][uTYP .L ]):
137+
135138 if sig in self .sig_tab [sys ][uTYP .L ]:
136139 idx = self .sig_tab [sys ][uTYP .L ].index (sig )
140+
137141 obs_ .P [:, idx ] = obs .P [:, k ]
138142 obs_ .L [:, idx ] = obs .L [:, k ]
139143 obs_ .S [:, idx ] = obs .S [:, k ]
140144 obs_ .D [:, idx ] = obs .D [:, k ]
141145 obs_ .lli [:, idx ] = obs .lli [:, k ]
142146
147+ if self .useL1CB and sys == uGNSS .QZS : # QZS L1E -> L1C
148+ k = obs_ .P [:, 1 ] != 0
149+ obs_ .P [k , 0 ] = obs_ .P [k , 1 ]
150+ obs_ .L [k , 0 ] = obs_ .L [k , 1 ]
151+ obs_ .S [k , 0 ] = obs_ .S [k , 1 ]
152+ obs_ .D [k , 0 ] = obs_ .D [k , 1 ]
153+ obs_ .lli [k , 0 ] = obs_ .lli [k , 1 ]
154+
155+ obs_ .P [k , 1 ] = 0.0
156+ obs_ .L [k , 1 ] = 0.0
157+ obs_ .S [k , 1 ] = 0.0
158+ obs_ .D [k , 1 ] = 0.0
159+ obs_ .lli [k , 1 ] = 0
160+
143161 self .obs .P = np .vstack ((self .obs .P , obs_ .P ))
144162 self .obs .L = np .vstack ((self .obs .L , obs_ .L ))
145163 self .obs .S = np .vstack ((self .obs .S , obs_ .S ))
@@ -167,10 +185,19 @@ def init_obs(self, time):
167185 self .obs .sat = np .empty (0 , dtype = int )
168186 self .obs .sig = {}
169187
170- def decode (self , buff , len_ , sys = [], prn = []):
188+ def decode (self , buff , len_ , sys = [], prn = [], scanmode = False ):
171189 """ decode RTCM binary messages """
172190
173- _ , obs , eph , geph , seph = self .rtcm .decode (buff , len_ )
191+ _ , obs , eph , geph , seph = self .rtcm .decode (buff , scanmode = scanmode )
192+
193+ if scanmode :
194+ self .re .anttype = self .rtcm .ant_desc
195+ self .re .rectype = self .rtcm .rcv_type
196+ self .re .rec = self .rtcm .rcv_serial
197+ self .re .recver = self .rtcm .firm_ver
198+ if self .rtcm .pos_arp is not None :
199+ self .re .pos = self .rtcm .pos_arp
200+ self .re .glo_bias = self .rtcm .glo_bias
174201
175202 if self .flg_rnxobs and obs is not None :
176203 self .time = obs .time
@@ -188,42 +215,36 @@ def decode(self, buff, len_, sys=[], prn=[]):
188215
189216 if not self .re .rnx_obs_header_sent :
190217 for sys in obs .sig :
191- self .re .sig_tab [sys ] = obs .sig [sys ]
218+ if sys in self .sig_tab :
219+ self .re .sig_tab [sys ] = obs .sig [sys ]
192220
193221 self .add_obs (obs )
194222
195223 self .time_p = self .time
196224
197- if eph is not None :
198- self .re .rnx_nav_body (eph , self .fh_rnxnav )
199-
200- if geph is not None :
201- self .re .rnx_gnav_body (geph , self .fh_rnxnav )
202-
203- if seph is not None :
204- self .re .rnx_snav_body (seph , self .fh_rnxnav )
225+ if self .flg_rnxnav :
205226
227+ if eph is not None :
228+ sys , prn = sat2prn (eph .sat )
229+ if sys in self .sig_tab :
230+ self .re .rnx_nav_body (eph , self .fh_rnxnav )
206231
207- def decode (f , opt , args ):
208-
209- print ("Decoding {}" .format (f ))
232+ if geph is not None :
233+ sys , prn = sat2prn (geph .sat )
234+ if sys in self .sig_tab :
235+ self .re .rnx_gnav_body (geph , self .fh_rnxnav )
210236
211- bdir , fname = os .path .split (f )
237+ if seph is not None :
238+ sys , prn = sat2prn (seph .sat )
239+ if sys in self .sig_tab :
240+ self .re .rnx_snav_body (seph , self .fh_rnxnav )
212241
213- prefix = fname [4 :].removesuffix ('.rtcm3' )+ '_'
214- prefix = str (Path (bdir ) / prefix ) if bdir else prefix
215- rtcmdec = rtcmDec (opt = opt , prefix = prefix , gnss_t = args .gnss )
216- rtcmdec .monlevel = 2
217242
218- rtcmdec .rtcm .week = args .weekref
219-
220- path = str (Path (bdir ) / fname ) if bdir else fname
221- blen = os .path .getsize (path )
243+ def rtcm_decode (rtcmdec , path , blen , scanmode = False ):
222244
223245 with open (path , 'rb' ) as f :
224246 msg = f .read (blen )
225247 maxlen = len (msg )- 5
226- # maxlen = 400000
227248 k = 0
228249 for _ in range (maxlen ):
229250 if k > maxlen :
@@ -237,9 +258,29 @@ def decode(f, opt, args):
237258 continue
238259
239260 len_ = rtcmdec .rtcm .len + 3
240- rtcmdec .decode (msg [k :k + len_ ], len_ )
261+ rtcmdec .decode (msg [k :k + len_ ], len_ , scanmode = scanmode )
241262 k += rtcmdec .rtcm .dlen
242263
264+
265+ def decode (f , opt , args ):
266+
267+ bdir , fname = os .path .split (f )
268+
269+ prefix = fname [4 :].removesuffix ('.rtcm3' )+ '_'
270+ prefix = str (Path (bdir ) / prefix ) if bdir else prefix
271+ rtcmdec = rtcmDec (opt = opt , prefix = prefix , gnss_t = args .gnss )
272+ rtcmdec .monlevel = 2
273+
274+ rtcmdec .rtcm .week = args .weekref
275+
276+ path = str (Path (bdir ) / fname ) if bdir else fname
277+ blen = os .path .getsize (path )
278+
279+ print (f"Pre-scanning { f } " )
280+ rtcm_decode (rtcmdec , path , blen , True )
281+ print (f"Decoding { f } " )
282+ rtcm_decode (rtcmdec , path , blen )
283+
243284 rtcmdec .file_close ()
244285
245286# python decode_rtcm.py ..\data\doy2025-298\CL07298j.rtc --weekref=2389
@@ -270,6 +311,9 @@ def main():
270311 parser .add_argument ("-j" , "--jobs" , default = int (mp .cpu_count () / 2 ),
271312 type = int , help = 'Max. number of parallel processes' )
272313
314+ parser .add_argument ("--useL1CB" , action = 'store_true' ,
315+ help = "use L1C/B as like L1C/A for QZS" )
316+
273317 # Retrieve all command line arguments
274318 #
275319 args = parser .parse_args ()
@@ -278,10 +322,18 @@ def main():
278322
279323 opt .flg_rnxobs = True
280324 opt .flg_rnxnav = True
325+ opt .useL1CB = args .useL1CB
326+
327+ # args.weekref = 2397 # 2025/352
328+ # args.inpFileName = '..\data\doy2025-352\sept352a.rtc'
329+ # args.inpFileName = '../data/doy2025-352/tr92352a.rtc'
330+ # args.gnss = 'GJ'
331+ # opt.useL1CB = True
281332
282333 s = args .inpFileName
283334 opt .foutname = s [:s .rfind ('.' )]+ '.log'
284335
336+ # decode(args.inpFileName, opt, args)
285337 # Start processing pool
286338 #
287339 with mp .Pool (processes = args .jobs ) as pool :
0 commit comments