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

    function code_chart_source_file_rtw(fileNameInfo, chart, specsIdx)

%    Copyright 1995-2013 The MathWorks, Inc.


   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   %%%%%  GLOBAL VARIABLES
   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

   global gChartInfo
   
   initialize_data_information(gChartInfo.chartData, gChartInfo.chartDataNumbers, chart);
   chartNumber = sf('get',chart,'chart.number');
   fileName = fullfile(fileNameInfo.targetDirName,fileNameInfo.chartSourceFiles{chartNumber+1}{specsIdx});
   sf_echo_generating('Coder',fileName);

   file = fopen(fileName,'Wt');
   if file<3
      construct_coder_error([],sprintf('Failed to create file: %s.',fileName),1);
      return;
   end

fprintf(file,'%%implements "chartSource" "C"\n');

fprintf(file,'%%function ChartConfig(block, system) void\n');
fprintf(file,'  %%createrecord chartConfiguration { ...\n');
fprintf(file,'          executeAtInitialization  %.17g ...\n',gChartInfo.executeAtInitialization);
fprintf(file,'  }\n');
fprintf(file,'  %%return chartConfiguration\n');
fprintf(file,'%%endfunction\n');

   % Only generate the ChartDataMap function,
   % which is used by globalmaplib.tlc.
   dump_chart_data_map_with_unified_dwork(file, chart);

   fclose(file);
   try_indenting_file(fileName);

function dump_chart_data_map_with_unified_dwork(file, chart)

    dworkInfo = sf('get', chart, 'chart.rtwInfo.dWorkVarInfo');
    numDWorks = length(dworkInfo);
    
fprintf(file,'%%function ChartDataMap(block, system) void\n');
fprintf(file,'  %%createrecord ChartDataElements {\\\n');
fprintf(file,'    NumChartData   %.17g \\\n',numDWorks);
fprintf(file,'    ChartDataDefaults {\\\n');
fprintf(file,'      RecordType   "ChartData"\\\n');
fprintf(file,'      Dimensions   []\\\n');
fprintf(file,'      IsTestPoint  0\\\n');
fprintf(file,'    }\\\n');

    for i = 1:numDWorks
        
fprintf(file,'    ChartData {\\\n');
fprintf(file,'      Name         "%s"\\\n',dworkInfo(i).varName);
fprintf(file,'      Description  "%s"\\\n',dworkInfo(i).description);
fprintf(file,'      SFName       "%s"\\\n',dworkInfo(i).objName);
fprintf(file,'      Path         "%s"\\\n',dworkInfo(i).path);

      if ~isempty(dworkInfo(i).size)
          % Not a scalar, which is the default case
          dims = sprintf('%d,', dworkInfo(i).size);
fprintf(file,'      Dimensions   [%s]\\\n',dims(1:end-1));
      end
      
      if dworkInfo(i).isTestPoint
fprintf(file,'      IsTestPoint  1\\\n');
      end
        
fprintf(file,'    }\\\n');
    end
    
fprintf(file,'  }\n');
fprintf(file,'  %%return ChartDataElements\n');
fprintf(file,'%%endfunction\n');

idx = sf('get', chart, 'chart.rtwInfo.dataSetVecIdxInDWork');

interpMethod = 'SS_ZOH_INTERPOLATION';
if ~isempty(sf('find', chart, '.updateMethod', 'CONTINUOUS'))
    % Chart has continous time
    interpMethod = 'SS_LINEAR_INTERPOLATION';
end

if idx >= 0
fprintf(file,'    \n');
fprintf(file,'%%function USLRegCode(block, system) Output\n');

fprintf(file,'  %%assign simS            = RTMsGet(system, "MdlRefSfcnS")\n');
fprintf(file,'  %%assign blockPath       = LibGetBlockPath(block)\n');
fprintf(file,'  %%assign dWork           = LibBlockDWorkName(block)\n');
fprintf(file,'\n');
fprintf(file,'  if (!slIsRapidAcceleratorSimulating()) { \n');
fprintf(file,'    %%assign mapInfo = RTMsGet(system, "DataMapInfo")\n');
   logSigs = sf('LoggedSignalsIn', chart);    
   logObj = Stateflow.Coder.TestPoints(chart, '', logSigs.data, logSigs.state, logSigs.aslStates);
  
   if logObj.nonBusTpPresent
fprintf(file,'    void *pSetDescr;\n');
fprintf(file,'    _ssLoggerCreateDatasetDescriptWithMMI(%%<simS>,\n');
fprintf(file,'                                          &%%<mapInfo>.mmi,\n');
fprintf(file,'                                          0,\n');
fprintf(file,'                                          NULL,\n');
fprintf(file,'                                          NULL,\n');
fprintf(file,'                                          &pSetDescr);\n');

   
fprintf(file,'    if (pSetDescr) {\n');
    for i = 1 : logObj.numTps    
        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 = INVALID_DTYPE_ID;\n');
        end
