![]() |
VR-Link API Documentation for DIS
|
00001 /********************************************************************* 00002 ** Copyright (c) 1992-2010 VT MAK 00003 ** All rights reserved. 00004 *********************************************************************/ 00005 00006 00007 #ifndef tObjectInterface_H_ 00008 #define tObjectInterface_H_ 00009 00010 #if DtTENA 00011 00012 #include <TENA/Time/Includes.h> 00013 #include <TENA/Middleware/SDO/ID.h> 00014 00015 #include <vlutil/vlMachineTypes.h> 00016 #include "refObjCbInfo.h" 00017 #include "tReflectedObj.h" 00018 #include "tRefObjList.h" 00019 #include <list> 00020 00025 00026 class DT_DLL_VL DtExerciseConn; 00027 class DT_DLL_VL DtStateRepository; 00028 00029 00030 00033 class DT_DLL_VL DtTenaServantObject 00034 { 00035 00036 private: 00038 DtTenaServantObject(const DtTenaServantObject& other); 00039 00041 DtTenaServantObject& operator=(const DtTenaServantObject& other); 00042 00043 public: 00045 DtTenaServantObject(){} 00046 00048 virtual ~DtTenaServantObject(){} 00049 00050 }; 00051 00056 class DT_DLL_VL DtObjectInterface 00057 { 00058 public: 00060 DtObjectInterface(DtExerciseConn *conn); 00061 00063 virtual ~DtObjectInterface(); 00064 00066 virtual DtTenaServantObject* createServantObject(DtExerciseConn* exConn) =0; 00067 00069 virtual void processServantCleanup(DtTenaServantObject* servantObject) =0; 00070 00072 virtual void subscribe() = 0; 00073 00078 virtual bool needUpdate(const DtStateRepository& rep, const DtStateRepository& asSeenBy, 00079 bool useThresholding = true) = 0; 00080 00083 virtual void decode(const DtTenaServantObject* servant, DtStateRepository* stateRep)const = 0; 00084 00091 virtual void encode(DtTenaServantObject* servant, const DtStateRepository* stateRep, 00092 TENA::Time::Pointer timeForStamping, bool forceUpdate = false) =0; 00093 00095 virtual DtReflectedObject *createReflectedObject()const =0; 00096 00098 virtual void addObjectAdditionCallback( DtReflectedObjectCallbackFunction cb, void* userData); 00099 00101 virtual void removeObjectAdditionCallback( DtReflectedObjectCallbackFunction cb, void* userData); 00102 00104 virtual void addObjectRemovalCallback( DtReflectedObjectCallbackFunction cb, void* userData); 00105 00107 virtual void removeObjectRemovalCallback( DtReflectedObjectCallbackFunction cb, void* userData); 00108 00110 virtual void setReflectedObjectCreationFunction(DtCreateReflectedObjFn fn); 00111 00113 virtual void setDiscoveryCondition(DtDiscoveryCondition fn, void* usr); 00114 00116 virtual void clearDiscoveryCondition(); 00117 00121 void setUseTenaTimeForSets(bool yesNo); 00122 00124 bool useTenaTimeForSets() const; 00125 00126 protected: 00127 00129 virtual void executeAdditionCallbacks(DtReflectedObject* refObject); 00130 00132 virtual void executeRemovalCallbacks(DtReflectedObject* refObject); 00133 00136 virtual void addPublishedObject(TENA::Middleware::SDO::ID sdoId); 00137 00139 virtual void removePublishedObject(TENA::Middleware::SDO::ID); 00140 00142 virtual bool isPublished(TENA::Middleware::SDO::ID sdoId) const; 00143 00144 bool readyToAdd(DtReflectedObject* obj); 00145 00146 00147 protected: 00148 typedef std::list<DtReflectedObjectCallbackInfo> ReflectedObjectCallbackList; 00149 00150 ReflectedObjectCallbackList myAdditionCallbackList; 00151 ReflectedObjectCallbackList myRemovalCallbackList; 00152 DtExerciseConn *myExConn; 00153 DtCreateReflectedObjFn myCreateFunction; 00154 std::set<TENA::Middleware::SDO::ID> myPublishedObjects; 00155 DtDiscoveryCondition myDiscoveryCondition; 00156 void* myDiscoveryConditionParameter; 00157 bool myUseTenaTimeForSets; 00158 }; 00159 00162 #define DtDEFINE_CALLBACKINFO(localName) \ 00163 \ 00164 class localName##CallbackInfo \ 00165 { \ 00166 public: \ 00167 localName##CallbackInfo(DtExerciseConn* exConn, localName##Interface* ptr): \ 00168 myExConn(exConn), \ 00169 myInterface(ptr) {} \ 00170 \ 00171 localName##Interface* interface() {return myInterface;}; \ 00172 DtExerciseConn* exConn() {return myExConn;} \ 00173 protected: \ 00174 DtExerciseConn* myExConn; \ 00175 localName##Interface* myInterface; \ 00176 }; \ 00177 \ 00178 typedef DCT::Utils::SmartPtr<localName##CallbackInfo> localName##CallbackInfoPtr; 00179 00183 #define DtDEFINE_DISCOVERY_CALLBACK(localName, omNamespace) \ 00184 class localName##DiscoveryCallback : \ 00185 public virtual TENA::Middleware::Callback::Callback \ 00186 { \ 00187 public: \ 00188 localName##DiscoveryCallback( \ 00189 omNamespace::ProxyPtr const &proxy, \ 00190 localName##CallbackInfoPtr const & cbInfo ): \ 00191 myCbInfo(cbInfo), \ 00192 myProxy(proxy) { } \ 00193 \ 00194 virtual ~localName##DiscoveryCallback(){} \ 00195 \ 00196 void execute() \ 00197 { \ 00198 myCbInfo->interface()->processAddition(myProxy); \ 00199 myCbInfo->exConn()->incrementNumberOfMessagesProcessed(); \ 00200 } \ 00201 \ 00202 protected: \ 00203 localName##CallbackInfoPtr myCbInfo; \ 00204 omNamespace::ProxyPtr myProxy; \ 00205 }; 00206 00210 #define DtDEFINE_DISC_CALLBACK_FACTORY(localName, omNamespace) \ 00211 class localName##DiscoveryCallbackFactory : \ 00212 public virtual omNamespace::DiscoveryCallbackFactory \ 00213 { \ 00214 public: \ 00215 localName##DiscoveryCallbackFactory(localName##CallbackInfoPtr const & pc): \ 00216 myCallbackInfoPtr( pc ) {} \ 00217 \ 00218 virtual ~localName##DiscoveryCallbackFactory() {} \ 00219 \ 00220 std::auto_ptr< TENA::Middleware::Callback::Callback > create( \ 00221 omNamespace::ProxyPtr const & proxy) \ 00222 { \ 00223 return std::auto_ptr< TENA::Middleware::Callback::Callback >( \ 00224 new localName##DiscoveryCallback( proxy, myCallbackInfoPtr ) ); \ 00225 } \ 00226 \ 00227 protected: \ 00228 localName##CallbackInfoPtr myCallbackInfoPtr; \ 00229 }; 00230 00234 #define DtDEFINE_STATE_CHANGE_CALLBACK(localName, omNamespace) \ 00235 class localName##StateChangeCallback : \ 00236 public virtual TENA::Middleware::Callback::Callback \ 00237 { \ 00238 public: \ 00239 localName##StateChangeCallback( \ 00240 omNamespace::ProxyPtr const &proxy, \ 00241 localName##CallbackInfoPtr const & cbInfo ): \ 00242 myCbInfo(cbInfo), \ 00243 myProxy(proxy) { } \ 00244 \ 00245 virtual ~localName##StateChangeCallback(){} \ 00246 \ 00247 void execute() \ 00248 { \ 00249 myCbInfo->interface()->processUpdate(myProxy); \ 00250 myCbInfo->exConn()->incrementNumberOfMessagesProcessed(); \ 00251 } \ 00252 \ 00253 protected: \ 00254 localName##CallbackInfoPtr myCbInfo; \ 00255 omNamespace::ProxyPtr myProxy; \ 00256 }; 00257 00261 #define DtDEFINE_STATE_CHANGE_CALLBACK_FACTORY(localName, omNamespace) \ 00262 class localName##StateChangeCallbackFactory : \ 00263 public virtual omNamespace::StateChangeCallbackFactory \ 00264 { \ 00265 public: \ 00266 localName##StateChangeCallbackFactory( \ 00267 localName##CallbackInfoPtr const & pc): myCallbackInfoPtr( pc) { } \ 00268 \ 00269 virtual ~localName##StateChangeCallbackFactory() {} \ 00270 \ 00271 std::auto_ptr< TENA::Middleware::Callback::Callback > create( \ 00272 omNamespace::ProxyPtr const & proxy) \ 00273 { \ 00274 return std::auto_ptr< TENA::Middleware::Callback::Callback >( \ 00275 new localName##StateChangeCallback( proxy, myCallbackInfoPtr ) ); \ 00276 } \ 00277 protected: \ 00278 localName##CallbackInfoPtr myCallbackInfoPtr; \ 00279 }; 00280 00281 00285 #define DtDEFINE_DESTRUCTION_CALLBACK(localName, omNamespace) \ 00286 class localName##DestructionCallback : \ 00287 public virtual TENA::Middleware::Callback::Callback \ 00288 { \ 00289 public: \ 00290 localName##DestructionCallback( omNamespace::ProxyPtr const &proxy, \ 00291 localName##CallbackInfoPtr const & cbInfo ): \ 00292 myCbInfo(cbInfo), \ 00293 myProxy(proxy) { } \ 00294 \ 00295 virtual ~localName##DestructionCallback(){} \ 00296 \ 00297 void execute() \ 00298 { \ 00299 myCbInfo->interface()->processRemoval(myProxy); \ 00300 myCbInfo->exConn()->incrementNumberOfMessagesProcessed(); \ 00301 } \ 00302 \ 00303 protected: \ 00304 localName##CallbackInfoPtr myCbInfo; \ 00305 omNamespace::ProxyPtr myProxy; \ 00306 }; 00307 00311 #define DtDEFINE_DESTRUCTION_CALLBACK_FACTORY(localName, omNamespace) \ 00312 class localName##DestructionCallbackFactory : \ 00313 public virtual omNamespace::DestructionCallbackFactory \ 00314 { \ 00315 public: \ 00316 localName##DestructionCallbackFactory( \ 00317 localName##CallbackInfoPtr const & pc): \ 00318 myCallbackInfoPtr( pc ) {} \ 00319 \ 00320 virtual ~localName##DestructionCallbackFactory() {} \ 00321 \ 00322 std::auto_ptr< TENA::Middleware::Callback::Callback > create( \ 00323 omNamespace::ProxyPtr const & proxy) \ 00324 { \ 00325 return std::auto_ptr< TENA::Middleware::Callback::Callback >( \ 00326 new localName##DestructionCallback( proxy, myCallbackInfoPtr ) ); \ 00327 } \ 00328 \ 00329 protected: \ 00330 localName##CallbackInfoPtr myCallbackInfoPtr; \ 00331 }; 00332 00336 #define DtDEFINE_SUB_INFO_IMPL(localName, omNamespace) \ 00337 class localName##SubscriptionInfoImpl : public omNamespace::SubscriptionInfo \ 00338 { \ 00339 public: \ 00340 localName##SubscriptionInfoImpl(): \ 00341 omNamespace::SubscriptionInfo( \ 00342 omNamespace::DiscoveryCallbackFactoryPtr( \ 00343 new omNamespace::NullDiscoveryCallbackFactory), \ 00344 omNamespace::StateChangeCallbackFactoryPtr( \ 00345 new omNamespace::NullStateChangeCallbackFactory), \ 00346 omNamespace::DestructionCallbackFactoryPtr( \ 00347 new omNamespace::NullDestructionCallbackFactory)) \ 00348 { \ 00349 } \ 00350 \ 00351 localName##SubscriptionInfoImpl(localName##CallbackInfoPtr const &cbInfo): \ 00352 omNamespace::SubscriptionInfo( \ 00353 omNamespace::DiscoveryCallbackFactoryPtr( \ 00354 new localName##DiscoveryCallbackFactory(cbInfo)), \ 00355 omNamespace::StateChangeCallbackFactoryPtr( \ 00356 new localName##StateChangeCallbackFactory(cbInfo)), \ 00357 omNamespace::DestructionCallbackFactoryPtr( \ 00358 new localName##DestructionCallbackFactory(cbInfo))) \ 00359 { \ 00360 } \ 00361 \ 00362 virtual ~localName##SubscriptionInfoImpl() {} \ 00363 }; 00364 00369 #define DtDEFINE_SUB_INFO_IMPL_WITH_INHERITANCE(localName, omNamespace, inhOmNamespace) \ 00370 class localName##SubscriptionInfoImpl : public omNamespace::SubscriptionInfo \ 00371 { \ 00372 public: \ 00373 localName##SubscriptionInfoImpl(): \ 00374 omNamespace::SubscriptionInfo( \ 00375 omNamespace::DiscoveryCallbackFactoryPtr( \ 00376 new omNamespace::NullDiscoveryCallbackFactory), \ 00377 omNamespace::StateChangeCallbackFactoryPtr( \ 00378 new omNamespace::NullStateChangeCallbackFactory), \ 00379 omNamespace::DestructionCallbackFactoryPtr( \ 00380 new omNamespace::NullDestructionCallbackFactory), \ 00381 inhOmNamespace::SubscriptionInfoPtr()) \ 00382 { \ 00383 } \ 00384 \ 00385 localName##SubscriptionInfoImpl(localName##CallbackInfoPtr const &cbInfo): \ 00386 omNamespace::SubscriptionInfo( \ 00387 omNamespace::DiscoveryCallbackFactoryPtr( \ 00388 new localName##DiscoveryCallbackFactory(cbInfo)), \ 00389 omNamespace::StateChangeCallbackFactoryPtr( \ 00390 new localName##StateChangeCallbackFactory(cbInfo)), \ 00391 omNamespace::DestructionCallbackFactoryPtr( \ 00392 new localName##DestructionCallbackFactory(cbInfo)), \ 00393 inhOmNamespace::SubscriptionInfoPtr()) \ 00394 { \ 00395 } \ 00396 virtual ~localName##SubscriptionInfoImpl() {} \ 00397 }; 00398 00399 00400 #endif 00401 #endif 00402