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
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
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
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
00113 if (!readType(data, bytes))
00114 cout << "Error reading buffer type" << endl;
00115
00116 } else if (!sizeLeft) {
00117
00118 if (!readSize(data, bytes))
00119 cout << "Error reading buffer size" << endl;
00120
00121 } else {
00122
00123 if (readData(data, bytes)) {
00124
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 }