コード例 #1
0
static void mdlStart_c2_DYNctl_ver4_etud_nonlineaire(SimStruct *S)
{
  SFc2_DYNctl_ver4_etud_nonlineaireInstanceStruct *chartInstance;
  ChartRunTimeInfo * crtInfo = (ChartRunTimeInfo *)utMalloc(sizeof
    (ChartRunTimeInfo));
  chartInstance = (SFc2_DYNctl_ver4_etud_nonlineaireInstanceStruct *)utMalloc
    (sizeof(SFc2_DYNctl_ver4_etud_nonlineaireInstanceStruct));
  memset(chartInstance, 0, sizeof
         (SFc2_DYNctl_ver4_etud_nonlineaireInstanceStruct));
  if (chartInstance==NULL) {
    sf_mex_error_message("Could not allocate memory for chart instance.");
  }

  chartInstance->chartInfo.chartInstance = chartInstance;
  chartInstance->chartInfo.isEMLChart = 1;
  chartInstance->chartInfo.chartInitialized = 0;
  chartInstance->chartInfo.sFunctionGateway =
    sf_opaque_gateway_c2_DYNctl_ver4_etud_nonlineaire;
  chartInstance->chartInfo.initializeChart =
    sf_opaque_initialize_c2_DYNctl_ver4_etud_nonlineaire;
  chartInstance->chartInfo.terminateChart =
    sf_opaque_terminate_c2_DYNctl_ver4_etud_nonlineaire;
  chartInstance->chartInfo.enableChart =
    sf_opaque_enable_c2_DYNctl_ver4_etud_nonlineaire;
  chartInstance->chartInfo.disableChart =
    sf_opaque_disable_c2_DYNctl_ver4_etud_nonlineaire;
  chartInstance->chartInfo.getSimState =
    sf_opaque_get_sim_state_c2_DYNctl_ver4_etud_nonlineaire;
  chartInstance->chartInfo.setSimState =
    sf_opaque_set_sim_state_c2_DYNctl_ver4_etud_nonlineaire;
  chartInstance->chartInfo.getSimStateInfo =
    sf_get_sim_state_info_c2_DYNctl_ver4_etud_nonlineaire;
  chartInstance->chartInfo.zeroCrossings = NULL;
  chartInstance->chartInfo.outputs = NULL;
  chartInstance->chartInfo.derivatives = NULL;
  chartInstance->chartInfo.mdlRTW = mdlRTW_c2_DYNctl_ver4_etud_nonlineaire;
  chartInstance->chartInfo.mdlStart = mdlStart_c2_DYNctl_ver4_etud_nonlineaire;
  chartInstance->chartInfo.mdlSetWorkWidths =
    mdlSetWorkWidths_c2_DYNctl_ver4_etud_nonlineaire;
  chartInstance->chartInfo.extModeExec = NULL;
  chartInstance->chartInfo.restoreLastMajorStepConfiguration = NULL;
  chartInstance->chartInfo.restoreBeforeLastMajorStepConfiguration = NULL;
  chartInstance->chartInfo.storeCurrentConfiguration = NULL;
  chartInstance->chartInfo.callAtomicSubchartUserFcn = NULL;
  chartInstance->chartInfo.callAtomicSubchartAutoFcn = NULL;
  chartInstance->chartInfo.debugInstance = sfGlobalDebugInstanceStruct;
  chartInstance->S = S;
  crtInfo->checksum = SF_RUNTIME_INFO_CHECKSUM;
  crtInfo->instanceInfo = (&(chartInstance->chartInfo));
  crtInfo->isJITEnabled = false;
  crtInfo->compiledInfo = NULL;
  ssSetUserData(S,(void *)(crtInfo));  /* register the chart instance with simstruct */
  init_dsm_address_info(chartInstance);
  init_simulink_io_address(chartInstance);
  if (!sim_mode_is_rtw_gen(S)) {
  }

  sf_opaque_init_subchart_simstructs(chartInstance->chartInfo.chartInstance);
  chart_debug_initialization(S,1);
}
コード例 #2
0
ファイル: rtw_modelmap_utils.c プロジェクト: Shedino/Firmware
/** Function: rtwCAPI_UpdateFullPaths =========================================*
 *
 */
