%%
%%
%%
%%Abstract:
%%ThisTLClibraryfilecontainslibraryroutinesinsupportofthe
%%Stateflowinterface.
%%
%%Copyright1994-2010TheMathWorks,Inc.
%%
 
%if EXISTS("_SFLIB_") == 0
%assign _SFLIB_ = 1
 
%addtorecord CompiledModel MachineInitializeCache ""
%addtorecord CompiledModel MachineTerminateCache ""
 
%function SFLibRegSignalLogging(blkIdx, sysIdx) Output
  %assign system = ::CompiledModel.System[sysIdx]
  %assign block = system.Block[blkIdx]
  %with system
    %with block
      %generatefile "chartSource" "%<block.SFInfo.ChartTLCFile>.tlc"
      %<GENERATE_TYPE(block, "USLRegCode", "chartSource", system)>
      %assign unused = UNLOAD_GENERATE_TYPE(block, "chartSource")
    %endwith
  %endwith
%endfunction
 
%function SFLibGetSimS(sysIdx) Output
    %if ::isRAccel
        %return RTMGetModelSS()
    %else
        %assign system = ::CompiledModel.System[sysIdx]
        %return RTMsGet(system, "MdlRefSfcnS")
    %endif
%endfunction
     
%function SFGetDataMapInfoForSystem(system) void
    %if ::isRAccel
        %return ::RSimRTWCAPIVar
    %else
        %return RTMsGet(system, "DataMapInfo")
    %endif
%endfunction
 
%function SFLibGetInstancePath(blkIdx, sysIdx) void
    %assign system = ::CompiledModel.System[sysIdx]
    %assign mapInfo = SFGetDataMapInfoForSystem(system)
    %return mapInfo + ".mmi.InstanceMap.fullPath"
%endfunction
 
%function SLibSetMachineInitialize(code) void
  %if MachineInitializeCache != ""
    %% Should only be called once
    %<LibReportFatalError("MachineInitializeCache should be empty")>
  %endif
  %if !WHITE_SPACE(code)
    %assign CompiledModel.MachineInitializeCache = code
  %endif
%endfunction
 
%function SLibSetMachineTerminate(code) void
  %if MachineTerminateCache != ""
    %% Should only be called once
    %<LibReportFatalError("MachineTerminateCache should be empty")>
  %endif
  %if !WHITE_SPACE(code)
    %assign CompiledModel.MachineTerminateCache = code
  %endif
%endfunction
 
%function SLibWriteMachineInitialize() void
  %return MachineInitializeCache
%endfunction
 
%function SLibWriteMachineTerminate() void
  %return MachineTerminateCache
%endfunction
 
%%Function:LibSFGetCurrentTaskTime===========================================
%%Abstract:
%%Returnthecorrectstringforaccessingthetasktimeforthegiven
%%chart.
%%
%%block=Blockrecordforthestateflowchart
%%
%function LibSFGetCurrentTaskTime(block) void
  %return LibGetTaskTimeFromTID(block)
%endfunction
 
 
%%Function:LibSFChartInstance================================================
%%Abstract:
%%ReturnthecorrectstringforaccessingthechartInstancestucture.When
%%thechartinnotmulti-instanced,directaccessisused.
%%
%%block=Blockrecordforthestateflowchart
%%
%function LibSFChartInstance(block) void
    %<SETFIELD(block,"ChartInstanceAccessed",1)>
       %return "%<LibBlockDWork(ChartInstance,"","",0)>."
%endfunction
 
%%Function:LibSFDWork=====================================================
%%Returnthecorrectstringforaccessingthechartdworks.
%%block:BlockrecordfortheStateflowchart
%%dWorkIdx:DWorkindex
%%eleIdx:Elementindexforarraydwork.eleIdxmustbestring.
%%
%function LibSFDWork(block, dWorkIdx, eleIdx) void
    %return LibBlockDWork(DWork[dWorkIdx], eleIdx, "", 0)
