gusucode.com > private工具箱matlab源码程序 > private/dump_capi_data_mapping_info_code.m

    function dump_capi_data_mapping_info_code(file, chart)

   global gChartInfo gMachineInfo
   
   if ~gChartInfo.hasTestPoint
      return;
   end
   
   % Dump data type info, dimensions info, dimensions array, fixed point
   % info, fixed point slope and bias vector and the test point struct
   % All the information is calculated in the MATLAB class Stateflow.Coder.TestPoints
   %
   % The general structure is as follows : 
   % The following maps Dimensions Info, Fixed point info and Data type
   % info are the primary sources of information. The test point struct
   % describes the data being test pointed and carries an index into each
   % of the above maps. These maps might carry further indices. For example
   % the Dimesnions map carries an index into the dimensions array (which
   % is a flat list of dimensions). This index couple with numDims can be
   % used to determine the dimensions of a testpoint. Similarly the fixed
   % point map also contains indices into the slope and bias map for the
   % slope and bias values.
   
   fixPtValArrName = 'fixPtSlopeBiasVals';
   tpObj = Stateflow.Coder.TestPoints(chart, fixPtValArrName);
   dump_capi_data_type_map_struct(file, tpObj.uniqDataTypeInfo, tpObj.nonBusTpPresent);
   
   if(tpObj.fixPtDataPresent)
       % If test pointed data has fix point types, generate slope and bias
       % map
         dump_capi_fixed_point_value_array(file, tpObj.uniqFixPtSlopeBias, fixPtValArrName);
   end
   checksumVector = double((sf('get',chart,'chart.rtwChecksum')));
   dump_capi_sample_time_map_struct(file);
   dump_capi_dimension_map_struct(file, tpObj.uniqDimsInfo, tpObj.nonBusTpPresent);
   dump_capi_test_point_signals_struct(file, tpObj.tpStruct, tpObj.nonBusTpPresent);
   dump_capi_fixed_point_map_struct(file, tpObj.uniqFixPtInfo, tpObj.nonBusTpPresent);
   dump_capi_dimension_array(file, tpObj.flatDimsList, tpObj.nonBusTpPresent);
   if tpObj.busTpPresent
       dump_sig_hier_logging_info(file, tpObj);
       dump_sig_hier_child_idx(file, tpObj);
       dump_bus_logging_info(file, tpObj);
   end

   dump_capi_data_mapping_static_info_struct(file, tpObj, checksumVector);
   dataSetLoggingEnabled = sfprivate('dataSetLoggingEnabled', gChartInfo, gMachineInfo);
   if dataSetLoggingEnabled && ~gChartInfo.codingExtMode
       % Signal logging uses Dataset format
       dump_init_signal_log_element_description(file, chart);
   end
   
   dump_capi_init_data_mapping_info_fcn(file, chart, tpObj);
   return;
   
function dump_capi_string_map(file, map)

fprintf(file,'%s','    ');
if(~isempty(map))
    fprintf(file,'%s,\n',map{1:end-1});
    fprintf(file,'%s',map{end});
end

function dump_capi_string_map_v2(file, map)

fprintf(file,'%s','    ');
if(~isempty(map))
    fprintf(file,'%s, ',map{1:end-1});
    fprintf(file,'%s',map{end});
end

function dump_capi_data_type_map_struct(file, map, nonBusTpPresent)

fprintf(file,'\n');
   if ~nonBusTpPresent
fprintf(file,'static const rtwCAPI_DataTypeMap dataTypeMap[] = { {"", "", 0, 0, 0, 0, 0, 0} };\n');
   else
fprintf(file,'static const rtwCAPI_DataTypeMap dataTypeMap[] = {\n');
fprintf(file,'   /* cName, mwName, numElements, elemMapIndex, dataSize, slDataId, isComplex, isPointer */\n');
   dump_capi_string_map(file, map);
fprintf(file,'};\n');
   end

   return;
   
function dump_capi_fixed_point_value_array(file, fixPtValueMap, fixPtValArrName)

   numEntries = length(fixPtValueMap);
fprintf(file,'\n');
fprintf(file,'static real_T %s[%.17g] = {\n',fixPtValArrName,numEntries);
   strMap = cell(numEntries, 1);
   for i = 1:numEntries
      strMap{i} = sprintf('%g', fixPtValueMap(i));
   end
   dump_capi_string_map(file, strMap);
