[DeviceDriver] change the name style of method of C++ code; Add raw mode for sensor.

This commit is contained in:
bernard 2014-12-31 22:33:54 +08:00
parent b73283135d
commit 58163f49e0
2 changed files with 205 additions and 60 deletions

View File

@ -13,27 +13,52 @@
*/ */
#include <stddef.h> #include <stddef.h>
#include <string.h>
#include "sensor.h" #include "sensor.h"
/** /**
* Sensor * SensorBase
*/ */
Sensor::Sensor() SensorBase::SensorBase(int type)
{ {
memset(&(this->config), 0x0, sizeof(SensorConfig));
this->type = type;
this->next = this->prev = NULL; this->next = this->prev = NULL;
Subscribe(NULL, NULL); subscribe(NULL, NULL);
} }
Sensor::~Sensor() SensorBase::~SensorBase()
{ {
} }
int Sensor::GetType(void) int SensorBase::getType(void)
{ {
return this->type; return this->type;
} }
int Sensor::Subscribe(SensorEventHandler_t *handler, void *user_data) int SensorBase::setConfig(SensorConfig *config)
{
int result;
/* configure to the low level sensor */
result = this->configure(config);
if (result == 0)
{
this->config = *config;
}
return result;
}
int SensorBase::getConfig(SensorConfig *config)
{
*config = this->config;
return 0;
}
int SensorBase::subscribe(SensorEventHandler_t *handler, void *user_data)
{ {
this->evtHandler = handler; this->evtHandler = handler;
this->userData = user_data; this->userData = user_data;
@ -41,7 +66,7 @@ int Sensor::Subscribe(SensorEventHandler_t *handler, void *user_data)
return 0; return 0;
} }
int Sensor::Publish(sensors_event_t *event) int SensorBase::publish(sensors_event_t *event)
{ {
if (this->evtHandler != NULL) if (this->evtHandler != NULL)
{ {
@ -55,57 +80,52 @@ int Sensor::Publish(sensors_event_t *event)
/** /**
* Sensor Manager * Sensor Manager
*/ */
/* sensor manager instance */ /* sensors list */
static SensorManager _sensor_manager; static SensorBase *sensor_list = NULL;
SensorManager::SensorManager() SensorManager::SensorManager()
{ {
sensorList = NULL;
} }
SensorManager::~SensorManager() SensorManager::~SensorManager()
{ {
} }
int SensorManager::RegisterSensor(Sensor *sensor) int SensorManager::registerSensor(SensorBase *sensor)
{ {
SensorManager *self = &_sensor_manager;
RT_ASSERT(sensor != RT_NULL); RT_ASSERT(sensor != RT_NULL);
/* add sensor into the list */ /* add sensor into the list */
if (self->sensorList == NULL) if (sensor_list == NULL)
{ {
sensor->prev = sensor->next = sensor; sensor->prev = sensor->next = sensor;
} }
else else
{ {
sensor->prev = self->sensorList; sensor_list->prev->next = sensor;
sensor->next = self->sensorList->next; sensor->prev = sensor_list->prev;
self->sensorList->next->prev = sensor; sensor_list->prev = sensor;
self->sensorList->next = sensor; sensor->next = sensor_list;
} }
/* point the sensorList to this sensor */ /* point the sensorList to this sensor */
self->sensorList = sensor; sensor_list = sensor;
return 0; return 0;
} }
int SensorManager::DeregisterSensor(Sensor *sensor) int SensorManager::unregisterSensor(SensorBase *sensor)
{ {
SensorManager *self = &_sensor_manager;
/* disconnect sensor list */ /* disconnect sensor list */
sensor->next->prev = sensor->prev; sensor->next->prev = sensor->prev;
sensor->prev->next = sensor->next; sensor->prev->next = sensor->next;
/* check the sensorList */ /* check the sensorList */
if (sensor == self->sensorList) if (sensor == sensor_list)
{ {
if (sensor->next == sensor) self->sensorList = NULL; /* empty list */ if (sensor->next == sensor) sensor_list = NULL; /* empty list */
else self->sensorList = sensor->next; else sensor_list = sensor->next;
} }
/* re-initialize sensor node */ /* re-initialize sensor node */
@ -114,35 +134,58 @@ int SensorManager::DeregisterSensor(Sensor *sensor)
return 0; return 0;
} }
Sensor *SensorManager::GetDefaultSensor(int type) SensorBase *SensorManager::getDefaultSensor(int type)
{ {
SensorManager *self = &_sensor_manager; SensorBase *sensor = sensor_list;
Sensor *sensor = self->sensorList;
if (sensor == NULL) return NULL; if (sensor == NULL) return NULL;
do do
{ {
/* find the same type */ /* find the same type */
if (sensor->GetType() == type) return sensor; if (sensor->getType() == type) return sensor;
sensor = sensor->next; sensor = sensor->next;
}while (sensor != self->sensorList); }while (sensor != sensor_list);
return NULL; return NULL;
} }
int SensorManager::Subscribe(int type, SensorEventHandler_t *handler, void *user_data) int SensorManager::subscribe(int type, SensorEventHandler_t *handler, void *user_data)
{ {
Sensor *sensor; SensorBase *sensor;
sensor = SensorManager::GetDefaultSensor(type); sensor = SensorManager::getDefaultSensor(type);
if (sensor != NULL) if (sensor != NULL)
{ {
sensor->Subscribe(handler, user_data); sensor->subscribe(handler, user_data);
return 0; return 0;
} }
return -1; return -1;
} }
int SensorManager::sensorEventReady(SensorBase *sensor)
{
return 0;
}
int SensorManager::pollSensor(SensorBase *sensor, sensors_event_t *events, int number, int duration)
{
rt_tick_t tick;
int result, index;
if (sensor == NULL) return -1;
tick = rt_tick_get();
for (index = 0; index < number; index ++)
{
result = sensor->poll(&events[index]);
if (result < 0) break;
if (rt_tick_get() - tick > duration) break;
}
return index;
}

View File

@ -36,6 +36,8 @@
#include <rtdevice.h> #include <rtdevice.h>
#include <stdint.h> #include <stdint.h>
#pragma anon_unions
/** /**
* Handles must be higher than SENSORS_HANDLE_BASE and must be unique. * Handles must be higher than SENSORS_HANDLE_BASE and must be unique.
* A Handle identifies a given sensors. The handle is used to activate * A Handle identifies a given sensors. The handle is used to activate
@ -726,14 +728,24 @@ enum
* Values returned by the accelerometer in various locations in the universe. * Values returned by the accelerometer in various locations in the universe.
* all values are in SI units (m/s^2) * all values are in SI units (m/s^2)
*/ */
#define GRAVITY_SUN (275.0f) #define SENSORS_GRAVITY_SUN (275.0f)
#define GRAVITY_EARTH (9.80665f) #define SENSORS_GRAVITY_MOON (1.6f)
#define SENSORS_GRAVITY_EARTH (9.80665f)
#define SENSORS_GRAVITY_STANDARD (SENSORS_GRAVITY_EARTH)
/** Maximum magnetic field on Earth's surface */ /** Maximum magnetic field on Earth's surface */
#define MAGNETIC_FIELD_EARTH_MAX (60.0f) #define MAGNETIC_FIELD_EARTH_MAX (60.0f)
/** Minimum magnetic field on Earth's surface */ /** Minimum magnetic field on Earth's surface */
#define MAGNETIC_FIELD_EARTH_MIN (30.0f) #define MAGNETIC_FIELD_EARTH_MIN (30.0f)
/** Average sea level pressure is 1013.25 hPa */
#define SENSORS_PRESSURE_SEALEVELHPA (1013.25F)
/** Degrees/s to rad/s multiplier */
#define SENSORS_DPS_TO_RADS (0.017453293F)
/** Gauss to micro-Tesla multiplier */
#define SENSORS_GAUSS_TO_MICROTESLA (100)
/** /**
* status of orientation sensor * status of orientation sensor
@ -768,6 +780,22 @@ typedef struct
uint8_t reserved[3]; uint8_t reserved[3];
} sensors_vec_t; } sensors_vec_t;
/**
* sensor raw vector data
*/
typedef struct
{
struct
{
int16_t x;
int16_t y;
int16_t z;
};
int8_t status;
uint8_t reserved[1];
} sensors_raw_vec_t;
/** /**
* uncalibrated gyroscope and magnetometer event data * uncalibrated gyroscope and magnetometer event data
*/ */
@ -830,15 +858,21 @@ typedef struct sensors_event_t
/* acceleration values are in meter per second per second (m/s^2) */ /* acceleration values are in meter per second per second (m/s^2) */
sensors_vec_t acceleration; sensors_vec_t acceleration;
/* raw acceleration data */
sensors_raw_vec_t raw_acceleration;
/* magnetic vector values are in micro-Tesla (uT) */ /* magnetic vector values are in micro-Tesla (uT) */
sensors_vec_t magnetic; sensors_vec_t magnetic;
/* raw magnetic data */
sensors_raw_vec_t raw_magnetic;
/* orientation values are in degrees */ /* orientation values are in degrees */
sensors_vec_t orientation; sensors_vec_t orientation;
/* gyroscope values are in rad/s */ /* gyroscope values are in rad/s */
sensors_vec_t gyro; sensors_vec_t gyro;
/* raw gyroscope data */
sensors_raw_vec_t raw_gyro;
/* temperature is in degrees centigrade (Celsius) */ /* temperature is in degrees centigrade (Celsius) */
float temperature; float temperature;
@ -943,41 +977,109 @@ typedef struct sensor_t
void *reserved[6]; void *reserved[6];
} sensor_t; } sensor_t;
class SensorConfigure enum SensorMode
{ {
int32_t delay; SENSOR_MODE_RAW,
SENSOR_MODE_CALIBRATED,
SENSOR_MODE_NORMAL,
}; };
class Sensor; enum SensorAccelRange
{
SENSOR_ACCEL_RANGE_2G,
SENSOR_ACCEL_RANGE_4G,
SENSOR_ACCEL_RANGE_8G,
SENSOR_ACCEL_RANGE_16G,
};
#define SENSOR_ACCEL_SENSITIVITY_2G (0.001F)
#define SENSOR_ACCEL_SENSITIVITY_4G (0.002F)
#define SENSOR_ACCEL_SENSITIVITY_8G (0.004F)
#define SENSOR_ACCEL_SENSITIVITY_16G (0.012F)
enum SensorGyroRange
{
SENSOR_GYRO_RANGE_250DPS,
SENSOR_GYRO_RANGE_500DPS,
SENSOR_GYRO_RANGE_1000DPS,
SENSOR_GYRO_RANGE_2000DPS,
};
#define SENSOR_GYRO_SENSITIVITY_250DPS (0.00875F)
#define SENSOR_GYRO_SENSITIVITY_500DPS (0.0175F)
#define SENSOR_GYRO_SENSITIVITY_1000DPS (0.035F)
#define SENSOR_GYRO_SENSITIVITY_2000DPS (0.070F)
enum SensorDataRate
{
SENSOR_DATARATE_3200HZ,
SENSOR_DATARATE_1600HZ,
SENSOR_DATARATE_800HZ,
SENSOR_DATARATE_400HZ,
SENSOR_DATARATE_200HZ,
SENSOR_DATARATE_100HZ,
SENSOR_DATARATE_50HZ,
SENSOR_DATARATE_25HZ,
SENSOR_DATARATE_12_5HZ,
SENSOR_DATARATE_6_25HZ,
SENSOR_DATARATE_3_13HZ,
SENSOR_DATARATE_1_56HZ,
SENSOR_DATARATE_0_78HZ,
SENSOR_DATARATE_0_39HZ,
SENSOR_DATARATE_0_20HZ,
SENSOR_DATARATE_0_10HZ,
};
class SensorBase;
class SensorManager; class SensorManager;
typedef void (*SensorEventHandler_t)(Sensor *sensor, sensors_event_t *event, void *user_data); typedef void (*SensorEventHandler_t)(SensorBase *sensor, sensors_event_t *event, void *user_data);
/**
* Sensor Configuration
*/
typedef struct SensorConfig
{
int mode;
enum SensorDataRate data_rate;
union range
{
enum SensorAccelRange accel_range;
enum SensorGyroRange gyro_range;
} range;
}SensorConfig;
/** /**
* Sensor Base Class * Sensor Base Class
*/ */
class Sensor class SensorBase
{ {
private: private:
int type; int type;
public: public:
Sensor(); SensorBase(int type);
~Sensor(); ~SensorBase();
virtual int Configure(SensorConfigure *config) = 0; virtual int configure(SensorConfig *config) = 0;
virtual int Activate(int enable) = 0; virtual int activate(int enable) = 0;
virtual int Poll(sensors_event_t *events, int number, int duration) = 0; virtual int poll(sensors_event_t *events) = 0;
virtual void GetSensor(struct sensor_t *sensor) = 0; virtual void getSensor(struct sensor_t *sensor) = 0;
int GetType(void); int getType(void);
int Subscribe(SensorEventHandler_t *handler, void *user_data); int setConfig(SensorConfig *config);
int Publish(sensors_event_t *event); int getConfig(SensorConfig *config);
int subscribe(SensorEventHandler_t *handler, void *user_data);
int publish(sensors_event_t *event);
protected: protected:
Sensor *next; SensorBase *next;
Sensor *prev; SensorBase *prev;
/* sensor configuration */
SensorConfig config;
SensorEventHandler_t *evtHandler; SensorEventHandler_t *evtHandler;
void *userData; void *userData;
@ -994,14 +1096,14 @@ public:
SensorManager(); SensorManager();
~SensorManager(); ~SensorManager();
static int RegisterSensor(Sensor *sensor); static int registerSensor(SensorBase *sensor);
static int DeregisterSensor(Sensor *sensor); static int unregisterSensor(SensorBase *sensor);
static Sensor *GetDefaultSensor(int type); static SensorBase *getDefaultSensor(int type);
static int Subscribe(int type, SensorEventHandler_t *handler, void *user_data); static int subscribe(int type, SensorEventHandler_t *handler, void *user_data);
private: static int sensorEventReady(SensorBase *sensor);
Sensor *sensorList; static int pollSensor(SensorBase *sensor, sensors_event_t *events, int number, int duration);
}; };
#endif #endif