/* execute processing session for each base station --------------------------*/ static int execses_b(gtime_t ts, gtime_t te, double ti, const prcopt_t *popt, const solopt_t *sopt, const filopt_t *fopt, int flag, char **infile, const int *index, int n, char *outfile, const char *rov, const char *base) { gtime_t t0={0}; int i,stat=0; char *ifile[MAXINFILE],ofile[1024],*base_,*p,*q,s[64]; trace(3,"execses_b: n=%d outfile=%s\n",n,outfile); /* read prec ephemeris and sbas data */ readpreceph(infile,n,popt,&navs,&sbss,&lexs); for (i=0;i<n;i++) if (strstr(infile[i],"%b")) break; if (i<n) { /* include base station keywords */ if (!(base_=(char *)malloc(strlen(base)+1))) { freepreceph(&navs,&sbss,&lexs); return 0; } strcpy(base_,base); for (i=0;i<n;i++) { if (!(ifile[i]=(char *)malloc(1024))) { free(base_); for (;i>=0;i--) free(ifile[i]); freepreceph(&navs,&sbss,&lexs); return 0; } } for (p=base_;;p=q+1) { /* for each base station */ if ((q=strchr(p,' '))) *q='\0'; if (*p) { strcpy(proc_base,p); if (ts.time) time2str(ts,s,0); else *s='\0'; if (checkbrk("reading : %s",s)) { stat=1; break; } for (i=0;i<n;i++) reppath(infile[i],ifile[i],t0,"",p); reppath(outfile,ofile,t0,"",p); stat=execses_r(ts,te,ti,popt,sopt,fopt,flag,ifile,index,n,ofile,rov); } if (stat==1||!q) break; } free(base_); for (i=0;i<n;i++) free(ifile[i]); } else { stat=execses_r(ts,te,ti,popt,sopt,fopt,flag,infile,index,n,outfile,rov); } /* free prec ephemeris and sbas data */ freepreceph(&navs,&sbss,&lexs); return stat; }
/* execute processing session for each rover ---------------------------------*/ static int execses_r(gtime_t ts, gtime_t te, double ti, const prcopt_t *popt, const solopt_t *sopt, const filopt_t *fopt, int flag, char **infile, const int *index, int n, char *outfile, const char *rov) { gtime_t t0={0}; int i,stat=0; char *ifile[MAXINFILE],ofile[1024],*rov_,*p,*q,s[64]=""; trace(3,"execses_r: n=%d outfile=%s\n",n,outfile); for (i=0;i<n;i++) if (strstr(infile[i],"%r")) break; if (i<n) { /* include rover keywords */ if (!(rov_=(char *)malloc(strlen(rov)+1))) return 0; strcpy(rov_,rov); for (i=0;i<n;i++) { if (!(ifile[i]=(char *)malloc(1024))) { free(rov_); for (;i>=0;i--) free(ifile[i]); return 0; } } for (p=rov_;;p=q+1) { /* for each rover */ if ((q=strchr(p,' '))) *q='\0'; if (*p) { strcpy(proc_rov,p); if (ts.time) time2str(ts,s,0); else *s='\0'; if (checkbrk("reading : %s",s)) { stat=1; break; } for (i=0;i<n;i++) reppath(infile[i],ifile[i],t0,p,""); reppath(outfile,ofile,t0,p,""); /* execute processing session */ stat=execses(ts,te,ti,popt,sopt,fopt,flag,ifile,index,n,ofile); } if (stat==1||!q) break; } free(rov_); for (i=0;i<n;i++) free(ifile[i]); } else { /* execute processing session */ stat=execses(ts,te,ti,popt,sopt,fopt,flag,infile,index,n,outfile); } return stat; }
// replace keywords in file path -------------------------------------------- AnsiString __fastcall TMainWindow::RepPath(AnsiString File) { AnsiString Path; char path[1024]; reppath(File.c_str(),path,timeadd(RnxTime,TSTARTMARGIN),RnxCode.c_str(),""); return Path=path; }
/* reppath() */ void utest2(void) { gtime_t t0={0},t1,t2; double ep1[]={1990, 1, 1, 0, 0, 0.00000}; double ep2[]={2010,12,31,23,59,59.99999}; char path0[]="01234567890123456789"; char path1[]="abcde_%Y/%m/%d_%h:%M:%S_%Y%m%d%h%M%S"; char path2[]="abcde_%y%n_%W%D%H_%ha%hb%hc"; char path3[]="rover %r %r base %b %b"; char path4[]="%a %b %c"; char rpath[1024]; char rov[]="RRRRRRRR",base[]="BBBBBBBB"; int stat; t1=epoch2time(ep1); t2=epoch2time(ep2); stat=reppath(path0,rpath,t1,"",""); assert(stat==0); stat=strcmp(rpath,path0); assert(stat==0); stat=reppath(path0,rpath,t0,rov,base); assert(stat==0); stat=strcmp(rpath,path0); assert(stat==0); stat=reppath(path0,rpath,t1,rov,base); assert(stat==0); stat=strcmp(rpath,path0); assert(stat==0); stat=reppath(path1,rpath,t1,"",""); assert(stat==1); stat=strcmp(rpath,"abcde_1990/01/01_00:00:00_19900101000000"); assert(stat==0); stat=reppath(path2,rpath,t2,rov,base); assert(stat==1); stat=strcmp(rpath,"abcde_10365_16165x_211812"); assert(stat==0); stat=reppath(path3,rpath,t0,rov,base); assert(stat==1); stat=strcmp(rpath,"rover RRRRRRRR RRRRRRRR base BBBBBBBB BBBBBBBB"); assert(stat==0); stat=reppath(path4,rpath,t1,rov,""); assert(stat==0); stat=strcmp(rpath,"%a %b %c"); assert(stat==0); printf("%s utset2 : OK\n",__FILE__); }
/* generate path by replacing keywords ---------------------------------------*/ static void genpath(const char *file, const char *name, gtime_t time, int seqno, char *path) { char buff[1024],*p,*q,*r,*env,var[1024]=""; char l_name[1024]="",u_name[1024]=""; for (p=l_name,q=(char *)name;(*p=(char)tolower(*q));p++,q++) ; for (p=u_name,q=(char *)name;(*p=(char)toupper(*q));p++,q++) ; for (p=buff,q=(char *)file;(*p=*q);p++,q++) { if (*q=='%') q++; else continue; if (*q=='s'||*q=='r') p+=sprintf(p,"%s",l_name)-1; else if (*q=='S'||*q=='R') p+=sprintf(p,"%s",u_name)-1; else if (*q=='N') p+=sprintf(p,"%d",seqno)-1; else if (*q=='{'&&(r=strchr(q+1,'}'))) { strncpy(var,q+1,r-q-1); var[r-q-1]='\0'; if ((env=getenv(var))) p+=sprintf(p,"%s",env)-1; q=r; } else q--; } reppath(buff,path,time,"",""); }
/* input obs data, navigation messages and sbas correction -------------------*/ static int inputobs(obsd_t *obs, int solq, const prcopt_t *popt) { gtime_t time={0}; char path[1024]; int i,nu,nr,n=0; trace(3,"infunc : revs=%d iobsu=%d iobsr=%d isbs=%d\n",revs,iobsu,iobsr,isbs); if (0<=iobsu&&iobsu<obss.n) { settime((time=obss.data[iobsu].time)); if (checkbrk("processing : %s Q=%d",time_str(time,0),solq)) { aborts=1; showmsg("aborted"); return -1; } } if (!revs) { /* input forward data */ if ((nu=nextobsf(&obss,&iobsu,1))<=0) return -1; if (popt->intpref) { for (;(nr=nextobsf(&obss,&iobsr,2))>0;iobsr+=nr) if (timediff(obss.data[iobsr].time,obss.data[iobsu].time)>-DTTOL) break; } else { for (i=iobsr;(nr=nextobsf(&obss,&i,2))>0;iobsr=i,i+=nr) if (timediff(obss.data[i].time,obss.data[iobsu].time)>DTTOL) break; } nr=nextobsf(&obss,&iobsr,2); for (i=0;i<nu&&n<MAXOBS;i++) obs[n++]=obss.data[iobsu+i]; for (i=0;i<nr&&n<MAXOBS;i++) obs[n++]=obss.data[iobsr+i]; iobsu+=nu; /* update sbas corrections */ while (isbs<sbss.n) { time=gpst2time(sbss.msgs[isbs].week,sbss.msgs[isbs].tow); if (getbitu(sbss.msgs[isbs].msg,8,6)!=9) { /* except for geo nav */ sbsupdatecorr(sbss.msgs+isbs,&navs); } if (timediff(time,obs[0].time)>-1.0-DTTOL) break; isbs++; } /* update lex corrections */ while (ilex<lexs.n) { if (lexupdatecorr(lexs.msgs+ilex,&navs,&time)) { if (timediff(time,obs[0].time)>-1.0-DTTOL) break; } ilex++; } /* update rtcm corrections */ if (*rtcm_file) { /* open or swap rtcm file */ reppath(rtcm_file,path,obs[0].time,"",""); if (strcmp(path,rtcm_path)) { strcpy(rtcm_path,path); if (fp_rtcm) fclose(fp_rtcm); fp_rtcm=fopen(path,"rb"); if (fp_rtcm) { rtcm.time=obs[0].time; input_rtcm3f(&rtcm,fp_rtcm); trace(2,"rtcm file open: %s\n",path); } } if (fp_rtcm) { while (timediff(rtcm.time,obs[0].time)<0.0) { if (input_rtcm3f(&rtcm,fp_rtcm)<-1) break; } for (i=0;i<MAXSAT;i++) navs.ssr[i]=rtcm.ssr[i]; } } } else { /* input backward data */ if ((nu=nextobsb(&obss,&iobsu,1))<=0) return -1; if (popt->intpref) { for (;(nr=nextobsb(&obss,&iobsr,2))>0;iobsr-=nr) if (timediff(obss.data[iobsr].time,obss.data[iobsu].time)<DTTOL) break; } else { for (i=iobsr;(nr=nextobsb(&obss,&i,2))>0;iobsr=i,i-=nr) if (timediff(obss.data[i].time,obss.data[iobsu].time)<-DTTOL) break; } nr=nextobsb(&obss,&iobsr,2); for (i=0;i<nu&&n<MAXOBS;i++) obs[n++]=obss.data[iobsu-nu+1+i]; for (i=0;i<nr&&n<MAXOBS;i++) obs[n++]=obss.data[iobsr-nr+1+i]; iobsu-=nu; /* update sbas corrections */ while (isbs>=0) { time=gpst2time(sbss.msgs[isbs].week,sbss.msgs[isbs].tow); if (getbitu(sbss.msgs[isbs].msg,8,6)!=9) { /* except for geo nav */ sbsupdatecorr(sbss.msgs+isbs,&navs); } if (timediff(time,obs[0].time)<1.0+DTTOL) break; isbs--; } /* update lex corrections */ while (ilex>=0) { if (lexupdatecorr(lexs.msgs+ilex,&navs,&time)) { if (timediff(time,obs[0].time)<1.0+DTTOL) break; } ilex--; } } return n; }
/* post-processing positioning ------------------------------------------------- * post-processing positioning * args : gtime_t ts I processing start time (ts.time==0: no limit) * : gtime_t te I processing end time (te.time==0: no limit) * double ti I processing interval (s) (0:all) * double tu I processing unit time (s) (0:all) * prcopt_t *popt I processing options * solopt_t *sopt I solution options * filopt_t *fopt I file options * char **infile I input files (see below) * int n I number of input files * char *outfile I output file ("":stdout, see below) * char *rov I rover id list (separated by " ") * char *base I base station id list (separated by " ") * return : status (0:ok,0>:error,1:aborted) * notes : input files should contain observation data, navigation data, precise * ephemeris/clock (optional), sbas log file (optional), ssr message * log file (optional) and tec grid file (optional). only the first * observation data file in the input files is recognized as the rover * data. * * the type of an input file is recognized by the file extention as ] * follows: * .sp3,.SP3,.eph*,.EPH*: precise ephemeris (sp3c) * .sbs,.SBS,.ems,.EMS : sbas message log files (rtklib or ems) * .lex,.LEX : qzss lex message log files * .rtcm3,.RTCM3 : ssr message log files (rtcm3) * .*i,.*I : tec grid files (ionex) * others : rinex obs, nav, gnav, hnav, qnav or clock * * inputs files can include wild-cards (*). if an file includes * wild-cards, the wild-card expanded multiple files are used. * * inputs files can include keywords. if an file includes keywords, * the keywords are replaced by date, time, rover id and base station * id and multiple session analyses run. refer reppath() for the * keywords. * * the output file can also include keywords. if the output file does * not include keywords. the results of all multiple session analyses * are output to a single output file. * * ssr corrections are valid only for forward estimation. *-----------------------------------------------------------------------------*/ extern int postpos(gtime_t ts, gtime_t te, double ti, double tu, const prcopt_t *popt, const solopt_t *sopt, const filopt_t *fopt, char **infile, int n, char *outfile, const char *rov, const char *base) { gtime_t tts,tte,ttte; double tunit,tss; int i,j,k,nf,stat=0,week,flag=1,index[MAXINFILE]={0}; char *ifile[MAXINFILE],ofile[1024],*ext; trace(3,"postpos : ti=%.0f tu=%.0f n=%d outfile=%s\n",ti,tu,n,outfile); /* open processing session */ if (!openses(popt,sopt,fopt,&navs,&pcvss,&pcvsr)) return -1; if (ts.time!=0&&te.time!=0&&tu>=0.0) { if (timediff(te,ts)<0.0) { showmsg("error : no period"); closeses(&navs,&pcvss,&pcvsr); return 0; } for (i=0;i<MAXINFILE;i++) { if (!(ifile[i]=(char *)malloc(1024))) { for (;i>=0;i--) free(ifile[i]); closeses(&navs,&pcvss,&pcvsr); return -1; } } if (tu==0.0||tu>86400.0*MAXPRCDAYS) tu=86400.0*MAXPRCDAYS; settspan(ts,te); tunit=tu<86400.0?tu:86400.0; tss=tunit*(int)floor(time2gpst(ts,&week)/tunit); for (i=0;;i++) { /* for each periods */ tts=gpst2time(week,tss+i*tu); tte=timeadd(tts,tu-DTTOL); if (timediff(tts,te)>0.0) break; if (timediff(tts,ts)<0.0) tts=ts; if (timediff(tte,te)>0.0) tte=te; strcpy(proc_rov ,""); strcpy(proc_base,""); if (checkbrk("reading : %s",time_str(tts,0))) { stat=1; break; } for (j=k=nf=0;j<n;j++) { ext=strrchr(infile[j],'.'); if (ext&&(!strcmp(ext,".rtcm3")||!strcmp(ext,".RTCM3"))) { strcpy(ifile[nf++],infile[j]); } else { /* include next day precise ephemeris or rinex brdc nav */ ttte=tte; if (ext&&(!strcmp(ext,".sp3")||!strcmp(ext,".SP3")|| !strcmp(ext,".eph")||!strcmp(ext,".EPH"))) { ttte=timeadd(ttte,3600.0); } else if (strstr(infile[j],"brdc")) { ttte=timeadd(ttte,7200.0); } nf+=reppaths(infile[j],ifile+nf,MAXINFILE-nf,tts,ttte,"",""); } while (k<nf) index[k++]=j; if (nf>=MAXINFILE) { trace(2,"too many input files. trancated\n"); break; } } if (!reppath(outfile,ofile,tts,"","")&&i>0) flag=0; /* execute processing session */ stat=execses_b(tts,tte,ti,popt,sopt,fopt,flag,ifile,index,nf,ofile, rov,base); if (stat==1) break; } for (i=0;i<MAXINFILE;i++) free(ifile[i]); } else if (ts.time!=0) { for (i=0;i<n&&i<MAXINFILE;i++) { if (!(ifile[i]=(char *)malloc(1024))) { for (;i>=0;i--) free(ifile[i]); return -1; } reppath(infile[i],ifile[i],ts,"",""); index[i]=i; } reppath(outfile,ofile,ts,"",""); /* execute processing session */ stat=execses_b(ts,te,ti,popt,sopt,fopt,1,ifile,index,n,ofile,rov, base); for (i=0;i<n&&i<MAXINFILE;i++) free(ifile[i]); } else { for (i=0;i<n;i++) index[i]=i; /* execute processing session */ stat=execses_b(ts,te,ti,popt,sopt,fopt,1,infile,index,n,outfile,rov, base); } /* close processing session */ closeses(&navs,&pcvss,&pcvsr); return stat; }
/* set approx position -------------------------------------------------------*/ static void setapppos(strfile_t *str, rnxopt_t *opt) { prcopt_t prcopt=prcopt_default; sol_t sol={{0}}; char msg[128]; prcopt.navsys=opt->navsys; /* point positioning with last obs data */ #ifdef WAAS_STUDY if (!pntpos(str->obs->data,str->obs->n,str->nav,&prcopt,&sol,NULL,NULL, NULL,msg)) { #else if (!pntpos(str->obs->data,str->obs->n,str->nav,&prcopt,&sol,NULL,NULL, msg)) { #endif trace(2,"point position error (%s)\n",msg); return; } matcpy(opt->apppos,sol.rr,3,1); } /* show status message -------------------------------------------------------*/ static int showstat(int sess, gtime_t ts, gtime_t te, int *n) { const char type[]="ONGHQLSE"; char msg[1024]="",*p=msg,s[64]; int i; if (sess>0) { p+=sprintf(p,"(%d) ",sess); } if (ts.time!=0) { time2str(ts,s,0); p+=sprintf(p,"%s",s); } if (te.time!=0&&timediff(te,ts)>0.9) { time2str(te,s,0); p+=sprintf(p,"-%s",s+5); } p+=sprintf(p,": "); for (i=0;i<NOUTFILE+1;i++) { if (n[i]==0) continue; p+=sprintf(p,"%c=%d%s",type[i],n[i],i<NOUTFILE?" ":""); } return showmsg(msg); } /* rinex converter for single-session ----------------------------------------*/ static int convrnx_s(int sess, int format, rnxopt_t *opt, const char *file, char **ofile) { FILE *ofp[NOUTFILE]={NULL}; strfile_t *str; gtime_t ts={0},te={0},tend={0},time={0}; unsigned char slips[MAXSAT][NFREQ+NEXOBS]={{0}}; int i,j,nf,type,n[NOUTFILE+1]={0},abort=0; char path[1024],*paths[NOUTFILE],s[NOUTFILE][1024]; char *epath[MAXEXFILE]={0},*staid=*opt->staid?opt->staid:"0000"; trace(3,"convrnx_s: sess=%d format=%d file=%s ofile=%s %s %s %s %s %s %s\n", sess,format,file,ofile[0],ofile[1],ofile[2],ofile[3],ofile[4], ofile[5],ofile[6]); /* replace keywords in input file */ if (reppath(file,path,opt->ts,staid,"")<0) { showmsg("no time for input file: %s",file); return 0; } /* expand wild-cards in input file */ for (i=0;i<MAXEXFILE;i++) { if (!(epath[i]=(char *)malloc(1024))) { for (i=0;i<MAXEXFILE;i++) free(epath[i]); return 0; } } nf=expath(path,epath,MAXEXFILE); if (format==STRFMT_RTCM2||format==STRFMT_RTCM3) time=opt->trtcm; if (opt->scanobs) { /* scan observation types */ if (!scan_obstype(format,epath[0],opt,&time)) return 0; } else { /* set observation types by format */ set_obstype(format,opt); } if (!(str=gen_strfile(format,opt->rcvopt,time))) { for (i=0;i<MAXEXFILE;i++) free(epath[i]); return 0; } time=opt->ts.time?opt->ts:(time.time?timeadd(time,TSTARTMARGIN):time); /* replace keywords in output file */ for (i=0;i<NOUTFILE;i++) { paths[i]=s[i]; if (reppath(ofile[i],paths[i],time,staid,"")<0) { showmsg("no time for output path: %s",ofile[i]); for (i=0;i<MAXEXFILE;i++) free(epath[i]); free_strfile(str); return 0; } } /* open output files */ if (!openfile(ofp,paths,path,opt,str->nav)) { for (i=0;i<MAXEXFILE;i++) free(epath[i]); free_strfile(str); return 0; } for (i=0;i<nf&&!abort;i++) { /* open stream file */ if (!open_strfile(str,epath[i])) continue; /* input message */ for (j=0;(type=input_strfile(str))>=-1;j++) { if (j%11==1&&(abort=showstat(sess,te,te,n))) break; /* avioid duplicated if overlapped data */ if (tend.time&&timediff(str->time,tend)<=0.0) continue; /* convert message */ switch (type) { case 1: convobs(ofp,opt,str,n,slips); break; case 2: convnav(ofp,opt,str,n); break; case 3: convsbs(ofp,opt,str,n); break; case 31: convlex(ofp,opt,str,n); break; case -1: n[NOUTFILE]++; break; /* error */ } te=str->time; if (ts.time==0) ts=te; /* set approx position */ if (type==1&&!opt->autopos&&norm(opt->apppos,3)<=0.0) { setapppos(str,opt); } if (opt->te.time&&timediff(te,opt->te)>10.0) break; } /* close stream file */ close_strfile(str); tend=te; /* end time of a file */ } /* set receiver and antenna information to option */ if (format==STRFMT_RTCM2||format==STRFMT_RTCM3) { rtcm2opt(&str->rtcm,opt); } else if (format==STRFMT_RINEX) { rnx2opt(&str->rnx,opt); } /* close output files */ closefile(ofp,opt,str->nav); /* remove empty output files */ for (i=0;i<NOUTFILE;i++) { if (ofp[i]&&n[i]<=0) remove(ofile[i]); } if (ts.time>0) showstat(sess,ts,te,n); for (i=0;i<MAXEXFILE;i++) free(epath[i]); free_strfile(str); if (opt->tstart.time==0) opt->tstart=opt->ts; if (opt->tend .time==0) opt->tend =opt->te; return abort?-1:1; }
/* rinex converter for single-session ----------------------------------------*/ static int convrnx_s(int sess, int format, rnxopt_t *opt, const char *file, char **ofile) { FILE *ofp[NOUTFILE]={NULL}; strfile_t *str; gtime_t ts={0},te={0},tend={0},time={0}; unsigned char slips[MAXSAT][NFREQ+NEXOBS]={{0}}; int i,j,nf,type,n[NOUTFILE+1]={0},abort=0; char path[1024],*paths[NOUTFILE],s[NOUTFILE][1024]; char *epath[MAXEXFILE]={0},*staid=*opt->staid?opt->staid:"0000"; trace(3,"convrnx_s: sess=%d format=%d file=%s ofile=%s %s %s %s %s %s %s\n", sess,format,file,ofile[0],ofile[1],ofile[2],ofile[3],ofile[4], ofile[5],ofile[6]); /* replace keywords in input file */ if (reppath(file,path,opt->ts,staid,"")<0) { showmsg("no time for input file: %s",file); return 0; } /* expand wild-cards in input file */ for (i=0;i<MAXEXFILE;i++) { if (!(epath[i]=(char *)malloc(1024))) { for (i=0;i<MAXEXFILE;i++) free(epath[i]); return 0; } } nf=expath(path,epath,MAXEXFILE); if (format==STRFMT_RTCM2||format==STRFMT_RTCM3) time=opt->trtcm; if (opt->scanobs) { /* scan observation types */ if (!scan_obstype(format,epath[0],opt,&time)) return 0; } else { /* set observation types by format */ set_obstype(format,opt); } if (!(str=gen_strfile(format,opt->rcvopt,time))) { for (i=0;i<MAXEXFILE;i++) free(epath[i]); return 0; } time=opt->ts.time?opt->ts:(time.time?timeadd(time,TSTARTMARGIN):time); /* replace keywords in output file */ for (i=0;i<NOUTFILE;i++) { paths[i]=s[i]; if (reppath(ofile[i],paths[i],time,staid,"")<0) { showmsg("no time for output path: %s",ofile[i]); for (i=0;i<MAXEXFILE;i++) free(epath[i]); free_strfile(str); return 0; } } /* open output files */ if (!openfile(ofp,paths,path,opt,str->nav)) { for (i=0;i<MAXEXFILE;i++) free(epath[i]); free_strfile(str); return 0; } for (i=0;i<nf&&!abort;i++) { /* open stream file */ if (!open_strfile(str,epath[i])) continue; /* input message */ for (j=0;(type=input_strfile(str))>=-1;j++) { if (j%11==1&&(abort=showstat(sess,te,te,n))) break; /* avioid duplicated if overlapped data */ if (tend.time&&timediff(str->time,tend)<=0.0) continue; /* convert message */ switch (type) { case 1: convobs(ofp,opt,str,n,slips); break; case 2: convnav(ofp,opt,str,n); break; case 3: convsbs(ofp,opt,str,n); break; case 31: convlex(ofp,opt,str,n); break; case -1: n[NOUTFILE]++; break; /* error */ } te=str->time; if (ts.time==0) ts=te; /* set approx position */ if (type==1&&!opt->autopos&&norm(opt->apppos,3)<=0.0) { setapppos(str,opt); } if (opt->te.time&&timediff(te,opt->te)>10.0) break; } /* close stream file */ close_strfile(str); tend=te; /* end time of a file */ } /* set receiver and antenna information to option */ if (format==STRFMT_RTCM2||format==STRFMT_RTCM3) { rtcm2opt(&str->rtcm,opt); } else if (format==STRFMT_RINEX) { rnx2opt(&str->rnx,opt); } /* close output files */ closefile(ofp,opt,str->nav); /* remove empty output files */ for (i=0;i<NOUTFILE;i++) { if (ofp[i]&&n[i]<=0) remove(ofile[i]); } if (ts.time>0) showstat(sess,ts,te,n); for (i=0;i<MAXEXFILE;i++) free(epath[i]); free_strfile(str); if (opt->tstart.time==0) opt->tstart=opt->ts; if (opt->tend .time==0) opt->tend =opt->te; return abort?-1:1; }