WSF
WsfXIO_Interface.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#ifndef WSFXIO_INTERFACE_HPP
13#define WSFXIO_INTERFACE_HPP
14
15#include "wsf_export.h"
16
17#include <deque>
18#include <queue>
19#include <set>
20#include <string>
21#include <vector>
22
23#include "GenInternetSocketAddress.hpp"
24#include "GenUniqueId.hpp"
25#include "PakConnection.hpp"
26#include "PakProcessor.hpp"
27class GenTCP_Server;
28class PakTCP_Connector;
29class PakTCP_IO;
30#include "PakThreadedIO.hpp"
31#include "UtCallback.hpp"
32#include "UtCallbackHolder.hpp"
33#include "UtWallClock.hpp"
34#include "xio/WsfXIO.hpp"
40class WsfXIO_Packet;
46
53class WSF_EXPORT WsfXIO_Interface : public WsfXIO_InputData, public PakProcessor
54{
55public:
57 {
58 public:
59 virtual ~ClockSource() {} // Warning RHEL5 if this isn't here.
60 virtual double GetSimTime() const = 0;
61 };
62
63 typedef std::pair<int, int> SenderAddress;
64 typedef std::vector<WsfXIO_Connection*> ConnectionList;
65 typedef UtCallbackN<void(WsfXIO_Connection*)> ConnectionCallback;
66 typedef UtCallbackListN<void(WsfXIO_Connection*)> ConnectionCallbackList;
67
69 WsfXIO_Interface(const WsfXIO_InputData& aInputData);
71
73
74 const GenUniqueId& GetApplicationId() const { return mApplicationId; }
75 void SetApplicationName(const std::string& aApplicationName) { mApplicationName = aApplicationName; }
76 std::string GetApplicationName() const { return mApplicationName.GetString(); }
77 void SetApplicationType(wsf::xio::ApplicationType aApplicationType) { mApplicationType = aApplicationType; }
79
80 bool Initialize();
81 void AdvanceTime(double aSimTime);
82
84
85
86 double GetSimTime() const { return mClockSourcePtr->GetSimTime(); }
87 double GetLastAdvanceTime() const { return mLastAdvanceTime; }
88 void SetClockSource(ClockSource* aClockSourcePtr);
90
92
93 void Send(WsfXIO_Packet& aPktPtr, WsfXIO_Connection* aConnectionPtr);
94
95 void Send(WsfXIO_Packet& aPkt, WsfXIO_Destination& aDestination);
96
97 void Send(WsfXIO_Packet& aPktPtr, const std::vector<PakSocketIO*>& aConnections);
98
99 void SendToAll(WsfXIO_Packet& aPkt);
100
101 void SendToAllUDP(WsfXIO_Packet& aPkt);
102
103 void SendToAllTCP(WsfXIO_Packet& aPkt);
105
106 void SetValidApplicationTypes(const std::vector<int>& aApplicationTypes);
107
108 WsfXIO_Connection* GetSender(PakPacket& aPkt);
109
111
112
113 UtCallbackListN<void(WsfXIO_Connection*)> OnConnected;
114
116 UtCallbackListN<void(WsfXIO_Connection*)> OnDisconnected;
117
122 UtCallbackListN<void(double, GenUniqueId, bool)> OnHeartbeatUpdate;
123
125 UtCallbackListN<void(bool, const std::string&)> OnApplicationBehind;
126
128 UtCallbackListN<void(int, int, int, int, double)> BandwidthDataEvent;
129
130 std::unique_ptr<UtCallbackN<void()>> TimeoutConnect(double aWaitTime, const std::function<void()>& aFunction);
131
132 std::unique_ptr<ConnectionCallback> DisconnectConnect(WsfXIO_Connection* aConnectionPtr,
133 const ConnectionCallback::FunctionType& aFunction);
135
137 //@
138
139 WsfXIO_RequestManager& GetRequestManager() { return *mRequestManagerPtr; }
140
141 WsfXIO_QueryManager& GetQueryManager() const { return *mQueryManagerPtr; }
142
143 WsfXIO_Publisher& GetPublisher() const { return *mPublisherPtr; }
145
147
148 void RegisterServiceType(std::string aServiceType, std::string aServiceVersion = std::string());
150
152
153 void AddUDP_Target(UDP_Target aTarget);
154 bool RemoveUDP_Target(int aTargetIndex);
155 const std::vector<UDP_Target>& GetUDP_Targets() { return mUDP_Targets; }
156
157 const ConnectionList& GetConnections() const { return mConnections; }
158 const ConnectionList& GetReliableConnections() const { return mConnectedConnections; }
159 WsfXIO_Connection* FindConnection(const GenUniqueId& aApplicationId);
160 WsfXIO_Connection* FindConnection(int aConnectionIndex);
161 WsfXIO_Connection* FindConnection(const std::string& aApplicationName);
162 void Disconnect(WsfXIO_Connection* aConnectionPtr);
164
166
167
169 bool IsXIO_Requested() const { return mInterfaceRequested; }
171
173 bool ShowConnections() const { return mShowConnections; }
174 void SetShowConnections(bool aShowConnections) { mShowConnections = aShowConnections; }
175
177 bool IsDebugEnabled() const { return mDebugEnabled; }
178 void SetDebugEnabled(bool aIsEnabled) { mDebugEnabled = aIsEnabled; }
179
180 void GetBytesCommunicated(size_t& aBytesSent, size_t& aBytesReceived);
182
183private:
184 void SendHeartbeat();
185
186 void BufferPacket(WsfXIO_Packet* aPacketPtr);
187
188 bool CheckForDuplicateConnection(WsfXIO_Connection* aConnectionPtr);
189
190 WsfXIO_Connection* GetSendConnection(WsfXIO_Connection* aConnectionPtr, SenderAddress aSendAddress);
191
192 void HandleServiceAvailableQuery(WsfXIO_ServiceAvailableQuery& aQuery);
193
194 void ProcessMessages(double aSimTime);
195
196 bool ProcessSynchronizedPacket(double aSimTime, WsfXIO_Packet& aPkt);
197
198 void TriggerTimeouts();
199
200 void HandleHeartbeat(WsfXIO_HeartbeatPkt& aPkt);
201
202 void HandleInitialize(WsfXIO_InitializePkt& aPkt);
203
204 void AddConnection(WsfXIO_Connection* aConnectionPtr);
205
206 void AcceptConnections();
207
208 void HandleDisconnect(PakSocketIO* aIOPtr, PakConnection* aConnectionPtr);
209
210 bool ConnectToTarget(UDP_Target& aTarget);
211
212 struct Timeout
213 {
214 UtCallbackListN<void()>* mCallbackListPtr;
215 double mTime;
216 bool operator<(const Timeout& aRHS) const { return mTime < aRHS.mTime; }
217 };
218
219 struct HeartbeatInfo
220 {
221 HeartbeatInfo(GenUniqueId aId)
222 : mUniqueId(aId)
223 {
224 }
225 bool operator<(const HeartbeatInfo& aInfo) const { return mUniqueId < aInfo.mUniqueId; }
226 GenUniqueId mUniqueId;
227 WsfXIO_Connection* mConnectionPtr;
228 };
229
230 using TimeoutQueue = std::priority_queue<Timeout>;
231 // using UDP_Target = std::pair<UDP_Type, std::string>;
232 using AddrPort = std::pair<unsigned int, short>;
233 using ConnectionCallbackMap = std::map<WsfXIO_Connection*, UtCallbackListN<void(WsfXIO_Connection*)>*>;
234 using PendingConnectionInfo = std::pair<GenSockets::GenInternetSocketAddress, WsfXIO_Connection*>;
235 using SenderConnectionMap = std::map<SenderAddress, WsfXIO_Connection*>;
236 using ConnectionIdMap = std::map<int, WsfXIO_Connection*>;
237 using PacketBuffer = std::deque<WsfXIO_Packet*>;
238
239 UtCallbackHolder mCallbacks;
240
241 GenUniqueId mApplicationId;
242 wsf::xio::ApplicationType mApplicationType;
243
244 ClockSource* mClockSourcePtr;
245 WsfXIO_UDP_Header* mUDP_HeaderPtr;
246 WsfXIO_RequestManager* mRequestManagerPtr;
247 WsfXIO_QueryManager* mQueryManagerPtr;
248 WsfXIO_Publisher* mPublisherPtr;
249 PakTCP_Connector* mConnectorPtr;
250
251 TimeoutQueue mTimeouts;
252
255 double mLastAdvanceTime;
256
257 // The following variables are used for sending out the heartbeat pdu's
258 UtWallClock mClock;
259 double mCurrentTime;
260 double mPreviousHeartbeatTime;
261 double mPreviousConnectionUpdateTime;
262 double mConnectionUpdateInterval;
263
265 std::set<HeartbeatInfo> mProcessedHeartbeats;
266
268 SenderConnectionMap mSenderConnections;
269
271 ConnectionList mConnections;
272
274 ConnectionList mConnectedConnections;
275
277 ConnectionIdMap mConnectionsById;
278
280 PakThreadedIO mThreadedIO;
281
282 ConnectionCallbackMap mDisconnectCallbacks;
283
284 PacketBuffer mReceivePacketBuffer;
285 std::map<std::string, std::string> mAvailableServices;
286
287 size_t mTotalBytesSent;
288 size_t mTotalBytesReceived;
289
290 size_t mPreviousBytesSent;
291 size_t mPreviousBytesReceived;
292
294 bool mIsInitialized;
295};
296
297#endif
#define WSF_EXPORT
Definition WsfXIO_Export.hpp:35
Definition WsfXIO_Connection.hpp:37
Definition WsfXIO_Destination.hpp:26
Sent at regular intervals over the UDP connections.
Definition WsfXIO_PacketRegistry.hpp:91
Sent at regular intervals over the UDP connections.
Definition WsfXIO_PacketRegistry.hpp:109
bool mInterfaceRequested
true if user has requested the XIO interface
Definition WsfXIO_InputData.hpp:113
WsfStringId mApplicationName
The current application's name.
Definition WsfXIO_InputData.hpp:82
bool mDebugEnabled
Definition WsfXIO_InputData.hpp:108
WsfXIO_InputData()
Definition WsfXIO_InputData.cpp:25
bool mShowConnections
Definition WsfXIO_InputData.hpp:109
std::vector< UDP_Target > mUDP_Targets
Contains user input UDP target information.
Definition WsfXIO_InputData.hpp:100
Definition WsfXIO_Interface.hpp:57
virtual ~ClockSource()
Definition WsfXIO_Interface.hpp:59
virtual double GetSimTime() const =0
void SetXIO_Requested()
Definition WsfXIO_Interface.hpp:170
const ConnectionList & GetReliableConnections() const
Definition WsfXIO_Interface.hpp:158
UtCallbackListN< void(double, GenUniqueId, bool)> OnHeartbeatUpdate
Definition WsfXIO_Interface.hpp:122
UtCallbackListN< void(WsfXIO_Connection *)> OnDisconnected
Invoked when a connection is no longer connected, prior to deletion.
Definition WsfXIO_Interface.hpp:116
void SetApplicationName(const std::string &aApplicationName)
Definition WsfXIO_Interface.hpp:75
double GetSimTime() const
Returns the current simulation time.
Definition WsfXIO_Interface.hpp:86
void SetDebugEnabled(bool aIsEnabled)
Definition WsfXIO_Interface.hpp:178
WsfXIO_QueryManager & GetQueryManager() const
Definition WsfXIO_Interface.hpp:141
const std::vector< UDP_Target > & GetUDP_Targets()
Definition WsfXIO_Interface.hpp:155
bool IsDebugEnabled() const
Was detailed debugging information requested?
Definition WsfXIO_Interface.hpp:177
WsfXIO_Publisher & GetPublisher() const
Definition WsfXIO_Interface.hpp:143
const GenUniqueId & GetApplicationId() const
Definition WsfXIO_Interface.hpp:74
const ConnectionList & GetConnections() const
Definition WsfXIO_Interface.hpp:157
UtCallbackN< void(WsfXIO_Connection *)> ConnectionCallback
Definition WsfXIO_Interface.hpp:65
void SetShowConnections(bool aShowConnections)
Definition WsfXIO_Interface.hpp:174
std::unique_ptr< ConnectionCallback > DisconnectConnect(WsfXIO_Connection *aConnectionPtr, const ConnectionCallback::FunctionType &aFunction)
Definition WsfXIO_Interface.cpp:426
void SetApplicationType(wsf::xio::ApplicationType aApplicationType)
Definition WsfXIO_Interface.hpp:77
WsfXIO_Connection * GetSender(PakPacket &aPkt)
Definition WsfXIO_Interface.cpp:372
void SetValidApplicationTypes(const std::vector< int > &aApplicationTypes)
UtCallbackListN< void(WsfXIO_Connection *)> ConnectionCallbackList
Definition WsfXIO_Interface.hpp:66
bool ShowConnections() const
Should connection status messages be shown?
Definition WsfXIO_Interface.hpp:173
std::pair< int, int > SenderAddress
Definition WsfXIO_Interface.hpp:63
std::string GetApplicationName() const
Definition WsfXIO_Interface.hpp:76
double GetLastAdvanceTime() const
Definition WsfXIO_Interface.hpp:87
UtCallbackListN< void(WsfXIO_Connection *)> OnConnected
Invoked when a connection is initialized.
Definition WsfXIO_Interface.hpp:113
std::vector< WsfXIO_Connection * > ConnectionList
Definition WsfXIO_Interface.hpp:64
bool IsXIO_Requested() const
Was a network connection requested?
Definition WsfXIO_Interface.hpp:169
UtCallbackListN< void(int, int, int, int, double)> BandwidthDataEvent
Executes on the heartbeat to provide bandwidth information to event output.
Definition WsfXIO_Interface.hpp:128
WsfXIO_Interface()
This form is used when the caller is not a WSF simulation.
Definition WsfXIO_Interface.cpp:59
WsfXIO_RequestManager & GetRequestManager()
Definition WsfXIO_Interface.hpp:139
UtCallbackListN< void(bool, const std::string &)> OnApplicationBehind
Invoked when a connected application has fallen behind the real-time clock by some threshold,...
Definition WsfXIO_Interface.hpp:125
std::unique_ptr< UtCallbackN< void()> > TimeoutConnect(double aWaitTime, const std::function< void()> &aFunction)
Definition WsfXIO_Interface.cpp:327
Base class for XIO Packets. Provides the header information.
Definition WsfXIO_Packet.hpp:46
WsfXIO_Publisher Provides a basic Publish/Subscribe mechanism.
Definition WsfXIO_Publisher.hpp:75
Definition WsfXIO_QueryManager.hpp:26
Maintains a group of WsfXIO_Requests.
Definition WsfXIO_Request.hpp:31
Definition WsfXIO_PacketRegistry.hpp:1092
Definition WsfXIO_UDP_Header.hpp:24
ApplicationType
Definition WsfXIO.hpp:24
Copyrights Multiple, All Rights Reserved