VR-Forces 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 
19 #include <vl/globalObjectDesignator.h>
20 #include <vl/vrlinkStateStateRepository.h>
21 #include <tbb/spin_mutex.h>
22 #include <tbb/mutex.h>
23 #include <map>
24 #include <set>
25 #include <atomic>
26 #include <tbb/tbb_thread.h>
27 #include <boost/function.hpp>
28 
29 class DtExerciseConn;
30 class DtExerciseClock;
31 class DtVrfParameterDb;
33 class DtObjectType;
39 class DtGeoReferenceVariant;
40 
41 namespace makVrf
42 {
43  class DtRemoteObjectManager;
44  class DtVrfEntityIdentifierFactory;
45  class DtVrlinkNetworkInterface;
46  class DtVrlinkEventTranslatorManager;
47  class DtVrlinkEventTranslator;
48  class DtStateDataManager;
49 #if DtHLA
50  class DtHlaExerciseClock;
51 #endif
52 
53  typedef DtVrlinkNetworkInterface* (*DtVrlinkNetworkInterfaceCreatorFcn)(DtExerciseConn*, bool);
54  typedef DtRemoteObjectManager* (*DtRemoteObjectManagerCreatorFcn)(DtVrlinkNetworkInterface*);
55 
61  {
62  public:
64  {
65  public:
68  };
69 
70 
71  public:
73 
76  DtVrlinkNetworkInterface(DtExerciseConn*, int clockMode = 0);
77 
78  virtual ~DtVrlinkNetworkInterface();
79 
80  virtual void beginFrame(double) override;
81  virtual bool preAdvanceFrame() override;
82  virtual void advanceFrame(double* networkTime = nullptr) override;
83 
85  virtual void setBlockOnUnfinishedRemoteDiscovery(bool);
87  {
88  return myBlockOnUnfinishedRemoteDiscovery;
89  }
90 
91  static void SetRemoteObjectManagerCreatorFcn(DtRemoteObjectManagerCreatorFcn);
92  static DtRemoteObjectManagerCreatorFcn RemoteObjectManagerCreatorFcn();
93 
94  virtual const char* type() const { return Type(); };
95  static const char* Type() { return "vrlink-network-interface"; };
96 
98  virtual bool printDataToStream(const DtUUID&, DtOutputStream& stream) const;
99 
101  virtual void setInterest(const DtVector& geocentricCenter, double radius);
102 
104  virtual DtUUID entityThatHostsRadio(const DtGlobalObjectDesignator&, int radioIndex) const;
105 
108  virtual DtGlobalObjectDesignator radioGlobalObjectDesignatorFor(const DtUUID& entityUUID, int radioIndex, bool* radioFound = nullptr) const;
109 
111  virtual DtStateData* stateDataForGlobalId(const DtString&) const;
112  virtual DtStateData* stateDataForEntityId(const DtString&) const;
113  virtual const DtStateData* stateDataForUUID(const DtUUID&) const;
114  virtual DtStateData* stateDataForUUID(const DtUUID&);
115 
116  virtual DtUUID uuidForGeoReferenceVariant(const DtGeoReferenceVariant& georeference) const;
117  virtual DtStateData* stateDataForGeoReferenceVariant(const DtGeoReferenceVariant&) const;
118  virtual void mapStateDataByGeoReferenceVariant(DtStateData* std, const DtGeoReferenceVariant& grv);
119  virtual bool unmapStateDataByGeoReferenceVariant(const DtGeoReferenceVariant& grv);
120 
121  virtual void setExerciseStartTime(double);
122  virtual void setSimTime(double);
123  virtual void setTimeMultiplier(double);
124 
126  virtual void resetSimulation();
127 
130  virtual void setControlsDrainInput(bool);
131  bool controlsDrainInput() const;
132 
133  virtual std::string protocol() const override
134  {
135 #if DtDIS == 1
136  return std::string("DIS");
137 #elif DDtHLA_1516_EVOLVED == 1
138  return std::string("HLA1516e");
139 #elif DDtHLA_1516 == 1
140  return std::string("HLA1516");
141 #else //This is HLA13
142  return std::string("HLA13");
143 #endif
144  }
145 
146  #if DtHLA
147  virtual bool runningInTimeManagedMode() const;
150 
154  static void startTimeManagement(void* usr);
155  static void stopTimeManagement(void* usr);
156 
159  virtual void processStartTimeManagement();
160  virtual void processStopTimeManagement();
161 
163  virtual void setReflectedListRequestUpdates(bool yesOrNo);
164  #endif
165 
167  virtual void setMetocPublishingEnabled(bool);
169  {
170  return true;
171  }
172 
174  virtual void setDisableRemoteDiscovery(bool);
176  {
177  return myDisableRemoteDiscovery;
178  }
179 
180 #if DtDIS
181  virtual void setDefaultObjectTimeout(int);
183  {
184  return myDefaultObjectTimeout;
185  }
186  virtual void setDisableTimeoutProcessing(bool);
188  {
189  return myDisableTimeoutProcessing;
190  }
191 #endif
192  struct ComponentRuleUserData
197  {
198  virtual ComponentRuleUserData* clone() const { return nullptr; };
199  };
200 
202  {
204  ComponentTypeUserData(const ComponentTypeUserData& orig) : type(orig.type) {};
205  virtual ComponentRuleUserData* clone() const { return new ComponentTypeUserData(*this); };
206 
208  };
209 
210  typedef boost::function<bool (const DtStateComponent*, const DtStateData*, std::shared_ptr<ComponentRuleUserData>)> CreationRule;
211  virtual void setComponentPublisherCreatorRule(CreationRule, const DtString& networkInterface, const ComponentRuleUserData& userData = ComponentRuleUserData(),
212  const DtString& testBeforeInterface = "");
213 
215  virtual bool createInterfaceIfComponentIs(const DtStateComponent* c, const DtStateData* d, std::shared_ptr<ComponentRuleUserData>);
216 
217  virtual DtSimObjectNetInterface* createNetInterface(DtStateData* sd);
218 
220  virtual void reserveEntityId(const DtEntityIdentifier&);
221 
222  virtual void setRunFullyThreaded(bool);
223  virtual bool runFullyThreaded() const;
224 
225  virtual void setEnabled(bool);
226 
227  virtual void setCoordinateSystem(const Coordinate_System*);
229  {
230  return myCoordinateSystem;
231  }
232 
233  DtExerciseConn* exerciseConnection()
234  {
235  return myExerciseConnection;
236  }
237 
238  virtual void removeAndDeleteAll();
239  virtual bool wantsToSelfReflect(unsigned int) const;
240 
242  virtual bool selfReflecting() const;
243 
245  virtual void setSelfReflecting(bool) {};
246 
247  virtual void setParameterDatabase(DtVrfParameterDb*db);
249  {
250  return myParameterDatabase;
251  }
252 
253  virtual unsigned int maxNameLengthForType(const DtObjectType&) const;
254 
256  virtual void setVrfSessionId(int);
257  virtual int vrfSessionId() const
258  {
259  return myVrfSessionId;
260  }
261 
263  virtual void setVrfMessageVersionSupported(int);
264  virtual int vrfMessageVersionSupported() const
265  {
266  return myVrfMessageVersionSupported;
267  }
268 
271  virtual void setPublishZeroVelocityWhenPaused(bool);
273  {
274  return myPublishZeroVelocityWhenPaused;
275  }
276 
282  unsigned int simMgmtPduProcessLevel() const
283  {
284  return mySimMgmtPduProcessLevel;
285  }
286 
287  virtual void setSimMgmtPduProcessLevel(unsigned int level);
288 
292  virtual void setDeadReckoningAlgorithmToStaticOnPause(bool);
294  {
295  return mySetDeadReckoningAlgorithmToStaticOnPause;
296  }
297 
299  virtual void overrideDeadReckoningAlgorithm(int drAlg);
300 
303  virtual bool isDeadReckonAlgorithmOverridden(int& drAlg) const;
304 
307  virtual void removeDeadReckoningAlgorithmOverride();
308 
309  virtual DtEntityIdentifier nextEntityIdentifier(const DtStateData* = 0, const DtEntityIdentifier& = DtEntityIdentifier());
310 
311  virtual DtEntityIdentifier objectIdentifierFor(SimStateID) const;
312  virtual DtEntityIdentifier objectIdentifierFor(const DtUUID&) const;
313 
314  #if DtDIS
315  virtual DtEntityIdentifier globalObjectIdentifierFor(const DtUUID&) const;
316  virtual DtEntityIdentifier globalObjectIdentifierFor(SimStateID) const;
317  #else
318  virtual DtGlobalObjectDesignator globalObjectIdentifierFor(const DtUUID&) const;
319  virtual DtGlobalObjectDesignator globalObjectIdentifierFor(SimStateID) const;
320  #endif
321 
322  virtual DtUUID uuidForObjectIdentifier(const DtEntityIdentifier&) const;
323 
324  #if DtHLA
325  virtual DtUUID uuidForObjectIdentifier(const DtGlobalObjectDesignator&) const;
326  #endif
327 
328  virtual void setSiteAppId(int, int);
329 
332  virtual DtString nextEventId(const DtString& entId = DtString::nullString()) override;
333 
334  virtual int setAppIdRangeMax(int);
335 
336  virtual DtVrfEntityIdentifierFactory* createVrfEntityIdentifierFactory();
337 
339  virtual void startScenarioLoad(bool);
340 
342  virtual void endScenarioLoad(bool);
343 
345  virtual AddEventResult addEvent(const makVrfEvents::DtEvent&, bool& selfReflect);
346  virtual AddEventResult sendEvent(const makVrfEvents::DtEvent&);
347 
348  virtual double determineSimTime(double& dt, DtCommunicationManagerPerformanceTimerInformation* performanceTimerInformation = nullptr) override;
349 
350  virtual double simTime() const;
351 
352  virtual void setMaxDrainInputTime(double maxTime);
353  virtual double maxDrainInputTime() const;
354 
355  virtual void setFrameRateMode(const DtString& mode, double deltaTime, bool manageTime = false);
356  virtual void rewindScenario();
357 
358  #ifdef DtHLA
359  virtual void setMinDrainInputTime(double minTime);
360  virtual double minDrainInputTime() const;
361 
362  virtual void setFrameDeltaTime(double);
363  virtual double frameDeltaTime() const;
364 
365  virtual void beginBulkCreate() override;
366  virtual void endBulkCreate() override;
367  #else
368  virtual void setMaxDrainInputReads(int maxReads);
369  virtual int maxDrainInputReads() const;
370  #endif
371 
373  virtual void addEventTranslator(int eventType, DtVrlinkEventTranslator*);
374 
376  virtual void removeEventTranslator(int eventType);
377 
378  virtual DtVrlinkEventTranslator* eventTranslatorFor(int eventType) const;
379 
381  virtual void run();
382 
384  virtual void pause();
385 
386  static void setVrlinkNetworkInterfaceCreatorFcn(DtVrlinkNetworkInterfaceCreatorFcn fcn);
387  static DtVrlinkNetworkInterface* createVrlinkNetworkInterface(DtExerciseConn*, int clockMode = 0);
388 
390  virtual bool typeIsPublishable(const DtEntityType&) const { return true; };
391 
393  virtual void setEventManager(makVrfEvents::DtEventManager*);
395  {
396  return myEventManager;
397  }
398 
400  {
401  return myCommunicationManager;
402  }
403 
405  {
406  return myRemoteObjectManager;
407  }
408 
412  virtual void setNumCallbackThreads(unsigned);
413 
415  virtual void setNumRemoteCallbackThreads(unsigned);
416 
417  virtual void addDefaultNetworkInterface(const DtEntityType&, const DtString& local, const DtString& remote);
418  virtual void removeDefaultNetworkInterface(const DtEntityType&);
419 
421  virtual DtString defaultInterfaceTypeFor(const DtStateData*) const;
422 
425  virtual void setUseNetworkThread(bool);
426  virtual bool usingNetworkThread() const;
427 
429  virtual void setDisableParallelPublisherTick(bool);
430  virtual bool disableParallelPublisherTick() const;
431 
434  virtual void setTickPublishersDuringEntityTick(bool);
435  virtual bool tickPublishersDuringEntityTick() const;
436 
439  virtual void reserve(unsigned numToReserve);
440 
442  virtual bool willRediscoverObjects() const;
443 
444 
446  virtual void setReflectedLists(const DtReflectedObjectLists&);
447 
449  virtual double networkFrameTime() const
450  {
451  return myNetworkFrameTime;
452  }
453 
454  virtual void setSendMessagesInNetworkProcess(bool);
456  {
457  return mySendMessagesInNetworkProcess;
458  }
459 
460 #if DtHLA_1516_EVOLVED
461  virtual void setAutoReserve(int);
463  int autoReserve() const;
464 
465  virtual bool isNameReserved(const DtString& name) const;
466  virtual bool isNameReservationPending(const DtString& name) const;
467 #endif
468 
472  virtual DtString nextGlobalObjectId(const DtString& defaultId = DtString::nullString());
473 
476 
477  virtual void setLimitSizeToMtu(bool limitToMtu);
478  virtual bool limitSizeToMtu() const;
480 
482  virtual unsigned maxInteractionSize() const;
483 
484  protected:
485  virtual void slot_convertedToLocal(DtStateData*);
486 
487  virtual void sendQueuedMessages();
488 
490  virtual bool init(DtCommunicationManager*);
491 
493  virtual DtRemoteObjectManager* createRemoteObjectManager();
494 
496  virtual void reserveGlobalObjectIds(unsigned numToReserve);
497 
498  virtual bool isPublishableComponent(DtStateComponent* sc) const;
499 
501  virtual void stateComponentAdded(DtStateComponent*);
502 
504  virtual void stateComponentRemoved(const DtStateComponent*);
505 
507  virtual bool validateScenario(const DtScenario& s, DtString& error) const;
508 
510  virtual bool hasSimulationTime() const { return true; };
511 
514  virtual bool needsUnpublishedDatabase() const
515  {
516  return false;
517  }
518 
519  protected:
520  virtual void advanceFrame(DtVrfCallbackQueue*);
521 
524  virtual bool stateDataAdded(DtStateData*);
525 
527  virtual void slot_prepareForHandoff(DtStateData*, bool becomingLocal);
528 
530  virtual void stateDataAboutToBeRemoved(const DtStateData*);
531 
532  virtual void printReflectedObjectCounts() const;
533 
536  virtual void requestUpdatesForRemoteNonVrfObjects() const;
537 
539  void createExerciseClock(int clockMode = 0);
540 
541  virtual void drainInput();
542 
543  virtual void createNetInterfaceFor(DtStateComponent*);
544 
545  virtual void cleanupNetworkThread();
546 
547  virtual void runNetwork();
548  virtual void resolvePendingIds();
549  virtual const DtVrfObjectParameters* lookupParameterEntry(const DtObjectType& ot) const;
550 
551  virtual void createAndInitRemoteObjectManager();
552 
554  virtual bool rediscoverObjects();
555 
557  virtual bool publishingOnLegionNetwork() const { return false; };
558 
559  virtual void stateDataManagerDeleted();
560 
561 #if DtHLA_1516_EVOLVED
562  virtual void reservedNamesSuceeded(const std::set<std::wstring>& theNames);
564 
566  virtual void reservedNamesFailed(const std::set<std::wstring>& theNames);
567 
568  static void nameSetReservationSucceededCb(const std::set<std::wstring>& nameSet,
569  void* userData);
570  static void nameSetReservationFailedCb(const std::set<std::wstring>& nameSet,
571  void* userData);
572 #endif
573 
574 #if DtHLA
575  virtual void setExecutionState(DtVRLExecutionStatus status);
576 #endif
577 
578  protected:
579  DtExerciseConn* myExerciseConnection;
581  bool myEnabled;
585 
586  typedef std::map<SimStateID, DtSimObjectNetInterface*> Publishing;
588 
589  typedef std::map<DtStateComponent*, DtSimObjectNetInterface*> StateComponentsPublishing;
590  typedef std::map<SimStateID, StateComponentsPublishing> ComponentsPublishing;
592 
593  mutable tbb::queuing_rw_mutex myPublishingMutex;
594  mutable tbb::spin_rw_mutex myStateDataMutex;
595 
596  typedef std::map<DtGlobalObjectDesignator, DtSimObjectNetInterface*> GlobalIdForNetworkInterface;
598 
600 
601  #if DtHLA
602  typedef std::map<DtString, DtStateData*> StateDataByGlobalId;
604  std::set<DtStateData*> myPendingGlobalIds;
605  #endif
606 
607  typedef std::map<DtString, DtStateData*> StateDataByEntityId;
609  std::set<DtStateData*> myPendingEntityIds;
610 
611  typedef std::map<DtGeoReferenceVariant, DtStateData*> StateDataByGeoreferenceVariant;
613 
615  {
618  std::shared_ptr<ComponentRuleUserData> userData;
619  };
620 
621  typedef std::vector<ComponentCreationRule> ComponentCreationRules;
623 
625 
629 
635 
636  tbb::spin_mutex myEventIdMutex;
641 
642  #if DtHLA
646 
647  #if DtHLA_1516_EVOLVED
648  std::set<DtGlobalObjectDesignator> myReservedGlobalIds;
649  std::set<DtGlobalObjectDesignator> myPendingReservedGlobalIds;
650  tbb::queuing_mutex myGlobalIdReserveMutex;
651  int myAutoReserve;
652  #endif
653  #else
654  DtExerciseClock* myExerciseClock;
655  int myMaxDrainInputReads;
656  #endif
657 
664  std::set<DtStateComponent*> myCreateNetInterfaceFor;
666 
668 
669  typedef tbb::interface5::condition_variable Condition;
670  typedef tbb::mutex ConditionMutex;
671  typedef tbb::interface5::unique_lock<ConditionMutex> ConditionLock;
672 
674  std::auto_ptr<tbb::tbb_thread> myNetworkThread;
677  std::atomic<bool> myShutdownNetworkThreadFlag;
680 
685 
686 #if DtHLA
689  {
690  bool runNetworkInThread = false;
691  bool publishWhileTicking = false;
692  bool timeManagementDataSet = false;
693  int networkCallbackThreads = -1;
694  };
695 
697 #endif
701  std::atomic<bool> myStartNetworkThread;
702 
703 #if DtDIS
705  bool myDisableTimeoutProcessing = false;
706 #endif
707 
710 
712 
713  std::vector<DtSimObjectNetInterface*> myInterfacesToDelete;
715 
718  std::vector<makVrfEvents::DtEvent*> myQueuedMessagesToSend;
720 
724 
727 
729 
730 #if DtHLA
731  bool myEnteredTimeManagedMode = false;
732 #endif
733  };
734 }
UUID is a unique ID wrapper class.
Definition: uuid.h:59
Instances of DtVrfObjectParameters are the readable/writeable objects that contain the information ne...
Definition: vrfObjectParameters.h:63
unsigned long long SimStateID
Definition: stateDataTypes.h:16
Instances of DtVrfParameterDb are the database of DtVrfObjectParameters objects used in the construct...
Definition: vrfParameterDb.h:40
DtString local
Definition: vrlinkNetworkInterface.h:66
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:67
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
This class will, in DIS or HLA, generate the unique id necessary to pass into the object publisher to...
Definition: vrfObjectIdGenerator.h:22
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:42
Definition: coordSystem.h:54
The overall structure of the DtStateData mechanism is: The DtStateData contains a list of double buff...
Definition: stateData.h:339
Definition: event.h:13
DtVrlinkNetworkInterface *(* DtVrlinkNetworkInterfaceCreatorFcn)(DtExerciseConn *, bool)
Definition: vrlinkNetworkInterface.h:53
The DtCommunicationManager class is a convenience class that will create both the DtNetworkInterfaceM...
Definition: communicationManager.h:51
Class Description: DtSimObjectNetInterface.
Definition: simObjectNetInterface.h:50
Definition: asyncJobServer.h:39
Definition: stateComponent.h:51
voidpf stream
Definition: ioapi.h:39
DtRemoteObjectManager *(* DtRemoteObjectManagerCreatorFcn)(DtVrlinkNetworkInterface *)
Definition: vrlinkNetworkInterface.h:54
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
Definition: reflectedObjectLists.h:148
Contains the DtStateComponent class declaration.
Definition: vrlinkNetworkInterface.h:63
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:73

Document ID: Generated on Wed Mar 27 22:49:11 EDT 2024 from SVN revision 264633
Copyright © 2005-2024 MAK Technologies. All Rights Reserved (www.mak.com)