1010import numpy as np
1111import bitstruct as bs
1212from cssrlib .cssrlib import cssr , sCSSRTYPE , sCSSR , local_corr , sCType
13- from cssrlib .gnss import gpst2time , uGNSS , prn2sat , rCST
13+ from cssrlib .gnss import gpst2time , time2str , uGNSS , prn2sat , rCST , sat2id
1414
1515
1616class areaInfo ():
@@ -46,6 +46,8 @@ def __init__(self, foutname=None):
4646 self .ci = {}
4747
4848 self .area = - 1
49+ self .reg = - 1
50+ self .alrt = 0
4951 self .narea_t = {1 : 8 , 2 : 16 , 3 : 5 , 4 : 1 , 5 : 8 }
5052 self .MAXNET = np .sum (list (self .narea_t .values ()))
5153
@@ -108,9 +110,10 @@ def get_stec(self, dlat=0.0, dlon=0.0):
108110 # if p.inet_ref != self.iodssr:
109111 # return 0.0
110112 stec = np .zeros (p .nsat_n )
113+ v = np .array ([1 , dlat , dlon , dlat * dlon , dlat ** 2 , dlon ** 2 ])
111114
112115 for i , sat in enumerate (p .sat_n ):
113- stec [i ] = [ 1 , dlat , dlon , dlat * dlon , dlat ** 2 , dlon ** 2 ] @p .ci [sat ]
116+ stec [i ] = v @p .ci [sat ]
114117
115118 return stec
116119
@@ -121,6 +124,9 @@ def decode_mdc_stec_area(self, buff, i=0):
121124 self .tow0 = tow // 3600 * 3600
122125 reg , alrt , len_ , narea = bs .unpack_from ('u8u1u16u5' , buff , i )
123126 i += 30
127+ self .reg = reg
128+ self .alrt = alrt
129+
124130 if reg not in self .pnt :
125131 self .pnt [reg ] = {}
126132
@@ -130,14 +136,14 @@ def decode_mdc_stec_area(self, buff, i=0):
130136
131137 if sid == 0 : # rectangle shape
132138 latr , lonr , lats , lons = bs .unpack_from ('s11u12u8u8' , buff , i )
133- if self .monlevel > 2 :
139+ if self .monlevel >= 2 :
134140 print (f"{ reg } { area :2d} { sid } { latr * 0.1 :5.1f} "
135141 f"{ lonr * 0.1 :5.1f} { lats * 0.1 :3.1f} { lons * 0.1 :3.1f} " )
136142 self .pnt [reg ][area ] = areaInfo (
137143 sid , latr * 0.1 , lonr * 0.1 , lats * 0.1 , lons * 0.1 )
138144 else : # circle range
139145 latr , lonr , rng = bs .unpack_from ('s15u16u8' , buff , i )
140- if self .monlevel > 2 :
146+ if self .monlevel >= 2 :
141147 print (f"{ reg } { area :2d} { sid } { latr * 0.01 :6.2f} "
142148 f"{ lonr * 0.01 :6.2f} { rng * 10 } " )
143149 self .pnt [reg ][area ] = areaInfo (
@@ -168,6 +174,9 @@ def decode_mdc_stec_corr(self, buff, i=0):
168174 reg , area , stype_ = bs .unpack_from ('u8u5u2' , buff , i )
169175 i += 15
170176
177+ self .reg = reg
178+ self .area = area
179+
171180 nsat = bs .unpack_from ('u5u5u5u5u5' , buff , i )
172181 i += 25
173182 # gps, glo, gal, bds, qzss
@@ -224,6 +233,48 @@ def decode_mdc_stec_corr(self, buff, i=0):
224233
225234 return i
226235
236+ def out_log (self ):
237+ # if self.msgtype not in (1, 2):
238+ # return super(cssr_mdc, self).out_log()
239+
240+ sz_t = [1 , 3 , 4 , 6 ]
241+
242+ if self .time == - 1 :
243+ return
244+
245+ self .fh .write ("{:4d}\t {:s}\n " .format (self .msgtype ,
246+ time2str (self .time )))
247+
248+ if self .msgtype == 1 :
249+
250+ self .fh .write (f"Reg\t Area\t sid\t "
251+ f"latr\t lonr\t lats\t lons\n " )
252+
253+ for area in self .pnt [self .reg ].keys ():
254+ p = self .pnt [self .reg ][area ]
255+ self .fh .write (f"{ self .reg } \t { area :2d} \t { p .sid } \t "
256+ f"{ p .latr :3.1f} \t { p .lonr :4.1f} \t " )
257+
258+ if p .sid == 0 :
259+ self .fh .write (f"{ p .lats :3.1f} \t { p .lons :3.1f} \n " )
260+ else :
261+ self .fh .write (f"{ p .rng :3.1f} \n " )
262+
263+ elif self .msgtype == 2 :
264+ inet = self .get_inet (self .reg , self .area )
265+
266+ self .fh .write (f"Reg:{ self .reg } \t Area:{ self .area :2d} \n " )
267+ self .fh .write ("Sat,stype,c00,c01,c10,c11,c20,c02\n " )
268+
269+ for sat in self .lc [inet ].sat_n :
270+ stype = self .lc [inet ].stype [sat ]
271+ ci = self .lc [inet ].ci [sat ]
272+ self .fh .write (f"{ sat2id (sat )} \t { stype } " )
273+ for k in range (sz_t [stype ]):
274+ self .fh .write (f"\t { ci [k ]:6.2f} " )
275+ self .fh .write ("\n " )
276+ self .fh .flush ()
277+
227278 def decode_cssr (self , msg , i = 0 ):
228279 """decode Compact SSR message with MADOCA-PPP extension """
229280 df = {'msgtype' : 4073 }
@@ -233,6 +284,7 @@ def decode_cssr(self, msg, i=0):
233284 if df ['msgtype' ] not in [1 , 2 , 4073 ]:
234285 return - 1
235286
287+ self .msgtype = df ['msgtype' ]
236288 self .subtype = df ['subtype' ]
237289 if df ['msgtype' ] == 4073 : # Compact SSR
238290 if self .subtype == sCSSR .MASK :
0 commit comments