Computational routine
eng


scopxyz

File content


/* scopxyz Scicos 3d visualization block
 * Type 2 simulation function ver 1.0 - scilab-2.6&2.7
 * 24 octobre 2003 - IRCOM GROUP - Author : A.Layec
 */

/* REVISION HISTORY :
 * $Log$
 */

#include <stdlib.h>

#define PI0 (integer *) 0
#define PD0 (double *) 0
#include "machine.h"

extern int C2F(dr1)();
extern int C2F(dr)();
extern int C2F(cvstr)();
extern int C2F(param3d1)();
extern int C2F(sciwin)();

/* Cette fonction de simulation est un oscilloscope à 3 dimensions.
 * Elle permet l'observation de l'évolution d'une trajectoire dont
 * les valeurs des coordonnées x,y,z, en chaque instant de déclenchement
 * de la fonction, sont présentes sur les entrées u1,u2 et u3.
 * Cette fonction utilise la routines graphique param3d1.
 * A chaque coup d'horloge, les valeurs des coordonnées sont stockée dans
 * le buffer z[]. La taille totale de z est 3*buffer_size + 1. Un compteur
 * est incrémenté jusqu'a sa valeur finale buffer_size et lorsque cette valeur
 * est atteinte, le contenu du buffer z est envoyé à la routine param3d1.
 *
 * Entrées régulières : u1[0], u2[0] et u3[0] sont les coordonnées du point.
 * Soties régulières : néant.
 * Entrée évènementielle : Instant de déclenchement.
 * Sortie évènementielle : néant.
 * Registre interne (taille (3*buffer_size)+1)
 * z[0..buffer_size-1] : x
 * z[buffer_size..2*buffer_size-1] : y
 * z[2*buffer_size..3*buffer_size-1] : z
 * z[3*buffer_size] : compteur échantillons
 *
 * Integer Parameter
 * ipar[0]    : window number
 * ipar[1]    : color flag
 * ipar[2]    : buffer_size
 * 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]    : type
 * ipar[10]   : box
 * ipar[11]   : GRAPH_label_size (length of axes captions)
 * ipar[12..12+ipar[11]] : Char code of axes captions
 *
 * Real Parameter
 * rpar[0] : xmin
 * rpar[1] : xmax
 * rpar[2] : ymin
 * rpar[3] : ymax
 * rpar[4] : zmin
 * rpar[5] : zmax
 * rpar[6] : alpha
 * rpar[7] : theta
 */

/*prototype*/
void scopxyz(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,zmin,zmax,alpha,theta;
   /*Pour paramatères entiers*/
   int wid,graphcolor,wpos[2],wdim[2],buffer_size;
   int GRAPH_label_size,GRAPH_label_CODE[40];
   /*Autres*/
   char name[4]; /*Chaine de caractères pour le nom du driver graphique*/
   char buf[41]; /*Chaine pour recevoir la légende*/
   int eflag[3]; /*Flag pour param3d1*/
   double rect[6]; /*Tableau double pour les coordonnées de la fenetre*/
   int ww,verbose=0,narg; /*Parametres entiers pour passage paramètre*/
   double *u1,*u2,*u3;
   int *style;
   style = (int *) malloc(sizeof(int)*ipar[2]);

   /*Récupération de l'adresse du port d'entrée régulier*/
   u1=(double *)inptr[0];
   u2=(double *)inptr[1];
   u3=(double *)inptr[2];

   /*Récupération des paramètres entiers*/
   wid=ipar[0];
   graphcolor=ipar[1];
   buffer_size=ipar[2];
   wpos[0]=ipar[5];
   wpos[1]=ipar[6];
   wdim[0]=ipar[7];
   wdim[1]=ipar[8];

   GRAPH_label_size=ipar[11];

   /*Récupération des paramètres réels*/
   xmin=rpar[0];xmax=rpar[1]; ymin=rpar[2];ymax=rpar[3];
   zmin=rpar[4];zmax=rpar[5]; alpha=rpar[6]; theta=rpar[7];

   /*Place xmin,xmax,ymin,ymax,zmin,zmax dans rect[]*/
   rect[0]=xmin;rect[1]=xmax;rect[2]=ymin;rect[3]=ymax;
   rect[4]=zmin;rect[5]=zmax;

   /*Initialise eflag (à quoi sert eflag[0]?,eflag[2]->type,eflag[3]->box)*/
   eflag[0]=1;eflag[1]=ipar[9];eflag[2]=ipar[10];

   /*Le flag2 place u[] dans z[] et affiche z[] si nécéssaire*/
   if(*flag==2)
   {
     /*récupère valeur compteur échantillons dans k*/
     k=(int)z[3*buffer_size];

     /*Place u[] dans z[]*/
     z[k]=u1[0];
     z[buffer_size+k]=u2[0];
     z[2*buffer_size+k]=u3[0];

     /*Incrémente compteur échantillons*/
     z[3*buffer_size]++;

     /* Test la valeur compteur échantillons
      * pour savoir si celle ci a atteint la valeur buffer_size
      */
     if(z[3*buffer_size]==buffer_size)
     {
      /*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);

      /*Récupère la légende des axes*/
      for(i=0;i<ipar[11];i++) GRAPH_label_CODE[i]=ipar[12+i];
      buf[ipar[11]]='\0';

      /*Converti les codes de la légende en caractère*/
      C2F(cvstr)(&GRAPH_label_size,&GRAPH_label_CODE[0],&buf[0],(j=1,&j));
      /*buf[0]='@';buf[1]='@';buf[2]='Y';buf[3]='@';buf[4]='Z';buf[5]='a';buf[6]='\0';*/
      /*Affectation de style[]*/
      for (j=0;j<ipar[2];j++) style[j]=graphcolor;

      /*Execute param3d1*/
      C2F(param3d1)(&z[0],&z[buffer_size],&z[2*buffer_size],&buffer_size,(j=1,&j),(k=1,&k),&style[0],&theta,&alpha,&buf,&eflag,&rect,0L);

      /* Teste la valeur de graphcolor pour eviter un tracé
       * discontinu si la valeur est >0
       */
      if(graphcolor<=0)
        /*RAZ compteur échantillons*/
        z[3*buffer_size]=0;
      else
      {
        /*Place valeur compteur échantillons à 1*/
        z[3*buffer_size]=1;

        /*Recopie derniers echantillons dans z[0],z[buffer_size] et z[2*buffer_size]*/
        z[0]=u1[0];
        z[buffer_size]=u2[0];
        z[2*buffer_size]=u3[0];
      }
     }
    }
   /*le flag4 initialise la fenetre graphique*/
   else if(*flag==4)
   {
    /* 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);

    /*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);

    /*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 fonction 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);

    /*Récupère la légende*/
    for(i=0;i<ipar[11];i++) GRAPH_label_CODE[i]=ipar[12+i];
    buf[ipar[11]]='\0';

    /*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);

    /*Affectation de style[]*/
    for (j=0;j<ipar[2];j++) style[j]=graphcolor;

    /*Execute param3d1*/
    C2F(param3d1)(&z[0],&z[buffer_size],&z[2*buffer_size],&buffer_size,(j=1,&j),(k=0,&k),&style,&theta,&alpha,&buf,&eflag,&rect,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);*/
   }
   free(style);
}