%endfunction
 
 
%%Function:LibSFAssignDWork=====================================================
%%Assigndwork(arrayelement)withvalue.
%%block:BlockrecordfortheStateflowchart
%%dWorkIdx:DWorkindex
%%eleIdx:Elementindexforarraydwork.eleIdxmustbestring.
%%u:Theassignedvalue
%%
%function LibSFAssignDWork(block, dWorkIdx, eleIdx, u) Output
    %<LibBlockAssignDWork(DWork[dWorkIdx], eleIdx, "", 0, u)>
%endfunction
 
 
%%Function:LibSFDWorkAddr===================================================
%%Returnthecorrectstringforaccessingachartdworkarray
%%block:Blockrecordforthestateflowchart
%%dWorkIdx:DWorkindex
%%eleIdx:Arrayelementindexofthisdworkdata.eleIdxmustbestring.
%%
%function LibSFDWorkAddr(block, dWorkIdx, eleIdx) void
    %return LibBlockDWorkAddr(DWork[dWorkIdx], eleIdx, "", 0)
%endfunction
 
%%Function:LibSFMachineParentedData=========================================
%%ReturnthecorrectstringforaccessingthechartmachineDatas.
%%block:BlockrecordfortheStateflowchart
%%machineDataIdx:MachineParentedDataindex
%%eleIdx:ElementindexforarraymachineData.eleIdxmustbestring.
%%
%function LibSFMachineParentedData(block, machineDataIdx, eleIdx) void
  %assign vgIdx = ...
    CompiledModel.VarGroups.StateflowMachineVarGroupVarIdx[machineDataIdx]
  %assign vgCGTypeIdx = SLibVarGroupCGTypeIdx(vgIdx[0])
  %assign memberCgTypeIdx = LibCGTypeMemberCGTypeIdx(vgCGTypeIdx, vgIdx[1])
  %assign width = LibCGTypeWidth(memberCgTypeIdx)
  %assign sigIndexer = SLibGet1DArrayIndexer(width, eleIdx, "", 0)
  %return SLibCG_GetVarGroupElementPath(vgIdx, ...
    HStructDeclSystemIdx, CrossNoArgFcnBound) + sigIndexer
%endfunction
 
 
%%Function:LibSFAssignMachineParentedData====================================
%%AssignmachineData(arrayelement)withvalue.
%%block:BlockrecordfortheStateflowchart
%%machineDataIdx:MachineParentedDataindex
%%eleIdx:ElementindexforarraymachineData.eleIdxmustbestring.
%%u:Theassignedvalue
%%
%function LibSFAssignMachineParentedData(block, machineDataIdx, eleIdx, u) Output
    %<LibSFMachineParentedData(block, machineDataIdx, eleIdx)> = %<u>;
%endfunction
 
%%Function:LibSFMachineParentedDataAddr======================================
%%ReturnthecorrectstringforaccessingachartmachineDataarray
%%block:Blockrecordforthestateflowchart
%%machineDataIdx:MachineParentedDataindex
%%eleIdx:ArrayelementindexofthismachineDatadata.eleIdxmustbestring.
%%
%function LibSFMachineParentedDataAddr(block, machineDataIdx, eleIdx) void
    %return "&" + LibSFMachineParentedData(block, machineDataIdx, eleIdx)
%endfunction
 
 
%%Function:LibSFParameter=======================================================
%%Returnthecorrectstringforaccessingthechartparameter.
%%block:BlockrecordfortheStateflowchart
%%param:Parameterreference
%%eleIdx:Arrayelementindexofthisparameter.eleIdxmustbestring.
%%
%function LibSFParameter(block, param, eleIdx) void
  %return LibBlockParameter(param, eleIdx, "", 0)
%endfunction
 
%%Function:LibSFParameterAddr===================================================
%%Returnthecorrectaddressstringforaccessingachartparameter.
%%block:Blockrecordforthestateflowchart
%%param:Parameterreference
%%eleIdx:Arrayelementindexofthisparameter.eleIdxmustbestring.
%%
%function LibSFParameterAddr(block, param, eleIdx) void
  %return LibBlockParameterAddr(param, eleIdx, "", 0)
