/*
 * File: EEPROM_Speicher.cpp
 *
 *
 *   --- THIS FILE GENERATED BY S-FUNCTION BUILDER: 3.0 ---
 *
 *   This file is an S-function produced by the S-Function
 *   Builder which only recognizes certain fields.  Changes made
 *   outside these fields will be lost the next time the block is
 *   used to load, edit, and resave this file. This file will be overwritten
 *   by the S-function Builder block. If you want to edit this file by hand,
 *   you must change it only in the area defined as:
 *
 *        %%%-SFUNWIZ_defines_Changes_BEGIN
 *        #define NAME 'replacement text'
 *        %%% SFUNWIZ_defines_Changes_END
 *
 *   DO NOT change NAME--Change the 'replacement text' only.
 *
 *   For better compatibility with the Simulink Coder, the
 *   "wrapper" S-function technique is used.  This is discussed
 *   in the Simulink Coder's Manual in the Chapter titled,
 *   "Wrapper S-functions".
 *
 *  -------------------------------------------------------------------------
 * | See matlabroot/simulink/src/sfuntmpl_doc.c for a more detailed template |
 *  -------------------------------------------------------------------------
 *
 * Created: Mon Jan 15 02:40:11 2024
 */

#define S_FUNCTION_LEVEL               2
#define S_FUNCTION_NAME                EEPROM_Speicher

/*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
/* %%%-SFUNWIZ_defines_Changes_BEGIN --- EDIT HERE TO _END */
#define NUM_INPUTS                     2

/* Input Port  0 */
#define IN_PORT_0_NAME                 EingabePIN
#define INPUT_0_DIMS_ND                {1,4}
#define INPUT_0_NUM_ELEMS              4
#define INPUT_0_WIDTH                  1
#define INPUT_DIMS_0_COL               4
#define INPUT_0_DTYPE                  uint8_T
#define INPUT_0_COMPLEX                COMPLEX_NO
#define IN_0_BUS_BASED                 0
#define IN_0_BUS_NAME
#define IN_0_DIMS                      2-D
#define INPUT_0_FEEDTHROUGH            1
#define IN_0_ISSIGNED                  0
#define IN_0_WORDLENGTH                8
#define IN_0_FIXPOINTSCALING           1
#define IN_0_FRACTIONLENGTH            9
#define IN_0_BIAS                      0
#define IN_0_SLOPE                     0.125

/* Input Port  1 */
#define IN_PORT_1_NAME                 PinStatus
#define INPUT_1_DIMS_ND                {1,1}
#define INPUT_1_NUM_ELEMS              1
#define INPUT_1_WIDTH                  1
#define INPUT_DIMS_1_COL               1
#define INPUT_1_DTYPE                  uint8_T
#define INPUT_1_COMPLEX                COMPLEX_NO
#define IN_1_BUS_BASED                 0
#define IN_1_BUS_NAME
#define IN_1_DIMS                      1-D
#define INPUT_1_FEEDTHROUGH            1
#define IN_1_ISSIGNED                  0
#define IN_1_WORDLENGTH                8
#define IN_1_FIXPOINTSCALING           1
#define IN_1_FRACTIONLENGTH            9
#define IN_1_BIAS                      0
#define IN_1_SLOPE                     0.125
#define NUM_OUTPUTS                    1

/* Output Port  0 */
#define OUT_PORT_0_NAME                PIN
#define OUTPUT_0_DIMS_ND               {1,4}
#define OUTPUT_0_NUM_ELEMS             4
#define OUTPUT_0_WIDTH                 1
#define OUTPUT_DIMS_0_COL              4
#define OUTPUT_0_DTYPE                 uint8_T
#define OUTPUT_0_COMPLEX               COMPLEX_NO
#define OUT_0_BUS_BASED                0
#define OUT_0_BUS_NAME
#define OUT_0_DIMS                     2-D
#define OUT_0_ISSIGNED                 1
#define OUT_0_WORDLENGTH               8
#define OUT_0_FIXPOINTSCALING          1
#define OUT_0_FRACTIONLENGTH           3
#define OUT_0_BIAS                     0
#define OUT_0_SLOPE                    0.125
#define NPARAMS                        0
#define SAMPLE_TIME_0                  0
#define NUM_DISC_STATES                1
#define DISC_STATES_IC                 [0]
#define NUM_CONT_STATES                0
#define CONT_STATES_IC                 [0]
#define SFUNWIZ_GENERATE_TLC           1
#define SOURCEFILES                    "__SFB__"
#define PANELINDEX                     N/A
#define USE_SIMSTRUCT                  0
#define SHOW_COMPILE_STEPS             0
#define CREATE_DEBUG_MEXFILE           0
#define SAVE_CODE_ONLY                 1
#define SFUNWIZ_REVISION               3.0

