%%==============================================================================
%%
%%
%%
%%Abstract:
%%Outputfiletemplatelibrary
%%
%%Copyright1994-2014TheMathWorks,Inc.
%%
%selectfile NULL_FILE
 
%%=============================================================================
%%Publicfunctions
%%=============================================================================
 
%%SLibGetNumPeriodicTasks======================================================
%%Abstract:
%%Returnthenumberofperiodictasksingeneratedcode.
%%
%function SLibGetNumPeriodicTasks()
  %assign numTasks = 0
  %if LibIsDeploymentDiagram()
    %assign numTasks = SLibDeploymentGetNumPeriodicTasks()
  %else
    %% Note: we use LibGetNumSyncPeriodicTasks instead of LibGetNumRuntimeExportedTasks
    %assign numTasks = LibGetNumSyncPeriodicTasks()
  %endif
  %return numTasks
%endfunction
 
%%SLibGetNumPeriodicTriggers======================================================
%%Abstract:
%%Returnthenumberofperiodictriggersingeneratedcode.
%%
%function SLibGetNumPeriodicTriggers()
  %assign numTriggers = 0
  %if LibIsDeploymentDiagram()
    %foreach ehIdx = LibGetNumTriggers()
      %assign evType = LibGetTriggerType(ehIdx)
      %if ISEQUAL(evType, "PeriodicTrigger")
        %assign numTriggers = numTriggers+1
      %endif
    %endforeach
  %else
    %if LibGetNumSyncPeriodicTasks() > 0
      %assign numTriggers = 1
    %endif
  %endif
  %return numTriggers
%endfunction
 
%%SLibGetNumAperiodicTasks=====================================================
%%Abstract:
%%Returnthenumberofaperiodictasksingeneratedcode.
%%
%function SLibGetNumAperiodicTasks()
  %assign retVal = 0
  %if LibIsDeploymentDiagram()
    %assign retVal = SLibDeploymentGetNumAperiodicTasks()
  %endif
  %return retVal
%endfunction
 
%%SLibGetNumPeriodicMappedEntities============================================
%%Abstract:
%%Returnsthenumberofperiodictasksandperiodictriggerswhich
%%haveblocksmappedtoit.
%%
%function SLibGetNumPeriodicMappedEntities()
  %if LibIsDeploymentDiagram()
    %return SLibDeploymentGetNumPeriodicMappedEntities()
  %else
    %return SLibGetNumPeriodicTasks()
  %endif
%endfunction
 
%%SLibIsTaskProfilingOn=======================================================
%%Abstract:
%%Returnsthenumberofperiodictasksandperiodictriggerswhich
%%haveblocksmappedtoit.
%%
%function SLibIsTaskProfilingOn() void
  %return ISFIELD(::CompiledModel, "ConcurrentExecutionProfileGenCode") && ...
    ISEQUAL(::CompiledModel.ConcurrentExecutionProfileGenCode, 1)
%endfunction
 
%%SLibIsRateMonotonicScheduling===============================================
%%Abstract:
%%ReturnsTLC_TRUEifthereareratemonotonictasksanddeployment
%%diagram,orthereismultitaskingandnotdeploymentdiagram
%%
%function SLibIsRateMonotonicScheduling() void
  %assign isRMSTask = TLC_FALSE
  %if LibIsDeploymentDiagram()
    %foreach ehIdx = LibGetNumTriggers()
      %foreach taskIdx = LibGetNumTriggerTasks(ehIdx)
        %if ISEQUAL(SLibDeploymentGetTaskSchedulingConstraint(ehIdx, taskIdx), ...
          "RateMonotonic")
          %assign isRMSTask = TLC_TRUE
          %break
        %endif
      %endforeach
      %if isRMSTask
        %break
      %endif
    %endforeach
  %endif
  
  %return isRMSTask || ...
    (!SLibConcurrentTasks() && (LibGetNumSyncPeriodicTasks() > 1))
%endfunction
 
%%SLibIsTaskRateMonotonic=====================================================
%%Abstract:
%%ReturnsTLC_TRUEiftaskisratemonotonic
%%
%function SLibIsTaskRateMonotonic(ehIdx, taskIdx) void
  %assert (SLibConcurrentTasks() || LibIsDeploymentDiagram())
  %assign isRMSTask = TLC_FALSE
  %if LibIsDeploymentDiagram()
    %if ISEQUAL(SLibDeploymentGetTaskSchedulingConstraint(ehIdx, taskIdx), ...
      "RateMonotonic")
      %assign isRMSTask = TLC_TRUE
    %endif
  %else
    %assert ISEQUAL(ehIdx, 0)
  %endif
  %return isRMSTask
