2121from binascii import unhexlify , hexlify
2222from enum import IntEnum
2323import xml .etree .ElementTree as et
24- from cssrlib .gnss import gpst2time , time2gst
24+ from cssrlib .gnss import gpst2time , time2gst , copy_buff
25+ from cssrlib .qznma import raw2der
2526
2627
2728class uOSNMA (IntEnum ):
@@ -164,16 +165,6 @@ class osnma():
164165 flg_slowmac = False
165166 nsat = 0
166167
167- def raw2der (self , ds ):
168- """ convert digital signature from raw format to der format """
169- lds = len (ds )
170- ln = lds // 2
171- r = int .from_bytes (ds [:ln ], byteorder = 'big' )
172- s = int .from_bytes (ds [ln :], byteorder = 'big' )
173- der = utils .encode_dss_signature (r , s )
174-
175- return bytes (der )
176-
177168 def difftime (self , t1 , t2 ):
178169 """ difference of time between t1 and t2 """
179170 wn1 , tow1 = bs .unpack_from ('u12u20' , t1 , 0 )
@@ -277,7 +268,7 @@ def verify_root_key(self):
277268
278269 result = False
279270 hash_func = self .hash_table [self .hf ]
280- ds_der = self . raw2der (self .ds )
271+ ds_der = raw2der (self .ds )
281272 if self .pubk_path is None :
282273 pk = self .pk_list [self .pkid ].pk
283274 else :
@@ -580,14 +571,8 @@ def decode_nav(self, df):
580571 return False
581572 if mt > 0 and mt <= 10 :
582573 j = (mt - 1 )* 16 * 8
583- for k in range (14 ):
584- b = bs .unpack_from ('u8' , df , 2 + 8 * k )[0 ]
585- bs .pack_into ('u8' , self .subfrm , j , b )
586- j += 8
587- for k in range (2 ):
588- b = bs .unpack_from ('u8' , df , 122 + 8 * k )[0 ]
589- bs .pack_into ('u8' , self .subfrm , j , b )
590- j += 8
574+ copy_buff (df , self .subfrm , 2 , j , 112 )
575+ copy_buff (df , self .subfrm , 122 , j + 112 , 16 )
591576 return True
592577
593578 def load_inav (self , msg ):
@@ -606,18 +591,9 @@ def load_inav(self, msg):
606591 if even != 0 or odd != 1 or pt1 != 0 or pt2 != 0 :
607592 print ("I/NAV page format error." )
608593
609- i = 2
610- for k in range (14 ):
611- nav [k ] = bs .unpack_from ('u8' , msg , i )[0 ]
612- i += 8
613- i += 8
614- for k in range (2 ):
615- nav [14 + k ] = bs .unpack_from ('u8' , msg , i )[0 ]
616- i += 8
617-
618- for k in range (5 ):
619- nma_b [k ] = bs .unpack_from ('u8' , msg , i )[0 ]
620- i += 8
594+ copy_buff (msg , nav , 2 , 0 , 112 )
595+ copy_buff (msg , nav , 122 , 112 , 16 )
596+ copy_buff (msg , nma_b , 138 , 0 , 40 )
621597
622598 return nav , nma_b
623599
@@ -629,7 +605,6 @@ def load_nav(self, nav, prn, tow):
629605 if tow % 30 == 1 :
630606 self .subfrm [j0 :j0 + 160 ] = self .subfrm_p [j0 :j0 + 160 ]
631607 self .subfrm_p [j0 :j0 + 160 ] = self .subfrm_n [j0 :j0 + 160 ]
632- # self.subfrm_n[j0:j0+160] = [0]*160
633608
634609 if mt > 0 and mt <= 10 :
635610 j = j0 + (mt - 1 )* 16
@@ -659,26 +634,17 @@ def gen_navmsg(self, prn):
659634 if self .monlevel > 1 :
660635 svid = bs .unpack_from ('u6' , self .subfrm , j0 + 16 + 3 * 16 * 8 )[0 ]
661636 wn , tow = bs .unpack_from ('u12u20' , self .subfrm , j0 + 73 + 4 * 16 * 8 )
662- print (f" svid={ svid :2d} iodnav={
663- iodnav1 :2d } gst_wn={ wn :4d} gst_tow={ tow :6d} " )
637+ print (f" svid={ svid :2d} iodnav={ iodnav1 :2d } "
638+ f" gst_wn={ wn :4d} gst_tow={ tow :6d} " )
664639
665640 msg = bytearray (69 )
666641 # 549b MT1 120b, MT2 120b, MT3 122b, MT4 120b, MT5 67b
642+ blen_t = [120 , 120 , 122 , 120 , 67 ]
667643 j = 0
668644 for mt in range (5 ):
669- for k in range (15 ):
670- b = bs .unpack_from ('u8' , self .subfrm , j0 + 6 + k * 8 + mt * 16 * 8 )[0 ]
671- bs .pack_into ('u8' , msg , j , b )
672- j += 8
673- if mt == 4 and k >= 7 :
674- b = bs .unpack_from ('u3' , self .subfrm , j0 + 70 + 4 * 16 * 8 )[0 ]
675- bs .pack_into ('u3' , msg , j , b )
676- j += 3
677- break
678- if mt == 2 :
679- b = bs .unpack_from ('u2' , self .subfrm , j0 + 126 + 2 * 16 * 8 )[0 ]
680- bs .pack_into ('u2' , msg , j , b )
681- j += 2
645+ copy_buff (self .subfrm , msg , j0 + 6 + mt * 16 * 8 , j , blen_t [mt ])
646+ j += blen_t [mt ]
647+
682648 return msg
683649
684650 def gen_utcmsg (self ):
@@ -699,15 +665,8 @@ def gen_utcmsg(self):
699665
700666 # 141b MT6 99b, MT10 42b
701667 msg = bytearray (18 )
702- j = 0
703- for k in range (13 ):
704- b = bs .unpack_from ('u8' , mt6 , 6 + k * 8 )[0 ]
705- bs .pack_into ('u8' , msg , j , b )
706- j += 8
707- j = 99
708-
709- a0g , a1g , t0g , wn0g = bs .unpack_from ('s16s12u8u6' , mt10 , 86 )
710- bs .pack_into ('s16s12u8u6' , msg , j , a0g , a1g , t0g , wn0g )
668+ copy_buff (mt6 , msg , 6 , 0 , 99 )
669+ copy_buff (mt10 , msg , 86 , 99 , 42 )
711670
712671 return msg
713672
0 commit comments