Homepage
Demos
Overview
Downloads
Dev. Resources
Reference
Credits

FilterBankGenerator.cc

Go to the documentation of this file.
00001 #include "FilterBankGenerator.h"
00002 #include "Events/FilterBankEvent.h"
00003 #include "Events/EventRouter.h"
00004 #include "Wireless/Socket.h"
00005 #include "Shared/RobotInfo.h"
00006 
00007 using namespace std;
00008 
00009 unsigned int FilterBankGenerator::sysFrameNumber=-1U;
00010 
00011 unsigned char *
00012 FilterBankGenerator::getImage(unsigned int layer, unsigned int channel) {
00013   //for(int i=0;i<1000;i++)
00014   //std::cout << i << " FBG::getImage(" << layer<<'/'<<numLayers  << ',' << channel<<'/'<<numChannels << ");" << std::endl;
00015   if(!refresh())
00016     return NULL;
00017   if(!imageValids[layer][channel]) {
00018     if(images[layer][channel]==NULL)
00019       images[layer][channel]=createImageCache(layer,channel);
00020     calcImage(layer,channel);
00021   }
00022   return images[layer][channel];
00023 }
00024 
00025 void 
00026 FilterBankGenerator::freeCaches() {
00027   invalidateCaches();
00028   for(unsigned int i=0; i<numLayers; i++)
00029     for(unsigned int j=0; j<numChannels; j++) {
00030       delete [] images[i][j];
00031       images[i][j]=NULL;
00032     }
00033 }
00034 
00035 void
00036 FilterBankGenerator::invalidateCaches() {
00037   for(unsigned int i=0; i<numLayers; i++)
00038     for(unsigned int j=0; j<numChannels; j++)
00039       imageValids[i][j]=false;
00040 }
00041 
00042 void
00043 FilterBankGenerator::processEvent(const EventBase & event) {
00044   if(event.getGeneratorID()==getListenGeneratorID() && event.getSourceID()==getListenSourceID()) {
00045     const FilterBankEvent& fbkevent=dynamic_cast<const FilterBankEvent& >(event);
00046     if(fbkevent.getSource()==NULL) {
00047       serr->printf("%s %s received event with null source\n",getClassName().c_str(),getName().c_str());
00048       return;
00049     }
00050     src=fbkevent.getSource();
00051     refresh();
00052   } else {
00053     EventGeneratorBase::processEvent(event);
00054   }
00055 }
00056 
00057 unsigned int FilterBankGenerator::getBinSize() const {
00058   unsigned int used=0;
00059   used+=creatorSize("FbkImage");
00060   used+=sizeof(widths[selectedSaveLayer]);
00061   used+=sizeof(heights[selectedSaveLayer]);
00062   used+=sizeof(selectedSaveLayer);
00063   used+=sizeof(selectedSaveChannel);
00064   return used;
00065 }
00066 
00067 /*! The LoadBuffer() functions of the included subclasses aren't tested, so don't assume they'll work without a little debugging... */
00068 unsigned int FilterBankGenerator::LoadBuffer(const char buf[], unsigned int len) {
00069   unsigned int origlen=len;
00070   unsigned int used=0;
00071   if(0==(used=checkCreator("FbkImage",buf,len,true))) return 0;
00072   len-=used; buf+=used;
00073   if(0==(used=decode(widths[selectedSaveLayer],buf,len))) return 0;
00074   len-=used; buf+=used;
00075   if(0==(used=decode(heights[selectedSaveLayer],buf,len))) return 0;
00076   len-=used; buf+=used;
00077   if(0==(used=decode(selectedSaveLayer,buf,len))) return 0;
00078   len-=used; buf+=used;
00079   if(0==(used=decode(selectedSaveChannel,buf,len))) return 0;
00080   len-=used; buf+=used;
00081   return origlen-len; 
00082 }
00083 
00084 unsigned int FilterBankGenerator::SaveBuffer(char buf[], unsigned int len) const {
00085   unsigned int origlen=len;
00086   unsigned int used=0;
00087   if(0==(used=saveCreator("FbkImage",buf,len))) return 0;
00088   len-=used; buf+=used;
00089   if(0==(used=encode(widths[selectedSaveLayer],buf,len))) return 0;
00090   len-=used; buf+=used;
00091   if(0==(used=encode(heights[selectedSaveLayer],buf,len))) return 0;
00092   len-=used; buf+=used;
00093   if(0==(used=encode(selectedSaveLayer,buf,len))) return 0;
00094   len-=used; buf+=used;
00095   if(0==(used=encode(selectedSaveChannel,buf,len))) return 0;
00096   len-=used; buf+=used;
00097   return origlen-len;
00098 }
00099 
00100 void
00101 FilterBankGenerator::setNumImages(unsigned int nLayers, unsigned int nChannels) {
00102   if(nLayers==numLayers && nChannels==numChannels)
00103     return;
00104   freeCaches();
00105   destruct();
00106   numLayers=nLayers;
00107   numChannels=nChannels;
00108   
00109   widths=new unsigned int[numLayers];
00110   heights=new unsigned int[numLayers];
00111   if(numLayers>0) {
00112     for(unsigned int res=0; res<numLayers-1; res++) {
00113       widths[res] = CameraResolutionX>>(numLayers-2-res);
00114       heights[res] = CameraResolutionY>>(numLayers-2-res);
00115     }
00116     widths[numLayers-1]=CameraResolutionX*2;
00117     heights[numLayers-1]=CameraResolutionY*2;
00118   }
00119 
00120   skips=new unsigned int[numLayers];
00121   strides=new unsigned int[numLayers];
00122   increments=new unsigned int[numLayers];
00123   images=new unsigned char**[numLayers];
00124   imageValids=new bool*[numLayers];
00125   for(unsigned int i=0; i<numLayers; i++) {
00126     skips[i]=strides[i]=0;
00127     increments[i]=1;
00128     images[i]=new unsigned char*[numChannels];
00129     imageValids[i]=new bool[numChannels];
00130     for(unsigned int j=0; j<numChannels; j++) {
00131       images[i][j]=NULL;
00132       imageValids[i][j]=false;
00133     }
00134   }
00135 }
00136 
00137 void
00138 FilterBankGenerator::setDimensions() {
00139   if(src==NULL)
00140     return;
00141   for(unsigned int i=0; i<numLayers; i++) {
00142     widths[i]=src->getWidth(i);
00143     heights[i]=src->getHeight(i);
00144   }
00145 }
00146 
00147 void
00148 FilterBankGenerator::destruct() {
00149   delete [] widths;
00150   widths=NULL;
00151   delete [] heights;
00152   heights=NULL;
00153   delete [] skips;
00154   skips=NULL;
00155   delete [] strides;
00156   strides=NULL;
00157   delete [] increments;
00158   increments=NULL;
00159   for(unsigned int i=0; i<numLayers; i++) {
00160     delete [] images[i];
00161     delete [] imageValids[i];
00162   }
00163   delete [] images;
00164   images=NULL;
00165   delete [] imageValids;
00166   imageValids=NULL;
00167   numLayers=numChannels=0;
00168 }
00169 
00170 bool FilterBankGenerator::refresh() {
00171   if(sysFrameNumber==-1U) {
00172     serr->printf("ERROR: attempted access to camera image before any data was available\n");
00173     return false;
00174   }
00175   if(frameNumber==sysFrameNumber)
00176     return true;
00177   if(src==NULL) {
00178     serr->printf("ERROR: attempted access to camera image before stage had a known source\n");
00179     return false;
00180   }
00181   if(!src->refresh())
00182     return false;
00183   if(frameNumber==src->getFrameNumber())
00184     return true;
00185   frameNumber=src->getFrameNumber();
00186   setNumImages(src->getNumLayers(),src->getNumChannels());
00187   if(numLayers<=0 || numChannels<=0) {
00188     serr->printf("ERROR: attempted to access image in empty FilterBankGenerator\n");
00189     return false;
00190   }
00191   if(src->getWidth(numLayers-1)!=getWidth(numLayers-1) || src->getHeight(numLayers-1)!=getHeight(numLayers-1)) {
00192     serr->printf("WARNING: the image dimensions don't match values predicted by RobotInfo consts, now %dx%d",widths[numLayers-1],heights[numLayers-1]);
00193     setDimensions();
00194   } else if(framesProcessed==0) {
00195     setDimensions();
00196   }
00197   invalidateCaches();
00198   framesProcessed++;
00199   return true;
00200 }
00201 
00202 
00203 /*! @file
00204  * @brief Implements abstract base class for generators of FilterBankEvent's
00205  * @author ejt (Creator)
00206  *
00207  * $Author: ejt $
00208  * $Name: tekkotsu-2_4_1 $
00209  * $Revision: 1.10 $
00210  * $State: Exp $
00211  * $Date: 2005/07/06 22:49:22 $
00212  */
00213 

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