|
11 | 11 | from cssrlib.gnss import gpst2time, bdt2time, epoch2time, timediff, gtime_t |
12 | 12 | from cssrlib.gnss import prn2sat, char2sys, timeget, utc2gpst, time2epoch |
13 | 13 | from cssrlib.gnss import Eph, Geph, Obs, sat2id, sat2prn, gpst2bdt, time2gpst |
14 | | -from cssrlib.gnss import timeadd, id2sat, gpst2utc, Seph |
| 14 | +from cssrlib.gnss import timeadd, id2sat, gpst2utc, Seph, STOParam, EOPParam |
| 15 | +from cssrlib.gnss import IONParam |
15 | 16 |
|
16 | 17 |
|
17 | 18 | class pclk_t: |
@@ -49,6 +50,13 @@ def __init__(self): |
49 | 50 | self.mode_nav = 0 |
50 | 51 | self.glo_ch = {} |
51 | 52 |
|
| 53 | + self.ofst_src = {'GP': uGNSS.GPS, 'GL': uGNSS.GLO, |
| 54 | + 'GA': uGNSS.GAL, 'BD': uGNSS.BDS, |
| 55 | + 'QZ': uGNSS.QZS, 'IR': uGNSS.IRN, |
| 56 | + 'SB': uGNSS.SBS, 'UT': uGNSS.NONE} |
| 57 | + self.itype_t = {'LNAV': 0, 'FDMA': 1, 'IFNV': 2, 'D1D2': 3, |
| 58 | + 'SBAS': 4, 'CNVX': 5, 'L1NV': 6, 'LXOC': 7} |
| 59 | + |
52 | 60 | def setSignals(self, sigList): |
53 | 61 | """ define the signal list for each constellation """ |
54 | 62 |
|
@@ -172,111 +180,155 @@ def decode_nav(self, navfile, nav, append=False): |
172 | 180 | if self.ver >= 4.0: |
173 | 181 |
|
174 | 182 | if line[0:5] == '> STO': # system time offset (TBD) |
175 | | - ofst_src = {'GP': uGNSS.GPS, 'GL': uGNSS.GLO, |
176 | | - 'GA': uGNSS.GAL, 'BD': uGNSS.BDS, |
177 | | - 'QZ': uGNSS.QZS, 'IR': uGNSS.IRN, |
178 | | - 'SB': uGNSS.SBS, 'UT': uGNSS.NONE} |
| 183 | + |
179 | 184 | sys = char2sys(line[6]) |
180 | 185 | itype = line[10:14] |
| 186 | + |
| 187 | + if sys not in nav.sto_prm: |
| 188 | + nav.sto_prm[sys] = {} |
| 189 | + |
| 190 | + if itype not in self.itype_t: |
| 191 | + fnav.readline() |
| 192 | + fnav.readline() |
| 193 | + continue |
| 194 | + |
| 195 | + im = self.itype_t[itype] |
| 196 | + |
| 197 | + if im not in nav.sto_prm[sys]: |
| 198 | + nav.sto_prm[sys][im] = STOParam() |
| 199 | + |
181 | 200 | line = fnav.readline() |
182 | | - ttm = self.decode_time(line, 4) |
| 201 | + nav.sto_prm[sys][im].t_ot = self.decode_time(line, 4) |
183 | 202 | mode = line[24:28] |
184 | | - if mode[0:2] in ofst_src and mode[2:4] in ofst_src: |
185 | | - nav.sto_prm[0] = ofst_src[mode[0:2]] |
186 | | - nav.sto_prm[1] = ofst_src[mode[2:4]] |
| 203 | + if mode[0:2] in self.ofst_src and \ |
| 204 | + mode[2:4] in self.ofst_src: |
| 205 | + nav.sto_prm[sys][im].prm[0] = \ |
| 206 | + self.ofst_src[mode[0:2]] |
| 207 | + nav.sto_prm[sys][im].prm[1] = \ |
| 208 | + self.ofst_src[mode[2:4]] |
187 | 209 |
|
188 | 210 | line = fnav.readline() |
189 | | - ttm = self.flt(line, 0) |
| 211 | + nav.sto_prm[sys][im].t_t = self.flt(line, 0) |
190 | 212 | for k in range(3): |
191 | | - nav.sto[k] = self.flt(line, k+1) |
| 213 | + nav.sto_prm[sys][im].a[k] = self.flt(line, k+1) |
192 | 214 | continue |
193 | 215 |
|
194 | 216 | elif line[0:5] == '> EOP': # earth orientation param |
195 | 217 | sys = char2sys(line[6]) |
196 | 218 | itype = line[10:14] |
| 219 | + |
| 220 | + if sys not in nav.eop_prm: |
| 221 | + nav.eop_prm[sys] = {} |
| 222 | + |
| 223 | + if itype not in self.itype_t: |
| 224 | + fnav.readline() |
| 225 | + fnav.readline() |
| 226 | + fnav.readline() |
| 227 | + continue |
| 228 | + |
| 229 | + im = self.itype_t[itype] |
| 230 | + |
| 231 | + if im not in nav.eop_prm[sys]: |
| 232 | + nav.eop_prm[sys][im] = EOPParam() |
| 233 | + |
197 | 234 | line = fnav.readline() |
198 | | - ttm = self.decode_time(line, 4) |
| 235 | + nav.eop_prm[sys][im].t_eop = self.decode_time(line, 4) |
199 | 236 | for k in range(3): |
200 | | - nav.eop[k] = self.flt(line, k+1) |
| 237 | + nav.eop_prm[sys][im].prm[k] = self.flt(line, k+1) |
201 | 238 | line = fnav.readline() |
202 | 239 | for k in range(3): |
203 | | - nav.eop[k+3] = self.flt(line, k+1) |
| 240 | + nav.eop_prm[sys][im].prm[k+3] = self.flt(line, k+1) |
204 | 241 | line = fnav.readline() |
205 | | - ttm = self.flt(line, 0) |
| 242 | + nav.eop_prm[sys][im].t_t = self.flt(line, 0) |
206 | 243 | for k in range(3): |
207 | | - nav.eop[k+6] = self.flt(line, k+1) |
| 244 | + nav.eop_prm[sys][im].prm[k+6] = self.flt(line, k+1) |
208 | 245 | continue |
209 | 246 |
|
210 | 247 | elif line[0:5] == '> ION': # iono (TBD) |
211 | 248 | sys = char2sys(line[6]) |
212 | 249 | itype = line[10:14] |
213 | 250 | stype = '' if len(line) < 20 else line[15:19] |
| 251 | + |
| 252 | + if sys not in nav.ion_prm: |
| 253 | + nav.ion_prm[sys] = {} |
| 254 | + |
| 255 | + im = self.itype_t[itype] |
| 256 | + nav.ion_prm[sys][im] = IONParam() |
| 257 | + |
214 | 258 | line = fnav.readline() |
215 | | - ttm = self.decode_time(line, 4) |
| 259 | + nav.ion_prm[sys][im].t_tm = self.decode_time(line, 4) |
216 | 260 | if sys == uGNSS.GAL and itype == 'IFNV': # Nequick-G |
217 | 261 | for k in range(3): # ai0, ai1, ai2 |
218 | | - nav.ion[0, k] = self.flt(line, k+1) |
| 262 | + nav.ion_prm[sys][im].prm[k] = \ |
| 263 | + self.flt(line, k+1) |
219 | 264 | line = fnav.readline() |
220 | 265 | # disturbance flags |
221 | | - nav.ion[0, 3] = int(self.flt(line, 0)) |
| 266 | + nav.ion_prm[sys][im].prm[3] = \ |
| 267 | + int(self.flt(line, 0)) |
222 | 268 | elif sys == uGNSS.BDS and itype == 'CNVX': # BDGIM |
223 | | - ttm = self.decode_time(line, 4) |
224 | | - self.ion_gim = np.zeros(9) |
225 | 269 | for k in range(3): |
226 | | - nav.ion_gim[k] = self.flt(line, k+1) |
| 270 | + nav.ion_prm[sys][im].prm[k] = \ |
| 271 | + self.flt(line, k+1) |
227 | 272 | line = fnav.readline() |
228 | 273 | for k in range(4): |
229 | | - nav.ion_gim[k+3] = self.flt(line, k) |
| 274 | + nav.ion_prm[sys][im].prm[k+3] = \ |
| 275 | + self.flt(line, k) |
230 | 276 | line = fnav.readline() |
231 | 277 | for k in range(2): |
232 | | - nav.ion_gim[k+7] = self.flt(line, k) |
| 278 | + nav.ion_prm[sys][im].prm[k+7] = \ |
| 279 | + self.flt(line, k) |
233 | 280 | elif sys == uGNSS.IRN and itype == 'L1NV': # L1NAV |
234 | 281 | if stype == 'KLOB': # |
235 | 282 | iodk = self.flt(line, 1) |
236 | 283 | line = fnav.readline() |
237 | 284 | for k in range(4): |
238 | | - nav.ion[0, k] = self.flt(line, k) |
| 285 | + nav.ion_prm[sys][im].prm[k] = \ |
| 286 | + self.flt(line, k) |
239 | 287 | line = fnav.readline() |
240 | 288 | for k in range(4): |
241 | | - nav.ion[1, k] = self.flt(line, k) |
| 289 | + nav.ion_prm[sys][im].prm[k+4] = \ |
| 290 | + self.flt(line, k) |
| 291 | + nav.ion_prm[sys][im].iod = iodk |
242 | 292 | line = fnav.readline() |
243 | | - nav.ion_region = np.zeros(4) |
| 293 | + nav.ion_prm[sys][im].region = np.zeros(4) |
244 | 294 | for k in range(4): |
245 | | - nav.ion_region[k] = self.flt(line, k) |
246 | | - |
| 295 | + nav.ion_prm[sys][im].region[k] = \ |
| 296 | + self.flt(line, k) |
247 | 297 | elif stype == 'NEQN': |
248 | | - nav.ion_region = np.zeros((3, 4)) |
249 | | - iodn = self.flt(line, 1) |
250 | | - |
| 298 | + nav.ion_prm[sys][im].iod = self.flt(line, 1) |
| 299 | + prm = np.zeros((3, 8)) |
251 | 300 | for j in range(3): |
252 | 301 | line = fnav.readline() |
253 | | - nav.ion = np.zeros((3, 4)) |
254 | 302 | for k in range(4): # a0, a1, a2, idf |
255 | | - nav.ion[j, k] = self.flt(line, k) |
| 303 | + prm[j, k] = self.flt(line, k) |
256 | 304 | line = fnav.readline() |
257 | 305 | # lon_min, lon_max, mopid_min, mopid_max |
258 | 306 | for k in range(4): |
259 | | - nav.ion_region[j, k] = \ |
260 | | - self.flt(line, k) |
| 307 | + prm[j, k+4] = self.flt(line, k) |
| 308 | + nav.ion_prm[sys][im].prm = prm |
261 | 309 |
|
262 | 310 | elif sys == uGNSS.GLO and itype == 'LXOC': |
263 | 311 | c_A = self.flt(line, 1) |
264 | 312 | c_F10_7 = self.flt(line, 2) |
265 | 313 | c_Ap = self.flt(line, 3) |
266 | | - nav.ion[0, 0:3] = [c_A, c_F10_7, c_Ap] |
| 314 | + nav.ion_prm[sys][im].prm[0:3] = \ |
| 315 | + [c_A, c_F10_7, c_Ap] |
267 | 316 |
|
268 | 317 | else: # Klobucher (LNAV, D1D2, CNVX) |
269 | | - self.ion_gim = np.zeros(9) |
| 318 | + nav.ion_prm[sys][im].prm = np.zeros(9) |
| 319 | + |
270 | 320 | for k in range(3): |
271 | | - nav.ion[0, k] = self.flt(line, k+1) |
| 321 | + nav.ion_prm[sys][im].prm[k] = \ |
| 322 | + self.flt(line, k+1) |
272 | 323 | line = fnav.readline() |
273 | | - nav.ion[0, 3] = self.flt(line, 0) |
274 | | - for k in range(3): |
275 | | - nav.ion[1, k] = self.flt(line, k+1) |
| 324 | + for k in range(4): |
| 325 | + nav.ion_prm[sys][im].prm[k+3] = \ |
| 326 | + self.flt(line, k) |
276 | 327 | line = fnav.readline() |
277 | | - nav.ion[1, 3] = self.flt(line, 0) |
| 328 | + nav.ion_prm[sys][im].prm[7] = self.flt(line, 0) |
278 | 329 | if len(line) >= 42: |
279 | | - nav.ion_region = int(self.flt(line, 1)) |
| 330 | + nav.ion_prm[sys][im].prm[8] = \ |
| 331 | + int(self.flt(line, 1)) |
280 | 332 | continue |
281 | 333 |
|
282 | 334 | elif line[0:5] == '> EPH': |
@@ -540,7 +592,10 @@ def decode_nav(self, navfile, nav, append=False): |
540 | 592 | eph.sisai[2] = int(self.flt(line, 2)) # oc1 |
541 | 593 | eph.sisai[3] = int(self.flt(line, 3)) # oc2 |
542 | 594 | elif sys == uGNSS.IRN: |
543 | | - eph.urai = int(self.flt(line, 0)) |
| 595 | + if self.mode_nav == 0: |
| 596 | + eph.sva = self.flt(line, 0) |
| 597 | + else: # L1NV |
| 598 | + eph.urai = self.flt(line, 0) |
544 | 599 | eph.svh = int(self.flt(line, 1)) |
545 | 600 | if self.mode_nav == 2 and eph.integ == 1: |
546 | 601 | eph.tgd = int(self.flt(line, 3)) |
|
0 commit comments