// update time-information for solution plot -------------------------------- void __fastcall TPlot::UpdateTimeSol(void) { const char *unit[]={"m","m/s","m/s2"},*u; const char *sol[]={"","FIX","FLOAT","SBAS","DGPS","Single","PPP"}; AnsiString msg,msgs[8],s; sol_t *data; double xyz[3],pos[3],r,az,el; int sel=BtnSol1->Down||!BtnSol2->Down?0:1,ind=SolIndex[sel]; char tstr[64]; trace(3,"UpdateTimeSol\n"); if ((BtnSol1->Down||BtnSol2->Down||BtnSol12->Down)&& (data=getsol(SolData+sel,ind))) { if (!ConnectState) msg.sprintf("[%d]",sel+1); else msg="[R]"; TimeStr(data->time,2,1,tstr); msg+=tstr; msg+=" : "; if (PLOT_SOLP<=PlotType&&PlotType<=PLOT_SOLA) { PosToXyz(data->time,data->rr,data->type,xyz); u=unit[PlotType-PLOT_SOLP]; msg+=s.sprintf("E=%7.4f%s N=%7.4f%s U=%7.4f%s Q=", xyz[0],u,xyz[1],u,xyz[2],u); } else if (PlotType==PLOT_NSAT) { msg+=s.sprintf("NS=%d AGE=%.1f RATIO=%.1f Q=",data->ns,data->age, data->ratio); } else if (!data->type) { ecef2pos(data->rr,pos); msg+=LatLonStr(pos,9)+s.sprintf(" %9.4fm Q=",pos[2]); } else { r=norm(data->rr,3); az=norm(data->rr,2)<=1E-12?0.0:atan2(data->rr[0],data->rr[1])*R2D; el=r<=1E-12?0.0:asin(data->rr[2]/r)*R2D; msg+=s.sprintf("B=%.3fm D=%6.2f" CHARDEG " %5.2f" CHARDEG " Q=", r,az<0.0?az+360.0:az,el); } if (1<=data->stat&&data->stat<=6) { msgs[data->stat-1]=s.sprintf("%d:%s",data->stat,sol[data->stat]); } } ShowMsg(msg); ShowLegend(msgs); }
// get position, velocity or accel from solutions --------------------------- TIMEPOS * __fastcall TPlot::SolToPos(solbuf_t *sol, int index, int qflag, int type) { TIMEPOS *pos,*vel,*acc; gtime_t ts={0}; sol_t *data; double tint,xyz[3],xyzs[4]; int i; trace(3,"SolToPos: n=%d\n",sol->n); pos=new TIMEPOS(index<0?sol->n:3,1); if (index>=0) { if (type==1&&index>sol->n-2) index=sol->n-2; if (type==2&&index>sol->n-3) index=sol->n-3; } for (i=index<0?0:index;data=getsol(sol,i);i++) { tint=TimeEna[2]?TimeInt:0.0; if (index<0&&!screent(data->time,ts,ts,tint)) continue; if (qflag&&data->stat!=qflag) continue; PosToXyz(data->time,data->rr,data->type,xyz); CovToXyz(data->rr,data->qr,data->type,xyzs); pos->t [pos->n]=data->time; pos->x [pos->n]=xyz [0]; pos->y [pos->n]=xyz [1]; pos->z [pos->n]=xyz [2]; pos->xs [pos->n]=xyzs[0]; // var x^2 pos->ys [pos->n]=xyzs[1]; // var y^2 pos->zs [pos->n]=xyzs[2]; // var z^2 pos->xys[pos->n]=xyzs[3]; // cov xy pos->q [pos->n]=data->stat; pos->n++; if (index>=0&&pos->n>=3) break; } if (type!=1&&type!=2) return pos; // position vel=pos->tdiff(); delete pos; if (type==1) return vel; // velocity acc=vel->tdiff(); delete vel; return acc; // acceleration }
// search solution by xy-position in plot ----------------------------------- int __fastcall TPlot::SearchPos(int x, int y) { sol_t *data; TPoint p(x,y); double xp,yp,xs,ys,r,xyz[3]; int i,sel=!BtnSol1->Down&&BtnSol2->Down?1:0; trace(3,"SearchPos: x=%d y=%d\n",x,y); if (!BtnShowTrack->Down||(!BtnSol1->Down&&!BtnSol2->Down)) return -1; GraphT->ToPos(p,xp,yp); GraphT->GetScale(xs,ys); r=(MarkSize/2+2)*xs; for (i=0;data=getsol(SolData+sel,i);i++) { if (QFlag->ItemIndex&&data->stat!=QFlag->ItemIndex) continue; PosToXyz(data->time,data->rr,data->type,xyz); if (SQR(xp-xyz[0])+SQR(yp-xyz[1])<=SQR(r)) return i; } return -1; }