fprintf(file,'};\n');

   return;

function dump_capi_fixed_point_map_struct(file, map, nonBusTpPresent)

fprintf(file,'\n');
   if ~nonBusTpPresent
fprintf(file,'static const rtwCAPI_FixPtMap fixedPointMap[] = { {NULL, NULL, 0, 0, 0, 0 } };\n');
   else
fprintf(file,'static const rtwCAPI_FixPtMap fixedPointMap[] = {\n');
fprintf(file,'   /* *fracSlope, *bias, scaleType, wordLength, exponent, isSigned */\n');
   dump_capi_string_map(file, map);
fprintf(file,'};\n');
   end

   return;

function dump_capi_dimension_map_struct(file, strMap, nonBusTpPresent)

fprintf(file,'\n');
   if ~nonBusTpPresent
fprintf(file,'static const rtwCAPI_DimensionMap dimensionMap[] = { {0, 0, 0} };\n');
   else
fprintf(file,'static const rtwCAPI_DimensionMap dimensionMap[] = {\n');
fprintf(file,'   /* dataOrientation, dimArrayIndex, numDims*/\n');
   dump_capi_string_map(file, strMap);
fprintf(file,'};\n');
   end

   return;

function dump_capi_dimension_array(file, strMap, nonBusTpPresent)

fprintf(file,'\n');
   if ~nonBusTpPresent
fprintf(file,'static const uint_T dimensionArray[] = { 0 };\n');
   else
fprintf(file,'static const uint_T dimensionArray[] = {\n');
   dump_capi_string_map_v2(file, strMap);
fprintf(file,'};\n');
   end
   return;

% A dummy sample time map to satisfy !NULL assertion in floating scope code
function dump_capi_sample_time_map_struct(file)

fprintf(file,'\n');
fprintf(file,'static real_T sfCAPIsampleTimeZero = 0.0;\n');
fprintf(file,'static const rtwCAPI_SampleTimeMap sampleTimeMap[] = {\n');
fprintf(file,'   /* *period, *offset, taskId, mode */\n');
fprintf(file,'   {&sfCAPIsampleTimeZero, &sfCAPIsampleTimeZero, 0, 0}\n');
fprintf(file,'};\n');

   return;
   
function dump_capi_test_point_signals_struct(file, strMap, nonBusTpPresent)
fprintf(file,'\n');
   if ~nonBusTpPresent
fprintf(file,'static const rtwCAPI_Signals testPointSignals[] = { {0, 0, "", "", 0, 0, 0, 0, 0 } };\n');
   else
fprintf(file,'static const rtwCAPI_Signals testPointSignals[] = {\n');
fprintf(file,'   /* addrMapIndex, sysNum, SFRelativePath, dataName, portNumber, dataTypeIndex, dimIndex, fixPtIdx, sTimeIndex */\n');
   dump_capi_string_map(file, strMap);
fprintf(file,'};\n');
   end

   return;

function dump_capi_data_mapping_static_info_struct(file, tpObj, checksumVector)
    numTestPoints = tpObj.numTps - tpObj.numBusTps;

