@@ -57,9 +57,15 @@ class sRTCM(IntEnum):
5757
5858class Integrity ():
5959 """ class for integrity information in SC-134 """
60- pid = 0 # provider id DFi027 (0-4095)
60+ pid = 0 # augmentation provider id DFi027 (0-4095)
6161 vp = 0 # validity period DFi065 (0-15)
6262 uri = 0 # update rate interval DFi067 (b16)
63+
64+ # placeholder for RTCM SSR
65+ pidssr = 0 # SSR provider ID
66+ sidssr = 0 # SSR solution type
67+ iodssr = 0 # SSR iod
68+
6369 tow = 0
6470 iod_sys = {} # issue of GNSS satellite mask DFi010 (b2)
6571 sts = {} # constellation integrity status DFi029 (b16)
@@ -166,11 +172,12 @@ class Integrity():
166172
167173 def __init__ (self ):
168174 self .sys_r_tbl = {self .sys_tbl [s ]: s for s in self .sys_tbl .keys ()}
169- None
175+ self . vp_r_tbl = { s : k for k , s in enumerate ( self . vp_tbl )}
170176
171177
172178class rtcm (cssr ):
173179 """ class to decode RTCM3 messages """
180+
174181 def __init__ (self , foutname = None ):
175182 super ().__init__ (foutname )
176183 self .len = 0
@@ -180,6 +187,9 @@ def __init__(self, foutname=None):
180187 self .lock = {}
181188 self .mask_pbias = False
182189
190+ self .pid = 0 # SSR Provider ID
191+ self .sid = 0 # SSR Solution Type
192+
183193 self .nrtk_r = {}
184194
185195 self .msm_t = {
@@ -529,6 +539,9 @@ def decode_head(self, msg, i, sys):
529539 else :
530540 nsat = 0
531541
542+ self .pid = pid
543+ self .sid = sid
544+
532545 v = {'iodssr' : iodssr , 'nsat' : nsat }
533546 return i , v
534547
@@ -2522,36 +2535,34 @@ def decode_integrity_mmap(self, msg, i):
25222535
25232536 def decode_integrity_ssr (self , msg , i ):
25242537 """ RTCM SC-134 SSR integrity message (MT11,12,13) """
2525- pid , tow , mask_sys = bs .unpack_from ('u12u30u16' , msg , i )
2526- i += 58
2527- tow *= 1e-3
2538+ self .integ .pid = bs .unpack_from ('u12' , msg , i )[0 ]
2539+ i += 12
25282540
2529- # update rate interval DFi067
2541+ # SSR provider ID, solution type, iod
2542+ self .pid , self .sid , self .iodssr = bs .unpack_from ('u16u4u4' , msg , i )
2543+ i += 24
25302544
25312545 # mask_sys:: DFi013 0:GPS,1:GLO,2:GAL,3:BDS,4:QZS,5:IRN
2546+ tow , mask_sys = bs .unpack_from ('u30u16' , msg , i )
2547+ i += 46
25322548
2533- if self .msgtype == 11 :
2534- vp , uri = bs .unpack_from ('u4u16' , msg , i )
2535- i += 20
2536- # Validity Period DFi065 (0-15)
2537- self .integ .vp = self .integ .vp_tbl [vp ]
2538- self .integ .uri = uri * 0.1 # update rate interval DFi067 (0.1)
2549+ self .integ .tow = tow * 1e-3
2550+ self .integ .mask_sys = mask_sys
2551+
2552+ vp , uri = bs .unpack_from ('u4u16' , msg , i )
2553+ i += 20
2554+ self .integ .vp = self .integ .vp_tbl [vp ] # Validity Period DFi065 (0-15)
2555+ self .integ .uri = uri * 0.1 # update rate interval DFi067 (0.1)
25392556
25402557 sys_t , nsys = self .decode_mask (mask_sys , 16 , ofst = 0 )
25412558 iod_sys = {}
2542- for k in range (nsys ):
2543- sys = self .integ .sys_tbl [sys_t [k ]]
2544- iod_sys [sys ] = bs .unpack_from ('u2' , msg , i )[0 ]
2545- i += 2
2546-
25472559 flag_t = {}
2548- nid = {}
25492560 for sys_ in sys_t :
2550- nid_ , mask_sat = bs .unpack_from ('u8u64' , msg , i )
2551- i += 72
2561+ sys = self .integ .sys_tbl [sys_ ]
2562+ mask_sat , iod_sys [sys ] = bs .unpack_from ('u64u2' , msg , i )
2563+ i += 66
25522564 svid_t , nsat = self .decode_mask (mask_sat , 64 )
25532565 sys = self .integ .sys_tbl [sys_ ]
2554- nid [sys ] = nid_
25552566 flag_t [sys ] = {}
25562567 for svid in svid_t :
25572568 ofst = 192 if sys == uGNSS .QZS else 0
@@ -2560,11 +2571,7 @@ def decode_integrity_ssr(self, msg, i):
25602571 flag_t [sys ][sat ] = bs .unpack_from ('u2' , msg , i )[0 ]
25612572 i += 2
25622573
2563- self .integ .mask_sys = mask_sys
2564- self .integ .pid = pid
2565- self .integ .tow = tow
25662574 self .integ .iod_sys = iod_sys
2567- self .integ .nid = nid
25682575 self .integ .flag = flag_t
25692576
25702577 def decode (self , msg , subtype = None ):
@@ -2702,6 +2709,9 @@ def __init__(self):
27022709 super ().__init__ ()
27032710 self .integ = Integrity ()
27042711
2712+ self .pid = 0 # SSR Provider ID
2713+ self .sid = 0 # SSR Solution Type
2714+
27052715 def set_sync (self , msg , k ):
27062716 msg [k ] = 0xd3
27072717
@@ -2732,27 +2742,27 @@ def encode_integrity_ssr(self, msg, i):
27322742 for sys in sys_t :
27332743 gnss_t .append (self .integ .sys_r_tbl [sys ])
27342744
2745+ # mask_sys:: DFi013 0:GPS,1:GLO,2:GAL,3:BDS,4:QZS,5:IRN
27352746 mask_sys = self .encode_mask (gnss_t , 16 , ofst = 0 )
27362747
2737- bs .pack_into ('u12' , msg , i , self .integ .pid ) # provider id DFi027
2748+ # augmentation service provider id DFi027
2749+ bs .pack_into ('u12' , msg , i , self .integ .pid )
27382750 i += 12
2739- bs .pack_into ('u30' , msg , i , self .integ .tow ) # tow DFi008
2751+
2752+ # SSR provider id, soluition type, iod
2753+ bs .pack_into ('u16u4u4' , msg , i , self .pid , self .sid , self .iodssr )
2754+ i += 24
2755+
2756+ bs .pack_into ('u30' , msg , i , self .integ .tow * 1e3 ) # tow DFi008
27402757 i += 30
27412758 bs .pack_into ('u16' , msg , i , mask_sys ) # GNSS constellation mask DFi013
27422759 i += 16
27432760
2744- # mask_sys:: DFi013 0:GPS,1:GLO,2:GAL,3:BDS,4:QZS,5:IRN
2745-
2746- if self .msgtype == 11 :
2747- # validity period DFi065
2748- # update rate interval DFi067
2749- bs .pack_into ('u4u16' , msg , i , self .integ .vp , self .integ .uri )
2750- i += 20
2751-
2752- for sys in sys_t :
2753- # issue of GNSS satellite mask DFi010
2754- bs .pack_into ('u2' , msg , i , self .integ .iod_sys [sys ])
2755- i += 2
2761+ # validity period DFi065
2762+ # update rate interval DFi067
2763+ vp = self .integ .vp_r_tbl [self .integ .vp ]
2764+ bs .pack_into ('u4u16' , msg , i , vp , self .integ .uri * 10 )
2765+ i += 20
27562766
27572767 for sys in sys_t :
27582768 flag = self .integ .flag [sys ]
@@ -2763,12 +2773,10 @@ def encode_integrity_ssr(self, msg, i):
27632773 ofst = 192 if sys == uGNSS .QZS else 0
27642774 svid_t .append (prn - ofst )
27652775
2766- mask_sat = self .encode_mask (svid_t , 64 )
2767- nid_ = self .integ .nid [sys ]
2768- # network id DFi071
27692776 # GNSS satellite mask DFi009
2770- bs .pack_into ('u8u64' , msg , i , nid_ , mask_sat )
2771- i += 72
2777+ mask_sat = self .encode_mask (svid_t , 64 )
2778+ bs .pack_into ('u64u2' , msg , i , mask_sat , self .integ .iod_sys [sys ])
2779+ i += 66
27722780
27732781 for f in flag .values ():
27742782 # integrity flag DFi068
0 commit comments