@@ -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
270294class 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