/* vectorscope Scicos vector visualization block * Originaly write in fortran in the LARY_CR package * Rewrite in C with new options * Type 2 simulation function ver 1.0 - scilab-2.6&2.7 * 23 octobre 2003 - IRCOM GROUP - Author : A.Layec */ /* REVISION HISTORY : * $Log$ */ #define PI0 (integer *) 0 #define PD0 (double *) 0 #include "machine.h" #include <stdio.h> /* Cette fonction de simulation permet d'ouvrir une fenetre graphique * et de visualiser la valeur d'un vecteur passer via le port * d'entrée u[]. A chaque coup d'horloge, le contenu de la fenetre * est effacé et réactualisé avec la valeur du vecteur d'entrée. * entrée régulières : u[0..in_size-1] vecteur à visualiser * sorties régulières : néant * entrée évènementielle : date de déclenchement * sortie évènementielle : néant. * état discret : z[0..in_size-1] : buffer * * Integer Parameter * ipar[0] : window number * ipar[1] : color flag * ipar[2] : number of window (buffer_size=ipar[2]*ipar[9]) * ipar[3] : dash,color or mark choice * ipar[4] : line or mark size * ipar[5..6] : position of window * ipar[7..8] : size of window * ipar[9] : in_size (length of window) * ipar[10] : additionnal option * (xgrid (0/1) : bit 1) * (plot2d3 (0/1) : bit 2) * ipar[11] : GRAPH_label_size (length of title) * ipar[12..12+ipar[11]] : Char code of title * * Real Parameter * rpar[0] : xmin * rpar[1] : xmax * rpar[2] : ymin * rpar[3] : ymax * rpar[4..4+ipar[6]] : xvector */ /*prototype*/ void vectorscope(flag,nevprt,t,xd,x,nx,z,nz,tvec,ntvec,rpar,nrpar, ipar,nipar,inptr,insz,nin,outptr,outsz,nout) integer *flag,*nevprt,*nx,*nz,*ntvec,*nrpar,ipar[],*nipar,insz[],*nin,outsz[],*nout; double x[],xd[],z[],tvec[],rpar[]; double *inptr[],*outptr[],*t; { /* Déclaration des variables * Variables compteur */ int i,j,k; /*Pour paramètres réels*/ double xmin,xmax,ymin,ymax; /*Pour paramatères entiers*/ int wid,graphcolor,wpos[2],wdim[2],in_size,option; int GRAPH_label_size,GRAPH_label_CODE[40]; /*Autres*/ char name[4]; /*Chaine de caractères pour le nom du driver graphique*/ char strf[4]; /*Chaine de caractère pour controle affichage*/ char buf[41]; /*Chaine pour recevoir la légende*/ int nax[4]; /*Tableau entier pour controle des graduations*/ double rect[4]; /*Tableau double pour les coordonnées de la fenetre*/ double frect[4]; /*Cela sert à setscale2d*/ int ww,verbose=0,narg; /*Parametres réels pour passage paramètre*/ /*Pour scicos*/ int nev; double *u; /*Récupération de l'adresse du port d'entrée régulier*/ u=(double *)inptr[0]; /*Récupération du numéro du port d'activation*/ nev=*nevprt; /*Récupération des paramètres entiers*/ wid=ipar[0]; graphcolor=ipar[1]; wpos[0]=ipar[5]; wpos[1]=ipar[6]; wdim[0]=ipar[7]; wdim[1]=ipar[8]; in_size=ipar[9]; option=ipar[10]; GRAPH_label_size=ipar[11]; for(i=0;i<ipar[11];i++) GRAPH_label_CODE[i]=ipar[12+i]; buf[ipar[11]]='\0'; /*Récupération des paramètres réels*/ xmin=rpar[0];xmax=rpar[1]; ymin=rpar[2];ymax=rpar[3]; /*Place xmin,ymin,xmax et ymax dans rect[]*/ rect[0]=xmin;rect[1]=ymin;rect[2]=xmax;rect[3]=ymax; /*Initialise strf, nax et frec*/ strf[0]='1';strf[1]='1';strf[2]='1';strf[3]='\0'; nax[0]=2;nax[1]=10;nax[2]=2;nax[3]=10; frect[0]=0;frect[1]=0;frect[2]=1;frect[3]=1; /* Vérification du driver graphique * Le nom du driver est retourné dans la variable name */ C2F(dr1)("xgetdr",name,PI0,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L); /*fprintf(stderr,"name=%s\n", name);*/ /*Change le driver en position Rec si nécéssaire*/ if(name!="Rec") C2F(dr1)("xsetdr","Rec",PI0,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L); /*Le flag2 place u[] dans z[] et affiche z[]*/ if(*flag==2) { /*Place u[] dans z[]*/ for(i=0;i<in_size;i++) z[i]=u[i]; /*Retourne le numéro de fenetre active dans ww*/ C2F(dr1)("xget","window",&verbose,&ww,&narg,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L); /*Assigne le numéro de fenetre wid si nécéssaire*/ if(ww!=wid) C2F(dr1)("xset","window",&wid,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L); /*Assigne la couleur?*/ C2F(dr1)("xset","use color",&graphcolor,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L); /*Place le flag wresize pour redimensionner automatiquement la fenetre*/ C2F(dr1)("xset","wresize",(j=1,&j),PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L); /*Efface la fenetre courante*/ C2F(dr1)("xclear","v",PI0,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L); /*Que fait xstart?*/ C2F(dr)("xstart","v",&wid,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L); /*Converti les codes de la légende en caractère*/ C2F(cvstr)(&GRAPH_label_size,&GRAPH_label_CODE[0],&buf[0],(j=1,&j)); /*Initialise le type de tracé*/ C2F(dr1)("xset","dashes",(j=0,&j),PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L); /*Test le bit 2 de option*/ if(((option&2)>>1)==1) /*Lance plot2d3*/ C2F(plot2d3)("gnn",&rpar[4],&z[1],(j=1,&j),&in_size,&graphcolor,&strf,&buf,&rect,&nax,0L,0L,0L); else /*Lance plot2d*/ C2F(plot2d)(&rpar[4],&z[1],(j=1,&j),&in_size,&graphcolor,&strf,&buf,&rect,&nax,0L,0L); /*Test le bit 1 de option*/ if((option&1)==1) C2F(xgrid)((j=1,&j)); } /*le flag4 initialise la fenetre graphique*/ else if(*flag==4) { /*Je sais pas ce que cela fait sciwin()?!? (j'ai pas trouvé le code)*/ C2F(sciwin)(); /*Retourne le numéro de fenetre active dans ww*/ C2F(dr1)("xget","window",&verbose,&ww,&narg,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L); /*Assigne le numéro de fenetre wid si nécéssaire*/ if(ww!=wid) C2F(dr1)("xset","window",&wid,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L); /*Teste la position de la fenetre et replace la si necessaire*/ if((wpos[0]>=0)&&(wpos[1]>0)) C2F(dr1)("xset","wpos",&wpos[0],&wpos[1],PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L); /*Teste la dimension de la fenetre et redimensionne la si nécessaire*/ if((wdim[0]>=0)&&(wdim[1]>0)) C2F(dr1)("xset","wdim",&wdim[0],&wdim[1],PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L); /*Reassigne la fenetre pour forcer les changements*/ C2F(dr1)("xset","window",&wid,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L); /*Ajuste l'echelle et la forme des axes (? correspond aux options de plot2d)*/ C2F(setscale2d)(&frect,&rect,"nn",0L); /*Assigne la couleur?*/ C2F(dr1)("xset","use color",&graphcolor,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L); /*Place le flag wresize pour redimensionner automatiquement la fenetre*/ C2F(dr1)("xset","wresize",(j=1,&j),PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L); /*Initialise la function logique pour dessiner (?)*/ C2F(dr1)("xset","alufunction",(j=3,&j),PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L); /*Efface la fenetre courante*/ C2F(dr1)("xclear","v",PI0,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L); /*Que fait xstart?*/ C2F(dr)("xstart","v",&wid,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L); /*Converti les codes de la légende en caractère*/ C2F(cvstr)(&GRAPH_label_size,&GRAPH_label_CODE[0],&buf[0],(j=1,&j)); /*Initialise le type de tracé*/ C2F(dr1)("xset","dashes",(j=0,&j),PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L); /*Lance plot2d*/ C2F(plot2d)(&rect[0],&rect[1],(j=1,&j),(k=1,&k),&graphcolor,&strf,&buf,&rect,&nax,0L,0L); /*Applique la légende au titre de la fenetre (?)*/ C2F(dr)("xname",&buf,PI0,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L); } }