fprintf(file,'\n');
fprintf(file,'static rtwCAPI_ModelMappingStaticInfo testPointMappingStaticInfo = {\n');
fprintf(file,'   /* block signal monitoring */\n');
fprintf(file,'   {\n');
fprintf(file,'      testPointSignals,  /* Block signals Array  */\n');
fprintf(file,'      %.17g,   /* Num Block IO signals */\n',numTestPoints);
fprintf(file,'      NULL,   /* Root Inputs Array    */\n');
fprintf(file,'      0,      /* Num root inputs      */\n');
fprintf(file,'      NULL,   /* Root Outputs Array */\n');
fprintf(file,'      0       /* Num root outputs   */\n');
fprintf(file,'   },\n');
fprintf(file,'\n');
fprintf(file,'   /* parameter tuning */\n');
fprintf(file,'   {\n');
fprintf(file,'      NULL,   /* Block parameters Array    */\n');
fprintf(file,'      0,      /* Num block parameters      */\n');
fprintf(file,'      NULL,   /* Variable parameters Array */\n');
fprintf(file,'      0       /* Num variable parameters   */\n');
fprintf(file,'   },\n');
fprintf(file,'\n');
fprintf(file,'   /* block states */\n');
fprintf(file,'   {\n');
fprintf(file,'      NULL,   /* Block States array        */\n');
fprintf(file,'      0       /* Num Block States          */\n');
fprintf(file,'   },\n');
fprintf(file,'\n');
fprintf(file,'   /* Static maps */\n');
fprintf(file,'   {\n');
fprintf(file,'      dataTypeMap,    /* Data Type Map            */\n');
fprintf(file,'      dimensionMap,   /* Data Dimension Map       */\n');
fprintf(file,'      fixedPointMap,  /* Fixed Point Map          */\n');
fprintf(file,'      NULL,           /* Structure Element map    */\n');
fprintf(file,'      sampleTimeMap,  /* Sample Times Map         */\n');
fprintf(file,'      dimensionArray  /* Dimension Array          */     \n');
fprintf(file,'   },\n');
fprintf(file,'\n');
fprintf(file,'   /* Target type */\n');
fprintf(file,'   "float",\n');
fprintf(file,'   {\n');
fprintf(file,'      %.17gU,\n',checksumVector(1));
fprintf(file,'      %.17gU,\n',checksumVector(2));
fprintf(file,'      %.17gU,\n',checksumVector(3));
fprintf(file,'      %.17gU\n',checksumVector(4));
fprintf(file,'   }\n');
if tpObj.busTpPresent
fprintf(file,'     , &mmiStaticInfoLogging, 0\n');
end
fprintf(file,'};\n');

   return;

function dump_capi_init_data_mapping_info_fcn(file, chart, tpObj)

   global gTargetInfo gChartInfo gMachineInfo
   tpInfoAccessFcns = sf('Cg', 'get_testpoint_accessfcn_names', chart);
   
fprintf(file,'\n');
fprintf(file,'static void init_test_point_mapping_info(SimStruct *S) {\n');
fprintf(file,'   rtwCAPI_ModelMappingInfo *testPointMappingInfo;\n');
fprintf(file,'   void **testPointAddrMap;\n');
   if gTargetInfo.codingMultiInstance
fprintf(file,'   %s *chartInstance = (%s *)sf_get_chart_instance_ptr(S);\n',gChartInfo.chartInstanceTypedef,gChartInfo.chartInstanceTypedef);
fprintf(file,'   %s(chartInstance);\n',tpInfoAccessFcns.initAddrMapFcn);
fprintf(file,'   testPointMappingInfo = %s(chartInstance);\n',tpInfoAccessFcns.mappingInfoAccessFcn);
fprintf(file,'   testPointAddrMap = %s(chartInstance);\n',tpInfoAccessFcns.addrMapAccessFcn);
   else
fprintf(file,'\n');
fprintf(file,'   %s();\n',tpInfoAccessFcns.initAddrMapFcn);
fprintf(file,'   testPointMappingInfo = %s();\n',tpInfoAccessFcns.mappingInfoAccessFcn);
fprintf(file,'   testPointAddrMap = %s();\n',tpInfoAccessFcns.addrMapAccessFcn);
   end
fprintf(file,'\n');
fprintf(file,'   rtwCAPI_SetStaticMap(*testPointMappingInfo, &testPointMappingStaticInfo);\n');
if tpObj.busTpPresent
fprintf(file,'   rtwCAPI_SetLoggingStaticMap(*testPointMappingInfo, &mmiStaticInfoLogging);\n');
else
fprintf(file,'   rtwCAPI_SetLoggingStaticMap(*testPointMappingInfo, NULL);\n');
end
fprintf(file,'   rtwCAPI_SetInstanceLoggingInfo(*testPointMappingInfo, NULL);\n');
fprintf(file,'   rtwCAPI_SetPath(*testPointMappingInfo, "");\n');
fprintf(file,'   rtwCAPI_SetFullPath(*testPointMappingInfo, NULL);\n');
fprintf(file,'   rtwCAPI_SetDataAddressMap(*testPointMappingInfo, testPointAddrMap);\n');
fprintf(file,'   rtwCAPI_SetChildMMIArray(*testPointMappingInfo, NULL);\n');
fprintf(file,'   rtwCAPI_SetChildMMIArrayLen(*testPointMappingInfo, 0);\n');
fprintf(file,'\n');
fprintf(file,'   ssSetModelMappingInfoPtr(S, testPointMappingInfo);\n');

   dataSetLoggingEnabled = sfprivate('dataSetLoggingEnabled', gChartInfo, gMachineInfo);
    if dataSetLoggingEnabled && ~gChartInfo.codingExtMode
      % Signal logging uses Dataset format
