00001 #include "Robots/SeaBeeIII/LoggerModule.H" 00002 00003 #include "Component/ModelParam.H" 00004 #include "Component/ModelOptionDef.H" 00005 00006 #ifndef LOGGERMODULE_C 00007 #define LOGGERMODULE_C 00008 00009 const ModelOptionCateg MOC_SeaBeeIIILogger = { 00010 MOC_SORTPRI_3, "SeaBeeIII Logger Related Options" }; 00011 00012 const ModelOptionDef OPT_LogPath = 00013 { MODOPT_ARG(string), "LogPath", &MOC_SeaBeeIIILogger, OPTEXP_CORE, 00014 "Path where the logger should write fwd/dwn retina images and sensor readings", 00015 "log-path", '\0', "<string>", "/home/uscr/log/test" }; 00016 00017 // ###################################################################### 00018 LoggerModule::LoggerModule(int id, OptionManager& mgr, 00019 const std::string& descrName, const std::string& tagName) : 00020 RobotBrainComponent(mgr, descrName, tagName), 00021 itsLogPath(&OPT_LogPath, this, 0), 00022 itsFwdFrameCount(0), 00023 itsLastFwdFrameCount(0), 00024 itsDwnFrameCount(0), 00025 itsLastDwnFrameCount(0), 00026 itsImgWriter(), 00027 itsLogOpen(false) 00028 { 00029 } 00030 // ###################################################################### 00031 LoggerModule::~LoggerModule() 00032 { 00033 itsLogFile.close(); 00034 } 00035 00036 void LoggerModule::registerTopics() 00037 { 00038 registerSubscription("BeeStemMessageTopic"); 00039 registerSubscription("RetinaMessageTopic"); 00040 } 00041 00042 void LoggerModule::evolve() 00043 { 00044 itsDataMutex.lock(); 00045 00046 if(!itsLogOpen) 00047 { 00048 itsLogOpen = true; 00049 00050 char* lstr = new char[100]; 00051 sprintf(lstr,"%s/log.txt",itsLogPath.getVal().c_str()); 00052 itsLogFile.open(lstr, std::ios::out); 00053 } 00054 00055 char* str = new char[100]; 00056 sprintf(str,"%s/fwd_img/FwdImg_%06d.pnm",itsLogPath.getVal().c_str(),itsFwdFrameCount); 00057 00058 if(itsLastFwdFrameCount != itsFwdFrameCount) 00059 { 00060 itsLastFwdFrameCount = itsFwdFrameCount; 00061 itsImgWriter.writeRGB(itsCurrentFwdImg,str); 00062 } 00063 00064 str = new char[100]; 00065 sprintf(str,"%s/dwn_img/DwnImg_%06d.pnm",itsLogPath.getVal().c_str(),itsDwnFrameCount); 00066 00067 if(itsLastDwnFrameCount != itsDwnFrameCount) 00068 { 00069 itsLastDwnFrameCount = itsDwnFrameCount; 00070 itsImgWriter.writeRGB(itsCurrentDwnImg,str); 00071 } 00072 00073 delete[] str; 00074 00075 itsLogFile<<itsFwdFrameCount<<" "<<itsCurrentHeading<<" " 00076 <<itsCurrentIntPressure<<" "<<itsCurrentExtPressure<<std::endl; 00077 itsDataMutex.unlock(); 00078 00079 usleep(40); 00080 } 00081 00082 // ###################################################################### 00083 void LoggerModule::updateMessage(const RobotSimEvents::EventMessagePtr& eMsg, 00084 const Ice::Current&) 00085 { 00086 if(eMsg->ice_isA("::RobotSimEvents::BeeStemMessage")) 00087 { 00088 00089 RobotSimEvents::BeeStemMessagePtr msg = RobotSimEvents::BeeStemMessagePtr::dynamicCast(eMsg); 00090 itsDataMutex.lock(); 00091 00092 itsCurrentHeading = msg->compassHeading; 00093 itsCurrentExtPressure= msg->externalPressure; 00094 itsCurrentIntPressure = msg->internalPressure; 00095 00096 itsDataMutex.unlock(); 00097 } 00098 else if(eMsg->ice_isA("::RobotSimEvents::RetinaMessage")) 00099 { 00100 RobotSimEvents::RetinaMessagePtr msg = RobotSimEvents::RetinaMessagePtr::dynamicCast(eMsg); 00101 itsDataMutex.lock(); 00102 00103 if(msg->cameraID == "FwdCamera") 00104 { 00105 itsCurrentFwdImg = Ice2Image<PixRGB<byte> >(msg->img); 00106 itsFwdFrameCount++; 00107 } 00108 else 00109 { 00110 itsCurrentDwnImg = Ice2Image<PixRGB<byte> >(msg->img); 00111 itsDwnFrameCount++; 00112 } 00113 00114 itsDataMutex.unlock(); 00115 00116 } 00117 } 00118 00119 #endif