/*
 * Pointer transfer between s-functions
 *
 * File name: sfun_destination.cpp
 * Author: Michal Kutil
 * Email: kutilm@fel.cvut.cz
 * Copyright (c) 2005
 *
 * $Id: sfun_destination.cpp,v 1.1.1.1 2005/07/07 08:56:45 kutilm Exp $
 */

#define S_FUNCTION_LEVEL 2
#define S_FUNCTION_NAME sfun_destination

#include "simstruc.h"
#include "myclass.h"

// Initialization
static void mdlInitializeSizes(SimStruct *S)
{
    // Data type definition
    #include "datatype_myclass.cpp"

    // IO definition   
    if (!ssSetNumInputPorts(S, 1)) return;
    ssSetInputPortDataType(S, 0, data_type_id);
    ssSetInputPortWidth(S, 0, 1);
    if (!ssSetNumOutputPorts(S, 1)) return;      
    ssSetOutputPortWidth(S, 0, 1);

    // Memory space for pointer to my class
    ssSetNumPWork(S, 1);
}

// Sample time initialization
static void mdlInitializeSampleTimes(SimStruct *S)
{
    ssSetSampleTime(S, 0, INHERITED_SAMPLE_TIME);    
}

#undef MDL_START 

// Block update
#define MDL_UPDATE
static void mdlUpdate(SimStruct* S, int_T tid)
{
    // convert double form input to pointer    
    InputRealPtrsType  u = ssGetInputPortRealSignalPtrs(S,0);
    MyClass *var_myclass = (MyClass*)((long int)(*u[0]));    
    ssGetPWork(S)[0] = (void *)var_myclass;    
}

// Block output
static void mdlOutputs(SimStruct *S, int_T tid)
{
    // Return number from object to output
    MyClass* var_myclass = (MyClass*) ssGetPWork(S)[0];
    real_T  *y = ssGetOutputPortRealSignal(S,0); 
    if (var_myclass == 0)
        y[0] = 0;
    else
        y[0] = var_myclass->number;    
}                                                

// Simulation terminate
static void mdlTerminate(SimStruct *S)
{
}

// Any necessary appendix
#ifdef  MATLAB_MEX_FILE
#include "simulink.c"
#else
#include "cg_sfun.h"
#endif