%endfunction
 
%%Function:LibSFOutput=======================================================
%%Returnthecorrectstringforaccessingthechartoutputs.
%%NOTE:port0isreservedbyStateflowforfunction-calloutputevents.
%%block:BlockrecordfortheStateflowchart
%%portIdx:Indexoftheportbeingaccessed
%%eleIdx:Arrayelementindexofthisoutputdata.eleIdxmustbestring.
%%
%function LibSFOutput(block, portIdx, eleIdx) void
  %if portIdx == 0
    %error LibSFOutput cannot be called for port 0 reserved for function calls
  %endif
  %if portIdx >= NumDataOutputPorts
    %error Invalid port number %<portIdx> passed to LibSFOutputs
  %endif
  %return LibBlockOutputSignal(portIdx, eleIdx, "", 0)
%endfunction
 
 
%%Function:LibSFAssignOutput=================================================
%%Assignchartoutput(arrayelement)withvalue.
%%NOTE:port0isreservedbyStateflowforfunction-calloutputevents.
%%block:BlockrecordfortheStateflowchart
%%portIdx:Indexoftheportbeingaccessed
%%eleIdx:Arrayelementindexofthisoutputdata.eleIdxmustbestring.
%%u:Theassignedvalue
%%
%function LibSFAssignOutput(block, portIdx, eleIdx, u) Output
  %if portIdx == 0
    %error LibSFAssignOutput cannot be called for port 0 reserved for function calls
  %endif
  %if portIdx >= NumDataOutputPorts
    %error Invalid port number %<portIdx> passed to LibSFAssignOutput
  %endif
  %<LibBlockAssignOutputSignal(portIdx, eleIdx, "", 0, u)>
%endfunction
 
 
%%Function:LibSFOutputAddr===================================================
%%Returnthecorrectaddressstringforaccessingachartoutput
%%block:Blockrecordforthestateflowchart
%%portIdx:Indexoftheportbeingaccessed
%%eleIdx:Arrayelementindexofthisoutputdata.eleIdxmustbestring.
%%
%function LibSFOutputAddr(block, portIdx, eleIdx) void
  %if portIdx == 0
    %error LibSFOutputAddr cannot be called for port 0 reserved for function calls
  %endif
  %if portIdx >= NumDataOutputPorts
    %error Invalid port number %<portIdx> passed to LibSFOutputAddr
  %endif
  %return LibBlockOutputSignalAddr(portIdx, eleIdx, "", 0)
%endfunction
 
 
%%Function:LibSFOutputs======================================================
%%Abstract:
%%Returnthecorrectstringforaccessingthechartsoutputs.When
%%possible,directaccessisdone,otherwisepointeraccessisused.
%%NOTE:port0isreservedbyStateflowforfunction-calloutputevents
%%
%%block=Blockrecordforthestateflowchart
%%port=numberoftheportbeingaccessed
%%idx=numberorstringfortheelementbeingaccessed
%%
%function LibSFOutputs(block, port, idx) void
  %if port==0
    %error LibSfOutputs cannot be called for port 0 reserved for function calls
  %endif
  %if port>=NumDataOutputPorts
    %error Invalid port number %<port> passed to LibSFOutputs
  %endif
  %if TYPE(idx) == "Number"
    %if idx >= LibBlockOutputSignalWidth(port)
      %error Invalid idx: %<idx> arg in LibSFOutputs, outside valid range.
    %endif
    %return LibBlockOutputSignal(port,"","",idx)
  %else
    %return LibBlockOutputSignal(port,idx,"",0)
  %endif
%endfunction
 
 
%%Function:LibSFOutputArray==================================================
%%Abstract:
%%Returnthecorrectstringforaccessingachartoutputarray.
%%block=Blockrecordforthestateflowchart
%%port=numberoftheportbeingaccessed
%%
%function LibSFOutputArray(block, port, unused) void
  %if port==0
    %error LibSfOutputs cannot be called for port 0 reserved for function calls
  %endif
  %if port>=NumDataOutputPorts
    %error Invalid port number %<port> passed to LibSFOutputs
  %endif
  %return LibBlockOutputSignalAddr(port,"","",0)
