WSF
WsfFrameStepSimulation Class Reference

A specialization of WsfSimulation that implements an frame-based simulation. More...

#include <WsfFrameStepSimulation.hpp>

Inheritance diagram for WsfFrameStepSimulation:
Collaboration diagram for WsfFrameStepSimulation:

Public Member Functions

 WsfFrameStepSimulation (WsfScenario &aScenario, unsigned int aRunNumber)
 ~WsfFrameStepSimulation () override=default
void AddEvent (std::unique_ptr< WsfEvent > aEventPtr) override
double AdvanceTime () override
double AdvanceTime (double aSimTime) override
bool AddPlatform (WsfPlatform *aPlatformPtr) override
bool AddPlatform (double aSimTime, WsfPlatform *aPlatformPtr) override
void DeletePlatform (double aSimTime, WsfPlatform *aPlatformPtr, bool aDeleteMemory=true) override
void Initialize () override
void Start () override
void Complete (double aSimTime) override
void SetRealtime (double aSimTime, bool aIsRealTime) override
void WaitForAdvanceTime () override
double GetFrameTime () const
Public Member Functions inherited from WsfSimulation
 WsfSimulation (const WsfScenario &aScenario, unsigned int aRunNumber)
virtual ~WsfSimulation ()
 WsfSimulation (const WsfSimulation &aSrc)=delete
WsfSimulationoperator= (const WsfSimulation &aRhs)=delete
const WsfScenarioGetScenario () const
WsfApplicationGetApplication () const
virtual void PrepareSimulation ()
template<typename T, typename... Args>
T * AddEventT (Args &&... args)
virtual void AddWallEvent (std::unique_ptr< WsfEvent > aEventPtr)
template<typename T, typename... Args>
T * AddWallEventT (Args &&... args)
virtual bool ShouldExecute () const
virtual void Pause ()
 Pause execution of the simulation.
void PauseAndRequestAdvance (double)
 Pause the execution of the simulation and request a time advance in scaled-and-stepped mode.
virtual void Resume ()
 Resume execution of the paused simulation.
virtual void RequestReset ()
bool IsActive () const
State GetState () const
 Return the simulation's current state.
const std::string & GetStateString () const
 Return the string representation of the simulation's current state.
CompletionReason GetCompletionReason () const
virtual std::string GetCompletionReasonString () const
virtual void RequestTermination ()
void SetEndTime (double aEndTime)
 Set the defined end time of the simulation.
double GetSimTime () const
 Get the last time to which the simulation was updated.
double GetEndTime () const
 Get the defined end time of the simulation.
virtual double GetNextEventTime () const
double GetRealTime () const
bool IsRealTime () const
 Return whether this simulation is running real-time, or a multiple of real-time.
double GetWallTime () const
 Get the current wall-clock time since simulation creation.
double GetTimeBehind () const
double GetTimestep () const
double GetSyncTimestep () const
void SetIsExternallyStarted (bool aIsExternallyStarted)
bool IsExternallyStarted () const
 Return whether the simulation is to be started by an external source.
bool MultiThreadingActive () const
 Return whether the simulation multi-threading is currently active.
void SetMultiThreadingActive (bool aMultiThreadingActive)
 Set whether multi-threading is currently active ('true') or not ('false').
bool IsEventStepSimulation () const
 Return event step simulation indicator.
void SetAmAnEventStepSimulation (bool aFlag)
void SetClockSource (std::unique_ptr< WsfClockSource > aClockSourcePtr)
const WsfClockSourceGetClockSource () const
virtual double GetClockRate () const
 Returns the clock rate of the simulation.
virtual void SetClockRate (double aClockRate)
 Changes the clock rate of the simulation.
virtual void SetTimeParameters (int aTimeScheme, double aSimTime, double aClockRate, double aTimeStep, bool aTimeAdvance=false)
 Change the time parameters of the simulation.
WsfPlatformGetPlatformByIndex (size_t aIndex) const
WsfPlatformGetPlatformByName (WsfStringId aNameId) const
bool PlatformExists (size_t aIndex) const
 Returns 'true' if the platform with the specified index still exists.
WsfStringId GetPlatformNameId (size_t aIndex) const
 Return the name (ID) of a platform, even if the platform has been deleted from the simulation.
