00001
00002
00003
00004
00005
00006
00007
00008 #ifndef CGenericSensor_H
00009 #define CGenericSensor_H
00010
00011 #include <mrpt/utils/CConfigFileBase.h>
00012 #include <mrpt/slam/CObservation.h>
00013 #include <mrpt/synch.h>
00014 #include <mrpt/system/os.h>
00015
00016 #include <mrpt/hwdrivers/link_pragmas.h>
00017
00018 #include <map>
00019
00020 namespace mrpt
00021 {
00024 namespace hwdrivers
00025 {
00026 class HWDLLIMPEXP CGenericSensor;
00027
00030 struct HWDLLIMPEXP TSensorClassId
00031 {
00032 const char* className;
00033 CGenericSensor* (*ptrCreateObject)();
00034 };
00035
00036 typedef stlplus::smart_ptr<CGenericSensor> CGenericSensorPtr;
00037
00058 class HWDLLIMPEXP CGenericSensor: public mrpt::utils::CUncopiable
00059 {
00060 public:
00061 virtual const mrpt::hwdrivers::TSensorClassId* GetRuntimeClass() const = 0;
00062
00063 typedef std::multimap< mrpt::system::TTimeStamp, mrpt::utils::CSerializablePtr > TListObservations;
00064 typedef std::pair< mrpt::system::TTimeStamp, mrpt::utils::CSerializablePtr > TListObsPair;
00065
00069 enum TSensorState
00070 {
00071 ssInitializing = 0,
00072 ssWorking,
00073 ssError
00074 };
00075
00077 TSensorState getState() const { return m_state; }
00078
00079
00080
00081 private:
00082 synch::CCriticalSection m_csObjList;
00083 TListObservations m_objList;
00084
00086 static std::map< std::string , const TSensorClassId *> m_knownClasses;
00087
00088 DECLARE_UNCOPIABLE( CGenericSensor )
00089
00090 protected:
00091
00092 TSensorState m_state;
00093
00102 void appendObservation( const mrpt::utils::CSerializablePtr &obj);
00103
00107 static void registerClass(const TSensorClassId* pNewClass);
00108
00109
00112 struct CLASSINIT_GENERIC_SENSOR
00113 {
00114 CLASSINIT_GENERIC_SENSOR(const TSensorClassId* pNewClass)
00115 {
00116 CGenericSensor::registerClass(pNewClass);
00117 }
00118 };
00119
00120 public:
00124 static CGenericSensor* createSensor(std::string &className);
00125
00127 CGenericSensor( );
00128
00130 virtual ~CGenericSensor();
00131
00135 virtual void loadConfig(
00136 const mrpt::utils::CConfigFileBase &configSource,
00137 const std::string §ion ) = 0;
00138
00142 virtual void initialize()
00143 { }
00144
00148 virtual void doProcess() = 0;
00149
00152 void getObservations( TListObservations &lstObjects );
00153
00154 };
00155
00156
00157 #define SENSOR_CLASS_ID(class_name) \
00158 static_cast<const mrpt::hwdrivers::TSensorClassId*>(& mrpt::hwdrivers::class_name::class##class_name)
00159
00160 #define SENSOR_IS_CLASS( ptrObj, class_name ) (ptrObj->GetRuntimeClass()==SENSOR_CLASS_ID(class_name))
00161
00162
00165 #define DEFINE_GENERIC_SENSOR(class_name) \
00166 protected: \
00167 static mrpt::hwdrivers::CGenericSensor::CLASSINIT_GENERIC_SENSOR _init_##class_name;\
00168 public: \
00169 static mrpt::hwdrivers::TSensorClassId class##class_name; \
00170 virtual const mrpt::hwdrivers::TSensorClassId* GetRuntimeClass() const; \
00171 static mrpt::hwdrivers::CGenericSensor* CreateObject(); \
00172 static void doRegister() \
00173 { CGenericSensor::registerClass( SENSOR_CLASS_ID( class_name ) ); }
00174
00177 #define IMPLEMENTS_GENERIC_SENSOR(class_name, NameSpace) \
00178 mrpt::hwdrivers::CGenericSensor* NameSpace::class_name::CreateObject() \
00179 { return static_cast<hwdrivers::CGenericSensor*>( new NameSpace::class_name ); } \
00180 mrpt::hwdrivers::TSensorClassId NameSpace::class_name::class##class_name = { \
00181 #class_name, NameSpace::class_name::CreateObject }; \
00182 const mrpt::hwdrivers::TSensorClassId* NameSpace::class_name::GetRuntimeClass() const \
00183 { return SENSOR_CLASS_ID(class_name); }
00184
00185
00186 }
00187 }
00188
00189 #endif