Memory sequential scope block
- Color (
0) or mark (
0) :
Type 'vec' of size 1. integer. see CSCOPE
- Output window number :
Type 'vec' of size 1. integer. the figure id.
- Output window position :
Type 'vec' of size -1. vector of integers. Set the position of the figure
- Output window sizes :
Type 'vec' of size -1. vector of integers. Set the size of the figure
- Xmin Xmax :
Type 'vec' of size 2. vector of real. The minimal and maximal bound of X-axis
- Ymin Ymax :
Type 'vec' of size 2. vector of real. The minimal and maximal bound of Y-axis
- X vector :
Type 'vec' of size -1. vector of real. The X-axis vector
- Number of windows :
Type 'vec' of size 1. integer. The number of curves in the window.
- Initial counter value :
Type 'vec' of size 1. integer. the initial value of the counter before displaying.
- Graph label :
Type 'str' of size 1. string. The title of the figure.
- Xgrid(0/1) :
Type 'vec' of size 1. boolean. Plot a grid in graphic window
- plot2d3(0/1) :
Type 'vec' of size 1. boolean. Enable plot2d3 behaviour.
- always active: no
- direct-feedthrough: no
- zero-crossing: no
- mode: no
- number/sizes of inputs: 1 / 9
- number/sizes of outputs: 0 /
- number/sizes of activation inputs: 1 / 1
- number/sizes of activation outputs: 0 /
- continuous-time state: no
- discrete-time state: yes
- name of computational function: memoscope
MEMOSCOPE_f.sci
/* 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$
*/
#define PI0 (integer *) 0
#define PD0 (double *) 0
#include "machine.h"
#include <stdio.h>
/*
* 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);
}
IRCOM Group
Alan Layec