/* read obs and nav data -----------------------------------------------------*/ static int readobsnav(gtime_t ts, gtime_t te, double ti, char **infile, const int *index, int n, const prcopt_t *prcopt, obs_t *obs, nav_t *nav, sta_t *sta) { int i,j,ind=0,nobs=0,rcv=1; trace(3,"readobsnav: ts=%s n=%d\n",time_str(ts,0),n); obs->data=NULL; obs->n =obs->nmax =0; nav->eph =NULL; nav->n =nav->nmax =0; nav->geph=NULL; nav->ng=nav->ngmax=0; nav->seph=NULL; nav->ns=nav->nsmax=0; nepoch=0; for (i=0;i<n;i++) { if (checkbrk("")) return 0; if (index[i]!=ind) { if (obs->n>nobs) rcv++; ind=index[i]; nobs=obs->n; } /* read rinex obs and nav file */ if (readrnxt(infile[i],rcv,ts,te,ti,prcopt->rnxopt[rcv<=1?0:1],obs,nav, rcv<=2?sta+rcv-1:NULL)<0) { checkbrk("error : insufficient memory"); trace(1,"insufficient memory\n"); return 0; } } if (obs->n<=0) { checkbrk("error : no obs data"); trace(1,"no obs data\n"); return 0; } if (nav->n<=0&&nav->ng<=0&&nav->ns<=0) { checkbrk("error : no nav data"); trace(1,"no nav data\n"); return 0; } /* sort observation data */ nepoch=sortobs(obs); /* delete duplicated ephemeris */ uniqnav(nav); /* set time span for progress display */ if (ts.time==0||te.time==0) { for (i=0; i<obs->n;i++) if (obs->data[i].rcv==1) break; for (j=obs->n-1;j>=0;j--) if (obs->data[j].rcv==1) break; if (i<j) { if (ts.time==0) ts=obs->data[i].time; if (te.time==0) te=obs->data[j].time; settspan(ts,te); } } return 1; }
// read observation data rinex ---------------------------------------------- int __fastcall TPlot::ReadObsRnx(TStrings *files, obs_t *obs, nav_t *nav, sta_t *sta) { AnsiString s; gtime_t ts,te; double tint; int i; char obsfile[1024],navfile[1024],*p,*opt=RnxOpts.c_str(); trace(3,"ReadObsRnx\n"); TimeSpan(&ts,&te,&tint); for (i=0;i<files->Count;i++) { strcpy(obsfile,U2A(files->Strings[i]).c_str()); ShowMsg(s.sprintf("reading obs data... %s",obsfile)); Application->ProcessMessages(); if (readrnxt(obsfile,1,ts,te,tint,opt,obs,nav,sta)<0) { ShowMsg("error: insufficient memory"); return -1; } } ShowMsg("reading nav data..."); Application->ProcessMessages(); for (i=0;i<files->Count;i++) { strcpy(navfile,U2A(files->Strings[i]).c_str()); if (!(p=strrchr(navfile,'.'))) continue; if (!strcmp(p,".obs")||!strcmp(p,".OBS")) { strcpy(p,".nav" ); readrnxt(navfile,1,ts,te,tint,opt,NULL,nav,NULL); strcpy(p,".gnav"); readrnxt(navfile,1,ts,te,tint,opt,NULL,nav,NULL); strcpy(p,".hnav"); readrnxt(navfile,1,ts,te,tint,opt,NULL,nav,NULL); strcpy(p,".qnav"); readrnxt(navfile,1,ts,te,tint,opt,NULL,nav,NULL); strcpy(p,".lnav"); readrnxt(navfile,1,ts,te,tint,opt,NULL,nav,NULL); } else if (!strcmp(p+3,"o" )||!strcmp(p+3,"d" )|| !strcmp(p+3,"O" )||!strcmp(p+3,"D" )) { strcpy(p+3,"N"); readrnxt(navfile,1,ts,te,tint,opt,NULL,nav,NULL); strcpy(p+3,"G"); readrnxt(navfile,1,ts,te,tint,opt,NULL,nav,NULL); strcpy(p+3,"H"); readrnxt(navfile,1,ts,te,tint,opt,NULL,nav,NULL); strcpy(p+3,"Q"); readrnxt(navfile,1,ts,te,tint,opt,NULL,nav,NULL); strcpy(p+3,"L"); readrnxt(navfile,1,ts,te,tint,opt,NULL,nav,NULL); strcpy(p+3,"P"); readrnxt(navfile,1,ts,te,tint,opt,NULL,nav,NULL); } } if (obs->n<=0) { ShowMsg(s.sprintf("no observation data: %s...",files->Strings[0].c_str())); freenav(nav,0xFF); return 0; } uniqnav(nav); return sortobs(obs); }
/* main ----------------------------------------------------------------------*/ int main(int argc, char **argv) { gtime_t ts={0},te={0}; obs_t obs={0}; nav_t nav={0}; sta_t sta={{0}}; double es[6]={0},ee[6]={0},tint=0.0; char *infile[16]={0},*outfile="",buff[1024],*p; int i,n=0,m=0,type[16],trlevel=0,staid=0,ret=0; for (i=1;i<argc;i++) { if (!strcmp(argv[i],"-ts")&&i+2<argc) { sscanf(argv[++i],"%lf/%lf/%lf",es ,es+1,es+2); sscanf(argv[++i],"%lf:%lf:%lf",es+3,es+4,es+6); } else if (!strcmp(argv[i],"-te")&&i+2<argc) { sscanf(argv[++i],"%lf/%lf/%lf",ee ,ee+1,ee+2); sscanf(argv[++i],"%lf:%lf:%lf",ee+3,ee+4,ee+5); } else if (!strcmp(argv[i],"-ti" )&&i+1<argc) tint =atof(argv[++i]); else if (!strcmp(argv[i],"-sta")&&i+1<argc) staid=atoi(argv[++i]); else if (!strcmp(argv[i],"-out")&&i+1<argc) outfile=argv[++i]; else if (!strcmp(argv[i],"-typ")&&i+1<argc) { strcpy(buff,argv[++i]); for (p=strtok(buff,",");p;p=strtok(NULL,",")) type[m++]=atoi(p); } else if (!strcmp(argv[i],"-x" )&&i+1<argc) trlevel=atoi(argv[++i]); else if (!strncmp(argv[i],"-",1)) print_help(); else infile[n++]=argv[i]; } if (trlevel>0) { traceopen(TRACEFILE); tracelevel(trlevel); } if (es[0]>0.0) ts=epoch2time(es); if (ee[0]>0.0) te=epoch2time(ee); /* read rinex files */ for (i=0;i<n;i++) { readrnxt(infile[i],0,ts,te,tint,"",&obs,&nav,&sta); } sortobs(&obs); uniqnav(&nav); /* convert to rtcm messages */ if (!conv_rtcm(type,m,outfile,&obs,&nav,&sta,staid)) ret=-1; free(obs.data); freenav(&nav,0xFF); if (trlevel>0) { traceclose(); } return ret; }
// read navigation data ----------------------------------------------------- void __fastcall TPlot::ReadNav(TStrings *files) { AnsiString s; gtime_t ts,te; double tint; char navfile[1024],*opt=RnxOpts.c_str(); int i; trace(3,"ReadNav\n"); if (files->Count<=0) return; ReadWaitStart(); ShowLegend(NULL); TimeSpan(&ts,&te,&tint); freenav(&Nav,0xFF); ShowMsg("reading nav data..."); Application->ProcessMessages(); for (i=0;i<files->Count;i++) { strcpy(navfile,U2A(files->Strings[i]).c_str()); readrnxt(navfile,1,ts,te,tint,opt,NULL,&Nav,NULL); } uniqnav(&Nav); if (Nav.n<=0&&Nav.ng<=0&&Nav.ns<=0) { ShowMsg(s.sprintf("no nav message: %s...",files->Strings[0].c_str())); ReadWaitEnd(); return; } if (NavFiles!=files) { NavFiles->Assign(files); } UpdateObs(NObs); UpdateMp(); ReadWaitEnd(); UpdatePlot(); }
/* readrnx(), sortobs(), uniqnav() */ void utest1(void) { char file1[]="abc.00o"; char file2[]="bcd.00n"; char file3[]="../data/rinex/07590920.05o"; char file4[]="../data/rinex/07590920.05n"; char file5[]="../data/rinex/30400920.05o"; char file6[]="../data/rinex/30400920.05n"; obs_t obs={0}; nav_t nav={0}; sta_t sta={""}; int n,stat; stat=readrnx(file1,1,"",&obs,&nav,&sta); assert(stat==0&&obs.n==0&&nav.n==0&&nav.ng==0&&nav.ns==0); stat=readrnx(file2,1,"",&obs,&nav,&sta); assert(stat==0&&obs.n==0&&nav.n==0&&nav.ng==0&&nav.ns==0); stat=readrnx(file3,1,"",&obs,&nav,&sta); assert(stat==1); stat=readrnx(file4,1,"",&obs,&nav,&sta); assert(stat==1); stat=readrnx(file5,2,"",&obs,&nav,&sta); assert(stat==1); stat=readrnx(file6,2,"",&obs,&nav,&sta); assert(stat==1); n=sortobs(&obs); assert(n==171); uniqnav(&nav); assert(nav.n==167); dumpobs(&obs); dumpnav(&nav); dumpsta(&sta); assert(obs.data&&obs.n>0&&nav.eph&&nav.n>0); free(obs.data); free(nav.eph); free(nav.geph); free(nav.seph); printf("%s utest1 : OK\n",__FILE__); }
/* main ----------------------------------------------------------------------*/ int main(int argc, char **argv) { FILE *fp=stdout; pcvs_t pcvs={0}; nav_t nav={0}; obs_t obs={0}; sta_t sta={{0}}; pcv_t *pcv=NULL; gtime_t ts={0},te={0}; double eps[6]={0},epe[6]={0},rr[3]={0},tint=30.0; char *ifile[32],*ofile="",*afile="",*dfile="",ant[64]=""; int i,j,n=0; for (i=1;i<argc;i++) { if (!strcmp(argv[i],"-ts")&&i+2<argc) { sscanf(argv[++i],"%lf/%lf/%lf",eps,eps+1,eps+2); sscanf(argv[++i],"%lf:%lf:%lf",eps+3,eps+4,eps+5); } else if (!strcmp(argv[i],"-te")&&i+2<argc) { sscanf(argv[++i],"%lf/%lf/%lf",epe,epe+1,epe+2); sscanf(argv[++i],"%lf:%lf:%lf",epe+3,epe+4,epe+5); } else if (!strcmp(argv[i],"-ti")&&i+1<argc) { tint=atof(argv[++i]); } else if (!strcmp(argv[i],"-r")&&i+3<argc) { for (j=0;j<3;j++) rr[j]=atof(argv[++i]); } else if (!strcmp(argv[i],"-o")&&i+1<argc) ofile=argv[++i]; else if (!strcmp(argv[i],"-a")&&i+1<argc) afile=argv[++i]; else if (!strcmp(argv[i],"-d")&&i+1<argc) dfile=argv[++i]; else ifile[n++]=argv[i]; } /* open output file */ if (*ofile&&!(fp=fopen(ofile,"w"))) { fprintf(stderr,"output file open error: %s\n",ofile); return -1; } if (eps[2]>=1.0) ts=epoch2time(eps); if (epe[2]>=1.0) te=epoch2time(epe); /* read rinex obs/nav */ for (i=0;i<n;i++) { fprintf(stderr,"reading: %s\n",ifile[i]); readrnxt(ifile[i],1,ts,te,0.0,"",&obs,&nav,&sta); if (*sta.antdes) strcpy(ant,sta.antdes); if (norm(sta.pos,3)>0.0) matcpy(rr,sta.pos,3,1); } if (!sortobs(&obs)) { fprintf(stderr,"no observation data\n"); return -1; } uniqnav(&nav); /* read antenna file */ if (*afile&&*ant) { if (!readpcv(afile,&pcvs)) { fprintf(stderr,"antenna file open error: %s\n",afile); return -1; } /* search pcv */ if (!(pcv=searchpcv(0,ant,obs.data[0].time,&pcvs))) { fprintf(stderr,"no antenna parmeter: %s\n",ant); } } /* read p1-c1 dcb parameters */ if (*dfile) readdcb(dfile,&nav); /* set p1-p2 dcb parameters */ for (i=0;i<MAXSAT;i++) { for (j=0;j<nav.n;j++) { if (nav.eph[j].sat!=i+1) continue; nav.cbias[i][0]=nav.eph[j].tgd[0]*CLIGHT; break; } } /* estimate ionosphere parameters */ est_iono(&obs,&nav,pcv,rr,tint,fp); fclose(fp); if (*ofile) fprintf(stderr,"output: %s\n",ofile); return 0; }