%endfunction
 
 
%%SLibGetNumClockTicksForTrigger==============================================
%%Abstract:
%%Returnsthenumberofclockticksrequiredbyaperiodictriggertoincrement
%%thetaskcounterforthetasksbelongingtothatperiodictrigger.
%%
%function SLibGetNumClockTicksForTrigger(ehIdx)
  %assign nClockTicks = LibGetTriggerBaseRate(ehIdx)/FundamentalStepSize + 0.5
  %assign nClockTicks = CAST("Number",FEVAL("floor", nClockTicks))
  %return nClockTicks
%endfunction
 
%%SLibGetMaxNumberOfCoresPerTask==============================================
%%Abstract:
%%Returnsthemaximumnumberofcoresassignedtooneofthetasks
%%
%function SLibGetMaxNumberOfCoresPerTask()
  %assign maxNumberOfCoresPerTask = -1
  %foreach ehIdx = LibGetNumTriggers()
    %assign evType = LibGetTriggerType(ehIdx)
    %if ISEQUAL(evType, "AperiodicTrigger")
      %continue
    %endif
    %foreach taskIdx = LibGetNumTriggerTasks(ehIdx)
      %assign affinity = LibGetTaskCoreAffinity(ehIdx, taskIdx)
      %assign affinitySize = SIZE(affinity, 1)
      %if affinitySize > maxNumberOfCoresPerTask
        %assign maxNumberOfCoresPerTask = affinitySize
      %endif
    %endforeach
  %endforeach
  %return maxNumberOfCoresPerTask
%endfunction
   
%%DocFunction{AdvancedFunctions}:LibCallRateScheduler()=====================
%%Abstract:
%%Returnsthecodetocallthemodel'srateschedulerfunctionforconcurrent
%%execution
 
%function LibCallRateScheduler()
  %assert (SLibConcurrentTasks() || LibIsDeploymentDiagram())
  %assign buf = ""
  %if LibIsDeploymentDiagram()
    %assign buf = LibDeploymentCallAdvanceTaskCounters()
  %elseif !SLibSingleTasking()
    %if IsMultiInstanceERTOrModelReference()
      %assign buf = "%<FcnGetMulirateSchedulerName()>(%<::tSimStruct>);"
    %else
      %assign buf = "%<FcnGetMulirateSchedulerName()>();"
    %endif
  %endif
  %return buf
%endfunction
 
 
%%DocFunction{AdvancedFunctions}:LibGetNumTriggers()========================
%%Abstract:
%%Returnsthenumberoftriggersforamodelconfiguredforconcurrent
%%execution
 
%function LibGetNumTriggers()
  %assert (SLibConcurrentTasks() || LibIsDeploymentDiagram())
  %assign numEH = 1 %% At least one periodic event handler
  %if LibIsDeploymentDiagram()
    %assign numEH = LibDeploymentGetNumTaskGroups()
  %endif
  %return numEH
%endfunction
 
 
%%DocFunction{AdvancedFunctions}:LibGetTriggerType()========================
%%Abstract:
%%Returnstriggertypeforamodelconfiguredforconcurrentexecution
%%
%%Returns:
%%"periodic"-PeriodicTriggertrigger
%%"aperiodic"-AperiodicTriggertrigger
 
%function LibGetTriggerType(ehId)
  %assert (SLibConcurrentTasks() || LibIsDeploymentDiagram())
  %assign evType = ""
  %if LibIsDeploymentDiagram()
    %assign evType = SLibDeploymentGetEventType(ehId)
  %else
    %assert ISEQUAL(ehId, 0)
    %assign evType = "PeriodicTrigger"
  %endif
  %return evType
%endfunction
 
 
%%DocFunction{AdvancedFunctions}:LibGetTriggerName()========================
%%Abstract:
%%Returnstriggernameforamodelconfiguredforconcurrentexecution
 
%function LibGetTriggerName(ehId)
  %assert (SLibConcurrentTasks() || LibIsDeploymentDiagram())
  %assign retVal = ""
  %if LibIsDeploymentDiagram()
    %assign retVal = SLibDeploymentGetEventHandlerName(ehId)
  %else
    %assert ISEQUAL(ehId, 0)
    %assign retVal = "baseRate"
  %endif
  %return retVal