fprintf(file,'   init_signal_logging_objects(S, testPointMappingInfo);\n');
   end

fprintf(file,'}\n');

   return;

function dump_init_signal_log_element_description(file, chart)
    global gTargetInfo gChartInfo
    logObj = Stateflow.Coder.TestPoints(chart, '', gChartInfo.loggedSignals.data, gChartInfo.loggedSignals.state, gChartInfo.loggedSignals.aslStates);
fprintf(file,'static void init_signal_logging_objects(SimStruct *S, rtwCAPI_ModelMappingInfo *testPointMappingInfo) \n');
fprintf(file,'   {\n');
fprintf(file,'    void ** chartDatasetLoggingObjs;\n');
if logObj.nonBusTpPresent
fprintf(file,'    void *pSetDescr;\n');
end
fprintf(file,'    int i;\n');
fprintf(file,'  size_t lastSlashIdx = 0;\n');
    if gTargetInfo.codingMultiInstance
fprintf(file,'   chartDatasetLoggingObjs = get_dataset_logging_obj_vector((%s *)sf_get_chart_instance_ptr(S));\n',gChartInfo.chartInstanceTypedef);
    else
fprintf(file,'   chartDatasetLoggingObjs = get_dataset_logging_obj_vector();\n');
    end
    interpMethod = 'SS_ZOH_INTERPOLATION';
    if ~isempty(sf('find', chart, '.updateMethod', 'CONTINUOUS'))
        % Chart has continous time
        interpMethod = 'SS_LINEAR_INTERPOLATION';
    end
fprintf(file,'  /* Initialize signal log vector */\n');
fprintf(file,'   for (i = 0; i < %.17g; ++i) {\n',logObj.numTps);
fprintf(file,'   chartDatasetLoggingObjs[i] = NULL;\n');
fprintf(file,'   }\n');
if logObj.nonBusTpPresent
fprintf(file,'    _ssLoggerCreateDatasetDescriptWithMMI(S, testPointMappingInfo, 0, NULL,\n');
fprintf(file,'                                          NULL, &pSetDescr); \n');
fprintf(file,'    if (pSetDescr) {\n');
    for i = 1 : logObj.numStateTps + logObj.numDataTps    
        tpInfo = logObj.getTpInfo(i);
        if ~tpInfo.isBusObj
        tpDataInfo = tpInfo.dataTypeInfo;
        tpDimsInfo = tpInfo.dimsInfo;
        tpFixPtInfo = tpInfo.fixPtInfo;
fprintf(file,'     {       \n');
fprintf(file,'         void *pElementDescr;\n');
if tpInfo.isFixPt || tpInfo.isEnum
fprintf(file,'         DTypeId dType;\n');
end
fprintf(file,'         int_T dimArray[] = {%s};\n',tpDimsInfo.getDimStr());
fprintf(file,'         ssLoggerAddStateflowElementDescription(S, &pSetDescr,\n');
fprintf(file,'                                                "%s",\n',tpInfo.className);
fprintf(file,'                                                "%s",\n',tpInfo.sfRelativePath);
fprintf(file,'                                                NULL, \n');
fprintf(file,'                                                "StateflowChart/%s", \n',tpInfo.sfRelativePath);
fprintf(file,'                                                NULL,\n');
fprintf(file,'                                                &pElementDescr);       \n');
         if tpInfo.isFixPt
            % It is easier to try to re-register the fixed point type
            % rather than construct the appropriate string and call
            % ssGetDataTypeId() on it
fprintf(file,'         dType = ssRegisterDataTypeFxpFSlopeFixExpBias(S, %.17g,\n',tpFixPtInfo.signed);
fprintf(file,'                                                       %.17g, \n',tpFixPtInfo.wordLen);
fprintf(file,'                                                       (double) %.17g, \n',tpFixPtInfo.slope);
fprintf(file,'                                                       %.17g, \n',tpFixPtInfo.exponent);
fprintf(file,'                                                       (double) %.17g,\n',tpFixPtInfo.bias);
fprintf(file,'                                                       0);\n');

         elseif tpInfo.isEnum
