00001 00030 #ifndef _WURDE_COMMS_MANAGER_H 00031 #define _WURDE_COMMS_MANAGER_H 00032 00033 #include <CommsHelper.H> 00034 #include <Capability.H> 00035 #include <WURDEConfiguration.H> 00036 #include <Heartbeat.H> 00037 #include <McpRequest.H> 00038 #include <Trigger.H> 00039 #include <vector> 00040 #include <string> 00041 #include <unistd.h> 00042 #include <map> 00043 00044 00045 00046 //it pains me to define this number, but every solution is ugly. 00047 #define MAX_INTERFACES 128 00048 00049 namespace WURDE { 00050 00051 /* a few forward declarations are necessary here */ 00052 class Capability; 00053 class CommsHelper; 00054 class Heartbeat; 00055 class McpRequest; 00056 00066 class CommsManager { 00067 00068 public: 00073 CommsManager(std::string name); 00074 00080 CommsManager(std::string name,Protocols defaultProt); 00081 ~CommsManager(){}; 00082 00086 void setName(std::string name); 00087 00091 void initialize(); 00092 00098 RunState runUpdate(); 00099 00104 void registerObject(Capability *someObject); 00105 00112 void deregister(Capability *someObject); 00113 00117 void registerSupplier(Capability *someObject); 00118 00122 void registerConsumer(Capability *someObject); 00123 00128 void cleanUp(); 00129 00134 RunState getState(){ return m_currState;}; 00135 void setIdle(); 00136 void setQuit(); 00137 void setReset(); 00138 void setRun(); 00139 void setRestart(); 00140 00141 void setInfoState(); 00142 00146 void setGlobalConfigFile(std::string val){m_globalConfigFile=val;} 00147 00151 std::string getName(){return m_name;}; 00152 00156 std::string getRealName(){ return m_realName;} 00157 00158 void setRealName(std::string name){ m_realName=name;} 00159 00160 void setHelpString(std::string helpstring){m_helpstring=helpstring;} 00164 void setNoSleep(){m_doSleep=false;}; 00165 00169 void setSleep(double seconds); 00170 00174 void setMinSleep(double seconds); 00175 00179 void setSleepOnly(double seconds); 00180 00185 void setHeartbeatOnly(double seconds); 00186 00190 void setNoHeartbeat(){m_doHeartbeat=false;}; 00191 00195 void setPreSleep(){preSleep=true;}; 00196 00200 void setPostSleep(){preSleep=false;}; 00201 00207 void setTriggerMode(bool val){onlyTrigger=val;}; 00208 00213 bool checkTriggers(Capability *someobject); 00214 00218 bool activeTrigger(); 00219 00223 void addTrigger(Trigger someTrigger){triggerList.push_back(someTrigger);}; 00224 00228 void resetTriggers(); 00229 00233 void setMcpRequestMode(bool val){m_doMcpRequests=val;}; 00234 00239 void setIdleDataProcessing(bool val){m_doIdleProcessing=val;}; 00240 00246 void parseOptions(int argc, char *argv[]); 00247 00256 void parseOptions(int argc, char *argv[],char *optstring); 00257 //multimap<char, string> parseOptions(int argc, char *argv[],char *optstring); 00258 00264 void sendInfo(); 00265 00266 // needed when we fork MCP-- commshelpers must close any handles which might cause problems 00267 void closeConnections(){myCommsHelper->closeConnections();} 00268 00269 protected: 00270 void handleMCPReply(McpRequestInfoStruct someinfo); 00271 00272 private: 00273 00274 void sleep(); 00275 void updateObjects(); 00276 void handleMCP(); 00277 00278 // Name as bound to WURDE. ie, TomRFlexServer 00279 string m_name; 00280 // General name of the module. ie, RFlexServer 00281 string m_realName; 00282 // usage string to be displayed after WURDE usage information when invoked with -h 00283 string m_helpstring; 00284 bool initialized; 00285 00286 // the various commshelpers 00287 CommsHelper *myCommsHelper; 00288 00289 RunState state; 00290 00291 McpRequest m_mcpRequest; 00292 Heartbeat m_heartbeat; 00293 Protocols defaultProtocol; 00294 //vector<CapabilityContainer> objectList; 00295 vector<Capability*> objectList; 00296 vector<Trigger> triggerList; 00297 00304 // std::map<std::string,int> m_counters; 00305 // unsigned int m_counters[MAX_INTERFACES*2]; 00306 00311 // std::map<std:string,int> m_supplyCounters; 00312 // unsigned int m_supplyCounters[MAX_INTERFACES*2]; 00313 00314 struct timespec sleepInterval; 00315 bool m_doSleep; 00316 bool m_doHeartbeat; 00317 bool m_doMcpRequests; 00318 bool m_doIdleProcessing; 00319 bool m_laxRequests; 00320 bool m_nameServiceOverride; 00321 bool preSleep; 00322 bool onlyTrigger; 00323 00324 std::string m_globalConfigFile; 00325 RunState m_currState; 00326 Time endsleep; 00327 Time minSleep; 00328 }; 00329 00330 extern CommsManager *g_globalCommsManager_ptr; 00331 00332 bool registerSupplier(Capability *someObject); 00333 bool registerConsumer(Capability *someObject); 00334 } 00335 00339 typedef WURDE::CommsHelper *commshelperloader_ptr(std::string name); 00340 00344 extern std::map<std::string, commshelperloader_ptr *, std::less<std::string> > commsHelperFactory; 00345 00346 00347 #endif