/* %%%-SFUNWIZ_defines_Changes_END --- EDIT HERE TO _BEGIN */
/*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
#include "simstruc.h"

extern void EEPROM_Speicher_Outputs_wrapper(const uint8_T *EingabePIN,
  const uint8_T *PinStatus,
  uint8_T *PIN,
  const real_T *xD);
extern void EEPROM_Speicher_Update_wrapper(const uint8_T *EingabePIN,
  const uint8_T *PinStatus,
  uint8_T *PIN,
  real_T *xD);

/*====================*
 * S-function methods *
 *====================*/
/* Function: mdlInitializeSizes ===============================================
 * Abstract:
 *   Setup sizes of the various vectors.
 */
static void mdlInitializeSizes(SimStruct *S)
{
  DECL_AND_INIT_DIMSINFO(inputDimsInfo);
  DECL_AND_INIT_DIMSINFO(outputDimsInfo);
  ssSetNumSFcnParams(S, NPARAMS);
  if (ssGetNumSFcnParams(S) != ssGetSFcnParamsCount(S)) {
    return;                            /* Parameter mismatch will be reported by Simulink */
  }

  ssSetArrayLayoutForCodeGen(S, SS_COLUMN_MAJOR);
  ssSetOperatingPointCompliance(S, USE_DEFAULT_OPERATING_POINT);
  ssSetNumContStates(S, NUM_CONT_STATES);
  ssSetNumDiscStates(S, NUM_DISC_STATES);
  if (!ssSetNumInputPorts(S, NUM_INPUTS))
    return;

  /* Input Port 0 */
  ssAllowSignalsWithMoreThan2D(S);
  inputDimsInfo.numDims = 2;
  inputDimsInfo.width = INPUT_0_NUM_ELEMS;
  int_T in0Dims[] = INPUT_0_DIMS_ND;
  inputDimsInfo.dims = in0Dims;
  ssSetInputPortDimensionInfo(S, 0, &inputDimsInfo);
  ssSetInputPortDataType(S, 0, SS_UINT8);
  ssSetInputPortComplexSignal(S, 0, INPUT_0_COMPLEX);
  ssSetInputPortDirectFeedThrough(S, 0, INPUT_0_FEEDTHROUGH);
  ssSetInputPortRequiredContiguous(S, 0, 1);/*direct input signal access*/

  /* Input Port 1 */
  ssSetInputPortWidth(S, 1, INPUT_1_NUM_ELEMS);
  ssSetInputPortDataType(S, 1, SS_UINT8);
  ssSetInputPortComplexSignal(S, 1, INPUT_1_COMPLEX);
  ssSetInputPortDirectFeedThrough(S, 1, INPUT_1_FEEDTHROUGH);
  ssSetInputPortRequiredContiguous(S, 1, 1);/*direct input signal access*/
  if (!ssSetNumOutputPorts(S, NUM_OUTPUTS))
    return;

  /* Output Port 0 */
  outputDimsInfo.numDims = 2;
  outputDimsInfo.width = OUTPUT_0_NUM_ELEMS;
  int_T out0Dims[] = OUTPUT_0_DIMS_ND;
  outputDimsInfo.dims = out0Dims;
  ssSetOutputPortDimensionInfo(S, 0, &outputDimsInfo);
  ssSetOutputPortDataType(S, 0, SS_UINT8);
  ssSetOutputPortComplexSignal(S, 0, OUTPUT_0_COMPLEX);
  ssSetNumPWork(S, 0);
  ssSetNumSampleTimes(S, 1);
  ssSetNumRWork(S, 0);
  ssSetNumIWork(S, 0);
  ssSetNumModes(S, 0);
  ssSetNumNonsampledZCs(S, 0);
  ssSetSimulinkVersionGeneratedIn(S, "23.2");

  /* Take care when specifying exception free code - see sfuntmpl_doc.c */
  ssSetRuntimeThreadSafetyCompliance(S, RUNTIME_THREAD_SAFETY_COMPLIANCE_FALSE);
  ssSetOptions(S, (SS_OPTION_EXCEPTION_FREE_CODE |
                   SS_OPTION_USE_TLC_WITH_ACCELERATOR |
                   SS_OPTION_WORKS_WITH_CODE_REUSE));
}

#if defined(MATLAB_MEX_FILE)
#define MDL_SET_INPUT_PORT_DIMENSION_INFO

static void mdlSetInputPortDimensionInfo(SimStruct *S,
  int_T port,
  const DimsInfo_T *dimsInfo)
{
  if (!ssSetInputPortDimensionInfo(S, port, dimsInfo))
    return;
}

#endif

#define MDL_SET_OUTPUT_PORT_DIMENSION_INFO
#if defined(MDL_SET_OUTPUT_PORT_DIMENSION_INFO)