fprintf(file,'         dType = ssGetDataTypeId(S, "%s");\n',tpDataInfo.mwTypeName);
         end
fprintf(file,'         ssLoggerAddTimeseriesDescriptionWithInterpolation(S, &pSetDescr,\n');
fprintf(file,'                                                           &pElementDescr,\n');
fprintf(file,'                                                           "%s",\n',tpInfo.name);
fprintf(file,'                                                           %.17g,\n',tpDimsInfo.numDimsUSL);
fprintf(file,'                                                           dimArray,\n');
fprintf(file,'                                                           %s, \n',tpInfo.dataTypeStr);
fprintf(file,'                                                           %.17g,\n',tpDataInfo.isComplex);
fprintf(file,'                                                           %s);\n',interpMethod);
fprintf(file,'     }\n');
       end
    end

    for i = logObj.numStateTps + logObj.numDataTps + 1 : logObj.numTps
        tpInfo = logObj.getTpInfo(i);
        if ~tpInfo.isBusObj
        tpDataInfo = tpInfo.dataTypeInfo;
        tpDimsInfo = tpInfo.dimsInfo;
fprintf(file,'     {       \n');
fprintf(file,'         void *pElementDescr;\n');
fprintf(file,'         DTypeId dType;\n');
fprintf(file,'         int_T dimArray[] = {%s};\n',tpDimsInfo.getDimStr());
fprintf(file,'         ssLoggerAddStateflowElementDescription(S, &pSetDescr,\n');
fprintf(file,'                                                "%s",\n',tpInfo.className);
fprintf(file,'                                                "%s",\n',tpInfo.name);
fprintf(file,'                                                NULL, \n');
fprintf(file,'                                                "StateflowChart/%s", \n',tpInfo.sfRelativePath);
fprintf(file,'                                                NULL,\n');
fprintf(file,'                                                &pElementDescr); \n');
fprintf(file,'         ssLoggerAddTimeseriesDescriptionWithInterpolation(S, &pSetDescr,\n');
fprintf(file,'                                                           &pElementDescr,\n');
fprintf(file,'                                                           "%s",\n',tpInfo.name);
fprintf(file,'                                                           %.17g,\n',tpDimsInfo.numDimsUSL);
fprintf(file,'                                                           dimArray,\n');
fprintf(file,'                                                           %s, \n',tpInfo.dataTypeStr);
fprintf(file,'                                                           %.17g,\n',tpDataInfo.isComplex);
fprintf(file,'                                                           %s);\n',interpMethod);
fprintf(file,'     }\n');
       end
    end

fprintf(file,'         ssLoggerCreateElementFromDescription(S, &pSetDescr,\n');
fprintf(file,'                                              chartDatasetLoggingObjs);\n');
    chartLoggingObjIdx = 0;
    for i = 1 : logObj.numStateTps + logObj.numDataTps
        tpInfo = logObj.getTpInfo(i);
        if ~tpInfo.isBusObj
fprintf(file,'         if(chartDatasetLoggingObjs[%.17g] != NULL) {       \n',i-1);
fprintf(file,'               mxArray *pVal = mxCreateDoubleScalar(%.17g); \n',tpInfo.ssIdNumber);
fprintf(file,'               ssLoggerAddElementProperty(S,\n');
fprintf(file,'                   chartDatasetLoggingObjs[%.17g],\n',i-1);
fprintf(file,'                   "SSIdNumber",\n');
fprintf(file,'                   pVal);\n');
fprintf(file,'          }\n');
           chartLoggingObjIdx = chartLoggingObjIdx + 1;
       end

    end
    
    for i = logObj.numStateTps + logObj.numDataTps + 1 : logObj.numTps
        tpInfo = logObj.getTpInfo(i);
        if ~tpInfo.isBusObj
