// 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; }
// clear data --------------------------------------------------------------- void __fastcall TPlot::Clear(void) { AnsiString s; double ep[]={2010,1,1,0,0,0}; int i; trace(3,"Clear\n"); Week=NObs=0; for (i=0;i<2;i++) { freesolbuf(SolData+i); free(SolStat[i].data); SolStat[i].n=0; SolStat[i].data=NULL; } freeobs(&Obs); freenav(&Nav,0xFF); delete [] IndexObs; delete [] Az; delete [] El; IndexObs=NULL; Az=NULL; El=NULL; SolFiles[0]->Clear(); SolFiles[1]->Clear(); ObsFiles->Clear(); NavFiles->Clear(); NObs=0; SolIndex[0]=SolIndex[1]=ObsIndex=0; for (i=0;i<3;i++) { TimeEna[i]=0; } TimeStart=TimeEnd=epoch2time(ep); BtnAnimate->Down=false; if (PlotType>PLOT_NSAT) { UpdateType(PLOT_TRK); } if (!ConnectState) { initsolbuf(SolData ,0,0); initsolbuf(SolData+1,0,0); Caption=Title!=""?Title:s.sprintf("%s ver.%s",PRGNAME,VER_RTKLIB); } else { initsolbuf(SolData ,1,RtBuffSize+1); initsolbuf(SolData+1,1,RtBuffSize+1); } UpdateTime(); UpdatePlot(); }
// read observation data ---------------------------------------------------- void __fastcall TPlot::ReadObs(TStrings *files) { obs_t obs={0}; nav_t nav={0}; sta_t sta={0}; AnsiString s; int i,nobs; trace(3,"ReadObs\n"); if (files->Count<=0) return; ReadWaitStart(); ShowLegend(NULL); if ((nobs=ReadObsRnx(files,&obs,&nav,&sta))<=0) { ReadWaitEnd(); return; } freeobs(&Obs); freenav(&Nav,0xFF); Obs=obs; Nav=nav; Sta=sta; UpdateObs(nobs); if (ObsFiles!=files) { ObsFiles->Assign(files); } NavFiles->Clear(); Caption=s.sprintf("%s%s",files->Strings[0].c_str(),files->Count>1?"...":""); BtnSol1->Down=true; time2gpst(Obs.data[0].time,&Week); SolIndex[0]=SolIndex[1]=ObsIndex=0; if (PlotType<PLOT_OBS||PLOT_DOP<PlotType) { UpdateType(PLOT_OBS); } else { UpdatePlotType(); } FitTime(); UpdateTime(); UpdatePlot(); ReadWaitEnd(); }
// 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(); }
// clear obs data -------------------------------------------------------------- void __fastcall TPlot::ClearObs(void) { sta_t sta0={0}; int i; freeobs(&Obs); freenav(&Nav,0xFF); delete [] IndexObs; IndexObs=NULL; delete [] Az; Az=NULL; delete [] El; El=NULL; for (i=0;i<NFREQ+NEXOBS;i++) { delete [] Mp[i]; Mp[i]=NULL; } ObsFiles->Clear(); NavFiles->Clear(); NObs=0; Sta=sta0; ObsIndex=0; SimObs=0; }