/** \file cevscpe.c \author Benoit Bayol \version 1.0 \date September 2006 - January 2007 \brief CEVSCPE is a scope that indicates when the clocks is activated \see CEVENTSCOPE.sci in macros/scicos_blocks/Sinks/ */ #include "scoMemoryScope.h" #include "scoWindowScope.h" #include "scoMisc.h" #include "scoGetProperty.h" #include "scoSetProperty.h" #include "scicos_block4.h" /** \fn cscopxy_draw(scicos_block * block, ScopeMemory ** pScopeMemory, int firstdraw) \brief Function to draw or redraw the window */ void cevscpe_draw(scicos_block * block, ScopeMemory ** pScopeMemory, int firstdraw) { /* Declarations */ int nipar; //Number of elements in ipar vector int i; //As usual int * ipar; double * rpar; //Integer Parameter int nbr_colors; //Number of colors and lines IS ALSO number of channels int win; //To give a name to the window int color_flag; //0/1 color flag -- NOT USED int * colors; //Begin at ipar[2] and has a measure of 8 max int dimension = 2; double period; //Refresh Period of the scope is a vector here int number_of_subwin; int number_of_curves_by_subwin; double xmin, xmax, ymin, ymax; int win_pos[2], win_dim[2]; char *label; /* Initialization */ ipar = GetIparPtrs(block); win = ipar[0]; color_flag = ipar[1]; /*not used*/ rpar = GetRparPtrs(block); period = rpar[0]; nipar = GetNipar(block); label = GetLabelPtrs(block); nbr_colors = nipar-6; colors=(int*)scicos_malloc(nbr_colors*sizeof(int)); for( i = 2 ; i < nbr_colors+2 ; i++) { colors[i-2] = ipar[i]; } number_of_subwin = 1; number_of_curves_by_subwin = nbr_colors; ymin = 0; ymax = 1; win_pos[0] = ipar[(nipar-1) - 3]; win_pos[1] = ipar[(nipar-1) - 2]; win_dim[0] = ipar[(nipar-1) - 1]; win_dim[1] = ipar[nipar-1]; if(firstdraw == 1) { scoInitScopeMemory(GetPtrWorkPtrs(block),pScopeMemory, number_of_subwin, &number_of_curves_by_subwin); scoSetLongDrawSize(*pScopeMemory,0,5000); scoSetShortDrawSize(*pScopeMemory,0,1); scoSetPeriod(*pScopeMemory,0,period); } xmin = period*scoGetPeriodCounter(*pScopeMemory,0); xmax = period*(scoGetPeriodCounter(*pScopeMemory,0)+1); scoInitOfWindow(*pScopeMemory, dimension, win, win_pos, win_dim, &xmin, &xmax, &ymin, &ymax, NULL, NULL); if(scoGetScopeActivation(*pScopeMemory) == 1) { scoAddTitlesScope(*pScopeMemory,label,"t","y",NULL); scoAddCoupleOfSegments(*pScopeMemory,colors); } scicos_free(colors); } /** \fn void cevscpe(scicos_block * block, int flag) \brief the computational function \param block A pointer to a scicos_block \param flag An integer which indicates the state of the block (init, update, ending) */ void cevscpe(scicos_block * block, int flag) { void **_work=GetPtrWorkPtrs(block); ScopeMemory * pScopeMemory; int nbseg = 0; int tab[20]; scoGraphicalObject pShortDraw; int i; double t; int **user_data_ptr,*size_ptr; switch(flag) { case Initialization: { cevscpe_draw(block,&pScopeMemory,1); break; } case StateUpdate: { /* Charging elements */ scoRetrieveScopeMemory(_work,&pScopeMemory); if(scoGetPointerScopeWindow(pScopeMemory) == NULL) return; if(scoGetScopeActivation(pScopeMemory) == 1) { t = GetScicosTime(block); scoRefreshDataBoundsX(pScopeMemory,t); /*Not Factorize*/ for(i = 0 ; i < scoGetNumberOfCurvesBySubwin(pScopeMemory,0) ; i++) { if((GetNevIn(block)&(1<<i))==(1<<i)) { tab[nbseg]=i; nbseg++; } } for(i = 0 ; i < nbseg ; i++) { pShortDraw = scoGetPointerShortDraw(pScopeMemory,0,tab[i]); pSEGS_FEATURE(pShortDraw)->vx[0] = t; pSEGS_FEATURE(pShortDraw)->vx[1] = t; pSEGS_FEATURE(pShortDraw)->vy[0] = i*0.8/nbseg; pSEGS_FEATURE(pShortDraw)->vy[1] = (i+1)*0.8/nbseg; pSEGS_FEATURE(pShortDraw)->Nbr1 = 2; pSEGS_FEATURE(pShortDraw)->Nbr2 = 2; } /*End of Not Factorize*/ scoDrawScopeAmplitudeTimeStyle(pScopeMemory,t); } break; } case Ending: { scoRetrieveScopeMemory(_work, &pScopeMemory); if(scoGetScopeActivation(pScopeMemory) == 1) { if(scoGetPointerScopeWindow(pScopeMemory) != NULL) { sciSetUsedWindow(scoGetWindowID(pScopeMemory)); pShortDraw = sciGetCurrentFigure(); sciGetPointerToUserData (pShortDraw,&user_data_ptr, &size_ptr); FREE(*user_data_ptr); *user_data_ptr=NULL; *size_ptr = 0; scoDelCoupleOfSegments(pScopeMemory); } } scoFreeScopeMemory(_work,&pScopeMemory); break; } } }