/* read ionex dcb aux data ----------------------------------------------------*/ static void readionexdcb(FILE *fp, double *dcb, double *rms) { int i,sat; char buff[1024],id[32],*label; trace(3,"readionexdcb:\n"); for (i=0;i<MAXSAT;i++) dcb[i]=rms[i]=0.0; while (fgets(buff,sizeof(buff),fp)) { if (strlen(buff)<60) continue; label=buff+60; if (strstr(label,"PRN / BIAS / RMS")==label) { strncpy(id,buff+3,3); id[3]='\0'; if (!(sat=satid2no(id))) { trace(2,"ionex invalid satellite: %s\n",id); continue; } dcb[sat-1]=str2num(buff, 6,10); rms[sat-1]=str2num(buff,16,10); } else if (strstr(label,"END OF AUX DATA")==label) break; } }
/* read stec grid data body --------------------------------------------------*/ static void read_stecb(FILE *fp, nav_t *nav) { gtime_t time; double tow,pos[2],iono,rate,rms; char buff[256],id[64]; int week,sat,slip; trace(3,"read_stecb:\n"); while (fgets(buff,sizeof(buff),fp)) { /* read position */ if (sscanf(buff,"$SPOS %d %lf %lf %lf",&week,&tow,pos,pos+1)>=4) { /* add stec grid */ if (!add_grid(nav,pos)) break; } /* read ionos */ if (sscanf(buff,"$STEC %d %lf %s %d %lf %lf %lf",&week,&tow,id,&slip, &iono,&rate,&rms)>=6) { if (nav->nn<=0||!(sat=satid2no(id))) continue; time=gpst2time(week,tow); /* add grid data */ if (!add_data(nav->stec+nav->nn-1,time,sat,slip,iono,rate,rms)) { break; } } } }
/* read dcb parameters file --------------------------------------------------*/ static int readdcbf(const char *file, nav_t *nav) { FILE *fp; double cbias; int sat,type=0; char buff[256]; trace(3,"readdcbf: file=%s\n",file); if (!(fp=fopen(file,"r"))) { trace(2,"dcb parameters file open error: %s\n",file); return 0; } while (fgets(buff,sizeof(buff),fp)) { if (strstr(buff,"DIFFERENTIAL (P1-P2) CODE BIASES")) type=1; else if (strstr(buff,"DIFFERENTIAL (P1-C1) CODE BIASES")) type=2; else if (strstr(buff,"DIFFERENTIAL (P2-C2) CODE BIASES")) type=3; if (!type) continue; if (!(sat=satid2no(buff))||(cbias=str2num(buff,26,9))==0.0) continue; nav->cbias[sat-1][type-1]=cbias*1E-9*CLIGHT; /* ns -> m */ } fclose(fp); return 1; }
/* decode solution status ----------------------------------------------------*/ static int decode_solstat(char *buff, solstat_t *stat) { static const solstat_t stat0={{0}}; double tow,az,el,resp,resc; int n,week,sat,frq,code=0,vsat,snr,fix,slip,lock,outc,slipc,rejc; char id[32]="",*p; int prmc; trace(4,"decode_solstat: buff=%s\n",buff); if (strstr(buff,"$SAT")!=buff) return 0; for (p=buff,prmc=1;*p;p++) { if (*p==',') { *p=' '; ++prmc; } } if(18==prmc) { n=sscanf(buff,"$SAT%d%lf%s%d%d%lf%lf%lf%lf%d%d%d%d%d%d%d%d", &week,&tow,id,&frq,&code,&az,&el,&resp,&resc,&vsat,&snr,&fix,&slip, &lock,&outc,&slipc,&rejc); } else { n=sscanf(buff,"$SAT%d%lf%s%d%lf%lf%lf%lf%d%d%d%d%d%d%d%d", &week,&tow,id,&frq,&az,&el,&resp,&resc,&vsat,&snr,&fix,&slip, &lock,&outc,&slipc,&rejc); } if (n<15) { trace(2,"invalid format of solution status: %s\n",buff); return 0; } if ((sat=satid2no(id))<=0) { trace(2,"invalid satellite in solution status: %s\n",id); return 0; } *stat=stat0; stat->time=gpst2time(week,tow); stat->sat =(unsigned char)sat; stat->frq =(unsigned char)frq; stat->code =(unsigned char)code; stat->az =(float)(az*D2R); stat->el =(float)(el*D2R); stat->resp =(float)resp; stat->resc =(float)resc; stat->flag =(unsigned char)((vsat<<5)+(slip<<3)+fix); stat->snr =(unsigned char)(snr*4.0+0.5); stat->lock =(unsigned short)lock; stat->outc =(unsigned short)outc; stat->slipc=(unsigned short)slipc; stat->rejc =(unsigned short)rejc; return 1; }
/* system options buffer to options ------------------------------------------*/ static void buff2sysopts(void) { double pos[3],*rr; char buff[1024],*p,*id; int i,j,sat,*ps; prcopt_.elmin =elmask_ *D2R; prcopt_.elmaskar =elmaskar_ *D2R; prcopt_.elmaskhold=elmaskhold_*D2R; for (i=0;i<2;i++) { ps=i==0?&prcopt_.rovpos:&prcopt_.refpos; rr=i==0?prcopt_.ru:prcopt_.rb; if (antpostype_[i]==0) { /* lat/lon/hgt */ *ps=0; pos[0]=antpos_[i][0]*D2R; pos[1]=antpos_[i][1]*D2R; pos[2]=antpos_[i][2]; pos2ecef(pos,rr); } else if (antpostype_[i]==1) { /* xyz-ecef */ *ps=0; rr[0]=antpos_[i][0]; rr[1]=antpos_[i][1]; rr[2]=antpos_[i][2]; } else *ps=antpostype_[i]-1; } /* excluded satellites */ for (i=0;i<MAXSAT;i++) prcopt_.exsats[i]=0; if (exsats_[0]!='\0') { strcpy(buff,exsats_); for (p=strtok(buff," ");p;p=strtok(NULL," ")) { if (*p=='+') id=p+1; else id=p; if (!(sat=satid2no(id))) continue; prcopt_.exsats[sat-1]=*p=='+'?2:1; } } /* snrmask */ for (i=0;i<NFREQ;i++) { for (j=0;j<9;j++) prcopt_.snrmask.mask[i][j]=0.0; strcpy(buff,snrmask_[i]); for (p=strtok(buff,","),j=0;p&&j<9;p=strtok(NULL,",")) { prcopt_.snrmask.mask[i][j++]=atof(p); } } }
//--------------------------------------------------------------------------- void __fastcall TOptDialog::SaveOpt(AnsiString file) { AnsiString ProxyAddrE_Text=ProxyAddrE->Text; AnsiString ExSatsE_Text=ExSatsE->Text; AnsiString FieldSep_Text=FieldSep->Text; AnsiString RovAnt_Text=RovAnt->Text,RefAnt_Text=RefAnt->Text; AnsiString SatPcvFile_Text=SatPcvFile->Text; AnsiString AntPcvFile_Text=AntPcvFile->Text; AnsiString StaPosFile_Text=StaPosFile->Text; AnsiString GeoidDataFile_Text=GeoidDataFile->Text; AnsiString DCBFile_Text=DCBFile->Text; AnsiString LocalDir_Text=LocalDir->Text; int itype[]={STR_SERIAL,STR_TCPCLI,STR_TCPSVR,STR_NTRIPCLI,STR_FILE,STR_FTP,STR_HTTP}; int otype[]={STR_SERIAL,STR_TCPCLI,STR_TCPSVR,STR_NTRIPSVR,STR_FILE}; TEdit *editu[]={RovPos1,RovPos2,RovPos3}; TEdit *editr[]={RefPos1,RefPos2,RefPos3}; char buff[1024],*p,id[32],comment[256],s[64]; int sat,ex; prcopt_t prcopt=prcopt_default; solopt_t solopt=solopt_default; filopt_t filopt={""}; for (int i=0;i<8;i++) { strtype[i]=i<3?itype[MainForm->Stream[i]]:otype[MainForm->Stream[i]]; strfmt[i]=MainForm->Format[i]; if (!MainForm->StreamC[i]) { strtype[i]=STR_NONE; strcpy(strpath[i],""); } else if (strtype[i]==STR_SERIAL) { strcpy(strpath[i],MainForm->Paths[i][0].c_str()); } else if (strtype[i]==STR_FILE) { strcpy(strpath[i],MainForm->Paths[i][2].c_str()); } else if (strtype[i]<=STR_NTRIPCLI) { strcpy(strpath[i],MainForm->Paths[i][1].c_str()); } else if (strtype[i]<=STR_HTTP) { strcpy(strpath[i],MainForm->Paths[i][3].c_str()); } } nmeareq =MainForm->NmeaReq; nmeapos[0]=MainForm->NmeaPos[0]; nmeapos[1]=MainForm->NmeaPos[1]; svrcycle =SvrCycleE ->Text.ToInt(); timeout =TimeoutTimeE->Text.ToInt(); reconnect =ReconTimeE ->Text.ToInt(); nmeacycle =NmeaCycleE ->Text.ToInt(); buffsize =SvrBuffSizeE->Text.ToInt(); navmsgsel =NavSelectS ->ItemIndex; strcpy(proxyaddr,ProxyAddrE_Text.c_str()); fswapmargin =FileSwapMarginE->Text.ToInt(); prcopt.sbassatsel=SbasSatE->Text.ToInt(); prcopt.mode =PosMode ->ItemIndex; prcopt.nf =Freq ->ItemIndex+1; prcopt.soltype =Solution ->ItemIndex; prcopt.elmin =str2dbl(ElMask ->Text)*D2R; prcopt.dynamics =DynamicModel->ItemIndex; prcopt.tidecorr =TideCorr ->ItemIndex; prcopt.ionoopt =IonoOpt ->ItemIndex; prcopt.tropopt =TropOpt ->ItemIndex; prcopt.sateph =SatEphem ->ItemIndex; if (ExSatsE->Text!="") { strcpy(buff,ExSatsE_Text.c_str()); for (p=strtok(buff," ");p;p=strtok(NULL," ")) { if (*p=='+') {ex=2; p++;} else ex=1; if (!(sat=satid2no(p))) continue; prcopt.exsats[sat-1]=ex; } } prcopt.navsys = (NavSys1->Checked?SYS_GPS:0)| (NavSys2->Checked?SYS_GLO:0)| (NavSys3->Checked?SYS_GAL:0)| (NavSys4->Checked?SYS_QZS:0)| (NavSys5->Checked?SYS_SBS:0)| (NavSys6->Checked?SYS_CMP:0); prcopt.posopt[0]=PosOpt1->Checked; prcopt.posopt[1]=PosOpt2->Checked; prcopt.posopt[2]=PosOpt3->Checked; prcopt.posopt[3]=PosOpt4->Checked; prcopt.posopt[4]=PosOpt5->Checked; prcopt.modear =AmbRes ->ItemIndex; prcopt.glomodear=GloAmbRes ->ItemIndex; prcopt.thresar[0]=str2dbl(ValidThresAR->Text); prcopt.maxout =str2dbl(OutCntResetAmb->Text); prcopt.minfix =str2dbl(FixCntHoldAmb->Text); prcopt.minlock =str2dbl(LockCntFixAmb->Text); prcopt.elmaskar =str2dbl(ElMaskAR ->Text)*D2R; prcopt.elmaskhold=str2dbl(ElMaskHold->Text)*D2R; prcopt.maxtdiff =str2dbl(MaxAgeDiff ->Text); prcopt.maxgdop =str2dbl(RejectGdop ->Text); prcopt.maxinno =str2dbl(RejectThres->Text); prcopt.thresslip=str2dbl(SlipThres ->Text); prcopt.niter =str2dbl(NumIter ->Text); prcopt.syncsol =SyncSol->ItemIndex; if (prcopt.mode==PMODE_MOVEB&&BaselineConst->Checked) { prcopt.baseline[0]=str2dbl(BaselineLen->Text); prcopt.baseline[1]=str2dbl(BaselineSig->Text); } solopt.posf =SolFormat ->ItemIndex; solopt.timef =TimeFormat ->ItemIndex==0?0:1; solopt.times =TimeFormat ->ItemIndex==0?0:TimeFormat->ItemIndex-1; solopt.timeu =str2dbl(TimeDecimal ->Text); solopt.degf =LatLonFormat->ItemIndex; strcpy(solopt.sep,FieldSep_Text.c_str()); solopt.outhead =OutputHead ->ItemIndex; solopt.outopt =OutputOpt ->ItemIndex; solopt.datum =OutputDatum ->ItemIndex; solopt.height =OutputHeight->ItemIndex; solopt.geoid =OutputGeoid ->ItemIndex; solopt.nmeaintv[0]=str2dbl(NmeaIntv1->Text); solopt.nmeaintv[1]=str2dbl(NmeaIntv2->Text); solopt.trace =DebugTrace ->ItemIndex; solopt.sstat =DebugStatus ->ItemIndex; prcopt.eratio[0]=str2dbl(MeasErrR1->Text); prcopt.eratio[1]=str2dbl(MeasErrR2->Text); prcopt.err[1] =str2dbl(MeasErr2->Text); prcopt.err[2] =str2dbl(MeasErr3->Text); prcopt.err[3] =str2dbl(MeasErr4->Text); prcopt.err[4] =str2dbl(MeasErr5->Text); prcopt.sclkstab =str2dbl(SatClkStab->Text); prcopt.prn[0] =str2dbl(PrNoise1->Text); prcopt.prn[1] =str2dbl(PrNoise2->Text); prcopt.prn[2] =str2dbl(PrNoise3->Text); prcopt.prn[3] =str2dbl(PrNoise4->Text); prcopt.prn[4] =str2dbl(PrNoise5->Text); if (RovAntPcv->Checked) strcpy(prcopt.anttype[0],RovAnt_Text.c_str()); if (RefAntPcv->Checked) strcpy(prcopt.anttype[1],RefAnt_Text.c_str()); prcopt.antdel[0][0]=str2dbl(RovAntE->Text); prcopt.antdel[0][1]=str2dbl(RovAntN->Text); prcopt.antdel[0][2]=str2dbl(RovAntU->Text); prcopt.antdel[1][0]=str2dbl(RefAntE->Text); prcopt.antdel[1][1]=str2dbl(RefAntN->Text); prcopt.antdel[1][2]=str2dbl(RefAntU->Text); prcopt.rovpos=RovPosTypeP->ItemIndex<3?0:4; prcopt.refpos=RefPosTypeP->ItemIndex<3?0:4; if (prcopt.rovpos==0) GetPos(RovPosTypeP->ItemIndex,editu,prcopt.ru); if (prcopt.refpos==0) GetPos(RefPosTypeP->ItemIndex,editr,prcopt.rb); strcpy(filopt.satantp,SatPcvFile_Text.c_str()); strcpy(filopt.rcvantp,AntPcvFile_Text.c_str()); strcpy(filopt.stapos, StaPosFile_Text.c_str()); strcpy(filopt.geoid, GeoidDataFile_Text.c_str()); strcpy(filopt.dcb, DCBFile_Text.c_str()); strcpy(filopt.tempdir,LocalDir_Text.c_str()); time2str(utc2gpst(timeget()),s,0); sprintf(comment,"RTKNAVI options (%s, v.%s)",s,VER_RTKLIB); setsysopts(&prcopt,&solopt,&filopt); if (!saveopts(file.c_str(),"w",comment,sysopts)|| !saveopts(file.c_str(),"a","",rcvopts)) return; }
// convert file ------------------------------------------------------------- void __fastcall TMainWindow::ConvertFile(void) { rnxopt_t rnxopt={0}; AnsiString InFile_Text=InFile->Text; AnsiString OutFile1_Text=OutFile1->Text,OutFile2_Text=OutFile2->Text; AnsiString OutFile3_Text=OutFile3->Text,OutFile4_Text=OutFile4->Text; AnsiString OutFile5_Text=OutFile5->Text,OutFile6_Text=OutFile6->Text; AnsiString OutFile7_Text=OutFile7->Text; int i,format,sat; char file[1024]="",*ofile[7],ofile_[7][1024]={""},msg[256],*p; char buff[256],tstr[32]; double RNXVER[]={2.10,2.11,2.12,3.00,3.01,3.02}; FILE *fp; // abort conversion if (BtnConvert->Caption=="Abort") { abortf=1; return; } for (i=0;i<7;i++) ofile[i]=ofile_[i]; // recognize input file format strcpy(file,InFile_Text.c_str()); if (!(p=strrchr(file,'.'))) p=file; if (Format->ItemIndex==0) { // auto if (!strcmp(p,".rtcm2")) format=STRFMT_RTCM2; else if (!strcmp(p,".rtcm3")) format=STRFMT_RTCM3; else if (!strcmp(p,".gps" )) format=STRFMT_OEM4; else if (!strcmp(p,".ubx" )) format=STRFMT_UBX; else if (!strcmp(p,".log" )) format=STRFMT_SS2; else if (!strcmp(p,".bin" )) format=STRFMT_CRES; else if (!strcmp(p,".jps" )) format=STRFMT_JAVAD; else if (!strcmp(p,".bnx" )) format=STRFMT_BINEX; else if (!strcmp(p,".binex")) format=STRFMT_BINEX; else if (!strcmp(p,".rt17" )) format=STRFMT_RT17; else if (!strcmp(p,".obs" )) format=STRFMT_RINEX; else if (!strcmp(p,".OBS" )) format=STRFMT_RINEX; else if (!strcmp(p,".nav" )) format=STRFMT_RINEX; else if (!strcmp(p,".NAV" )) format=STRFMT_RINEX; else if (!strcmp(p+2,"nav" )) format=STRFMT_RINEX; else if (!strcmp(p+2,"NAV" )) format=STRFMT_RINEX; else if (!strcmp(p+3,"o" )) format=STRFMT_RINEX; else if (!strcmp(p+3,"O" )) format=STRFMT_RINEX; else if (!strcmp(p+3,"n" )) format=STRFMT_RINEX; else if (!strcmp(p+3,"N" )) format=STRFMT_RINEX; else if (!strcmp(p+3,"p" )) format=STRFMT_RINEX; else if (!strcmp(p+3,"P" )) format=STRFMT_RINEX; else if (!strcmp(p+3,"g" )) format=STRFMT_RINEX; else if (!strcmp(p+3,"G" )) format=STRFMT_RINEX; else if (!strcmp(p+3,"h" )) format=STRFMT_RINEX; else if (!strcmp(p+3,"H" )) format=STRFMT_RINEX; else if (!strcmp(p+3,"q" )) format=STRFMT_RINEX; else if (!strcmp(p+3,"Q" )) format=STRFMT_RINEX; else if (!strcmp(p+3,"l" )) format=STRFMT_RINEX; else if (!strcmp(p+3,"L" )) format=STRFMT_RINEX; else { showmsg("file format can not be recognized"); return; } } else { for (i=0;formatstrs[i];i++) { if (Format->Text==formatstrs[i]) break; } if (formatstrs[i]) format=i; else return; } rnxopt.rnxver=RNXVER[RnxVer]; if (format==STRFMT_RTCM2||format==STRFMT_RTCM3||format==STRFMT_RT17) { // input start date/time for rtcm 2 ro rtcm 3 if (StartDialog->ShowModal()!=mrOk) return; rnxopt.trtcm=StartDialog->Time; } if (OutFile1->Enabled&&OutFileEna1->Checked) strcpy(ofile[0],OutFile1_Text.c_str()); if (OutFile2->Enabled&&OutFileEna2->Checked) strcpy(ofile[1],OutFile2_Text.c_str()); if (OutFile3->Enabled&&OutFileEna3->Checked) strcpy(ofile[2],OutFile3_Text.c_str()); if (OutFile4->Enabled&&OutFileEna4->Checked) strcpy(ofile[3],OutFile4_Text.c_str()); if (OutFile5->Enabled&&OutFileEna5->Checked) strcpy(ofile[4],OutFile5_Text.c_str()); if (OutFile6->Enabled&&OutFileEna6->Checked) strcpy(ofile[5],OutFile6_Text.c_str()); if (OutFile7->Enabled&&OutFileEna7->Checked) strcpy(ofile[6],OutFile7_Text.c_str()); // check overwrite output file for (i=0;i<6;i++) { if (!*ofile[i]||!(fp=fopen(ofile[i],"r"))) continue; fclose(fp); ConfDialog->Label2->Caption=ofile[i]; if (ConfDialog->ShowModal()!=mrOk) return; } GetTime(&rnxopt.ts,&rnxopt.te,&rnxopt.tint,&rnxopt.tunit); strncpy(rnxopt.staid,RnxCode.c_str(),31); sprintf(rnxopt.prog,"%s %s",PRGNAME,VER_RTKLIB); strncpy(rnxopt.runby,RunBy.c_str(),31); strncpy(rnxopt.marker,Marker.c_str(),63); strncpy(rnxopt.markerno,MarkerNo.c_str(),31); strncpy(rnxopt.markertype,MarkerType.c_str(),31); for (i=0;i<2;i++) strncpy(rnxopt.name[i],Name[i].c_str(),31); for (i=0;i<3;i++) strncpy(rnxopt.rec [i],Rec [i].c_str(),31); for (i=0;i<3;i++) strncpy(rnxopt.ant [i],Ant [i].c_str(),31); if (AutoPos) { for (i=0;i<3;i++) rnxopt.apppos[i]=AppPos[i]; } for (i=0;i<3;i++) rnxopt.antdel[i]=AntDel[i]; strncpy(rnxopt.rcvopt,RcvOption.c_str(),255); rnxopt.navsys=NavSys; rnxopt.obstype=ObsType; rnxopt.freqtype=FreqType; p=rnxopt.comment[0]; sprintf(p,"log: %-53.53s",file); p=rnxopt.comment[1]; p+=sprintf(p,"format: %s",formatstrs[format]); if (*rnxopt.rcvopt) sprintf(p,", option: %s",rnxopt.rcvopt); for (i=0;i<2;i++) strncpy(rnxopt.comment[i+2],Comment[i].c_str(),63); for (i=0;i<6;i++) strcpy(rnxopt.mask[i],CodeMask[i].c_str()); rnxopt.autopos=AutoPos; rnxopt.scanobs=ScanObs; rnxopt.outiono=OutIono; rnxopt.outtime=OutTime; rnxopt.outleaps=OutLeaps; strcpy(buff,ExSats.c_str()); for (p=strtok(buff," ");p;p=strtok(NULL," ")) { if (!(sat=satid2no(p))) continue; rnxopt.exsats[sat-1]=1; } abortf=0; BtnConvert ->Caption="Abort"; Panel1 ->Enabled=false; Panel2 ->Enabled=false; BtnPlot ->Enabled=false; BtnPost ->Enabled=false; BtnOptions ->Enabled=false; BtnExit ->Enabled=false; Format ->Enabled=false; BtnKey ->Enabled=false; LabelInFile ->Enabled=false; LabelOutDir ->Enabled=false; LabelOutFile->Enabled=false; LabelFormat ->Enabled=false; Message ->Caption=""; if (TraceLevel>0) { traceopen(TRACEFILE); tracelevel(TraceLevel); } // convert to rinex (void)convrnx(format,&rnxopt,file,ofile); if (TraceLevel>0) { traceclose(); } BtnConvert ->Caption="&Convert"; Panel1 ->Enabled=true; Panel2 ->Enabled=true; BtnPlot ->Enabled=true; BtnPost ->Enabled=true; BtnOptions ->Enabled=true; BtnExit ->Enabled=true; Format ->Enabled=true; BtnKey ->Enabled=true; LabelInFile ->Enabled=true; LabelOutDir ->Enabled=true; LabelOutFile->Enabled=true; LabelFormat ->Enabled=true; #if 0 // set time-start/end if time not specified if (!TimeStartF->Checked&&rnxopt.tstart.time!=0) { time2str(rnxopt.tstart,tstr,0); tstr[10]='\0'; TimeY1->Text=tstr; TimeH1->Text=tstr+11; } if (!TimeEndF->Checked&&rnxopt.tend.time!=0) { time2str(rnxopt.tend,tstr,0); tstr[10]='\0'; TimeY2->Text=tstr; TimeH2->Text=tstr+11; } #endif RnxTime=rnxopt.tstart; AddHist(InFile); }
/* analyize command line options ---------------------------------------------*/ static int cmdopts(int argc, char **argv, rnxopt_t *opt, char **ifile, char **ofile, char **dir) { double eps[]={1980,1,1,0,0,0},epe[]={2037,12,31,0,0,0}; double epr[]={2010,1,1,0,0,0}; int i,j,sat,nf=2,nc=2,format=-1; char *p,*sys,*fmt=""; opt->rnxver =2.11; opt->obstype=OBSTYPE_PR|OBSTYPE_CP; opt->navsys =SYS_GPS|SYS_GLO|SYS_GAL|SYS_QZS|SYS_SBS|SYS_CMP; for (i=0;i<6;i++) for (j=0;j<64;j++) opt->mask[i][j]=1; 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); opt->ts=epoch2time(eps); } 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); opt->te=epoch2time(epe); } else if (!strcmp(argv[i],"-tr")&&i+2<argc) { sscanf(argv[++i],"%lf/%lf/%lf",epr,epr+1,epr+2); sscanf(argv[++i],"%lf:%lf:%lf",epr+3,epr+4,epr+5); opt->trtcm=epoch2time(epr); } else if (!strcmp(argv[i],"-ti")&&i+1<argc) { opt->tint=atof(argv[++i]); } else if (!strcmp(argv[i],"-r" )&&i+1<argc) { fmt=argv[++i]; } else if (!strcmp(argv[i],"-ro")&&i+1<argc) { strcpy(opt->rcvopt,argv[++i]); } else if (!strcmp(argv[i],"-f" )&&i+1<argc) { nf=atoi(argv[++i]); } else if (!strcmp(argv[i],"-hc")&&i+1<argc) { if (nc<MAXCOMMENT) strcpy(opt->comment[nc++],argv[++i]); } else if (!strcmp(argv[i],"-hm")&&i+1<argc) { strcpy(opt->marker,argv[++i]); } else if (!strcmp(argv[i],"-hn")&&i+1<argc) { strcpy(opt->markerno,argv[++i]); } else if (!strcmp(argv[i],"-ht")&&i+1<argc) { strcpy(opt->markertype,argv[++i]); } else if (!strcmp(argv[i],"-ho")&&i+1<argc) { for (j=0,p=strtok(argv[++i],"/");j<2&&p;j++,p=strtok(NULL,"/")) { strcpy(opt->name[j],p); } } else if (!strcmp(argv[i],"-hr")&&i+1<argc) { for (j=0,p=strtok(argv[++i],"/");j<3&&p;j++,p=strtok(NULL,"/")) { strcpy(opt->rec[j],p); } } else if (!strcmp(argv[i],"-ha")&&i+1<argc) { for (j=0,p=strtok(argv[++i],"/");j<3&&p;j++,p=strtok(NULL,"/")) { strcpy(opt->ant[j],p); } } else if (!strcmp(argv[i],"-hp")&&i+1<argc) { for (j=0,p=strtok(argv[++i],"/");j<3&&p;j++,p=strtok(NULL,"/")) { opt->apppos[j]=atof(p); } } else if (!strcmp(argv[i],"-hd")&&i+1<argc) { for (j=0,p=strtok(argv[++i],"/");j<3&&p;j++,p=strtok(NULL,"/")) { opt->antdel[j]=atof(p); } } else if (!strcmp(argv[i],"-v" )&&i+1<argc) { opt->rnxver=atof(argv[++i]); } else if (!strcmp(argv[i],"-od")) { opt->obstype|=OBSTYPE_DOP; } else if (!strcmp(argv[i],"-os")) { opt->obstype|=OBSTYPE_SNR; } else if (!strcmp(argv[i],"-oi")) { opt->outiono=1; } else if (!strcmp(argv[i],"-ot")) { opt->outtime=1; } else if (!strcmp(argv[i],"-ol")) { opt->outleaps=1; } else if (!strcmp(argv[i],"-scan")) { opt->scanobs=1; } else if (!strcmp(argv[i],"-x" )&&i+1<argc) { if ((sat=satid2no(argv[++i]))) opt->exsats[sat-1]=1; } else if (!strcmp(argv[i],"-y" )&&i+1<argc) { sys=argv[++i]; if (!strcmp(sys,"G")) opt->navsys&=~SYS_GPS; else if (!strcmp(sys,"R")) opt->navsys&=~SYS_GLO; else if (!strcmp(sys,"E")) opt->navsys&=~SYS_GAL; else if (!strcmp(sys,"J")) opt->navsys&=~SYS_QZS; else if (!strcmp(sys,"S")) opt->navsys&=~SYS_SBS; else if (!strcmp(sys,"C")) opt->navsys&=~SYS_CMP; } else if (!strcmp(argv[i],"-d" )&&i+1<argc) { *dir=argv[++i]; } else if (!strcmp(argv[i],"-c" )&&i+1<argc) { strcpy(opt->staid,argv[++i]); } else if (!strcmp(argv[i],"-o" )&&i+1<argc) ofile[0]=argv[++i]; else if (!strcmp(argv[i],"-n" )&&i+1<argc) ofile[1]=argv[++i]; else if (!strcmp(argv[i],"-g" )&&i+1<argc) ofile[2]=argv[++i]; else if (!strcmp(argv[i],"-h" )&&i+1<argc) ofile[3]=argv[++i]; else if (!strcmp(argv[i],"-q" )&&i+1<argc) ofile[4]=argv[++i]; else if (!strcmp(argv[i],"-l" )&&i+1<argc) ofile[5]=argv[++i]; else if (!strcmp(argv[i],"-s" )&&i+1<argc) ofile[6]=argv[++i]; else if (!strncmp(argv[i],"-",1)) printhelp(); else *ifile=argv[i]; } if (nf>=1) opt->freqtype|=FREQTYPE_L1; if (nf>=2) opt->freqtype|=FREQTYPE_L2; if (nf>=3) opt->freqtype|=FREQTYPE_L5; if (nf>=4) opt->freqtype|=FREQTYPE_L6; if (nf>=5) opt->freqtype|=FREQTYPE_L7; if (nf>=6) opt->freqtype|=FREQTYPE_L8; if (*fmt) { if (!strcmp(fmt,"rtcm2")) format=STRFMT_RTCM2; else if (!strcmp(fmt,"rtcm3")) format=STRFMT_RTCM3; else if (!strcmp(fmt,"nov" )) format=STRFMT_OEM4; else if (!strcmp(fmt,"oem3" )) format=STRFMT_OEM3; else if (!strcmp(fmt,"ubx" )) format=STRFMT_UBX; else if (!strcmp(fmt,"ss2" )) format=STRFMT_SS2; else if (!strcmp(fmt,"hemis")) format=STRFMT_CRES; else if (!strcmp(fmt,"stq" )) format=STRFMT_STQ; else if (!strcmp(fmt,"javad")) format=STRFMT_JAVAD; else if (!strcmp(fmt,"nvs" )) format=STRFMT_NVS; else if (!strcmp(fmt,"binex")) format=STRFMT_BINEX; else if (!strcmp(fmt,"rinex")) format=STRFMT_RINEX; } else if ((p=strrchr(*ifile,'.'))) { if (!strcmp(p,".rtcm2")) format=STRFMT_RTCM2; else if (!strcmp(p,".rtcm3")) format=STRFMT_RTCM3; else if (!strcmp(p,".gps" )) format=STRFMT_OEM4; else if (!strcmp(p,".ubx" )) format=STRFMT_UBX; else if (!strcmp(p,".log" )) format=STRFMT_SS2; else if (!strcmp(p,".bin" )) format=STRFMT_CRES; else if (!strcmp(p,".stq" )) format=STRFMT_STQ; else if (!strcmp(p,".jps" )) format=STRFMT_JAVAD; else if (!strcmp(p,".bnx" )) format=STRFMT_BINEX; else if (!strcmp(p,".binex")) format=STRFMT_BINEX; else if (!strcmp(p,".obs" )) format=STRFMT_RINEX; else if (!strcmp(p+3,"o" )) format=STRFMT_RINEX; else if (!strcmp(p+3,"O" )) format=STRFMT_RINEX; } return format; }