Skip to content

Commit 811f8f9

Browse files
- Move Galileo E5b PPP solution processing into L1/L2 solutions to be consistent with RTK/PPK solutions
- Port changes/address issues raised in PR #41, #63 and issue #67 - Port changes from 2.4.3 PR #529, #554 - Update igs14.atx file with newer version - Fix an illegal memory access bug - Fix a bug in reporting single point solutions for static mode
1 parent e4eab4d commit 811f8f9

File tree

9 files changed

+50157
-4570
lines changed

9 files changed

+50157
-4570
lines changed

data/igs14.atx

Lines changed: 50103 additions & 4539 deletions
Large diffs are not rendered by default.

src/ephemeris.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -614,7 +614,7 @@ static int satpos_ssr(gtime_t time, gtime_t teph, int sat, const nav_t *nav,
614614
return 0;
615615
}
616616
if (ssr->udi[0]>=1.0) t1-=ssr->udi[0]/2.0;
617-
if (ssr->udi[1]>=1.0) t2-=ssr->udi[0]/2.0;
617+
if (ssr->udi[1]>=1.0) t2-=ssr->udi[1]/2.0;
618618

619619
for (i=0;i<3;i++) deph[i]=ssr->deph[i]+ssr->ddeph[i]*t1;
620620
dclk=ssr->dclk[0]+ssr->dclk[1]*t2+ssr->dclk[2]*t2*t2;

