%implements * "C"
%include "logging_sup.tlc"
%function BlockInstanceSetup(block, system) void
%<LibBlockSetIsExpressionCompliant(block)>
%endfunction
%function CreateAobHierarchy(block, system) Output
%assign nulldef = SLibGetNullDefinitionFromTfl()
%assign port0DTypeId = LibBlockInputSignalDataTypeId(0)
%if ParamSettings.NumDims > 0
%assign nDims = ParamSettings.NumDims
%assign dims = ParamSettings.Dims
%else
%assign nDims = LibBlockInputSignalNumDimensions(0)
%assign dims = LibBlockInputSignalDimensions(0)
%endif
%assign hierInfoIdx = ParamSettings.HierInfoIndex[0]
%assign nodeIdx = 0
%assign pAobHierarchy = "pAobHierarchyNode0"
void *%<pAobHierarchy> = %<nulldef>;
%openfile statements
rtwAobHierarchyCreateRootNode(&%<pAobHierarchy>);
%closefile statements
%assign statementsBuffer = statements
%createrecord retValsLowerLevel %<CreateAobHierarchyRecursion( ...
port0DTypeId, ...
pAobHierarchy, ...
nDims, ...
dims, ...
hierInfoIdx, ...
nodeIdx ...
)>
%assign nNodes = retValsLowerLevel.val
%assign statementsBuffer = statementsBuffer + retValsLowerLevel.statements
%undef retValsLowerLevel
%assign nNodes = %<nNodes> + 1
%openfile statements
rtwAobHierarchyVerifyNNodes(%<pAobHierarchy>, %<nNodes>);
%closefile statements
%assign statementsBuffer = statementsBuffer + statements
%assign statementsBuffer = STRING(statementsBuffer)
%createrecord retVals { val pAobHierarchy; statements statementsBuffer }
%return retVals
%endfunction
%function CreateAobHierarchyRecursion( ...
dTypeId, ...
parentNodeName, ...
nDims, ...
dims, ...
hierInfoIdx, ...
nodeIdx ...
) Output
%assign statementsBuffer = " "
%assign nulldef = SLibGetNullDefinitionFromTfl()
%assign isNvBus = LibDataTypeIsBus(dTypeId)
%if isNvBus
%assign dimsArrayPrefix = "aobDimensions"
%assign dimsArrayName = ...
"%<CreateDimsArray(nDims, dims, dimsArrayPrefix, nodeIdx)>"
%openfile statements
rtwAobHierarchySetDim(%<parentNodeName>, %<nDims>, %<dimsArrayName>);
%closefile statements
%assign statementsBuffer = statementsBuffer + statements
%assign nChildren = LibDataTypeNumElements(dTypeId)
%foreach childNo = nChildren
%assign childDTypeId = LibDataTypeElementDataTypeId(dTypeId, childNo)
%with ::CompiledModel.BlockHierarchyMap
%assign childHierInfoIdx = ...
SignalHierLoggingInfo[hierInfoIdx].Children[childNo]
%assign childSignalLabel = ...
SignalHierLoggingInfo[childHierInfoIdx].SignalName
%endwith
%assign childNDims = LibDataTypeElementNumDimensions(dTypeId, childNo)
%assign childDims = LibDataTypeElementDimensions(dTypeId, childNo)
%assign nodeIdx = %<nodeIdx> + 1
%assign nodeName = "pAobHierarchyNode" + "%<nodeIdx>"
void *%<nodeName> = %<nulldef>;
%openfile statements
rtwAobHierarchyCreateNode(...
"%<childSignalLabel>", ...
&%<nodeName>...
);
%closefile statements
%assign statementsBuffer = statementsBuffer + statements
%createrecord retValsLowerLevel ...
%<CreateAobHierarchyRecursion( ...
childDTypeId, ...
nodeName, ...
childNDims, ...
childDims, ...
childHierInfoIdx, ...
nodeIdx ...
)>
%assign nodeIdx = retValsLowerLevel.val
%assign statementsBuffer = statementsBuffer + retValsLowerLevel.statements
%undef retValsLowerLevel
%openfile statements
rtwAobHierarchyAddChild(%<parentNodeName>, %<nodeName>);
%closefile statements
%assign statementsBuffer = statementsBuffer + statements
%endforeach
%endif
%assign statementsBuffer = STRING(statementsBuffer)
%createrecord retVals {val nodeIdx; statements statementsBuffer}
%return retVals
%endfunction
%function CreateDimsArray(nDims, dims, prefix, idx) Output
%assign dimsArrayName = prefix + "%<idx>"
%<CreateDims(nDims, dims, dimsArrayName)>
%return dimsArrayName
%endfunction
%function CreateOffsets(parentDatatypeId, numChildren) Output
%assign offsets = "uint_T offsets[%<numChildren>] = {"
%foreach childNo = numChildren
%assign offVal = LibDataTypeElementOffset(parentDatatypeId, childNo)
%assign offsets = offsets + "%<offVal>"
%if childNo != numChildren-1
%assign offsets = offsets + ", "
%endif
%endforeach
%assign offsets = offsets + "};"
%<offsets>
%endfunction
%function CreateDims(nDims, dims, dimsArrayName) Output
%if nDims == 1
uint_T %<dimsArrayName>[1] = {%};
%else
%assign dimsInit = "uint_T %<dimsArrayName>[%<nDims>] = {"
%foreach dimsIdx = nDims
%assign dimsInit = dimsInit + "%"
%if dimsIdx != nDims-1
%assign dimsInit = dimsInit + ", "
%endif
%endforeach
%assign dimsInit = dimsInit + "};"
%<dimsInit>
%endif
%endfunction
%function CreateSignalProbe( ...
pSignalProbeCollectionName, ...
dTypeId, ...
nDims, ...
dims, ...
complexity, ...
signalName, ...
interpMethod, ...
decimation, ...
maxDataPoints, ...
units, ...
leadIdx ...
) Output
%assign nulldef = SLibGetNullDefinitionFromTfl()
%assign dimsArrayPrefix = "signalDimensions"
%assign dimsArrayName = ...
"%<CreateDimsArray(nDims, dims, dimsArrayPrefix, leadIdx)>"
%if LibIsBuiltInDataType(dTypeId)
%assign typeName = SLibGetMLDataTypeFromId(dTypeId)
%if typeName == "boolean"
%assign typeName = "logical"
%endif
%assign isFxp = TLC_FALSE
%elseif LibIsDataTypeFixpt(dTypeId)
%assign curDT = FixPt_GetDataTypeFromIndex(dTypeId)
%if fxpIsDataTypeFixPt(curDT)
%assign typeName = "fixed-point"
%assign isFxp = TLC_TRUE
%elseif fxpIsDataTypeScaledDouble(curDT)
%assign typeName = "scaled-double"
%assign isFxp = TLC_TRUE
%elseif FixPt_DataTypeIsDouble(curDT)
%assign typeName = "double"
%assign isFxp = TLC_FALSE
%elseif FixPt_DatatTypeIsSingle(curDT)
%assign typeName = "single"
%assign isFxp = TLC_FALSE
%elseif FixPt_DatatTypeIsBoolean(curDT)
%assign typeName = "logical"
%assign isFxp = TLC_FALSE
%else
%assert TLC_FALSE
%endif
%assign fxp_isSigned = curDT.IsSigned
%assign fxp_wordLen = curDT.RequiredBits
%assign fxp_slope = curDT.FracSlope
%assign fxp_fixedExp = curDT.FixedExp
%assign fxp_bias = curDT.Bias
%elseif LibIsEnumDataType(dTypeId)
%assign typeName = LibGetDataTypeNameFromId(dTypeId)
%assign isFxp = TLC_FALSE
%else
%assert TLC_FALSE
%endif
%if isFxp
%openfile statementsBuffer
rtwSignalProbeCollectionAddElementFxp(...
%<pSignalProbeCollectionName>, ...
"%<signalName>", ...
"%<interpMethod>", ...
%<decimation>, ...
%<maxDataPoints>, ...
%<nDims>, ...
%<dimsArrayName>, ...
%<complexity>, ...
"%<units>", ...
"%<typeName>", ...
%<fxp_isSigned>, ...
%<fxp_wordLen>, ...
%<fxp_slope>, ...
%<fxp_fixedExp>, ...
%<fxp_bias> ...
);
%closefile statementsBuffer
%else
%assign storedBuiltInTypeName = ""
%if LibIsEnumDataType(dTypeId)
%assign storageID = -1
%if LibIsEnumTypeStoredAsInt(dTypeId)
%assign storageID = 6
%else
%assign storageID = LibGetEnumTypeStorageType(dTypeId)
%endif
%assign storedBuiltInTypeName = SLibGetMLDataTypeFromId(storageID)
%endif
%openfile statementsBuffer
rtwSignalProbeCollectionAddElement(...
%<pSignalProbeCollectionName>, ...
"%<signalName>", ...
"%<interpMethod>", ...
%<decimation>, ...
%<maxDataPoints>, ...
%<nDims>, ...
%<dimsArrayName>, ...
%<complexity>, ...
"%<units>", ...
"%<typeName>",...
"%<storedBuiltInTypeName>"
);
%closefile statementsBuffer
%endif
%assign statementsBuffer = STRING(statementsBuffer)
%return statementsBuffer
%endfunction
%function getParamSettingsDatasetName() Output
%assign datasetName = "tmp_raccel_logsout"
%return datasetName
%endfunction
%function CreateSignalProbeCollectionAob(block, system) Output
%assign statementsBuffer = " "
%assign nulldef = SLibGetNullDefinitionFromTfl()
%assign datasetMetadataKey = STRING(ParamSettings.DatasetMetadataKey)
%assign datasetName = getParamSettingsDatasetName()
%assign elementName = STRING(ParamSettings.ElementNames[0])
%assign blockPath = STRING(ParamSettings.LogBlockPath)
%assert(ParamSettings.ConnectedPortIdx[0] > 0)
%assign logPortIdx = ParamSettings.ConnectedPortIdx[0]
%if datasetMetadataKey == "DATASET_OUTPORT_LOGGING"
%assign logPortIdx = ParamSettings.ElementOrder[0]
%endif
%if IsModelReferenceTarget()
%assign mapInfo = RTMsGet(system, "DataMapInfo")
char* pathToTopModel = %<mapInfo>.mmi.InstanceMap.fullPath;
%else
char* pathToTopModel = "";
%endif
%assign propName = STRING(ParamSettings.PropagatedName)
%assign pSignalProbeCollectionName = "pSignalProbeCollection"
%assign pOSigstreamManagerName = "pOSigstreamManager"
void *%<pSignalProbeCollectionName> = %<nulldef>;
void *%<pOSigstreamManagerName> = %<nulldef>;
%openfile statements
%<pOSigstreamManagerName> = rt_GetOSigstreamManager();
rtwSignalProbeCollectionCreateInstance(...
"%<datasetMetadataKey>", ...
"%<datasetName>", ...
"%<elementName>", ...
"%<propName>", ...
pathToTopModel, ...
"%<blockPath>", ...
%<logPortIdx>, ...
%<pOSigstreamManagerName>, ...
&%<pSignalProbeCollectionName>
);
%closefile statements
%assign statementsBuffer = statementsBuffer + statements
%assign port0DTypeId = LibBlockInputSignalDataTypeId(0)
%assign complexity = LibBlockInputSignalIsComplex(0)
%assign width = LibBlockInputSignalWidth(0)
%if ParamSettings.NumDims > 0
%assign nDims = ParamSettings.NumDims
%assign dims = ParamSettings.Dims
%else
%assign nDims = LibBlockInputSignalNumDimensions(0)
%assign dims = LibBlockInputSignalDimensions(0)
%endif
%if !ISEMPTY(ParamSettings.SignalNames)
%assign signalName = STRING(ParamSettings.SignalNames[0])
%else
%assign signalName = ""
%endif
%assign isLinearInterp = ParamSettings.LinearInterpolation[0]
%assign interpMethod = ""
%if isLinearInterp
%assign interpMethod = "linear"
%else
%assign interpMethod = "zoh"
%endif
%assign decimation = ParamSettings.Decimation[0]
%assign maxDataPoints = ParamSettings.MaxDataPoints[0]
%assign hierInfoIdx = ParamSettings.HierInfoIndex[0]
%assign leafIdx = 0
%assign units = getASCIIEscapedUnitsToLog(0)
%createrecord retValsLowerLevel ...
%<CreateSignalProbeCollectionRecursionAob( ...
block, ...
system, ...
pSignalProbeCollectionName, ...
port0DTypeId, ...
width, ...
nDims, ...
dims, ...
complexity, ...
signalName, ...
interpMethod, ...
decimation, ...
maxDataPoints, ...
units, ...
hierInfoIdx, ...
leafIdx ...
)>
%assign nLeaves = retValsLowerLevel.val
%assign statementsBuffer = statementsBuffer + retValsLowerLevel.statements
%undef retValsLowerLevel
%openfile statements
rtwSignalProbeCollectionVerifyNLeaves(...
%<pSignalProbeCollectionName>, ...
%<nLeaves>...
);
%closefile statements
%assign statementsBuffer = statementsBuffer + statements
%assign statementsBuffer = STRING(statementsBuffer)
%createrecord retVals {val pSignalProbeCollectionName; statements statementsBuffer}
%return retVals
%endfunction
%function CreateSignalProbeCollectionRecursionAob( ...
block, ...
system, ...
pSignalProbeCollectionName, ...
dTypeId, ...
width, ...
nDims, ...
dims, ...
complexity, ...
signalName, ...
interpMethod, ...
decimation, ...
maxDataPoints, ...
units, ...
hierInfoIdx, ...
leafIdx ...
) Output
%assign statementsBuffer = " "
%assign isNvBus = LibDataTypeIsBus(dTypeId)
%if !isNvBus
%if hierInfoIdx >= 0
%with ::CompiledModel.BlockHierarchyMap
%assign signalLabel = SignalHierLoggingInfo[hierInfoIdx].SignalName
%endwith
%else
%assign signalLabel = signalName
%endif
%assign statements = ...
"%<CreateSignalProbe( ...
pSignalProbeCollectionName, ...
dTypeId, ...
nDims, ...
dims, ...
complexity, ...
signalLabel, ...
interpMethod, ...
decimation, ...
maxDataPoints, ...
units, ...
leafIdx ...
)>"
%assign statementsBuffer = statementsBuffer + statements
%assign leafIdx = leafIdx + 1
%else
%assign nChildren = LibDataTypeNumElements(dTypeId)
%foreach dimIdx = %<width>
%foreach childNo = nChildren
%assign childDTypeId = LibDataTypeElementDataTypeId(dTypeId, childNo)
%assign childWidth = LibDataTypeElementWidth(dTypeId, childNo)
%assign childNDims = LibDataTypeElementNumDimensions(dTypeId, childNo)
%assign childDims = LibDataTypeElementDimensions(dTypeId, childNo)
%assign childComplexity = LibDataTypeElementIsComplex(dTypeId, childNo)
%assign childSignalName = LibDataTypeElementName(dTypeId, childNo)
%assign childUnits = getASCIIEscapedUnitsToLogFromBusObject(dTypeId, childNo)
%with ::CompiledModel.BlockHierarchyMap
%assign childHierInfoIdx = ...
SignalHierLoggingInfo[hierInfoIdx].Children[childNo]
%endwith
%assign signalName = ""
%createrecord retValsLowerLevel ...
%<CreateSignalProbeCollectionRecursionAob( ...
block, ...
system, ...
pSignalProbeCollectionName, ...
childDTypeId, ...
childWidth, ...
childNDims, ...
childDims, ...
childComplexity, ...
signalName, ...
interpMethod, ...
decimation, ...
maxDataPoints, ...
childUnits, ...
childHierInfoIdx, ...
leafIdx ...
)>
%assign leafIdx = retValsLowerLevel.val
%assign statementsBuffer = statementsBuffer + retValsLowerLevel.statements
%undef retValsLowerLevel
%endforeach
%endforeach
%endif
%assign statementsBuffer = STRING(statementsBuffer)
%createrecord retVals { val leafIdx; statements statementsBuffer }
%return retVals
%endfunction
%function CreateVirtualBusHierarchyAndSignalProbeCollection(block, system) Output
%assign nulldef = SLibGetNullDefinitionFromTfl()
%assign statementsBuffer = " "
%assign dimsArrayName = "aobDimensions"
uint_T %<dimsArrayName>[1] = { 1 };
%assign pAobHierarchyName = "pAobHierarchyNode0"
%assign datasetMetadataKey = STRING(ParamSettings.DatasetMetadataKey)
%assign datasetName = getParamSettingsDatasetName()
%assign elementName = STRING(ParamSettings.ElementNames[0])
%assign blockPath = STRING(ParamSettings.LogBlockPath)
%assert(ParamSettings.ConnectedPortIdx[0] > 0)
%assign logPortIdx = ParamSettings.ConnectedPortIdx[0]
%if datasetMetadataKey == "DATASET_OUTPORT_LOGGING"
%assign logPortIdx = ParamSettings.ElementOrder[0]
%endif
%if IsModelReferenceTarget()
%assign mapInfo = RTMsGet(system, "DataMapInfo")
char* pathToTopModel = %<mapInfo>.mmi.InstanceMap.fullPath;
%else
char* pathToTopModel = "";
%endif
%assign propName = STRING(ParamSettings.PropagatedName)
%assign pSignalProbeCollectionName = "pSignalProbeCollection"
%assign pOSigstreamManagerName = "pOSigstreamManager"
void *%<pAobHierarchyName> = %<nulldef>;
void *%<pSignalProbeCollectionName> = %<nulldef>;
void *%<pOSigstreamManagerName> = %<nulldef>;
%openfile statements
rtwAobHierarchyCreateRootNode(&%<pAobHierarchyName>);
%<pOSigstreamManagerName> = rt_GetOSigstreamManager();
rtwSignalProbeCollectionCreateInstance(...
"%<datasetMetadataKey>", ...
"%<datasetName>", ...
"%<elementName>", ...
"%<propName>", ...
pathToTopModel, ...
"%<blockPath>", ...
%<logPortIdx>, ...
%<pOSigstreamManagerName>, ...
&%<pSignalProbeCollectionName>
);
%closefile statements
%assign statementsBuffer = statementsBuffer + statements
%if !ISEMPTY(ParamSettings.SignalNames)
%assign signalName = STRING(ParamSettings.SignalNames[0])
%else
%assign signalName = ""
%endif
%assign decimation = ParamSettings.Decimation[0]
%assign maxDataPoints = ParamSettings.MaxDataPoints[0]
%assign hierInfoIdx = ParamSettings.HierInfoIndex[0]
%assign nodeIdx = 0
%assign leafIdx = 0
%createrecord retValsLowerLevel ...
%<CreateVirtualBusHierarchyAndSignalProbeCollectionRecursion( ...
block, ...
system, ...
pAobHierarchyName, ...
pSignalProbeCollectionName, ...
hierInfoIdx, ...
dimsArrayName, ...
signalName, ...
decimation, ...
maxDataPoints, ...
nodeIdx, ...
leafIdx ...
)>
%assign nodeLeafIdx = retValsLowerLevel.val
%assign statementsBuffer = statementsBuffer + retValsLowerLevel.statements
%undef retValsLowerLevel
%assign nNodes = % + 1
%assign nLeaves = %
%openfile statements
rtwAobHierarchyVerifyNNodes(%<pAobHierarchyName>, %<nNodes>);
rtwSignalProbeCollectionVerifyNLeaves(...
%<pSignalProbeCollectionName>, ...
%<nLeaves>...
);
rtwSignalProbeCollectionSetAobHierarchy( ...
%<pSignalProbeCollectionName>, ...
%<pAobHierarchyName>...
);
%closefile statements
%assign statementsBuffer = statementsBuffer + statements
%assign statementsBuffer = STRING(statementsBuffer)
%createrecord retVals {val pSignalProbeCollectionName; statements statementsBuffer}
%return retVals
%endfunction
%function CreateVirtualBusHierarchyAndSignalProbeCollectionRecursion( ...
block, ...
system, ...
parentNodeName, ...
pSignalProbeCollectionName, ...
hierInfoIdx, ...
dimsArrayName, ...
signalName, ...
decimation, ...
maxDataPoints, ...
nodeIdx, ...
leafIdx ...
) Output
%assign statementsBuffer = " "
%assign nulldef = SLibGetNullDefinitionFromTfl()
%with ::CompiledModel.BlockHierarchyMap
%if EXISTS(SignalHierLoggingInfo[hierInfoIdx].NumChildren)
%assign nChildren = SignalHierLoggingInfo[hierInfoIdx].NumChildren
%else
%assign nChildren = 0
%endif
%endwith
%if nChildren == 0
%if hierInfoIdx >= 0
%with ::CompiledModel.BlockHierarchyMap
%assign signalLabel = SignalHierLoggingInfo[hierInfoIdx].SignalName
%endwith
%else
%assign signalLabel = signalName
%endif
%assign nDims = LibBlockInputSignalNumDimensions(leafIdx)
%assign dims = LibBlockInputSignalDimensions(leafIdx)
%assign dTypeId = LibBlockInputSignalDataTypeId(leafIdx)
%assign complexity = LibBlockInputSignalIsComplex(leafIdx)
%assign isLinearInterp = ParamSettings.LinearInterpolation[leafIdx]
%assign interpMethod = ""
%assign units = getASCIIEscapedUnitsToLog(leafIdx)
%if isLinearInterp
%assign interpMethod = "linear"
%else
%assign interpMethod = "zoh"
%endif
%assign statements = ...
"%<CreateSignalProbe( ...
pSignalProbeCollectionName, ...
dTypeId, ...
nDims, ...
dims, ...
complexity, ...
signalLabel, ...
interpMethod, ...
decimation, ...
maxDataPoints, ...
units, ...
leafIdx ...
)>"
%assign statementsBuffer = statementsBuffer + statements
%assign leafIdx = leafIdx + 1
%assign nodeLeafIdx = [%<nodeIdx>; %<leafIdx>]
%else
%openfile statements
rtwAobHierarchySetDim(%<parentNodeName>, 1, %<dimsArrayName>);
%closefile statements
%assign statementsBuffer = statementsBuffer + statements
%assign nodeLeafIdx = [%<nodeIdx>; %<leafIdx>]
%foreach childNo = nChildren
%with ::CompiledModel.BlockHierarchyMap
%assign childHierInfoIdx = ...
SignalHierLoggingInfo[hierInfoIdx].Children[childNo]
%assign childSignalLabel = ...
SignalHierLoggingInfo[childHierInfoIdx].SignalName
%endwith
%assign nodeIdx = nodeLeafIdx[0]
%assign leafIdx = nodeLeafIdx[1]
%assign nodeIdx = %<nodeIdx> + 1
%assign nodeName = "pAobHierarchyNode" + "%<nodeIdx>"
void *%<nodeName> = %<nulldef>;
%openfile statements
rtwAobHierarchyCreateNode(...
"%<childSignalLabel>", ...
&%<nodeName>...
);
rtwAobHierarchyAddChild(%<parentNodeName>, %<nodeName>);
%closefile statements
%assign statementsBuffer = statementsBuffer + statements
%assign signalName = ""
%createrecord retValsLowerLevel ...
%<CreateVirtualBusHierarchyAndSignalProbeCollectionRecursion( ...
block, ...
system, ...
nodeName, ...
pSignalProbeCollectionName, ...
childHierInfoIdx, ...
dimsArrayName, ...
signalName, ...
decimation, ...
maxDataPoints, ...
nodeIdx, ...
leafIdx ...
)>
%assign nodeLeafIdx = retValsLowerLevel.val
%assign statementsBuffer = statementsBuffer + retValsLowerLevel.statements
%undef retValsLowerLevel
%endforeach
%endif
%assign statementsBuffer = STRING(statementsBuffer)
%createrecord retVals {val nodeLeafIdx; statements statementsBuffer}
%return retVals
%endfunction
%function FixPt_Fix2DblConvParams(outDT,inDT) void
%if !FixPt_DataTypeIsDouble(outDT)
%assign errTxt = "Error: The argument outDT must be a double"
%<LibReportFatalError(errTxt)>
%endif
%if !FixPt_DataTypeIsFloat(inDT)
%assign bitsPerChunk = LargestIntegerNumBits
%assign numOfChunk = FixPt_NumChunks(inDT.RequiredBits)
%assign isSigned = inDT.IsSigned
%else
%assign bitsPerChunk = 0
%assign numOfChunk = 0
%assign isSigned = 0
%endif
%assign fExp = inDT.FixedExp - outDT.FixedExp
%assign fSlope = CAST("Real",inDT.FracSlope) / CAST("Real",outDT.FracSlope)
%assign bias = ( CAST("Real",inDT.Bias) - CAST("Real",outDT.Bias) ) / CAST("Real",outDT.FracSlope)
%assign retVectStr = ["%<bitsPerChunk>", "%<numOfChunk>", "%<isSigned>", "%<fSlope>", "%<fExp>", "%<bias>"]
%return retVectStr
%endfunction
%function SetupRuntimeResources(block, system) Output
%assign sigLogRapidAccel = ParamSettings.SigLogRapidAccel
%if block.Type == "ToWorkspace" && ...
(sigLogRapidAccel == 1 || sigLogRapidAccel == 2)
%if sigLogRapidAccel == 1
%return
%elseif sigLogRapidAccel == 2
%<StartSignalStreaming(block, system)>
%return
%endif
%endif
%if CodeFormat == "S-Function"
%assign warnTxt = "ToWorkspace blocks not currently supported " ...
"for S-Function code format. Block disabled."
%<LibBlockReportWarning(block, warnTxt)>
%return
%endif
%if MatFileLogging != 0 && (TargetType == "RT" || isRSim)
%assign name = STRING(ParamSettings.VariableName)
%if name == ""
%return
%endif
%assign maxDataPoints = ParamSettings.MaxDataPoints[0]
%assign decimation = ParamSettings.Decimation[0]
%assign symWidth = LibBlockInputSignalSymbolicWidth(0)
%assign nDims = LibBlockInputSignalNumDimensions(0)
%assign symDims = LibBlockInputSignalSymbolicDimensions(0)
%assign isVarDims = LibGetIsInputPortVarDims(0)
%assign sigDTypeId = LibBlockInputSignalDataTypeId(0)
%if (LibIsDataTypeLogSupported(sigDTypeId, TLC_TRUE) == TLC_FALSE)
%assign warnTxt = "Unable to log data for this block " ...
"because MAT-File logging is not supported for " ...
"data type '%<LibGetDataTypeNameFromId(sigDTypeId)>'."
%<LibBlockReportWarning(block, warnTxt)>
%return
%endif
%assign sigDTypeEnum = LibGetDataTypeEnumFromId(sigDTypeId)
%assign logDTypeId = SLibSigToLogDataType(sigDTypeId, tSS_DOUBLE)
%assign logDTypeEnum = LibGetDataTypeEnumFromId(logDTypeId)
%assign cmplx = LibBlockInputSignalIsComplex(0)
%assign frameData = ParamSettings.FrameData
%assign logVar = LibBlockPWork(LoggedData, "", "", 0)
%assign ts = LibBlockSampleTime(block)
%assign nulldef = SLibGetNullDefinitionFromTfl()
%assign currSigDimsInitStr = ""
%assign currSigDimsSetStr = ""
%assign currSigDimsSizeStr = ""
%assign currSigDimsSize = ConfigSet.TargetBitPerInt/8
%assign currSigDimsSizeComma = ""
%if ParamSettings.SaveFormat == "Array"
{
%if nDims == 1
int_T dimensions[1] = {%};
%else
%assign dimsInit = "int_T dimensions[%<nDims>] = {"
%foreach dimsIdx = nDims
%assign dimsInit = dimsInit + "%"
%if dimsIdx != nDims-1
%assign dimsInit = dimsInit + ", "
%endif
%endforeach
%assign dimsInit = dimsInit + "};"
%<dimsInit>
%endif
%if LibIsDataTypeFixpt(sigDTypeId) && ParamSettings.InputContiguous == "yes"
%assign typeQ = "static "
%assign sigFixPtDType = FixPt_GetDataTypeFromIndex(sigDTypeId)
%assign logFixPtDtype = FixPt_GetDataTypeFromIndex(logDTypeId)
%assign sigDTypeConvParams = FixPt_Fix2DblConvParams(logFixPtDtype,sigFixPtDType)
%<typeQ> RTWLogDataTypeConvert rt_ToWksDataTypeConvert[] = {
{1, %<logDTypeEnum>, %<sigDTypeEnum>, %, %, ...
%, %, %, %}
};
%<SLibGenLogVarCreateWithConvert(logVar, name, logDTypeEnum, ...
"rt_ToWksDataTypeConvert", 0, cmplx, ...
frameData, symWidth, nDims, "dimensions", "NO_LOGVALDIMS",...
nulldef, nulldef, maxDataPoints, decimation, ts, 1)>
if (%<logVar> == %<nulldef>) return;
}
%else
%<SLibGenLogVarCreate(logVar, name, logDTypeEnum, 0, cmplx, ...
frameData, symWidth, nDims, "dimensions", "NO_LOGVALDIMS", ...
nulldef, nulldef, maxDataPoints, decimation, ts, 1)>
if (%<logVar> == %<nulldef>) return;
}
%endif
%else
{
%assign typeQ = "static "
%assign label = ParamSettings.Label
%<typeQ> int_T rt_ToWksWidths[] = {%<symWidth>};
%<typeQ> int_T rt_ToWksNumDimensions[] = {%<nDims>};
%if nDims == 1
%<typeQ> int_T rt_ToWksDimensions[] = {%};
%if isVarDims
%assign currSigDims = SLibGetCurrentInputPortDimensions(0, 0)
%else
%assign currSigDims = "rt_ToWksWidths[0]"
%endif
%assign currSigDimsInitStr = "%<typeQ> void *rt_ToWksCurrSigDims[] ={%<nulldef>};"
%assign currSigDimsSetStr = "rt_ToWksCurrSigDims[0] = &%<currSigDims>; /n"
%assign currSigDimsSizeStr = %<currSigDimsSize>
%else
%assign dimsInit = "%<typeQ> int_T rt_ToWksDimensions[] = {"
%assign currSigDimsInitStr = "%<typeQ> void *rt_ToWksCurrSigDims[] = {"
%foreach dimsIdx = nDims
%assign currSigDimsSizeStr = currSigDimsSizeStr + currSigDimsSizeComma + "%<currSigDimsSize>"
%assign currSigDimsSizeComma = ", "
%assign dimsInit = dimsInit + "%"
%assign currSigDimsInitStr = currSigDimsInitStr + nulldef
%if isVarDims
%assign currSigDims = SLibGetCurrentInputPortDimensions(0, dimsIdx)
%else
%assign currSigDims = "rt_ToWksWidths[0]"
%endif
%assign currSigDimsSetStr = currSigDimsSetStr + ...
"rt_ToWksCurrSigDims[%<dimsIdx>] = &%<currSigDims>; /n"
%if dimsIdx != nDims-1
%assign dimsInit = dimsInit + ", "
%assign currSigDimsInitStr = currSigDimsInitStr + ", "
%endif
%endforeach
%assign dimsInit = dimsInit + "};"
%assign currSigDimsInitStr = currSigDimsInitStr + "};"
%<dimsInit>
%endif
%assign preprocessingFcnPtrsStr = nulldef
%assign preprocessingFcnPtrsComma = ""
%<typeQ> boolean_T rt_ToWksIsVarDims[] = {%<isVarDims>};
%<currSigDimsInitStr>
%<typeQ> int_T rt_ToWksCurrSigDimsSize[] = {%<currSigDimsSizeStr>};
%<typeQ> BuiltInDTypeId rt_ToWksDataTypeIds[] = {%<logDTypeEnum>};
%<typeQ> int_T rt_ToWksComplexSignals[] = {%<cmplx>};
%<typeQ> int_T rt_ToWksFrameData[] = {%<frameData>};
%<typeQ> RTWPreprocessingFcnPtr rt_ToWksLoggingPreprocessingFcnPtrs[] =/
{
%<preprocessingFcnPtrsStr>
};
%<typeQ> const char_T *rt_ToWksLabels[] = {"%<STRING(label)>"};
%if LibIsDataTypeFixpt(sigDTypeId) && ParamSettings.InputContiguous == "yes"
%assign sigFixPtDType = FixPt_GetDataTypeFromIndex(sigDTypeId)
%assign logFixPtDtype = FixPt_GetDataTypeFromIndex(logDTypeId)
%assign sigDTypeConvParams = FixPt_Fix2DblConvParams(logFixPtDtype,sigFixPtDType)
%<typeQ> RTWLogDataTypeConvert rt_ToWksDataTypeConvert[] = {
{1, %<logDTypeEnum>, %<sigDTypeEnum>, %, %, ...
%, %, %, %}
};
%<typeQ> RTWLogSignalInfo rt_ToWksSignalInfo = {
1,
rt_ToWksWidths,
rt_ToWksNumDimensions,
rt_ToWksDimensions,
rt_ToWksIsVarDims,
rt_ToWksCurrSigDims,
rt_ToWksCurrSigDimsSize,
rt_ToWksDataTypeIds,
rt_ToWksComplexSignals,
rt_ToWksFrameData,
rt_ToWksLoggingPreprocessingFcnPtrs,
{rt_ToWksLabels},
%<nulldef>,
%<nulldef>,
%<nulldef>,
{%<nulldef>},
{%<nulldef>},
%<nulldef>,
rt_ToWksDataTypeConvert
};
%else
%<typeQ> RTWLogSignalInfo rt_ToWksSignalInfo = {
1,
rt_ToWksWidths,
rt_ToWksNumDimensions,
rt_ToWksDimensions,
rt_ToWksIsVarDims,
rt_ToWksCurrSigDims,
rt_ToWksCurrSigDimsSize,
rt_ToWksDataTypeIds,
rt_ToWksComplexSignals,
rt_ToWksFrameData,
rt_ToWksLoggingPreprocessingFcnPtrs,
{rt_ToWksLabels},
%<nulldef>,
%<nulldef>,
%<nulldef>,
{%<nulldef>},
{%<nulldef>},
%<nulldef>,
%<nulldef>
};
%endif
%assign blockPath = STRING(LibGetBlockPath(block))
%<typeQ> const char_T rt_ToWksBlockName[] = "%<blockPath>";
%if isVarDims
/* set currSigDims field */
%<currSigDimsSetStr>
%endif
%assign logTime = (ParamSettings.SaveFormat == "StructureWithTime")
%<SLibGenStructLogVarCreate(logVar, name, logTime, maxDataPoints, ...
decimation, ts, "&rt_ToWksSignalInfo", "rt_ToWksBlockName")>
if (%<logVar> == %<nulldef>) return;
}
%endif
%elseif (IsModelReferenceSimTarget() && ParamSettings.SaveFormat == "Dataset" )
if (!slIsRapidAcceleratorSimulating()) {
%<CreateDatasetVariable(block,system)>
%<logSample(block, system, -2)>
%if (ParamSettings.SignalStreamingCapable == "off")
%assign simS = RTMsGet(system, "MdlRefSfcnS")
%assign blockPath = STRING(ParamSettings.LogBlockPath)
if (ssIsRapidAcceleratorActive(%<simS>))
{
slReportToWksNoRTWSupportForDataset(%<simS>,"%<blockPath>","Timeseries" );
}
%endif
}
%if (block.Type == "ToWorkspace" && ...
ParamSettings.SignalStreamingCapable == "on")
else {
%<StartSignalStreaming(block, system)>
}
%endif
%endif
%endfunction
%function StartSignalStreaming(block, system) Output
%if !FEVAL("Simulink.sdi.useSLIOForLogging")
%assign nulldef = SLibGetNullDefinitionFromTfl()
if (rt_GetOSigstreamManager() != %<nulldef>) {
%if 0 < block.NumForEachLevels
uint_T numForEachLevels = %<block.NumForEachLevels>;
%<CreateDims(block.NumForEachLevels,block.ForEachDims,"forEachDims")>
%endif
%assign nInputPorts = block.NumDataInputPorts
%if nInputPorts > 1
%<StartSignalStreamingVirtualBus(block, system)>
%else
%assign dTypeId = LibBlockInputSignalDataTypeId(0)
%assign isNvBus = LibDataTypeIsBus(dTypeId)
%assign hierInfoIdx = ParamSettings.HierInfoIndex[0]
%if isNvBus || hierInfoIdx == -1
%<StartSignalStreamingNonVirtualAob(block, system)>
%else
%<StartSignalStreamingVirtualBus(block, system)>
%endif
%endif
%<logSample(block, system, -2)>
}
%else
%assign pworkAddress = LibBlockPWork(SignalProbe, "", "", 0)
%assign dTypeId = LibBlockInputSignalDataTypeId(0)
%assign isNvBus = LibDataTypeIsBus(dTypeId)
%assign hierInfoIdx = ParamSettings.HierInfoIndex[0]
%if hierInfoIdx == -1
%<StartSlioSignalDef(block, system, pworkAddress)>
%elseif isNvBus
%<StartSlioNVBusSignalDef(block, system, pworkAddress)>
%else
%<StartSlioVirtualBusSignalDef(block, system, pworkAddress)>
%endif
%endif
%endfunction
%function StartSignalStreamingNonVirtualAob(block, system) Output
{
%createrecord retValsLowerLevel %<CreateAobHierarchy(block, system)>
%assign pAobHierarchy = retValsLowerLevel.val
%assign statementsBuffer = retValsLowerLevel.statements
%undef retValsLowerLevel
{
%createrecord retValsLowerLevel %<CreateSignalProbeCollectionAob(block, system)>
%assign pSignalProbeCollection = retValsLowerLevel.val
%assign statementsBuffer = statementsBuffer + retValsLowerLevel.statements
%undef retValsLowerLevel
%openfile statements
rtwSignalProbeCollectionSetAobHierarchy(...
%<pSignalProbeCollection>, ...
%<pAobHierarchy>...
);
%if 0 == block.NumForEachLevels
rtwSignalProbeCollectionFinalizeMetaData(%<pSignalProbeCollection>);
%else
rtwSignalProbeCollectionFinalizeMetaDataForeach(%<pSignalProbeCollection>, numForEachLevels, forEachDims);
%endif
%<LibBlockPWork(SignalProbe, "", "", 0)> = %<pSignalProbeCollection>;
%closefile statements
%assign statementsBuffer = statementsBuffer + statements
%<statementsBuffer>
}
}
%endfunction
%function StartSlioNonVirtualBus(block, system, treeVector) Output
{
%assign dTypeId = LibBlockInputSignalDataTypeId(0)
%if block.ParamSettings.BusDatatypeIdSpecifiedAtOutport > 0
%assign dTypeId = block.ParamSettings.BusDatatypeIdSpecifiedAtOutport
%endif
%assign signalName = STRING(ParamSettings.ElementNames[0])
%assign nChildren = LibDataTypeNumElements(dTypeId)
%if ParamSettings.NumDims > 0
%assign nDims = ParamSettings.NumDims
%assign dims = ParamSettings.Dims
%else
%assign nDims = LibBlockInputSignalNumDimensions(0)
%assign dims = LibBlockInputSignalDimensions(0)
%endif
%assign dimsArrayName = "aobDims"
%<CreateDims(nDims, dims, dimsArrayName)>
%assign hierInfoIdx = ParamSettings.HierInfoIndex[0]
%with ::CompiledModel.BlockHierarchyMap
%assign nChildren = SignalHierLoggingInfo[hierInfoIdx].NumChildren
%endwith
%assign root = "root"
%assign isLinearInterp = ParamSettings.LinearInterpolation[0]
%assign interpMethod = ""
%if isLinearInterp
%assign interpolationMethod = "linear"
%else
%assign interpolationMethod = "zoh"
%endif
%assign sampleTime = ParamSettings.SampleTimeLabels[0]
%if IsModelReferenceSimTarget() && !MdlRefDisallowSampleTimeInheritance()
%assign discreteInterval = 0
%else
%assign discreteInterval = ParamSettings.DiscreteInterval[0]
%endif
%assign stopTime = RTMGet("TFinal")
%assign parentSignalName = ...
STRING(ParamSettings.ElementNames[0])
%assign busSize = LibGetDataTypeSLSizeFromId(dTypeId)
{
%<CreateOffsets(dTypeId, nChildren)>
rtwAddTopNVBusNode(...
%<dTypeId>, ...
"%<parentSignalName>", ...
%<nChildren>, ...
%<dimsArrayName>, ...
%<nDims>, ...
%<busSize>, ...
offsets, ...
"%<sampleTime>", ...
%<discreteInterval>, ...
%<stopTime>, ...
treeVector);
}
%<getNVBusNodeLeaves(block, system, dTypeId, ...
hierInfoIdx, interpolationMethod, sampleTime, ...
discreteInterval, stopTime, treeVector)>
}
%endfunction
%function addEnumLeafNode(...
dTypeId, ...
signalLabel, ...
interpolationMethod, ...
dimsArrayName, ...
nDims, ...
datatypeName, ...
units, ...
resolvedDatatypeName, ...
sampleTime, ...
discreteInterval, ...
stopTime, ...
treeVector) Output
%assign nEnums = FcnGetEnumTypeNumEnums(dTypeId)
%assign allEnumValues = Vector(%<nEnums>) [0@%<nEnums>]
%assign allEnumLabels = Vector(%<nEnums>) [""@%<nEnums>]
%foreach enumIdx = nEnums
%assign allEnumValues[enumIdx] = SLibGetEnumTypeValueFromIndex(dTypeId, enumIdx)
%assign allEnumLabels[enumIdx] = SLibGetEnumTypeStringFromIndex(dTypeId, enumIdx)
%endforeach
%<OutputTypedVectorForDatasetVariable(nEnums, allEnumValues, "int_T", "enumValues")>
%<OutputTypedVectorForDatasetVariable(nEnums, allEnumLabels, "char_T*", "enumLabels")>
rtwAddEnumLeafNode(...
%<dTypeId>, ...
"%<signalLabel>", ...
"%<interpolationMethod>", ...
%<dimsArrayName>, ...
%<nDims>, ...
"%<datatypeName>", ...
"%<units>", ...
"%<resolvedDatatypeName>", ...
"%<sampleTime>", ...
%<discreteInterval>, ...
%<stopTime>, ...
(const unsigned int*)enumValues, ...
(const char**)enumLabels, ...
%<nEnums>, ...
%<treeVector>);
%endfunction
%function getNVBusNodeLeaves(...
block, system, parentDatatypeId, ...
parentHierinfoidx, ...
interpolationMethod, sampleTime, discreteInterval, ...
stopTime, treeVector) Output
%assign dsMetadataKey = STRING(ParamSettings.DatasetMetadataKey)
%assign nChildren = LibDataTypeNumElements(parentDatatypeId)
%foreach childNo = nChildren
%assign childDTypeId = LibDataTypeElementDataTypeId(...
parentDatatypeId, childNo)
%with ::CompiledModel.BlockHierarchyMap
%assign childHierInfoIdx = ...
SignalHierLoggingInfo[parentHierinfoidx].Children[childNo]
%assign childSignalLabel = ...
SignalHierLoggingInfo[childHierInfoIdx].SignalName
%endwith
%assign childNDims = LibDataTypeElementNumDimensions(...
parentDatatypeId, childNo)
%assign childDims = LibDataTypeElementDimensions(...
parentDatatypeId, childNo)
%assign childDimsArrayName = "dims"
%assign isChildNvBus = LibDataTypeIsBus(childDTypeId)
%if isChildNvBus
%assign childNumberOfChildren = ...
LibDataTypeNumElements(childDTypeId)
{
%<CreateDims(childNDims, childDims, childDimsArrayName)>
%<CreateOffsets(childDTypeId, childNumberOfChildren)>
%assign busSize = LibGetDataTypeSLSizeFromId(childDTypeId)
rtwAddNVBusNode(...
%<childDTypeId>, ...
"%<childSignalLabel>", ...
%<childNumberOfChildren>, ...
%<childDimsArrayName>, ...
%<childNDims>, ...
%<busSize>, ...
offsets, ...
%<treeVector>);
}
%<getNVBusNodeLeaves(block, system, childDTypeId, ...
childHierInfoIdx, interpolationMethod, sampleTime, ...
discreteInterval, stopTime, treeVector)>
%else
%assign childComplex = LibDataTypeElementIsComplex(...
parentDatatypeId, childNo)
%assign datatypeName = getDatatypeNameFromId(childDTypeId)
%if dsMetadataKey == "DATASET_SIGNAL_LOGGING"
%assign childUnits = LibDataTypeElementASCIIEscapedUnits(parentDatatypeId, childNo)
%elseif block.ParamSettings.BusDatatypeIdSpecifiedAtOutport == -1 && ...
block.ParamSettings.InheritSourceUnit == "no"
%assign childUnits = ""
%else
%assign childUnits = getASCIIEscapedUnitsToLogFromBusObject(...
parentDatatypeId, childNo)
%endif
{
%<CreateDims(childNDims, childDims, childDimsArrayName)>
%if LibIsBuiltInDataType(childDTypeId)
rtwAddLeafNode(...
%<childDTypeId>, ...
"%<childSignalLabel>", ...
"%<interpolationMethod>", ...
%<childComplex>, ...
%<childDimsArrayName>, ...
%<childNDims>, ...
"%<datatypeName>", ...
"%<childUnits>", ...
"%<sampleTime>", ...
%<discreteInterval>, ...
%<stopTime>, ...
%<treeVector>);
%elseif LibIsDataTypeFixpt(childDTypeId)
%assign curDT = FixPt_GetDataTypeFromIndex(childDTypeId)
%assign fxp_isSigned = curDT.IsSigned
%assign fxp_wordLen = curDT.RequiredBits
%assign fxp_slope = curDT.FracSlope
%assign fxp_fixedExp = curDT.FixedExp
%assign fxp_bias = curDT.Bias
rtwAddFixedPointLeafNode(...
%<childDTypeId>, ...
"%<childSignalLabel>", ...
"%<interpolationMethod>", ...
%<childComplex>, ...
%<childDimsArrayName>, ...
%<childNDims>, ...
"%<datatypeName>", ...
"%<childUnits>", ...
%<fxp_isSigned>, ...
%<fxp_wordLen>, ...
%<fxp_slope>, ...
%<fxp_fixedExp>, ...
%<fxp_bias>, ...
"%<sampleTime>", ...
%<discreteInterval>, ...
%<stopTime>, ...
%<treeVector>);
%elseif LibIsEnumDataType(childDTypeId)
%assign storageID = -1
%if LibIsEnumTypeStoredAsInt(childDTypeId)
%assign storageID = 6
%else
%assign storageID = LibGetEnumTypeStorageType(childDTypeId)
%endif
%assign resolvedDatatypeName = SLibGetMLDataTypeFromId(storageID)
%assign nEnums = FcnGetEnumTypeNumEnums(childDTypeId)
%assign allEnumValues = Vector(%<nEnums>) [0@%<nEnums>]
%assign allEnumLabels = Vector(%<nEnums>) [""@%<nEnums>]
%<addEnumLeafNode(...
childDTypeId, ...
childSignalLabel, ...
interpolationMethod, ...
childDimsArrayName, ...
childNDims, ...
datatypeName, ...
childUnits, ...
resolvedDatatypeName, ...
sampleTime, ...
discreteInterval, ...
stopTime, ...
treeVector)>
%else
%assert TLC_FALSE
%endif
}
%endif
%endforeach
rtwPopNVBusNode(%<treeVector>);
%endfunction
%function StartSlioNVBusSignalDef(block, system, pworkAddress) Output
%assign dsMetadataKey = STRING(ParamSettings.DatasetMetadataKey)
%assign porttype = 3
%assign clientType = 10
%assign portOrder = 0
%if dsMetadataKey == "DATASET_SIGNAL_LOGGING"
%assign porttype = 1
%assign clientType = 1
%assign datasetName = "tmp_raccel_logsout"
%endif
%if dsMetadataKey == "DATASET_OUTPORT_LOGGING"
%assign porttype = 2
%assign clientType = 3
%assign datasetName = "tmp_raccel_yout"
%assign portOrder = ParamSettings.ElementOrder[0]
if (rtwLogRootOutport(rtwGetPointerFromUniquePtr(rt_slioCatalogue())))
%endif
{
%assign nulldef = SLibGetNullDefinitionFromTfl()
%assign treeVector = "treeVector"
void * treeVector = rtwGetTreeVector();
%if 0 < block.NumForEachLevels
uint_T numForEachLevels = %<block.NumForEachLevels>;
%<CreateDims(block.NumForEachLevels,block.ForEachDims,"forEachDims")>
%assign foreachSubDims = "forEachDims, " + STRING(block.NumForEachLevels)
%else
%assign foreachSubDims = nulldef + ", 0"
%endif
%if IsModelReferenceSimTarget()
int_T forEachMdlRefDimsArray[32];
int_T forEachMdlRefDimsArraySize = 0;
if(!slIsRapidAcceleratorSimulating()) {
forEachMdlRefDimsArraySize = slSigLogGetForEachDimsForRefModel(...
%<RTMsGet(system, "MdlRefSfcnS")>, ...
forEachMdlRefDimsArray);
}
%assign foreachTopDims = "forEachMdlRefDimsArraySize ? (const uint_T*)forEachMdlRefDimsArray : " + nulldef + ", forEachMdlRefDimsArraySize"
%else
%assign foreachTopDims = nulldef + ", 0"
%endif
%<StartSlioNonVirtualBus(block, system, treeVector)>
%assign numberOfInputPorts = 1
%assign maxpoints = ParamSettings.MaxDataPoints[0]
%assign decimation = ParamSettings.Decimation[0]
%assign propagatedName = STRING(ParamSettings.PropagatedName)
%assign loggedName = STRING(ParamSettings.ElementNames[0])
{
%assign blockPath = STRING(ParamSettings.LogBlockPath)
%if IsModelReferenceTarget()
%assign mapInfo = RTMsGet(system, "DataMapInfo")
char* pathToTopModel = %<mapInfo>.mmi.InstanceMap.fullPath;
%else
char* pathToTopModel = "";
%endif
%assign logPortIdx = ParamSettings.ConnectedPortIdx[0]
const void * signalDescriptor = rtwGetSignalDescriptor (...
treeVector, ...
%<numberOfInputPorts>, ...
%<porttype>,
%<maxpoints>, ...
%<decimation>, ...
"%<loggedName>", ...
"%<propagatedName>", ...
pathToTopModel, ...
"%<blockPath>", ...
%<logPortIdx>, ...
%<portOrder>, ...
rtwGetPointerFromUniquePtr(rt_slioCatalogue()), ...
%<foreachTopDims>, ...
%<foreachSubDims>);
%if IsModelReferenceTarget()
void * loggingInterval = ...
rtliGetLoggingInterval(%<RTMGet("MdlRefSfcnS")>->mdlInfo->rtwLogInfo);
%else
void * loggingInterval = ...
rtliGetLoggingInterval(%<RTMsGet(system, "RootSS")>->mdlInfo->rtwLogInfo);
%endif
void * accessor = %<nulldef>;
%if FEVAL("Simulink.sdi.useSLIOForLogging")
%if dsMetadataKey == "DATASET_SIGNAL_LOGGING"
if (rtwLoggingOverride(signalDescriptor, rtwGetPointerFromUniquePtr(rt_slioCatalogue()))){
%endif
accessor = rtwGetAccessor(signalDescriptor, loggingInterval);
if (rtwIsLoggingToFile(rtwGetPointerFromUniquePtr(rt_slioCatalogue()))){
rtwAddR2Client(accessor, signalDescriptor, ...
rtwGetPointerFromUniquePtr(rt_slioCatalogue()),"%<datasetName>", %<clientType>);
} else {
rtwAddMemoryClient(accessor, signalDescriptor, ...
rtwGetPointerFromUniquePtr(rt_slioCatalogue()),"%<datasetName>", %<clientType>);
}
%assign datasetName = ""
%if dsMetadataKey == "DATASET_SIGNAL_LOGGING"
}
%endif
%endif
%<pworkAddress> = accessor;
}
%if dsMetadataKey == "DATASET_OUTPORT_LOGGING"
} else {
%<pworkAddress> = %<nulldef>;
}
%else
}
%endif
%endfunction
%function StartSlioVirtualBusSignalDef(block, system, pworkAddress) Output
%assign dsMetadataKey = STRING(ParamSettings.DatasetMetadataKey)
%assign porttype = 3
%assign clientType = 10
%assign portOrder = 0
%if dsMetadataKey == "DATASET_SIGNAL_LOGGING"
%assign porttype = 1
%assign clientType = 1
%assign datasetName = "tmp_raccel_logsout"
%endif
%if dsMetadataKey == "DATASET_OUTPORT_LOGGING"
%assign porttype = 2
%assign clientType = 3
%assign datasetName = "tmp_raccel_yout"
%assign portOrder = ParamSettings.ElementOrder[0]
if (rtwLogRootOutport(rtwGetPointerFromUniquePtr(rt_slioCatalogue())))
%endif
{
%assign nulldef = SLibGetNullDefinitionFromTfl()
%assign treeVector = "treeVector"
%assign dTypeId = block.ParamSettings.BusDatatypeIdSpecifiedAtOutport
void * treeVector = rtwGetTreeVector();
%if 0 < block.NumForEachLevels
uint_T numForEachLevels = %<block.NumForEachLevels>;
%<CreateDims(block.NumForEachLevels,block.ForEachDims,"forEachDims")>
%assign foreachSubDims = "forEachDims, " + STRING(block.NumForEachLevels)
%else
%assign foreachSubDims = nulldef + ", 0"
%endif
%if IsModelReferenceSimTarget()
int_T forEachMdlRefDimsArray[32];
int_T forEachMdlRefDimsArraySize = 0;
if(!slIsRapidAcceleratorSimulating()) {
forEachMdlRefDimsArraySize = slSigLogGetForEachDimsForRefModel(...
%<RTMsGet(system, "MdlRefSfcnS")>, ...
forEachMdlRefDimsArray);
}
%assign foreachTopDims = "forEachMdlRefDimsArraySize ? (const uint_T*)forEachMdlRefDimsArray : " + nulldef + ", forEachMdlRefDimsArraySize"
%else
%assign foreachTopDims = nulldef + ", 0"
%endif
%<StartSlioVirtualBus(block, system, dTypeId, treeVector)>
%assign numberOfInputPorts = block.NumDataInputPorts
%assign maxpoints = ParamSettings.MaxDataPoints[0]
%assign decimation = ParamSettings.Decimation[0]
%assign propagatedName = STRING(ParamSettings.PropagatedName)
%assign loggedName = STRING(ParamSettings.ElementNames[0])
{
%assign blockPath = STRING(ParamSettings.LogBlockPath)
%if IsModelReferenceTarget()
%assign mapInfo = RTMsGet(system, "DataMapInfo")
char* pathToTopModel = %<mapInfo>.mmi.InstanceMap.fullPath;
%else
char* pathToTopModel = "";
%endif
%assign logPortIdx = ParamSettings.ConnectedPortIdx[0]
const void * signalDescriptor = rtwGetSignalDescriptor(...
treeVector, ...
%<numberOfInputPorts>, ...
%<porttype>,
%<maxpoints>, ...
%<decimation>, ...
"%<loggedName>", ...
"%<propagatedName>", ...
pathToTopModel, ...
"%<blockPath>", ...
%<logPortIdx>, ...
%<portOrder>, ...
rtwGetPointerFromUniquePtr(rt_slioCatalogue()), ...
%<foreachTopDims>, ...
%<foreachSubDims>);
%if IsModelReferenceTarget()
void * loggingInterval = ...
rtliGetLoggingInterval(%<RTMGet("MdlRefSfcnS")>->mdlInfo->rtwLogInfo);
%else
void * loggingInterval = ...
rtliGetLoggingInterval(%<RTMsGet(system, "RootSS")>->mdlInfo->rtwLogInfo);
%endif
void * accessor = %<nulldef>;
%if FEVAL("Simulink.sdi.useSLIOForLogging")
%if dsMetadataKey == "DATASET_SIGNAL_LOGGING"
if (rtwLoggingOverride(signalDescriptor, rtwGetPointerFromUniquePtr(rt_slioCatalogue()))){
%endif
accessor = rtwGetAccessor(signalDescriptor, loggingInterval);
if (rtwIsLoggingToFile(rtwGetPointerFromUniquePtr(rt_slioCatalogue()))){
rtwAddR2Client(accessor, signalDescriptor, ...
rtwGetPointerFromUniquePtr(rt_slioCatalogue()),"%<datasetName>", %<clientType>);
} else {
rtwAddMemoryClient(accessor, signalDescriptor, ...
rtwGetPointerFromUniquePtr(rt_slioCatalogue()),"%<datasetName>", %<clientType>);
}
%assign datasetName = ""
%if dsMetadataKey == "DATASET_SIGNAL_LOGGING"
}
%endif
%endif
%<pworkAddress> = accessor;
}
%if dsMetadataKey == "DATASET_OUTPORT_LOGGING"
} else {
%<pworkAddress> = %<nulldef>;
}
%else
}
%endif
%endfunction
%function StartSlioVirtualBus(block, system, parentDatatypeId, treeVector) Output
{
%assign signalName = STRING(ParamSettings.ElementNames[0])
%assign hierInfoIdx = ParamSettings.HierInfoIndex[0]
%with ::CompiledModel.BlockHierarchyMap
%assign nChildren = SignalHierLoggingInfo[hierInfoIdx].NumChildren
%endwith
%assign isLinearInterp = ParamSettings.LinearInterpolation[0]
%assign interpMethod = ""
%if isLinearInterp
%assign interpolationMethod = "linear"
%else
%assign interpolationMethod = "zoh"
%endif
rtwAddTopBusNode(...
"%<signalName>", ...
%<nChildren>, ...
treeVector);
%assign portIdx = 0
%with ::CompiledModel.BlockHierarchyMap
%foreach childNo = nChildren
%assign childHierInfoIdx = SignalHierLoggingInfo[hierInfoIdx].Children[childNo]
%assign portIdx = getBusNodeLeaves(block, system, childHierInfoIdx, ...
portIdx, parentDatatypeId, childNo, treeVector)
%endforeach
%endwith
rtwPopNVBusNode(%<treeVector>);
}
%endfunction
%function getBusNodeLeaves(...
block, system, hierInfoIdx, ...
portIdx, parentDatatypeId, currentChildNo, treeVector) Output
%with ::CompiledModel.BlockHierarchyMap
%assign sigName = SignalHierLoggingInfo[hierInfoIdx].SignalName
%assign nChildren = SignalHierLoggingInfo[hierInfoIdx].NumChildren
%assign dsMetadataKey = STRING(ParamSettings.DatasetMetadataKey)
%if nChildren > 0
rtwAddBusNode(...
"%<sigName>", ...
%<nChildren>, ...
treeVector);
%if parentDatatypeId != -1
%assign currentDatatypeId = LibDataTypeElementDataTypeId(...
parentDatatypeId, currentChildNo)
%else
%assign currentDatatypeId = -1
%endif
%foreach childNo = nChildren
%assign childHierInfoIdx = SignalHierLoggingInfo[hierInfoIdx].Children[childNo]
%assign portIdx = getBusNodeLeaves(block, system, childHierInfoIdx, ...
portIdx, currentDatatypeId, childNo, treeVector)
%endforeach
rtwPopNVBusNode(%<treeVector>);
%return portIdx
%else
%if parentDatatypeId != -1
%if dsMetadataKey == "DATASET_SIGNAL_LOGGING"
%assign units = LibDataTypeElementASCIIEscapedUnits(parentDatatypeId, currentChildNo)
%else
%assign units = getASCIIEscapedUnitsToLogFromBusObject(...
parentDatatypeId, currentChildNo)
%endif
%else
%if dsMetadataKey == "DATASET_SIGNAL_LOGGING"
%assign units = LibBlockInputSignalASCIIEscapedUnitExpr(portIdx)
%elseif block.ParamSettings.InheritSourceUnit == "yes"
%assign units = getASCIIEscapedUnitsToLog(portIdx)
%else
%assign units = ""
%endif
%endif
%<getLeafNode(block, system, portIdx, sigName, units, treeVector)>
%return portIdx + 1
%endif
%endwith
%endfunction
%function getLeafNode(block, system, portIdx, sigName, units, treeVector) Output
{
%assign portDT = LibBlockInputSignalDataTypeId(portIdx)
%assign dtID = LibGetDataTypeIdAliasedThruToFromId(portDT)
%assign complexity = LibBlockInputSignalIsComplex(portIdx)
%assign isLinearInterp = ParamSettings.LinearInterpolation[portIdx]
%assign interpMethod = ""
%if isLinearInterp
%assign interpMethod = "linear"
%else
%assign interpMethod = "zoh"
%endif
%assign nDims = LibBlockInputSignalNumDimensions(portIdx)
%assign dims = LibBlockInputSignalDimensions(portIdx)
%assign sampleTime = ParamSettings.SampleTimeLabels[portIdx]
%if IsModelReferenceSimTarget() && !MdlRefDisallowSampleTimeInheritance()
%assign discreteInterval = 0
%else
%assign discreteInterval = ParamSettings.DiscreteInterval[portIdx]
%endif
%assign stopTime = RTMGet("TFinal")
%<addLeafNode(...
dtID,...
dims, ...
nDims, ...
complexity, ...
interpMethod, ...
sigName, ...
units, ...
sampleTime, ...
discreteInterval, ...
stopTime, ...
treeVector)>
}
%endfunction
%function addLeafNode(...
dtID, dims, nDims, complexity, ...
interpMethod, sigName, sigUnits, ...
sampleTime, discreteInterval, stopTime, treeVector) Output
%assign datatypeName = getDatatypeNameFromId(dtID)
%assign arrayName = "dims"
%<CreateDims(nDims, dims, arrayName)>
%if LibIsBuiltInDataType(dtID)
rtwAddLeafNode(...
%<dtID>, ...
"%<sigName>", ...
"%<interpMethod>", ...
%<complexity>, ...
(unsigned int*)dims, ...
%<nDims>, ...
"%<datatypeName>", ...
"%<sigUnits>", ...
"%<sampleTime>", ...
%<discreteInterval>, ...
%<stopTime>, ...
%<treeVector>);
%elseif LibIsDataTypeFixpt(dtID)
%assign curDT = FixPt_GetDataTypeFromIndex(dtID)
%assign fxp_isSigned = curDT.IsSigned
%assign fxp_wordLen = curDT.RequiredBits
%assign fxp_slope = curDT.FracSlope
%assign fxp_fixedExp = curDT.FixedExp
%assign fxp_bias = curDT.Bias
rtwAddFixedPointLeafNode(...
%<dtID>, ...
"%<sigName>", ...
"%<interpMethod>", ...
%<complexity>, ...
(unsigned int*)dims, ...
%<nDims>, ...
"%<datatypeName>", ...
"%<sigUnits>", ...
%<fxp_isSigned>, ...
%<fxp_wordLen>, ...
%<fxp_slope>, ...
%<fxp_fixedExp>, ...
%<fxp_bias>, ...
"%<sampleTime>", ...
%<discreteInterval>, ...
%<stopTime>, ...
%<treeVector>);
%elseif LibIsEnumDataType(dtID)
%assign storageID = -1
%if LibIsEnumTypeStoredAsInt(dtID)
%assign storageID = 6
%else
%assign storageID = LibGetEnumTypeStorageType(dtID)
%endif
%assign resolvedDatatypeName = SLibGetMLDataTypeFromId(storageID)
%<addEnumLeafNode(...
dtID, ...
sigName, ...
interpMethod, ...
"(unsigned int*)dims", ...
nDims, ...
datatypeName, ...
sigUnits, ...
resolvedDatatypeName, ...
sampleTime, ...
discreteInterval, ...
stopTime, ...
treeVector)>
%else
%assign warnTxt = "User-defined data types not supported for logging to mat-file."
%<LibBlockReportWarning(block, warnTxt)>
%endif
%endfunction
%function StartSlioSignalDef(block, system, pworkAddress) Output
%assign dsMetadataKey = STRING(ParamSettings.DatasetMetadataKey)
%assign porttype = 3
%assign clientType = 10
%assign portOrder = 0
%if dsMetadataKey == "DATASET_SIGNAL_LOGGING"
%assign porttype = 1
%assign clientType = 1
%assign datasetName = "tmp_raccel_logsout"
%endif
%if dsMetadataKey == "DATASET_OUTPORT_LOGGING"
%assign porttype = 2
%assign clientType = 3
%assign datasetName = "tmp_raccel_yout"
%assign portOrder = ParamSettings.ElementOrder[0]
if (rtwLogRootOutport(rtwGetPointerFromUniquePtr(rt_slioCatalogue())))
%endif
{
%assign elementName = STRING(ParamSettings.ElementNames[0])
%assign isLinearInterp = ParamSettings.LinearInterpolation[0]
%assign interpMethod = ""
%if isLinearInterp
%assign interpMethod = "linear"
%else
%assign interpMethod = "zoh"
%endif
%assign dimsArrayPrefix = "signalDimensions"
%if ParamSettings.NumDims > 0
%assign nDims = ParamSettings.NumDims
%assign dims = ParamSettings.Dims
%else
%assign nDims = LibBlockInputSignalNumDimensions(0)
%assign dims = LibBlockInputSignalDimensions(0)
%endif
%assign dimsArrayName = ...
"%<CreateDimsArray(nDims, dims, dimsArrayPrefix, 0)>"
%assign complexity = LibBlockInputSignalIsComplex(0)
%if dsMetadataKey == "DATASET_SIGNAL_LOGGING"
%assign units = LibBlockInputSignalASCIIEscapedUnitExpr(0)
%elseif block.ParamSettings.InheritSourceUnit == "yes"
%assign units = getASCIIEscapedUnitsToLog(0)
%else
%assign units = block.ParamSettings.OutportUnits
%endif
%assign datatypeName = getDatatypeNameFromId(LibBlockInputSignalDataTypeId(0))
%assign maxpoints = ParamSettings.MaxDataPoints[0]
%assign decimation = ParamSettings.Decimation[0]
%assign logPortIdx = ParamSettings.ConnectedPortIdx[0]
%assign propagatedName = STRING(ParamSettings.PropagatedName)
%assign loggedName = STRING(ParamSettings.ElementNames[0])
%assign sigName = STRING(ParamSettings.SignalNames[0])
%assign blockPath = STRING(ParamSettings.LogBlockPath)
%if IsModelReferenceTarget()
%assign mapInfo = RTMsGet(system, "DataMapInfo")
char* pathToTopModel = %<mapInfo>.mmi.InstanceMap.fullPath;
%else
char* pathToTopModel = "";
%endif
%assign numberOfInputPorts = 1
%assign sampleTime = ParamSettings.SampleTimeLabels[0]
%if IsModelReferenceSimTarget() && !MdlRefDisallowSampleTimeInheritance()
%assign discreteInterval = 0
%else
%assign discreteInterval = ParamSettings.DiscreteInterval[0]
%endif
%assign dTypeId = LibBlockInputSignalDataTypeId(0)
%assign nulldef = SLibGetNullDefinitionFromTfl()
%assign treeVector = "treeVector"
void * treeVector = rtwGetTreeVector();
void * loggingInterval = %<nulldef>;
void * accessor = %<nulldef>;
%if 0 < block.NumForEachLevels
uint_T numForEachLevels = %<block.NumForEachLevels>;
%<CreateDims(block.NumForEachLevels,block.ForEachDims,"forEachDims")>
%assign foreachSubDims = "forEachDims, " + STRING(block.NumForEachLevels)
%else
%assign foreachSubDims = nulldef + ", 0"
%endif
%if IsModelReferenceSimTarget()
int_T forEachMdlRefDimsArray[32];
int_T forEachMdlRefDimsArraySize = 0;
if(!slIsRapidAcceleratorSimulating()) {
forEachMdlRefDimsArraySize = slSigLogGetForEachDimsForRefModel(...
%<RTMsGet(system, "MdlRefSfcnS")>, ...
forEachMdlRefDimsArray);
}
%assign foreachTopDims = "forEachMdlRefDimsArraySize ? (const uint_T*)forEachMdlRefDimsArray : " + nulldef + ", forEachMdlRefDimsArraySize"
%else
%assign foreachTopDims = nulldef + ", 0"
%endif
%if LibIsBuiltInDataType(dTypeId)
rtwAddLeafNode(...
%<dTypeId>, ...
"%<sigName>", ...
"%<interpMethod>", ...
%<complexity>, ...
%<dimsArrayName>, ...
%<nDims>, ...
"%<datatypeName>", ...
"%<units>", ...
"%<sampleTime>", ...
%<discreteInterval>, ...
%<RTMGet("TFinal")>, ...
%<treeVector>);
%elseif LibIsDataTypeFixpt(dTypeId)
%assign curDT = FixPt_GetDataTypeFromIndex(dTypeId)
%assign fxp_isSigned = curDT.IsSigned
%assign fxp_wordLen = curDT.RequiredBits
%assign fxp_slope = curDT.FracSlope
%assign fxp_fixedExp = curDT.FixedExp
%assign fxp_bias = curDT.Bias
rtwAddFixedPointLeafNode(...
%<dTypeId>, ...
"%<elementName>", ...
"%<interpMethod>", ...
%<complexity>, ...
%<dimsArrayName>, ...
%<nDims>, ...
"%<datatypeName>", ...
"%<units>", ...
%<fxp_isSigned>, ...
%<fxp_wordLen>, ...
%<fxp_slope>, ...
%<fxp_fixedExp>, ...
%<fxp_bias>, ...
"%<sampleTime>", ...
%<discreteInterval>, ...
%<RTMGet("TFinal")>, ...
%<treeVector>);
%elseif LibIsEnumDataType(dTypeId)
%assign storageID = -1
%if LibIsEnumTypeStoredAsInt(dTypeId)
%assign storageID = 6
%else
%assign storageID = LibGetEnumTypeStorageType(dTypeId)
%endif
%assign resolvedDatatypeName = SLibGetMLDataTypeFromId(storageID)
%<addEnumLeafNode(...
dTypeId, ...
elementName, ...
interpMethod, ...
dimsArrayName, ...
nDims, ...
datatypeName, ...
units, ...
resolvedDatatypeName, ...
sampleTime, ...
discreteInterval, ...
RTMGet("TFinal"), ...
treeVector)>
%else
%assert TLC_FALSE
%endif
{
const void * signalDescriptor = ...
rtwGetSignalDescriptor (...
treeVector, ...
%<numberOfInputPorts>, ...
%<porttype>,
%<maxpoints>, ...
%<decimation>, ...
"%<loggedName>", ...
"%<propagatedName>", ...
pathToTopModel, ...
"%<blockPath>", ...
%<logPortIdx>,
%<portOrder>, ...
rtwGetPointerFromUniquePtr(rt_slioCatalogue()), ...
%<foreachTopDims>, ...
%<foreachSubDims>);
%if IsModelReferenceTarget()
loggingInterval = ...
rtliGetLoggingInterval(%<RTMGet("MdlRefSfcnS")>->mdlInfo->rtwLogInfo);
%else
loggingInterval = ...
rtliGetLoggingInterval(%<RTMsGet(system, "RootSS")>->mdlInfo->rtwLogInfo);
%endif
%if FEVAL("Simulink.sdi.useSLIOForLogging")
%if dsMetadataKey == "DATASET_SIGNAL_LOGGING"
if (rtwLoggingOverride(signalDescriptor, rtwGetPointerFromUniquePtr(rt_slioCatalogue()))){
%endif
accessor = rtwGetAccessor(signalDescriptor, loggingInterval);
if (rtwIsLoggingToFile(rtwGetPointerFromUniquePtr(rt_slioCatalogue()))){
rtwAddR2Client(accessor, signalDescriptor, ...
rtwGetPointerFromUniquePtr(rt_slioCatalogue()),"%<datasetName>", %<clientType>);
} else {
rtwAddMemoryClient(accessor, signalDescriptor, ...
rtwGetPointerFromUniquePtr(rt_slioCatalogue()),"%<datasetName>", %<clientType>);
}
%assign datasetName = ""
%if dsMetadataKey == "DATASET_SIGNAL_LOGGING"
}
%endif
%endif
%<pworkAddress> = accessor;
}
%if dsMetadataKey == "DATASET_OUTPORT_LOGGING"
} else {
%<pworkAddress> = %<nulldef>;
}
%else
}
%endif
%endfunction
%function getDatatypeNameFromId(datatypeId)
%if LibIsBuiltInDataType(datatypeId)
%assign typeName = SLibGetMLDataTypeFromId(datatypeId)
%if typeName == "boolean"
%assign typeName = "logical"
%endif
%assign isFxp = TLC_FALSE
%elseif LibIsDataTypeFixpt(datatypeId)
%assign curDT = FixPt_GetDataTypeFromIndex(datatypeId)
%if fxpIsDataTypeFixPt(curDT)
%assign typeName = "fixed-point"
%assign isFxp = TLC_TRUE
%elseif fxpIsDataTypeScaledDouble(curDT)
%assign typeName = "scaled-double"
%assign isFxp = TLC_TRUE
%elseif FixPt_DataTypeIsDouble(curDT)
%assign typeName = "double"
%assign isFxp = TLC_FALSE
%elseif FixPt_DatatTypeIsSingle(curDT)
%assign typeName = "single"
%assign isFxp = TLC_FALSE
%elseif FixPt_DatatTypeIsBoolean(curDT)
%assign typeName = "logical"
%assign isFxp = TLC_FALSE
%else
%assert TLC_FALSE
%endif
%assign fxp_isSigned = curDT.IsSigned
%assign fxp_wordLen = curDT.RequiredBits
%assign fxp_slope = curDT.FracSlope
%assign fxp_fixedExp = curDT.FixedExp
%assign fxp_bias = curDT.Bias
%elseif LibIsEnumDataType(datatypeId)
%assign typeName = LibGetDataTypeNameFromId(datatypeId)
%assign isFxp = TLC_FALSE
%else
%assert TLC_FALSE
%endif
%return typeName
%endfunction
%function StartSignalStreamingVirtualBus(block, system) Output
%assign statementsBuffer = " "
{
%createrecord retValsLowerLevel ...
%<CreateVirtualBusHierarchyAndSignalProbeCollection(block, system)>
%assign pSignalProbeCollectionName = retValsLowerLevel.val
%assign statementsBuffer = statementsBuffer + retValsLowerLevel.statements
%undef retValsLowerLevel
%openfile statements
%if 0 == block.NumForEachLevels
rtwSignalProbeCollectionFinalizeMetaData(%<pSignalProbeCollectionName>);
%else
rtwSignalProbeCollectionFinalizeMetaDataForeach(%<pSignalProbeCollectionName>, numForEachLevels, forEachDims);
%endif
%<LibBlockPWork(SignalProbe, "", "", 0)> = %<pSignalProbeCollectionName>;
%closefile statements
%assign statementsBuffer = statementsBuffer + statements
%<statementsBuffer>
}
%endfunction
%function outputTranspose(block, system, matrixToTranspose) Output
%assign ipRecord = FcnGetInputPortRecord(0)
%assign dataRecord = SLibGetSourceRecord(ipRecord, 0)
%assign freeStatement = ""
%if !ISEMPTY(dataRecord) && ISFIELD(dataRecord, "PreprocessingFcnPtr")
%assign cgTypeIdx = LibCGTypeFixedPointBaseType(dataRecord.CGTypeIdx)
%assign baseName = SLibGetTypeNameFromCGType(cgTypeIdx)
%assign isComplex = LibCGTypeIsComplex(dataRecord.CGTypeIdx)
%assign complexMul = 1
%if isComplex
%assign complexMul = 2
%endif
%assign numEls = LibGetRecordSymbolicWidth(dataRecord)
%assign preprocessingPtr = dataRecord.PreprocessingFcnPtr
{
void* rt_curData = malloc(sizeof(%<baseName>) * %<complexMul> * %<numEls>);
%<preprocessingPtr>(rt_curData, %<matrixToTranspose>);
%assign freeStatement = "free( rt_curData );"
%endif
%return freeStatement
%endfunction
%function Outputs(block, system) Output
%if block.Type == "ToWorkspace" && EXISTS(ParamSettings) && ...
(ParamSettings.SigLogRapidAccel == 1 || ParamSettings.SigLogRapidAccel == 2)
%if ParamSettings.LogPowerDownEvent == "no"
%<logSingletasking(block, system)>
%endif
%elseif (MatFileLogging != 0) ...
&& (TargetType == "RT" || isRSim) ...
&& (CodeFormat != "S-Function") ...
&& (ParamSettings.VariableName != "")
%assign arrayFormat = (ParamSettings.SaveFormat == "Array")
%assign logVar = LibBlockPWork(LoggedData, "", "", 0)
%assign sigDTypeId = LibBlockInputSignalDataTypeId(0)
%assign nulldef = SLibGetNullDefinitionFromTfl()
%if (LibIsDataTypeLogSupported(sigDTypeId, TLC_TRUE) == TLC_FALSE)
%return
%endif
%assign logDTypeId = SLibSigToLogDataType(sigDTypeId, tSS_DOUBLE)
%if ParamSettings.InputContiguous == "yes" && ...
LibIsDataTypeBuiltinOrFixpt(sigDTypeId)
%assign inpPtr = "%<LibBlockInputSignalAddr(0, "", "", 0)>"
%if arrayFormat
%if ::isRSim
%if isRSimWithSolverModule
if (%<RTMGet("LogOutput")>) {
%else
if (%<RTMIs("MajorTimeStep")>) {
%endif
%elseif (SLibIsERTCodeFormat()) && (NumContStates > 0)
if (%<RTMIs("MajorTimeStep")>) {
%endif
%assign isVarDims = 0
%if ::isRAccel
{
double locTime = %<checkAndGetDESEngTimeSource(block)>;
%assign simS = RTMsGet(system, "RootSS")
%<SLibAddToNonSharedIncludes("simtarget/slSimTgtSigstreamRTW.h")>
%<SLibAddToNonSharedIncludes("simtarget/slSimTgtSlioCoreRTW.h")>
%<SLibAddToNonSharedIncludes("simtarget/slSimTgtSlioClientsRTW.h")>
%<SLibAddToNonSharedIncludes("simtarget/slSimTgtSlioSdiRTW.h")>
if (rtwTimeInLoggingInterval(
rtliGetLoggingInterval(%<simS>->mdlInfo->rtwLogInfo),
locTime))
{
%<SLibGenLogVarUpdate("(LogVar*) (%<logVar>)", inpPtr, isVarDims)>
}
}
%else
%assign freeStatement = outputTranspose(block, system, inpPtr)
%if freeStatement != ""
%<SLibGenLogVarUpdate("(LogVar*) (%<logVar>)", "rt_curData", isVarDims)>
%<freeStatement>
}
%else
%<SLibGenLogVarUpdate("(LogVar*) (%<logVar>)", inpPtr, isVarDims)>
%endif
%endif
%if ::isRSim || ((SLibIsERTCodeFormat()) && (NumContStates > 0))
}
%endif
%else
%if ParamSettings.SaveFormat == "StructureWithTime"
{
double locTime = %<checkAndGetDESEngTimeSource(block)>;
%assign timePtr = "&locTime"
%else
%assign timePtr = nulldef
%endif
%if ::isRSim
%if isRSimWithSolverModule
if (%<RTMGet("LogOutput")>) {
%else
if (%<RTMIs("MajorTimeStep")>) {
%endif
%elseif (SLibIsERTCodeFormat()) && (NumContStates > 0)
if (%<RTMIs("MajorTimeStep")>) {
%endif
%if ::isRAccel
{
%assign simS = RTMsGet(system, "RootSS")
%if ParamSettings.SaveFormat != "StructureWithTime"
double locTime = %<checkAndGetDESEngTimeSource(block)>;
%endif
%<SLibAddToNonSharedIncludes("simtarget/slSimTgtSigstreamRTW.h")>
%<SLibAddToNonSharedIncludes("simtarget/slSimTgtSlioCoreRTW.h")>
%<SLibAddToNonSharedIncludes("simtarget/slSimTgtSlioClientsRTW.h")>
%<SLibAddToNonSharedIncludes("simtarget/slSimTgtSlioSdiRTW.h")>
if (rtwTimeInLoggingInterval(
rtliGetLoggingInterval(%<simS>->mdlInfo->rtwLogInfo),
locTime))
{
%<SLibGenStructLogVarUpdate(logVar, timePtr, inpPtr)>
}
}
%else
%assign freeStatement = outputTranspose(block, system, inpPtr)
%if freeStatement != ""
%<SLibGenStructLogVarUpdate(logVar, timePtr, "rt_curData")>
%<freeStatement>
}
%else
%<SLibGenStructLogVarUpdate(logVar, timePtr, inpPtr)>
%endif
%endif
%if ::isRSim || ((SLibIsERTCodeFormat()) && (NumContStates > 0))
}
%endif
%if ParamSettings.SaveFormat == "StructureWithTime"
}
%endif
%endif
%else
{
%assign symWidth = LibBlockInputSignalSymbolicWidth(0)
%assign isSymbolic = "%<LibBlockInputSignalWidth(0)>" == symWidth
%assign cmplx = LibBlockInputSignalIsComplex(0)
%if LibIsBuiltInDataType(sigDTypeId)
%assign dtype = LibBlockInputSignalDataTypeName(0,"")
%else
%if !cmplx
%assign dtype = LibGetDataTypeNameFromId(logDTypeId)
%else
%assign dtype = LibGetDataTypeComplexNameFromId(logDTypeId)
%endif
%endif
%<dtype> u[%<symWidth>];
%if !isSymbolic
%assign rollVars = ["U"]
%roll idx = RollRegions, lcv = RollThreshold, block, "Roller", rollVars
%assign input = LibBlockInputSignal(0,"",lcv,idx)
%assign rhs = LibGetIndexedElement("u", %<symWidth>, lcv, idx)
%if LibIsBuiltInDataType(sigDTypeId)
%<rhs> = %<input>;
%else
%assign convertBetweenFcn = ...
LibConvertBetweenTLCFcnName(sigDTypeId)
%if LibConvertBetweenTLCFcnFile(sigDTypeId) != ""
%include "%<LibConvertBetweenTLCFcnFile(sigDTypeId)>"
%endif
%assign status = LibComplexConvertBetweenForSrcId(...
logDTypeId, sigDTypeId, cmplx, input, "", rhs)
%if status != 1
%assign errTxt = ...
"Error: funcion %<convertBetweenFcn> doesn't support " ...
"converting the input signal to type double."
%<LibBlockReportFatalError(block, errTxt)>
%endif
%endif
%endroll
%else
%if SIZE(LibRollRegions2StartEndMatrix(RollRegions), 1) > 1
%assign errMsg = "To workspace block taking symbolic matrix input cannot handle discontiguous inputs"
%<LibReportFatalError(errMsg)>
%endif
%assign loopCode = SLibEmitForLoopCounterCode(symWidth, "i")
{
%
% {
%assign input = LibBlockInputSignal(0, "i", "", 0)
%assign rhs = LibGetIndexedElement("u", INT32MAX, "i", 0)
%if LibIsBuiltInDataType(sigDTypeId)
%<rhs> = %<input>;
%else
%assign convertBetweenFcn = ...
LibConvertBetweenTLCFcnName(sigDTypeId)
%if LibConvertBetweenTLCFcnFile(sigDTypeId) != ""
%include "%<LibConvertBetweenTLCFcnFile(sigDTypeId)>"
%endif
%assign status = LibComplexConvertBetweenForSrcId(...
logDTypeId, sigDTypeId, cmplx, input, "", rhs)
%if status != 1
%assign errTxt = ...
"Error: funcion %<convertBetweenFcn> doesn't support " ...
"converting the input signal to type double."
%<LibBlockReportFatalError(block, errTxt)>
%endif
%endif
}
}
%endif
%if arrayFormat
%if ::isRSim
%if isRSimWithSolverModule
if (%<RTMGet("LogOutput")>) {
%else
if (%<RTMIs("MajorTimeStep")>) {
%endif
%elseif (SLibIsERTCodeFormat()) && (NumContStates > 0)
if (%<RTMIs("MajorTimeStep")>) {
%endif
%assign isVarDims = 0
%<SLibGenLogVarUpdate("(LogVar*)%<logVar>", "u", isVarDims)>
%if ::isRSim || ((SLibIsERTCodeFormat()) && (NumContStates > 0))
}
%endif
%else
%if ParamSettings.SaveFormat == "StructureWithTime"
{
double locTime = %<checkAndGetDESEngTimeSource(block)>;
%assign timePtr = "&locTime"
%else
%assign timePtr = nulldef
%endif
%if ::isRSim
%if isRSimWithSolverModule
if (%<RTMGet("LogOutput")>) {
%else
if (%<RTMIs("MajorTimeStep")>) {
%endif
%elseif (SLibIsERTCodeFormat()) && (NumContStates > 0)
if (%<RTMIs("MajorTimeStep")>) {
%endif
%<SLibGenStructLogVarUpdate(logVar, timePtr, "u")>
%if ::isRSim || ((SLibIsERTCodeFormat()) && (NumContStates > 0))
}
%endif
%if ParamSettings.SaveFormat == "StructureWithTime"
}
%endif
%endif
}
%endif
%elseif Accelerator
/* Call into Simulink for To Workspace */
%<SLibCallBlockInSimulink(system, block, "SS_CALL_MDL_OUTPUTS")>
%elseif (IsModelReferenceSimTarget() && ParamSettings.SaveFormat == "Dataset" )
%<logSingletasking(block, system)>
%endif
%endfunction
%function OutputsForTID(block, system, tid) Output
%if (EXISTS(ParamSettings) && ParamSettings.SaveFormat == "Dataset" )
%<logMultitasking(block, system, tid)>
%else
%<Outputs(block, system)>
%endif
%endfunction
%function OutputTypedVectorForDatasetVariable(nValues, values, valueType, varname) Output
%if nValues == 1
%if valueType == "char_T*"
%<valueType> %<varname>[1] = {"%"};
%else
%<valueType> %<varname>[1] = {%};
%endif
%else
%assign valuesInit = "%<valueType> %<varname>[%<nValues>] = {"
%foreach valuesIdx = nValues
%if valueType == "char_T*"
%assign valuesInit = valuesInit + "/"%/""
%else
%assign valuesInit = valuesInit + "%"
%endif
%if valuesIdx != nValues-1
%assign valuesInit = valuesInit + ", "
%endif
%endforeach
%assign valuesInit = valuesInit + "};"
%<valuesInit>
%endif
%endfunction
%function GetDataTypeStrForDatasetVariable(sigDTypeId, simS) Output
%if LibIsEnumDataType(sigDTypeId)
%assign dtName = LibGetDataTypeNameFromId(sigDTypeId)
DTypeId dtId = ssGetDataTypeId(%<simS>, "%<dtName>");
if(dtId == INVALID_DTYPE_ID) return;
%assign dtStr = "dtId"
%elseif LibIsDataTypeFixpt(sigDTypeId)
%assign curDT = FixPt_GetDataTypeFromIndex(sigDTypeId)
DTypeId dtId = ssGetDataTypeId(%<simS>, "%<curDT.DataTypeName>");
if(dtId == INVALID_DTYPE_ID) return;
%assign dtStr = "dtId"
%elseif LibIsBuiltInDataType(sigDTypeId)
%assign dtStr = LibGetDataTypeEnumFromId(sigDTypeId)
%else
%assign errTxt = ...
"User-defined data types not supported for model reference simulation logging."
%<LibReportFatalError(errTxt)>
%endif
%return dtStr
%endfunction
%function GetInterpolationString(isLinearInterp)
%assert(isLinearInterp == 0 || isLinearInterp == 1)
%assign interpStr = "SS_LINEAR_INTERPOLATION"
%if %<isLinearInterp> == 0
%assign interpStr = "SS_ZOH_INTERPOLATION"
%endif
%return interpStr
%endfunction
%function CallAddTimeseriesForDataset(simS, sigDTypeId, cmplx, nDims, dims,...
isLinearInterp, sigName, units) Output
%assign interpStr = GetInterpolationString(isLinearInterp)
{
%assign dimsVarName = "dimensions"
%<OutputTypedVectorForDatasetVariable(nDims, dims, "int_T", dimsVarName)>
%assign dtStr = GetDataTypeStrForDatasetVariable(sigDTypeId, simS)
slSigLogAddTimeseriesDescription(%<simS>,
&pElementDesc,
&pDatasetDesc,
%<sigName>,
%<nDims>,
%<dimsVarName>,
%<dtStr>,
%<cmplx>,
%<interpStr>,
"%<units>");
}
%endfunction
%function CreateDatasetVariable(block, system) Output
%assign simS = RTMsGet(system, "MdlRefSfcnS")
%assign blockPath = STRING(ParamSettings.LogBlockPath)
%assign maxDataPoints = ParamSettings.MaxDataPoints[0]
%assign decimation = ParamSettings.Decimation[0]
%assign busHierIdx = ParamSettings.HierInfoIndex[0]
%assign dsMetadataKey = STRING(ParamSettings.DatasetMetadataKey)
%assign nulldef = SLibGetNullDefinitionFromTfl()
{
%assign mapInfo = RTMsGet(system, "DataMapInfo")
void *pDatasetDesc;
%if dsMetadataKey == "DATASET_SIGNAL_LOGGING" || ...
dsMetadataKey == "DATASET_OUTPORT_LOGGING"
%assign dsName = nulldef
%else
%assign dsName = "/"" + STRING(ParamSettings.VariableName) + "/""
%endif
%if 0 < block.NumForEachLevels
uint_T numForEachLevels = %<block.NumForEachLevels>;
%<CreateDims(block.NumForEachLevels,block.ForEachDims,"forEachDims")>
%endif
_ssLoggerCreateDatasetDescriptWithMMI(%<simS>,
&%<mapInfo>.mmi,
0,
%<nulldef>,
%<dsName>,
&pDatasetDesc);
%if busHierIdx < 0
%assign numElements = block.NumDataInputPorts
%else
%assign numElements = 1
%endif
%assign portIdx = 0
%assign busName = ""
%assign propName = STRING(ParamSettings.PropagatedName)
%foreach elementIdx = numElements
{
%assign elName = STRING(ParamSettings.ElementNames[elementIdx])
%if ParamSettings.ConnectedPortIdx[0] == 0
%assign logPortIdx = portIdx + 1
%else
%assign logPortIdx = ParamSettings.ConnectedPortIdx[0]
%endif
%assign sigDTypeId = LibGetDataTypeIdAliasedThruToForNonBusDtype(LibBlockInputSignalDataTypeId(portIdx))
%if LibDataTypeIsBus(sigDTypeId)
%assert (busName == "")
%assert (numElements == 1)
%assign busName = LibGetDataTypeSLNameFromId(sigDTypeId)
%assign nDims = LibBlockInputSignalNumDimensions(portIdx)
%assign dims = LibBlockInputSignalDimensions(portIdx)
%assign dimsVarName = "dimensions"
%<OutputTypedVectorForDatasetVariable(nDims, dims, "int_T", dimsVarName)>
%assign isLinearInterp = ParamSettings.LinearInterpolation[portIdx]
%assign interpStr = GetInterpolationString(isLinearInterp)
slSigLogAddElementDescriptionForBus(%<simS>,
&pDatasetDesc,
%<busHierIdx>,
"%<busName>",
"%<elName>",
"%<propName>",
"%<blockPath>",
%<logPortIdx>,
%<maxDataPoints>,
%<decimation>,
%<nDims>,
%<dimsVarName>,
%<interpStr>);
%assign portIdx = portIdx + 1
%else
void *pValuesDesc;
void *pElementDesc;
ssLoggerCreateBusValuesDescription(%<simS>, %<busHierIdx>, &pValuesDesc);
ssLoggerAddSignalDescriptionWithValuesDescription(%<simS>,
&pDatasetDesc,
"%<elName>",
"%<propName>",
"%<blockPath>",
%<logPortIdx>,
%<maxDataPoints>,
%<decimation>,
&pValuesDesc,
&pElementDesc);
%if busHierIdx < 0
%assign numSignals = 1
%else
%assign numSignals = block.NumDataInputPorts
%endif
%foreach signalIdx = numSignals
%assert ! LibDataTypeIsBus(sigDTypeId)
%assign cmplx = LibBlockInputSignalIsComplex(portIdx)
%assign nDims = LibBlockInputSignalNumDimensions(portIdx)
%assign dims = LibBlockInputSignalDimensions(portIdx)
%assign isLinearInterp = ParamSettings.LinearInterpolation[portIdx]
%if busHierIdx < 0
%assign sigName = "/"" + STRING(ParamSettings.SignalNames[portIdx]) + "/""
%else
%assign sigName = nulldef
%endif
%assign sigDTypeId = LibGetDataTypeIdAliasedThruToForNonBusDtype(LibBlockInputSignalDataTypeId(portIdx))
%assign units = getASCIIEscapedUnitsToLog(portIdx)
%<CallAddTimeseriesForDataset(simS, sigDTypeId, cmplx, nDims, dims, isLinearInterp, sigName, units)>
%assign portIdx = portIdx + 1
%endforeach
%endif
}
%endforeach
%assign pwork = LibBlockPWork(LoggedData, "", "", 0)
%if 0 < block.NumForEachLevels
if (pDatasetDesc) {
slmrSetForeachDimensions(pDatasetDesc, numForEachLevels, forEachDims);
}
%endif
%if busName == ""
ssLoggerCreateElementFromDescription(%<simS>, &pDatasetDesc, &%<pwork>);
%else
ssLoggerCreateElementFromDescriptionForBus(%<simS>, &pDatasetDesc, "%<busName>", &%<pwork>, %<nulldef>, 0);
%endif
}
%endfunction
%function Terminate(block, system) Output
%if block.Type == "ToWorkspace" && EXISTS(ParamSettings)
%if ParamSettings.LogPowerDownEvent == "yes"
%<logSingletasking(block, system)>
%endif
%if !FEVAL("Simulink.sdi.useSLIOForLogging")
%if ParamSettings.SigLogRapidAccel == 1 || ...
ParamSettings.SigLogRapidAccel == 2
%if ParamSettings.SigLogRapidAccel == 1
%return
%elseif ParamSettings.SigLogRapidAccel == 2
%<TerminateSignalStreaming(block, system)>
%return
%endif
%endif
%if IsModelReferenceSimTarget() && ...
ParamSettings.SignalStreamingCapable == "on" && ...
ParamSettings.SaveFormat == "Dataset"
if (slIsRapidAcceleratorSimulating()) {
%<TerminateSignalStreaming(block, system)>
}
%endif
%endif
%endif
%endfunction
%function TerminateSignalStreaming(block, system) Output
%assign nulldef = SLibGetNullDefinitionFromTfl()
if (rt_GetOSigstreamManager() != %<nulldef>) {
void *pSignalProbeCollection = (void *)%<LibBlockPWork(SignalProbe,"","",0)>;
rtwSignalProbeCollectionDestroyInstance(pSignalProbeCollection);
}
%endfunction