|
orca-robotics INTRODUCTION Overview Download and Install Quick Start Documentation Publications REPOSITORY Interfaces Components Libraries Utilities Software Map DEVELOPER Tutorials Examples Dev Guide Dashboard Wiki login/pass: orca/orca PEOPLE Contributors Users Project Download Mailing lists
|
autologgers.h00001 #ifndef ORCALOGFACTORY_AUTOLOGGERS_H 00002 #define ORCALOGFACTORY_AUTOLOGGERS_H 00003 00004 #include <orcalog/autologger.h> 00005 #include <orcalogfactory/logwriters.h> 00006 #include <orcaice/connectutils.h> 00007 #include <orcaice/icestormutils.h> 00008 #include <orcaice/timeutils.h> 00009 00010 namespace orcalogfactory { 00011 00012 // 00013 // A set of AutoLoggers: ie loggers which run continuously as soon as they're 00014 // initialised 00015 // 00016 00018 00023 template<class DataType, 00024 class ConsumerType, 00025 class ConsumerPrxType, 00026 class PrxType, 00027 class LogWriterType> 00028 class GenericAutoLogger : public ConsumerType, public orcalog::AutoLogger 00029 { 00030 public: 00031 00032 virtual ~GenericAutoLogger() {} 00033 00034 // Assumes the ConsumerType's method is called setData 00035 virtual void setData(const DataType& data, const Ice::Current&) 00036 { logWriter_->write(data,orcaice::getNow()); } 00037 00038 // Inherited from orcalog::AutoLogger 00039 virtual void init( const orcalog::LogWriterInfo &logWriterInfo, 00040 orcalog::MasterFileWriter &masterFileWriter ) 00041 { 00042 logWriter_.reset( new LogWriterType ); 00043 logWriter_->checkFormat( logWriterInfo.format ); 00044 logWriter_->init( logWriterInfo, masterFileWriter ); 00045 } 00046 00047 virtual void startLogging() 00048 { 00049 // may throw 00050 PrxType objectPrx; 00051 orcaice::connectToInterfaceWithTag<PrxType>( logWriter_->logWriterInfo().context, 00052 objectPrx, 00053 logWriter_->logWriterInfo().interfaceTag ); 00054 00055 // Allow derived classes to do something special (like get description) 00056 setup(objectPrx,*logWriter_); 00057 00058 Ice::ObjectPtr consumer = this; 00059 ConsumerPrxType callbackPrx = 00060 orcaice::createConsumerInterface<ConsumerPrxType>( logWriter_->logWriterInfo().context, 00061 consumer ); 00062 00063 objectPrx->subscribe( callbackPrx ); 00064 } 00065 00066 protected: 00067 00068 // Called during initialisation 00069 virtual void setup( PrxType &objectPrx, LogWriterType &logWriter ) {} 00070 00071 private: 00072 00073 std::auto_ptr<LogWriterType> logWriter_; 00074 }; 00075 00077 00078 typedef GenericAutoLogger<orca::CpuData, 00079 orca::CpuConsumer, 00080 orca::CpuConsumerPrx, 00081 orca::CpuPrx, 00082 CpuLogWriter> CpuAutoLogger; 00083 00085 00086 class DriveBicycleAutoLogger : public GenericAutoLogger<orca::DriveBicycleData, 00087 orca::DriveBicycleConsumer, 00088 orca::DriveBicycleConsumerPrx, 00089 orca::DriveBicyclePrx, 00090 DriveBicycleLogWriter> 00091 { 00092 private: 00093 void setup( orca::DriveBicyclePrx &objectPrx, DriveBicycleLogWriter &logWriter ) 00094 { 00095 logWriter.write( objectPrx->getDescription() ); 00096 } 00097 }; 00098 00100 00101 typedef GenericAutoLogger<orca::ImuData, 00102 orca::ImuConsumer, 00103 orca::ImuConsumerPrx, 00104 orca::ImuPrx, 00105 ImuLogWriter> ImuAutoLogger; 00106 00108 00109 class LaserScanner2dAutoLogger : public orca::RangeScanner2dConsumer, public orcalog::AutoLogger 00110 { 00111 public: 00112 virtual ~LaserScanner2dAutoLogger() {} 00113 00114 virtual void setData(const orca::RangeScanner2dDataPtr& data, const Ice::Current&) 00115 { 00116 // special case: do not copy to other loggers! 00117 // we assume that the data is really LaserScanner2dDataPtr but it has to be cast 00118 // @todo: what if it's not the right type? 00119 orca::LaserScanner2dDataPtr laserData = orca::LaserScanner2dDataPtr::dynamicCast( data ); 00120 logWriter_->write(laserData,orcaice::getNow()); 00121 } 00122 00123 virtual void init( const orcalog::LogWriterInfo &logWriterInfo, 00124 orcalog::MasterFileWriter &masterFileWriter ) 00125 { 00126 logWriter_.reset( new LaserScanner2dLogWriter ); 00127 logWriter_->checkFormat( logWriterInfo.format ); 00128 logWriter_->init( logWriterInfo, masterFileWriter ); 00129 } 00130 00131 virtual void startLogging() 00132 { 00133 orca::LaserScanner2dPrx objectPrx; 00134 orcaice::connectToInterfaceWithTag( logWriter_->logWriterInfo().context, 00135 objectPrx, 00136 logWriter_->logWriterInfo().interfaceTag ); 00137 00138 orca::RangeScanner2dDescription descr = objectPrx->getDescription(); 00139 logWriter_->write( descr ); 00140 00141 Ice::ObjectPtr consumer = this; 00142 orca::RangeScanner2dConsumerPrx callbackPrx = 00143 orcaice::createConsumerInterface<orca::RangeScanner2dConsumerPrx>( logWriter_->logWriterInfo().context, 00144 consumer ); 00145 00146 objectPrx->subscribe( callbackPrx ); 00147 } 00148 private: 00149 std::auto_ptr<LaserScanner2dLogWriter> logWriter_; 00150 }; 00151 00153 00154 class Localise2dAutoLogger : public GenericAutoLogger<orca::Localise2dData, 00155 orca::Localise2dConsumer, 00156 orca::Localise2dConsumerPrx, 00157 orca::Localise2dPrx, 00158 Localise2dLogWriter> 00159 { 00160 private: 00161 void setup( orca::Localise2dPrx &objectPrx, Localise2dLogWriter &logWriter ) 00162 { 00163 logWriter.write( objectPrx->getDescription() ); 00164 } 00165 }; 00166 00168 00169 class Localise3dAutoLogger : public GenericAutoLogger<orca::Localise3dData, 00170 orca::Localise3dConsumer, 00171 orca::Localise3dConsumerPrx, 00172 orca::Localise3dPrx, 00173 Localise3dLogWriter> 00174 { 00175 private: 00176 void setup( orca::Localise3dPrx &objectPrx, Localise3dLogWriter &logWriter ) 00177 { 00178 logWriter.write( objectPrx->getDescription() ); 00179 } 00180 }; 00181 00183 00184 class Odometry2dAutoLogger : public GenericAutoLogger<orca::Odometry2dData, 00185 orca::Odometry2dConsumer, 00186 orca::Odometry2dConsumerPrx, 00187 orca::Odometry2dPrx, 00188 Odometry2dLogWriter> 00189 { 00190 private: 00191 void setup( orca::Odometry2dPrx &objectPrx, Odometry2dLogWriter &logWriter ) 00192 { 00193 logWriter.write( objectPrx->getDescription() ); 00194 } 00195 }; 00196 00198 00199 class Odometry3dAutoLogger : public GenericAutoLogger<orca::Odometry3dData, 00200 orca::Odometry3dConsumer, 00201 orca::Odometry3dConsumerPrx, 00202 orca::Odometry3dPrx, 00203 Odometry3dLogWriter> 00204 { 00205 private: 00206 void setup( orca::Odometry3dPrx &objectPrx, Odometry3dLogWriter &logWriter ) 00207 { 00208 logWriter.write( objectPrx->getDescription() ); 00209 } 00210 }; 00211 00213 00214 typedef GenericAutoLogger<orca::PolarFeature2dData, 00215 orca::PolarFeature2dConsumer, 00216 orca::PolarFeature2dConsumerPrx, 00217 orca::PolarFeature2dPrx, 00218 PolarFeature2dLogWriter> PolarFeature2dAutoLogger; 00219 00221 00222 typedef GenericAutoLogger<orca::PowerData, 00223 orca::PowerConsumer, 00224 orca::PowerConsumerPrx, 00225 orca::PowerPrx, 00226 PowerLogWriter> PowerAutoLogger; 00227 00229 00230 typedef GenericAutoLogger<orca::WifiData, 00231 orca::WifiConsumer, 00232 orca::WifiConsumerPrx, 00233 orca::WifiPrx, 00234 WifiLogWriter> WifiAutoLogger; 00235 00237 00238 class GpsAutoLogger : public GenericAutoLogger<orca::GpsData, 00239 orca::GpsConsumer, 00240 orca::GpsConsumerPrx, 00241 orca::GpsPrx, 00242 GpsLogWriter> 00243 { 00244 private: 00245 void setup( orca::GpsPrx &objectPrx, GpsLogWriter &logWriter ) 00246 { 00247 logWriter.write( objectPrx->getDescription() ); 00248 } 00249 }; 00250 00252 00253 class ImageAutoLogger : public GenericAutoLogger<orca::ImageDataPtr, 00254 orca::ImageConsumer, 00255 orca::ImageConsumerPrx, 00256 orca::ImagePrx, 00257 ImageLogWriter> 00258 { 00259 private: 00260 void setup( orca::ImagePrx &objectPrx, ImageLogWriter &logWriter ) 00261 { 00262 logWriter.write( objectPrx->getDescription() ); 00263 } 00264 }; 00265 00267 00268 class CameraAutoLogger : public orca::ImageConsumer, public orcalog::AutoLogger 00269 { 00270 public: 00271 virtual ~CameraAutoLogger() {} 00272 00273 virtual void setData(const orca::ImageDataPtr& data, const Ice::Current&) 00274 { 00275 // we assume that the data is really CameraDataPtr but it has to be cast 00276 orca::ImageDataPtr cameraData = orca::ImageDataPtr::dynamicCast( data ); 00277 logWriter_->write(cameraData,orcaice::getNow()); 00278 } 00279 00280 virtual void init( const orcalog::LogWriterInfo &logWriterInfo, 00281 orcalog::MasterFileWriter &masterFileWriter ) 00282 { 00283 logWriter_.reset( new CameraLogWriter ); 00284 logWriter_->checkFormat( logWriterInfo.format ); 00285 logWriter_->init( logWriterInfo, masterFileWriter ); 00286 } 00287 00288 virtual void startLogging() 00289 { 00290 orca::CameraPrx objectPrx; 00291 orcaice::connectToInterfaceWithTag( logWriter_->logWriterInfo().context, 00292 objectPrx, 00293 logWriter_->logWriterInfo().interfaceTag ); 00294 00295 orca::CameraDescriptionPtr descr = orca::CameraDescriptionPtr::dynamicCast( objectPrx->getDescription());; 00296 logWriter_->write( descr ); 00297 00298 Ice::ObjectPtr consumer = this; 00299 orca::ImageConsumerPrx callbackPrx = 00300 orcaice::createConsumerInterface<orca::ImageConsumerPrx>( logWriter_->logWriterInfo().context,consumer ); 00301 00302 objectPrx->subscribe( callbackPrx ); 00303 } 00304 private: 00305 std::auto_ptr<CameraLogWriter> logWriter_; 00306 }; 00307 00308 } 00309 00310 #endif |
Webmaster: Tobias Kaupp (tobasco at users.sourceforge.net)
1.4.5