%endfunction
 
%%LibGetTaskName()============================================================
%%Abstract:
%%Returnthenameofatask
%function LibGetTaskName(ehId, taskId)
  %assert (SLibConcurrentTasks() || LibIsDeploymentDiagram())
  %assign retVal = ""
  %if LibIsDeploymentDiagram()
    %assign retVal = SLibDeploymentGetTaskName(ehId, taskId)
  %else
    %assert ISEQUAL(ehId, 0)
    %assign retVal = "task%<taskId>"
  %endif
  %return retVal
%endfunction
 
%%DocFunction{AdvancedFunctions}:LibGetTriggerTargetObject()===============
%%Abstract:
%%Returnsthetargetcustomizationobjectassociatedwithatriggerfora
%%modelconfiguredforconcurrentexecution
 
%function LibGetTriggerTargetObject(ehId)
  %assert (SLibConcurrentTasks() || LibIsDeploymentDiagram())
  %assign retVal = ""
  %assign evType = LibGetTriggerType(ehId)
  %if ISEQUAL(evType, "PeriodicTrigger")
    %assign errTxt = "Target object for periodic event handler is not supported"
    %<LibReportError(errTxt)>
  %else
    %assert LibIsDeploymentDiagram()
    %assign retVal = SLibDeploymentGetEventHandlerTargetObject(ehId)
  %endif
  %return retVal
%endfunction
 
%%DocFunction{AdvancedFunctions}:LibGetTriggerBaseRate()====================
%%Abstract:
%%Returnsthebaserateassociatedwithaperiodictriggerfora
%%modelconfiguredforconcurrentexecution
 
%function LibGetTriggerBaseRate(ehId)
  %assert (SLibConcurrentTasks() || LibIsDeploymentDiagram())
  %assign retVal = ""
  %assign evType = LibGetTriggerType(ehId)
  %if ISEQUAL(evType, "AperiodicTrigger")
    %assign errTxt = "Base rate for aperiodic trigger is not supported"
    %<LibReportError(errTxt)>
  %else
    %if LibIsDeploymentDiagram()
      %assign retVal = ::CompiledModel.EventHandler[ehId].Periodicity.BasePeriod
    %else
      %assign retVal = LibGetSampleTimePeriodAndOffset(LibGetTID01EQ(), 0)
    %endif
  %endif
  %return retVal
%endfunction
 
 
%%DocFunction{AdvancedFunctions}:LibGetTriggerHandlerType===================
%%Abstract:
%%Returnsthetriggerhandlertypeforamodelconfiguredforconcurrent
%%execution
%%
%%Returns:
%%"isr"-Maptoanoperatingsystemeventhandler
%%"task"-Maptoanoperatingsystemthread
 
%function LibGetTriggerHandlerType(ehId)
  %assert (SLibConcurrentTasks() || LibIsDeploymentDiagram())
  %assign retVal = ""
  %if LibIsDeploymentDiagram()
    %assign retVal = SLibDeploymentGetEventHandlerType(ehId)
  %else
    %assert ISEQUAL(ehId, 0)
    %assign retVal = "task"
  %endif
  %return retVal
%endfunction
 
 
%%DocFunction{AdvancedFunctions}:LibCallTriggerTask=========================
%%Abstract:
%%Returnsthecodetocallataskfunctionassociatedwithatriggerfora
%%modelconfiguredforconcurrentexecution
 
%function LibCallTriggerTask(ehId, taskId)
  %assert (SLibConcurrentTasks() || LibIsDeploymentDiagram())
  %assign retVal = ""
  %assign evType = LibGetTriggerType(ehId)
  %if ISEQUAL(evType, "PeriodicTrigger")
    %assign errTxt = "LibCallTriggerTask for periodic event handler is not supported"
    %<LibReportError(errTxt)>
  %else
    %assert LibIsDeploymentDiagram()
    %assign retVal = SLibDeploymentEmitCallToEventHandlerTask(ehId, taskId)
  %endif
  %return retVal
%endfunction
 
 
%%DocFunction{AdvancedFunctions}:LibCallTriggerISR==========================
%%Abstract:
%%Returnsthecodetocallaneventhandlerfunctionforamodelconfigured
%%forconcurrentexecution
 