const char_T* rtwCAPI_UpdateFullPaths(rtwCAPI_ModelMappingInfo* mmi,
                                      const char_T* path,
                                      boolean_T isCalledFromTopModel)
{
    int_T         i;
    int_T         nCMMI;
    size_t        pathLen;
    char_T*       mmiPath;
    size_t        mmiPathLen;
    char_T*       relMMIPath;
    size_t        relMMIPathLen;

    if (mmi == NULL) return NULL;

    utAssert(path != NULL);
    utAssert( rtwCAPI_GetFullPath(mmi) == NULL );

    pathLen = strlen(path)+1;

    if (isCalledFromTopModel) {
        /* If called from top model - FullPath is same as path */
        mmiPath = (char_T*)utMalloc(pathLen*sizeof(char_T));
        (void)memcpy(mmiPath, path, pathLen*sizeof(char_T));
    }
    else {        
        relMMIPath = rtwCAPI_EncodePath(rtwCAPI_GetPath(mmi));
        if ( (relMMIPath== NULL) && (rtwCAPI_GetPath(mmi) != NULL)) {
            return rtwCAPI_mallocError;
        }
        relMMIPathLen = relMMIPath ? (strlen(relMMIPath) + 1) : 0;
        
        mmiPathLen = pathLen + relMMIPathLen;
        
        mmiPath = (char_T*)utMalloc(mmiPathLen*sizeof(char_T));
        if (mmiPath == NULL) return rtwCAPI_mallocError;
        (void)memcpy(mmiPath, path, pathLen*sizeof(char_T));
        utAssert(mmiPath[pathLen-1] == '\0');
        
        if (relMMIPath) {
            /* mmiPath = path + | + relMMIPath + '\0' */
            mmiPath[pathLen-1] = '|';
            (void)memcpy(&(mmiPath[pathLen]),
                         relMMIPath, relMMIPathLen*sizeof(char_T));
            utAssert(mmiPath[mmiPathLen-1] == '\0');
            utFree(relMMIPath);
        }
    }
    rtwCAPI_SetFullPath(*mmi, mmiPath);

    nCMMI = rtwCAPI_GetChildMMIArrayLen(mmi);
    for (i = 0; i < nCMMI; ++i) {
        rtwCAPI_ModelMappingInfo* cMMI = rtwCAPI_GetChildMMI(mmi,i);
        const char_T* errstr = rtwCAPI_UpdateFullPaths(cMMI, mmiPath, 0);
        if (errstr != NULL) return errstr;
    }
    return NULL;

} /* rtwCAPI_UpdateFullPaths */
コード例 #3
0
static void mdlStart_c13_ARP_02_RPSs_Bdr_GK_BIS5(SimStruct *S)
{
  SFc13_ARP_02_RPSs_Bdr_GK_BIS5InstanceStruct *chartInstance;
  ChartRunTimeInfo * crtInfo = (ChartRunTimeInfo *)utMalloc(sizeof
    (ChartRunTimeInfo));
  chartInstance = (SFc13_ARP_02_RPSs_Bdr_GK_BIS5InstanceStruct *)utMalloc(sizeof
    (SFc13_ARP_02_RPSs_Bdr_GK_BIS5InstanceStruct));
  memset(chartInstance, 0, sizeof(SFc13_ARP_02_RPSs_Bdr_GK_BIS5InstanceStruct));
  if (chartInstance==NULL) {
    sf_mex_error_message("Could not allocate memory for chart instance.");
  }

  chartInstance->chartInfo.chartInstance = chartInstance;
  chartInstance->chartInfo.isEMLChart = 1;
  chartInstance->chartInfo.chartInitialized = 0;
  chartInstance->chartInfo.sFunctionGateway =
    sf_opaque_gateway_c13_ARP_02_RPSs_Bdr_GK_BIS5;
  chartInstance->chartInfo.initializeChart =
    sf_opaque_initialize_c13_ARP_02_RPSs_Bdr_GK_BIS5;
  chartInstance->chartInfo.terminateChart =
    sf_opaque_terminate_c13_ARP_02_RPSs_Bdr_GK_BIS5;
  chartInstance->chartInfo.enableChart =
    sf_opaque_enable_c13_ARP_02_RPSs_Bdr_GK_BIS5;
  chartInstance->chartInfo.disableChart =
    sf_opaque_disable_c13_ARP_02_RPSs_Bdr_GK_BIS5;
  chartInstance->chartInfo.getSimState =
    sf_opaque_get_sim_state_c13_ARP_02_RPSs_Bdr_GK_BIS5;
  chartInstance->chartInfo.setSimState =
    sf_opaque_set_sim_state_c13_ARP_02_RPSs_Bdr_GK_BIS5;
  chartInstance->chartInfo.getSimStateInfo =
    sf_get_sim_state_info_c13_ARP_02_RPSs_Bdr_GK_BIS5;
  chartInstance->chartInfo.zeroCrossings = NULL;
  chartInstance->chartInfo.outputs = NULL;
  chartInstance->chartInfo.derivatives = NULL;
  chartInstance->chartInfo.mdlRTW = mdlRTW_c13_ARP_02_RPSs_Bdr_GK_BIS5;
  chartInstance->chartInfo.mdlStart = mdlStart_c13_ARP_02_RPSs_Bdr_GK_BIS5;
  chartInstance->chartInfo.mdlSetWorkWidths =
    mdlSetWorkWidths_c13_ARP_02_RPSs_Bdr_GK_BIS5;
  chartInstance->chartInfo.extModeExec = NULL;
  chartInstance->chartInfo.restoreLastMajorStepConfiguration = NULL;
  chartInstance->chartInfo.restoreBeforeLastMajorStepConfiguration = NULL;
  chartInstance->chartInfo.storeCurrentConfiguration = NULL;
  chartInstance->chartInfo.debugInstance = sfGlobalDebugInstanceStruct;
  chartInstance->S = S;
  crtInfo->instanceInfo = (&(chartInstance->chartInfo));
  crtInfo->isJITEnabled = false;
  ssSetUserData(S,(void *)(crtInfo));  /* register the chart instance with simstruct */
  init_dsm_address_info(chartInstance);
  if (!sim_mode_is_rtw_gen(S)) {
  }

  sf_opaque_init_subchart_simstructs(chartInstance->chartInfo.chartInstance);
  chart_debug_initialization(S,1);
}
コード例 #4
0
ファイル: rtw_modelmap_utils.c プロジェクト: Shedino/Firmware
/** Function: rtwCAPI_EncodePath ===============================================
 *  Abatract:
 *     Escape all '|' characters in bpath. For examples 'aaa|b' will become
 *     'aaa~|b'. The caller is responsible for freeing the returned string
 *
 *
 * NOTE: returned string can be NULL in two cases:
 *     (1) string passed in was NULL
 *     (2) a memory allocation error occurred
 * In the second case, the caller need to report the error
 */
