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
00019 namespace mrpt
00020 {
00021
00022
00023 namespace hwdrivers
00024 {
00025 class HWDLLIMPEXP CGenericSensor;
00026
00027
00028
00029 struct HWDLLIMPEXP TSensorClassId
00030 {
00031 const char* className;
00032 CGenericSensor* (*ptrCreateObject)();
00033 };
00034
00035 typedef stlplus::smart_ptr<CGenericSensor> CGenericSensorPtr;
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057 class HWDLLIMPEXP CGenericSensor: public mrpt::utils::CUncopiable
00058 {
00059 public:
00060 virtual const mrpt::hwdrivers::TSensorClassId* GetRuntimeClass() const = 0;
00061
00062 typedef std::multimap< mrpt::system::TTimeStamp, mrpt::utils::CSerializablePtr > TListObservations;
00063 typedef std::pair< mrpt::system::TTimeStamp, mrpt::utils::CSerializablePtr > TListObsPair;
00064
00065
00066
00067
00068 enum TSensorState
00069 {
00070 ssInitializing = 0,
00071 ssWorking,
00072 ssError
00073 };
00074
00075
00076 TSensorState getState() const { return m_state; }
00077
00078
00079
00080 private:
00081 synch::CCriticalSection m_csObjList;
00082 TListObservations m_objList;
00083
00084
00085 static std::map< std::string , const TSensorClassId *> m_knownClasses;
00086
00087 DECLARE_UNCOPIABLE( CGenericSensor )
00088
00089 protected:
00090
00091 TSensorState m_state;
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101 void appendObservation( const mrpt::utils::CSerializablePtr &obj);
00102
00103
00104
00105
00106 static void registerClass(const TSensorClassId* pNewClass);
00107
00108
00109
00110
00111 struct CLASSINIT_GENERIC_SENSOR
00112 {
00113 CLASSINIT_GENERIC_SENSOR(const TSensorClassId* pNewClass)
00114 {
00115 CGenericSensor::registerClass(pNewClass);
00116 }
00117 };
00118
00119 public:
00120
00121
00122
00123 static CGenericSensor* createSensor(std::string &className);
00124
00125
00126 CGenericSensor( );
00127
00128
00129 virtual ~CGenericSensor();
00130
00131
00132
00133
00134 virtual void loadConfig(
00135 const mrpt::utils::CConfigFileBase &configSource,
00136 const std::string §ion ) = 0;
00137
00138
00139
00140
00141 virtual void initialize()
00142 { }
00143
00144
00145
00146
00147 virtual void doProcess() = 0;
00148
00149
00150
00151 void getObservations( TListObservations &lstObjects );
00152
00153 };
00154
00155
00156 #define SENSOR_CLASS_ID(class_name) \
00157 static_cast<const mrpt::hwdrivers::TSensorClassId*>(& mrpt::hwdrivers::class_name::class##class_name)
00158
00159 #define SENSOR_IS_CLASS( ptrObj, class_name ) (ptrObj->GetRuntimeClass()==SENSOR_CLASS_ID(class_name))
00160
00161
00162
00163
00164 #define DEFINE_GENERIC_SENSOR(class_name) \
00165 protected: \
00166 static mrpt::hwdrivers::CGenericSensor::CLASSINIT_GENERIC_SENSOR _init_##class_name;\
00167 public: \
00168 static mrpt::hwdrivers::TSensorClassId class##class_name; \
00169 virtual const mrpt::hwdrivers::TSensorClassId* GetRuntimeClass() const; \
00170 static mrpt::hwdrivers::CGenericSensor* CreateObject(); \
00171 static void doRegister() \
00172 { CGenericSensor::registerClass( SENSOR_CLASS_ID( class_name ) ); }
00173
00174
00175
00176 #define IMPLEMENTS_GENERIC_SENSOR(class_name, NameSpace) \
00177 mrpt::hwdrivers::CGenericSensor* NameSpace::class_name::CreateObject() \
00178 { return static_cast<hwdrivers::CGenericSensor*>( new NameSpace::class_name ); } \
00179 mrpt::hwdrivers::TSensorClassId NameSpace::class_name::class##class_name = { \
00180 #class_name, NameSpace::class_name::CreateObject }; \
00181 const mrpt::hwdrivers::TSensorClassId* NameSpace::class_name::GetRuntimeClass() const \
00182 { return SENSOR_CLASS_ID(class_name); }
00183
00184
00185 }
00186 }
00187
00188 #endif