%function LibCallTriggerISR(ehId)
  %assert (SLibConcurrentTasks() || LibIsDeploymentDiagram())
  %assign retVal = ""
  %assign evType = LibGetTriggerType(ehId)
  %if ISEQUAL(evType, "PeriodicTrigger") && !LibIsDeploymentDiagram()
    %assign errTxt = "LibCallTriggerISR for periodic event handler is not supported"
    %<LibReportError(errTxt)>
  %else
    %assert LibIsDeploymentDiagram()
    %assign retVal = SLibDeploymentEmitCallToEventHandler(ehId)
  %endif
  %return retVal
%endfunction
 
 
%%DocFunction{AdvancedFunctions}:LibGetNumTriggerTasks======================
%%Abstract:
%%Returnsthenumberoftaskstriggeredbytheeventassociatedwithatrigger
%%foramodelconfiguredforconcurrentexecution
 
%function LibGetNumTriggerTasks(ehId) void
  %assert (SLibConcurrentTasks() || LibIsDeploymentDiagram())
  %assign numTasks = 0 %% assume
  %if LibIsDeploymentDiagram()
    %assign numTasks = SLibDeploymentGetNumEventHandlerTasks(ehId)
  %else
    %assert ISEQUAL(ehId, 0)
    %assign numTasks = LibGetNumSyncPeriodicTasks()
  %endif
  %return numTasks
%endfunction
 
 
%%DocFunction{AdvancedFunctions}:LibGetTriggerTaskSampleTimeIndex===========
%%Abstract:
%%Returnsthesampletimeindexforatasktriggeredbytheeventassociated
%%withatriggerforamodelconfiguredforconcurrentexecution
 
%function LibGetTriggerTaskSampleTimeIndex(ehId, taskId)
  %assert (SLibConcurrentTasks() || LibIsDeploymentDiagram())
  %assign stId = -1
  %assign retVal = ""
  %assign evType = LibGetTriggerType(ehId)
  %if ISEQUAL(evType, "AperiodicTrigger")
   %assign errTxt = "Target object for aperiodic event handler is not supported"
    %<LibReportError(errTxt)>
  %else
    %if LibIsDeploymentDiagram()
      %assign stId = SLibDeploymentGetTaskSampleTimeIndex(ehId, taskId)
    %else
      %assert ISEQUAL(ehId, 0)
      %assign tid01Eq = ISEQUAL(SolverType, "FixedStep") && FixedStepOpts.TID01EQ
      %assert (taskId < NumRuntimeExportedRates+tid01Eq)
      %assign stId = taskId + tid01Eq
    %endif
  %endif
  %return stId
%endfunction
 
%%DocFunction{AdvancedFunctions}:LibIsCoreAffinityRequired=====================
%%Abstract:
%%ReturnsTLC_TRUEifisrequiredtospecifycoreaffinityforsometasks
%function LibIsCoreAffinityRequired()
  %assert (SLibConcurrentTasks() || LibIsDeploymentDiagram())
  %assign retVal = TLC_FALSE
   
  %if LibIsDeploymentDiagram()
    %foreach ehIdx = LibGetNumTriggers()
      %assign evType = LibGetTriggerType(ehIdx)
      %if ISEQUAL(evType, "PeriodicTrigger")
        %foreach taskIdx = LibGetNumTriggerTasks(ehIdx)
          %assign affinity = LibGetTaskCoreAffinity(ehIdx, taskIdx)
          %if !ISEQUAL(affinity[0], -1)
            %assign retVal = TLC_TRUE
            %break
          %endif
        %endforeach
      %endif
      %if retVal
        %break
      %endif
    %endforeach
  %endif
   
  %return retVal
%endfunction
 
%%DocFunction{AdvancedFunctions}:LibGetTaskCoreAffinity=====================
%%Abstract:
%%Returnsthecoreaffinityofatask
%function LibGetTaskCoreAffinity(ehId, taskId)
  %assert (SLibConcurrentTasks() || LibIsDeploymentDiagram())
  %assign evType = LibGetTriggerType(ehId)
  %if ISEQUAL(evType, "AperiodicTrigger")
   %assign errTxt = "Core affinity for aperiodic trigger is not supported"
    %<LibReportError(errTxt)>
  %else
    %if LibIsDeploymentDiagram()
      %assign affinity = SLibDeploymentGetTaskCoreAffinity(ehId, taskId)
    %else
      %assert ISEQUAL(ehId, 0)
      %assign affinity = 0
    %endif
  %endif
  %return affinity
%endfunction