EventTranslator.ccGo to the documentation of this file.00001 #include "EventTranslator.h"
00002 #include "Events/LocomotionEvent.h"
00003 #include "Events/VisionObjectEvent.h"
00004 #include "Events/TextMsgEvent.h"
00005 #include "Events/EventRouter.h"
00006 #include "Shared/debuget.h"
00007 #include <iostream>
00008
00009 #ifdef PLATFORM_APERIOS
00010 # include <OPENR/OSubject.h>
00011 #else
00012 # include "IPC/MessageQueue.h"
00013 #endif
00014 #include "IPC/RCRegion.h"
00015
00016 using namespace std;
00017
00018 EventTranslator::eventLookup_t EventTranslator::eventLookup;
00019
00020 EventTranslator::~EventTranslator() {
00021 for(eventLookup_t::iterator it=eventLookup.begin(); it!=eventLookup.end(); ++it)
00022 delete (*it).second;
00023 eventLookup.clear();
00024 }
00025
00026 void
00027 EventTranslator::encodeEvent(const EventBase& event) {
00028 event.setSaveFormat(EventBase::BINARY);
00029 const unsigned int headerlen=sizeof(event.getClassTypeID());
00030 const unsigned int bufsize=headerlen+event.getBinSize();
00031 char * buf=bufferRequest(bufsize);
00032 if(buf==NULL) {
00033 cerr << "ERROR: EventTranslator unable to transmit event because requested buffer was NULL" << endl;
00034 return;
00035 }
00036 unsigned int header=event.getClassTypeID();
00037 memcpy(buf,&header,headerlen);
00038 unsigned int used=event.SaveBuffer(buf+headerlen,bufsize-headerlen);
00039 if(used==0) {
00040 cerr << "ERROR: EventTranslator unable to transmit event because EventBase::SaveBuffer failed (buffer==" << (void*)(buf+headerlen) << ", size==" << bufsize-headerlen << ")" << endl;
00041 post(buf,0);
00042 return;
00043 }
00044 post(buf,used);
00045 return;
00046 }
00047
00048 EventBase*
00049 EventTranslator::decodeEvent(const char * entry, unsigned int size) {
00050 const unsigned int headerlen=sizeof(unsigned int);
00051 unsigned int header=0;
00052 memcpy(&header,entry,headerlen);
00053 eventLookup_t::iterator it=eventLookup.find(header);
00054 if(it==eventLookup.end()) {
00055 cerr << "ERROR: EventTranslator unable to translate buffer because header does not match a previously registered class type id" << endl;
00056 return NULL;
00057 }
00058 EventBase* evt=static_cast<EventBase*>((*it).second->constructTemplate());
00059 evt->setSaveFormat(EventBase::BINARY);
00060 if(evt->LoadBuffer(entry+headerlen,size-headerlen)==0) {
00061 cerr << "ERROR: EventTranlator unable to translate buffer because data is malformed (EventBase::LoadBuffer failed)" << endl;
00062 return NULL;
00063 }
00064 return evt;
00065 }
00066
00067 void
00068 NoOpEventTranslator::encodeEvent(const EventBase& event) {
00069 evtRouter.postEvent(event.clone());
00070 }
00071
00072 char*
00073 IPCEventTranslator::bufferRequest(unsigned int size) {
00074 ASSERT(curRegion==NULL,"WARNING: IPCEventTranslator::bufferRequest() curRegion was not NULL");
00075 curRegion = new RCRegion(size);
00076 return curRegion->Base();
00077 }
00078
00079
00080
00081 void
00082 IPCEventTranslator::post(const char* buf, unsigned int ) {
00083 ASSERTRET(curRegion!=NULL,"ERROR: IPCEventTranslator::post(buf,size) was NULL");
00084 if(buf!=curRegion->Base()) {
00085 cerr << "ERROR: IPCEventTranslator::post(buf,size) buf does not match value given from previous bufferRequest()" << endl;
00086 return;
00087 }
00088
00089 #ifdef PLATFORM_APERIOS
00090 subject.SetData(curRegion);
00091 subject.NotifyObservers();
00092 #else
00093 subject.sendMessage(curRegion);
00094 curRegion->RemoveReference();
00095 #endif
00096 curRegion=NULL;
00097 }
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
|