WsfStringId GetPlatformTypeId (size_t aIndex) const
 Return the type (ID) of a platform, even if the platform has been deleted from the simulation.
size_t GetPlatformCount () const
WsfPlatformGetPlatformEntry (size_t aEntry) const
virtual bool TurnPartOff (double aSimTime, WsfPlatformPart *aPartPtr)
virtual bool TurnPartOn (double aSimTime, WsfPlatformPart *aPartPtr)
virtual bool SetPartOperational (double aSimTime, WsfPlatformPart *aPartPtr, bool aOperational=true)
virtual void SetPartUpdateInterval (double aSimTime, WsfPlatformPart *aPartPtr, double aUpdateInterval)
virtual bool PlatformDeleted (double aSimTime, WsfPlatform *aOldPlatformPtr)
virtual void ProcessRemovePlatformEvent (double aSimTime, WsfPlatform *aPlatformPtr, bool aDeletePlatform)
 Called from RemovePlatformEvent to complete the processing of deleting a platform.
virtual void ProcessPlatformBrokenEvent (double aSimTime, WsfPlatform *aPlatformPtr)
 Call from PlatformBrokenEvent to complete the processing of the broken of a platform.
virtual void SimulationStarting ()
 Deprecated form of Start();.
virtual void SimulationComplete (double aSimTime)
 Deprecated form of Complete();.
bool IsFlexibleRealtime () const
 Return 'true' if the simulation's real-time constraint is flexible.
void SetFlexibleRealtime ()
WsfAdvancedBehaviorObserverGetAdvancedBehaviorObserver () const
WsfBehaviorObserverGetBehaviorObserver () const
WsfCommObserverGetCommObserver () const
WsfDisObserverGetDisObserver () const
WsfExchangeObserverGetExchangeObserver () const
WsfFuelObserverGetFuelObserver () const
WsfMoverObserverGetMoverObserver () const
WsfPlatformObserverGetPlatformObserver () const
WsfPlatformPartObserverGetPlatformPartObserver () const
WsfProcessorObserverGetProcessorObserver () const
WsfScriptStateMachineObserverGetScriptStateMachineObserver () const
WsfSensorObserverGetSensorObserver () const
WsfSimulationObserverGetSimulationObserver () const
WsfTaskObserverGetTaskObserver () const
WsfTrackObserverGetTrackObserver () const
WsfZoneObserverGetZoneObserver () const
WsfSimulationExtensionFindExtension (const std::string &aName) const
WsfSimulationExtensionGetExtension (const std::string &aName) const
const WsfExtensionListGetExtensions () const
void RegisterExtension (const std::string &aName, std::unique_ptr< WsfSimulationExtension > aExtensionPtr)
const std::vector< std::string > & GetExtensionNames () const
unsigned int AssignUniqueId ()
 Assign the next unique identifier for WsfUniqueId.
ut::Random & GetRandom ()
ut::Random & LockRandom ()
void UnlockRandom ()
ut::Random & GetScriptRandom ()
ut::Random & LockScriptRandom ()
void UnlockScriptRandom ()
wsf::TerrainInterfaceGetTerrainInterface () const
WsfDateTimeGetDateTime ()
const WsfDateTimeGetDateTime () const
WsfGroupManagerGetGroupManager ()
wsf::comm::NetworkManagerGetCommNetworkManager () const
WsfMultiThreadManagerGetMultiThreadManager ()
WsfPathFinderListGetPathFinderList () const
WsfScriptContextGetScriptContext ()
const WsfScriptContextGetScriptContext () const
WsfLOS_ManagerGetLOS_Manager () const
WsfZoneAttenuationGetZoneAttenuation ()
WsfEM_ManagerGetEM_Manager ()
UtScriptExecutor & GetScriptExecutor ()
UtAtmosphere & GetAtmosphere () const
 Return the UtAtmosphere object used by the simulation.
WsfEnvironmentGetEnvironment () const
WsfSystemLogGetSystemLog () const
WsfIFF_ManagerGetIFF_Manager () const
unsigned int NextMessageSerialNumber ()
unsigned int NextEngagementSerialNumber ()
unsigned int PreviousEngagementSerialNumber () const
void ReclaimPreviousEngagementSerialNumber ()
double CreateMessageDataTag ()
bool MultiThreaded () const
 Return whether the simulation should multi-thread were appropriate.
