Skip to content

Commit 45f32de

Browse files
committed
- update output of sc134 messages.
1 parent 03a6815 commit 45f32de

File tree

1 file changed

+93
-62
lines changed

1 file changed

+93
-62
lines changed

src/cssrlib/rtcm.py

Lines changed: 93 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,7 @@ class Integrity():
160160
mod_t = ['BPSK(1)', 'BPSK(5)', 'BPSK(10)', 'BOC(1,1)', 'CBOC(6,1,1/11)',
161161
'AltBOC(15,10)', '', '']
162162

163+
atype_t = {0:"Circle", 1:"Polygon"}
163164
#
164165
mm_model_t = ['GMM', 'Mats Brenner', 'Jahn']
165166

@@ -180,6 +181,17 @@ class Integrity():
180181
vp_tbl = [1, 2, 5, 10, 15, 30, 60, 120, 240,
181182
300, 600, 900, 1800, 3600, 7200, 10800]
182183

184+
mt_integ_t = {2000: "Minimum Integrity",
185+
2005: "Extended Integrity (Service Levels and Overbounding)",
186+
2006: "Extended Integrity (SIS and Local Error)",
187+
2007: "Primary Service Area",
188+
2008: "Extended Service Area",
189+
2011: "SIS SSR Integrity",
190+
2051: "Quality Indicator",
191+
2091: "AGC SIS Monitoring",
192+
2071: "Satellite Visibility Map",
193+
2072: "Multipath Map"}
194+
183195
def __init__(self):
184196
self.sys_r_tbl = {self.sys_tbl[s]: s for s in self.sys_tbl.keys()}
185197
self.vp_r_tbl = {s: k for k, s in enumerate(self.vp_tbl)}
@@ -206,6 +218,8 @@ def __init__(self):
206218
self.ists = {} # signal integrity status DFi031 (b32)
207219
self.msts = {} # signal monitoring status DFi032 (b32)
208220

221+
self.pos_v = None # service area (polygon/circle)
222+
209223
self.Paug = 0 # Augmentation System Probability Falut DFi049
210224

211225
self.tau_c = {}
@@ -266,6 +280,16 @@ def agc_lvl(self, idx):
266280
if idx>0:
267281
agc = idx-128
268282
return agc
283+
284+
def decode_sol_t(self, mask):
285+
""" decode Service Provider Solution Type"""
286+
sol_t = ['ARAIM','SBAS','GBAS','DGNSS','RTK','NRTK/VRS','PPP','PPP-AR',
287+
'PPP-RTK','','','','','','','other']
288+
s = ""
289+
for k in range(15):
290+
if (mask>>(15-k-1)) & 1:
291+
s += sol_t[k]
292+
return s
269293

270294
class rtcmUtil:
271295
""" class to define common parameters and utilities for RTCM """
@@ -285,9 +309,6 @@ class rtcmUtil:
285309
uGNSS.QZS: 1044, uGNSS.GAL: 1046
286310
}
287311

