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  virtual bool unmapGeoReferenceVariantByStateData(const DtStateData* sd);
121 
122  virtual void setExerciseStartTime(double);
123  virtual void setSimTime(double);
124  virtual void setTimeMultiplier(double);
125 
127  virtual void resetSimulation();
128 
131  virtual void setControlsDrainInput(bool);
132  bool controlsDrainInput() const;
133 
134  virtual std::string protocol() const override
135  {
136 #if DtDIS == 1
137  return std::string("DIS");
138 #elif DDtHLA_1516_EVOLVED == 1
139  return std::string("HLA1516e");
140 #elif DDtHLA_1516 == 1
141  return std::string("HLA1516");
142 #else //This is HLA13
143  return std::string("HLA13");
144 #endif
145  }
146 
147  #if DtHLA
148  virtual bool runningInTimeManagedMode() const;
151 
155  static void startTimeManagement(void* usr);
156  static void stopTimeManagement(void* usr);
157 
160  virtual void processStartTimeManagement();
161  virtual void processStopTimeManagement();
162 
164  virtual void setReflectedListRequestUpdates(bool yesOrNo);
165  #endif
166 
168  virtual void setMetocPublishingEnabled(bool);
170  {
171  return true;
172  }
173 
175  virtual void setDisableRemoteDiscovery(bool);
177  {
178  return myDisableRemoteDiscovery;
179  }
180 
181 #if DtDIS
182  virtual void setDefaultObjectTimeout(int);
184  {
185  return myDefaultObjectTimeout;
186  }
187  virtual void setDisableTimeoutProcessing(bool);
189  {
190  return myDisableTimeoutProcessing;
191  }
192 #endif
193  struct ComponentRuleUserData
198  {
199  virtual ComponentRuleUserData* clone() const { return nullptr; };
200  };
201 
203  {
205  ComponentTypeUserData(const ComponentTypeUserData& orig) : type(orig.type) {};
206  virtual ComponentRuleUserData* clone() const { return new ComponentTypeUserData(*this); };
207 
209  };
210 
211  typedef boost::function<bool (const DtStateComponent*, const DtStateData*, std::shared_ptr<ComponentRuleUserData>)> CreationRule;
212  virtual void setComponentPublisherCreatorRule(CreationRule, const DtString& networkInterface, const ComponentRuleUserData& userData = ComponentRuleUserData(),
213  const DtString& testBeforeInterface = "");
214 
216  virtual bool createInterfaceIfComponentIs(const DtStateComponent* c, const DtStateData* d, std::shared_ptr<ComponentRuleUserData>);
217 
218  virtual DtSimObjectNetInterface* createNetInterface(DtStateData* sd);
219 
221  virtual void reserveEntityId(const DtEntityIdentifier&);
222 
223  virtual void setRunFullyThreaded(bool);
224  virtual bool runFullyThreaded() const;
225 
226  virtual void setEnabled(bool);
227 
228  virtual void setCoordinateSystem(const Coordinate_System*);
230  {
231  return myCoordinateSystem;
232  }
233 
234  DtExerciseConn* exerciseConnection()
235  {
236  return myExerciseConnection;
237  }
238 
239  virtual void removeAndDeleteAll();
240  virtual bool wantsToSelfReflect(unsigned int) const;
241 
243  virtual bool selfReflecting() const;
244 
246  virtual void setSelfReflecting(bool) {};
247 
248  virtual void setParameterDatabase(DtVrfParameterDb*db);
250  {
251  return myParameterDatabase;
252  }
253 
254  virtual unsigned int maxNameLengthForType(const DtObjectType&) const;
255 
257  virtual void setVrfSessionId(int);
258  virtual int vrfSessionId() const
259  {
260  return myVrfSessionId;
261  }
262 
264  virtual void setVrfMessageVersionSupported(int);
265  virtual int vrfMessageVersionSupported() const
266  {
267  return myVrfMessageVersionSupported;
268  }
269 
272  virtual void setPublishZeroVelocityWhenPaused(bool);
274  {
275  return myPublishZeroVelocityWhenPaused;
276  }
277 
283  unsigned int simMgmtPduProcessLevel() const
284  {
285  return mySimMgmtPduProcessLevel;
286  }
287 
288  virtual void setSimMgmtPduProcessLevel(unsigned int level);
289 
293  virtual void setDeadReckoningAlgorithmToStaticOnPause(bool);
295  {
296  return mySetDeadReckoningAlgorithmToStaticOnPause;
297  }
298 
300  virtual void overrideDeadReckoningAlgorithm(int drAlg);
301 
304  virtual bool isDeadReckonAlgorithmOverridden(int& drAlg) const;
305 
308  virtual void removeDeadReckoningAlgorithmOverride();
309 
310  virtual DtEntityIdentifier nextEntityIdentifier(const DtStateData* = 0, const DtEntityIdentifier& = DtEntityIdentifier());
311 
312  virtual DtEntityIdentifier objectIdentifierFor(SimStateID) const;
313  virtual DtEntityIdentifier objectIdentifierFor(const DtUUID&) const;
314 
315  #if DtDIS
316  virtual DtEntityIdentifier globalObjectIdentifierFor(const DtUUID&) const;
317  virtual DtEntityIdentifier globalObjectIdentifierFor(SimStateID) const;
318  #else
319  virtual DtGlobalObjectDesignator globalObjectIdentifierFor(const DtUUID&) const;
320  virtual DtGlobalObjectDesignator globalObjectIdentifierFor(SimStateID) const;
321  #endif
322 
323  virtual DtUUID uuidForObjectIdentifier(const DtEntityIdentifier&) const;
324 
325  #if DtHLA
326  virtual DtUUID uuidForObjectIdentifier(const DtGlobalObjectDesignator&) const;
327  #endif
328 
329  virtual void setSiteAppId(int, int);
330 
333  virtual DtString nextEventId(const DtString& entId = DtString::nullString()) override;
334 
335  virtual int setAppIdRangeMax(int);
336 
337  virtual DtVrfEntityIdentifierFactory* createVrfEntityIdentifierFactory();
338 
340  virtual void startScenarioLoad(bool);
341 
343  virtual void endScenarioLoad(bool);
344 
346  virtual AddEventResult addEvent(const makVrfEvents::DtEvent&, bool& selfReflect);
347  virtual AddEventResult sendEvent(const makVrfEvents::DtEvent&);
348 
349  virtual double determineSimTime(double& dt, DtCommunicationManagerPerformanceTimerInformation* performanceTimerInformation = nullptr) override;
350 
351  virtual double simTime() const;
352 
353  virtual void setMaxDrainInputTime(double maxTime);
354  virtual double maxDrainInputTime() const;
355 
356  virtual void setFrameRateMode(const DtString& mode, double deltaTime, bool manageTime = false);
357  virtual void rewindScenario();
358 
359  #ifdef DtHLA
360  virtual void setMinDrainInputTime(double minTime);
361  virtual double minDrainInputTime() const;
362 
363  virtual void setFrameDeltaTime(double);
364  virtual double frameDeltaTime() const;
365 
366  virtual void beginBulkCreate() override;
367  virtual void endBulkCreate() override;
368  #else
369  virtual void setMaxDrainInputReads(int maxReads);
370  virtual int maxDrainInputReads() const;
371  #endif
372 
374  virtual void addEventTranslator(int eventType, DtVrlinkEventTranslator*);
375 
377  virtual void removeEventTranslator(int eventType);
378 
379  virtual DtVrlinkEventTranslator* eventTranslatorFor(int eventType) const;
380 
382  virtual void run();
383 
385  virtual void pause();
386 
387  static void setVrlinkNetworkInterfaceCreatorFcn(DtVrlinkNetworkInterfaceCreatorFcn fcn);
388  static DtVrlinkNetworkInterface* createVrlinkNetworkInterface(DtExerciseConn*, int clockMode = 0);
389 
391  virtual bool typeIsPublishable(const DtEntityType&) const { return true; };
392 
394  virtual void setEventManager(makVrfEvents::DtEventManager*);
396  {
397  return myEventManager;
398  }
399 
401  {
402  return myCommunicationManager;
403  }
404 
406  {
407  return myRemoteObjectManager;
408  }
409 
413  virtual void setNumCallbackThreads(unsigned);
414 
416  virtual void setNumRemoteCallbackThreads(unsigned);
417 
418  virtual void addDefaultNetworkInterface(const DtEntityType&, const DtString& local, const DtString& remote);
419  virtual void removeDefaultNetworkInterface(const DtEntityType&);
420 
422  virtual DtString defaultInterfaceTypeFor(const DtStateData*) const;
423 
426  virtual void setUseNetworkThread(bool);
427  virtual bool usingNetworkThread() const;
428 
430  virtual void setDisableParallelPublisherTick(bool);
431  virtual bool disableParallelPublisherTick() const;
432 
435  virtual void setTickPublishersDuringEntityTick(bool);
436  virtual bool tickPublishersDuringEntityTick() const;
437 
440  virtual void reserve(unsigned numToReserve);
441 
443  virtual bool willRediscoverObjects() const;
444 
445 
447  virtual void setReflectedLists(const DtReflectedObjectLists&);
448 
450  virtual double networkFrameTime() const
451  {
452  return myNetworkFrameTime;
453  }
454 
455  virtual void setSendMessagesInNetworkProcess(bool);
457  {
458  return mySendMessagesInNetworkProcess;
459  }
460 
461 #if DtHLA_1516_EVOLVED
462  virtual void setAutoReserve(int);
464  int autoReserve() const;
465 
466  virtual bool isNameReserved(DtStateData*, const DtString& name) const;
467  virtual bool isNameReservationPending(DtStateData*, const DtString& name) const;
468 #endif
469 
473  virtual DtString nextGlobalObjectId(const DtString& defaultId = DtString::nullString());
474 
477 
478  virtual void setLimitSizeToMtu(bool limitToMtu);
479  virtual bool limitSizeToMtu() const;
481 
483  virtual unsigned maxInteractionSize() const;
484 
485  protected:
486  virtual void slot_convertedToLocal(DtStateData*);
487 
488  virtual void sendQueuedMessages();
489 
491  virtual bool init(DtCommunicationManager*);
492 
494  virtual DtRemoteObjectManager* createRemoteObjectManager();
495 
497  virtual void reserveGlobalObjectIds(unsigned numToReserve);
498 
499  virtual bool isPublishableComponent(DtStateComponent* sc) const;
500 
502  virtual void stateComponentAdded(DtStateComponent*);
503 
505  virtual void stateComponentRemoved(const DtStateComponent*);
506 
508  virtual bool validateScenario(const DtScenario& s, DtString& error) const;
509 
511  virtual bool hasSimulationTime() const { return true; };
512 
515  virtual bool needsUnpublishedDatabase() const
516  {
517  return false;
518  }
519 
520  protected:
521  virtual void advanceFrame(DtVrfCallbackQueue*);
522 
525  virtual bool stateDataAdded(DtStateData*);
526 
528  virtual void slot_prepareForHandoff(DtStateData*, bool becomingLocal);
529 
531  virtual void stateDataAboutToBeRemoved(const DtStateData*);
532 
533  virtual void printReflectedObjectCounts() const;
534 
537  virtual void requestUpdatesForRemoteNonVrfObjects() const;
538 
540  void createExerciseClock(int clockMode = 0);
541 
542  virtual void drainInput();
543 
544  virtual void createNetInterfaceFor(DtStateComponent*);
545 
546  virtual void cleanupNetworkThread();
547 
548  virtual void runNetwork();
549  virtual void resolvePendingIds();
550  virtual const DtVrfObjectParameters* lookupParameterEntry(const DtObjectType& ot) const;
551 
552  virtual void createAndInitRemoteObjectManager();
553 
555  virtual bool rediscoverObjects();
556 
558  virtual bool publishingOnLegionNetwork() const { return false; };
559 
560  virtual void stateDataManagerDeleted();
561 
562 #if DtHLA_1516_EVOLVED
563  virtual void reservedNamesSuceeded(const std::set<std::wstring>& theNames);
565 
567  virtual void reservedNamesFailed(const std::set<std::wstring>& theNames);
568 
569  static void nameSetReservationSucceededCb(const std::set<std::wstring>& nameSet,
570  void* userData);
571  static void nameSetReservationFailedCb(const std::set<std::wstring>& nameSet,
572  void* userData);
573 #endif
574 
575 #if DtHLA
576  virtual void setExecutionState(DtVRLExecutionStatus status);
577 #endif
578 
579  protected:
580  DtExerciseConn* myExerciseConnection;
582  bool myEnabled;
586 
587  typedef std::map<SimStateID, DtSimObjectNetInterface*> Publishing;
589 
590  typedef std::map<DtStateComponent*, DtSimObjectNetInterface*> StateComponentsPublishing;
591  typedef std::map<SimStateID, StateComponentsPublishing> ComponentsPublishing;
593 
594  mutable tbb::queuing_rw_mutex myPublishingMutex;
595  mutable tbb::spin_rw_mutex myStateDataMutex;
596 
597  typedef std::map<DtGlobalObjectDesignator, DtSimObjectNetInterface*> GlobalIdForNetworkInterface;
599 
601 
602  #if DtHLA
603  typedef std::map<DtString, DtStateData*> StateDataByGlobalId;
605  std::set<DtStateData*> myPendingGlobalIds;
606  #endif
607 
608  typedef std::map<DtString, DtStateData*> StateDataByEntityId;
610  std::set<DtStateData*> myPendingEntityIds;
611 
612  typedef std::map<DtGeoReferenceVariant, DtStateData*> StateDataByGeoreferenceVariant;
614 
616  {
619  std::shared_ptr<ComponentRuleUserData> userData;
620  };
621 
622  typedef std::vector<ComponentCreationRule> ComponentCreationRules;
624 
626 
630 
636 
637  tbb::spin_mutex myEventIdMutex;
642 
643  #if DtHLA
647 
648  #if DtHLA_1516_EVOLVED
649  std::set<DtGlobalObjectDesignator> myReservedGlobalIds;
650  std::set<DtGlobalObjectDesignator> myPendingReservedGlobalIds;
651  tbb::queuing_mutex myGlobalIdReserveMutex;
652  int myAutoReserve;
653  #endif
654  #else
655  DtExerciseClock* myExerciseClock;
656  int myMaxDrainInputReads;
657  #endif
658 
665  std::set<DtStateComponent*> myCreateNetInterfaceFor;
667 
669 
670  typedef tbb::interface5::condition_variable Condition;
671  typedef tbb::mutex ConditionMutex;
672  typedef tbb::interface5::unique_lock<ConditionMutex> ConditionLock;
673 
675  std::auto_ptr<tbb::tbb_thread> myNetworkThread;
678  std::atomic<bool> myShutdownNetworkThreadFlag;
681 
686 
687 #if DtHLA
690  {
691  bool runNetworkInThread = false;
692  bool publishWhileTicking = false;
693  bool timeManagementDataSet = false;
694  int networkCallbackThreads = -1;
695  };
696 
698 #endif
702  std::atomic<bool> myStartNetworkThread;
703 
704 #if DtDIS
706  bool myDisableTimeoutProcessing = false;
707 #endif
708 
711 
713 
714  std::vector<DtSimObjectNetInterface*> myInterfacesToDelete;
716 
719  std::vector<makVrfEvents::DtEvent*> myQueuedMessagesToSend;
721 
725 
728 
730 
731 #if DtHLA
732  bool myEnteredTimeManagedMode = false;
733 #endif
734  };
735 }
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: 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 Tue Sep 24 19:28:17 EDT 2024 from SVN revision 269799
Copyright © 2005-2024 MAK Technologies. All Rights Reserved (www.mak.com)