Tekkotsu Homepage
Demos
Overview
Downloads
Dev. Resources
Reference
Credits

RemoteRouter.cc

Go to the documentation of this file.
00001 #include "Events/RemoteRouter.h"
00002 #include "Events/EventRouter.h"
00003 
00004 #include "Events/TextMsgEvent.h"
00005 #include "Events/TimerEvent.h"
00006 #include "Events/FilterBankEvent.h"
00007 #include "Events/LocomotionEvent.h"
00008 #include "Events/LookoutEvents.h"
00009 #include "Events/PitchEvent.h"
00010 #include "Events/VisionObjectEvent.h"
00011 #include "Shared/string_util.h"
00012 
00013 using namespace std;
00014 
00015 RemoteRouter::RemoteRouter(int host) : RemoteEvents(),
00016                      rstate(NULL), waitingForPort(true),
00017                      requestQueue(),
00018                      timerActive(false), waitTime(0),
00019                      remoteHost(0) {
00020   rstate = new RemoteState(this);
00021   
00022   remoteHost = host;
00023   
00024   connect(EventRouter::defaultPort);
00025   erouter->addTimer(this, 1, 500, true);
00026 }
00027 
00028 RemoteRouter::~RemoteRouter() {
00029   delete rstate;
00030   
00031   wireless->close(sck);
00032 }
00033 
00034 void RemoteRouter::forwardEvent(std::vector<char> &evec) {
00035   //Decode the event from the buffer and send it
00036 
00037   unsigned int size = evec.size();
00038   char *buf = &evec[0];
00039   EventBase etest, *event = NULL;
00040   
00041   if (!etest.checkInc((int)etest.loadBinaryBuffer(buf, size), buf, size)) {
00042     cout << "Error: Received event is not a subclass of EventBase" << endl;
00043     return;
00044   }
00045 
00046   
00047   //If there are bytes left, it's not just an EventBase
00048   if (size) {
00049 
00050     if (etest.checkCreator("EventBase::TextMsgEvent",
00051                  buf, size, false)) {
00052       event = new TextMsgEvent();
00053     } else if (etest.checkCreator("EventBase::TimerEvent",
00054                     buf, size, false)) {
00055       event = new TimerEvent();
00056     } else if (etest.checkCreator("EventBase::LocomotionEvent",
00057                     buf, size, false)) {
00058       event = new LocomotionEvent();
00059     } else if (etest.checkCreator("EventBase::VisionObjectEvent",
00060                     buf, size, false)) {
00061       event = new VisionObjectEvent();
00062     } else {
00063       cout << "Buffer isn't a recognized event type. " << endl;
00064     }
00065     
00066   } else {
00067     event = new EventBase();
00068   }
00069 
00070   //Load the buffer
00071   if (event) {
00072     if (!event->loadBinaryBuffer(&evec[0], evec.size())) {
00073       cout << "Error loading from buffer" << endl;
00074     } else {
00075       // cout << "Created event object successfully. Posting event from host "
00076       //   << string_util::intToStringIP(remoteHost) << endl;
00077       event->setHostID(remoteHost);
00078       erouter->postEvent(*event);
00079       delete event;
00080     }
00081   }
00082 }
00083 
00084 void RemoteRouter::connect(int port) {
00085   std::string ip = string_util::intToStringIP(remoteHost);
00086   cout << "RemoteRouter: Connecting to " << ip << " on port "
00087      << port << endl;
00088   sck = wireless->socket(Socket::SOCK_STREAM);
00089   wireless->setReceiver(sck, this);
00090   if (wireless->connect(sck, ip.c_str(), port)) {
00091     cout << "RemoteRouter: error connecting to remote host" << endl;
00092   }
00093 }
00094 
00095 int RemoteRouter::processData(char *data, int bytes) {
00096   if (waitingForPort) {
00097     if (bytes != sizeof(int)) {
00098       cout << "RemoteRouter: unexpected data" << endl;
00099       return -1;
00100     }
00101 
00102     wireless->close(sck);
00103     int port = *(int *)data;
00104     connect(port);
00105     waitingForPort = false;
00106     return 0;
00107   }
00108   
00109   while (bytes) {
00110     if (bufType == Invalid) {
00111       //Get the buffer type
00112       if (!readType(data, bytes))
00113         cout << "Error reading buffer type" << endl;
00114 
00115     } else if (!sizeLeft) {
00116       //Get the size
00117       if (!readSize(data, bytes))
00118         cout << "Error reading buffer size" << endl;
00119         
00120     } else {
00121       //Read some data
00122       if (readData(data, bytes)) {
00123         //Dispatch the chunk of data
00124         switch(bufType) {
00125         case EventData:
00126           forwardEvent(vecbuf);
00127           break;
00128         case StateData:
00129           rstate->update(&vecbuf[0]);
00130           break;
00131         case Invalid:
00132           cout << "Error: invalid data. This should never happen." << endl;
00133           return -1;
00134         default:
00135           cout << "Error: data came in that wasn't expected" << endl;
00136           return -1;
00137         }
00138         bufType = Invalid;
00139       }
00140     }
00141     
00142   }
00143 
00144   return 0;
00145 }
00146 
00147 void RemoteRouter::requestStateUpdates(RemoteState::StateType type,
00148                        unsigned int interval) {
00149   RemoteRequest info;
00150   info.type = StateUpdateRequest;
00151   info.sType = type;
00152   info.interval = interval;
00153   sendRemoteRequest(info);
00154 }
00155 
00156 void RemoteRouter::stopStateUpdates(RemoteState::StateType type) {
00157   RemoteRequest info;
00158   info.type = StopStateUpdateRequest;
00159   info.sType = type;
00160   sendRemoteRequest(info);
00161 }
00162 
00163 void RemoteRouter::addListener(EventBase::EventGeneratorID_t egid) {
00164   RemoteRequest info;
00165   info.type = EventListenerRequest;
00166   info.numElements = 1;
00167   info.egid = egid;
00168   sendRemoteRequest(info);
00169 }
00170 
00171 void RemoteRouter::addListener(EventBase::EventGeneratorID_t egid,
00172                  size_t sid) {
00173   RemoteRequest info;
00174   info.type = EventListenerRequest;
00175   info.numElements = 2;
00176   info.egid = egid;
00177   info.sid = sid;
00178   sendRemoteRequest(info);
00179 }
00180 
00181 void RemoteRouter::addListener(EventBase::EventGeneratorID_t egid,
00182                  size_t sid,
00183                  EventBase::EventTypeID_t etid) {
00184   RemoteRequest info;
00185   info.type = EventListenerRequest;
00186   info.numElements = 3;
00187   info.egid = egid;
00188   info.sid = sid;
00189   info.etid = etid;
00190   sendRemoteRequest(info);
00191 }
00192 
00193 void RemoteRouter::removeListener(EventBase::EventGeneratorID_t egid) {
00194   RemoteRequest info;
00195   info.type = RemoveEventListenerRequest;
00196   info.numElements = 1;
00197   info.egid = egid;
00198   sendRemoteRequest(info);
00199 }
00200 
00201 void RemoteRouter::removeListener(EventBase::EventGeneratorID_t egid,
00202                   size_t sid) {
00203   RemoteRequest info;
00204   info.type = RemoveEventListenerRequest;
00205   info.numElements = 2;
00206   info.egid = egid;
00207   info.sid = sid;
00208   sendRemoteRequest(info);
00209 }
00210 
00211 void RemoteRouter::removeListener(EventBase::EventGeneratorID_t egid,
00212                   size_t sid,
00213                   EventBase::EventTypeID_t etid) {
00214   RemoteRequest info;
00215   info.type = RemoveEventListenerRequest;
00216   info.numElements = 3;
00217   info.egid = egid;
00218   info.sid = sid;
00219   info.etid = etid;
00220   sendRemoteRequest(info);
00221 }
00222 
00223 void RemoteRouter::processEvent(const EventBase& event) {
00224   if (event.getGeneratorID() == EventBase::timerEGID ) {
00225     switch(event.getSourceID()) {
00226     case 0:
00227       if (isReady()) {
00228         cout << "Connected! Sending queue of requests" << endl;
00229         while (requestQueue.size()) {
00230           sendRemoteRequest(requestQueue.front());
00231           requestQueue.pop_front();
00232         }
00233         
00234         erouter->removeTimer(this, 0);
00235         timerActive = false;
00236       } else {
00237         waitTime += 500;
00238         if (waitTime == 5000) {
00239           cout << "RemoteRouter has been waiting for 5 seconds to connect, "
00240              << "are you sure you specified the right host?" << endl;
00241         }
00242       }
00243       break;
00244 
00245     case 1:
00246       if (isConnected()) {
00247         int foo = 0;
00248         sck->write((byte *)&foo, sizeof(int));
00249         erouter->removeTimer(this, 1);
00250       }
00251       break;
00252 
00253     default:
00254       cout << "RemoteRouter got unknown timer event" << endl;
00255     }
00256   }
00257 }
00258 
00259 void RemoteRouter::sendRemoteRequest(RemoteRequest &info) {
00260   if (!isReady()) {
00261     cout << "Tried to send remote request but not connected! Queuing RemoteRequest..." << endl;
00262 
00263     requestQueue.push_back(info);
00264     if (!timerActive) {
00265       erouter->addTimer(this, 0, 500, true);
00266       timerActive = true;
00267       waitTime = 0;
00268     }
00269     return;
00270   }
00271 
00272   NetworkBuffer nBuf;
00273 
00274   nBuf.addItem(RequestData);
00275   nBuf.addItem(sizeof(RemoteRequest));
00276   nBuf.addItem(info);
00277 
00278   if (!nBuf.send(sck)) {
00279     cout << "Error sending remote request" << endl;
00280     return;
00281   } 
00282 }

Tekkotsu v5.1CVS
Generated Fri Mar 16 05:26:51 2012 by Doxygen 1.6.3