unsigned int GetRunNumber () const
 Get the current run number.
unsigned int GetFinalRunNumber () const
bool RandomizeFrequency () const
bool UseDefaultFrequency () const
double GetMinimumMoverTimestep () const
const WsfSimulationInputGetSimulationInput () const
std::string SubstituteOutputFileVariables (const std::string &aOutputFile)

Public Attributes

UtCallbackListN< void(double)> AdvanceFrameObjects

Protected Member Functions

virtual double AdvanceFrame ()
void CreateClock () override
bool TurnPartOffP (double aSimTime, WsfPlatformPart *aPartPtr) override
bool TurnPartOnP (double aSimTime, WsfPlatformPart *aPartPtr) override
bool AddInputPlatforms ()
virtual bool SetPartOperationalP (double aSimTime, WsfPlatformPart *aPartPtr, bool aOperational)
virtual void DispatchWallEvents ()
 Dispatch any pending wall clock events up to and including the indicated time.
virtual void DispatchSimEvents (double aSimTime)
virtual void DispatchEvents (double aSimTime)
virtual bool PlatformInitialized (double aSimTime, WsfPlatform *aNewPlatformPtr)
virtual bool PlatformIntroduced (double aSimTime, WsfPlatform *aNewPlatformPtr)
virtual bool SimulationInitialized ()
virtual bool PlatformIsAvailable (WsfPlatform *aPlatformPtr)
void AddToPlatformList (WsfPlatform *aPlatformPtr)
bool DeleteFromPlatformList (WsfPlatform *aPlatformPtr)
bool PlatformPointerExists (WsfPlatform *aPlatformPtr)
void ResetPlatformList ()
 Reset the list to its initial (empty) state.

Protected Attributes

const WsfFrameStepSimulationInputmFrameStepInput
double mFrameCount
double mNextFrameTime
double mTimeUntilNextFrame
double mTotalFrameUnderTime
double mTotalFrameUnderCount
double mTotalFrameOverTime
double mTotalFrameOverCount
double mSkippedFrameCount
double mWorstFrameOverTime
std::vector< WsfPlatform * > mPlatforms
std::vector< wsf::comm::Comm * > mComms
std::vector< WsfProcessor * > mProcessors
std::vector< WsfSensor * > mSensors
WsfEM_Manager mEM_Manager
 EM manager.
WsfEventManager mEventManager
 Simulation event manager object.
WsfEventManager mWallEventManager
 Wall clock-based event manager object.
std::unique_ptr< WsfClockSourcemClockSourcePtr {nullptr}
 Pointer to the simulation clock source object.
WsfRealTimeClockSourcemRealTimeClockSourcePtr {nullptr}
double mSimTime {0.0}
 The last time to which the simulation has been updated (seconds).
double mRealTime {false}
double mTimeBehind {0.0}
 The amount of time the simulation clock is behind the real-time clock.
double mTimestep {0.0}
double mSyncAccumulatedTime {0.0}
 The wall clock time taken to execute the current synchronized time step.
volatile State mState {cPENDING_INITIALIZE}
 The current state of the simulation.
volatile CompletionReason mCompletionReason {cNONE}
 The reason for simulation completion.
bool mExternalEventReady {false}
 True if an external event needs to be processed.
unsigned int mRunNumber
 The current run number being executed.
const WsfSimulationInputmSimulationInput
WsfDateTime mDateTime
bool mMultiThreaded
double mMinimumMoverTimestep
double mEndTime {std::numeric_limits<double>::max()}
 The end time of the simulation (seconds).
bool mIsRealTime {false}

Additional Inherited Members

Public Types inherited from WsfSimulation
enum  State {
  cPENDING_INITIALIZE , cINITIALIZING , cPENDING_START , cSTARTING ,
  cACTIVE , cPENDING_COMPLETE , cCOMPLETE
}
 An enumerated type specifying the state of the simulation. More...
enum  CompletionReason {
  cNONE , cEND_TIME_REACHED , cRESET , cTERMINATE ,
  cOTHER
}
 An enumerated type specifying the reason for completion of the simulation. More...
static const std::string & GetStateString (State aState)
 Return the string representation of the provided simulation state.

Detailed Description

A specialization of WsfSimulation that implements an frame-based simulation.

