VR-Exchange 2.1 API Documentation
hMacros.h
Go to the documentation of this file.
1 /*********************************************************************
2  ** Copyright (c) 2012 VT MAK
3  *********************************************************************/
4 
5 // This file defines macros that make creating translation easier
6 
7 // The first 5 functions in this macro must be defined in your CXX file. the next 3 are automatically defined by the DT_DEFINE macro
8 #define DT_DECLARE_HLA_CALLBACKS(DtHlaReflectedObjType) \
9  virtual void createHlaPublisher(MAKVrExchange::DtHlaBroker::DtBrokerObject* brokerObject); \
10  virtual bool isHlaPublishable(const MAKVrExchange::DtHlaBroker::DtBrokerObject* brokerObject) const; \
11  virtual void deleteHlaPublisher(MAKVrExchange::DtHlaBroker::DtBrokerObject* brokerObject); \
12  virtual void discoverHlaObject(DtHlaReflectedObjType *obj); \
13  virtual void receiveHlaUpdate(DtHlaReflectedObjType *obj); \
14  \
15  static void hlaObjectAddedCb(DtHlaReflectedObjType *obj, void *ud); \
16  static void hlaObjectUpdatedCb(DtHlaReflectedObjType *obj, void *ud); \
17  static void hlaObjectDeletedCb(DtHlaReflectedObjType *obj, void *ud);
18 
19 
20 #define DT_DEFINE_CREATE_HLA_PUBLISHER(DtTranslatorClass,DtPortalReflectedObjType,DtHlaPublisher) \
21  void DtTranslatorClass::createHlaPublisher(MAKVrExchange::DtHlaBroker::DtBrokerObject* brokerObject) \
22 { \
23  const DtPortalReflectedObjType* reflectedObj = \
24  static_cast<const DtPortalReflectedObjType*>( brokerObject->reflectedObjPtr() ); \
25  assert(reflectedObj); \
26  DtString objectName = reflectedObj->sr()->identifier().c_str(); \
27  \
28  DtHlaPublisher* publisher = NULL; \
29  try \
30  { \
31  publisher = new DtHlaPublisher( broker()->hlaConnection(), objectName); \
32  if(publisher->name() != objectName) \
33  { \
34  broker()->globalIdMapper()->add(objectName,publisher->name()); \
35  } \
36  } \
37  catch (RTI::Exception&) \
38  { \
39  try \
40  { \
41  DtWarn << "Illegal Object Name: " << objectName << " Trying to publish with new name."; \
42  publisher = new DtHlaPublisher( broker()->hlaConnection()); \
43  \
44  if(publisher) \
45  { \
46  broker()->globalIdMapper()->add(objectName,publisher->name()); \
47  } \
48  } \
49  catch (RTI::Exception& ex) \
50  { \
51  DtWarn << "Caught RTI Exception: "; \
52  DtWarn << ex << "\n"; \
53  } \
54  } \
55  DtCATCH_AND_WARN(DtWarn) \
56  \
57  brokerObject->setPublisherPtr( publisher ); \
58  \
59  if (publisher==NULL) \
60  { \
61  DtWarn << "Dropping: " << objectName << "\n"; \
62  brokerObject->setIsDropped( true ); \
63  } \
64 }
65 
66 #define DT_DEFINE_IS_HLA_PUBLISHABLE(DtTranslatorClass, DtPortalReflectedObjType) \
67 bool DtTranslatorClass::isHlaPublishable( const MAKVrExchange::DtHlaBroker::DtBrokerObject *brokerObject ) const \
68 { \
69  assert( brokerObject->protocol() == MAKVrExchange::DtHlaBroker::DtBrokerObject::portal ); \
70  const DtPortalReflectedObjType* reflectedObj = \
71  static_cast<const DtPortalReflectedObjType*>( brokerObject->reflectedObjPtr() ); \
72  assert(reflectedObj); \
73  return true; \
74 }
75 
76 #define DT_DEFINE_DELETE_HLA_PUBLISHER(DtTranslatorClass, DtHlaPublisher) \
77 void DtTranslatorClass::deleteHlaPublisher(MAKVrExchange::DtHlaBroker::DtBrokerObject* brokerObject) \
78 { \
79  DtHlaPublisher *publisher = \
80  static_cast<DtHlaPublisher *>( brokerObject->publisherPtr() ); \
81  \
82  if (publisher) \
83  { \
84  DtDELETE( publisher ); \
85  brokerObject->setPublisherPtr( publisher ); \
86  } \
87 }
88 
89 #define DT_DEFINE_DISCOVER_HLA_OBJECT(DtTranslatorClass, DtHlaReflectedObjType,DtProtocol) \
90 void DtTranslatorClass::discoverHlaObject(DtHlaReflectedObjType *refObj) \
91 { \
92  MAKVrExchange::DtHlaBroker::DtBrokerObject* brokerObject = findBrokerObject(refObj); \
93  if (!brokerObject) \
94  { \
95  brokerObject = createBrokerObject(refObj); \
96  } \
97  brokerObject->setLastUpdate(myBroker->simTime()); \
98  brokerObject->setObjectName(refObj->globalId()); \
99  brokerObject->setIsDiscovered(true); \
100  \
101  createPortalPublisher( brokerObject ); \
102  \
103  refObj->addPostUpdateCallback( \
104  DtTranslatorClass::hlaObjectUpdatedCb, this); \
105  receive##DtProtocol##Update(refObj); \
106 }
107 
108 #define DT_DEFINE_RECEIVE_HLA_UPDATE(DtTranslatorClass, DtHlaReflectedObjType, \
109  DtHlaStateRepository, DtPortalObjectType, DtObjectKind) \
110  void DtTranslatorClass::receiveHlaUpdate(DtHlaReflectedObjType *refObj) \
111 { \
112  MAKVrExchange::DtHlaBroker::DtBrokerObject* brokerObject = findBrokerObject(refObj); \
113  assert( brokerObject ); \
114  \
115  DtHlaStateRepository &sr = * \
116  static_cast<DtHlaStateRepository*>(refObj->sr()); \
117  \
118  brokerObject->setLastUpdate(myBroker->simTime()); \
119  if (!brokerObject->isPublishable()) \
120  { \
121  brokerObject->setIsPublishable(isPortalPublishable( brokerObject )); \
122  } \
123  \
124  callObjectUpdateCallbacks( brokerObject ); \
125  \
126  if (brokerObject->isDropped()) \
127  { \
128  return; \
129  } \
130  \
131  MAKVrExchange::DtPortalObjectPublisherTemplate<DtPortalObjectType>*publisher = \
132  static_cast<MAKVrExchange::DtPortalObjectPublisherTemplate<DtPortalObjectType>*> \
133  ( brokerObject->publisherPtr() ); \
134  \
135  DtPortalObjectType& newSr = *(publisher->sr()); \
136  newSr.setKind(DtObjectKind); \
137  \
138  translate( &newSr, sr, *refObj ); \
139  \
140  if( myBroker->brokerInitializer()->oneToOneMapping() ) \
141  { \
142  publisher->forceUpdate(); \
143  } \
144  \
145  if (myBroker->isTranslatorDebuggingOn( virtualTranslatorName() )) \
146  { \
147  printIncomingOutgoingStateReps(sr, newSr, virtualTranslatorName()); \
148  } \
149 }
150 
151 #define DT_DEFINE_HLA_CALLBACKS(DtTranslatorClass, DtHlaReflectedObjType, DtTemplates) \
152 DtTemplates \
153 void DtTranslatorClass::hlaObjectAddedCb(DtHlaReflectedObjType *reflectedObj, void *ud) \
154 { \
155  DtTranslatorClass *et = (DtTranslatorClass*)ud; \
156  et->discoverHlaObject(reflectedObj); \
157 }; \
158  \
159  DtTemplates \
160 void DtTranslatorClass::hlaObjectUpdatedCb(DtHlaReflectedObjType *reflectedObj, void *ud) \
161 { \
162  DtTranslatorClass *et = (DtTranslatorClass*)ud; \
163  et->receiveHlaUpdate(reflectedObj); \
164 }; \
165  \
166  DtTemplates \
167 void DtTranslatorClass::hlaObjectDeletedCb(DtHlaReflectedObjType *reflectedObj, void *ud) \
168 { \
169  DtTranslatorClass *et = (DtTranslatorClass*)ud; \
170  et->removeHlaObject(reflectedObj); \
171 }
172 
173 #define DT_DECLARE_INTERACTION_HLA_CALLBACKS(DtPortalInteractionType,DtInteractionType) \
174  virtual void createHlaInteraction(const DtPortalInteractionType& in); \
175  static void receiveHlaInteraction(DtInteractionType *inter, void *usr);
176 
177 
178 #define DT_DEFINE_CREATE_HLA_INTERACTION(DtTranslatorClass,DtPortalInteractionType,DtInteractionType) \
179  void DtTranslatorClass::createHlaInteraction(const DtPortalInteractionType& in) \
180  { \
181  DtInteractionType out; \
182  out.setExConn(myBroker->hlaConnection(),0); \
183 \
184  translate( &out, in ); \
185 \
186  if (myBroker->isTranslatorDebuggingOn( virtualTranslatorName() )) \
187  { \
188  printIncomingOutgoingInteractions( in, out); \
189  }\
190  myBroker->hlaConnection()->sendStamped(out); \
191  }
192 
193 
194 #define DT_DEFINE_RECEIVE_HLA_INTERACTION(DtTranslatorClass,DtInteractionType) \
195  void DtTranslatorClass::receiveHlaInteraction(DtInteractionType *inter, void *usr) \
196  { \
197  DtTranslatorClass *trans = (DtTranslatorClass*)usr; \
198  trans->createPortalInteraction(*inter); \
199  }
200 
201 
202 

Document ID: Generated on Tue Aug 7 22:07:13 EDT 2012 from SVN revision 117874
Copyright © 2005-2012 VT MÄK Inc. All Rights Reserved (www.mak.com)