static void mdlSetOutputPortDimensionInfo(SimStruct *S,
  int_T port,
  const DimsInfo_T *dimsInfo)
{
  if (!ssSetOutputPortDimensionInfo(S, port, dimsInfo))
    return;
}

#endif

#define MDL_SET_DEFAULT_PORT_DIMENSION_INFO

static void mdlSetDefaultPortDimensionInfo(SimStruct *S)
{
  DECL_AND_INIT_DIMSINFO(portDimsInfo);
  int_T dims[2];

  /* Setting default dimensions for input port 0 */
  portDimsInfo.width = INPUT_0_NUM_ELEMS;
  dims[0] = INPUT_0_NUM_ELEMS;
  dims[1] = 1;
  portDimsInfo.dims = dims;
  portDimsInfo.numDims = 2;
  if (ssGetInputPortWidth(S, 0) == DYNAMICALLY_SIZED) {
    ssSetInputPortMatrixDimensions(S, 0, 1 , 1);
  }

  /* Setting default dimensions for output port 0 */
  portDimsInfo.width = OUTPUT_0_NUM_ELEMS;
  dims[0] = OUTPUT_0_NUM_ELEMS;
  dims[1] = 1;
  portDimsInfo.numDims = 2;
  if (ssGetOutputPortNumDimensions(S, 0) == (-1)) {
    ssSetOutputPortDimensionInfo(S, 0, &portDimsInfo);
  }

  return;
}

/* Function: mdlInitializeSampleTimes =========================================
 * Abstract:
 *    Specifiy  the sample time.
 */
static void mdlInitializeSampleTimes(SimStruct *S)
{
  ssSetSampleTime(S, 0, SAMPLE_TIME_0);
  ssSetModelReferenceSampleTimeDefaultInheritance(S);
  ssSetOffsetTime(S, 0, 0.0);
}

#define MDL_INITIALIZE_CONDITIONS

/* Function: mdlInitializeConditions ========================================
 * Abstract:
 *    Initialize the states
 */
static void mdlInitializeConditions(SimStruct *S)
{
  real_T *xD = ssGetRealDiscStates(S);
  xD[0] = 0;
}

#define MDL_SET_INPUT_PORT_DATA_TYPE

static void mdlSetInputPortDataType(SimStruct *S, int port, DTypeId dType)
{
  ssSetInputPortDataType(S, 0, dType);
}

#define MDL_SET_OUTPUT_PORT_DATA_TYPE

static void mdlSetOutputPortDataType(SimStruct *S, int port, DTypeId dType)
{
  ssSetOutputPortDataType(S, 0, dType);
}

#define MDL_SET_DEFAULT_PORT_DATA_TYPES

static void mdlSetDefaultPortDataTypes(SimStruct *S)
{
  ssSetInputPortDataType(S, 0, SS_DOUBLE);
  ssSetOutputPortDataType(S, 0, SS_DOUBLE);
}

#define MDL_START                                                /* Change to #undef to remove function */
#if defined(MDL_START)

/* Function: mdlStart =======================================================
 * Abstract:
 *    This function is called once at start of model execution. If you
 *    have states that should be initialized once, this is the place
 *    to do it.
 */
static void mdlStart(SimStruct *S)
{
}

#endif                                 /*  MDL_START */

/* Function: mdlOutputs =======================================================
 *
 */
static void mdlOutputs(SimStruct *S, int_T tid)
{
  const uint8_T *EingabePIN = (uint8_T *) ssGetInputPortRealSignal(S, 0);
  const uint8_T *PinStatus = (uint8_T *) ssGetInputPortRealSignal(S, 1);
  uint8_T *PIN = (uint8_T *) ssGetOutputPortRealSignal(S, 0);
  const real_T *xD = ssGetDiscStates(S);
  EEPROM_Speicher_Outputs_wrapper(EingabePIN, PinStatus, PIN, xD);
}

#define MDL_UPDATE                                               /* Change to #undef to remove function */
#if defined(MDL_UPDATE)

/* Function: mdlUpdate ======================================================
 * Abstract:
 *    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(SimStruct *S, int_T tid)
{
  const uint8_T *EingabePIN = (uint8_T *) ssGetInputPortRealSignal(S, 0);
  const uint8_T *PinStatus = (uint8_T *) ssGetInputPortRealSignal(S, 1);
  uint8_T *PIN = (uint8_T *) ssGetOutputPortRealSignal(S, 0);
  real_T *xD = ssGetDiscStates(S);
  EEPROM_Speicher_Update_wrapper(EingabePIN, PinStatus, PIN, xD);
}

#endif                                 /* MDL_UPDATE */

/* Function: mdlTerminate =====================================================
 * Abstract:
 *    In this function, you should perform any actions that are necessary
 *    at the termination of a simulation.  For example, if memory was
 *    allocated in mdlStart, this is the place to free it.
 */
static void mdlTerminate(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