This is just an example of a frame-based (fixed timestep) simulation. This implementation can be used as a guide for implementing a custom frame-based simulation.

Constructor & Destructor Documentation

◆ WsfFrameStepSimulation()

WsfFrameStepSimulation::WsfFrameStepSimulation ( WsfScenario & aScenario,
unsigned int aRunNumber )

Constructor

Parameters
aScenarioThe scenario
aRunNumberThe Monte-Carlo run number If 'false' then every call to AdvanceTime will result in a frame advance.

References WsfScenario::GetSimulationInput(), mComms, mFrameCount, mFrameStepInput, mNextFrameTime, mPlatforms, mProcessors, mSensors, mSkippedFrameCount, mTimeUntilNextFrame, mTotalFrameOverCount, mTotalFrameOverTime, mTotalFrameUnderCount, mTotalFrameUnderTime, mWorstFrameOverTime, and WsfSimulation::WsfSimulation().

Referenced by engage::Simulation::Simulation().

◆ ~WsfFrameStepSimulation()

WsfFrameStepSimulation::~WsfFrameStepSimulation ( )
overridedefault

References GetFrameTime().

Member Function Documentation

◆ AddEvent()

void WsfFrameStepSimulation::AddEvent ( std::unique_ptr< WsfEvent > aEventPtr)
overridevirtual

Add an event to the simulation event queue.

Parameters
aEventPtrA pointer to the event to be queued. This classes assumes ownership of the object.

Reimplemented from WsfSimulation.

References WsfSimulation::mEventManager, and mNextFrameTime.

◆ AddPlatform() [1/2]

bool WsfFrameStepSimulation::AddPlatform ( double aSimTime,
WsfPlatform * aPlatformPtr )
overridevirtual

Add a platform to an active simulation.

This method should be used to add platforms to a simulation that is running.

It is an error to invoke this before WsfSimulation::Initialize has been called.

Parameters
aSimTimeThe time at which to add the platform to the simulation.
aPlatformPtrPointer to the platform to be added. This class assumes ownership of the platform.
Returns
'true' if the platform was added or 'false' if an not.
Note
If aSimTime is less than the current simulation time, it will be clamped to the current simulation time. If aSimTime is greater than the current simulation time, it will be scheduled to be added to the simulation at that future time.

Reimplemented from WsfSimulation.

References WsfMultiThreadManager::AddPlatform(), WsfSimulation::AddPlatform(), WsfSimulation::GetMultiThreadManager(), mPlatforms, WsfSimulation::MultiThreaded(), and ok.

◆ AddPlatform() [2/2]

bool WsfFrameStepSimulation::AddPlatform ( WsfPlatform * aPlatformPtr)
overridevirtual

Add a platform to an active simulation.

This method should be used to add platforms to a simulation that is running.

It is an error to invoke this before WsfSimulation::Initialize has been called.

Parameters
aPlatformPtrPointer to the platform to be added. This class assumes ownership of the platform.
Returns
'true' if the platform was added or 'false' if an not.

Reimplemented from WsfSimulation.

References WsfSimulation::AddPlatform().

◆ AdvanceFrame()

◆ AdvanceTime() [1/2]

double WsfFrameStepSimulation::AdvanceTime ( )
overridevirtual

◆ AdvanceTime() [2/2]

double WsfFrameStepSimulation::AdvanceTime ( double aSimTime)
overridevirtual

Dispatch the next event if its time is less than or equal to the specified time.

Parameters
aSimTimeDesired simulation time.
Returns
If an event was dispatched then the time of the event, otherwise 'aSimTime'.

Reimplemented from WsfSimulation.

References AdvanceFrame(), WsfObserver::AdvanceTime(), WsfSimulation::mClockSourcePtr, mNextFrameTime, and simTime.

◆ Complete()

void WsfFrameStepSimulation::Complete ( double aSimTime)
overridevirtual

Indicate that the application has completed its simulation loop.

This performs the following action (in the order specified):

  • Marks the simulation as complete.
  • Stops the clock.
  • Invokes SimulationComplete for each registered simulation observer.
  • Deletes all remaining platforms.
  • Deletes all remaining events in the event queue
  • Invokes the Complete method for each registered simulation extension.
  • Resets the clock back to 0.0
Parameters
aSimTimeThe current simulation time.

Reimplemented from WsfSimulation.

References WsfMultiThreadManager::Complete(), WsfSimulation::Complete(), GetFrameTime(), WsfSimulation::GetMultiThreadManager(), mFrameCount, WsfSimulation::mIsRealTime, mSkippedFrameCount, mTotalFrameOverCount, mTotalFrameOverTime, mTotalFrameUnderCount, mTotalFrameUnderTime, WsfSimulation::MultiThreaded(), and mWorstFrameOverTime.

Referenced by engage::Task::Execute().

◆ CreateClock()

void WsfFrameStepSimulation::CreateClock ( )
overrideprotectedvirtual

This is a method used to create the type of clock the simulation expects.

Note
See WsfEventStepSimulation for a non-trivial implementation.

Reimplemented from WsfSimulation.

References WsfSimulation::mIsRealTime, and WsfSimulation::SetClockSource().

Referenced by SetRealtime().

◆ DeletePlatform()

void WsfFrameStepSimulation::DeletePlatform ( double aSimTime,
WsfPlatform * aPlatformPtr,
bool aDeleteMemory = true )
overridevirtual

Delete a platform from the simulation

Parameters
aSimTimeCurrent simulation time
aPlatformPtrPointer to platform to be deleted
aDeleteMemoryIf true (default), platform's memory will be cleaned up. Otherwise, platform is simply removed from the simulation and ownership of platform is released.

Reimplemented from WsfSimulation.

References WsfSimulation::DeletePlatform(), WsfSimulation::GetMultiThreadManager(), mComms, mPlatforms, mProcessors, mSensors, WsfSimulation::MultiThreaded(), and WsfMultiThreadManager::PlatformDeleted().

◆ GetFrameTime()

double WsfFrameStepSimulation::GetFrameTime ( ) const

◆ Initialize()

void WsfFrameStepSimulation::Initialize ( )
overridevirtual

Initialize the simulation.

This method initializes the simulation by performing the following actions:

  • Invokes the Initialize method for each registered simulation extension.
  • Invokes Initialize each registered simulation observer.
  • Adds the 'initial state' platforms to the simulation.
  • Invokes the derived class SimulationInitialized() method.
  • Marks the simulation as 'pending_start'

Upon completion of this call, the application should call WsfSimulation::Start, enter a loop to execute events and then call WsfSimulation::Complete.

Exceptions
WsfSimulation::InitializeErrorif an error is encountered.
Note
It is an error to call this method again without calling WsfSimulation::Complete.

Reimplemented from WsfSimulation.

References GetFrameTime(), WsfSimulation::GetMultiThreadManager(), WsfMultiThreadManager::Initialize(), WsfSimulation::Initialize(), mComms, mFrameCount, WsfSimulation::mMinimumMoverTimestep, mNextFrameTime, mPlatforms, mProcessors, mSensors, mSkippedFrameCount, WsfSimulation::mTimestep, mTimeUntilNextFrame, mTotalFrameOverCount, mTotalFrameOverTime, mTotalFrameUnderCount, mTotalFrameUnderTime, WsfSimulation::MultiThreaded(), and mWorstFrameOverTime.

Referenced by engage::Task::Execute().

◆ SetRealtime()

void WsfFrameStepSimulation::SetRealtime ( double aSimTime,
bool aIsRealTime )
overridevirtual

Set the optional real-time mode of the simulation.

Parameters
aSimTimeThe current simulation time.
aIsRealTimeWhether we desire real-time behavior.

Reimplemented from WsfSimulation.

References CreateClock(), WsfSimulation::IsExternallyStarted(), WsfSimulation::mClockSourcePtr, and WsfSimulation::mIsRealTime.

◆ Start()

void WsfFrameStepSimulation::Start ( )
overridevirtual

Indicate the application is going to start its simulation loop.

This performs the following actions:

  • Resets the clock back to 0.0
  • Invokes the Start method for each registered simulation extension.
  • Invokes SimulationStarting for each registered observer.
  • Mark the simulation as active.
Note
This should be invoked IMMEDIATELY before starting the simulation loop as some observers may be time-sensitive.

Reimplemented from WsfSimulation.

References WsfSimulation::IsExternallyStarted(), WsfSimulation::mClockSourcePtr, mFrameCount, mSkippedFrameCount, mTotalFrameOverCount, mTotalFrameOverTime, mTotalFrameUnderCount, mTotalFrameUnderTime, mWorstFrameOverTime, and WsfSimulation::Start().

