Homepage
Demos
Overview
Downloads
Dev. Resources
Reference
Credits

EventTranslator.cc

Go 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 //#include "Shared/TimeET.h"
00080 
00081 void
00082 IPCEventTranslator::post(const char* buf, unsigned int /*size*/) {
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   //cout << TimeET() << endl;
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 /*! @file
00101  * @brief Implements EventTranslator, which receives events from EventRouters in non-Main processes and adds them into a SharedQueue for Main to pick up
00102  * @author ejt (Creator)
00103  *
00104  * $Author: ejt $
00105  * $Name: tekkotsu-2_4_1 $
00106  * $Revision: 1.15 $
00107  * $State: Exp $
00108  * $Date: 2005/07/26 03:11:23 $
00109  */
00110 

Tekkotsu v2.4.1
Generated Tue Aug 16 16:32:47 2005 by Doxygen 1.4.4