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
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
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
00071 if (event) {
00072 if (!event->loadBinaryBuffer(&evec[0], evec.size())) {
00073 cout << "Error loading from buffer" << endl;
00074 } else {
00075
00076
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
00112 if (!readType(data, bytes))
00113 cout << "Error reading buffer type" << endl;
00114
00115 } else if (!sizeLeft) {
00116
00117 if (!readSize(data, bytes))
00118 cout << "Error reading buffer size" << endl;
00119
00120 } else {
00121
00122 if (readData(data, bytes)) {
00123
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 }