WSF
WsfScriptObserver.hpp
Go to the documentation of this file.
1// ****************************************************************************
2// CUI
3//
4// The Advanced Framework for Simulation, Integration, and Modeling (AFSIM)
5//
6// Copyright 2003-2015 The Boeing Company. All rights reserved.
7//
8// The use, dissemination or disclosure of data in this file is subject to
9// limitation or restriction. See accompanying README and LICENSE for details.
10// ****************************************************************************
11// ****************************************************************************
12// Updated by Infoscitex, a DCS Company
13// ****************************************************************************
14
15#ifndef WSFSCRIPTOBSERVERCLASS_HPP
16#define WSFSCRIPTOBSERVERCLASS_HPP
17
18#include "wsf_export.h"
19
20#include <map>
21#include <mutex>
22#include <set>
23#include <string>
24#include <vector>
25
26#include "UtCallbackHolder.hpp"
27#include "UtCompilerAttributes.hpp"
28class UtInput;
29class UtScript;
30#include "UtScriptData.hpp"
31#include "UtScriptDataPack.hpp"
32#include "WsfApplication.hpp"
33class WsfCallback;
34class WsfFuel;
36class WsfImage;
37class WsfLocalTrack;
38class WsfMessage;
39class WsfMover;
40class WsfPlatform;
42class WsfProcessor;
44class WsfSensor;
45class WsfSensorMode;
46class WsfSensorResult;
48#include "WsfSimulation.hpp"
50#include "WsfStringId.hpp"
51class WsfTask;
52class WsfTrack;
53class WsfTrackId;
54
55namespace wsf
56{
57namespace comm
58{
59class Address;
60class Comm;
61class Network;
62class Result;
63
64namespace router
65{
67class Router;
68} // namespace router
69} // namespace comm
70} // namespace wsf
71
73{
74public:
75 bool ProcessInput(UtInput& aInput) override;
76
77 void SimulationCreated(WsfSimulation& aSimulation) override;
78
79 using EventMap = std::map<std::string, std::set<std::string>>;
81};
82
86{
87public:
88 static WsfScriptObserver* Find(const WsfSimulation& aSimulation);
89
90 WsfScriptObserver(WsfSimulation& aSimulation, const WsfScriptObserverExtension& aScenario);
91 ~WsfScriptObserver() override = default;
92
93 void AddedToSimulation() override;
94
95 bool Initialize() override;
96 void Start() override;
97
98 using ScriptList = std::vector<UtScript*>;
99
101 {
102 UtCallback* mCallbackPtr = nullptr;
103 bool mEnabled = false;
107 };
108
109 using EventList = std::vector<EventData>;
110 using EventToIndexMap = std::map<std::string, int>;
111
112 WSF_DEPRECATED int AddEvent(const std::string& aEventName,
113 std::unique_ptr<UtCallback> aCallbackPtr,
114 const std::string& aDefaultScriptName,
115 const std::string& aExpectedArgumentTypes)
116 {
117 return AddEventP(aEventName, std::move(aCallbackPtr), aDefaultScriptName, aExpectedArgumentTypes);
118 }
119
120 template<typename... Args>
121 using Observer = UtCallbackListN<void(double, Args...)>;
122
131 template<bool EnableGuard = false, typename... Args, typename ArgPacker>
132 void AddEvent(const std::string& aEventName,
133 Observer<Args...>& aObserver,
134 const std::string& aDefaultScriptName,
135 const std::string& aExpectedArgumentTypes,
136 const ArgPacker& aArgPacker);
137
143 template<bool EnableGuard = false, typename... Args>
144 void AddEvent(const std::string& aEventName,
145 Observer<Args...>& aObserver,
146 const std::string& aDefaultScriptName,
147 const std::string& aExpectedArgumentTypes)
148 {
149 AddEvent<EnableGuard>(aEventName,
150 aObserver,
151 aDefaultScriptName,
152 aExpectedArgumentTypes,
153 UtStd::Bind(&UtScriptDataPack<Args...>));
154 }
155
156 int GetEventIndex(const std::string& aEventName) const;
157
158 ScriptList& GetScriptList(int aIndex) { return mEvents[aIndex].mScriptList; }
159
160 const EventList& GetEvents() const { return mEvents; }
161
162 const EventToIndexMap& GetEventIndexes() const { return mEventToIndex; }
163
164 void EventEntry();
165
166 void EventExit();
167
168 // RAII type for beginning and ending event processing
169 class EventGuard final
170 {
171 public:
172 EventGuard() = default;
173 explicit EventGuard(WsfScriptObserver& aScriptObserver)
174 : mScriptObserver(&aScriptObserver)
175 {
176 mScriptObserver->EventEntry();
177 }
178
179 EventGuard(const EventGuard&) = delete;
180 EventGuard& operator=(const EventGuard&) = delete;
181
182 EventGuard(EventGuard&& aOther) { std::swap(mScriptObserver, aOther.mScriptObserver); }
184
186 {
187 if (mScriptObserver)
188 {
189 mScriptObserver->EventExit();
190 }
191 }
192
193 private:
194 WsfScriptObserver* mScriptObserver = nullptr;
195 };
196
197 bool EnableOrDisable(bool aEnable, const std::string& aCallbackName, const std::string& aScriptName);
198
199 bool EnableOrDisable(bool aEnable, const std::string& aEventName, const std::string& aScriptName, EventData& aEventData);
200
201 const EventToIndexMap GetEventMap() const { return mEventToIndex; }
202
203 // Helper execution functions which find the global context from any other context
204 void ExecuteScriptList(double aSimTime, const std::vector<UtScript*>& aScriptList);
205
206 void ExecuteScriptList(double aSimTime,
207 const std::vector<UtScript*>& aScriptList,
208 UtScriptData& aScriptRetVal,
209 UtScriptDataList& aScriptArgs);
210
211protected:
214
216 UtCallbackHolder mCallbacks;
217
218private:
219 int AddEventP(const std::string& aEventName,
220 std::unique_ptr<UtCallback> aCallbackPtr,
221 const std::string& aDefaultScriptName,
222 const std::string& aExpectedArgumentTypes);
223
224 bool mInitializeSuccess{false};
225 EventList mEvents;
226 EventToIndexMap mEventToIndex;
227 std::recursive_mutex mMutex;
228
229 const WsfScriptObserverExtension* mExtensionPtr{nullptr};
230};
231
232namespace detail
233{
235// Conditional factory method for creating an EventGuard
236template<bool B>
238{
239 return EventGuard{};
240}
241template<>
242CPP17_NODISCARD inline EventGuard make_event_guard<true>(WsfScriptObserver& aScriptObserver)
243{
244 return EventGuard{aScriptObserver};
245}
246} // namespace detail
247
248template<bool EnableGuard, typename... Args, typename ArgPacker>
249void WsfScriptObserver::AddEvent(const std::string& aEventName,
250 Observer<Args...>& aObserver,
251 const std::string& aDefaultScriptName,
252 const std::string& aExpectedArgumentTypes,
253 const ArgPacker& aArgPacker)
254{
255 auto callback = [=](double aSimTime, Args&&... args)
256 {
257 UtScriptData scriptRetVal;
258 UtScriptDataPacker scriptArgs{GetSimulation().GetApplication().GetScriptTypes()};
260 aArgPacker(scriptArgs, std::forward<Args>(args)...);
261 if (!scriptArgs.mDataList.empty() || aExpectedArgumentTypes.empty())
262 { // If expected arguments weren't packed, don't execute scripts
263 ExecuteScriptList(aSimTime, GetScriptList(GetEventIndex(aEventName)), scriptRetVal, scriptArgs);
264 }
265 };
266 AddEventP(aEventName, aObserver.Connect(callback), aDefaultScriptName, aExpectedArgumentTypes);
267}
268
269#endif
ut::script::Data UtScriptData
Definition WsfScriptContext.hpp:47
ut::script::DataList UtScriptDataList
Definition WsfScriptContext.hpp:48
#define WSF_EXPORT
Definition WsfXIO_Export.hpp:35
UtScriptTypes * GetScriptTypes() const
Return a pointer to the script types/classes.
Definition WsfApplication.hpp:138
Definition WsfCallback.hpp:27
Definition WsfFuel.hpp:30
Definition WsfFuelingOperation.hpp:37
Definition WsfImage.hpp:36
Definition WsfLocalTrack.hpp:32
A base class for messages sent among simulation communication objects, processors and sensors.
Definition WsfMessage.hpp:33
Definition WsfMover.hpp:37
Platforms represent a entity within the simulation.
Definition WsfPlatform.hpp:115
Definition WsfProcessor.hpp:39
WsfScenarioExtension()
Definition WsfScenarioExtension.cpp:21
virtual bool ProcessInput(UtInput &aInput)
Definition WsfScenarioExtension.cpp:62
virtual void SimulationCreated(WsfSimulation &aSimulation)
Definition WsfScenarioExtension.cpp:119
Definition WsfScriptContext.hpp:71
Definition WsfScriptObserver.hpp:73
std::map< std::string, std::set< std::string > > EventMap
Definition WsfScriptObserver.hpp:79
EventMap mEnabledEvents
Definition WsfScriptObserver.hpp:80
Definition WsfScriptObserver.hpp:170
EventGuard(WsfScriptObserver &aScriptObserver)
Definition WsfScriptObserver.hpp:173
EventGuard & operator=(const EventGuard &)=delete
EventGuard(EventGuard &&aOther)
Definition WsfScriptObserver.hpp:182
EventGuard & operator=(EventGuard &&)=delete
EventGuard(const EventGuard &)=delete
~EventGuard()
Definition WsfScriptObserver.hpp:185
Definition WsfScriptObserver.hpp:86
const EventToIndexMap & GetEventIndexes() const
Definition WsfScriptObserver.hpp:162
~WsfScriptObserver() override=default
UtCallbackHolder mCallbacks
Container to hold registered callbacks.
Definition WsfScriptObserver.hpp:216
const EventList & GetEvents() const
Definition WsfScriptObserver.hpp:160
int GetEventIndex(const std::string &aEventName) const
Definition WsfScriptObserver.cpp:150
UtCallbackListN< void(double, Args...)> Observer
Definition WsfScriptObserver.hpp:121
void ExecuteScriptList(double aSimTime, const std::vector< UtScript * > &aScriptList)
Definition WsfScriptObserver.cpp:727
static WsfScriptObserver * Find(const WsfSimulation &aSimulation)
Definition WsfScriptObserver.cpp:91
std::vector< UtScript * > ScriptList
Definition WsfScriptObserver.hpp:98
std::map< std::string, int > EventToIndexMap
Definition WsfScriptObserver.hpp:110
void Start() override
Definition WsfScriptObserver.cpp:120
const EventToIndexMap GetEventMap() const
Definition WsfScriptObserver.hpp:201
WSF_DEPRECATED int AddEvent(const std::string &aEventName, std::unique_ptr< UtCallback > aCallbackPtr, const std::string &aDefaultScriptName, const std::string &aExpectedArgumentTypes)
Definition WsfScriptObserver.hpp:112
ScriptList & GetScriptList(int aIndex)
Definition WsfScriptObserver.hpp:158
WsfScriptObserver(const WsfScriptObserver &aSrc)=delete
Copy constructor is declared but not defined to prevent use.
void AddEvent(const std::string &aEventName, Observer< Args... > &aObserver, const std::string &aDefaultScriptName, const std::string &aExpectedArgumentTypes)
Definition WsfScriptObserver.hpp:144
bool Initialize() override
Definition WsfScriptObserver.cpp:97
WsfScriptObserver(WsfSimulation &aSimulation, const WsfScriptObserverExtension &aScenario)
Definition WsfScriptObserver.cpp:341
void AddedToSimulation() override
Definition WsfScriptObserver.cpp:349
std::vector< EventData > EventList
Definition WsfScriptObserver.hpp:109
Definition WsfSensorMode.hpp:36
Definition WsfSensorResult.hpp:27
Definition WsfSensor.hpp:92
WsfSimulation & GetSimulation() const
Definition WsfSimulationExtension.hpp:50
WsfSimulationExtension()
Definition WsfSimulationExtension.cpp:23
friend class WsfSimulation
Definition WsfSimulationExtension.hpp:43
The main controller for a simulation.
Definition WsfSimulation.hpp:109
WsfApplication & GetApplication() const
Definition WsfSimulation.cpp:1536
A class that defines a task to be performed.
Definition WsfTask.hpp:28
Definition WsfTrackId.hpp:33
An object that represents an 'track' (perception) of something.
Definition WsfTrack.hpp:120
Definition WsfCommAddress.hpp:57
Definition WsfComm.hpp:43
Definition WsfCommNetwork.hpp:51
Definition WsfCommResult.hpp:34
Definition WsfCommRouterProtocolInterface.hpp:33
Definition WsfCommRouter.hpp:55
Definition WsfScriptObserver.hpp:233
CPP17_NODISCARD EventGuard make_event_guard(WsfScriptObserver &)
Definition WsfScriptObserver.hpp:237
CPP17_NODISCARD EventGuard make_event_guard< true >(WsfScriptObserver &aScriptObserver)
Definition WsfScriptObserver.hpp:242
WsfScriptObserver::EventGuard EventGuard
Definition WsfScriptObserver.hpp:234
void swap(WsfRoute &aLhs, WsfRoute &aRhs)
Definition WsfRoute.hpp:294
Definition WsfComm.hpp:36
Definition WsfComm.cpp:34
Function definitions for those who need run-time access to the version.
Definition WsfComm.cpp:32
Definition WsfScriptObserver.hpp:101
std::string mExpectedArgumentTypes
Definition WsfScriptObserver.hpp:105
std::string mDefaultScriptName
Definition WsfScriptObserver.hpp:104
bool mEnabled
Definition WsfScriptObserver.hpp:103
ScriptList mScriptList
Definition WsfScriptObserver.hpp:106
UtCallback * mCallbackPtr
Definition WsfScriptObserver.hpp:102
Copyrights Multiple, All Rights Reserved