char* rtwCAPI_EncodePath(const char* path)
{
    char* encodedPath     = NULL;
    size_t pathLen        = (path==NULL) ? 0:strlen(path) + 1;
    size_t encodedPathLen = pathLen;
    unsigned i;
    unsigned j = 0;

    if (path == NULL) return NULL;

    for (i = 0; i < pathLen; ++i) {
        if (path[i] == '|' || path[i] == '~') ++encodedPathLen;
    }

    encodedPath = (char_T*)utMalloc(encodedPathLen*sizeof(char_T));
    if (encodedPath == NULL) return encodedPath;

    for (i = 0; i < pathLen; ++i) {
        char ch = path[i];
        if (ch == '~' || ch == '|') encodedPath[j++] = '~';
        encodedPath[j++] = ch;
    }
    utAssert(j == encodedPathLen);
    utAssert(encodedPath[j-1] == '\0');

    return encodedPath;

} /* rtwCAPI_EncodePath */
コード例 #5
0
ファイル: rtw_modelmap_utils.c プロジェクト: Shedino/Firmware
/** Function: rtwCAPI_GetFullStateBlockPath ===================================
 *
 */
char* rtwCAPI_GetFullStateBlockPath(const char* stateBlockPath,
                                           const char* mmiPath,
                                           size_t      mmiPathLen,
                                           boolean_T   crossingModel)
{
    char_T* blockPath          = NULL;
    char_T* fullStateBlockPath = NULL;
    size_t     fullStateBlockPathLen;

    if (stateBlockPath == NULL) goto EXIT_POINT;

    /* fullStateBlockPath = mmiPath + | + blockPath + '\0' */
    /* If crossing a model boundary encode, otherwise do not */

    if (crossingModel) {
        blockPath = rtwCAPI_EncodePath(stateBlockPath);
        if (blockPath == NULL) goto EXIT_POINT;
    } else {
        size_t len = strlen(stateBlockPath)+1;
        blockPath = (char*)utMalloc(len*sizeof(char));
        if (blockPath == NULL) goto EXIT_POINT;
        (void)strcpy(blockPath,stateBlockPath);
    }
    utAssert(blockPath != NULL);
    fullStateBlockPathLen = ( (mmiPath==NULL) ?
                              strlen(blockPath) + 1 :
                              mmiPathLen + strlen(blockPath) + 2 );
    fullStateBlockPath    = (char*)utMalloc(fullStateBlockPathLen*sizeof(char));
    if (fullStateBlockPath == NULL) goto EXIT_POINT;

    if (mmiPath != NULL) {
        (void)strcpy(fullStateBlockPath, mmiPath);
        fullStateBlockPath[mmiPathLen]   = '|';
        fullStateBlockPath[mmiPathLen+1] =  '\0';
        (void)strcat(fullStateBlockPath, blockPath);
    } else {
        (void)strcpy(fullStateBlockPath, blockPath);
        fullStateBlockPath[fullStateBlockPathLen-1] =  '\0';
    }
    utAssert(fullStateBlockPath[fullStateBlockPathLen-1] == '\0');

  EXIT_POINT:
    utFree(blockPath);
    return fullStateBlockPath; /* caller is responsible for free */
}
コード例 #6
0
static void mdlStart_c4_MON_sl_after_replacement3(SimStruct *S)
{
  SFc4_MON_sl_after_replacement3InstanceStruct *chartInstance;
  chartInstance = (SFc4_MON_sl_after_replacement3InstanceStruct *)utMalloc
    (sizeof(SFc4_MON_sl_after_replacement3InstanceStruct));
  if (chartInstance==NULL) {
    sf_mex_error_message("Could not allocate memory for chart instance.");
  }

  memset(chartInstance, 0, sizeof(SFc4_MON_sl_after_replacement3InstanceStruct));
  chartInstance->chartInfo.chartInstance = chartInstance;
  chartInstance->chartInfo.isEMLChart = 0;
  chartInstance->chartInfo.chartInitialized = 0;
  chartInstance->chartInfo.sFunctionGateway =
    sf_opaque_gateway_c4_MON_sl_after_replacement3;
  chartInstance->chartInfo.initializeChart =
    sf_opaque_initialize_c4_MON_sl_after_replacement3;
  chartInstance->chartInfo.terminateChart =
    sf_opaque_terminate_c4_MON_sl_after_replacement3;
  chartInstance->chartInfo.enableChart =
    sf_opaque_enable_c4_MON_sl_after_replacement3;
  chartInstance->chartInfo.disableChart =
    sf_opaque_disable_c4_MON_sl_after_replacement3;
  chartInstance->chartInfo.getSimState =
    sf_opaque_get_sim_state_c4_MON_sl_after_replacement3;
  chartInstance->chartInfo.setSimState =
    sf_opaque_set_sim_state_c4_MON_sl_after_replacement3;
  chartInstance->chartInfo.getSimStateInfo =
    sf_get_sim_state_info_c4_MON_sl_after_replacement3;
  chartInstance->chartInfo.zeroCrossings = NULL;
  chartInstance->chartInfo.outputs = NULL;
  chartInstance->chartInfo.derivatives = NULL;
  chartInstance->chartInfo.mdlRTW = mdlRTW_c4_MON_sl_after_replacement3;
  chartInstance->chartInfo.mdlStart = mdlStart_c4_MON_sl_after_replacement3;
  chartInstance->chartInfo.mdlSetWorkWidths =
    mdlSetWorkWidths_c4_MON_sl_after_replacement3;
  chartInstance->chartInfo.callGetHoverDataForMsg =
    sf_opaque_get_hover_data_for_msg;
  chartInstance->chartInfo.extModeExec = NULL;
  chartInstance->chartInfo.restoreLastMajorStepConfiguration = NULL;
  chartInstance->chartInfo.restoreBeforeLastMajorStepConfiguration = NULL;
  chartInstance->chartInfo.storeCurrentConfiguration = NULL;
  chartInstance->chartInfo.callAtomicSubchartUserFcn = NULL;
  chartInstance->chartInfo.callAtomicSubchartAutoFcn = NULL;
  chartInstance->chartInfo.debugInstance = sfGlobalDebugInstanceStruct;
  chartInstance->S = S;
  sf_init_ChartRunTimeInfo(S, &(chartInstance->chartInfo), false, 0);
  init_dsm_address_info(chartInstance);
  init_simulink_io_address(chartInstance);
  if (!sim_mode_is_rtw_gen(S)) {
  }

  chart_debug_initialization(S,1);
  mdl_start_c4_MON_sl_after_replacement3(chartInstance);
}
static void mdlStart_c2_MigrationOWBG_Proto4_1DLinear2DNonLinear(SimStruct *S)
{
  SFc2_MigrationOWBG_Proto4_1DLinear2DNonLinearInstanceStruct *chartInstance;
  chartInstance = (SFc2_MigrationOWBG_Proto4_1DLinear2DNonLinearInstanceStruct *)
    utMalloc(sizeof(SFc2_MigrationOWBG_Proto4_1DLinear2DNonLinearInstanceStruct));
  memset(chartInstance, 0, sizeof
         (SFc2_MigrationOWBG_Proto4_1DLinear2DNonLinearInstanceStruct));
  if (chartInstance==NULL) {
    sf_mex_error_message("Could not allocate memory for chart instance.");
  }

  chartInstance->chartInfo.chartInstance = chartInstance;
  chartInstance->chartInfo.isEMLChart = 1;
  chartInstance->chartInfo.chartInitialized = 0;
  chartInstance->chartInfo.sFunctionGateway =
    sf_opaque_gateway_c2_MigrationOWBG_Proto4_1DLinear2DNonLinear;
  chartInstance->chartInfo.initializeChart =
    sf_opaque_initialize_c2_MigrationOWBG_Proto4_1DLinear2DNonLinear;
  chartInstance->chartInfo.terminateChart =
    sf_opaque_terminate_c2_MigrationOWBG_Proto4_1DLinear2DNonLinear;
  chartInstance->chartInfo.enableChart =
    sf_opaque_enable_c2_MigrationOWBG_Proto4_1DLinear2DNonLinear;
  chartInstance->chartInfo.disableChart =
    sf_opaque_disable_c2_MigrationOWBG_Proto4_1DLinear2DNonLinear;
  chartInstance->chartInfo.getSimState =
    sf_opaque_get_sim_state_c2_MigrationOWBG_Proto4_1DLinear2DNonLinear;
  chartInstance->chartInfo.setSimState =
    sf_opaque_set_sim_state_c2_MigrationOWBG_Proto4_1DLinear2DNonLinear;
  chartInstance->chartInfo.getSimStateInfo =
    sf_get_sim_state_info_c2_MigrationOWBG_Proto4_1DLinear2DNonLinear;
  chartInstance->chartInfo.zeroCrossings = NULL;
  chartInstance->chartInfo.outputs = NULL;
  chartInstance->chartInfo.derivatives = NULL;
  chartInstance->chartInfo.mdlRTW =
    mdlRTW_c2_MigrationOWBG_Proto4_1DLinear2DNonLinear;
  chartInstance->chartInfo.mdlStart =
    mdlStart_c2_MigrationOWBG_Proto4_1DLinear2DNonLinear;
  chartInstance->chartInfo.mdlSetWorkWidths =
    mdlSetWorkWidths_c2_MigrationOWBG_Proto4_1DLinear2DNonLinear;
  chartInstance->chartInfo.extModeExec = NULL;
  chartInstance->chartInfo.restoreLastMajorStepConfiguration = NULL;
  chartInstance->chartInfo.restoreBeforeLastMajorStepConfiguration = NULL;
  chartInstance->chartInfo.storeCurrentConfiguration = NULL;
  chartInstance->S = S;
  ssSetUserData(S,(void *)(&(chartInstance->chartInfo)));/* register the chart instance with simstruct */
  init_dsm_address_info(chartInstance);
  if (!sim_mode_is_rtw_gen(S)) {
  }

  sf_opaque_init_subchart_simstructs(chartInstance->chartInfo.chartInstance);
  chart_debug_initialization(S,1);
}
コード例 #8
0
ファイル: Deadbeat_CUK_acc.c プロジェクト: Velocar/Bikair_MBD
boolean_T Deadbeat_CUK_acc_rt_TDelayUpdateTailOrGrowBuf ( int_T * bufSzPtr ,
int_T * tailPtr , int_T * headPtr , int_T * lastPtr , real_T tMinusDelay ,
real_T * * tBufPtr , real_T * * uBufPtr , real_T * * xBufPtr , boolean_T
isfixedbuf , boolean_T istransportdelay , int_T * maxNewBufSzPtr ) { int_T
testIdx ; int_T tail = * tailPtr ; int_T bufSz = * bufSzPtr ; real_T * tBuf =
* tBufPtr ; real_T * xBuf = ( NULL ) ; int_T numBuffer = 2 ; if (
istransportdelay ) { numBuffer = 3 ; xBuf = * xBufPtr ; } testIdx = ( tail <
( bufSz - 1 ) ) ? ( tail + 1 ) : 0 ; if ( ( tMinusDelay <= tBuf [ testIdx ] )
&& ! isfixedbuf ) { int_T j ; real_T * tempT ; real_T * tempU ; real_T *
tempX = ( NULL ) ; real_T * uBuf = * uBufPtr ; int_T newBufSz = bufSz + 1024
; if ( newBufSz > * maxNewBufSzPtr ) { * maxNewBufSzPtr = newBufSz ; } tempU
= ( real_T * ) utMalloc ( numBuffer * newBufSz * sizeof ( real_T ) ) ; if (
tempU == ( NULL ) ) { return ( false ) ; } tempT = tempU + newBufSz ; if (
istransportdelay ) tempX = tempT + newBufSz ; for ( j = tail ; j < bufSz ; j
++ ) { tempT [ j - tail ] = tBuf [ j ] ; tempU [ j - tail ] = uBuf [ j ] ; if
( istransportdelay ) tempX [ j - tail ] = xBuf [ j ] ; } for ( j = 0 ; j <
tail ; j ++ ) { tempT [ j + bufSz - tail ] = tBuf [ j ] ; tempU [ j + bufSz -
tail ] = uBuf [ j ] ; if ( istransportdelay ) tempX [ j + bufSz - tail ] =
xBuf [ j ] ; } if ( * lastPtr > tail ) { * lastPtr -= tail ; } else { *
lastPtr += ( bufSz - tail ) ; } * tailPtr = 0 ; * headPtr = bufSz ; utFree (
uBuf ) ; * bufSzPtr = newBufSz ; * tBufPtr = tempT ; * uBufPtr = tempU ; if (
istransportdelay ) * xBufPtr = tempX ; } else { * tailPtr = testIdx ; }
return ( true ) ; } real_T Deadbeat_CUK_acc_rt_TDelayInterpolate ( real_T
コード例 #9
0
ファイル: rtw_modelmap_utils.c プロジェクト: Shedino/Firmware
/** Function: rtwCAPI_GetSigLogRecordInfo ======================================
 *
 */
const char_T* rtwCAPI_GetSigLogRecordInfo(const rtwCAPI_ModelMappingInfo* mmi,
                                          const char_T**    sigBlockName,
                                          const char_T**    sigLabel,
                                          int_T*            sigWidth,
                                          int_T*            sigDataType,
                                          int_T*            logDataType,
                                          int_T*            sigComplexity,
                                          void**            sigDataAddr,
                                          boolean_T*        sigCrossMdlRef,
                                          int_T*            sigIdx,
                                          boolean_T         crossingModel,
                                          boolean_T         rtwLogging)
{
    int_T               i;
    int_T               nCMMI;
    int_T               nSignals;
    const char_T*       mmiPath;
    size_t              mmiPathLen;
    const rtwCAPI_Signals*  signals;
    const rtwCAPI_DimensionMap* dimMap;
    const uint_T*       dimArray;
    const rtwCAPI_DataTypeMap*  dataTypeMap;
    void**              dataAddrMap;
    const char_T*       errstr = NULL;
    uint8_T             isPointer = 0;
    char*               blockPath = NULL;

    if (mmi == NULL) goto EXIT_POINT;

    nCMMI = rtwCAPI_GetChildMMIArrayLen(mmi);
    for (i = 0; i < nCMMI; ++i) {
        rtwCAPI_ModelMappingInfo* cMMI = rtwCAPI_GetChildMMI(mmi,i);

        errstr = rtwCAPI_GetSigLogRecordInfo(cMMI,
                                             sigBlockName,
                                             sigLabel,
                                             sigWidth,
                                             sigDataType,
                                             logDataType,
                                             sigComplexity,
                                             sigDataAddr,
                                             sigCrossMdlRef,
                                             sigIdx,
                                             true,
                                             rtwLogging);
        if (errstr != NULL) goto EXIT_POINT;
    }

    nSignals = rtwCAPI_GetNumSignals(mmi);
    if (nSignals < 1) goto EXIT_POINT;

    mmiPath     = rtwCAPI_GetFullPath(mmi);
    mmiPathLen  = (mmiPath==NULL)? 0 : strlen(mmiPath);
    signals     = rtwCAPI_GetSignals(mmi);
    dimMap      = rtwCAPI_GetDimensionMap(mmi);
    dimArray    = rtwCAPI_GetDimensionArray(mmi);
    dataTypeMap = rtwCAPI_GetDataTypeMap(mmi);
    dataAddrMap = rtwCAPI_GetDataAddressMap(mmi);

    for (i = 0; i < nSignals; ++i) {
        uint_T mapIdx;
        size_t sigPathLen;
        char*  sigPath;

        /* For RTW logging, skip states that cannot be logged to MAT-File. */
        if ((rtwLogging) &&
            (rtwCAPI_CanLogSignalToMATFile(dataTypeMap, signals, i) == false)) continue;

        /* sigBlockPath = mmiPath + | + BlockPath + '\0' */
        /* If crossing a model boundary encode, otherwise do not */

        if (crossingModel) {
            blockPath = rtwCAPI_EncodePath(rtwCAPI_GetSignalBlockPath(signals, i));
            if ( (blockPath == NULL) &&
                 (rtwCAPI_GetSignalBlockPath(signals, i) != NULL)) {
                errstr = rtwCAPI_mallocError;
                goto EXIT_POINT;
            }
        } else {
            const char* constBlockPath = rtwCAPI_GetSignalBlockPath(signals, i);
            blockPath = (char*)utMalloc((strlen(constBlockPath)+1)*sizeof(char));
            (void)strcpy(blockPath, constBlockPath);
        }
        utAssert(blockPath != NULL);
        sigPathLen = ( (mmiPath==NULL) ?
                                   strlen(blockPath) + 1 :
                                   mmiPathLen + strlen(blockPath) + 2 );
        sigPath    = (char*)utMalloc(sigPathLen*sizeof(char));
        if (sigPath == NULL) {
            errstr = rtwCAPI_mallocError;
            goto EXIT_POINT;
        }
        if (mmiPath != NULL) {
            (void)strcpy(sigPath, mmiPath);
            sigPath[mmiPathLen]   = '|';
            sigPath[mmiPathLen+1] =  '\0';
            (void)strcat(sigPath, blockPath);
        } else {
            (void)strcpy(sigPath, blockPath);
            sigPath[sigPathLen-1] =  '\0';
        }
       /* need to free for every iteration of the loop, but also have
        * the free below EXIT_POINT in case of error */
        utFree(blockPath);
        blockPath = NULL;
        utAssert(sigPath[sigPathLen-1] == '\0');
        sigBlockName[*sigIdx] = sigPath; /* caller is responsible for free */

        /* Label */
        sigLabel[*sigIdx] = rtwCAPI_GetSignalName(signals, i);

        /* Width */
        mapIdx = rtwCAPI_GetSignalDimensionIdx(signals, i);
        utAssert( rtwCAPI_GetNumDims(dimMap,mapIdx) == 2 );
        mapIdx = rtwCAPI_GetDimArrayIndex(dimMap, mapIdx);
        sigWidth[*sigIdx] = dimArray[mapIdx] * dimArray[mapIdx+1];

        /* DataType and logDataType */
        mapIdx = rtwCAPI_GetSignalDataTypeIdx(signals, i);
        sigDataType[*sigIdx] = rtwCAPI_GetDataTypeSLId(dataTypeMap, mapIdx);
        /* this mimics code in simulink.dll:mapSigDataTypeToLogDataType */
        if ( SS_DOUBLE ||
             SS_SINGLE ||
             SS_INT8   ||
             SS_UINT8  ||
             SS_INT16  ||
             SS_UINT16 ||
             SS_INT32  ||
             SS_UINT32 ||
             SS_BOOLEAN ) {
            logDataType[*sigIdx] = sigDataType[*sigIdx];
        } else {
            logDataType[*sigIdx] = SS_DOUBLE;
        }

        /* Complexity */
        sigComplexity[*sigIdx] = rtwCAPI_GetDataIsComplex(dataTypeMap, mapIdx);

        /* Data Access - Pointer or Direct*/
        isPointer = ((uint8_T)rtwCAPI_GetDataIsPointer(dataTypeMap, mapIdx));

        /* Address */
        mapIdx = rtwCAPI_GetSignalAddrIdx(signals, i);

        rtwCAPI_GetSigAddrFromMap(isPointer, sigComplexity, sigDataType,
                                  sigDataAddr, sigIdx, mapIdx, dataAddrMap);

        /* CrossingModelBoundary */
        sigCrossMdlRef[*sigIdx] = crossingModel;

        ++(*sigIdx);
    }

  EXIT_POINT:
    utFree(blockPath);
    return(errstr);

} /* rtwCAPI_GetSigLogRecordInfo */