WSF
WsfUCI_PartComponent.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 2020 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_PARTCOMPONENT_HPP
13#define WSFUCI_PARTCOMPONENT_HPP
14
15#include "wsf_oms_uci_export.h"
16
17#include "UtCallbackHolder.hpp"
18#include "UtLog.hpp"
19#include "WsfEvent.hpp"
20#include "WsfUCI_Component.hpp"
21#include "WsfUCI_Messages.hpp"
22#include "WsfUCI_Types.hpp"
23
24#include "uci/type/MessageStateEnum.h"
25
26class WsfScenario;
27class WsfSimulation;
28
29namespace wsf
30{
31
35{
36 public:
38
39
40 // We must define the component role enum here as it is not a core value
41 static const int cWSF_COMPONENT_UCI_PART = 1234321; // See WsfComponentRoles
43
45 UCI_PartComponent(const WsfScenario& aScenario,
46 int aPartType);
48 virtual ~UCI_PartComponent() = default;
49 bool ProcessInput(UtInput& aInput) override;
50
51 void SetUpdateMessageTime(double aUpdateTime) { mUpdateMessageTime = aUpdateTime; }
52 double GetUpdateMessageTime() const { return mUpdateMessageTime; }
53
54 void ClearRemarks() { mRemarks.clear(); }
55 std::string GetRemarks() const { return mRemarks; }
56 uci::type::CommandStateEnum::EnumerationItem GetCommandState() const { return mCommandState; }
57
58 void UpdateCommandResults(const uci::type::CommandStateEnum::EnumerationItem& aState,
59 const std::string& aRemark)
60 {
61 mCommandState = aState;
62 mRemarks = aRemark;
63 }
64
65 void* QueryInterface(int aRole) override;
66 bool Initialize2(double aSimTime) override;
67 const int* GetComponentRoles() const override;
68 // Send/Receive
70 virtual void SendUpdateMessages(double aSimTime,
71 const uci::type::MessageStateEnum::EnumerationItem& aMessageState);
72
73 virtual bool ProcessMessage(double aSimTime,
74 const WsfMessage& aMessage) override;
76
77 virtual std::set<std::string> GetCapabilityUUIDs() const override;
78
79 protected:
80
82 {
83 Controller() = default;
84 Controller(const std::string& aSystemID,
85 const std::string& aServiceID)
86 : mSystemID(aSystemID)
87 , mServiceID(aServiceID) {};
88
89 bool operator<(const Controller& aController) const
90 {
91 if (mSystemID != aController.mSystemID)
92 {
93 return mSystemID < aController.mSystemID;
94 }
95 return mServiceID < aController.mServiceID;
96 }
97
98 bool operator==(const Controller& aController) const
99 {
100 return mSystemID == aController.mSystemID &&
101 mServiceID == aController.mServiceID;
102 }
103
104 std::string mSystemID;
105 std::string mServiceID;
106 };
107
108 bool IsCommandAccepted() const { return mCommandState == uci::type::CommandStateEnum::UCI_ACCEPTED; }
109
110 virtual void SetOwnerProducer(const ISM_OwnerProducerType& aOwnerType);
111
112 virtual void ClearActivities() = 0;
113
114 virtual void Detach() {};
115
116 bool CheckPartStatus(WsfArticulatedPart* aPartPtr);
117
118 bool HandleControlRequestMessage(const UCI_ControlRequestMessage& aMessage);
119
120 bool HasControl(const std::string& aCapbilityUUID,
121 uci::type::ServiceID_Type& aServiceID,
122 uci::type::SystemID_Type& aSystemID);
123
124 virtual void SendActivityMessage(double aSimTime,
125 const uci::type::MessageStateEnum::EnumerationItem& aMessageState) = 0;
126
127 virtual void SendCapabilityMessage(double aSimTime,
128 const uci::type::MessageStateEnum::EnumerationItem& aMessageState) = 0;
129
130 virtual void SendCapabilityStatusMessage(double aSimTime,
131 const uci::type::MessageStateEnum::EnumerationItem& aMessageState) = 0;
132
133 template <typename CommandStatusMessage,
134 typename CommandID>
135 inline void SendCommandStatusMessage(double aSimTime,
136 const uci::type::MessageStateEnum::EnumerationItem& aMessageState,
137 const CommandID& aCommandID)
138 {
139 try
140 {
141 CommandStatusMessage msg(GetComponentParent());
142 msg.Get().setMessageState(aMessageState);
143
144 ISM_OwnerProducerType ownPro(GetComponentParent());
145 ownPro.Get().setValue(ismownpro::type::CVEnumISMOwnerProducerValues::ISMOWNPRO_USA); //Arbitrary for now
146 msg.Get().getSecurityAttributesGroup().getOwnerProducer().push_back(ownPro.Get());
147
148 auto& data = msg.Get().getMessageData();
149 data.setCommandID(aCommandID);
150 data.setState(GetCommandState());
151 SendMessage(aSimTime, msg);
152 PrintMessageSent(aSimTime, "CommandStatus");
153
154 }
155 catch (const uci::base::UCIException& ex)
156 {
157 ut::log::error() << ex.what() << ":" << ex.getErrorCode();
158 }
159 }
160
161 virtual void SendControlRequestStatusMessage(double aSimTime,
162 const uci::type::ControlRequestID_Type& aRequestID);
163
164 virtual void SendControlStatusMessage(double aSimTime,
165 const uci::type::MessageStateEnum::EnumerationItem& aMessageState);
166
167 virtual void SendSubsystemStatusMessage(double aSimTime,
168 const uci::type::MessageStateEnum::EnumerationItem& aMessageState);
169
170 virtual void SendSystemStatusMessage(double aSimTime,
171 const uci::type::MessageStateEnum::EnumerationItem& aMessageState);
172
173 virtual void TurnOn(double aSimTime) override;
174
175 virtual void TurnOff(double aSimTime) override;
176
177 virtual void UpdateAllMessages() = 0;
178
179 template <typename CapabilityStatusMessage>
180 inline void UpdateCapabilityStatusMessage(CapabilityStatusMessage* aMessagePtr)
181 {
182 try
183 {
184 auto& data = aMessagePtr->Get().getMessageData();
185 for (size_t i = 0; i < data.getCapabilityStatus().size(); ++i)
186 {
187 auto availability = uci::type::CapabilityAvailabilityEnum::UCI_AVAILABLE;
188 auto& currentAvailability = data.getCapabilityStatus().at(i).getAvailabilityInfo().getAvailability();
189 if (!CanHandleMessage() ||
190 currentAvailability == uci::type::CapabilityAvailabilityEnum::UCI_DISABLED)
191 {
192 availability = uci::type::CapabilityAvailabilityEnum::UCI_DISABLED;
193 }
194 data.getCapabilityStatus().at(i).getAvailabilityInfo().setAvailability(availability);
195 }
196 }
197 catch (const uci::base::UCIException& ex)
198 {
199 ut::log::error() << ex.what() << ":" << ex.getErrorCode();
200 }
201 }
202
203 void UpdateSubsystemStatusMessage(uci::type::SubsystemStateEnum::EnumerationItem aState);
204
205 virtual uci::type::ApprovalEnum::EnumerationItem GetApprovalType() const { return mApprovalType; }
206
207 template <typename CapabilityStatusMessage>
208 inline uci::type::CapabilityAvailabilityEnum::EnumerationItem GetCapabilityAvailability(const CapabilityStatusMessage* aMessagePtr,
209 const size_t aIndex) const
210 {
211 auto availability = uci::type::CapabilityAvailabilityEnum::UCI_AVAILABLE;
212 auto& currentAvailability = aMessagePtr->Get().getMessageData().getCapabilityStatus().at(aIndex).getAvailabilityInfo().getAvailability();
213 if (!CanHandleMessage())
214 {
215 availability = uci::type::CapabilityAvailabilityEnum::UCI_DISABLED;
216 }
217 else
218 {
219 availability = currentAvailability;
220 }
221 return availability;
222 }
223
224
225 virtual void SetAllCapabilitiesAvailability(const uci::type::CapabilityAvailabilityEnum::EnumerationItem& aAvailability) = 0;
226
227 void SetRejectedCurrentlyCommanded(const std::string& aPartName);
228
229 virtual void PrintMessageSent(double aSimTime,
230 const std::string& aMessageType);
231
232 virtual void PrintMessageNotSent(double aSimTime,
233 const std::string& aMessageType,
234 const std::string& aReason);
235
236 std::unique_ptr<UCI_ControlStatusMessage> mControlStatusMessagePtr;
237 std::unique_ptr<UCI_SubsystemStatusMessage> mSubsystemStatusMessagePtr;
238 std::unique_ptr<UCI_SystemStatusMessage> mSystemStatusMessagePtr;
239
240 std::map<std::string, std::string> mCapabilityToUUID;
241 double mUpdateMessageTime{ 10 };
242 std::map<std::string, std::string> mActivityToCabability;
243 uci::type::CommandStateEnum::EnumerationItem mCommandState{ uci::type::CommandStateEnum::UCI_ACCEPTED };
244 std::string mRemarks;
245 bool mInitialMessagesSent{ false };
246 bool mIsCommanded{ false };
247 UtCallbackHolder mCallbacks;
248
249 //Capability UUID to controller maps
250 std::map<std::string, Controller> mPrimaryController;
251 std::map<std::string, std::set<Controller>> mSecondaryControllers;
252 std::map<std::string, std::set<Controller>> mManagerControllers;
253
254 uci::type::ApprovalEnum::EnumerationItem mApprovalType;
255
256 private:
257
258 bool HandleAcquireMessage(const UCI_ControlRequestMessage& aMessage);
259
260 bool HandleReleaseMessage(const UCI_ControlRequestMessage& aMessage);
261
262 std::string GetApprovalTypeString(const uci::type::ApprovalEnum::EnumerationItem& aApprovalType);
263
264};
265
267{
268 public:
270 double aSimTime,
271 size_t aPlatformIndex,
272 double aSendInterval = 10)
273 : WsfEvent(aSimTime)
274 , mUCI_ComponentPtr(aUCI_Component)
275 , mSendInterval(aSendInterval)
276 , mPlatformIndex(aPlatformIndex) {}
277
278 ~UCI_Message_Event() override = default;
280
281 private:
282
283 UCI_PartComponent* mUCI_ComponentPtr;
284 double mSendInterval{ 10 };
285 size_t mPlatformIndex;
286
287};
288
289} // namespace wsf
290
292
293#endif
#define WSF_DECLARE_COMPONENT_ROLE_TYPE(TYPE, ROLE)
Definition WsfComponentRoles.hpp:44
Definition WsfArticulatedPart.hpp:36
ParentType * GetComponentParent() const
Definition WsfComponent.hpp:154
WsfEvent()=default
EventDisposition
Definition WsfEvent.hpp:37
A base class for messages sent among simulation communication objects, processors and sensors.
Definition WsfMessage.hpp:33
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
The main controller for a simulation.
Definition WsfSimulation.hpp:109
bool CanHandleMessage() const
Definition WsfUCI_Component.hpp:95
UCI_Component(const WsfScenario &aScenario, int aPartType)
Definition WsfUCI_Component.cpp:28
UCI_Message_Event(UCI_PartComponent *aUCI_Component, double aSimTime, size_t aPlatformIndex, double aSendInterval=10)
Definition WsfUCI_PartComponent.hpp:269
WsfEvent::EventDisposition Execute() override
Definition WsfUCI_PartComponent.cpp:876
~UCI_Message_Event() override=default
Definition WsfUCI_PartComponent.hpp:35
uci::type::CapabilityAvailabilityEnum::EnumerationItem GetCapabilityAvailability(const CapabilityStatusMessage *aMessagePtr, const size_t aIndex) const
Definition WsfUCI_PartComponent.hpp:208
virtual void SendUpdateMessages(double aSimTime, const uci::type::MessageStateEnum::EnumerationItem &aMessageState)
Definition WsfUCI_PartComponent.cpp:698
uci::type::CommandStateEnum::EnumerationItem GetCommandState() const
Definition WsfUCI_PartComponent.hpp:56
void SendCommandStatusMessage(double aSimTime, const uci::type::MessageStateEnum::EnumerationItem &aMessageState, const CommandID &aCommandID)
Definition WsfUCI_PartComponent.hpp:135
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
virtual void SetOwnerProducer(const ISM_OwnerProducerType &aOwnerType)
Definition WsfUCI_PartComponent.cpp:691
std::unique_ptr< UCI_SubsystemStatusMessage > mSubsystemStatusMessagePtr
Definition WsfUCI_PartComponent.hpp:237
virtual std::set< std::string > GetCapabilityUUIDs() const override
Definition WsfUCI_PartComponent.cpp:681
void UpdateSubsystemStatusMessage(uci::type::SubsystemStateEnum::EnumerationItem aState)
Definition WsfUCI_PartComponent.cpp:838
bool CheckPartStatus(WsfArticulatedPart *aPartPtr)
Definition WsfUCI_PartComponent.cpp:121
uci::type::CommandStateEnum::EnumerationItem mCommandState
Definition WsfUCI_PartComponent.hpp:243
virtual void Detach()
Definition WsfUCI_PartComponent.hpp:114
bool HasControl(const std::string &aCapbilityUUID, uci::type::ServiceID_Type &aServiceID, uci::type::SystemID_Type &aSystemID)
Definition WsfUCI_PartComponent.cpp:200
std::map< std::string, std::set< Controller > > mSecondaryControllers
Definition WsfUCI_PartComponent.hpp:251
virtual ~UCI_PartComponent()=default
void SetUpdateMessageTime(double aUpdateTime)
Definition WsfUCI_PartComponent.hpp:51
virtual void SetAllCapabilitiesAvailability(const uci::type::CapabilityAvailabilityEnum::EnumerationItem &aAvailability)=0
double GetUpdateMessageTime() const
Definition WsfUCI_PartComponent.hpp:52
std::string GetRemarks() const
Definition WsfUCI_PartComponent.hpp:55
const int * GetComponentRoles() const override
Definition WsfUCI_PartComponent.cpp:98
bool mIsCommanded
Definition WsfUCI_PartComponent.hpp:246
static const int cWSF_COMPONENT_UCI_PART
Definition WsfUCI_PartComponent.hpp:41
void UpdateCapabilityStatusMessage(CapabilityStatusMessage *aMessagePtr)
Definition WsfUCI_PartComponent.hpp:180
double mUpdateMessageTime
Definition WsfUCI_PartComponent.hpp:241
virtual void SendCapabilityMessage(double aSimTime, const uci::type::MessageStateEnum::EnumerationItem &aMessageState)=0
std::map< std::string, std::string > mActivityToCabability
Definition WsfUCI_PartComponent.hpp:242
void SetRejectedCurrentlyCommanded(const std::string &aPartName)
Definition WsfUCI_PartComponent.cpp:156
bool mInitialMessagesSent
Definition WsfUCI_PartComponent.hpp:245
bool HandleControlRequestMessage(const UCI_ControlRequestMessage &aMessage)
Definition WsfUCI_PartComponent.cpp:167
virtual void ClearActivities()=0
virtual void TurnOff(double aSimTime) override
Definition WsfUCI_PartComponent.cpp:796
std::map< std::string, Controller > mPrimaryController
Definition WsfUCI_PartComponent.hpp:250
virtual uci::type::ApprovalEnum::EnumerationItem GetApprovalType() const
Definition WsfUCI_PartComponent.hpp:205
std::unique_ptr< UCI_SystemStatusMessage > mSystemStatusMessagePtr
Definition WsfUCI_PartComponent.hpp:238
bool IsCommandAccepted() const
Definition WsfUCI_PartComponent.hpp:108
virtual void SendControlStatusMessage(double aSimTime, const uci::type::MessageStateEnum::EnumerationItem &aMessageState)
Definition WsfUCI_PartComponent.cpp:277
virtual void SendControlRequestStatusMessage(double aSimTime, const uci::type::ControlRequestID_Type &aRequestID)
Definition WsfUCI_PartComponent.cpp:240
virtual void PrintMessageSent(double aSimTime, const std::string &aMessageType)
Definition WsfUCI_PartComponent.cpp:850
virtual void PrintMessageNotSent(double aSimTime, const std::string &aMessageType, const std::string &aReason)
Definition WsfUCI_PartComponent.cpp:861
virtual void SendSystemStatusMessage(double aSimTime, const uci::type::MessageStateEnum::EnumerationItem &aMessageState)
Definition WsfUCI_PartComponent.cpp:764
virtual void SendSubsystemStatusMessage(double aSimTime, const uci::type::MessageStateEnum::EnumerationItem &aMessageState)
Definition WsfUCI_PartComponent.cpp:733
void * QueryInterface(int aRole) override
Definition WsfUCI_PartComponent.cpp:109
virtual void TurnOn(double aSimTime) override
Definition WsfUCI_PartComponent.cpp:807
std::string mRemarks
Definition WsfUCI_PartComponent.hpp:244
bool Initialize2(double aSimTime) override
Definition WsfUCI_PartComponent.cpp:39
std::map< std::string, std::set< Controller > > mManagerControllers
Definition WsfUCI_PartComponent.hpp:252
virtual void UpdateAllMessages()=0
uci::type::ApprovalEnum::EnumerationItem mApprovalType
Definition WsfUCI_PartComponent.hpp:254
virtual void SendCapabilityStatusMessage(double aSimTime, const uci::type::MessageStateEnum::EnumerationItem &aMessageState)=0
void ClearRemarks()
Definition WsfUCI_PartComponent.hpp:54
virtual bool ProcessMessage(double aSimTime, const WsfMessage &aMessage) override
Definition WsfUCI_PartComponent.cpp:716
void UpdateCommandResults(const uci::type::CommandStateEnum::EnumerationItem &aState, const std::string &aRemark)
Definition WsfUCI_PartComponent.hpp:58
bool ProcessInput(UtInput &aInput) override
Definition WsfUCI_PartComponent.cpp:83
Function definitions for those who need run-time access to the version.
Definition WsfComm.cpp:32
std::string mServiceID
Definition WsfUCI_PartComponent.hpp:105
std::string mSystemID
Definition WsfUCI_PartComponent.hpp:104
bool operator<(const Controller &aController) const
Definition WsfUCI_PartComponent.hpp:89
bool operator==(const Controller &aController) const
Definition WsfUCI_PartComponent.hpp:98
Controller(const std::string &aSystemID, const std::string &aServiceID)
Definition WsfUCI_PartComponent.hpp:84
Copyrights Multiple, All Rights Reserved