VR-Forces 5.0.2 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 DtStateData* stateDataForGlobalId(const DtString&) const;
103  virtual DtStateData* stateDataForEntityId(const DtString&) const;
104  virtual const DtStateData* stateDataForUUID(const DtUUID&) const;
105 
106  virtual void setExerciseStartTime(double);
107  virtual void setSimTime(double);
108  virtual void setTimeMultiplier(double);
109 
111  virtual void resetSimulation();
112 
115  virtual void setControlsDrainInput(bool);
116  bool controlsDrainInput() const;
117 
118  virtual std::string protocol() const override
119  {
120 #if DtDIS == 1
121  return std::string("DIS");
122 #elif DDtHLA_1516_EVOLVED == 1
123  return std::string("HLA1516e");
124 #elif DDtHLA_1516 == 1
125  return std::string("HLA1516");
126 #else //This is HLA13
127  return std::string("HLA13");
128 #endif
129  }
130 
131  #if DtHLA
132  virtual void setRunInTimeManagementMode(bool yesOrNo);
135  virtual bool runInTimeManagementMode() const;
136 
140  static void startTimeManagement(void* usr);
141  static void stopTimeManagement(void* usr);
142 
145  virtual void processStartTimeManagement();
146  virtual void processStopTimeManagement();
147 
149  virtual void setReflectedListRequestUpdates(bool yesOrNo);
150  #endif
151 
153  virtual void setMetocPublishingEnabled(bool);
155  {
156  return myMetocPublishingEnabled;
157  }
158 
160  virtual void setDisableRemoteDiscovery(bool);
162  {
163  return myDisableRemoteDiscovery;
164  }
165 
166 #if DtDIS
167  virtual void setDefaultObjectTimeout(int);
169  {
170  return myDefaultObjectTimeout;
171  }
172 #endif
173  struct ComponentRuleUserData
178  {
179  virtual ComponentRuleUserData* clone() const { return nullptr; };
180  };
181 
183  {
185  ComponentTypeUserData(const ComponentTypeUserData& orig) : type(orig.type) {};
186  virtual ComponentRuleUserData* clone() const { return new ComponentTypeUserData(*this); };
187 
189  };
190 
191  typedef boost::function<bool (const DtStateComponent*, const DtStateData*, std::shared_ptr<ComponentRuleUserData>)> CreationRule;
192  virtual void setComponentPublisherCreatorRule(CreationRule, const DtString& networkInterface, const ComponentRuleUserData& userData = ComponentRuleUserData(),
193  const DtString& testBeforeInterface = "");
194 
196  virtual bool createInterfaceIfComponentIs(const DtStateComponent* c, const DtStateData* d, std::shared_ptr<ComponentRuleUserData>);
197 
198  virtual DtSimObjectNetInterface* createNetInterface(DtStateData* sd);
199 
200  virtual void setRunFullyThreaded(bool);
201  virtual bool runFullyThreaded() const;
202 
203  virtual void setEnabled(bool);
204 
205  virtual void setCoordinateSystem(const Coordinate_System*);
207  {
208  return myCoordinateSystem;
209  }
210 
211  DtExerciseConn* exerciseConnection()
212  {
213  return myExerciseConnection;
214  }
215 
216  virtual void removeAndDeleteAll();
217  virtual bool wantsToSelfReflect(unsigned int) const;
218 
220  virtual bool selfReflecting() const;
221 
223  virtual void setSelfReflecting(bool) {};
224 
225  virtual void setParameterDatabase(DtVrfParameterDb*db);
227  {
228  return myParameterDatabase;
229  }
230 
231  virtual unsigned int maxNameLengthForType(const DtObjectType&) const;
232 
234  virtual void setVrfSessionId(int);
235  virtual int vrfSessionId() const
236  {
237  return myVrfSessionId;
238  }
239 
241  virtual void setVrfMessageVersionSupported(int);
242  virtual int vrfMessageVersionSupported() const
243  {
244  return myVrfMessageVersionSupported;
245  }
246 
249  virtual void setPublishZeroVelocityWhenPaused(bool);
251  {
252  return myPublishZeroVelocityWhenPaused;
253  }
254 
260  unsigned int simMgmtPduProcessLevel() const
261  {
262  return mySimMgmtPduProcessLevel;
263  }
264 
265  virtual void setSimMgmtPduProcessLevel(unsigned int level);
266 
270  virtual void setDeadReckoningAlgorithmToStaticOnPause(bool);
272  {
273  return mySetDeadReckoningAlgorithmToStaticOnPause;
274  }
275 
277  virtual void overrideDeadReckoningAlgorithm(int drAlg);
278 
281  virtual bool isDeadReckonAlgorithmOverridden(int& drAlg) const;
282 
285  virtual void removeDeadReckoningAlgorithmOverride();
286 
287  virtual DtEntityIdentifier nextEntityIdentifier(const DtStateData* = 0, const DtEntityIdentifier& = DtEntityIdentifier());
288 
289  virtual DtEntityIdentifier objectIdentifierFor(makVrf::SimStateID) const;
290  virtual DtEntityIdentifier objectIdentifierFor(const DtUUID&) const;
291 
292  #if DtDIS
293  virtual DtEntityIdentifier globalObjectIdentifierFor(const DtUUID&) const;
294  virtual DtEntityIdentifier globalObjectIdentifierFor(makVrf::SimStateID) const;
295  #else
296  virtual DtGlobalObjectDesignator globalObjectIdentifierFor(const DtUUID&) const;
297  virtual DtGlobalObjectDesignator globalObjectIdentifierFor(makVrf::SimStateID) const;
298  #endif
299 
300  virtual DtUUID uuidForObjectIdentifier(const DtEntityIdentifier&) const;
301 
302  #if DtHLA
303  virtual DtUUID uuidForObjectIdentifier(const DtGlobalObjectDesignator&) const;
304  #endif
305 
306  virtual void setSiteAppId(int, int);
307 
310  virtual DtString nextEventId(const DtString& entId = DtString::nullString()) override;
311 
312  virtual int setAppIdRangeMax(int);
313 
314  virtual DtVrfEntityIdentifierFactory* createVrfEntityIdentifierFactory();
315 
317  virtual void startScenarioLoad(bool);
318 
320  virtual void endScenarioLoad(bool);
321 
323  virtual AddEventResult addEvent(const makVrfEvents::DtEvent&, bool& selfReflect);
324  virtual AddEventResult sendEvent(const makVrfEvents::DtEvent&);
325 
326  virtual double determineSimTime(double& dt);
327 
328  virtual double simTime() const;
329 
330  virtual void setMaxDrainInputTime(double maxTime);
331  virtual double maxDrainInputTime() const;
332 
333  virtual void setFrameRateMode(const DtString& mode, double deltaTime, bool manageTime = false);
334  virtual void rewindScenario();
335 
336  #ifdef DtHLA
337  virtual void setMinDrainInputTime(double minTime);
338  virtual double minDrainInputTime() const;
339 
340  virtual void setFrameDeltaTime(double);
341  virtual double frameDeltaTime() const;
342 
343  virtual void beginBulkCreate() override;
344  virtual void endBulkCreate() override;
345  #else
346  virtual void setMaxDrainInputReads(int maxReads);
347  virtual int maxDrainInputReads() const;
348  #endif
349 
351  virtual void addEventTranslator(int eventType, DtVrlinkEventTranslator*);
352 
354  virtual void removeEventTranslator(int eventType);
355 
356  virtual DtVrlinkEventTranslator* eventTranslatorFor(int eventType) const;
357 
359  virtual void run();
360 
362  virtual void pause();
363 
364  static void setVrlinkNetworkInterfaceCreatorFcn(DtVrlinkNetworkInterfaceCreatorFcn fcn);
365  static DtVrlinkNetworkInterface* createVrlinkNetworkInterface(DtExerciseConn*, int clockMode = 0);
366 
368  virtual bool typeIsPublishable(const DtEntityType&) const { return true; };
369 
371  virtual void setEventManager(makVrfEvents::DtEventManager*);
373  {
374  return myEventManager;
375  }
376 
378  {
379  return myCommunicationManager;
380  }
381 
383  {
384  return myRemoteObjectManager;
385  }
386 
390  virtual void setNumCallbackThreads(unsigned);
391 
393  virtual void setNumRemoteCallbackThreads(unsigned);
394 
395  virtual void addDefaultNetworkInterface(const DtEntityType&, const DtString& local, const DtString& remote);
396  virtual void removeDefaultNetworkInterface(const DtEntityType&);
397 
399  virtual DtString defaultInterfaceTypeFor(const DtStateData*) const;
400 
403  virtual void setUseNetworkThread(bool);
404  virtual bool usingNetworkThread() const;
405 
407  virtual void setDisableParallelPublisherTick(bool);
408  virtual bool disableParallelPublisherTick() const;
409 
412  virtual void setTickPublishersDuringEntityTick(bool);
413  virtual bool tickPublishersDuringEntityTick() const;
414 
417  virtual void reserve(unsigned numToReserve);
418 
420  virtual bool willRediscoverObjects() const;
421 
422 
425 #if DtHLA
427 #endif
428  );
429 
431  virtual double networkFrameTime() const
432  {
433  return myNetworkFrameTime;
434  }
435 
436  virtual void setSendMessagesInNetworkProcess(bool);
438  {
439  return mySendMessagesInNetworkProcess;
440  }
441 
442 #if DtHLA_1516_EVOLVED
443  virtual void setAutoReserve(int);
445  int autoReserve() const;
446 
447  virtual bool isNameReserved(const DtString& name) const;
448  virtual bool isNameReservationPending(const DtString& name) const;
449 #endif
450 
454  virtual DtString nextGlobalObjectId(const DtString& defaultId = DtString::nullString());
455 
456  protected:
457  virtual void sendQueuedMessages();
458 
460  virtual bool init(DtCommunicationManager*);
461 
463  virtual DtRemoteObjectManager* createRemoteObjectManager();
464 
466  virtual void reserveGlobalObjectIds(unsigned numToReserve);
467 
468  virtual bool isPublishableComponent(DtStateComponent* sc) const;
469 
471  virtual void stateComponentAdded(DtStateComponent*);
472 
474  virtual void stateComponentRemoved(const DtStateComponent*);
475 
477  virtual bool validateScenario(const DtScenario& s, DtString& error) const;
478 
480  virtual bool hasSimulationTime() const { return true; };
481 
484  virtual bool needsUnpublishedDatabase() const
485  {
486  return false;
487  }
488 
489  protected:
490  virtual void advanceFrame(DtVrfCallbackQueue*);
491 
494  virtual bool stateDataAdded(DtStateData*);
495 
497  virtual void slot_prepareForHandoff(DtStateData*, bool becomingLocal);
498 
500  virtual void stateDataAboutToBeRemoved(const DtStateData*);
501 
502  virtual void printReflectedObjectCounts() const;
503 
506  virtual void requestUpdatesForRemoteNonVrfObjects() const;
507 
509  void createExerciseClock(int clockMode = 0);
510 
511  virtual void drainInput();
512 
513  virtual void createNetInterfaceFor(DtStateComponent*);
514 
515  virtual void cleanupNetworkThread();
516 
517  virtual void runNetwork();
518  virtual void resolvePendingIds();
519  virtual const DtVrfObjectParameters* lookupParameterEntry(const DtObjectType& ot) const;
520 
521  virtual void createAndInitRemoteObjectManager();
522 
524  virtual bool rediscoverObjects();
525 
527  virtual bool publishingOnLegionNetwork() const { return false; };
528 
529  virtual void stateDataManagerDeleted();
530 
531 #if DtHLA_1516_EVOLVED
532  virtual void reservedNamesSuceeded(const std::set<std::wstring>& theNames);
534 
536  virtual void reservedNamesFailed(const std::set<std::wstring>& theNames);
537 
538  static void nameSetReservationSucceededCb(const std::set<std::wstring>& nameSet,
539  void* userData);
540  static void nameSetReservationFailedCb(const std::set<std::wstring>& nameSet,
541  void* userData);
542 #endif
543 
544 #if DtHLA
545  virtual void setExecutionState(DtVRLExecutionStatus status);
546 #endif
547  typedef DtPublisherContainer<DtSimObjectNetInterface> PublisherContainer;
548 
549  protected:
550  DtExerciseConn* myExerciseConnection;
552  bool myEnabled;
556 
557  typedef std::map<makVrf::SimStateID, DtSimObjectNetInterface*> Publishing;
559 
560  typedef std::map<DtStateComponent*, DtSimObjectNetInterface*> StateComponentsPublishing;
561  typedef std::map<makVrf::SimStateID, StateComponentsPublishing> ComponentsPublishing;
563 
564  mutable tbb::queuing_rw_mutex myPublishingMutex;
565  mutable tbb::spin_rw_mutex myStateDataMutex;
566 
568 
569  #if DtHLA
570  typedef std::map<DtString, DtStateData*> StateDataByGlobalId;
572  std::set<DtStateData*> myPendingGlobalIds;
573  #endif
574 
575  typedef std::map<DtString, DtStateData*> StateDataByEntityId;
577  std::set<DtStateData*> myPendingEntityIds;
578 
580  {
583  std::shared_ptr<ComponentRuleUserData> userData;
584  };
585 
586  typedef std::vector<ComponentCreationRule> ComponentCreationRules;
588 
590 
594 
600 
601  tbb::spin_mutex myEventIdMutex;
606 
607  #if DtHLA
612 
613  #if DtHLA_1516_EVOLVED
614  std::set<DtGlobalObjectDesignator> myReservedGlobalIds;
615  std::set<DtGlobalObjectDesignator> myPendingReservedGlobalIds;
616  tbb::queuing_mutex myGlobalIdReserveMutex;
617  int myAutoReserve;
618  #endif
619  #else
620  DtExerciseClock* myExerciseClock;
621  int myMaxDrainInputReads;
622  #endif
623 
630  std::set<DtStateComponent*> myCreateNetInterfaceFor;
632 
634 
635  typedef tbb::interface5::condition_variable Condition;
636  typedef tbb::mutex ConditionMutex;
637  typedef tbb::interface5::unique_lock<ConditionMutex> ConditionLock;
638 
640  std::auto_ptr<tbb::tbb_thread> myNetworkThread;
643  std::atomic<bool> myShutdownNetworkThreadFlag;
646 
651 
652 #if DtHLA
654 #endif
658  std::atomic<bool> myStartNetworkThread;
659 
660 #if DtDIS
662 #endif
663 
669 
670 #if DtHLA
672 #endif
673 
674  std::vector<DtSimObjectNetInterface*> myInterfacesToDelete;
676 
679  std::vector<makVrfEvents::DtEvent*> myQueuedMessagesToSend;
681 
685  };
686 }
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
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:56
The DtCommunicationManager class is a convenience class that will create both the DtNetworkInterfaceM...
Definition: communicationManager.h:50
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:26
This class holds the state data that represents each simulation object in the system.
Definition: stateDataManager.h:71

Document ID: Generated on Sun Dec 4 20:22:03 EST 2022 from SVN revision 249613
Copyright © 2005-2021 MAK Technologies. All Rights Reserved (www.mak.com)