Skip to content

Commit 0510098

Browse files
committed
updated RTCM SC134 MT54-11 message.
1 parent 37e60c9 commit 0510098

File tree

2 files changed

+53
-44
lines changed

2 files changed

+53
-44
lines changed

src/cssrlib/cssrlib.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1347,6 +1347,7 @@ def __init__(self):
13471347
self.len = 0
13481348
self.dlen = 0
13491349
self.msgtype = 0
1350+
self.iodssr = 0
13501351

13511352
def encode_mask(self, v, bitlen, ofst=1):
13521353
""" encode n-bit mask with offset """

src/cssrlib/rtcm.py

Lines changed: 52 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,15 @@ class sRTCM(IntEnum):
5757

5858
class 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

172178
class 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

Comments
 (0)