[DeviceDriver] change the name style of method of C++ code; Add raw mode for sensor.
This commit is contained in:
parent
b73283135d
commit
58163f49e0
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue