HawkAgent.C
00001
00002
00003
00004
00005 #ifndef HAWKAGENT_C
00006 #define HAWKAGENT_C
00007
00008 #include "Robots/BeoHawk/computer/HawkAgent.H"
00009
00010
00011 HawkAgent::HawkAgent(std::string myName, int argc, char* argv[]) {
00012
00013 helpTitle = "Generic HawkAgent";
00014 helpDescription = "A generic HawkAgent carries out tasks as a part of a network of agents that communicate through the ICE protocol.";
00015 helpOptions.push_back("\t--icestorm-ip\t(127.0.0.1) The IP of the IceStorm server.");
00016 helpOptions.push_back("\t--help\t\tLaunches this help section.");
00017
00018
00019 itsName = myName;
00020 char * iceStormIP = (char *)"127.0.0.1";
00021 helpFlag = false;
00022 killAgent = false;
00023 firstRun = true;
00024
00025
00026 for(int i = 0; i < argc && !helpFlag; i++) {
00027 if(strstr(argv[i], "--help") != NULL) {
00028 helpFlag = true;
00029 }
00030 else if(argv[i][0] == '-' && argv[i][1] == '-' && (i+1) < argc) {
00031
00032 if(strstr(argv[i], "--icestorm-ip") != NULL) iceStormIP = argv[i+1];
00033
00034
00035 std::string name = argv[i];
00036 name = name.substr(2, name.size()-2);
00037 Parameter p;
00038 p.setValue(argv[i+1]);
00039 parameterDefaults.insert(std::pair<std::string, Parameter>(name, p));
00040 }
00041 }
00042
00043 if(!helpFlag) {
00044
00045 itsIc = Ice::initialize(argc, argv);
00046
00047
00048 char buf[255];
00049 bool connected = false;
00050 int port = DEFAULT_STARTING_PORT;
00051 while (!connected) {
00052 try {
00053 sprintf(buf, "default -p %i", port);
00054 itsAdapter = itsIc->createObjectAdapterWithEndpoints(itsName, buf);
00055 connected = true;
00056 } catch (Ice::SocketException) {
00057 port++;
00058 }
00059 }
00060
00061
00062 std::cout << "using port: " << port << std::endl;
00063 std::stringstream ss;
00064 ss << port;
00065 itsName += ":" + ss.str();
00066
00067
00068 itsObjectPrx = itsAdapter->add((Ice::ObjectPtr) this, itsIc->stringToIdentity(itsName));
00069 sprintf(buf, "SimEvents/TopicManager:tcp -p 11111 -h %s -t %d", iceStormIP, DEFAULT_TIMEOUT);
00070 Ice::ObjectPrx TopicMgrObjPrx = itsIc->stringToProxy(buf);
00071 itsTopicManagerPrx = IceStorm::TopicManagerPrx::checkedCast(TopicMgrObjPrx);
00072 }
00073 }
00074
00075
00076 HawkAgent::~HawkAgent() {
00077
00078
00079
00080
00081
00082
00083
00084
00085 }
00086
00087
00088 bool HawkAgent::helpParameter() {
00089 return helpFlag;
00090 }
00091
00092
00093 void HawkAgent::help() {
00094 std::cout << std::endl << "HELP: " << helpTitle << std::endl;
00095 std::cout << helpDescription << std::endl;
00096
00097 std::cout << std::endl << "Options:" << std::endl;
00098 std::sort(helpOptions.begin(), helpOptions.end());
00099 for(int i = 0; i < (int)helpOptions.size(); i++) {
00100 std::cout << helpOptions[i] << std::endl;
00101 }
00102 std::cout << std::endl;
00103 }
00104
00105
00106 int HawkAgent::loadIntParameter(std::string name, int defaultValue) {
00107 std::map<std::string, Parameter>::iterator it;
00108
00109 it = parameterDefaults.find(name);
00110 if(it != parameterDefaults.end()) return parameterDefaults[name].getIntValue();
00111 else return defaultValue;
00112 }
00113
00114
00115 bool HawkAgent::loadBoolParameter(std::string name, bool defaultValue) {
00116 std::map<std::string, HawkAgent::Parameter>::iterator it;
00117
00118 it = parameterDefaults.find(name);
00119 if(it != parameterDefaults.end()) return parameterDefaults[name].getBoolValue();
00120 else return defaultValue;
00121 }
00122
00123
00124 double HawkAgent::loadDoubleParameter(std::string name, double defaultValue) {
00125 std::map<std::string, HawkAgent::Parameter>::iterator it;
00126
00127 it = parameterDefaults.find(name);
00128 if(it != parameterDefaults.end()) return parameterDefaults[name].getDoubleValue();
00129 else return defaultValue;
00130 }
00131
00132
00133 std::string HawkAgent::loadStringParameter(std::string name, std::string defaultValue) {
00134 std::map<std::string, Parameter>::iterator it;
00135
00136 it = parameterDefaults.find(name);
00137 if(it != parameterDefaults.end()) return parameterDefaults[name].getStringValue();
00138 else return defaultValue;
00139 }
00140
00141
00142 bool HawkAgent::parameterExists(std::string name) {
00143 std::map<std::string, Parameter>::iterator it;
00144
00145 it = parameterDefaults.find(name);
00146 if(it != parameterDefaults.end()) return true;
00147 else return false;
00148 }
00149
00150
00151 void HawkAgent::wakeUp() {
00152
00153 itsLock.post();
00154 }
00155
00156
00157 bool HawkAgent::start() {
00158 if(helpFlag) {
00159 help();
00160 return true;
00161 }
00162 else {
00163 try {
00164 if(firstRun) {
00165 itsAdapter->activate();
00166 registerTopics();
00167 }
00168
00169 while(!killAgent) {
00170 if(!firstRun) {
00171
00172 itsLock.wait();
00173 }
00174
00175 while(!killAgent && scheduler());
00176
00177 if(firstRun) firstRun = false;
00178 }
00179
00180 return true;
00181 }
00182 catch(IceUtil::NullHandleException) {
00183 std::cout << "Error: agent cannot start because an error occured during initialization" << std::endl;
00184 return false;
00185 }
00186 }
00187 }
00188
00189
00190 bool HawkAgent::stop() {
00191 if(!killAgent) {
00192 killAgent = true;
00193 return true;
00194 }
00195 else return false;
00196 }
00197
00198
00199 bool HawkAgent::registerSubscription(std::string MessageTopic) {
00200 MessageTopic += "Topic";
00201 IceStorm::TopicPrx topic;
00202 IceStorm::QoS qos;
00203
00204 try {
00205 topic = itsTopicManagerPrx->retrieve(MessageTopic.c_str());
00206
00207 topic->subscribeAndGetPublisher(qos, itsObjectPrx);
00208
00209 itsTopicSubscriptions.insert( make_pair(MessageTopic, topic) );
00210 } catch (const IceStorm::AlreadySubscribed&) {
00211 topic->unsubscribe(itsObjectPrx);
00212
00213 topic = itsTopicManagerPrx->retrieve(MessageTopic.c_str());
00214 topic->subscribeAndGetPublisher(qos, itsObjectPrx);
00215 itsTopicSubscriptions.insert( make_pair(MessageTopic, topic) );
00216 }
00217 return true;
00218 }
00219
00220
00221 bool HawkAgent::registerPublisher(std::string MessageTopic) {
00222 MessageTopic += "Topic";
00223 IceStorm::TopicPrx topic;
00224
00225 try {
00226 topic = itsTopicManagerPrx->retrieve(MessageTopic.c_str());
00227 } catch (const IceStorm::NoSuchTopic&) {
00228 topic = itsTopicManagerPrx->create(MessageTopic.c_str());
00229 }
00230
00231 Ice::ObjectPrx pub = topic->getPublisher()->ice_oneway();
00232 HawkMessages::MessageAgentPrx publisher = HawkMessages::MessageAgentPrx::uncheckedCast(pub);
00233 itsTopicPublishers.insert( make_pair(MessageTopic, publisher) );
00234
00235 return true;
00236 }
00237
00238
00239 bool HawkAgent::publish(std::string MessageTopic, HawkMessages::MessagePtr msg) {
00240 MessageTopic += "Topic";
00241 std::map<std::string, HawkMessages::MessageAgentPrx>::iterator iter = itsTopicPublishers.find(MessageTopic);
00242
00243 if (iter == itsTopicPublishers.end()) return false;
00244
00245 HawkMessages::MessageAgentPrx publisher = iter->second;
00246
00247 publisher->catchMessage(msg);
00248
00249 return true;
00250 }
00251
00252 #endif