MRTKLIB 0.7.14
Modernized GNSS Positioning Library
Loading...
Searching...
No Matches
mrtk_madoca_local_corr.c
Go to the documentation of this file.
1/*------------------------------------------------------------------------------
2 * mrtk_madoca_local_corr.c : MADOCA local correction common functions
3 *
4 * Copyright (C) 2026 H.SHIONO (MRTKLIB Project)
5 * Copyright (C) 2023-2025 Cabinet Office, Japan
6 * Copyright (C) 2024-2025 Lighthouse Technology & Consulting Co. Ltd.
7 * Copyright (C) 2023-2025 Japan Aerospace Exploration Agency
8 * Copyright (C) 2023-2025 TOSHIBA ELECTRONIC TECHNOLOGIES CORPORATION
9 * Copyright (C) 2015- Mitsubishi Electric Corp.
10 * Copyright (C) 2014 Geospatial Information Authority of Japan
11 * Copyright (C) 2014 T.SUZUKI
12 * Copyright (C) 2007-2023 T.TAKASU
13 *
14 * SPDX-License-Identifier: BSD-2-Clause
15 *----------------------------------------------------------------------------*/
17
18#include <math.h>
19#include <stdio.h>
20#include <stdlib.h>
21#include <string.h>
22
23#include "mrtklib/mrtk_atmos.h"
24#include "mrtklib/mrtk_coords.h"
25#include "mrtklib/mrtk_mat.h"
26#include "mrtklib/mrtk_trace.h"
27
28/* local constants -----------------------------------------------------------*/
29#define PI 3.1415926535897932
30#define D2R (PI / 180.0)
31#define R2D (180.0 / PI)
32
33/* local macros --------------------------------------------------------------*/
34#define PRN_ZTD 1E-4 /* process noise of ztd (m/sqrt(s)) */
35#define PRN_GRAD 1E-5 /* process noise of gradient (m/sqrt(s)) */
36#define STD_ZTD_DIST 1E-4 /* distance dependent factor ztd (m/km) */
37#define STD_GRAD_DIST 1E-5 /* distance dependent factor gradient (m/km) */
38#define STD_VTEC_DIST 1E-3 /* distance dependent factor vtec (m/km) */
39
40#define SQR(x) ((x) * (x))
41#define MAX(x, y) ((x) > (y) ? (x) : (y))
42#define GN(gp) (gp == 1 ? 64 : 16)
43
44/* forward declarations (implemented in rtkcmn.c, resolved at link time) -----*/
45extern int satid2no(const char* id);
46extern char* time_str(gtime_t t, int n);
47
48/* initblkinf moved to mrtk_rtcm3_local_corr.c (mrtklib) */
49/* get point no ----------------------------------------------------------------
50 * search for a point by name or add a new point if not found
51 * args : stat_t *stat IO local correction data
52 * const char* pntname I point name
53 * return : point index (>=0: found or added, 0: error)
54 *-----------------------------------------------------------------------------*/
55extern int getstano(stat_t* stat, const char* pntname) {
56 int i;
57
58 /* search point */
59 for (i = 0; i < stat->nst; i++) {
60 if (!strcmp(stat->strp[i].site.name, pntname)) {
61 break;
62 }
63 }
64 if (i >= MAXSITES) {
65 return 0;
66 }
67 /* new point */
68 if (i >= stat->nst) {
69 memset(&stat->strp[stat->nst], 0x00, sizeof(sitetrp_t));
70 memset(&stat->sion[stat->nsi], 0x00, sizeof(siteion_t));
71 strcpy(stat->strp[stat->nst].site.name, pntname);
72 strcpy(stat->sion[stat->nsi].site.name, pntname);
73 stat->nst++;
74 stat->nsi++;
75 }
76 return i;
77}
78/* decode stat message -------------------------------------------------------*/
79static int decode_stat(sstat_t* sstat, char* buff, int* nbyte) {
80 double tow = 0, ecef[3] = {0}, azel[2] = {0}, ion = 0, ztd = {0}, grad[2] = {0}, std[2] = {0};
81 char sat[64] = "", sys;
82 int prn, week = 0, qflag = 0, rcv = 0, satno = 0;
83 gtime_t time;
84
85 buff[*nbyte] = '\0';
86 *nbyte = 0;
87 /* point position */
88 if (sscanf(buff, "$POS,%d,%lf,%d,%lf,%lf,%lf", &week, &tow, &qflag, ecef, ecef + 1, ecef + 2) >= 6) {
89 sstat->time = gpst2time(week, tow);
90 memcpy(sstat->sion.site.ecef, ecef, sizeof(ecef));
91 memcpy(sstat->strp.site.ecef, ecef, sizeof(ecef));
92 }
93 /* ionosphere */
94 else if (sscanf(buff, "$ION,%d,%lf,%d,%c%d,%lf,%lf,%lf,%lf", &week, &tow, &qflag, &sys, &prn, azel, azel + 1, &ion,
95 std) >= 9) {
96 sprintf(sat, "%c%02d", sys, prn);
97 satno = (unsigned char)satid2no(sat);
98 sstat->time = gpst2time(week, tow);
99 sstat->sion.iond[satno - 1].time = sstat->time;
100 sstat->sion.iond[satno - 1].ion = ion;
101 sstat->sion.iond[satno - 1].std = std[0];
102 sstat->sion.iond[satno - 1].azel[0] = azel[0] * D2R;
103 sstat->sion.iond[satno - 1].azel[1] = azel[1] * D2R;
104 sstat->sion.iond[satno - 1].qflag = (unsigned char)qflag;
105 return 0; /* no update */
106 }
107 /* troposphere ztd */
108 else if (sscanf(buff, "$TROP,%d,%lf,%d,%d,%lf,%lf", &week, &tow, &qflag, &rcv, &ztd, std) >= 6) {
109 sstat->time = gpst2time(week, tow);
110 sstat->strp.trpd.time = sstat->time;
111 sstat->strp.trpd.trp[0] = ztd;
112 sstat->strp.trpd.std[0] = std[0];
113 sstat->strp.trpd.qflag = (unsigned char)qflag;
114 return 0; /* no update */
115 }
116 /* troposphere gradient */
117 else if (sscanf(buff, "$TRPG,%d,%lf,%d,%d,%lf,%lf,%lf,%lf", &week, &tow, &qflag, &rcv, grad, grad + 1, std,
118 std + 1) >= 8) {
119 time = gpst2time(week, tow);
120 if (timediff(time, sstat->strp.trpd.time) != 0.0) {
121 return 0; /* no update */
122 }
123 sstat->strp.trpd.trp[1] = grad[0];
124 sstat->strp.trpd.trp[2] = grad[1];
125 sstat->strp.trpd.std[1] = std[0];
126 sstat->strp.trpd.std[2] = std[1];
127 return 0; /* no update */
128 }
129
130 return 11; /* update */
131}
132/* stack local correction ------------------------------------------------------
133 * stack stat message and synchronize frame with stat preamble
134 * args : sstat_t *sstat IO local correction data
135 * const char data I stat 1byte data
136 * char *buff O buffer for message
137 * int *nbyte O number of bytes
138 * return : status (-1: error message, 0: no message,
139 * 11: input stat messages)
140 *-----------------------------------------------------------------------------*/
141extern int input_stat(sstat_t* sstat, const char data, char* buff, int* nbyte) {
142 trace(NULL, 4, "input_stat: data=%c,%d\n", data, *nbyte);
143
144 /* synchronize frame */
145 if (*nbyte == 0) {
146 if (data != '$') {
147 return 0;
148 }
149 buff[*nbyte] = data;
150 (*nbyte)++;
151 return 0;
152 }
153 buff[(*nbyte)++] = data;
154
155 if (data != '\n') {
156 return 0;
157 }
158
159 return decode_stat(sstat, buff, nbyte);
160}
161/* input stat message from file ------------------------------------------------
162 * fetch next stat message and input a messsage from file
163 * args : sstat_t *sstat IO local correction data
164 * FILE *fp I file pointer
165 * char *buff O buffer for message
166 * int *nbyte O number of bytes
167 * return : status (-2: end of file, -1...11: same as input_stat())
168 * note : same as input_stat()
169 *-----------------------------------------------------------------------------*/
170extern int input_statf(sstat_t* sstat, FILE* fp, char* buff, int* nbyte) {
171 int i, data, ret;
172
173 trace(NULL, 4, "input_statf:\n");
174
175 for (i = 0; i < 4096; i++) {
176 if ((data = fgetc(fp)) == EOF) {
177 return -2;
178 }
179 if ((ret = input_stat(sstat, (char)data, buff, nbyte))) {
180 return ret;
181 }
182 }
183 return 0; /* return at every 4k bytes */
184}
185/* calculate distance between two positions -----------------------------------
186 * calculate the Euclidean distance between two positions
187 * args : double *ecef1 I position 1 (ECEF coordinates)
188 * double *ecef2 I position 2 (ECEF coordinates)
189 * return : distance between the two positions
190 *-----------------------------------------------------------------------------*/
191extern double posdist(const double* ecef1, const double* ecef2) {
192 int i;
193 double r[3];
194 for (i = 0; i < 3; i++) {
195 r[i] = ecef1[i] - ecef2[i];
196 }
197 return norm(r, 3);
198}
199/* get neighbour sites -------------------------------------------------------*/
200static int get_site(const stat_t* stat, const double* llh, int iontrp, int* siteno, double maxdist, double* dist,
201 double gllh[][3]) {
202 double ecef[3], d;
203 int i, n = 0, nsta;
204 const spos_t* site;
205
206 if (iontrp == TYPE_TRP) {
207 nsta = stat->nst;
208 } else if (iontrp == TYPE_ION) {
209 nsta = stat->nsi;
210 } else {
211 return 0;
212 }
213
214 pos2ecef(llh, ecef);
215 for (i = 0; i < nsta; i++) {
216 if (iontrp == TYPE_TRP) {
217 site = &stat->strp[i].site;
218 } else if (iontrp == TYPE_ION) {
219 site = &stat->sion[i].site;
220 } else {
221 return 0;
222 }
223 d = posdist(site->ecef, ecef);
224 ecef2pos(site->ecef, gllh[n]);
225 trace(NULL, 4, "get_site:targetpos llh=%f,%f,%f site pos llh=%f,%f,%f dist=%f\n", llh[0] * R2D, llh[1] * R2D,
226 llh[2], gllh[n][0] * R2D, gllh[n][1] * R2D, gllh[n][2], d);
227 if ((dist[n] = MAX(d / 1E3, 0.1)) > maxdist) {
228 continue;
229 }
230 siteno[n++] = i;
231 }
232 return n;
233}
234/* get trop correction for a point -------------------------------------------*/
235extern int get_trop_sta(gtime_t time, const trp_t* trpd, double* trp, double* std) {
236 double tt;
237 int i;
238
239 tt = timediff(trpd->time, time);
240 if (tt < -600.0 || tt > 5.) {
241 return 0;
242 }
243
244 for (i = 0; i < 3; i++) {
245 trp[i] = trpd->trp[i];
246 std[i] = sqrt(SQR(trpd->std[i]) + SQR(tt * (i == 0 ? PRN_ZTD : PRN_GRAD)));
247 trace(NULL, 4, "trpd %s %d ion=%f std=%f\n", time_str(time, 0), i + 1, trp[i], std[i]);
248 }
249 return 1;
250}
251/* get iono correction for a point -------------------------------------------*/
252extern int get_iono_sta(gtime_t time, const ion_t* iond, double* ion, double* std, double* el) {
253 double tt;
254 int i, cnt = 0;
255
256 for (i = 0; i < MAXSAT; i++) {
257 tt = timediff(iond[i].time, time);
258 if (tt < -35.0) {
259 continue;
260 }
261 if (tt > 5.) {
262 continue;
263 }
264 ion[i] = iond[i].ion;
265 std[i] = iond[i].std;
266 el[i] = iond[i].azel[1];
267 trace(NULL, 4, "iond %s sat=%d ion=%f std=%f\n", time_str(time, 0), i + 1, ion[i], std[i]);
268 cnt++;
269 }
270 return cnt;
271}
272/* calculate tropospheric correction using weighted interpolation by distance --
273 * interpolation tropospheric weighted average by distance
274 * args : const stat_t *stat I correction data
275 * gtime_t time I time (GPST)
276 * const double *llh I receiver ecef position {lat, lon, hgt} (rad, m)
277 * double maxdist I max distance thresholds (km)
278 * double *trp O tropos parameters {ztd, grade, gradn} (m)
279 * double *std O standard deviation (m)
280 * return : status (1:ok, 0:error)
281 *-----------------------------------------------------------------------------*/
282extern int corr_trop_distwgt(const stat_t* stat, gtime_t time, const double* llh, double maxdist, double* trp,
283 double* std) {
284 const double azel[] = {0.0, PI / 2.0};
285 double trp_s[3], std_s[3];
286 double var, wgt[3] = {0}, cof[3] = {0}, dist[MAXSITES], llh_s[MAXSITES][3];
287 int i, j, n, siteno[MAXSITES];
288
289 for (i = 0; i < 3; i++) {
290 trp[i] = std[i] = 0.0;
291 }
292
293 if (!(n = get_site(stat, llh, TYPE_TRP, siteno, maxdist, dist, llh_s))) {
294 return 0;
295 }
296
297 for (i = 0; i < n; i++) {
298 /* get trop correction for a station */
299 if (get_trop_sta(time, &stat->strp[siteno[i]].trpd, trp_s, std_s) == 0) {
300 continue;
301 }
302
303 /* convert ztd to zwd */
304 trp_s[0] -= tropmodel(time, llh_s[i], azel, 0.0);
305
306 for (j = 0; j < 3; j++) {
307 var = SQR(std_s[j]) + SQR(dist[i] * (j == 0 ? STD_ZTD_DIST : STD_GRAD_DIST));
308 trp[j] += trp_s[j] / dist[i];
309 wgt[j] += 1.0 / dist[i];
310 cof[j] += 1.0 / var;
311 }
312 }
313 if (wgt[0] == 0.0) {
314 return 0;
315 }
316
317 for (i = 0; i < 3; i++) {
318 trp[i] /= wgt[i];
319 std[i] = sqrt(1.0 / cof[i]);
320 trace(NULL, 3, "interpolation trp %s %d trp=%f std=%f lat=%.2f lat=%.2f n=%d\n", time_str(time, 0), i + 1,
321 trp[i], std[i], llh[0] * R2D, llh[1] * R2D, n);
322 }
323 /* convert zwd to ztd */
324 trp[0] += tropmodel(time, llh, azel, 0.0);
325 return 1;
326}
327/* calculate ionospherec correction using weighted interpolation by distance ---
328 * interpolation ionospherec weighted average by distance
329 * args : const stat_t *stat I local correction data
330 * gtime_t time I time (GPST)
331 * const double *llh I receiver ecef position {lat, lon, hgt} (rad, m)
332 * const double *el I receiver to satellite elevation (rad)
333 * double maxdist I max distance thresholds (km)
334 * double *ion O L1 slant ionos delay for each sat (MAXSAT x 1)
335 * (ion[i]==0: no correction data)
336 * double *std O standard deviation (m)
337 * double maxres I maximum residual threshold (m)
338 * int *nrej O number of rejected stations
339 * int *ncnt O number of counted stations
340 * return : status (1:ok, 0:error)
341 *-----------------------------------------------------------------------------*/
342extern int corr_iono_distwgt(const stat_t* stat, gtime_t time, const double* llh, const double* el, double maxdist,
343 double* ion, double* std, double maxres, int* nrej, int* ncnt) {
344 double ion_s[MAXSITES][MAXSAT] = {{0.0}}, std_s[MAXSAT] = {0.0}, el_s[MAXSAT] = {0.0};
345 double var, wgt[MAXSAT] = {0}, cof[MAXSAT] = {0}, dist[MAXSITES], llh_s[MAXSITES][3];
346 int i, j, n, siteno[MAXSITES];
347 double eltmp, res;
348
349 for (i = 0; i < MAXSAT; i++) {
350 ion[i] = 0.0;
351 }
352
353 if (!(n = get_site(stat, llh, TYPE_ION, siteno, maxdist, dist, llh_s))) {
354 return 0;
355 }
356
357 for (i = 0; i < n; i++) {
358 for (j = 0; j < MAXSAT; j++) {
359 ion_s[i][j] = std_s[j] = el_s[j] = 0.0;
360 }
361
362 /* get iono correction for a station */
363 if (get_iono_sta(time, stat->sion[siteno[i]].iond, ion_s[i], std_s, el_s) == 0) {
364 continue;
365 }
366
367 for (j = 0; j < MAXSAT; j++) {
368 if (el == NULL) {
369 eltmp = el_s[j];
370 } else {
371 eltmp = el[j];
372 }
373 if (ion_s[i][j] == 0.0 || eltmp <= 0.0) {
374 continue;
375 }
376 var = SQR(std_s[j]) + SQR(dist[i] * STD_VTEC_DIST / sin(eltmp));
377 ion[j] += ion_s[i][j] / dist[i];
378 wgt[j] += 1.0 / dist[i];
379 cof[j] += 1.0 / var;
380 }
381 }
382 for (i = 0; i < MAXSAT; i++) {
383 if (wgt[i] == 0.0 || (cof[i] <= 0.0)) {
384 continue;
385 }
386 ion[i] /= wgt[i];
387 std[i] = sqrt(1.0 / cof[i]);
388 trace(NULL, 3, "interpolation ion %s sat=%d ion=%f std=%f lat=%.2f lat=%.2f n=%d\n", time_str(time, 0), i + 1,
389 ion[i], std[i], llh[0] * R2D, llh[1] * R2D, n);
390 }
391 if (maxres > 0.0) {
392 for (i = 0; i < n; i++) {
393 for (j = 0; j < MAXSAT; j++) {
394 if (ion_s[i][j] == 0.0 || ion[j] == 0.0) {
395 continue;
396 }
397 res = ion[j] - ion_s[i][j];
398 ncnt[siteno[i]]++;
399 if (fabs(res) > maxres) {
400 nrej[siteno[i]]++;
401 }
402 }
403 }
404 }
405 return 1;
406}
407/* convert rtcm3 block to stats ------------------------------------------------
408 * convert RTCM3 block data to station statistics
409 * args : rtcm_t *rtcm IO rtcm control struct
410 * stat_t *stat IO station data struct
411 * return : status (0: error, 1: success)
412 *-----------------------------------------------------------------------------*/
413extern int block2stat(rtcm_t* rtcm, stat_t* stat) {
414 int i, j, k, gp;
415 double d;
416
417 if (!rtcm->lclblk) {
418 return 0;
419 }
420 if (rtcm->lclblk->tnum == 0 && rtcm->lclblk->inum == 0) {
421 return 0;
422 }
423
424 /* convert trop corrections */
425 for (i = 0; i < rtcm->lclblk->tnum; i++) {
426 for (j = 0; j < rtcm->lclblk->tblkinf[i].n; j++) {
427 if (rtcm->lclblk->tblkinf[i].btype == BTYPE_GRID) {
428 gp = rtcm->lclblk->tblkinf[i].gp[j];
429 } else {
430 gp = j;
431 }
432 for (k = 0; k < stat->nst; k++) {
433 d = posdist(rtcm->lclblk->tstat[i][gp].site.ecef, stat->strp[k].site.ecef);
434 if (d < 0.1) {
435 break;
436 }
437 }
438 if (k >= stat->nst) {
439 stat->nst++;
440 }
441 memcpy(&stat->time[k], &rtcm->time, sizeof(gtime_t));
442 memcpy(&stat->strp[k], &rtcm->lclblk->tstat[i][gp], sizeof(sitetrp_t));
443 }
444 }
445 /* update iono corrections */
446 for (i = 0; i < rtcm->lclblk->inum; i++) {
447 for (j = 0; j < rtcm->lclblk->iblkinf[i].n; j++) {
448 gp = rtcm->lclblk->iblkinf[i].gp[j];
449 if (rtcm->lclblk->iblkinf[i].btype == BTYPE_GRID) {
450 gp = rtcm->lclblk->iblkinf[i].gp[j];
451 } else {
452 gp = j;
453 }
454 for (k = 0; k < stat->nsi; k++) {
455 d = posdist(rtcm->lclblk->istat[i][gp].site.ecef, stat->sion[k].site.ecef);
456 if (d < 0.1) {
457 break;
458 }
459 }
460 if (k >= stat->nsi) {
461 stat->nsi++;
462 }
463 memcpy(&stat->time[k], &rtcm->time, sizeof(gtime_t));
464 memcpy(&stat->sion[k], &rtcm->lclblk->istat[i][gp], sizeof(siteion_t));
465 }
466 }
467 return 1;
468}
double tropmodel(gtime_t time, const double *pos, const double *azel, double humi)
Compute tropospheric delay by standard atmosphere and Saastamoinen.
Definition mrtk_atmos.c:162
MRTKLIB Atmosphere Module — Ionospheric and tropospheric models.
#define SQR(x)
Definition mrtk_clas.c:46
#define D2R
Definition mrtk_coords.c:36
void pos2ecef(const double *pos, double *r)
Transform geodetic position to ECEF position.
#define PI
Definition mrtk_coords.c:35
#define MAXSAT
Definition mrtk_coords.c:45
void ecef2pos(const double *r, double *pos)
Transform ECEF position to geodetic position.
MRTKLIB Coordinates Module — Coordinate transformations and geometry.
#define MAXSITES
#define PRN_GRAD
#define STD_VTEC_DIST
#define STD_ZTD_DIST
double posdist(const double *ecef1, const double *ecef2)
Calculate the Euclidean distance between two ECEF positions.
int corr_trop_distwgt(const stat_t *stat, gtime_t time, const double *llh, double maxdist, double *trp, double *std)
Calculate tropospheric correction using weighted interpolation by distance.
int get_trop_sta(gtime_t time, const trp_t *trpd, double *trp, double *std)
Get tropospheric correction for a point.
int get_iono_sta(gtime_t time, const ion_t *iond, double *ion, double *std, double *el)
Get ionospheric correction for a point.
int input_statf(sstat_t *sstat, FILE *fp, char *buff, int *nbyte)
Fetch next stat message and input a message from file.
int satid2no(const char *id)
Definition mrtk_nav.c:753
int getstano(stat_t *stat, const char *pntname)
Search for a point by name or add a new point if not found.
#define SQR(x)
#define MAX(x, y)
char * time_str(gtime_t t, int n)
Definition mrtk_time.c:530
static int decode_stat(sstat_t *sstat, char *buff, int *nbyte)
int corr_iono_distwgt(const stat_t *stat, gtime_t time, const double *llh, const double *el, double maxdist, double *ion, double *std, double maxres, int *nrej, int *ncnt)
Calculate ionospheric correction using weighted interpolation by distance.
#define STD_GRAD_DIST
static int get_site(const stat_t *stat, const double *llh, int iontrp, int *siteno, double maxdist, double *dist, double gllh[][3])
int block2stat(rtcm_t *rtcm, stat_t *stat)
Convert RTCM3 block data to station statistics.
int input_stat(sstat_t *sstat, const char data, char *buff, int *nbyte)
Stack stat message and synchronize frame with stat preamble.
#define PRN_ZTD
MRTKLIB MADOCA Local Correction Module — local correction common functions and constants.
#define TYPE_TRP
#define TYPE_ION
double norm(const double *a, int n)
Euclidean norm of vector.
Definition mrtk_mat.c:165
MRTKLIB Matrix Module — Matrix/vector operations and estimation.
int satno(int sys, int prn)
Convert satellite system+prn/slot number to satellite number.
Definition mrtk_nav.c:58
#define R2D
Definition mrtk_obs.c:51
static rtcm_t * rtcm
#define BTYPE_GRID
gtime_t gpst2time(int week, double sec)
Convert GPS week/tow to gtime_t.
Definition mrtk_time.c:165
double timediff(gtime_t t1, gtime_t t2)
Compute time difference (t1 - t2).
Definition mrtk_time.c:279
void trace(mrtk_ctx_t *ctx, int level, const char *format,...)
Output trace message.
Definition mrtk_trace.c:78
MRTKLIB Trace Module — debug trace and logging functions.
GNSS time representation.
Definition mrtk_time.h:49
unsigned char qflag
Definition mrtk_nav.h:267
gtime_t time
Definition mrtk_nav.h:262
double ion
Definition mrtk_nav.h:264
double std
Definition mrtk_nav.h:265
double azel[2]
Definition mrtk_nav.h:266
RTCM control struct type.
Definition mrtk_rtcm.h:50
ion_t iond[MAXSAT]
Definition mrtk_nav.h:280
spos_t site
Definition mrtk_nav.h:279
trp_t trpd
Definition mrtk_nav.h:285
spos_t site
Definition mrtk_nav.h:284
double ecef[3]
Definition mrtk_nav.h:258
char name[8]
Definition mrtk_nav.h:257
siteion_t sion
Definition mrtk_nav.h:297
gtime_t time
Definition mrtk_nav.h:296
sitetrp_t strp
Definition mrtk_nav.h:298
siteion_t sion[MAXSITES]
Definition mrtk_nav.h:291
int nst
Definition mrtk_nav.h:290
sitetrp_t strp[MAXSITES]
Definition mrtk_nav.h:292
int nsi
Definition mrtk_nav.h:290
gtime_t time[MAXSITES]
Definition mrtk_nav.h:289
double std[3]
Definition mrtk_nav.h:274
double trp[3]
Definition mrtk_nav.h:273
gtime_t time
Definition mrtk_nav.h:272
unsigned char qflag
Definition mrtk_nav.h:275