39static const double PI = 3.1415926535897932;
40static const double D2R = 3.1415926535897932 / 180.0;
41static const double R2D = 180.0 / 3.1415926535897932;
47#define ION_BLKSIZE 2.0
48#define TRP_BLKSIZE 4.0
52#define GN(gp) (gp == 1 ? 64 : 16)
63 br = (int)360.0 / b->
bs;
64 b->
bpos[0] = 90.0 - (int)(b->
bn / br) * b->
bs;
66 if (b->
bpos[1] >= 180) {
73 gridsize = (double)b->
bs / (
double)gr;
75 for (i = 0; i < gr * gr; i++) {
77 if (!((b->
mask[0] >> i) & 1)) {
81 if (!((b->
mask[1] >> (i - 32)) & 1)) {
85 b->
grid[b->
n][0] = b->
bpos[0] - ((i / gr) * gridsize) *
D2R;
86 b->
grid[b->
n][1] = b->
bpos[1] + ((i % gr) * gridsize) *
D2R;
94#define ION_BAS_LSB 0.35
95#define ION_DET_LSB 0.002
96#define ION_STD_LSB 0.02
97#define ION_STD_MAX 2.56
100#define TRP_BAS_LSB 0.1
101#define TRP_DET_LSB 0.002
102#define TRP_STD_LSB 0.002
103#define TRP_STD_MAX 0.256
105#define ROUND(x) (int)floor((x) + 0.5)
126 if (ptime.
time != 0) {
127 if (
timediff(ntime, ptime) > (
double)86400 * 6) {
135 if (type == 2001 || type == 2011) {
139 }
else if ((2002 <= type && type <= 2006) || (2012 <= type && type <= 2016)) {
146 if (2001 <= type && type <= 2006) {
170 }
else if (2012 <= type && type <= 2016) {
186 int i, p = 0, ctnum, tp = 0;
187 unsigned int lat, lon;
188 double base, trp, ind, ecef[3];
189 double zhd, zazel[] = {0.0,
PI / 2.0};
194 trace(NULL, 1,
"decode_lcltrop: lclblk malloc error\n");
198 trace(NULL, 3,
"decode_lcltrop : %s,bn=%4d,btype=%d,gp=%d,gnum=%d\n",
time_str(
rtcm->time, 0), tmpblkinf.
bn,
200 for (i = 0; i <
rtcm->lclblk->tnum; i++) {
201 if (
rtcm->lclblk->tblkinf[i].bn == tmpblkinf.
bn) {
206 if (i ==
rtcm->lclblk->tnum) {
207 rtcm->lclblk->tnum++;
209 memcpy(&
rtcm->lclblk->tblkinf[i], &tmpblkinf,
sizeof(
blkinf_t));
210 blkinf = &
rtcm->lclblk->tblkinf[i];
214 for (i = 0; i < blkinf->
n; i++) {
226 }
else if (type == 2011) {
230 strp = &
rtcm->lclblk->tstat[ctnum][tp];
242 strp->
trpd.
trp[0] = trp + base + zhd;
246 trace(NULL, 4,
"decode_lcltrop : %s,bn=%4d,lat=%.3f,lon=%.3f,base=%lf,detail=%lf,std=%lf\n",
261 int i, j, p = 0, ns, nsat, sat, msys, minprn, ssat, cinum, tp = 0;
263 unsigned int smask[2] = {0}, nbase, lat, lon;
264 double base, ion, ind, ecef[3];
269 trace(NULL, 1,
"decode_lcliono: lclblk malloc error\n");
328 trace(NULL, 3,
"decode_lcliono : %s,bn=%4d,btype=%d,gp=%d\n",
time_str(
rtcm->time, 0), tmpblkinf.
bn,
330 for (i = 0; i <
rtcm->lclblk->inum; i++) {
331 if (
rtcm->lclblk->iblkinf[i].bn == tmpblkinf.
bn) {
335 if (i >=
rtcm->lclblk->inum) {
336 rtcm->lclblk->inum++;
339 memcpy(&
rtcm->lclblk->iblkinf[cinum], &tmpblkinf,
sizeof(
blkinf_t));
340 blkinf = &
rtcm->lclblk->iblkinf[cinum];
351 for (j = 0, ns = 0; j < nsat; j++) {
353 if (((smask[0] >> j) & 1)) {
354 prn[ns++] = j + minprn;
357 if (((smask[1] >> (j - 32)) & 1)) {
358 prn[ns++] = j + minprn;
364 if (2012 <= type && type <= 2016) {
365 for (i = 0; i < blkinf->
n; i++) {
376 ssat =
satno(msys, minprn);
377 for (i = 0; i < blkinf->
n; i++) {
378 if (2002 <= type && type <= 2006) {
380 }
else if (2012 <= type && type <= 2016) {
383 for (j = ssat - 1; j < ssat + nsat - 1; j++) {
384 ionp = &
rtcm->lclblk->istat[cinum][tp].iond[j];
389 memcpy(
rtcm->lclblk->istat[cinum][tp].site.ecef, ecef,
sizeof(
rtcm->lclblk->istat[cinum][tp].site.ecef));
392 for (i = 0; i < ns; i++) {
396 if (!(sat =
satno(msys, prn[i]))) {
399 for (j = 0; j < blkinf->
n; j++) {
400 if (2002 <= type && type <= 2006) {
402 }
else if (2012 <= type && type <= 2016) {
405 ionp = &
rtcm->lclblk->istat[cinum][tp].iond[sat - 1];
413 ionp->
ion = ion + base;
416 "decode_lcliono : %s,sys=%d,prn=%d,bn=%5d,gn=%d,lat=%.3f,lon=%.3f,base=%lf,detail=%lf,std=%lf\n",
418 blkinf->
grid[j][1] *
R2D, base, ion, ionp->
std);
425 int p = 24, week, epoch;
439 if (type == 2001 || type == 2011) {
442 }
else if ((2002 <= type && type <= 2006) || (2012 <= type && type <= 2016)) {
448 if (2001 <= type && type <= 2006) {
468 }
else if (2012 <= type && type <= 2016) {
481 int i, p = 0, n = 0, tp = 0;
482 unsigned int base, detail, stdev, lat, lon;
483 double zhd, zazel[] = {0.0,
PI / 2.0}, zwd[
MAXTRPSTA] = {0.0};
490 blkinf = &
rtcm->lclblk->tblkinf[
rtcm->lclblk->outtn];
492 for (i = 0, base = -1; i < blkinf->
n; i++) {
495 }
else if (type == 2011) {
498 trpp = &
rtcm->lclblk->tstat[
rtcm->lclblk->outtn][tp].trpd;
505 zwd[i] = trpp->
trp[0] - zhd;
506 if ((base == -1) || (base > (
unsigned int)(zwd[i] /
TRP_BAS_LSB))) {
517 trace(NULL, 3,
"encode_lcltrop : %s,bn=%4d,btype=%d,gp=%d,gnum=%d\n",
time_str(
rtcm->time, 0), blkinf->
bn,
521 for (i = 0; i < blkinf->
n; i++) {
524 }
else if (type == 2011) {
527 trpp = &
rtcm->lclblk->tstat[
rtcm->lclblk->outtn][tp].trpd;
528 if (trpp->
std[0] == 0) {
548 trace(NULL, 4,
"encode_lcltrop zwd<base: %s,bn=%4d,gn=%d,lat=%.3f,lon=%.3f,base=%lf,zwd=%lf\n",
553 trace(NULL, 4,
"encode_lcltrop TRP_STD_MAX<std: %s,bn=%4d,gn=%d,lat=%.3f,lon=%.3f,base=%lf,zwd=%lf\n",
563 trace(NULL, 4,
"encode_lcltrop : %s,bn=%4d,gn=%d,lat=%.3f,lon=%.3f,base=%.3f,detail=%.3f,std=%.3f\n",
578 int i, j, p = 0, n = 0, nsat, msys, minprn, sys, prn, ssat, tp = 0;
580 unsigned int base[
MAXOBS] = {-1}, satmask[2], detail, stdev, lat, lon;
642 ssat =
satno(msys, minprn);
643 blkinf = &
rtcm->lclblk->iblkinf[
rtcm->lclblk->outin];
645 for (i = 0; i < nsat; i++) {
648 for (i = 0, satmask[0] = 0, satmask[1] = 0; i < blkinf->
n; i++) {
649 if (2002 <= type && type <= 2006) {
651 }
else if (2012 <= type && type <= 2016) {
654 for (j = ssat - 1; j < ssat + nsat - 1; j++) {
655 ionp = &
rtcm->lclblk->istat[
rtcm->lclblk->outin][tp].iond[j];
656 sys =
satsys(j + 1, &prn);
658 if (ionp->
ion <= 0.0) {
662 ion[i][prn] = ionp->
ion;
663 std[i][prn] = ionp->
std;
665 if ((base[prn] == -1) || (base[prn] > (
unsigned int)(ionp->
ion /
ION_BAS_LSB))) {
669 satmask[0] |= (1 << (prn));
671 satmask[1] |= (1 << (prn - 32));
682 trace(NULL, 3,
"encode_lcliono : %s,bn=%4d,btype=%d,gp=%d,gnum=%d\n",
time_str(
rtcm->time, 0), blkinf->
bn,
695 if (2012 <= type && type <= 2016) {
696 for (i = 0; i < blkinf->
n; i++) {
705 for (i = 0; i < nsat; i++) {
707 if (((satmask[0] >> i) & 1) == 0) {
711 if (((satmask[1] >> (i - 32)) & 1) == 0) {
718 for (j = 0; j < blkinf->
n; j++) {
720 stdev = (
unsigned int)(log(std[j][i] /
ION_STD_LSB) / log(2));
724 trace(NULL, 4,
"encode_lcliono ion<base: %s,sys=%d,prn=%d,bn=%4d,gn=%d,base=%lf,ion=%lf\n",
729 trace(NULL, 4,
"encode_lcliono ION_STD_MAX<std: %s,sys=%d,prn=%d,bn=%4d,gn=%d,base=%lf,ion=%lf\n",
738 trace(NULL, 4,
"encode_lcliono : %s,sys=%d,prn=%d,bn=%4d,gn=%d,base=%lf,detail=%lf,std=%lf\n",
double tropmodel(gtime_t time, const double *pos, const double *azel, double humi)
Compute tropospheric delay by standard atmosphere and Saastamoinen.
MRTKLIB Atmosphere Module — Ionospheric and tropospheric models.
void setbitu(uint8_t *buff, int pos, int len, uint32_t data)
Set unsigned bits in byte data.
uint32_t getbitu(const uint8_t *buff, int pos, int len)
Extract unsigned bits from byte data.
MRTKLIB Bits Module — Binary bit operations and CRC functions.
void pos2ecef(const double *pos, double *r)
Transform geodetic position to ECEF position.
MRTKLIB Coordinates Module — Coordinate transformations and geometry.
int satsys(int sat, int *prn)
int satno(int sys, int prn)
Convert satellite system+prn/slot number to satellite number.
int encode_lcltrop(rtcm_t *rtcm, int type)
Encode local tropospheric delay correction grid RTCM message.
static int decode_lclhead(rtcm_t *rtcm, int type, blkinf_t *blkinf)
int decode_lcliono(rtcm_t *rtcm, int type)
Decode local ionospheric delay correction grid RTCM message.
int encode_lcliono(rtcm_t *rtcm, int type)
Encode local ionospheric delay correction grid RTCM message.
int decode_lcltrop(rtcm_t *rtcm, int type)
Decode local tropospheric delay correction grid RTCM message.
void initblkinf(blkinf_t *b)
Initialize block information struct.
static int encode_lclhead(rtcm_t *rtcm, int type, blkinf_t *blkinf)
lclblock_t * rtcm_lclblk(rtcm_t *rtcm)
Get the local correction block, lazily allocating it on first use.
MRTKLIB RTCM Module — RTCM message types and functions.
MRTKLIB System Module — OS/filesystem utility functions.
gtime_t gst2time(int week, double sec)
Convert Galileo system time week/tow to gtime_t.
double timediff(gtime_t t1, gtime_t t2)
Compute time difference (t1 - t2).
double time2gpst(gtime_t t, int *week)
Convert gtime_t to GPS week/tow.
char * time_str(gtime_t t, int n)
Get time string (not reentrant).
double time2gst(gtime_t t, int *week)
Convert gtime_t to Galileo system time week/tow.
void trace(mrtk_ctx_t *ctx, int level, const char *format,...)
Output trace message.
MRTKLIB Trace Module — debug trace and logging functions.
double grid[MAXTRPSTA][3]
GNSS time representation.
RTCM control struct type.