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

Tekkotsu v4.0
Generated Thu Nov 22 00:54:55 2007 by Doxygen 1.5.4