WSF
WsfUCI_SensorComponent.hpp
Go to the documentation of this file.
1// ****************************************************************************
2// CUI//REL TO USA ONLY
3//
4// The Advanced Framework for Simulation, Integration, and Modeling (AFSIM)
5//
6// Copyright 2019 Infoscitex, a DCS 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#ifndef WSFUCI_SENSORCOMPONENT_HPP
13#define WSFUCI_SENSORCOMPONENT_HPP
14
15#include "wsf_oms_uci_export.h"
16
17#include <iostream>
18#include <string>
19
20#include "uci/base/Accessor.h"
21#include "uci/type/EntityMDT.h"
22#include "uci/base/UUID.h"
23#include "uci/factory/CapabilityID_TypeFactory.h"
24#include "uci/type/ActivityStateEnum.h"
25#include "uci/type/ApprovalEnum.h"
26#include "uci/type/MessageStateEnum.h"
27#include "uci/type/DateTimeType.h"
28#include "uci/type/KinematicsType.h"
29
30#include "UtCallbackHolder.hpp"
31#include "UtLog.hpp"
32#include "WsfDateTime.hpp"
33#include "WsfComponent.hpp"
35#include "WsfSensor.hpp"
36#include "WsfEvent.hpp"
37#include "WsfObject.hpp"
38#include "WsfObjectTypeList.hpp"
39#include "WsfPlatform.hpp"
40#include "WsfSensorMode.hpp"
43#include "WsfUCI_Component.hpp"
44#include "WsfUCI_Messages.hpp"
45#include "WsfUCI_Types.hpp"
46#include "WsfUCI_Utils.hpp"
47
48class WsfScenario;
49class WsfSimulation;
50
51namespace wsf
52{
53class UCI_ControlRequestMessage;
54
56{
57 public:
59 double aSimTime,
60 size_t aPlatformIndex,
61 size_t aLowestModeIndex)
62 : WsfEvent(aSimTime)
63 , mSensorPtr(aSensorPtr)
64 , mPlatformIndex(aPlatformIndex)
65 , mLowestModeIndex(aLowestModeIndex) {}
66
67 ~UCI_SetDefaultModeEvent() override = default;
69
70 private:
71
72 WsfSensor* mSensorPtr;
73 size_t mPlatformIndex;
74 size_t mLowestModeIndex;
75
76};
77
82{
83 public:
85
86
87 // We must define the component role enum here as it is not a core value
88 static const int cWSF_COMPONENT_UCI_SENSOR = 1234578; // See WsfComponentRoles
90
92 UCI_SensorComponent(const WsfScenario& aScenario,
93 int aPartType,
94 const int aClass);
96 virtual ~UCI_SensorComponent() = default;
97 bool ProcessInput(UtInput& aInput) override;
98
99 void SetUpdateMessageTime(double aUpdateTime) { mUpdateMessageTime = aUpdateTime; }
100 double GetUpdateMessageTime() const { return mUpdateMessageTime; }
101
102 void ClearRemarks() { mRemarks.clear(); }
103 std::string GetRemarks() const { return mRemarks; }
104 uci::type::CommandStateEnum::EnumerationItem GetCommandState() const { return mCommandState; }
105
106 void UpdateCommandResults(const uci::type::CommandStateEnum::EnumerationItem& aState,
107 const std::string& aRemark)
108 {
109 mCommandState = aState;
110 mRemarks = aRemark;
111 }
112
113 void* QueryInterface(int aRole) override;
114 bool PreInitialize(double aSimTime) override;
115 bool Initialize(double aSimTime) override;
116 bool Initialize2(double aSimTime) override;
117 const int* GetComponentRoles() const override;
118 WsfSensor* GetSensor() const { return mSensorPtr; }
119
120 const std::string& GetSensorName() const { return mSensorPtr->GetName(); }
121
122 virtual void OnSensorDeleting(WsfSensor* aSensorPtr) override;
123
124 virtual void OnSensorDeleted(WsfSensor* aSensorPtr) override;
125
126 virtual void OnSensorTurnedOff(double aSimTime,
127 WsfSensor* aSensorPtr) override;
128
129 virtual void OnSensorTurnedOn(double aSimTime,
130 WsfSensor* aSensorPtr) override;
131
132 virtual void OnSlewComplete(double aSimTime) {};
133
134 void SelectDefaultMode(double aSimTime);
135
136 void SensorModeActivated(double aSimTime,
137 WsfSensor* aSensorPtr,
138 WsfSensorMode* aModePtr);
139
140 void SensorModeDeactivated(double aSimTime,
141 WsfSensor* aSensorPtr,
142 WsfSensorMode* aModePtr);
143
144 protected:
145
146 void Attach(WsfSensor& aSensor);
147
148 virtual void ClearActivities() = 0;
149
150 void Detach() override;
151
155 template< typename CapabilityType,
156 typename CapabilityStatusType>
157 inline void InitializeModeData(CapabilityType& aCapabilityType,
158 CapabilityStatusType& aStatusType,
159 const size_t& aIndex)
160 {
161 try
162 {
163 std::string label = UCI_Util::RemoveAngleBrackets(mSensorPtr->GetPlatform()->GetName() + ":" + mSensorPtr->GetName());
164 auto modeName = mSensorPtr->GetModeName(aIndex);
165 auto it = mCapabilityToUUID.find(modeName);
166 std::string capabilityUUID = GetInterface()->GetConnection()->generateUUID().getValueAsString();
167 bool defaultSet{ false };
168 if (aIndex == 0)
169 {
170 //This should loop 0-1 times
171 for (const auto& uuid : mUUID_ToModeIndex)
172 {
173 if (uuid.second == 0)
174 {
175 defaultSet = true;
176 capabilityUUID = uuid.first;
177 break;
178 }
179 }
180 }
181 if (it != mCapabilityToUUID.end() && !defaultSet)
182 {
183 capabilityUUID = it->second;
184 }
185 aCapabilityType.Get().getCapabilityID().getUUID().setValue(capabilityUUID);
186 aCapabilityType.Get().getCapabilityID().setDescriptiveLabel(label);
187 mSubsystemStatusMessagePtr->Get().getMessageData().getConfiguration().getCapabilityID().push_back(aCapabilityType.Get().getCapabilityID());
188 mUUID_ToModeIndex.emplace(capabilityUUID, aIndex);
189 UCI_CapabilityControlInterfaceEnumType controlInterfaceEnum(GetComponentParent());
190 if (mSensorPtr->GetModeEntry(aIndex)->GetCueMode() == WsfSensor::SlewMode::cSLEW_FIXED)
191 {
192 controlInterfaceEnum.Get().setValue(uci::type::CapabilityControlInterfacesEnum::UCI_AUTO_MDF);
193 }
194 else
195 {
196 controlInterfaceEnum.Get().setValue(uci::type::CapabilityControlInterfacesEnum::UCI_CAPABILITY_COMMAND);
197 }
198 aCapabilityType.Get().getAcceptedInterface().push_back(controlInterfaceEnum.Get());
199
200 aStatusType.Get().setCapabilityID(aCapabilityType.Get().getCapabilityID());
201 aStatusType.Get().getAvailabilityInfo().setAvailability(uci::type::CapabilityAvailabilityEnum::UCI_AVAILABLE);
202
203 UCI_ControlStatusCapabilityControlType capabilityControl(GetComponentParent());
204 capabilityControl.Get().setCapabilityID(aCapabilityType.Get().getCapabilityID());
205 capabilityControl.Get().getAcceptedInterface().push_back(controlInterfaceEnum.Get());
206 capabilityControl.Get().enablePrimaryController();
207 auto& primaryController = capabilityControl.Get().getPrimaryController();
208 auto& serviceID = GetInterface()->GetConnection()->getMyServiceUUID();
209 auto& systemID = GetInterface()->GetConnection()->getMySystemUUID();
210 primaryController.getServiceID().setUUID(serviceID);
211 primaryController.getSystemID().setUUID(systemID);
212 primaryController.getSystemID().setDescriptiveLabel(GetInterface()->GetConnection()->getMySystemLabel());
213 mPrimaryController[capabilityUUID] = Controller(systemID.getValueAsString(), serviceID.getValueAsString());
214 mControlStatusMessagePtr->Get().getMessageData().getControlType().getCapabilityControl().push_back(capabilityControl.Get());
215 }
216 catch (const uci::base::UCIException& ex)
217 {
218 ut::log::error() << ex.what() << ":" << ex.getErrorCode();
219 }
220 }
221
222 template <typename CommandStatusMessage,
223 typename CommandID>
224 inline void SendCommandStatusMessage(double aSimTime,
225 const uci::type::MessageStateEnum::EnumerationItem& aMessageState,
226 const CommandID& aCommandID)
227 {
228 try
229 {
230 CommandStatusMessage msg(GetComponentParent());
231
232 ISM_OwnerProducerType ownPro(GetComponentParent());
233 ownPro.Get().setValue(ismownpro::type::CVEnumISMOwnerProducerValues::ISMOWNPRO_USA); //Arbitrary for now
234 msg.Get().getSecurityAttributesGroup().getOwnerProducer().push_back(ownPro.Get());
235
236 msg.Get().setMessageState(aMessageState);
237 auto& data = msg.Get().getMessageData();
238 data.setCommandID(aCommandID);
239 data.setState(GetCommandState());
240 SendMessage(aSimTime, msg);
241 PrintMessageSent(aSimTime, "CommandStatus");
242 }
243 catch (const uci::base::UCIException& ex)
244 {
245 ut::log::error() << ex.what() << ":" << ex.getErrorCode();
246 }
247 }
248
249 virtual void SendControlRequestStatusMessage(double aSimTime,
250 const uci::type::ControlRequestID_Type& aRequestID);
251
252 virtual void SendControlStatusMessage(double aSimTime,
253 const uci::type::MessageStateEnum::EnumerationItem& aMessageState);
254
255 void SendEntityMessage(double aSimTime,
256 const WsfTrack& aTrack,
257 const uci::type::MessageStateEnum::EnumerationItem& aMessageState,
258 const uci::type::EntitySourceEnum::EnumerationItem& aSourceType);
259
260 virtual void UpdateAllMessages() override;
261
262 template <typename CapabilityStatusMessage>
263 inline void UpdateCapabilityStatusMessage(CapabilityStatusMessage* aMessagePtr)
264 {
265 try
266 {
267 auto& data = aMessagePtr->Get().getMessageData();
268 for (size_t i = 0; i < data.getCapabilityStatus().size(); ++i)
269 {
270 auto availability = uci::type::CapabilityAvailabilityEnum::UCI_AVAILABLE;
271 auto& currentAvailability = data.getCapabilityStatus().at(i).getAvailabilityInfo().getAvailability();
272 if (!CanHandleMessage() ||
273 currentAvailability == uci::type::CapabilityAvailabilityEnum::UCI_DISABLED)
274 {
275 availability = uci::type::CapabilityAvailabilityEnum::UCI_DISABLED;
276 }
277 data.getCapabilityStatus().at(i).getAvailabilityInfo().setAvailability(availability);
278 }
279 }
280 catch (const uci::base::UCIException& ex)
281 {
282 ut::log::error() << ex.what() << ":" << ex.getErrorCode();
283 }
284 }
285
286 template <typename CapabilityStatusMessage>
287 inline uci::type::CapabilityAvailabilityEnum::EnumerationItem GetCapabilityAvailability(const CapabilityStatusMessage* aMessagePtr,
288 const size_t aIndex) const
289 {
290 auto availability = uci::type::CapabilityAvailabilityEnum::UCI_AVAILABLE;
291 auto& currentAvailability = aMessagePtr->Get().getMessageData().getCapabilityStatus().at(aIndex).getAvailabilityInfo().getAvailability();
292 if (!CanHandleMessage() ||
293 currentAvailability == uci::type::CapabilityAvailabilityEnum::UCI_DISABLED)
294 {
295 availability = uci::type::CapabilityAvailabilityEnum::UCI_DISABLED;
296 }
297 return availability;
298 }
299
300 template<typename ActivityMessage>
301 inline void SlewComplete(double aSimTime,
302 ActivityMessage* aMessagePtr)
303 {
304 if (mIsCommanded)
305 {
306 mIsCommanded = false;
307 auto& activity = aMessagePtr->Get().getMessageData().getActivity();
308 auto& lastActivity = activity.at(activity.size() - 1);
309 lastActivity.setActivityState(uci::type::ActivityStateEnum::UCI_COMPLETED);
310 SendActivityMessage(aSimTime, uci::type::MessageStateEnum::UCI_UPDATE);
311
312 double eventTime{ aSimTime + mSensorPtr->GetCurrentMode()->GetFrameTime() };
313 size_t platformIndex{ mSensorPtr->GetPlatform()->GetIndex() };
314 auto resetModeEvent = ut::make_unique<UCI_SetDefaultModeEvent>(mSensorPtr,
315 eventTime,
316 platformIndex,
318 GetSimulation().AddEvent(std::move(resetModeEvent));
319 }
320 }
321
322 virtual void SetAllCapabilitiesAvailability(const uci::type::CapabilityAvailabilityEnum::EnumerationItem& aAvailability) = 0;
323
324 virtual void SetCommandAccepted(double aAz, double aEl);
325
326 virtual void SetRejectedOutOfLimits(double aAz, double aEl);
327
328 virtual void SetRejectedFixedMode(const std::string& aModeName,
329 const std::string& aCapabilityUUID);
330
331 virtual void SetRejectedModeDisabled(const std::string& aModeName, const std::string& aCapabilityUUID);
332
333 virtual void SetRejectedTypeUnavailable();
334
336 std::string mSensorName;
338 std::map<std::string, size_t> mUUID_ToModeIndex;
340
341 private:
342
343 void GetEntityId(const WsfTrackId& aTrackId,
344 UCI_EntityID_Type& aEntityID);
345
346 void GetSignalId(const WsfStringId& aEmmiterId,
347 UCI_SignalID_Type& aSignalID);
348
349
350 virtual uci::type::ActivityStateEnum::EnumerationItem GetActivityState() const;
351
352 std::map<WsfTrackId, UCI_EntityID_Type> mTrackToEntityIdMap;
353 std::map<std::string, UCI_SignalID_Type> mSignalIdMap;
354 UtCallbackHolder mCallbacks;
355};
356
357} // namespace wsf
358
360
361#endif
#define WSF_DECLARE_COMPONENT_ROLE_TYPE(TYPE, ROLE)
Definition WsfComponentRoles.hpp:44
UtStringId WsfStringId
WsfStringId – the same thing as UtStringId.
Definition WsfStringId.hpp:23
@ cSLEW_FIXED
Definition WsfArticulatedPart.hpp:45
ParentType * GetComponentParent() const
Definition WsfComponent.hpp:154
WsfEvent()=default
EventDisposition
Definition WsfEvent.hpp:37
virtual void SendMessage(double aSimTime, const WsfMessage &aMessage)
Definition WsfPlatformPart.cpp:475
Contains the data required to create a simulation, and acts as the entry point for input file process...
Definition WsfScenario.hpp:111
Definition WsfSensorMode.hpp:36
Definition WsfSensor.hpp:92
The main controller for a simulation.
Definition WsfSimulation.hpp:109
virtual void AddEvent(std::unique_ptr< WsfEvent > aEventPtr)
Definition WsfSimulation.cpp:162
Definition WsfSingleSensorObserver.hpp:33
Definition WsfTrackId.hpp:33
An object that represents an 'track' (perception) of something.
Definition WsfTrack.hpp:120
WsfSimulation & GetSimulation() const
Convenience Methods.
Definition WsfUCI_Component.hpp:92
bool CanHandleMessage() const
Definition WsfUCI_Component.hpp:95
UCI_Interface * GetInterface()
Definition WsfUCI_Component.cpp:59
uci::base::AbstractServiceBusConnection * GetConnection() const
Return the abstract service bus connection object.
Definition WsfUCI_Interface.hpp:149
virtual void SendActivityMessage(double aSimTime, const uci::type::MessageStateEnum::EnumerationItem &aMessageState)=0
std::map< std::string, std::string > mCapabilityToUUID
Definition WsfUCI_PartComponent.hpp:240
std::unique_ptr< UCI_ControlStatusMessage > mControlStatusMessagePtr
Definition WsfUCI_PartComponent.hpp:236
UtCallbackHolder mCallbacks
Definition WsfUCI_PartComponent.hpp:247
std::unique_ptr< UCI_SubsystemStatusMessage > mSubsystemStatusMessagePtr
Definition WsfUCI_PartComponent.hpp:237
uci::type::CommandStateEnum::EnumerationItem mCommandState
Definition WsfUCI_PartComponent.hpp:243
bool mIsCommanded
Definition WsfUCI_PartComponent.hpp:246
double mUpdateMessageTime
Definition WsfUCI_PartComponent.hpp:241
std::map< std::string, Controller > mPrimaryController
Definition WsfUCI_PartComponent.hpp:250
virtual void PrintMessageSent(double aSimTime, const std::string &aMessageType)
Definition WsfUCI_PartComponent.cpp:850
std::string mRemarks
Definition WsfUCI_PartComponent.hpp:244
Definition WsfUCI_SensorComponent.hpp:82
virtual void ClearActivities()=0
WsfSensor * mSensorPtr
Definition WsfUCI_SensorComponent.hpp:335
int mClass
Definition WsfUCI_SensorComponent.hpp:337
void SlewComplete(double aSimTime, ActivityMessage *aMessagePtr)
Definition WsfUCI_SensorComponent.hpp:301
WsfSensor * GetSensor() const
Definition WsfUCI_SensorComponent.hpp:118
void SendCommandStatusMessage(double aSimTime, const uci::type::MessageStateEnum::EnumerationItem &aMessageState, const CommandID &aCommandID)
Definition WsfUCI_SensorComponent.hpp:224
virtual void OnSensorDeleting(WsfSensor *aSensorPtr) override
Called before the sensor is actually deleted.
Definition WsfUCI_SensorComponent.cpp:517
std::map< std::string, size_t > mUUID_ToModeIndex
Definition WsfUCI_SensorComponent.hpp:338
void SetUpdateMessageTime(double aUpdateTime)
Definition WsfUCI_SensorComponent.hpp:99
virtual void SendControlStatusMessage(double aSimTime, const uci::type::MessageStateEnum::EnumerationItem &aMessageState)
Definition WsfUCI_SensorComponent.cpp:273
virtual void SetRejectedFixedMode(const std::string &aModeName, const std::string &aCapabilityUUID)
Definition WsfUCI_SensorComponent.cpp:639
const int * GetComponentRoles() const override
Definition WsfUCI_SensorComponent.cpp:98
virtual void OnSensorTurnedOn(double aSimTime, WsfSensor *aSensorPtr) override
Called just after the sensor is turned on.
Definition WsfUCI_SensorComponent.cpp:554
void SensorModeDeactivated(double aSimTime, WsfSensor *aSensorPtr, WsfSensorMode *aModePtr)
Definition WsfUCI_SensorComponent.cpp:589
void * QueryInterface(int aRole) override
Definition WsfUCI_SensorComponent.cpp:110
virtual void SetRejectedTypeUnavailable()
Definition WsfUCI_SensorComponent.cpp:667
virtual void OnSensorDeleted(WsfSensor *aSensorPtr) override
Called just before the sensor is removed from the simulation.
Definition WsfUCI_SensorComponent.cpp:521
bool ProcessInput(UtInput &aInput) override
Definition WsfUCI_SensorComponent.cpp:55
size_t mLowestAvailableCapability
Definition WsfUCI_SensorComponent.hpp:339
std::string mSensorName
Definition WsfUCI_SensorComponent.hpp:336
virtual void SetCommandAccepted(double aAz, double aEl)
Definition WsfUCI_SensorComponent.cpp:608
virtual void SetAllCapabilitiesAvailability(const uci::type::CapabilityAvailabilityEnum::EnumerationItem &aAvailability)=0
virtual void UpdateAllMessages() override
Definition WsfUCI_SensorComponent.cpp:235
void UpdateCapabilityStatusMessage(CapabilityStatusMessage *aMessagePtr)
Definition WsfUCI_SensorComponent.hpp:263
uci::type::CommandStateEnum::EnumerationItem GetCommandState() const
Definition WsfUCI_SensorComponent.hpp:104
void SensorModeActivated(double aSimTime, WsfSensor *aSensorPtr, WsfSensorMode *aModePtr)
Definition WsfUCI_SensorComponent.cpp:574
virtual void OnSensorTurnedOff(double aSimTime, WsfSensor *aSensorPtr) override
Called just after the sensor is turned off.
Definition WsfUCI_SensorComponent.cpp:532
static const int cWSF_COMPONENT_UCI_SENSOR
Definition WsfUCI_SensorComponent.hpp:88
bool Initialize2(double aSimTime) override
Definition WsfUCI_SensorComponent.cpp:170
virtual ~UCI_SensorComponent()=default
double GetUpdateMessageTime() const
Definition WsfUCI_SensorComponent.hpp:100
virtual void SetRejectedOutOfLimits(double aAz, double aEl)
Definition WsfUCI_SensorComponent.cpp:622
uci::type::CapabilityAvailabilityEnum::EnumerationItem GetCapabilityAvailability(const CapabilityStatusMessage *aMessagePtr, const size_t aIndex) const
Definition WsfUCI_SensorComponent.hpp:287
void UpdateCommandResults(const uci::type::CommandStateEnum::EnumerationItem &aState, const std::string &aRemark)
Definition WsfUCI_SensorComponent.hpp:106
virtual void SendControlRequestStatusMessage(double aSimTime, const uci::type::ControlRequestID_Type &aRequestID)
Definition WsfUCI_SensorComponent.cpp:240
std::string GetRemarks() const
Definition WsfUCI_SensorComponent.hpp:103
bool Initialize(double aSimTime) override
Definition WsfUCI_SensorComponent.cpp:157
void ClearRemarks()
Definition WsfUCI_SensorComponent.hpp:102
void SendEntityMessage(double aSimTime, const WsfTrack &aTrack, const uci::type::MessageStateEnum::EnumerationItem &aMessageState, const uci::type::EntitySourceEnum::EnumerationItem &aSourceType)
Definition WsfUCI_SensorComponent.cpp:307
void SelectDefaultMode(double aSimTime)
Definition WsfUCI_SensorComponent.cpp:677
void Attach(WsfSensor &aSensor)
Definition WsfUCI_SensorComponent.cpp:195
const std::string & GetSensorName() const
Definition WsfUCI_SensorComponent.hpp:120
void Detach() override
Detaches the component observer from the sensor.
Definition WsfUCI_SensorComponent.cpp:218
void InitializeModeData(CapabilityType &aCapabilityType, CapabilityStatusType &aStatusType, const size_t &aIndex)
Definition WsfUCI_SensorComponent.hpp:157
virtual void OnSlewComplete(double aSimTime)
Definition WsfUCI_SensorComponent.hpp:132
bool PreInitialize(double aSimTime) override
Definition WsfUCI_SensorComponent.cpp:122
virtual void SetRejectedModeDisabled(const std::string &aModeName, const std::string &aCapabilityUUID)
Definition WsfUCI_SensorComponent.cpp:653
UCI_SetDefaultModeEvent(WsfSensor *aSensorPtr, double aSimTime, size_t aPlatformIndex, size_t aLowestModeIndex)
Definition WsfUCI_SensorComponent.hpp:58
~UCI_SetDefaultModeEvent() override=default
WsfEvent::EventDisposition Execute() override
Definition WsfUCI_SensorComponent.cpp:690
std::string RemoveAngleBrackets(const std::string &aString)
Definition WsfUCI_Utils.cpp:182
Function definitions for those who need run-time access to the version.
Definition WsfComm.cpp:32
Definition WsfUCI_PartComponent.hpp:82
Copyrights Multiple, All Rights Reserved