Beispiel #1
0
// 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);
}
Beispiel #2
0
// 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
}
Beispiel #3
0
// 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;
}