fprintf(file,'         if(chartDatasetLoggingObjs[%.17g] != NULL) {       \n',i-1);
fprintf(file,'               mxArray *plhs[1];      \n');
fprintf(file,'               mxArray *prhs[3];\n');
fprintf(file,'               prhs[0] = mxCreateString("Private");\n');
fprintf(file,'               prhs[1] = mxCreateString("chartHierInfo");\n');
fprintf(file,'               prhs[2] = mxCreateDoubleScalar(%.17g);\n',tpInfo.objId);
fprintf(file,'               mexCallMATLAB(1, plhs, 3, prhs, "sf");\n');
fprintf(file,'               ssLoggerAddElementProperty(S,\n');
fprintf(file,'                                          chartDatasetLoggingObjs[%.17g],\n',i-1);
fprintf(file,'                                          "chartHierInfo",\n');
fprintf(file,'                                          plhs[0]);\n');
fprintf(file,'               mxDestroyArray(prhs[0]);\n');
fprintf(file,'               mxDestroyArray(prhs[1]);\n');
fprintf(file,'               mxDestroyArray(prhs[2]);\n');
fprintf(file,'          }        \n');
        end
    end


fprintf(file,'    }\n');
end
dump_bus_sig_logging(file, logObj);
fprintf(file,' }\n');

function dump_bus_sig_logging(file, logObj)
    chartObjStartIdx = (logObj.numTps - logObj.numBusTps);
    for i=1:logObj.numTps
        tpInfo = logObj.getTpInfo(i);
        if tpInfo.isBusObj
fprintf(file,'     {       \n');
fprintf(file,'     void *pDatasetDesc;\n');
fprintf(file,'     _ssLoggerCreateDatasetDescriptWithMMI(S, testPointMappingInfo, 0, NULL,\n');
fprintf(file,'                                                  NULL, &pDatasetDesc);\n');
fprintf(file,'        {       \n');
fprintf(file,'            int_T dimensions[%.17g] = {\n',tpInfo.numDims);
        for idxDim=1:length(tpInfo.dimensions)
            if idxDim == length(tpInfo.dimensions)
fprintf(file,'                 %s \n',tpInfo.dimensions{idxDim});
            else
fprintf(file,'                 %s ,\n',tpInfo.dimensions{idxDim});
            end
        end
fprintf(file,'             };\n');
fprintf(file,'     slSigLogAddElementDescriptionForStateflowBus(S, &pDatasetDesc,\n');
fprintf(file,'                                             %.17g,\n',tpInfo.heirInfoIdx);
fprintf(file,'                                             "%s",\n',tpInfo.compiledType);
fprintf(file,'                                             "%s",\n',tpInfo.name);
fprintf(file,'                                             NULL, \n');
fprintf(file,'                                             %.17g, \n',tpInfo.portIdx);
fprintf(file,'                                             %.17g,\n',tpInfo.maxPoints);
fprintf(file,'                                             %.17g,\n',tpInfo.decimation);
fprintf(file,'                                             %.17g,\n',tpInfo.numDims);
fprintf(file,'                                             dimensions, \n');
fprintf(file,'                                             SS_ZOH_INTERPOLATION, \n');
fprintf(file,'                                             "Stateflow.SimulationData.Data",\n');
fprintf(file,'                                             "StateflowChart/%s");\n',tpInfo.sfRelativePath);
fprintf(file,'       }\n');
fprintf(file,' {\n');
        dump_bus_offsets(file, tpInfo);
fprintf(file,'     ssLoggerCreateElementFromDescriptionForBus(S, &pDatasetDesc, "%s", &chartDatasetLoggingObjs[%.17g], %s_offsets, %.17g);\n',tpInfo.compiledType,i-1,tpInfo.compiledType,tpInfo.numLeaves);
fprintf(file,' }\n');
fprintf(file,' }\n');
        chartObjStartIdx = chartObjStartIdx + 1;
        end
    end

function dump_sig_hier_logging_info(file, tpObj)
fprintf(file,'    static const rtwCAPI_SignalHierLoggingInfo rtSigHierLoggingInfo[] = {\n');
    for i=1:length(tpObj.heirLoggingInfoTable)
        tBus = tpObj.heirLoggingInfoTable{i};

        if i == length(tpObj.heirLoggingInfoTable)
fprintf(file,'            { "%s", %.17g, %.17g }\n',tBus{1},tBus{2},tBus{3});
        else
fprintf(file,'            { "%s", %.17g, %.17g },\n',tBus{1},tBus{2},tBus{3});
        end
        
    end
