Computational routine
eng
m_frequ
#include "scicos_block4.h"
#if WIN32
#define NULL 0
#endif
void m_frequ(scicos_block *block,int flag)
{
double *mat;
double *Dt;
double *off;
long *icount;
double t;
long long *counter;
int m;
mat=GetRealOparPtrs(block,1);
Dt=GetRealOparPtrs(block,2);
off=GetRealOparPtrs(block,3);
icount=Getint32OparPtrs(block,4);
m=GetOparSize(block,1,1);
switch(flag)
{
case 4 : {/* the workspace is used to store discrete counter value */
if ((*block->work=scicos_malloc(sizeof(long long int)*2))==NULL) {
set_block_error(-16);
return;
}
counter=*block->work;
if (*icount!=0) (*counter)=(int)mat[0];
else *counter=0;
(*(counter+1))=*icount;
break;
}
/* event date computation */
case 3 : {
counter=*block->work;
t=get_scicos_time();
*counter+=(int)mat[*(counter+1)]; /*increase counter*/
block->evout[(int)mat[*(counter+1)+m]-1]=*off+((double)*counter/(*Dt))-t;
(*(counter+1))++;
*(counter+1)=*(counter+1)%m;
break;
}
/* finish */
case 5 : {
scicos_free(*block->work); /*free the workspace*/
break;
}
default : break;
}
}