VR-Forces 5.0.1 Developer's Guide
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
vrlinkNetworkInterface.h
Go to the documentation of this file.
1 /*******************************************************************************
2 ** Copyright (c) 2020 MAK Technologies, Inc.
3 ** All rights reserved.
4 *******************************************************************************/
5 
6 #pragma once
7 
18 #include <vl/globalObjectDesignator.h>
19 #include <vl/vrlinkStateStateRepository.h>
20 #include <tbb/spin_mutex.h>
21 #include <tbb/mutex.h>
22 #include <map>
23 #include <set>
24 #include <atomic>
25 #include <tbb/tbb_thread.h>
26 #include <boost/function.hpp>
27 
28 class DtExerciseConn;
29 class DtExerciseClock;
30 class DtVrfParameterDb;
32 class DtObjectType;
36 
37 namespace makVrf
38 {
39  class DtRemoteObjectManager;
40  class DtVrfEntityIdentifierFactory;
41  class DtVrlinkNetworkInterface;
42  class DtVrlinkEventTranslatorManager;
43  class DtVrlinkEventTranslator;
44  class DtStateDataManager;
45 #if DtHLA
46  class DtHlaExerciseClock;
47 #endif
48 
49  typedef DtVrlinkNetworkInterface* (*DtVrlinkNetworkInterfaceCreatorFcn)(DtExerciseConn*, bool);
50 
56  {
57  public:
59  {
60  public:
63  };
64 
65 
66  public:
67 
70  DtVrlinkNetworkInterface(DtExerciseConn*, int clockMode = 0);
71 
72  virtual ~DtVrlinkNetworkInterface();
73 
74  virtual void beginFrame(double) override;
75  virtual bool preAdvanceFrame() override;
76  virtual void advanceFrame(double* networkTime = nullptr) override;
77 
79  virtual void setBlockOnUnfinishedRemoteDiscovery(bool);
81  {
82  return myBlockOnUnfinishedRemoteDiscovery;
83  }
84 
85  virtual const char* type() const { return Type(); };
86  static const char* Type() { return "vrlink-network-interface"; };
87 
89  virtual bool printDataToStream(const DtUUID&, DtOutputStream& stream) const;
90 
92  virtual void setInterest(const DtVector& geocentricCenter, double radius);
93 
95  virtual DtStateData* stateDataForGlobalId(const DtString&) const;
96  virtual DtStateData* stateDataForEntityId(const DtString&) const;
97  virtual const DtStateData* stateDataForUUID(const DtUUID&) const;
98 
99  virtual void setExerciseStartTime(double);
100  virtual void setSimTime(double);
101  virtual void setTimeMultiplier(double);
102 
104  virtual void resetSimulation();
105 
108  virtual void setControlsDrainInput(bool);
109  bool controlsDrainInput() const;
110 
111  virtual std::string protocol() const override
112  {
113 #if DtDIS == 1
114  return std::string("DIS");
115 #elif DDtHLA_1516_EVOLVED == 1
116  return std::string("HLA1516e");
117 #elif DDtHLA_1516 == 1
118  return std::string("HLA1516");
119 #else //This is HLA13
120  return std::string("HLA13");
121 #endif
122  }
123 
124  #if DtHLA
125  virtual void setRunInTimeManagementMode(bool yesOrNo);
128  virtual bool runInTimeManagementMode() const;
129 
133  static void startTimeManagement(void* usr);
134  static void stopTimeManagement(void* usr);
135 
138  virtual void processStartTimeManagement();
139  virtual void processStopTimeManagement();
140 
142  virtual void setReflectedListRequestUpdates(bool yesOrNo);
143  #endif
144 
146  virtual void setMetocPublishingEnabled(bool);
148  {
149  return myMetocPublishingEnabled;
150  }
151 
153  virtual void setDisableRemoteDiscovery(bool);
155  {
156  return myDisableRemoteDiscovery;
157  }
158 
159 #if DtDIS
160  virtual void setDefaultObjectTimeout(int);
162  {
163  return myDefaultObjectTimeout;
164  }
165 #endif
166  struct ComponentRuleUserData
171  {
172  virtual ComponentRuleUserData* clone() const { return nullptr; };
173  };
174 
176  {
178  ComponentTypeUserData(const ComponentTypeUserData& orig) : type(orig.type) {};
179  virtual ComponentRuleUserData* clone() const { return new ComponentTypeUserData(*this); };
180 
182  };
183 
184  typedef boost::function<bool (const DtStateComponent*, const DtStateData*, std::shared_ptr<ComponentRuleUserData>)> CreationRule;
185  virtual void setComponentPublisherCreatorRule(CreationRule, const DtString& networkInterface, const ComponentRuleUserData& userData = ComponentRuleUserData(),
186  const DtString& testBeforeInterface = "");
187 
188  virtual DtSimObjectNetInterface* createNetInterface(DtStateData* sd);
189 
190  virtual void setRunFullyThreaded(bool);
191  virtual bool runFullyThreaded() const;
192 
193  virtual void setEnabled(bool);
194 
195  virtual void setCoordinateSystem(const Coordinate_System*);
197  {
198  return myCoordinateSystem;
199  }
200 
201  DtExerciseConn* exerciseConnection()
202  {
203  return myExerciseConnection;
204  }
205 
206  virtual void removeAndDeleteAll();
207  virtual bool wantsToSelfReflect(unsigned int) const;
208 
210  virtual bool selfReflecting() const;
211 
213  virtual void setSelfReflecting(bool) {};
214 
215  virtual void setParameterDatabase(DtVrfParameterDb*db);
217  {
218  return myParameterDatabase;
219  }
220 
221  virtual unsigned int maxNameLengthForType(const DtObjectType&) const;
222 
224  virtual void setVrfSessionId(int);
225  virtual int vrfSessionId() const
226  {
227  return myVrfSessionId;
228  }
229 
231  virtual void setVrfMessageVersionSupported(int);
232  virtual int vrfMessageVersionSupported() const
233  {
234  return myVrfMessageVersionSupported;
235  }
236 
239  virtual void setPublishZeroVelocityWhenPaused(bool);
241  {
242  return myPublishZeroVelocityWhenPaused;
243  }
244 
250  unsigned int simMgmtPduProcessLevel() const
251  {
252  return mySimMgmtPduProcessLevel;
253  }
254 
255  virtual void setSimMgmtPduProcessLevel(unsigned int level);
256 
260  virtual void setDeadReckoningAlgorithmToStaticOnPause(bool);
262  {
263  return mySetDeadReckoningAlgorithmToStaticOnPause;
264  }
265 
267  virtual void overrideDeadReckoningAlgorithm(int drAlg);
268 
271  virtual bool isDeadReckonAlgorithmOverridden(int& drAlg) const;
272 
275  virtual void removeDeadReckoningAlgorithmOverride();
276 
277  virtual DtEntityIdentifier nextEntityIdentifier(const DtStateData* = 0, const DtEntityIdentifier& = DtEntityIdentifier());
278 
279  virtual DtEntityIdentifier objectIdentifierFor(makVrf::SimStateID) const;
280  virtual DtEntityIdentifier objectIdentifierFor(const DtUUID&) const;
281 
282  #if DtDIS
283  virtual DtEntityIdentifier globalObjectIdentifierFor(const DtUUID&) const;
284  virtual DtEntityIdentifier globalObjectIdentifierFor(makVrf::SimStateID) const;
285  #else
286  virtual DtGlobalObjectDesignator globalObjectIdentifierFor(const DtUUID&) const;
287  virtual DtGlobalObjectDesignator globalObjectIdentifierFor(makVrf::SimStateID) const;
288  #endif
289 
290  virtual DtUUID uuidForObjectIdentifier(const DtEntityIdentifier&) const;
291 
292  #if DtHLA
293  virtual DtUUID uuidForObjectIdentifier(const DtGlobalObjectDesignator&) const;
294  #endif
295 
296  virtual void setSiteAppId(int, int);
297 
300  virtual DtEventId nextEventId(const DtGlobalObjectDesignator& entId);
301 
302  virtual int setAppIdRangeMax(int);
303 
304  virtual DtVrfEntityIdentifierFactory* createVrfEntityIdentifierFactory();
305 
307  virtual void startScenarioLoad(bool);
308 
310  virtual void endScenarioLoad(bool);
311 
313  virtual AddEventResult addEvent(const makVrfEvents::DtEvent&, bool& selfReflect);
314  virtual AddEventResult sendEvent(const makVrfEvents::DtEvent&);
315 
316  virtual double determineSimTime(double& dt);
317 
318  virtual double simTime() const;
319 
320  virtual void setMaxDrainInputTime(double maxTime);
321  virtual double maxDrainInputTime() const;
322 
323  virtual void setFrameRateMode(const DtString& mode, double deltaTime, bool manageTime = false);
324  virtual void rewindScenario();
325 
326  #ifdef DtHLA
327  virtual void setMinDrainInputTime(double minTime);
328  virtual double minDrainInputTime() const;
329 
330  virtual void setFrameDeltaTime(double);
331  virtual double frameDeltaTime() const;
332 
333  virtual void beginBulkCreate() override;
334  virtual void endBulkCreate() override;
335  #else
336  virtual void setMaxDrainInputReads(int maxReads);
337  virtual int maxDrainInputReads() const;
338  #endif
339 
341  virtual void addEventTranslator(int eventType, DtVrlinkEventTranslator*);
342 
344  virtual void removeEventTranslator(int eventType);
345 
346  virtual DtVrlinkEventTranslator* eventTranslatorFor(int eventType) const;
347 
349  virtual void run();
350 
352  virtual void pause();
353 
354  static void setVrlinkNetworkInterfaceCreatorFcn(DtVrlinkNetworkInterfaceCreatorFcn fcn);
355  static DtVrlinkNetworkInterface* createVrlinkNetworkInterface(DtExerciseConn*, int clockMode = 0);
356 
358  virtual bool typeIsPublishable(const DtEntityType&) const { return true; };
359 
361  virtual void setEventManager(makVrfEvents::DtEventManager*);
363  {
364  return myEventManager;
365  }
366 
368  {
369  return myCommunicationManager;
370  }
371 
373  {
374  return myRemoteObjectManager;
375  }
376 
380  virtual void setNumCallbackThreads(unsigned);
381 
383  virtual void setNumRemoteCallbackThreads(unsigned);
384 
385  virtual void addDefaultNetworkInterface(const DtEntityType&, const DtString& local, const DtString& remote);
386  virtual void removeDefaultNetworkInterface(const DtEntityType&);
387 
389  virtual DtString defaultInterfaceTypeFor(const DtStateData*) const;
390 
393  virtual void setUseNetworkThread(bool);
394  virtual bool usingNetworkThread() const;
395 
397  virtual void setDisableParallelPublisherTick(bool);
398  virtual bool disableParallelPublisherTick() const;
399 
402  virtual void setTickPublishersDuringEntityTick(bool);
403  virtual bool tickPublishersDuringEntityTick() const;
404 
407  virtual void reserve(unsigned numToReserve);
408 
410  virtual bool willRediscoverObjects() const;
411 
412 
415 
417  virtual double networkFrameTime() const
418  {
419  return myNetworkFrameTime;
420  }
421 
422  virtual void setSendMessagesInNetworkProcess(bool);
424  {
425  return mySendMessagesInNetworkProcess;
426  }
427 
428 #if DtHLA_1516_EVOLVED
429  virtual void setAutoReserve(int);
431  int autoReserve() const;
432 
433  virtual bool isNameReserved(const DtString& name) const;
434  virtual bool isNameReservationPending(const DtString& name) const;
435 #endif
436 
440  virtual DtString nextGlobalObjectId(const DtString& defaultId = DtString::nullString());
441 
442  protected:
443  virtual void sendQueuedMessages();
444 
446  virtual bool init(DtCommunicationManager*);
447 
449  virtual DtRemoteObjectManager* createRemoteObjectManager();
450 
452  virtual void reserveGlobalObjectIds(unsigned numToReserve);
453 
454  virtual bool isPublishableComponent(DtStateComponent* sc) const;
455 
457  virtual void stateComponentAdded(DtStateComponent*);
458 
460  virtual void stateComponentRemoved(const DtStateComponent*);
461 
463  virtual bool validateScenario(const DtScenario& s, DtString& error) const;
464 
466  virtual bool hasSimulationTime() const { return true; };
467 
470  virtual bool needsUnpublishedDatabase() const
471  {
472  return false;
473  }
474 
475  protected:
476  virtual void advanceFrame(DtVrfCallbackQueue*);
477 
480  virtual bool stateDataAdded(DtStateData*);
481 
483  virtual void slot_prepareForHandoff(DtStateData*, bool becomingLocal);
484 
486  virtual void stateDataAboutToBeRemoved(const DtStateData*);
487 
488  virtual void printReflectedObjectCounts() const;
489 
492  virtual void requestUpdatesForRemoteNonVrfObjects() const;
493 
495  void createExerciseClock(int clockMode = 0);
496 
497  virtual void drainInput();
498 
499  virtual void createNetInterfaceFor(DtStateComponent*);
500 
501  virtual void cleanupNetworkThread();
502 
503  virtual void runNetwork();
504  virtual void resolvePendingIds();
505  virtual const DtVrfObjectParameters* lookupParameterEntry(const DtObjectType& ot) const;
506 
507  virtual void createAndInitRemoteObjectManager();
508 
510  virtual bool rediscoverObjects();
511 
513  virtual bool publishingOnLegionNetwork() const { return false; };
514 
516  virtual bool createInterfaceIfComponentIs(const DtStateComponent* c, const DtStateData* d, std::shared_ptr<ComponentRuleUserData>);
517 
518  virtual void stateDataManagerDeleted();
519 
520 #if DtHLA_1516_EVOLVED
521  virtual void reservedNamesSuceeded(const std::set<std::wstring>& theNames);
523 
525  virtual void reservedNamesFailed(const std::set<std::wstring>& theNames);
526 
527  static void nameSetReservationSucceededCb(const std::set<std::wstring>& nameSet,
528  void* userData);
529  static void nameSetReservationFailedCb(const std::set<std::wstring>& nameSet,
530  void* userData);
531 #endif
532 
533 #if DtHLA
534  virtual void setExecutionState(DtVRLExecutionStatus status);
535 #endif
536  typedef DtPublisherContainer<DtSimObjectNetInterface> PublisherContainer;
537 
538  protected:
539  DtExerciseConn* myExerciseConnection;
541  bool myEnabled;
545 
546  typedef std::map<makVrf::SimStateID, DtSimObjectNetInterface*> Publishing;
548 
549  typedef std::map<DtStateComponent*, DtSimObjectNetInterface*> StateComponentsPublishing;
550  typedef std::map<makVrf::SimStateID, StateComponentsPublishing> ComponentsPublishing;
552 
553  mutable tbb::queuing_rw_mutex myPublishingMutex;
554  mutable tbb::spin_rw_mutex myStateDataMutex;
555 
557 
558  #if DtHLA
559  typedef std::map<DtString, DtStateData*> StateDataByGlobalId;
561  std::set<DtStateData*> myPendingGlobalIds;
562  #endif
563 
564  typedef std::map<DtString, DtStateData*> StateDataByEntityId;
566  std::set<DtStateData*> myPendingEntityIds;
567 
569  {
572  std::shared_ptr<ComponentRuleUserData> userData;
573  };
574 
575  typedef std::vector<ComponentCreationRule> ComponentCreationRules;
577 
579 
583 
589 
590  tbb::spin_mutex myEventIdMutex;
595 
596  #if DtHLA
601 
602  #if DtHLA_1516_EVOLVED
603  std::set<DtGlobalObjectDesignator> myReservedGlobalIds;
604  std::set<DtGlobalObjectDesignator> myPendingReservedGlobalIds;
605  tbb::queuing_mutex myGlobalIdReserveMutex;
606  int myAutoReserve;
607  #endif
608  #else
609  DtExerciseClock* myExerciseClock;
610  int myMaxDrainInputReads;
611  #endif
612 
619  std::set<DtStateComponent*> myCreateNetInterfaceFor;
621 
623 
624  typedef tbb::interface5::condition_variable Condition;
625  typedef tbb::mutex ConditionMutex;
626  typedef tbb::interface5::unique_lock<ConditionMutex> ConditionLock;
627 
629  std::auto_ptr<tbb::tbb_thread> myNetworkThread;
632  std::atomic<bool> myShutdownNetworkThreadFlag;
635 
640 
641 #if DtHLA
643 #endif
647  std::atomic<bool> myStartNetworkThread;
648 
649 #if DtDIS
651 #endif
652 
658 
659  std::vector<DtSimObjectNetInterface*> myInterfacesToDelete;
661 
664  std::vector<makVrfEvents::DtEvent*> myQueuedMessagesToSend;
666 
670  };
671 }
UUID is a unique ID wrapper class.
Definition: rwUUID.h:226
Instances of DtVrfObjectParameters are the readable/writeable objects that contain the information ne...
Definition: vrfObjectParameters.h:63
Instances of DtVrfParameterDb are the database of DtVrfObjectParameters objects used in the construct...
Definition: vrfParameterDb.h:38
DtString local
Definition: vrlinkNetworkInterface.h:61
Definition: scenario.h:52
Default implementation that will add protocol and state data validators (contained in this header fil...
Definition: defaultSimulationModelSetValidatorManager.h:19
DtString remote
Definition: vrlinkNetworkInterface.h:62
unsigned int StateComponentType
Definition: stateComponent.h:55
DT_DLL_VRVCORE DtTaitBryan level(const DtCoordinateSystem &cs, const DtVector &localOrigin, double topoHeading)
Returns a level orientation with the topographic heading.
The DtEventManager handles the sending and receipt of system events (fire, detonate, command, etc). It provides a thread-safe way for the sim engine to send and receive such events, between both components within this sim engine and other remote applications.
Definition: eventManager.h:33
Definition: fastForwardSettings.h:12
Simple asynchronous callback queue.
Definition: vrfCallbackQueue.h:32
Definition: vrfEntityIdentifierFactory.h:21
class DtRemoteObjectManager:
Definition: remoteObjectManager.h:28
Definition: objectType.h:27
DtNetworkManagerInterface is the base class which all network interfaces must be derived from...
Definition: networkManagerInterface.h:40
Definition: coordSystem.h:54
The overall structure of the DtStateData mechanism is: The DtStateData contains a list of double buff...
Definition: stateData.h:336
Definition: event.h:13
DtVrlinkNetworkInterface *(* DtVrlinkNetworkInterfaceCreatorFcn)(DtExerciseConn *, bool)
Definition: vrlinkNetworkInterface.h:49
The DtCommunicationManager class is a convenience class that will create both the DtNetworkInterfaceM...
Definition: communicationManager.h:51
Class Description: DtSimObjectNetInterface.
Definition: simObjectNetInterface.h:48
Definition: asyncJobServer.h:39
Definition: stateComponent.h:51
voidpf stream
Definition: ioapi.h:39
DT_DLL_DEBUGDRAWRENDERER void init(makVrv::DtDe &de)
Work function for the plugin initialization.
const char int mode
Definition: ioapi.h:38
Definition: hlaExerciseClock.h:35
Contains the DtStateComponent class declaration.
Definition: vrlinkNetworkInterface.h:58
Description: The Exercise Clock keeps track of current simulated time. When &#39;ticked&#39;, it advances simulation time based on elapsed real time since the last time it was ticked and a time-multiplier that allows the exercise clock to run faster or slower than real-time. The exercise clock also supports a pause/resume capability.
Definition: exerciseClock.h:26
This class holds the state data that represents each simulation object in the system.
Definition: stateDataManager.h:71

Document ID: Generated on Mon Jun 20 00:38:30 EDT 2022 from SVN revision 244029
Copyright © 2005-2021 MAK Technologies. All Rights Reserved (www.mak.com)