![]() |
MAK RTIspy API Documentation for HLA 1516
|
00001 /******************************************************************************* 00002 ** Copyright (c) 1998 MaK Technologies, Inc. 00003 ** All rights reserved. 00004 *******************************************************************************/ 00005 /******************************************************************************* 00006 ** $RCSfile: exec.h,v $ $Revision: 1.27 $ $State: Exp $ 00007 *******************************************************************************/ 00008 00011 00012 #ifndef VXWORKS 00013 00014 #ifndef DtRtiExec_H_ 00015 #define DtRtiExec_H_ 00016 00017 #include "rtiMsConfig.h" 00018 #include <map> 00019 #include <string> 00020 #include <list> 00021 #include <vlThreadedObject.h> 00022 #include <vlutil/vlTime.h> 00023 #include <vlutil/vlList.h> 00024 #include <vlutil/vlUtil.h> 00025 #include <vlutil/vlPrint.h> 00026 #include <vlutil/vlInetAddr.h> 00027 00028 #include <creRespMsg.h> 00029 #include <desRespMsg.h> 00030 #include <joinRespMsg.h> 00031 #include <execHandshakeMsg.h> 00032 #include <rtiUtil.h> 00033 #include <assistantConnectionInfo.h> 00034 00035 00036 class DtForwarderFaultManager; 00037 class DtLogicalTimeFactory; 00038 class DtMulitcastDiscoveryMgr; 00039 class DtCreateMsg; 00040 class DtDestroyMsg; 00041 class DtListFederationsMsg; 00042 class DtJoinMsg; 00043 class DtDisconnectMsg; 00044 class DtReconnectMsg; 00045 class DtRidTestRequestMsg; 00046 class DtFedExec; 00047 class DtRIDParameters; 00048 class DtExtendedRtiMsgForwarder; 00049 class DtQueueFullMsg; 00050 00052 typedef DtBoost::shared_ptr<DtExtendedRtiMsgForwarder> DtRtiMsgForwarderSP; 00053 00054 00057 00058 class DtRtiExec; 00059 00061 typedef DtRtiExec* (*DtRtiExecCreator)(DtRIDParameters* p, 00062 DtBoost::shared_ptr<DtFilePrinter> logPrinter, 00063 bool autoExit, const DtRtiConnectionInfoDataPair& connInfo ); 00064 00066 typedef void (*DtFedExCbFn)(DtFedExec* exec, void* usr); 00067 00069 typedef void (*DtTickCbFn)(void* usr); 00070 typedef void (*DtTickWithExecCbFn)(const DtRtiExec& exec, void* usr); 00071 00073 typedef void (*DtLogFileNameCbFn)(const DtFilename& file, void* usr); 00074 00076 typedef void (*DtWebServerCbFn)(const DtInetAddr& webSpyIpAddr, int webSpyPort, void* usr); 00077 00079 class DtFedExCallbackInfo 00080 { 00081 public: 00082 DtFedExCallbackInfo(DtFedExCbFn fn, void* data) : 00083 myData(data), myFn(fn) {} 00084 00085 void* myData; 00086 DtFedExCbFn myFn; 00087 }; 00088 00090 class DtTickCallbackInfo 00091 { 00092 public: 00093 DtTickCallbackInfo(DtTickCbFn fn, void* data, DtTime interval) : 00094 myData(data), myFn(fn), myInterval(interval), myNextExecutionTime(0) {} 00095 00096 bool operator<(const DtTickCallbackInfo& other) const 00097 { 00098 return ( myData < other.myData || 00099 myData == other.myData && myFn < other.myFn ); 00100 } 00101 00102 void* myData; 00103 DtTickCbFn myFn; 00104 DtTime myInterval; 00105 DtTime myNextExecutionTime; 00106 }; 00107 00109 class DtTickWithExecCallbackInfo 00110 { 00111 public: 00112 DtTickWithExecCallbackInfo(DtTickWithExecCbFn fn, void* data, DtTime interval) : 00113 myData(data), myFn(fn), myInterval(interval), myNextExecutionTime(0) {} 00114 00115 bool operator<(const DtTickWithExecCallbackInfo& other) const 00116 { 00117 return ( myData < other.myData || 00118 myData == other.myData && myFn < other.myFn ); 00119 } 00120 00121 void* myData; 00122 DtTickWithExecCbFn myFn; 00123 DtTime myInterval; 00124 DtTime myNextExecutionTime; 00125 }; 00126 00128 class DtLogFileNameCallbackInfo 00129 { 00130 public: 00131 DtLogFileNameCallbackInfo(DtLogFileNameCbFn fn, void* data) : 00132 myData(data), myFn(fn) {} 00133 00134 bool operator<(const DtLogFileNameCallbackInfo& other) const 00135 { 00136 return ( myData < other.myData || 00137 myData == other.myData && myFn < other.myFn ); 00138 } 00139 00140 void* myData; 00141 DtLogFileNameCbFn myFn; 00142 }; 00143 00145 class DtWebServerCallbackInfo 00146 { 00147 public: 00148 DtWebServerCallbackInfo(DtWebServerCbFn fn, void* data) : 00149 myData(data), myFn(fn) {} 00150 00151 bool operator<(const DtWebServerCallbackInfo& other) const 00152 { 00153 return ( myData < other.myData || 00154 myData == other.myData && myFn < other.myFn ); 00155 } 00156 00157 void* myData; 00158 DtWebServerCbFn myFn; 00159 }; 00160 00161 class DT_DLL_EXEC DtRtiExec 00162 { 00163 protected: 00164 00166 DtRtiExec(DtRIDParameters* p, 00167 DtBoost::shared_ptr<DtFilePrinter> logPrinter, 00168 bool autoExit, 00169 const DtRtiConnectionInfoDataPair& connInfo ); 00170 00171 public: 00172 00174 virtual ~DtRtiExec(); 00175 00176 virtual void shutdownForwarderIfCreated(); 00177 00179 virtual void checkVersion(const DtString& version) const; 00180 00182 virtual void processCreate(const DtCreateMsg& msg); 00183 00185 virtual void processDestroy(const DtDestroyMsg& msg); 00186 00188 virtual void processListFederations(const DtListFederationsMsg& msg); 00189 00191 virtual void processJoin(const DtJoinMsg& msg); 00192 00195 virtual void processDisconnect(const DtDisconnectMsg& msg); 00196 00198 virtual void processQueueFull( const DtQueueFullMsg& msg ); 00199 00202 virtual void processReconnect(const DtReconnectMsg& msg); 00203 00207 virtual DtFedExec* createFedEx( 00208 DtConnectionMgr* connMgr, const std::vector<unsigned int> & crcs, const char* fedExName, 00209 std::string const & timeImplName, MAKRti::DtFomType fedType, 00210 const std::vector<DtString>& fedFileName, const DtString& momModuleName, 00211 int fedExHandle, DtRIDParameters* params, unsigned int momModuleCrc); 00212 00215 DtConnectionMgr* connectMgr(); 00216 00218 virtual bool exists(const DtString& fedExName); 00219 00220 00225 virtual void destroyFederationByName( const DtString& fullFedexName, 00226 bool sendDestroyResponse = true, 00227 bool forceDestroy = false ); 00228 00229 00234 int processQuit(); 00235 00237 virtual void listFederates(); 00238 00240 virtual void parseDeleteCommand( const DtString& command, 00241 unsigned int& handle, 00242 DtString& federationName ) const; 00243 00244 virtual int deleteFederate( unsigned int handle, 00245 const DtString& federationName ); 00246 00248 virtual void processUpdateNotifyLevel( DtNotifyLevelType level ); 00249 00251 virtual void exit(); 00252 00254 virtual void enableLogging(); 00255 00257 virtual void enableWebSpy( const DtInetAddr& webSpyIpAddr, int webSpyPort ); 00258 00259 00262 DtFedExec* fedExec(const DtString& fedExName); 00263 const DtFedExec* fedExec(const DtString& fedExName) const; 00264 00266 const std::map<DtString, DtFedExec*>& fedExecs() const; 00267 00269 const DtRIDParameters& params() const; 00270 00272 virtual void run(); 00273 00278 virtual bool tick( bool noCallbacks = false ); 00279 00281 virtual void wait(DtTime intervalInSeconds); 00282 00285 virtual void addFedExCreatedCallback(DtFedExCbFn fn, void* usr); 00286 virtual void removeFedExCreatedCallback(DtFedExCbFn fn, void* usr); 00287 00290 virtual void addFedExDestroyedCallback(DtFedExCbFn fn, void* usr); 00291 virtual void removeFedExDestroyedCallback(DtFedExCbFn fn, void* usr); 00292 00295 virtual void addLogFileNameUpdatedCallback(DtLogFileNameCbFn fn, void* usr); 00296 virtual void removeLogFileNameUpdatedCallback(DtLogFileNameCbFn fn, void* usr); 00297 00300 virtual void addWebServerUpdatedCallback(DtWebServerCbFn fn, void* usr); 00301 virtual void removeWebServerUpdatedCallback(DtWebServerCbFn fn, void* usr); 00302 00305 virtual void addTickCallback(DtTickCbFn fn, void* usr, DtTime interval ); 00306 virtual void removeTickCallback(DtTickCbFn fn, void* usr ); 00307 00311 virtual void addTickCallback(DtTickWithExecCbFn fn, void* usr, DtTime interval ); 00312 virtual void removeTickCallback(DtTickWithExecCbFn fn, void* usr ); 00313 00315 virtual void sendCreateResponseMsg(const unsigned long destinationID, 00316 DtCreateResponseFlag flag, MAKRti::DtString const & errorString); 00317 virtual void sendDestroyResponseMsg( 00318 const char* fedExName, DtDestroyResponseFlag flag); 00319 virtual void sendReportFederationsMsg(unsigned long destId, 00320 const std::vector<DtString>& federationNames, 00321 const std::vector<DtString>& timeImplNames); 00322 virtual void sendJoinResponseMsg( 00323 unsigned long destinationIDValue,unsigned short requestID, unsigned int crc, 00324 DtFederateHandle handle, const char* fedName, int fedExHandle, const char* fedExName, 00325 const DtString& momModule, const std::vector<DtString>& fedFileName, 00326 unsigned long flags, bool allowNetworkTesting, 00327 MAKRti::DtString const & errorString, 00328 DtJoinResponseMsg::errorCodes errorValue = DtJoinResponseMsg::DT_NO_ERROR); 00329 00334 virtual void ridRequestCb( const DtRidTestRequestMsg& msg); 00335 00336 public: 00337 00339 static DtRtiExec* create(DtRIDParameters* p, 00340 DtBoost::shared_ptr<DtFilePrinter> logPrinter, 00341 bool autoExit = false, 00342 const DtRtiConnectionInfoDataPair& connInfo = DtRtiConnectionInfoDataPair() ); 00343 00347 static void setCreatorFunction(DtRtiExecCreator fn); 00348 00350 static void processRtiExecHandshakeMsg(const DtRtiExecHandshakeMsg& msg, 00351 void* usr); 00352 00354 static void processCreate(const DtCreateMsg& msg, 00355 void *usr); 00356 00358 static void processDestroy(const DtDestroyMsg& msg, 00359 void* usr); 00360 00362 static void processListFederations(const DtListFederationsMsg& msg, 00363 void* usr); 00364 00366 static void processJoin(const DtJoinMsg& msg, 00367 void* usr); 00368 00370 static void processDisconnect(const DtDisconnectMsg& msg, 00371 void* usr); 00372 00374 static void processQueueFull( const DtQueueFullMsg& msg, 00375 void* usr); 00376 00378 static void processReconnect(const DtReconnectMsg& msg, 00379 void* usr); 00380 00382 static void ridRequestCb( const DtRidTestRequestMsg& msg, void* usr ); 00383 static bool shutdownSignalCaught(); 00384 static void caughtShutdownSignal(); 00385 00386 protected: 00387 00390 void cleanupConstructorException(); 00391 00394 virtual void rtiExecToForwarderHandshake(); 00395 00397 virtual void sendRtiExecHandshakeMsg( DtHandle destId, DtRtiExecHandshakeMsg::DtHandshakeStatus status ); 00398 00400 virtual void processRtiExecHandshakeMsg( const DtRtiExecHandshakeMsg& msg ); 00401 00403 virtual void performMulticastDiscovery( bool reliableTransportDisabled ); 00404 00406 virtual void removeDroppedFederateConnections(); 00407 00408 enum DtStartRtiForwarderResult 00409 { 00410 ForwarderSuccessfullyStarted, 00411 RetryStartingForwarder, 00412 ForwarderStartupFailed 00413 }; 00416 virtual DtStartRtiForwarderResult startRtiForwarder(const DtRIDParameters* params); 00417 00418 protected: 00419 00420 typedef std::map< unsigned long, DtTime > DtConnIdToTimeMap; 00421 static bool theShutdownSignalCaught; 00422 00423 DtConnectionMgr* myConnectionMgr; 00424 std::map<DtString, DtFedExec*> myExecByName; 00425 std::map<DtFederationHandle, DtFedExec*> myExecByHandle; 00426 DtString lineOfInput; 00427 00428 bool myHandleForDeleteComplete; 00429 bool myFedNameForDeleteComplete; 00430 DtString myFederationNameForDelete; 00431 unsigned int myHandleForDelete; 00432 00433 bool myCreatedRtiForwarder; 00434 bool myPendingDelete; 00435 bool myPendingQuit; 00436 int myFreeFedExHandle; 00437 DtList myCreateCallbacks; 00438 DtList myDestroyCallbacks; 00439 00441 std::list<DtTickCallbackInfo> myTickCallbacks; 00442 00444 std::list<DtTickWithExecCallbackInfo> myTickWithExecCallbacks; 00445 00447 std::list<DtLogFileNameCallbackInfo> myLogFileNameCallbacks; 00448 00450 std::list<DtWebServerCallbackInfo> myWebServerCallbacks; 00451 00452 DtClock myClock; 00453 DtRtiExecHandshakeMsg::DtHandshakeStatus myHandshakeStatus; 00454 DtTime myNextHeartbeat; 00455 00456 DtRtiMsgForwarderSP myRtiForwarder; 00457 DtForwarderFaultManager* myFaultManager; 00458 00459 DtMulitcastDiscoveryMgr* myMcastDiscoveryMgr; 00460 00464 DtConnIdToTimeMap myDisconnectedFederates; 00465 00466 DtRIDParameters* myParams; 00467 bool myAutoExit; 00468 00470 bool myExitCommanded; 00471 00473 DtBoost::shared_ptr<DtFilePrinter> myLogPrinter; 00474 00475 DtRtiConnectionInfoDataPair myConnInfo; 00476 00477 00478 protected: 00479 00480 static DtRtiExecCreator theCreator; 00481 }; 00482 00483 inline DtConnectionMgr* DtRtiExec::connectMgr() 00484 { 00485 return myConnectionMgr; 00486 } 00487 00488 inline const DtRIDParameters& DtRtiExec::params() const 00489 { 00490 return *myParams; 00491 } 00492 00493 #endif //! DtRtiExec_H_ 00494 00495 #endif //! VXWORKS 00496