Beispiel #1
0
/*--------------------------------------------------------------------------*/
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);
                }
            }
        }
    }