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

#define S_FUNCTION_LEVEL 2
#define S_FUNCTION_NAME sfun_source

#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;
    ssSetInputPortWidth(S, 0, 1);
    if (!ssSetNumOutputPorts(S, 1)) return;
    ssSetOutputPortDataType(S, 0, data_type_id);
    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);
}

// Start
#define MDL_START
static void mdlStart(SimStruct *S)
{
    // Instance of MyClass creating
    MyClass* var_myclass = new MyClass;
    ssGetPWork(S)[0] = (void *) var_myclass;
}

// Block update
#define MDL_UPDATE
static void mdlUpdate(SimStruct* S, int_T tid)
{
    // save data from input to object
    MyClass* var_myclass = (MyClass*) ssGetPWork(S)[0];
    InputRealPtrsType  u = ssGetInputPortRealSignalPtrs(S,0);
    var_myclass->number = *u[0];
}

// Block output
static void mdlOutputs(SimStruct *S, int_T tid)
{
    // Retype pointer to MyClass to double
    MyClass* var_myclass = (MyClass*) ssGetPWork(S)[0];
    real_T  *y = ssGetOutputPortRealSignal(S,0);
    y[0] = (long int)var_myclass;
}

// Simulation terminate
static void mdlTerminate(SimStruct *S)
{
    // Destructor for object MyClass
    MyClass* var_myclass = (MyClass*) ssGetPWork(S)[0];
    delete var_myclass;
}


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