fprintf(file,'                 };\n');

    
function dump_sig_hier_child_idx(file, tpObj)
fprintf(file,'   static const uint_T rtSigHierLoggingChildIdxs[] = {\n');
    for i=1:length(tpObj.heirLoggingChildTable)
        if i == length(tpObj.heirLoggingChildTable)
fprintf(file,'            %.17g\n',tpObj.heirLoggingChildTable(i));
        else
fprintf(file,'            %.17g,\n',tpObj.heirLoggingChildTable(i));
        end
    
    end
fprintf(file,'    };\n');

function dump_bus_logging_info(file, tpObj)
    dump_rt_context_systems(file);
    dump_logging_metainfo(file);
    dump_model_mapping_static_info(file, tpObj);
        
function dump_rt_context_systems(file)
fprintf(file,'    static int_T rtContextSystems[3] = { 0, 0, 0 };\n');

function dump_logging_metainfo(file)
fprintf(file,'    static rtwCAPI_LoggingMetaInfo loggingMetaInfo[] = {\n');
fprintf(file,'                                 { 0, 0, "", 0 }\n');
fprintf(file,'                             };\n');
    
function dump_model_mapping_static_info(file, tpObj)
fprintf(file,'    static rtwCAPI_ModelMapLoggingStaticInfo mmiStaticInfoLogging = {\n');
fprintf(file,'                3, rtContextSystems, loggingMetaInfo, 0, NULL, { %.17g, rtSigHierLoggingInfo,\n',length(tpObj.heirLoggingInfoTable));
fprintf(file,'                    rtSigHierLoggingChildIdxs }, 0, (NULL)\n');
fprintf(file,'    };\n');

function dump_bus_offsets(file, busObj)
        tempObjStr = strcat('temp', busObj.compiledType, 'Obj');
        offsetObjStr = strcat(busObj.compiledType, '_offsets');
        baseOffsetStr = strcat(busObj.compiledType, '_baseoffset');
        busSize = busObj.busSize;

        if busSize == 1
fprintf(file,'  %s %s;\n',busObj.aggregateTag,tempObjStr);
fprintf(file,'  char *%s = ((char *)&(%s));\n',baseOffsetStr,tempObjStr);
        else
fprintf(file,'  %s %s[%.17g];\n',busObj.aggregateTag,tempObjStr,busSize);
fprintf(file,'  char *%s = ((char *)&(%s[0]));\n',baseOffsetStr,tempObjStr);
        end
        
fprintf(file,'  unsigned int %s[%.17g];\n',offsetObjStr,busObj.numLeaves);

        offsetIdxStr = 'offsetIdx';
fprintf(file,'  unsigned int %s = 0;\n',offsetIdxStr);

        forIdx = 0;
        dump_bus_offsets_loop(file, busObj.busMatlabStruct, busSize, offsetIdxStr, forIdx, tempObjStr, offsetObjStr, baseOffsetStr);

function forIdx = dump_bus_offsets_loop(file, busObj, dimSize, offsetIdxStr, forIdx, initString, offsetObjStr, baseOffsetStr)
    if dimSize ~=1 
        forIdx = forIdx + 1;
fprintf(file,' {\n');
fprintf(file,'  unsigned int i%.17g;\n',forIdx);
fprintf(file,'  for(i%.17g=0; i%.17g < %.17g; i%.17g++)\n',forIdx,forIdx,dimSize,forIdx);
fprintf(file,'  {\n');
    end   
        
    numFields = length(fieldnames(busObj));
    allFields = fieldnames(busObj);
    if dimSize ~= 1 
        newString = sprintf('%s[i%d]', initString, forIdx);
    else
        newString = initString;
    end
    for i=1:numFields
        fieldName = allFields{i};
        
        field = busObj.(allFields{i});
        if ~isstruct(field)
fprintf(file,'      %s[%s++] = (unsigned int)(((char *)(&(%s.%s))) - %s);\n',offsetObjStr,offsetIdxStr,newString,fieldName,baseOffsetStr);
        else % handle bus fields
            %recurse
            fieldDimSize = numel(field);
            newInitStr = sprintf('%s.%s', newString, fieldName);
            forIdx= dump_bus_offsets_loop(file, field, fieldDimSize, offsetIdxStr, forIdx, newInitStr, offsetObjStr, baseOffsetStr);
        end
        
    end
        
    if dimSize ~=1
fprintf(file,'        }\n');
fprintf(file,'        }\n');
    end