fprintf(file,'         int_T dimArray[] = {%s};\n',tpDimsInfo.getDimStr());
fprintf(file,'         ssLoggerAddStateflowElementDescription(%%<simS>, \n');
fprintf(file,'                                                &pSetDescr,\n');
fprintf(file,'                                                "%s",\n',tpInfo.className);
fprintf(file,'                                                "%s",\n',tpInfo.sfRelativePath);
fprintf(file,'                                                "%%<blockPath>", \n');
fprintf(file,'                                                "StateflowChart/%s", \n',tpInfo.sfRelativePath);
fprintf(file,'                                                NULL,\n');
fprintf(file,'                                                &pElementDescr);       \n');
         if tpInfo.isFixPt
fprintf(file,'         dType = ssRegisterDataTypeFxpFSlopeFixExpBias(%%<simS>, \n');
fprintf(file,'                                                       %.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');
fprintf(file,'        if (dType == INVALID_DTYPE_ID)\n');
fprintf(file,'           return;\n');
         elseif tpInfo.isEnum
fprintf(file,'         ssRegisterTypeFromNamedObject(%%<simS>,\n');
fprintf(file,'                                       "%s",\n',tpDataInfo.mwTypeName);
fprintf(file,'                                       &dType);\n');
fprintf(file,'                             \n');
fprintf(file,'        if (dType == INVALID_DTYPE_ID)\n');
fprintf(file,'           return;\n');
         end
fprintf(file,'         ssLoggerAddTimeseriesDescriptionWithInterpolation(%%<simS>,\n');
fprintf(file,'                                                           &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,'\n');
fprintf(file,'         ssLoggerCreateElementFromDescription(%%<simS>, \n');
fprintf(file,'                                              &pSetDescr,\n');
fprintf(file,'                                              %%<LibSFDWorkAddr(block, %.17g, "")>);\n',idx);
    

    for i = 1 : logObj.numTps
        tpInfo = logObj.getTpInfo(i);
        if ~tpInfo.isBusObj
fprintf(file,'         if(%%<LibSFDWork(block, %.17g, "%.17g")> != NULL) {       \n',idx,i-1);
fprintf(file,'               mxArray *pVal = mxCreateDoubleScalar(%.17g); \n',tpInfo.ssIdNumber);
fprintf(file,'               ssLoggerAddElementProperty(%%<simS>,\n');
fprintf(file,'                                          %%<LibSFDWork(block, %.17g, "%.17g")>,\n',idx,i-1);
fprintf(file,'                                          "SSIdNumber",\n');
fprintf(file,'                                           pVal);\n');
fprintf(file,'          }\n');
        end
    end
fprintf(file,'    }   \n');
    end
    dump_bus_sig_logging(file, logObj, idx);
fprintf(file,'  } /* if (!slIsRapidAcceleratorSimulating()) */\n');
fprintf(file,'%%endfunction\n');
end
    
function dump_bus_sig_logging(file, logObj, idx)
    for i=1:logObj.numTps
        tpInfo = logObj.getTpInfo(i);
        if tpInfo.isBusObj
fprintf(file,'     {\n');
fprintf(file,'         void *pDatasetDesc;\n');
fprintf(file,'         DTypeId dType = INVALID_DTYPE_ID;\n');
fprintf(file,'         _ssLoggerCreateDatasetDescriptWithMMI(%%<simS>, &%%<mapInfo>.mmi, 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,'             ssRegisterTypeFromNamedObject(%%<simS>,\n');
fprintf(file,'                                         "%s", \n',tpInfo.compiledType);
fprintf(file,'                                         &dType);\n');
fprintf(file,'             slSigLogAddElementDescriptionForStateflowBus(%%<simS>, &pDatasetDesc,\n');
fprintf(file,'                                                         %.17g,\n',tpInfo.heirInfoIdx);
fprintf(file,'                                                         "%s",\n',tpInfo.compiledType);
fprintf(file,'                                                         "%s",\n',tpInfo.name);
fprintf(file,'                                                         "%%<blockPath>",\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,'         ssLoggerCreateElementFromDescriptionForBus(%%<simS>, &pDatasetDesc, "%s", %%<LibSFDWorkAddr(block, %.17g, "%.17g")>, NULL, 0);\n',tpInfo.compiledType,idx,i-1);
fprintf(file,'     }\n');
        end
    end