288-
mt_integ_t = [2000, 2005, 2006, 2007,
289-
2008, 2011, 2051, 2071, 2072, 2091]
290-
291312
sc_t = {sCSSR.ORBIT: sCType.ORBIT, sCSSR.CLOCK: sCType.CLOCK,
292313
sCSSR.MASK: sCType.MASK, sCSSR.CBIAS: sCType.CBIAS,
293314
sCSSR.PBIAS: sCType.PBIAS, sCSSR.URA: sCType.URA,
@@ -1512,8 +1533,7 @@ def out_log(self, obs=None, eph=None, geph=None, seph=None):
15121533
if sys > 0 and self.subtype not in [sRTCM.SSR_META, sRTCM.SSR_GRID]:
15131534
j = self.sc_t[self.subtype]
15141535
self.fh.write(f" Update Interval: {self.udint_t[self.udi[j]]}[s]")
1515-
1516-
self.fh.write(f" MultiMsg: {self.mi}\n")
1536+
self.fh.write(f" MultiMsg: {self.mi}\n")
15171537

15181538
if self.subtype == sCSSR.CLOCK:
15191539
self.out_log_ssr_clk(sys)
@@ -1755,10 +1775,11 @@ def out_log(self, obs=None, eph=None, geph=None, seph=None):
17551775
self.fh.write("\n")
17561776
self.fh.flush()
17571777

1758-
if self.msgtype == 54 or self.msgtype in self.mt_integ_t: # RTCM SC134 integrity messages
1759-
# self.fh.write(f" Multiple Message Sequence :{self.integ.seq:}\n")
1760-
self.fh.write(" Message Type: {:4d}-{:-2d}\n".
1761-
format(self.msgtype, self.subtype))
1778+
if self.msgtype == 54 or self.msgtype in self.integ.mt_integ_t: # RTCM SC134 integrity messages
1779+
if self.msgtype == 54:
1780+
self.fh.write(f" Message Type: {self.msgtype}\n")
1781+
else:
1782+
self.fh.write(f" Message Type: {self.integ.mt_integ_t[self.msgtype]} ({self.msgtype})\n")
17621783

17631784
if self.subtype == sRTCM.INTEG_MIN: # MT2000
17641785
self.fh.write(f" TOF (s): {self.integ.tow:9.3f}\n")
@@ -1829,7 +1850,7 @@ def out_log(self, obs=None, eph=None, geph=None, seph=None):
18291850
self.fh.write(f" Area ID: {self.integ.aid}\n")
18301851
self.fh.write(f" Integrity Level: {self.integ.ilvl}\n")
18311852
self.fh.write(f" TTT: {self.integ.ttt}\n")
1832-
self.fh.write(f" Solution Type: {self.integ.stype}\n")
1853+
self.fh.write(f" Solution Type: {self.integ.decode_sol_t(self.integ.stype)}\n")
18331854

18341855
self.fh.write(f" Validity Period [s]: {self.integ.vp_tbl[self.integ.vp]}\n")
18351856
self.fh.write(f" Update rate interval [s]: {self.integ.uri*0.1}\n")
@@ -1838,70 +1859,70 @@ def out_log(self, obs=None, eph=None, geph=None, seph=None):
18381859
self.fh.write(f" IOD param: {self.integ.iod_p}\n")
18391860
self.fh.write(f" Integrity/Continuity Flag: {self.integ.fc}\n")
18401861

1841-
self.fh.write(" mfd single: ")
1862+
self.fh.write(" Mean Failure Duration (MFD) of a Single Satellite Fault: ")
18421863
for sys, s in self.integ.mfd_s.items():
18431864
self.fh.write(f" {sys2char(sys)}: {self.integ.mfd_s_t[s]}")
18441865
self.fh.write("\n")
1845-
self.fh.write(" mfd constellation: ")
1866+
self.fh.write(" Mean Failure Duration (MFD) of a Constellation Fault: ")
18461867
for sys, s in self.integ.mfd_c.items():
18471868
self.fh.write(f" {sys2char(sys)}: {self.integ.mfd_c_t[s]}")
18481869
self.fh.write("\n")
1849-
self.fh.write(" tau_c: ")
1870+
self.fh.write(" Correlation Time of Pseudorange Augmentation Message Error: ")
18501871
for sys, s in self.integ.tau_c.items():
18511872
self.fh.write(f" {sys2char(sys)}: {self.integ.tau_c_t[s]}")
18521873
self.fh.write("\n")
1853-
self.fh.write(" sig_c: ")
1874+
self.fh.write(" Pseudorange stdev: ")
18541875
for sys, s in self.integ.sig_c.items():
18551876
self.fh.write(f" {sys2char(sys)}: {self.integ.sig_ob_c_t[s]}")
18561877
self.fh.write("\n")
1857-
self.fh.write(" tau_p: ")
1878+
self.fh.write(" Correlation Time of Carrier Phase Augmentation Message Error: ")
18581879
for sys, s in self.integ.tau_p.items():
18591880
self.fh.write(f" {sys2char(sys)}: {self.integ.tau_p_t[s]}")
18601881
self.fh.write("\n")
1861-
self.fh.write(" sig_p: ")
1882+
self.fh.write(" Carrier Phase stdev: ")
18621883
for sys, s in self.integ.sig_p.items():
18631884
self.fh.write(f" {sys2char(sys)}: {self.integ.sig_ob_p_t[s]}")
18641885
self.fh.write("\n")
1865-
self.fh.write(" Pa_cc: ")
1886+
self.fh.write(" Multiple PR Augmentation Message Fault Probability: ")
18661887
for sys, s in self.integ.Pa_cc.items():
18671888
self.fh.write(f" {sys2char(sys)}: {self.integ.P_t[s]}")
18681889
self.fh.write("\n")
1869-
self.fh.write(" Pa_cp: ")
1890+
self.fh.write(" Multiple CP Augmentation Message Fault Probability: ")
18701891
for sys, s in self.integ.Pa_cp.items():
18711892
self.fh.write(f" {sys2char(sys)}: {self.integ.P_t[s]}")
18721893
self.fh.write("\n")
18731894

1874-
self.fh.write(" Pa_sc:\n")
1895+
self.fh.write(" Single PR Augmentation Message Fault Probability:\n")
18751896
for sys, s in self.integ.Pa_sc.items():
18761897
self.fh.write(f" {sys2char(sys)}:")
18771898
for sat, v in s.items():
18781899
self.fh.write(f" {sat2id(sat)} {self.integ.P_t[v]}")
18791900
self.fh.write("\n")
1880-
self.fh.write(" Pa_sp:\n")
1881-
for sys, s in self.integ.Pa_sp.items():
1882-
self.fh.write(f" {sys2char(sys)}:")
1883-
for sat, v in s.items():
1884-
self.fh.write(f" {sat2id(sat)} {self.integ.P_t[v]}")
1885-
self.fh.write("\n")
1886-
self.fh.write(" sig_ob_c:\n")
1901+
self.fh.write(" Overbounding stdev of PR Augmentation Message Error under Fault-Free Scenario:\n")
18871902
for sys, s in self.integ.sig_ob_c.items():
18881903
self.fh.write(f" {sys2char(sys)}:")
18891904
for sat, v in s.items():
18901905
self.fh.write(f" {sat2id(sat)} {self.integ.sig_ob_c_t[v]}")
18911906
self.fh.write("\n")
1892-
self.fh.write(" sig_ob_p:\n")
1893-
for sys, s in self.integ.sig_ob_p.items():
1894-
self.fh.write(f" {sys2char(sys)}:")
1907+
self.fh.write(" Single CP Augmentation Message Fault Probability:\n")
1908+
for sys, s in self.integ.Pa_sp.items():
1909+
self.fh.write(f" {sys2char(sys)}:")
18951910
for sat, v in s.items():
1896-
self.fh.write(f" {sat2id(sat)} {self.integ.sig_ob_p_t[v]}")
1897-
self.fh.write("\n")
1898-
self.fh.write(" b_ob_c:\n")
1911+
self.fh.write(f" {sat2id(sat)} {self.integ.P_t[v]}")
1912+
self.fh.write("\n")
1913+
self.fh.write(" Overbounding Bias of the Long-Term PR Augmentation Message Bias Error under Fault-Free Scenario:\n")
18991914
for sys, s in self.integ.b_ob_c.items():
19001915
self.fh.write(f" {sys2char(sys)}:")
19011916
for sat, v in s.items():
19021917
self.fh.write(f" {sat2id(sat)} {self.integ.b_ob_c_t[v]}")
19031918
self.fh.write("\n")
1904-
self.fh.write(" b_ob_p:\n")
1919+
self.fh.write(" Overbounding stdev of CP Augmentation Message Error under Fault-Free Scenario:\n")
1920+
for sys, s in self.integ.sig_ob_p.items():
1921+
self.fh.write(f" {sys2char(sys)}:")
1922+
for sat, v in s.items():
1923+
self.fh.write(f" {sat2id(sat)} {self.integ.sig_ob_p_t[v]}")
1924+
self.fh.write("\n")
1925+
self.fh.write(" Overbounding Bias of the Long-Term CP Augmentation Message Bias Error under Fault-Free Scenario:\n")
19051926
for sys, s in self.integ.b_ob_p.items():
19061927
self.fh.write(f" {sys2char(sys)}:")
19071928
for sat, v in s.items():
@@ -1910,87 +1931,86 @@ def out_log(self, obs=None, eph=None, geph=None, seph=None):
19101931

19111932
elif self.subtype == sRTCM.INTEG_EXT_SIS: # MT2006
19121933
self.fh.write(f" TOF (s): {self.integ.tow:9.3f}\n")
1913-
self.fh.write(f" Provider Id: {self.integ.pid}\n")
1914-
self.fh.write(f" Area-ID: {self.integ.aid}\n")
19151934
self.fh.write(f" IOD param: {self.integ.iod_ip}\n")
1916-
1935+
self.fh.write(f" Provider Id: {self.integ.pid}\n")
1936+
self.fh.write(f" Service Area ID: {self.integ.aid}\n")
19171937
self.fh.write(f" Validity Period [s]: {self.integ.vp_tbl[self.integ.vp]}\n")
19181938
self.fh.write(f" Update rate interval [s]: {self.integ.uri*0.1}\n")
1919-
self.fh.write(f" Integrity/Continuity Flag: {self.integ.fc}\n")
1939+
self.fh.write(f" Time Correlation Integrity/Continuity Flag: {self.integ.fc}\n")
19201940

19211941
b = self.integ.bias
1922-
self.fh.write(f" bias (inter-const): {self.integ.b_intc_t[b[0]]}\n")
1923-
self.fh.write(f" bias (inter-freq): {self.integ.b_intf_t[b[1]]}\n")
1942+
self.fh.write(f" Bounding inter-constellation bia: {self.integ.b_intc_t[b[0]]}\n")
1943+
self.fh.write(f" Bounding inter-frequency bias: {self.integ.b_intf_t[b[1]]}\n")
19241944

1925-
self.fh.write(" iod-mask:\n")
1945+
self.fh.write(" Issue of GNSS Satellite Mask:\n")
19261946
for sys, s in self.integ.iod_m.items():
19271947
self.fh.write(f" {sys2char(sys)}: {s}")
19281948
self.fh.write("\n")
19291949

1930-
self.fh.write(" sig_cd:\n")
1950+
self.fh.write(" Bound on rate of change of PR error stdev:\n")
19311951
for sys, s in self.integ.sig_cd.items():
19321952
self.fh.write(f" {sys2char(sys)}:")
19331953
for sat, v in s.items():
19341954
self.fh.write(f" {sat2id(sat)} {self.integ.sig_cd_t[v]}")
19351955
self.fh.write("\n")
19361956

1937-
self.fh.write(" sig_pd:\n")
1957+
self.fh.write(" Bound on rate of change in phase error stdev:\n")
19381958
for sys, s in self.integ.sig_pd.items():
19391959
self.fh.write(f" {sys2char(sys)}:")
19401960
for sat, v in s.items():
19411961
self.fh.write(f" {sat2id(sat)} {self.integ.sig_pd_t[v]}")
19421962
self.fh.write("\n")
19431963

1944-
self.fh.write(" cbr:\n")
1964+
self.fh.write(" Nominal pseudorange bias rate of change:\n")
19451965
for sys, s in self.integ.cbr.items():
19461966
self.fh.write(f" {sys2char(sys)}:")
19471967
for sat, v in s.items():
19481968
self.fh.write(f" {sat2id(sat)} {self.integ.b_rsdsa_t[v]}")
19491969
self.fh.write("\n")
19501970

1951-
self.fh.write(" sig_dp:\n")
1971+
self.fh.write(" Bounding sigma on phase-range-rate error:\n")
19521972
for sys, s in self.integ.sig_dp.items():
19531973
self.fh.write(f" {sys2char(sys)}:")
19541974
for sat, v in s.items():
19551975
self.fh.write(f" {sat2id(sat)} {self.integ.sig_b_pd_t[v]}")
19561976
self.fh.write("\n")
19571977

1958-
self.fh.write(" idx_dp:\n")
1978+
self.fh.write(" Phase-range-rate error rate integrity index:\n")
19591979
for sys, s in self.integ.idx_dp.items():
19601980
self.fh.write(f" {sys2char(sys)}:")
19611981
for sat, v in s.items():
19621982
self.fh.write(f" {sat2id(sat)} {self.integ.b_pd_t[v]}")
19631983
self.fh.write("\n")
19641984

1965-
self.fh.write(" orbit/clock:\n")
1985+
self.fh.write(" Orbit/clock error rate integrity:\n")
19661986
for sys, s in self.integ.ocr.items():
19671987
self.fh.write(f" {sys2char(sys)}:")
19681988
for sat, v in s.items():
19691989
self.fh.write(f" {sat2id(sat)} {self.integ.ocr_t[v]}")
19701990
self.fh.write("\n")
19711991

1972-
self.fh.write(" stdev iono:\n")
1992+
self.fh.write(" Residual ionospheric error stdev:\n")
19731993
for sys, s in self.integ.sig_ion.items():
19741994
self.fh.write(f" {sys2char(sys)}:")
19751995
for sat, v in s.items():
19761996
self.fh.write(f" {sat2id(sat)} {self.integ.sig_ion_t[v]}")
19771997
self.fh.write("\n")
19781998

1979-
self.fh.write(" idx iono:\n")
1999+
self.fh.write(" Index of bounding parameter on change in iono error:\n")
19802000
for sys, s in self.integ.idx_ion.items():
19812001
self.fh.write(f" {sys2char(sys)}:")
19822002
for sat, v in s.items():
19832003
self.fh.write(f" {sat2id(sat)} {self.integ.b_datm_t[v]}")
19842004
self.fh.write("\n")
19852005

1986-
self.fh.write(" stdev trop:\n")
2006+
self.fh.write(" Residual tropospheric error stdev:\n")
19872007
for sys, s in self.integ.sig_trp.items():
19882008
self.fh.write(f" {sys2char(sys)}:")
19892009
for sat, v in s.items():
19902010
self.fh.write(f" {sat2id(sat)} {self.integ.sig_trp_t[v]}")
19912011
self.fh.write("\n")
19922012

1993-
self.fh.write(" idx trop:\n")
2013+
self.fh.write(" Index of bounding parameter on change in tropo error:\n")
19942014
for sys, s in self.integ.idx_trp.items():
19952015
self.fh.write(f" {sys2char(sys)}:")
19962016
for sat, v in s.items():
@@ -2004,9 +2024,19 @@ def out_log(self, obs=None, eph=None, geph=None, seph=None):
20042024
self.fh.write(f" IOD area: {self.integ.iod_sa}\n")
20052025
self.fh.write(f" Validity Period [s]: {self.integ.vp_tbl[self.integ.vp]}\n")
20062026
self.fh.write(f" Update rate interval [s]: {self.integ.uri*0.1}\n")
2027+
2028+
self.fh.write(f" Service Area Type: {self.integ.atype_t[self.integ.atype]}\n")
20072029
self.fh.write(f" Continuation Flag: {self.integ.cf}\n")
20082030
self.fh.write(f" Seq: {self.integ.seq}\n")
2009-
self.fh.write(f" Area Point (lat, lon):\n {self.integ.pos}\n")
2031+
if self.integ.atype == 1: # lat/lon
2032+
self.fh.write(f" Number of Area Point: {self.integ.npnt}\n")
2033+
self.fh.write(" Area Point (lat, lon):\n")
2034+
for pos in self.integ.pos_v:
2035+
self.fh.write(f" {pos[0]:10.4f} {pos[1]:10.4f}\n")
2036+
else: # lat/lon/radius
2037+
pos = self.integ.pos_v
2038+
self.fh.write(" Area Point (lat, lon, radius): ")
2039+
self.fh.write(f" {pos[0]:10.4f} {pos[1]:10.4f} {pos[2]:10.0f}\n")
20102040

20112041
elif self.subtype == sRTCM.INTEG_EXT_AREA: # MT2008
20122042
self.fh.write(f" TOF (s): {self.integ.tow:9.3f}\n")
@@ -2015,15 +2045,15 @@ def out_log(self, obs=None, eph=None, geph=None, seph=None):
20152045
self.fh.write(f" IOD area: {self.integ.iod_sa}\n")
20162046
self.fh.write(f" Validity Period [s]: {self.integ.vp_tbl[self.integ.vp]}\n")
20172047
self.fh.write(f" Update rate interval [s]: {self.integ.uri*0.1}\n")
2018-
self.fh.write(f" Service Area Type: {self.integ.atype}\n")
2048+
self.fh.write(f" Service Area Type: {self.integ.atype_t[self.integ.atype]}\n")
20192049

20202050
self.fh.write(f" Continuation Flag: {self.integ.cf}\n")
20212051
self.fh.write(f" Seq: {self.integ.seq}\n")
20222052

2023-
self.fh.write(f" f_ir : {self.integ.f_ir_t[self.integ.f_ir]}\n")
2024-
self.fh.write(f" f_ttd: {self.integ.f_ttd_t[self.integ.f_ttd]}\n")
2025-
self.fh.write(f" f_ext: {self.integ.ext_df_t[self.integ.f_ext]}\n")
2026-
self.fh.write(f" f_exs: {self.integ.exs_df_t[self.integ.f_exs]}\n")
2053+
self.fh.write(f" Augmentation IR Degradation Factor: {self.integ.f_ir_t[self.integ.f_ir]}\n")
2054+
self.fh.write(f" Augmentation TTD Degradation Factor: {self.integ.f_ttd_t[self.integ.f_ttd]}\n")
2055+
self.fh.write(f" Extended Area Time Parameter Degradation Factor: {self.integ.ext_df_t[self.integ.f_ext]}\n")
2056+
self.fh.write(f" Extended Area Spatial Parameter Degradation Factor: {self.integ.exs_df_t[self.integ.f_exs]}\n")
20272057

20282058
self.fh.write(f" Area Point (lat/lon): {self.integ.pos}\n")
20292059

@@ -3580,27 +3610,28 @@ def decode_integrity_pri_service_area(self, msg, i):
35803610

35813611
if atype == 1: # Validity Area Parameters defined in Table 10.3-5
35823612
# number of area points DFi201
3583-
narea = bs.unpack_from('u8', msg, i)[0]
3613+
npnt = bs.unpack_from('u8', msg, i)[0]
3614+
self.integ.npnt = npnt
35843615
i += 8
3585-
self.integ.pos = np.zeros((narea, 3))
3586-
for k in range(narea):
3616+
self.integ.pos_v = np.zeros((npnt, 2))
3617+
for k in range(npnt):
35873618
# Area Point - Lat DFi202
35883619
# Area Point - Lon DFi203
35893620
lat_i, lon_i = bs.unpack_from('s34s35', msg, i)
35903621
i += 69
35913622
lat = self.sval(lat_i, 34, 0.000000011)
35923623
lon = self.sval(lon_i, 35, 0.000000011)
3593-
self.integ.pos[k, :] = [lat, lon, 0]
3624+
self.integ.pos_v[k, :] = [lat, lon]
35943625

35953626
elif atype == 0: # Validity Radius Data defined in Table 10.3-6
35963627
# Area Point - Lat DFi202
35973628
# Area Point - Lon DFi203
3598-
# Validity Radius DF057
3629+
# Validity Radius DFi057
35993630
lat_i, lon_i, r = bs.unpack_from('s34s35u20', msg, i)
36003631
i += 89
36013632
lat = self.sval(lat_i, 34, 0.000000011)
36023633
lon = self.sval(lon_i, 35, 0.000000011)
3603-
self.integ.pos = [lat, lon, r]
3634+
self.integ.pos_v = [lat, lon, r]
36043635
return i
36053636

36063637
def decode_integrity_ext_service_area(self, msg, i):

0 commit comments

Comments
 (0)