/* output solution status for PPP --------------------------------------------*/ extern void pppoutsolstat(rtk_t *rtk, int level, FILE *fp) { ssat_t *ssat; double tow,pos[3],vel[3],acc[3]; int i,j,week,nfreq=1; char id[32]; if (level<=0||!fp) return; trace(3,"pppoutsolstat:\n"); tow=time2gpst(rtk->sol.time,&week); /* receiver position */ fprintf(fp,"$POS,%d,%.3f,%d,%.4f,%.4f,%.4f,%.4f,%.4f,%.4f\n",week,tow, rtk->sol.stat,rtk->x[0],rtk->x[1],rtk->x[2],0.0,0.0,0.0); /* receiver velocity and acceleration */ if (rtk->opt.dynamics) { ecef2pos(rtk->sol.rr,pos); ecef2enu(pos,rtk->x+3,vel); ecef2enu(pos,rtk->x+6,acc); fprintf(fp,"$VELACC,%d,%.3f,%d,%.4f,%.4f,%.4f,%.5f,%.5f,%.5f,%.4f,%.4f,%.4f,%.5f,%.5f,%.5f\n", week,tow,rtk->sol.stat,vel[0],vel[1],vel[2],acc[0],acc[1],acc[2], 0.0,0.0,0.0,0.0,0.0,0.0); } /* receiver clocks */ i=IC(0,&rtk->opt); fprintf(fp,"$CLK,%d,%.3f,%d,%d,%.3f,%.3f,%.3f,%.3f\n", week,tow,rtk->sol.stat,1,rtk->x[i]*1E9/CLIGHT,rtk->x[i+1]*1E9/CLIGHT, 0.0,0.0); /* tropospheric parameters */ if (rtk->opt.tropopt==TROPOPT_EST||rtk->opt.tropopt==TROPOPT_ESTG) { i=IT(&rtk->opt); fprintf(fp,"$TROP,%d,%.3f,%d,%d,%.4f,%.4f\n",week,tow,rtk->sol.stat, 1,rtk->x[i],0.0); } if (rtk->opt.tropopt==TROPOPT_ESTG) { i=IT(&rtk->opt); fprintf(fp,"$TRPG,%d,%.3f,%d,%d,%.5f,%.5f,%.5f,%.5f\n",week,tow, rtk->sol.stat,1,rtk->x[i+1],rtk->x[i+2],0.0,0.0); } if (rtk->sol.stat==SOLQ_NONE||level<=1) return; /* residuals and status */ for (i=0;i<MAXSAT;i++) { ssat=rtk->ssat+i; if (!ssat->vs) continue; satno2id(i+1,id); for (j=0;j<nfreq;j++) { fprintf(fp,"$SAT,%d,%.3f,%s,%d,%.1f,%.1f,%.4f,%.4f,%d,%.0f,%d,%d,%d,%d,%d,%d\n", week,tow,id,j+1,ssat->azel[0]*R2D,ssat->azel[1]*R2D, ssat->resp[j],ssat->resc[j],ssat->vsat[j],ssat->snr[j]*0.25, ssat->fix[j],ssat->slip[j]&3,ssat->lock[j],ssat->outc[j], ssat->slipc[j],ssat->rejc[j]); } } }
// save snr and mp ------------------------------------------------------------- void __fastcall TPlot::SaveSnrMp(AnsiString file) { FILE *fp; AnsiString ObsTypeText=ObsType2->Text; gtime_t time; double tow; char sat[32],mp[32],tstr[64],*tlabel,*code=ObsTypeText.c_str()+1; int i,j,k,week; trace(3,"SaveSnrMp: file=%s\n",file.c_str()); if (!(fp=fopen(file.c_str(),"w"))) return; tlabel=TimeLabel<=1?"TIME (GPST)":(TimeLabel<=2?"TIME (UTC)":"TIME (JST)"); sprintf(mp,"%s MP(m)",ObsTypeText.c_str()); fprintf(fp,"%% %-*s %6s %8s %8s %9s %10s\n",TimeLabel==0?13:19,tlabel,"SAT", "AZ(deg)","EL(deg)","SNR(dBHz)",mp); for (i=0;i<MAXSAT;i++) { if (SatMask[i]||!SatSel[i]) continue; satno2id(i+1,sat); for (j=0;j<Obs.n;j++) { if (Obs.data[j].sat!=i+1) continue; for (k=0;k<NFREQ+NEXOBS;k++) { if (strstr(code2obs(Obs.data[j].code[k],NULL),code)) break; } if (k>=NFREQ+NEXOBS) continue; time=Obs.data[j].time; if (TimeLabel==0) { tow=time2gpst(time,&week); sprintf(tstr,"%4d %9.1f ",week,tow); } else if (TimeLabel==1) { time2str(time,tstr,1); } else if (TimeLabel==2) { time2str(gpst2utc(time),tstr,1); } else { time2str(timeadd(gpst2utc(time),9*3600.0),tstr,1); } fprintf(fp,"%s %6s %8.1f %8.1f %9.2f %10.4f\n",tstr,sat,Az[j]*R2D, El[j]*R2D,Obs.data[j].SNR[k]*0.25,!Mp[k]?0.0:Mp[k][j]); } } fclose(fp); }
/* tle_pos() accuracy --------------------------------------------------------*/ static void utest3(void) { const char *file1="../data/tle/brdc3050.12*"; const char *file2="../data/tle/TLE_GNSS_20121101.txt"; const char *file3="../data/tle/igs17127.erp"; const double ep[6]={2012,10,31,0,0,0}; nav_t nav={0}; erp_t erp={0}; tle_t tle={0}; gtime_t time; char sat[32]; double rs1[6],rs2[6],ds[6],dts[2],var; int i,j,k,stat,svh; readrnx(file1,0,"",NULL,&nav,NULL); assert(nav.n>0); stat=readerp(file3,&erp); assert(stat); stat=tle_read(file2,&tle); assert(stat); for (i=0;i<MAXSAT;i++) { satno2id(i+1,sat); fprintf(OUT,"SAT=%s\n",sat); for (j=0;j<96;j++) { time=timeadd(epoch2time(ep),900.0*j); if (!satpos(time,time,i+1,EPHOPT_BRDC,&nav,rs1,dts,&var,&svh)) continue; if (satsys(i+1,NULL)==SYS_QZS) svh&=0xFE; if (svh) continue; stat=tle_pos(time,sat,"","",&tle,&erp,rs2); assert(stat); for (k=0;k<3;k++) ds[k]=rs2[k]-rs1[k]; fprintf(OUT,"%6.0f %11.3f %11.3f %11.3f %11.3f\n",900.0*j, ds[0]/1e3,ds[1]/1e3,ds[2]/1e3,norm(ds,3)/1e3); assert(norm(ds,3)/1e3<300.0); } fprintf(OUT,"\n"); } fprintf(OUT,"%s utest3 : OK\n",__FILE__); }
/* output ionosphere parameters ----------------------------------------------*/ static void out_iono(gtime_t time, const ekf_t *ekf, const sstat_t *sstat, FILE *fp) { double tow; char id[64]; int sat,week; tow=time2gpst(time,&week); for (sat=1;sat<=MAXSAT;sat++) { if (sstat[sat-1].time.time==0|| timediff(time,sstat[sat-1].time)>MAXGAP_IONO) continue; satno2id(sat,id); fprintf(fp,"%s %4d %6.0f %-3s %d %8.4f %9.6f %7.4f %6.1f %5.1f %7.3f %11.3f\n", STEC_RID,week,tow,id,sstat[sat-1].slip, ekf->x[II(sat)],ekf->x[II(sat)+1], sqrt(ekf->P[II(sat)*(ekf->nx+1)]),sstat[sat-1].azel[0]*R2D, sstat[sat-1].azel[1]*R2D, sstat[sat-1].PG,sstat[sat-1].LG); } }
/* options to system options buffer ------------------------------------------*/ static void sysopts2buff(void) { double pos[3],*rr; char id[32],*p; int i,j,sat,*ps; elmask_ =prcopt_.elmin *R2D; elmaskar_ =prcopt_.elmaskar *R2D; elmaskhold_=prcopt_.elmaskhold*R2D; for (i=0;i<2;i++) { ps=i==0?&prcopt_.rovpos:&prcopt_.refpos; rr=i==0?prcopt_.ru:prcopt_.rb; if (*ps==0) { antpostype_[i]=0; ecef2pos(rr,pos); antpos_[i][0]=pos[0]*R2D; antpos_[i][1]=pos[1]*R2D; antpos_[i][2]=pos[2]; } else antpostype_[i]=*ps+1; } /* excluded satellites */ exsats_[0]='\0'; for (sat=1,p=exsats_;sat<=MAXSAT&&p-exsats_<(int)sizeof(exsats_)-32;sat++) { if (prcopt_.exsats[sat-1]) { satno2id(sat,id); p+=sprintf(p,"%s%s%s",p==exsats_?"":" ", prcopt_.exsats[sat-1]==2?"+":"",id); } } /* snrmask */ for (i=0;i<NFREQ;i++) { snrmask_[i][0]='\0'; p=snrmask_[i]; for (j=0;j<9;j++) { p+=sprintf(p,"%s%.0f",j>0?",":"",prcopt_.snrmask.mask[i][j]); } } }
/* set antenna parameters ----------------------------------------------------*/ static void setpcv(gtime_t time, prcopt_t *popt, nav_t *nav, const pcvs_t *pcvs, const pcvs_t *pcvr, const sta_t *sta) { pcv_t *pcv; double pos[3],del[3]; int i,j,mode=PMODE_DGPS<=popt->mode&&popt->mode<=PMODE_FIXED; char id[64]; /* set satellite antenna parameters */ for (i=0;i<MAXSAT;i++) { if (!(satsys(i+1,NULL)&popt->navsys)) continue; if (!(pcv=searchpcv(i+1,"",time,pcvs))) { satno2id(i+1,id); trace(2,"no satellite antenna pcv: %s\n",id); continue; } nav->pcvs[i]=*pcv; } for (i=0;i<(mode?2:1);i++) { if (!strcmp(popt->anttype[i],"*")) { /* set by station parameters */ strcpy(popt->anttype[i],sta[i].antdes); if (sta[i].deltype==1) { /* xyz */ if (norm(sta[i].pos,3)>0.0) { ecef2pos(sta[i].pos,pos); ecef2enu(pos,sta[i].del,del); for (j=0;j<3;j++) popt->antdel[i][j]=del[j]; } } else { /* enu */ for (j=0;j<3;j++) popt->antdel[i][j]=stas[i].del[j]; } } if (!(pcv=searchpcv(0,popt->anttype[i],time,pcvr))) { trace(2,"no receiver antenna pcv: %s\n",popt->anttype[i]); *popt->anttype[i]='\0'; continue; } strcpy(popt->anttype[i],pcv->type); popt->pcvr[i]=*pcv; } }
// update satellite-list pull-down menu ------------------------------------- void __fastcall TPlot::UpdateSatList(void) { int i,j,sys,sysp=0,sat,smask[MAXSAT]={0}; char s[8]; trace(3,"UpdateSatList\n"); for (i=0;i<2;i++) for (j=0;j<SolStat[i].n;j++) { sat=SolStat[i].data[j].sat; if (1<=sat&&sat<=MAXSAT) smask[sat-1]=1; } for (j=0;j<Obs.n;j++) { sat=Obs.data[j].sat; if (1<=sat&&sat<=MAXSAT) smask[sat-1]=1; } SatList->Items->Clear(); SatList->Items->Add("ALL"); for (sat=1;sat<=MAXSAT;sat++) { if (SatMask[sat-1]||!smask[sat-1]) continue; if ((sys=satsys(sat,NULL))==sysp) continue; switch ((sysp=sys)) { case SYS_GPS: strcpy(s,"G"); break; case SYS_GLO: strcpy(s,"R"); break; case SYS_GAL: strcpy(s,"E"); break; case SYS_QZS: strcpy(s,"J"); break; case SYS_CMP: strcpy(s,"C"); break; case SYS_SBS: strcpy(s,"S"); break; } SatList->Items->Add(s); } for (sat=1;sat<=MAXSAT;sat++) { if (SatMask[sat-1]||!smask[sat-1]) continue; satno2id(sat,s); SatList->Items->Add(s); } SatList->ItemIndex=0; UpdateSatSel(); }
//--------------------------------------------------------------------------- void __fastcall TOptDialog::LoadOpt(AnsiString file) { 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}; AnsiString s; char buff[1024]="",*p,id[32]; int sat; prcopt_t prcopt=prcopt_default; solopt_t solopt=solopt_default; filopt_t filopt={""}; resetsysopts(); if (!loadopts(file.c_str(),sysopts)|| !loadopts(file.c_str(),rcvopts)) return; getsysopts(&prcopt,&solopt,&filopt); for (int i=0;i<8;i++) { MainForm->StreamC[i]=strtype[i]!=STR_NONE; MainForm->Stream[i]=STR_NONE; for (int j=0;j<(i<3?7:5);j++) { if (strtype[i]!=(i<3?itype[j]:otype[j])) continue; MainForm->Stream[i]=j; break; } if (i<5) MainForm->Format[i]=strfmt[i]; if (strtype[i]==STR_SERIAL) { MainForm->Paths[i][0]=strpath[i]; } else if (strtype[i]==STR_FILE) { MainForm->Paths[i][2]=strpath[i]; } else if (strtype[i]<=STR_NTRIPCLI) { MainForm->Paths[i][1]=strpath[i]; } else if (strtype[i]<=STR_HTTP) { MainForm->Paths[i][3]=strpath[i]; } } MainForm->NmeaReq=nmeareq; MainForm->NmeaPos[0]=nmeapos[0]; MainForm->NmeaPos[1]=nmeapos[1]; SbasSatE ->Text =s.sprintf("%d",prcopt.sbassatsel); PosMode ->ItemIndex =prcopt.mode; Freq ->ItemIndex =prcopt.nf>NFREQ-1?NFREQ-1:prcopt.nf-1; Solution ->ItemIndex =prcopt.soltype; ElMask ->Text =s.sprintf("%.0f",prcopt.elmin*R2D); DynamicModel ->ItemIndex =prcopt.dynamics; TideCorr ->ItemIndex =prcopt.tidecorr; IonoOpt ->ItemIndex =prcopt.ionoopt; TropOpt ->ItemIndex =prcopt.tropopt; SatEphem ->ItemIndex =prcopt.sateph; ExSatsE ->Text =""; for (sat=1,p=buff;sat<=MAXSAT;sat++) { if (!prcopt.exsats[sat-1]) continue; satno2id(sat,id); p+=sprintf(p,"%s%s%s",p==buff?"":" ",prcopt.exsats[sat-1]==2?"+":"",id); } ExSatsE ->Text =buff; NavSys1 ->Checked =prcopt.navsys&SYS_GPS; NavSys2 ->Checked =prcopt.navsys&SYS_GLO; NavSys3 ->Checked =prcopt.navsys&SYS_GAL; NavSys4 ->Checked =prcopt.navsys&SYS_QZS; NavSys5 ->Checked =prcopt.navsys&SYS_SBS; NavSys6 ->Checked =prcopt.navsys&SYS_CMP; PosOpt1 ->Checked =prcopt.posopt[0]; PosOpt2 ->Checked =prcopt.posopt[1]; PosOpt3 ->Checked =prcopt.posopt[2]; PosOpt4 ->Checked =prcopt.posopt[3]; PosOpt5 ->Checked =prcopt.posopt[4]; AmbRes ->ItemIndex =prcopt.modear; GloAmbRes ->ItemIndex =prcopt.glomodear; ValidThresAR ->Text =s.sprintf("%.1f",prcopt.thresar[0]); OutCntResetAmb->Text =s.sprintf("%d" ,prcopt.maxout ); FixCntHoldAmb->Text =s.sprintf("%d" ,prcopt.minfix ); LockCntFixAmb->Text =s.sprintf("%d" ,prcopt.minlock ); ElMaskAR ->Text =s.sprintf("%.0f",prcopt.elmaskar*R2D); ElMaskHold ->Text =s.sprintf("%.0f",prcopt.elmaskhold*R2D); MaxAgeDiff ->Text =s.sprintf("%.1f",prcopt.maxtdiff ); RejectGdop ->Text =s.sprintf("%.1f",prcopt.maxgdop ); RejectThres ->Text =s.sprintf("%.1f",prcopt.maxinno ); SlipThres ->Text =s.sprintf("%.3f",prcopt.thresslip); NumIter ->Text =s.sprintf("%d", prcopt.niter ); SyncSol ->ItemIndex =prcopt.syncsol; BaselineLen ->Text =s.sprintf("%.3f",prcopt.baseline[0]); BaselineSig ->Text =s.sprintf("%.3f",prcopt.baseline[1]); BaselineConst->Checked =prcopt.baseline[0]>0.0; SolFormat ->ItemIndex =solopt.posf; TimeFormat ->ItemIndex =solopt.timef==0?0:solopt.times+1; TimeDecimal ->Text =s.sprintf("%d",solopt.timeu); LatLonFormat ->ItemIndex =solopt.degf; FieldSep ->Text =solopt.sep; OutputHead ->ItemIndex =solopt.outhead; OutputOpt ->ItemIndex =solopt.outopt; OutputDatum ->ItemIndex =solopt.datum; OutputHeight ->ItemIndex =solopt.height; OutputGeoid ->ItemIndex =solopt.geoid; NmeaIntv1 ->Text =s.sprintf("%.2g",solopt.nmeaintv[0]); NmeaIntv2 ->Text =s.sprintf("%.2g",solopt.nmeaintv[1]); DebugTrace ->ItemIndex =solopt.trace; DebugStatus ->ItemIndex =solopt.sstat; MeasErrR1 ->Text =s.sprintf("%.1f",prcopt.eratio[0]); MeasErrR2 ->Text =s.sprintf("%.3f",prcopt.eratio[1]); MeasErr2 ->Text =s.sprintf("%.3f",prcopt.err[1]); MeasErr3 ->Text =s.sprintf("%.3f",prcopt.err[2]); MeasErr4 ->Text =s.sprintf("%.3f",prcopt.err[3]); MeasErr5 ->Text =s.sprintf("%.3f",prcopt.err[4]); SatClkStab ->Text =s.sprintf("%.2E",prcopt.sclkstab); PrNoise1 ->Text =s.sprintf("%.2E",prcopt.prn[0]); PrNoise2 ->Text =s.sprintf("%.2E",prcopt.prn[1]); PrNoise3 ->Text =s.sprintf("%.2E",prcopt.prn[2]); PrNoise4 ->Text =s.sprintf("%.2E",prcopt.prn[3]); PrNoise5 ->Text =s.sprintf("%.2E",prcopt.prn[4]); RovAntPcv ->Checked =*prcopt.anttype[0]; RefAntPcv ->Checked =*prcopt.anttype[1]; RovAnt ->Text =prcopt.anttype[0]; RefAnt ->Text =prcopt.anttype[1]; RovAntE ->Text =s.sprintf("%.4f",prcopt.antdel[0][0]); RovAntN ->Text =s.sprintf("%.4f",prcopt.antdel[0][1]); RovAntU ->Text =s.sprintf("%.4f",prcopt.antdel[0][2]); RefAntE ->Text =s.sprintf("%.4f",prcopt.antdel[1][0]); RefAntN ->Text =s.sprintf("%.4f",prcopt.antdel[1][1]); RefAntU ->Text =s.sprintf("%.4f",prcopt.antdel[1][2]); RovPosTypeP ->ItemIndex =prcopt.rovpos==0?0:3; RefPosTypeP ->ItemIndex =prcopt.refpos==0?0:3; RovPosTypeF =RovPosTypeP->ItemIndex; RefPosTypeF =RefPosTypeP->ItemIndex; SetPos(RovPosTypeP->ItemIndex,editu,prcopt.ru); SetPos(RefPosTypeP->ItemIndex,editr,prcopt.rb); SatPcvFile ->Text =filopt.satantp; AntPcvFile ->Text =filopt.rcvantp; StaPosFile ->Text =filopt.stapos; GeoidDataFile->Text =filopt.geoid; DCBFile ->Text =filopt.dcb; LocalDir ->Text =filopt.tempdir; ReadAntList(); UpdateEnable(); }
/* raim fde (failure detection and exclution) -------------------------------*/ static int raim_fde(const obsd_t *obs, int n, const double *rs, const double *dts, const double *vare, const int *svh, const nav_t *nav, const prcopt_t *opt, sol_t *sol, double *azel, int *vsat, double *resp, char *msg) { obsd_t *obs_e; sol_t sol_e={{0}}; char tstr[32],name[16],msg_e[128]; double *rs_e,*dts_e,*vare_e,*azel_e,*resp_e,rms_e,rms=100.0; int i,j,k,nvsat,stat=0,*svh_e,*vsat_e,sat=0; trace(3,"raim_fde: %s n=%2d\n",time_str(obs[0].time,0),n); if (!(obs_e=(obsd_t *)malloc(sizeof(obsd_t)*n))) return 0; rs_e = mat(6,n); dts_e = mat(2,n); vare_e=mat(1,n); azel_e=zeros(2,n); svh_e=imat(1,n); vsat_e=imat(1,n); resp_e=mat(1,n); for (i=0;i<n;i++) { /* satellite exclution */ for (j=k=0;j<n;j++) { if (j==i) continue; obs_e[k]=obs[j]; matcpy(rs_e +6*k,rs +6*j,6,1); matcpy(dts_e+2*k,dts+2*j,2,1); vare_e[k]=vare[j]; svh_e[k++]=svh[j]; } /* estimate receiver position without a satellite */ if (!estpos(obs_e,n-1,rs_e,dts_e,vare_e,svh_e,nav,opt,&sol_e,azel_e, vsat_e,resp_e,msg_e)) { trace(3,"raim_fde: exsat=%2d (%s)\n",obs[i].sat,msg); continue; } for (j=nvsat=0,rms_e=0.0;j<n-1;j++) { if (!vsat_e[j]) continue; rms_e+=SQR(resp_e[j]); nvsat++; } if (nvsat<5) { trace(3,"raim_fde: exsat=%2d lack of satellites nvsat=%2d\n", obs[i].sat,nvsat); continue; } rms_e=sqrt(rms_e/nvsat); trace(3,"raim_fde: exsat=%2d rms=%8.3f\n",obs[i].sat,rms_e); if (rms_e>rms) continue; /* save result */ for (j=k=0;j<n;j++) { if (j==i) continue; matcpy(azel+2*j,azel_e+2*k,2,1); vsat[j]=vsat_e[k]; resp[j]=resp_e[k++]; } stat=1; *sol=sol_e; sat=obs[i].sat; rms=rms_e; vsat[i]=0; strcpy(msg,msg_e); } if (stat) { time2str(obs[0].time,tstr,2); satno2id(sat,name); trace(2,"%s: %s excluded by raim\n",tstr+11,name); } free(obs_e); free(rs_e ); free(dts_e ); free(vare_e); free(azel_e); free(svh_e); free(vsat_e); free(resp_e); return stat; }
/* initialize sdr channel struct ----------------------------------------------- * set value to sdr channel struct * args : int chno I channel number (1,2,...) * int sys I system type (SYS_***) * int prn I PRN number * int ctype I code type (CTYPE_***) * int dtype I data type (DTYPEI or DTYPEIQ) * int ftype I front end type (FTYPE1 or FTYPE2) * double f_cf I center (carrier) frequency (Hz) * double f_sf I sampling frequency (Hz) * double f_if I intermidiate frequency (Hz) * sdrch_t *sdr I/0 sdr channel struct * return : int 0:okay -1:error *-----------------------------------------------------------------------------*/ extern int initsdrch(int chno, int sys, int prn, int ctype, int dtype, int ftype, double f_cf, double f_sf, double f_if, sdrch_t *sdr) { int i; short *rcode; sdr->no=chno; sdr->sys=sys; sdr->prn=prn; sdr->sat=satno(sys,prn); sdr->ctype=ctype; sdr->dtype=dtype; sdr->ftype=ftype; sdr->f_sf=f_sf; sdr->f_if=f_if; sdr->ti=1/f_sf; /* code generation */ if (!(sdr->code=gencode(prn,ctype,&sdr->clen,&sdr->crate))) { SDRPRINTF("error: gencode\n"); return -1; } sdr->ci=sdr->ti*sdr->crate; sdr->ctime=sdr->clen/sdr->crate; sdr->nsamp=(int)(f_sf*sdr->ctime); sdr->nsampchip=(int)(sdr->nsamp/sdr->clen); satno2id(sdr->sat,sdr->satstr); /* set carrier frequency */ if (ctype==CTYPE_G1) { sprintf(sdr->satstr,"R%d",prn); /* frequency number instead of PRN */ sdr->f_cf=FREQ1_GLO+DFRQ1_GLO*prn; /* FDMA */ sdr->foffset=DFRQ1_GLO*prn; /* FDMA */ } else if (sdrini.fend==FEND_FRTLSDR) { sdr->foffset=f_cf*sdrini.rtlsdrppmerr*1e-6; } else { sdr->f_cf=f_cf; /* carrier frequency */ sdr->foffset=0.0; /* frequency offset */ } /* for BeiDou B1I */ if (ctype==CTYPE_B1I) sdr->nsampchip*=2; /* for BOC code */ /* acqisition struct */ initacqstruct(sys,ctype,prn,&sdr->acq); sdr->acq.nfft=2*sdr->nsamp;//calcfftnum(2*sdr->nsamp,0); /* memory allocation */ if (!(sdr->acq.freq=(double*)malloc(sizeof(double)*sdr->acq.nfreq))) { SDRPRINTF("error: initsdrch memory alocation\n"); return -1; } /* doppler search frequency */ for (i=0;i<sdr->acq.nfreq;i++) sdr->acq.freq[i]=sdr->f_if+((i-(sdr->acq.nfreq-1)/2)*sdr->acq.step) +sdr->foffset; /* tracking struct */ if (inittrkstruct(sdr->sat,ctype,sdr->ctime,&sdr->trk)<0) return -1; /* navigation struct */ if (initnavstruct(sys,ctype,prn,&sdr->nav)<0) { return -1; } /* memory allocation */ if (!(rcode=(short *)sdrmalloc(sizeof(short)*sdr->acq.nfft)) || !(sdr->xcode=cpxmalloc(sdr->acq.nfft))) { SDRPRINTF("error: initsdrch memory alocation\n"); return -1; } /* other code generation */ for (i=0;i<sdr->acq.nfft;i++) rcode[i]=0; /* zero padding */ rescode(sdr->code,sdr->clen,0,0,sdr->ci,sdr->nsamp,rcode); /* resampling */ cpxcpx(rcode,NULL,1.0,sdr->acq.nfft,sdr->xcode); /* FFT for acquisition */ cpxfft(NULL,sdr->xcode,sdr->acq.nfft); sdrfree(rcode); return 0; }
static jobject RtkCommon_get_sat_id(JNIEnv* env, jclass clazz, jint sat_no) { char sat_id[16]; satno2id(sat_no, sat_id); return (*env)->NewStringUTF(env, sat_id); }
// update observation data index, azimuth/elevation, satellite list --------- void __fastcall TPlot::UpdateObs(int nobs) { AnsiString s; prcopt_t opt=prcopt_default; gtime_t time; sol_t sol={0}; double pos[3],rr[3],e[3],azel[MAXOBS*2]={0},rs[6],dts[2],var; int i,j,k,svh,per,per_=-1; char msg[128],name[16]; trace(3,"UpdateObs\n"); delete [] IndexObs; IndexObs=NULL; delete [] Az; Az=NULL; delete [] El; El=NULL; NObs=0; if (nobs<=0) return; IndexObs=new int[nobs+1]; Az=new double[Obs.n]; El=new double[Obs.n]; opt.err[0]=900.0; ReadWaitStart(); ShowLegend(NULL); for (i=0;i<Obs.n;i=j) { time=Obs.data[i].time; for (j=i;j<Obs.n;j++) { if (timediff(Obs.data[j].time,time)>TTOL) break; } IndexObs[NObs++]=i; for (k=0;k<j-i;k++) { azel[k*2]=azel[1+k*2]=0.0; } if (RcvPos==0) { pntpos(Obs.data+i,j-i,&Nav,&opt,&sol,azel,NULL,msg); matcpy(rr,sol.rr,3,1); ecef2pos(rr,pos); } else { if (RcvPos==1) { // lat/lon/height for (k=0;k<3;k++) pos[k]=OOPos[k]; pos2ecef(pos,rr); } else { // rinex header position for (k=0;k<3;k++) rr[k]=Sta.pos[k]; ecef2pos(rr,pos); } for (k=0;k<j-i;k++) { azel[k*2]=azel[1+k*2]=0.0; if (!satpos(time,time,Obs.data[i+k].sat,EPHOPT_BRDC,&Nav,rs,dts, &var,&svh)) continue; if (geodist(rs,rr,e)>0.0) satazel(pos,e,azel+k*2); } } // satellite azel by tle data for (k=0;k<j-i;k++) { if (azel[k*2]!=0.0||azel[1+k*2]!=0.0) continue; satno2id(Obs.data[i+k].sat,name); if (!tle_pos(time,name,"","",&TLEData,NULL,rs)) continue; if (geodist(rs,rr,e)>0.0) satazel(pos,e,azel+k*2); } for (k=0;k<j-i;k++) { Az[i+k]=azel[ k*2]; El[i+k]=azel[1+k*2]; if (Az[i+k]<0.0) Az[i+k]+=2.0*PI; } per=(i+1)*100/Obs.n; if (per!=per_) { ShowMsg(s.sprintf("updating azimuth/elevation... (%d%%)",(per_=per))); Application->ProcessMessages(); } } IndexObs[NObs]=Obs.n; UpdateSatList(); ReadWaitEnd(); }
// generate visibility data ---------------------------------------------------- void __fastcall TPlot::GenVisData(void) { gtime_t time,ts,te; obsd_t data={{0}}; sta_t sta={0}; double tint,r,pos[3],rr[3],rs[6],e[3],azel[2]; int i,j,nobs=0; char name[16]; trace(3,"GenVisData\n"); ClearObs(); SimObs=1; ts=TimeStart; te=TimeEnd; tint=TimeInt; matcpy(pos,OOPos,3,1); pos2ecef(pos,rr); ReadWaitStart(); ShowLegend(NULL); ShowMsg("generating satellite visibility..."); Application->ProcessMessages(); for (time=ts;timediff(time,te)<=0.0;time=timeadd(time,tint)) { for (i=0;i<MAXSAT;i++) { satno2id(i+1,name); if (!tle_pos(time,name,"","",&TLEData,NULL,rs)) continue; if ((r=geodist(rs,rr,e))<=0.0) continue; if (satazel(pos,e,azel)<=0.0) continue; if (Obs.n>=Obs.nmax) { Obs.nmax=Obs.nmax<=0?4096:Obs.nmax*2; Obs.data=(obsd_t *)realloc(Obs.data,sizeof(obsd_t)*Obs.nmax); if (!Obs.data) { Obs.n=Obs.nmax=0; break; } } data.time=time; data.sat=i+1; for (j=0;j<NFREQ;j++) { data.P[j]=data.L[j]=0.0; data.code[j]=CODE_NONE; } data.code[0]=CODE_L1C; Obs.data[Obs.n++]=data; } if (++nobs>=MAX_SIMOBS) break; } if (Obs.n<=0) { ReadWaitEnd(); ShowMsg("no satellite visibility"); return; } UpdateObs(nobs); Caption="Satellite Visibility (Predicted)"; 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(); ReadWaitEnd(); UpdateObsType(); UpdateTime(); UpdatePlot(); }