Referenced by engage::Task::Execute().

◆ TurnPartOffP()

bool WsfFrameStepSimulation::TurnPartOffP ( double aSimTime,
WsfPlatformPart * aPartPtr )
overrideprotectedvirtual

Turn off a platform part.

Parameters
aSimTimeThe current simulation time.
aPartPtrA pointer to the system to be turned off.
Returns
'true' if successful or 'false' if already turned off.

Reimplemented from WsfSimulation.

References WsfSimulation::GetMultiThreadManager(), WsfPlatformPart::GetPartType(), mComms, mProcessors, mSensors, WsfSimulation::MultiThreaded(), WsfSimulation::TurnPartOffP(), and WsfMultiThreadManager::TurnSensorOff().

◆ TurnPartOnP()

bool WsfFrameStepSimulation::TurnPartOnP ( double aSimTime,
WsfPlatformPart * aPartPtr )
overrideprotectedvirtual

Turn on a platform part.

Parameters
aSimTimeThe current simulation time.
aPartPtrA pointer to the system to be turned on.
Returns
'true' if successful or 'false' if already turned on.

Reimplemented from WsfSimulation.

References WsfSimulation::GetMultiThreadManager(), WsfPlatformPart::GetPartType(), mComms, mProcessors, mSensors, WsfSimulation::MultiThreaded(), WsfSimulation::TurnPartOnP(), and WsfMultiThreadManager::TurnSensorOn().

◆ WaitForAdvanceTime()

void WsfFrameStepSimulation::WaitForAdvanceTime ( )
overridevirtual

Wait from the start of the frame.

The caller has done all the processing they require for the current frame and simply wants to relinquish the processor until the start of the next frame.

Reimplemented from WsfSimulation.

References WsfSimulation::mClockSourcePtr, mNextFrameTime, and WsfSimulation::mRealTime.

Member Data Documentation

◆ AdvanceFrameObjects

UtCallbackListN<void(double)> WsfFrameStepSimulation::AdvanceFrameObjects

◆ mComms

std::vector<wsf::comm::Comm*> WsfFrameStepSimulation::mComms
protected

◆ mFrameCount

double WsfFrameStepSimulation::mFrameCount
protected

The number of frames executed.

This could be an 'int' or an 'unsigned int', but there is a possibility (albiet remote) that one could overflow the value. A year has 31,556,926 seconds so a 20 Hz update would give 631,138,520 frames. Given that a typical 'int' has a range of 2,147,483,647 (2^31-1), this would give us a range of about 3.4 years. Not knowing how this may be used (frame rates, durations, etc), it was just decided to make this a double.

Referenced by AdvanceFrame(), Complete(), Initialize(), Start(), and WsfFrameStepSimulation().

◆ mFrameStepInput

const WsfFrameStepSimulationInput* WsfFrameStepSimulation::mFrameStepInput
protected

◆ mNextFrameTime

double WsfFrameStepSimulation::mNextFrameTime
protected

◆ mPlatforms

std::vector<WsfPlatform*> WsfFrameStepSimulation::mPlatforms
protected

◆ mProcessors

std::vector<WsfProcessor*> WsfFrameStepSimulation::mProcessors
protected

◆ mSensors

std::vector<WsfSensor*> WsfFrameStepSimulation::mSensors
protected

◆ mSkippedFrameCount

double WsfFrameStepSimulation::mSkippedFrameCount
protected

◆ mTimeUntilNextFrame

double WsfFrameStepSimulation::mTimeUntilNextFrame
protected

◆ mTotalFrameOverCount

double WsfFrameStepSimulation::mTotalFrameOverCount
protected

◆ mTotalFrameOverTime

double WsfFrameStepSimulation::mTotalFrameOverTime
protected

◆ mTotalFrameUnderCount

double WsfFrameStepSimulation::mTotalFrameUnderCount
protected

◆ mTotalFrameUnderTime

double WsfFrameStepSimulation::mTotalFrameUnderTime
protected

◆ mWorstFrameOverTime

double WsfFrameStepSimulation::mWorstFrameOverTime
protected

The documentation for this class was generated from the following files:
Copyrights Multiple, All Rights Reserved