/*--------------------------------------------------------------------------*/ SCICOS_BLOCKS_IMPEXP void selector_m(scicos_block *block, int flag) { void *u = NULL; void *y = NULL; double *z = NULL; int nu = 0, mu = 0, ic = 0, nev = 0, nin = 0, so = 0; z = GetDstate(block); nin = GetNin(block); ic = (int)z[0]; if (flag < 3) { ic = 0; nev = GetNevIn(block); while (nev >= 1) { ic = ic + 1; nev = nev / 2; } } if (nin > 1) { mu = GetInPortRows(block, ic); nu = GetInPortCols(block, ic); u = GetInPortPtrs(block, ic); so = GetSizeOfOut(block, 1); y = GetOutPortPtrs(block, 1); memcpy(y, u, mu * nu * so); } else { mu = GetInPortRows(block, 1); nu = GetInPortCols(block, 1); u = GetInPortPtrs(block, 1); y = GetOutPortPtrs(block, ic); so = GetSizeOfIn(block, 1); memcpy(y, u, mu * nu * so); } }
void sci_zeroOrderHold(scicos_block *block,scicos::enumScicosFlags flag) { // get block data pointers, etc double *_z=GetDstate(block); double *_u1=GetRealInPortPtrs(block,1); double *_u2=GetRealInPortPtrs(block,2); double *_y1=GetRealOutPortPtrs(block,1); int *_ipar=GetIparPtrs(block); int & evtFlag = GetNevIn(block); int & evtPortTime = _ipar[0]; int & evtPortReset = _ipar[1]; // compute flags int evtFlagTime = scicos::evtPortNumToFlag(evtPortTime); int evtFlagReset = scicos::evtPortNumToFlag(evtPortReset); // loop over all rows of data int i,j; int nRows = GetInPortRows(block,1); int nCols = GetInPortCols(block,1); size_t nBytes = sizeof(double)*nRows*nCols; for(i=0; i<nRows; i++) { for(j=0; j<nCols; j++) { if (flag ==scicos::computeOutput || flag ==scicos::reinitialize || flag ==scicos::initialize) memcpy(_y1,_z,nBytes); else if (flag == scicos::updateState) { // bitwise comparison for flag if(evtFlag & evtFlagReset && _u2) { memcpy(_z,_u2,nBytes); } else if(evtFlag & evtFlagTime && _u1) { memcpy(_z,_u1,nBytes); } else { printf("\nunhandled event flat %d\n",evtFlag); printf("\nknown flags:\n"); printf("\ttime flag: %d\n",evtFlagTime); printf("\ttime flag & event flag: %d\n",evtFlagTime & evtFlag); printf("\treset flag: %d\n",evtFlagReset); printf("\treset flag & event flag: %d\n",evtFlagReset & evtFlag); } } else if (flag == scicos::terminate) { } else { char msg[50]; sprintf(msg,"unhandled block flag %d\n",flag); Coserror(msg); } } } }