Fonction de calcul
fr


memoscope

Contenu du fichier


/* memoscope Scicos vector memory visualization block
 * Type 2 simulation function ver 1.0 - scilab-2.6&2.7
 * 23 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 void Legends();
extern int C2F(plot2d)();
extern int C2F(xgrid)();
extern int C2F(sciwin)();
extern int C2F(setscale2d)();

/*
 * Cette fonction de simulation est un oscilloscope à mémoire.
 * La largeur de la fenetre est fournie par le paramètre ipar[9]
 * (nombre d'échantillons:in_size) et la longueur de la mémoire est fournie
 * par le paramètre ipar[2] (nombre de fenetre à mémoriser).
 * A chaque coup d'horloge la valeur d'entrée u[] est stockée
 * dans le buffeur z. La taille totale du buffer est ipar[9]*ipar[2] + 1
 * Un compteur interne est incrémenté jusqu'a sa valeur finale ipar[9]*ipar[2]
 * et lorsque cette valeur est atteinte, le contenu du buffer est envoyé
 * a la routine graphique plot2d.
 * entrée régulières : u[0] valeur d'entrée
 * 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]
 *                z[in_size..(2*in_size)-1]
 *                    ..
 *                    ..
 *                z[(ipar[2]-1)*in_size..(ipar[2]*in_size)-1] : buffer échantillons
 *                z[in_size*ipar[2]] : compteur échantillons
 *
 *  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)
 *  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[9]] : xvector
 */

/*prototype*/
void memoscope(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 entiers pour passage paramètre*/
   double *u;  /*Pour scicos*/
   /*int style[ipar[2]];*/  
   /*Tableau d'entier pour définition des styles de chaque courbes*/
   int *style;
   double *pos;
   style=(int *) malloc(sizeof(int)*ipar[2]);
   /*double pos[ipar[9]*ipar[2]];*/
   /*Tableau de réels pour la définition de la position de chaque point*/
   pos = (double *) malloc(sizeof(double)*ipar[9]*ipar[2]);


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

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

   /*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]='0';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;

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

    /*Affecte z[k] à la valeur de u[0]*/
    z[k]=u[0];

    /*Incrémente compteur échantillons*/
    z[in_size*ipar[2]]++;

    if(z[in_size*ipar[2]]==in_size*ipar[2])
    {
     /*RAZ compteur échantillons*/
     z[in_size*ipar[2]]=0;

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

     /*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[] et de pos[]*/
     for (j=0;j<ipar[2];j++)
     {
      style[j]=graphcolor;
      for (i=0;i<ipar[9];i++) pos[j*ipar[9]+i]=rpar[4+i];
     }

     /*Execute plot2d*/
     C2F(plot2d)(&pos[0],&z[0],(j=ipar[2],&j),&in_size,&style[0],&strf,&buf,&rect,&nax,0L,0L);

     /*Affiche la legende*/
     Legends((i=1,&i),(j=1,&j),&buf);

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

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

    /*Execute 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);
   }
   free(style);
   free(pos);
}