%endfunction
 
 
%%Function:LibSFInput=======================================================
%%Returnthecorrectstringforaccessingthechartinput.
%%block:BlockrecordfortheStateflowchart
%%portIdx:Indexoftheportbeingaccessed
%%eleIdx:Arrayelementindexofthisinputdata.eleIdxmustbestring.
%%
%function LibSFInput(block, portIdx, eleIdx) void
  %if portIdx >= NumDataInputPorts
    %error Invalid port number %<portIdx> passed to LibSFInput
  %endif
  %return LibBlockInputSignal(portIdx, eleIdx, "", 0)
%endfunction
 
 
%%Function:LibSFInputAddr===================================================
%%Returnthecorrectaddressstringforaccessingachartinput
%%block:Blockrecordforthestateflowchart
%%portIdx:Indexoftheportbeingaccessed
%%eleIdx:Arrayelementindexofthisinputdata.eleIdxmustbestring.
%%
%function LibSFInputAddr(block, portIdx, eleIdx) void
  %if portIdx >= NumDataInputPorts
    %error Invalid port number %<portIdx> passed to LibSFInputAddr
  %endif
  %return LibBlockInputSignalAddr(portIdx, eleIdx, "", 0)
%endfunction
 
 
%%Function:LibSFInputs======================================================
%%Abstract:
%%Returnthecorrectstringforaccessingthechartsinputs.When
%%possible,directaccessisdone,otherwisepointeraccessisused.
%%
%%block=Blockrecordforthestateflowchart
%%port=numberoftheportbeingaccessed
%%idx=numberorstringfortheelementbeingaccessed
%%
%function LibSFInputs(block, port, idx) void
  %if port>=NumDataInputPorts
    %error Invalid port number %<port> passed to LibSFInputs
  %endif
  %if NumDataInputPorts > 0
    %if TYPE(idx) == "Number"
      %if !(LibGetRecordWidth(DataInputPort[port]) >= idx && idx >=0)
        %error Invalid idx: %<idx> arg in LibSFInputs, outside valid range.
      %endif
      %return LibBlockInputSignal(port,"","",idx)
    %else
      %return LibBlockInputSignal(port,idx,"",0)
    %endif
  %else
    %error Invalid call to LibSFInputs, no inputs for %<LibGetFormattedBlockPath(block)>
  %endif
%endfunction
 
 
%%Function:LibSFInputArray==================================================
%%Abstract:
%%Returnthecorrectstringforaccessingachartinputarray.
%%block=Blockrecordforthestateflowchart
%%port=numberoftheportbeingaccessed
%%
%function LibSFInputArray(block, port, unused) void
  %if port>=NumDataInputPorts
    %error Invalid port number %<port> passed to LibSFInputs
  %endif
  %if NumDataInputPorts > 0
    %return LibBlockInputSignalAddr(port,"","",0)
  %else
    %error Invalid call to LibSFInputArray, no inputs for %<LibGetFormattedBlockPath(block)>
  %endif
%endfunction
 
%function LibSFInputSize(block, port, idx)
    %return SLibGetCurrentInputPortDimensions(port, idx)
%endfunction
 
%function LibSFInputSizeAddr(block, port, idx)
    %return "&" + SLibGetCurrentInputPortDimensions(port, idx)
%endfunction
 
%function LibSFOutputSize(block, port, idx)
    %return SLibGetCurrentOutputPortDimensions(port, idx)
%endfunction
 
%%Function:LibSFOutputSizeAddr==========================================
%function LibSFOutputSizeAddr(block, port, idx)
    %return "&" + SLibGetCurrentOutputPortDimensions(port, idx)
%endfunction
 
%endif %% _SFLIB_
 
%%[EOF]sflib.tlc