src/pntpos.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,9 +85,9 @@ static double prange(const obsd_t *obs, const nav_t *nav, const double *azel,
8585

8686
if (!(sys=satsys(obs->sat,NULL))) return 0.0;
8787

88-
/* L1-L2 for GPS/GLO/QZS, L1-L5 for GAL/SBS */
89-
if (NFREQ>=3&&(sys&(SYS_GAL|SYS_SBS))) j=2;
90-
88+
/* L1-L2 for GPS/GLO/QZS/GAL E5b, L1-L5 for SBS, GAL E5a */
89+
if (NFREQ>=3&&(sys&(SYS_SBS))) j=2; /* L5 for SBAS */
90+
if (obs->P[1]==0) j=2; /* use E5a if no Galileo E5b obs */
9191
if (NFREQ<2||lam[i]==0.0||lam[j]==0.0) return 0.0;
9292

9393
/* test snr mask */

src/postpos.c

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -416,7 +416,7 @@ static void procpos(FILE *fp, FILE *fptm, const prcopt_t *popt, const solopt_t *
416416
sol_t sol={{0}},oldsol={{0}},newsol={{0}};
417417
obsd_t obs[MAXOBS*2]; /* for rover and base */
418418
double rb[3]={0};
419-
int i,nobs,n,solstatic,num=0,pri[]={0,1,2,3,4,5,1,6};
419+
int i,nobs,n,solstatic,num=0,pri[]={6,1,2,3,4,5,1,6};
420420

421421
trace(3,"procpos : mode=%d\n",mode);
422422

@@ -756,6 +756,7 @@ static int readobsnav(gtime_t ts, gtime_t te, double ti, char **infile,
756756
obs->data=NULL; obs->n =obs->nmax =0;
757757
nav->eph =NULL; nav->n =nav->nmax =0;
758758
nav->geph=NULL; nav->ng=nav->ngmax=0;
759+
/* free(nav->seph); */ /* is this needed to avoid memory leak??? */
759760
nav->seph=NULL; nav->ns=nav->nsmax=0;
760761
nepoch=0;
761762

@@ -788,7 +789,7 @@ static int readobsnav(gtime_t ts, gtime_t te, double ti, char **infile,
788789
nepoch=sortobs(obs);
789790

790791
/* delete duplicated ephemeris */
791-
uniqnav(nav);
792+
uniqnav(nav,prcopt->nf);
792793

793794
/* set time span for progress display */
794795
if (ts.time==0||te.time==0) {
@@ -1219,9 +1220,9 @@ static int execses(gtime_t ts, gtime_t te, double ti, const prcopt_t *popt,
12191220
free(solb);
12201221
free(rbf);
12211222
free(rbb);
1222-
rtkfree(&rtk);
12231223
}
1224-
/* free obs and nav data */
1224+
/* free rtk, obs and nav data */
1225+
rtkfree(&rtk);
12251226
freeobsnav(&obss,&navs);
12261227

12271228
return aborts?1:0;
@@ -1459,7 +1460,7 @@ extern int postpos(gtime_t ts, gtime_t te, double ti, double tu,
14591460

14601461
if (stat==1) break;
14611462
}
1462-
for (i=0;i<MAXINFILE;i++) free(ifile[i]);
1463+
for (i=0;i<n&&i<MAXINFILE;i++) free(ifile[i]);
14631464
}
14641465
else if (ts.time!=0) {
14651466
for (i=0;i<n&&i<MAXINFILE;i++) {

src/ppp.c

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,7 @@ static double varerr(int sat, int sys, double el, double snr_rover, int freq,
330330
switch (sys) {
331331
case SYS_GPS: fact *= EFACT_GPS; break;
332332
case SYS_GLO: fact *= EFACT_GLO; break;
333+
case SYS_GAL: fact *= EFACT_GAL; break;
333334
case SYS_SBS: fact *= EFACT_SBS; break;
334335
default: fact *= EFACT_GPS; break;
335336
}
@@ -365,7 +366,8 @@ static void initx(rtk_t *rtk, double xi, double var, int i)
365366
static double gfmeas(const obsd_t *obs, const nav_t *nav)
366367
{
367368
const double *lam=nav->lam[obs->sat-1];
368-
int i=(satsys(obs->sat,NULL)&(SYS_GAL|SYS_SBS))?2:1;
369+
int i=(satsys(obs->sat,NULL)&(SYS_SBS))?2:1; /* always use L1/L5 for SBAS */
370+
if (NFREQ>2&&obs->P[1]==0.0) i=2; /* otherwise, if no L2, try L5 */
369371

370372
if (lam[0]==0.0||lam[i]==0.0||obs->L[0]==0.0||obs->L[i]==0.0) return 0.0;
371373
return lam[0]*obs->L[0]-lam[i]*obs->L[i];
@@ -374,7 +376,8 @@ static double gfmeas(const obsd_t *obs, const nav_t *nav)
374376
static double mwmeas(const obsd_t *obs, const nav_t *nav)
375377
{
376378
const double *lam=nav->lam[obs->sat-1];
377-
int i=(satsys(obs->sat,NULL)&(SYS_GAL|SYS_SBS))?2:1;
379+
int i=(satsys(obs->sat,NULL)&(SYS_SBS))?2:1; /* always use L1/L5 for SBAS */
380+
if (NFREQ>2&&obs->P[1]==0.0) i=2; /* otherwise, if no L2, try L5 */
378381

379382
if (lam[0]==0.0||lam[i]==0.0||obs->L[0]==0.0||obs->L[i]==0.0||
380383
obs->P[0]==0.0||obs->P[i]==0.0) return 0.0;
@@ -408,6 +411,8 @@ static void corr_meas(const obsd_t *obs, const nav_t *nav, const double *azel,
408411
ix=(i==0?CODE_L1W-1:CODE_L2W-1);
409412
else if (sys==SYS_GLO)
410413
ix=(i==0?CODE_L1P-1:CODE_L2P-1);
414+
else if (sys==SYS_GAL)
415+
ix=(i==0?CODE_L1X-1:CODE_L7X-1);
411416
P[i]+=(nav->ssr[obs->sat-1].cbias[obs->code[i]-1]-nav->ssr[obs->sat-1].cbias[ix]); /* ssr correction */
412417
}
413418
else {
@@ -426,7 +431,8 @@ static void corr_meas(const obsd_t *obs, const nav_t *nav, const double *azel,
426431
}
427432
/* iono-free LC */
428433
*Lc=*Pc=0.0;
429-
i=(sys&(SYS_GAL|SYS_SBS))?2:1; /* L1/L2 or L1/L5 */
434+
i=(sys&(SYS_SBS))?2:1; /* always use L1/L5 for SBAS */
435+
if (NFREQ>2&&P[1]==0.0) i=2; /* otherwise, if no L2, try L5 */
430436
if (lam[0]==0.0||lam[i]==0.0) return;
431437

432438
C1= SQR(lam[i])/(SQR(lam[i])-SQR(lam[0]));
@@ -654,7 +660,8 @@ static void udiono_ppp(rtk_t *rtk, const obsd_t *obs, int n, const nav_t *nav)
654660
for (i=0;i<n;i++) {
655661
j=II(obs[i].sat,&rtk->opt);
656662
if (rtk->x[j]==0.0) {
657-
k=satsys(obs[i].sat,NULL)==SYS_GAL?2:1;
663+
k=1;
664+
if (NFREQ>2&&obs[i].P[1]==0.0) k=2; /* if no L2, try L5 */
658665
lam=nav->lam[obs[i].sat-1];
659666
if (obs[i].P[0]==0.0||obs[i].P[k]==0.0||lam[0]==0.0||lam[k]==0.0) {
660667
continue;
@@ -733,7 +740,8 @@ static void udbias_ppp(rtk_t *rtk, const obsd_t *obs, int n, const nav_t *nav)
733740
}
734741
else if (L[f]!=0.0&&P[f]!=0.0) {
735742
slip[i]=rtk->ssat[sat-1].slip[f];
736-
l=satsys(sat,NULL)==SYS_GAL?2:1;
743+
l=1;
744+
if (NFREQ>2&&obs[i].P[l]==0.0) l=2; /* if no L2, try L5 */
737745
lam=nav->lam[sat-1];
738746
if (obs[i].P[0]==0.0||obs[i].P[l]==0.0||lam[0]==0.0||lam[l]==0.0||lam[f]==0.0)
739747
ion=0;

src/preceph.c

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -66,35 +66,39 @@ static int code2sys(char code)
6666
static int readsp3h(FILE *fp, gtime_t *time, char *type, int *sats,
6767
double *bfact, char *tsys)
6868
{
69-
int i,j,k=0,ns=0,sys,prn;
69+
int i=0,j,k=0,ns=0,nl=5,sys,prn;
7070
char buff[1024];
7171

7272
trace(3,"readsp3h:\n");
7373

74-
for (i=0;i<22;i++) {
75-
if (!fgets(buff,sizeof(buff),fp)) break;
76-
77-
if (i==0) {
74+
while (fgets(buff,sizeof(buff),fp)) {
75+
76+
if (buff[0]=='#'&&(buff[1]=='c'||buff[1]=='d')) {
7877
*type=buff[2];
7978
if (str2time(buff,3,28,time)) return 0;
8079
}
81-
else if (2<=i&&i<=6) {
80+
else if (buff[0]=='+'&&buff[1]==' ') {
8281
if (i==2) {
83-
ns=(int)str2num(buff,4,2);
82+
ns=(int)str2num(buff,3,3);
83+
if (ns>85) nl=ns/17+(ns%17!=0);
8484
}
8585
for (j=0;j<17&&k<ns;j++) {
8686
sys=code2sys(buff[9+3*j]);
8787
prn=(int)str2num(buff,10+3*j,2);
8888
if (k<MAXSAT) sats[k++]=satno(sys,prn);
8989
}
9090
}
91-
else if (i==12) {
91+
else if (i==2*nl+2) {/* %c */
9292
strncpy(tsys,buff+9,3); tsys[3]='\0';
9393
}
94-
else if (i==14) {
94+
else if (i==2*nl+4) {/* %f */
9595
bfact[0]=str2num(buff, 3,10);
9696
bfact[1]=str2num(buff,14,12);
9797
}
98+
else if (i==2*nl+11){
99+
break; /* at end of header */
100+
}
101+
i=i+1; /* line counter */
98102
}
99103
return ns;
100104
}
@@ -676,8 +680,8 @@ extern void satantoff(gtime_t time, const double *rs, int sat, const nav_t *nav,
676680
if (!normv3(r,ey)) return;
677681
cross3(ey,ez,ex);
678682

679-
if (NFREQ>=3&&(satsys(sat,NULL)&(SYS_GAL|SYS_SBS))) k=2;
680-
683+
if ((NFREQ>=3)&&(satsys(sat,NULL)&SYS_SBS)) k=2; /* always use L5 for SBAS */
684+
if ((NFREQ>=3)&&(satsys(sat,NULL)&SYS_GAL)&&(lam[1]==0)) k=2; /* use E5a if no E5b for GAL */
681685
if (NFREQ<2||lam[j]==0.0||lam[k]==0.0) return;
682686

683687
gamma=SQR(lam[k])/SQR(lam[j]);

src/rtkcmn.c

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2224,6 +2224,8 @@ static int readantex(const char *file, pcvs_t *pcvs)
22242224
if (sscanf(buff+4,"%d",&f)<1) continue;
22252225
for (i=0;i<NFREQ;i++) if (freqs[i]==f) break;
22262226
if (i<NFREQ) freq=i+1;
2227+
/* for Galileo E5b: use E2, not E7 */
2228+
if (satsys(pcv.sat,NULL)==SYS_GAL&&f==7) freq=2;
22272229
}
22282230
else if (strstr(buff+60,"END OF FREQUENCY")) {
22292231
freq=0;
@@ -2665,9 +2667,9 @@ extern int sisa_index(double value)
26652667
* args : nav_t *nav IO navigation data
26662668
* return : number of epochs
26672669
*-----------------------------------------------------------------------------*/
2668-
extern void uniqnav(nav_t *nav)
2670+
extern void uniqnav(nav_t *nav, int nf)
26692671
{
2670-
int i,j;
2672+
int i,j,sys;
26712673

26722674
trace(3,"uniqnav: neph=%d ngeph=%d nseph=%d\n",nav->n,nav->ng,nav->ns);
26732675

@@ -2677,8 +2679,17 @@ extern void uniqnav(nav_t *nav)
26772679
uniqseph(nav);
26782680

26792681
/* update carrier wave length */
2680-
for (i=0;i<MAXSAT;i++) for (j=0;j<NFREQ;j++) {
2681-
nav->lam[i][j]=satwavelen(i+1,j,nav);
2682+
for (i=0;i<MAXSAT;i++) {
2683+
for (j=0;j<NFREQ;j++) {
2684+
sys=satsys(i+1,NULL);
2685+
if ((sys!=SYS_GAL)||(nf<=2)||(j!=1)) {
2686+
nav->lam[i][j]=satwavelen(i+1,j,nav);
2687+
} else {
2688+
/* if this is a L1+L2+L5 solution set lam=0 as flag for satellite PCV
2689+
antenna offset calc to indicate using Galileo E5a, not E5b */
2690+
nav->lam[i][j]=0;
2691+
}
2692+
}
26822693
}
26832694
}
26842695
/* compare observation data -------------------------------------------------*/

src/rtklib.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1540,7 +1540,7 @@ EXPORT double dms2deg(const double *dms);
15401540
/* input and output functions ------------------------------------------------*/
15411541
EXPORT void readpos(const char *file, const char *rcv, double *pos);
15421542
EXPORT int sortobs(obs_t *obs);
1543-
EXPORT void uniqnav(nav_t *nav);
1543+
EXPORT void uniqnav(nav_t *nav, int nf);
15441544
EXPORT int screent(gtime_t time, gtime_t ts, gtime_t te, double tint);
15451545
EXPORT int readnav(const char *file, nav_t *nav);
15461546
EXPORT int savenav(const char *file, const nav_t *nav);

src/src.pro

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@ SOURCES += rtkcmn.c \
5858
rcv/rt17.c \
5959
rcv/septentrio.c \
6060
rcv/skytraq.c \
61-
rcv/ss2.c \
6261
rcv/ublox.c \
6362
rcv/tersus.c \
6463
rcv/comnav.c \

0 commit comments

Comments
 (0)