www.pudn.com > communicationmatlab.rar > SIMDE2BI.C


/* 
 * Wes Wang 6/14/94 
 * Copyright (c) 1994-96 The MathWorks, Inc. 
 * All Rights Reserved 
 * $Revision: 1.1 $  $Date: 1996/04/01 19:04:30 $ 
 */ 
 
#include "simstruc.h" 
/* specify the name of this S-Function. */ 
#define S_FUNCTION_NAME simde2bi 
 
/* Defines for easy access  the matrices which are passed in */ 
#define NUM_ARGS    2  
#define BUFF_LEN    ssGetArg(S, 0) 
#define CAL_BASE    ssGetArg(S, 1) 
 
/* 
 * mdlInitializeSizes - initialize the sizes array 
 */ 
 
static void mdlInitializeSizes (S) 
    SimStruct *S; 
{ 
        int outSize; 
        outSize = (int)mxGetPr(BUFF_LEN)[0];     
        ssSetNumContStates(    S, 0); /* number of continuous states */ 
        ssSetNumDiscStates(    S, 0);       /* number of discrete states */ 
        ssSetNumInputs    (    S, 1);   /* number of inputs */ 
        ssSetNumOutputs   (    S, outSize);   /* number of outputs */ 
        ssSetDirectFeedThrough(S, 1);       /* direct feedthrough flag */ 
        ssSetNumSampleTimes(   S, 1);       /* number of sample times */ 
        ssSetNumInputArgs(     S, NUM_ARGS);/* number of input arguments */ 
        ssSetNumRWork(         S, 0);       /* number of real work vector elements */ 
        ssSetNumIWork(         S, 0);      /* number of integer work vector elements */ 
        ssSetNumPWork(         S, 0);      /* number of pointer work vector elements */ 
} 
 
/* 
 * mdlInitializeSampleTimes - initialize the sample times array 
 * 
 * This function is used to specify the sample time(s) for your S-function. 
 * If your S-function is continuous, you must specify a sample time of 0.0. 
 * Sample times must be registered in ascending order. 
 */ 
 
static void mdlInitializeSampleTimes(S) 
    SimStruct *S; 
{ 
    ssSetSampleTimeEvent(S, 0, 0.0); 
    ssSetOffsetTimeEvent(S, 0, 0.0); 
} 
 
/* 
 * mdlInitializeConditions - initialize the states 
 * Initialize the states, Integers and real-numbers 
 */ 
 
static void mdlInitializeConditions(x0, S) 
        double *x0; 
        SimStruct *S; 
{ 
} 
 
/* 
 * mdlOutputs - compute the outputs 
 * 
 * In this function, you compute the outputs of your S-function 
 * block.  The outputs are placed in the y variable. 
 */ 
 
static void mdlOutputs(y, x, u, S, tid) 
    double *y, *x, *u; 
    SimStruct *S; 
    int tid; 
{ 
    long outSize, i, p; 
    long inNum; 
 
    inNum = (int)u[0]; 
    outSize = (int)mxGetPr(BUFF_LEN)[0]; 
    p = (int)mxGetPr(CAL_BASE)[0]; 
    if (p < 2) 
        p = 2;        
    if (inNum > 0) { 
        for (i=0; i < outSize; i++) { 
            y[i] = inNum % p; 
            inNum /= p; 
         } 
    } else { 
        for (i=0; i < outSize; i++) 
                y[i] = 0; 
    } 
} 
 
 
/* 
 * mdlUpdate - perform action at major integration time step 
 * 
 * This function is called once for every major integration time step. 
 * Discrete states are typically updated here, but this function is useful 
 * for performing any tasks that should only take place once per integration 
 * step. 
 */ 
 
static void mdlUpdate(x, u, S, tid) 
    double *x, *u; 
    SimStruct *S; 
    int tid; 
{ 
} 
 
/* 
 * mdlDerivatives - compute the derivatives 
 * 
 * In this function, you compute the S-function block's derivatives. 
 * The derivatives are placed in the dx variable. 
 */ 
 
static void mdlDerivatives(dx, x, u, S, tid) 
    double *dx, *x, *u; 
    SimStruct *S; 
    int tid; 
{ 
} 
 
/* 
 * mdlTerminate - called when the simulation is terminated. 
 * 
 * In this function, you should perform any actions that are necessary 
 * at the termination of a simulation.  For example, if memory was allocated 
 * in mdlInitializeConditions, this is the place to free it. 
 */ 
 
static void mdlTerminate(S) 
    SimStruct *S; 
{ 
} 
 
#ifdef      MATLAB_MEX_FILE    /* Is this file being compiled as a MEX-file? */ 
#include "simulink.c"      /* MEX-file interface mechanism */ 
#else 
#include "cg_sfun.h"       /* Code generation registration function */ 
#endif