VR-Forces 5.0.3 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 #if DtHLA
38 namespace makVrfVrlinkExtToolkit
39 {
40  class DtReflectedExtendedAttributesObjectList;
41 }
42 #endif
43 
44 namespace makVrf
45 {
46  class DtRemoteObjectManager;
47  class DtVrfEntityIdentifierFactory;
48  class DtVrlinkNetworkInterface;
49  class DtVrlinkEventTranslatorManager;
50  class DtVrlinkEventTranslator;
51  class DtStateDataManager;
52 #if DtHLA
53  class DtHlaExerciseClock;
54 #endif
55 
56  typedef DtVrlinkNetworkInterface* (*DtVrlinkNetworkInterfaceCreatorFcn)(DtExerciseConn*, bool);
57 
63  {
64  public:
66  {
67  public:
70  };
71 
72 
73  public:
74 
77  DtVrlinkNetworkInterface(DtExerciseConn*, int clockMode = 0);
78 
79  virtual ~DtVrlinkNetworkInterface();
80 
81  virtual void beginFrame(double) override;
82  virtual bool preAdvanceFrame() override;
83  virtual void advanceFrame(double* networkTime = nullptr) override;
84 
86  virtual void setBlockOnUnfinishedRemoteDiscovery(bool);
88  {
89  return myBlockOnUnfinishedRemoteDiscovery;
90  }
91 
92  virtual const char* type() const { return Type(); };
93  static const char* Type() { return "vrlink-network-interface"; };
94 
96  virtual bool printDataToStream(const DtUUID&, DtOutputStream& stream) const;
97 
99  virtual void setInterest(const DtVector& geocentricCenter, double radius);
100 
102  virtual DtUUID entityThatHostsRadio(const DtGlobalObjectDesignator&, int radioIndex) const;
103 
106  virtual DtGlobalObjectDesignator radioGlobalObjectDesignatorFor(const DtUUID& entityUUID, int radioIndex, bool* radioFound = nullptr) const;
107 
109  virtual DtStateData* stateDataForGlobalId(const DtString&) const;
110  virtual DtStateData* stateDataForEntityId(const DtString&) const;
111  virtual const DtStateData* stateDataForUUID(const DtUUID&) const;
112 
113  virtual void setExerciseStartTime(double);
114  virtual void setSimTime(double);
115  virtual void setTimeMultiplier(double);
116 
118  virtual void resetSimulation();
119 
122  virtual void setControlsDrainInput(bool);
123  bool controlsDrainInput() const;
124 
125  virtual std::string protocol() const override
126  {
127 #if DtDIS == 1
128  return std::string("DIS");
129 #elif DDtHLA_1516_EVOLVED == 1
130  return std::string("HLA1516e");
131 #elif DDtHLA_1516 == 1
132  return std::string("HLA1516");
133 #else //This is HLA13
134  return std::string("HLA13");
135 #endif
136  }
137 
138  #if DtHLA
139  virtual void setRunInTimeManagementMode(bool yesOrNo);
142  virtual bool runInTimeManagementMode() const;
143 
147  static void startTimeManagement(void* usr);
148  static void stopTimeManagement(void* usr);
149 
152  virtual void processStartTimeManagement();
153  virtual void processStopTimeManagement();
154 
156  virtual void setReflectedListRequestUpdates(bool yesOrNo);
157  #endif
158 
160  virtual void setMetocPublishingEnabled(bool);
162  {
163  return myMetocPublishingEnabled;
164  }
165 
167  virtual void setDisableRemoteDiscovery(bool);
169  {
170  return myDisableRemoteDiscovery;
171  }
172 
173 #if DtDIS
174  virtual void setDefaultObjectTimeout(int);
176  {
177  return myDefaultObjectTimeout;
178  }
179 #endif
180  struct ComponentRuleUserData
185  {
186  virtual ComponentRuleUserData* clone() const { return nullptr; };
187  };
188 
190  {
192  ComponentTypeUserData(const ComponentTypeUserData& orig) : type(orig.type) {};
193  virtual ComponentRuleUserData* clone() const { return new ComponentTypeUserData(*this); };
194 
196  };
197 
198  typedef boost::function<bool (const DtStateComponent*, const DtStateData*, std::shared_ptr<ComponentRuleUserData>)> CreationRule;
199  virtual void setComponentPublisherCreatorRule(CreationRule, const DtString& networkInterface, const ComponentRuleUserData& userData = ComponentRuleUserData(),
200  const DtString& testBeforeInterface = "");
201 
203  virtual bool createInterfaceIfComponentIs(const DtStateComponent* c, const DtStateData* d, std::shared_ptr<ComponentRuleUserData>);
204 
205  virtual DtSimObjectNetInterface* createNetInterface(DtStateData* sd);
206 
207  virtual void setRunFullyThreaded(bool);
208  virtual bool runFullyThreaded() const;
209 
210  virtual void setEnabled(bool);
211 
212  virtual void setCoordinateSystem(const Coordinate_System*);
214  {
215  return myCoordinateSystem;
216  }
217 
218  DtExerciseConn* exerciseConnection()
219  {
220  return myExerciseConnection;
221  }
222 
223  virtual void removeAndDeleteAll();
224  virtual bool wantsToSelfReflect(unsigned int) const;
225 
227  virtual bool selfReflecting() const;
228 
230  virtual void setSelfReflecting(bool) {};
231 
232  virtual void setParameterDatabase(DtVrfParameterDb*db);
234  {
235  return myParameterDatabase;
236  }
237 
238  virtual unsigned int maxNameLengthForType(const DtObjectType&) const;
239 
241  virtual void setVrfSessionId(int);
242  virtual int vrfSessionId() const
243  {
244  return myVrfSessionId;
245  }
246 
248  virtual void setVrfMessageVersionSupported(int);
249  virtual int vrfMessageVersionSupported() const
250  {
251  return myVrfMessageVersionSupported;
252  }
253 
256  virtual void setPublishZeroVelocityWhenPaused(bool);
258  {
259  return myPublishZeroVelocityWhenPaused;
260  }
261 
267  unsigned int simMgmtPduProcessLevel() const
268  {
269  return mySimMgmtPduProcessLevel;
270  }
271 
272  virtual void setSimMgmtPduProcessLevel(unsigned int level);
273 
277  virtual void setDeadReckoningAlgorithmToStaticOnPause(bool);
279  {
280  return mySetDeadReckoningAlgorithmToStaticOnPause;
281  }
282 
284  virtual void overrideDeadReckoningAlgorithm(int drAlg);
285 
288  virtual bool isDeadReckonAlgorithmOverridden(int& drAlg) const;
289 
292  virtual void removeDeadReckoningAlgorithmOverride();
293 
294  virtual DtEntityIdentifier nextEntityIdentifier(const DtStateData* = 0, const DtEntityIdentifier& = DtEntityIdentifier());
295 
296  virtual DtEntityIdentifier objectIdentifierFor(makVrf::SimStateID) const;
297  virtual DtEntityIdentifier objectIdentifierFor(const DtUUID&) const;
298 
299  #if DtDIS
300  virtual DtEntityIdentifier globalObjectIdentifierFor(const DtUUID&) const;
301  virtual DtEntityIdentifier globalObjectIdentifierFor(makVrf::SimStateID) const;
302  #else
303  virtual DtGlobalObjectDesignator globalObjectIdentifierFor(const DtUUID&) const;
304  virtual DtGlobalObjectDesignator globalObjectIdentifierFor(makVrf::SimStateID) const;
305  #endif
306 
307  virtual DtUUID uuidForObjectIdentifier(const DtEntityIdentifier&) const;
308 
309  #if DtHLA
310  virtual DtUUID uuidForObjectIdentifier(const DtGlobalObjectDesignator&) const;
311  #endif
312 
313  virtual void setSiteAppId(int, int);
314 
317  virtual DtString nextEventId(const DtString& entId = DtString::nullString()) override;
318 
319  virtual int setAppIdRangeMax(int);
320 
321  virtual DtVrfEntityIdentifierFactory* createVrfEntityIdentifierFactory();
322 
324  virtual void startScenarioLoad(bool);
325 
327  virtual void endScenarioLoad(bool);
328 
330  virtual AddEventResult addEvent(const makVrfEvents::DtEvent&, bool& selfReflect);
331  virtual AddEventResult sendEvent(const makVrfEvents::DtEvent&);
332 
333  virtual double determineSimTime(double& dt, DtCommunicationManagerPerformanceTimerInformation* performanceTimerInformation = nullptr) override;
334 
335  virtual double simTime() const;
336 
337  virtual void setMaxDrainInputTime(double maxTime);
338  virtual double maxDrainInputTime() const;
339 
340  virtual void setFrameRateMode(const DtString& mode, double deltaTime, bool manageTime = false);
341  virtual void rewindScenario();
342 
343  #ifdef DtHLA
344  virtual void setMinDrainInputTime(double minTime);
345  virtual double minDrainInputTime() const;
346 
347  virtual void setFrameDeltaTime(double);
348  virtual double frameDeltaTime() const;
349 
350  virtual void beginBulkCreate() override;
351  virtual void endBulkCreate() override;
352  #else
353  virtual void setMaxDrainInputReads(int maxReads);
354  virtual int maxDrainInputReads() const;
355  #endif
356 
358  virtual void addEventTranslator(int eventType, DtVrlinkEventTranslator*);
359 
361  virtual void removeEventTranslator(int eventType);
362 
363  virtual DtVrlinkEventTranslator* eventTranslatorFor(int eventType) const;
364 
366  virtual void run();
367 
369  virtual void pause();
370 
371  static void setVrlinkNetworkInterfaceCreatorFcn(DtVrlinkNetworkInterfaceCreatorFcn fcn);
372  static DtVrlinkNetworkInterface* createVrlinkNetworkInterface(DtExerciseConn*, int clockMode = 0);
373 
375  virtual bool typeIsPublishable(const DtEntityType&) const { return true; };
376 
378  virtual void setEventManager(makVrfEvents::DtEventManager*);
380  {
381  return myEventManager;
382  }
383 
385  {
386  return myCommunicationManager;
387  }
388 
390  {
391  return myRemoteObjectManager;
392  }
393 
397  virtual void setNumCallbackThreads(unsigned);
398 
400  virtual void setNumRemoteCallbackThreads(unsigned);
401 
402  virtual void addDefaultNetworkInterface(const DtEntityType&, const DtString& local, const DtString& remote);
403  virtual void removeDefaultNetworkInterface(const DtEntityType&);
404 
406  virtual DtString defaultInterfaceTypeFor(const DtStateData*) const;
407 
410  virtual void setUseNetworkThread(bool);
411  virtual bool usingNetworkThread() const;
412 
414  virtual void setDisableParallelPublisherTick(bool);
415  virtual bool disableParallelPublisherTick() const;
416 
419  virtual void setTickPublishersDuringEntityTick(bool);
420  virtual bool tickPublishersDuringEntityTick() const;
421 
424  virtual void reserve(unsigned numToReserve);
425 
427  virtual bool willRediscoverObjects() const;
428 
429 
432 #if DtHLA
434 #endif
435  );
436 
438  virtual double networkFrameTime() const
439  {
440  return myNetworkFrameTime;
441  }
442 
443  virtual void setSendMessagesInNetworkProcess(bool);
445  {
446  return mySendMessagesInNetworkProcess;
447  }
448 
449 #if DtHLA_1516_EVOLVED
450  virtual void setAutoReserve(int);
452  int autoReserve() const;
453 
454  virtual bool isNameReserved(const DtString& name) const;
455  virtual bool isNameReservationPending(const DtString& name) const;
456 #endif
457 
461  virtual DtString nextGlobalObjectId(const DtString& defaultId = DtString::nullString());
462 
463  protected:
464  virtual void sendQueuedMessages();
465 
467  virtual bool init(DtCommunicationManager*);
468 
470  virtual DtRemoteObjectManager* createRemoteObjectManager();
471 
473  virtual void reserveGlobalObjectIds(unsigned numToReserve);
474 
475  virtual bool isPublishableComponent(DtStateComponent* sc) const;
476 
478  virtual void stateComponentAdded(DtStateComponent*);
479 
481  virtual void stateComponentRemoved(const DtStateComponent*);
482 
484  virtual bool validateScenario(const DtScenario& s, DtString& error) const;
485 
487  virtual bool hasSimulationTime() const { return true; };
488 
491  virtual bool needsUnpublishedDatabase() const
492  {
493  return false;
494  }
495 
496  protected:
497  virtual void advanceFrame(DtVrfCallbackQueue*);
498 
501  virtual bool stateDataAdded(DtStateData*);
502 
504  virtual void slot_prepareForHandoff(DtStateData*, bool becomingLocal);
505 
507  virtual void stateDataAboutToBeRemoved(const DtStateData*);
508 
509  virtual void printReflectedObjectCounts() const;
510 
513  virtual void requestUpdatesForRemoteNonVrfObjects() const;
514 
516  void createExerciseClock(int clockMode = 0);
517 
518  virtual void drainInput();
519 
520  virtual void createNetInterfaceFor(DtStateComponent*);
521 
522  virtual void cleanupNetworkThread();
523 
524  virtual void runNetwork();
525  virtual void resolvePendingIds();
526  virtual const DtVrfObjectParameters* lookupParameterEntry(const DtObjectType& ot) const;
527 
528  virtual void createAndInitRemoteObjectManager();
529 
531  virtual bool rediscoverObjects();
532 
534  virtual bool publishingOnLegionNetwork() const { return false; };
535 
536  virtual void stateDataManagerDeleted();
537 
538 #if DtHLA_1516_EVOLVED
539  virtual void reservedNamesSuceeded(const std::set<std::wstring>& theNames);
541 
543  virtual void reservedNamesFailed(const std::set<std::wstring>& theNames);
544 
545  static void nameSetReservationSucceededCb(const std::set<std::wstring>& nameSet,
546  void* userData);
547  static void nameSetReservationFailedCb(const std::set<std::wstring>& nameSet,
548  void* userData);
549 #endif
550 
551 #if DtHLA
552  virtual void setExecutionState(DtVRLExecutionStatus status);
553 #endif
554  typedef DtPublisherContainer<DtSimObjectNetInterface> PublisherContainer;
555 
556  protected:
557  DtExerciseConn* myExerciseConnection;
559  bool myEnabled;
563 
564  typedef std::map<makVrf::SimStateID, DtSimObjectNetInterface*> Publishing;
566 
567  typedef std::map<DtStateComponent*, DtSimObjectNetInterface*> StateComponentsPublishing;
568  typedef std::map<makVrf::SimStateID, StateComponentsPublishing> ComponentsPublishing;
570 
571  mutable tbb::queuing_rw_mutex myPublishingMutex;
572  mutable tbb::spin_rw_mutex myStateDataMutex;
573 
574  typedef std::map<DtGlobalObjectDesignator, DtSimObjectNetInterface*> GlobalIdForNetworkInterface;
576 
578 
579  #if DtHLA
580  typedef std::map<DtString, DtStateData*> StateDataByGlobalId;
582  std::set<DtStateData*> myPendingGlobalIds;
583  #endif
584 
585  typedef std::map<DtString, DtStateData*> StateDataByEntityId;
587  std::set<DtStateData*> myPendingEntityIds;
588 
590  {
593  std::shared_ptr<ComponentRuleUserData> userData;
594  };
595 
596  typedef std::vector<ComponentCreationRule> ComponentCreationRules;
598 
600 
604 
610 
611  tbb::spin_mutex myEventIdMutex;
616 
617  #if DtHLA
622 
623  #if DtHLA_1516_EVOLVED
624  std::set<DtGlobalObjectDesignator> myReservedGlobalIds;
625  std::set<DtGlobalObjectDesignator> myPendingReservedGlobalIds;
626  tbb::queuing_mutex myGlobalIdReserveMutex;
627  int myAutoReserve;
628  #endif
629  #else
630  DtExerciseClock* myExerciseClock;
631  int myMaxDrainInputReads;
632  #endif
633 
640  std::set<DtStateComponent*> myCreateNetInterfaceFor;
642 
644 
645  typedef tbb::interface5::condition_variable Condition;
646  typedef tbb::mutex ConditionMutex;
647  typedef tbb::interface5::unique_lock<ConditionMutex> ConditionLock;
648 
650  std::auto_ptr<tbb::tbb_thread> myNetworkThread;
653  std::atomic<bool> myShutdownNetworkThreadFlag;
656 
661 
662 #if DtHLA
664 #endif
668  std::atomic<bool> myStartNetworkThread;
669 
670 #if DtDIS
672 #endif
673 
679 
680 #if DtHLA
682 #endif
683 
684  std::vector<DtSimObjectNetInterface*> myInterfacesToDelete;
686 
689  std::vector<makVrfEvents::DtEvent*> myQueuedMessagesToSend;
691 
695  };
696 }
UUID is a unique ID wrapper class.
Definition: rwUUID.h:229
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:68
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:69
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
Definition: communicationManager.h:35
DtNetworkManagerInterface is the base class which all network interfaces must be derived from...
Definition: networkManagerInterface.h:41
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:56
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:65
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:27
This class holds the state data that represents each simulation object in the system.
Definition: stateDataManager.h:71

Document ID: Generated on Thu Jun 1 17:58:13 EDT 2023 from SVN revision 255404
Copyright © 2005-2021 MAK Technologies. All Rights Reserved (www.mak.com)