FilterBankGenerator.ccGo 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
00014
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
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
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
|