diff options
| author | Bernard Xiong <[email protected]> | 2014-11-01 09:09:52 +0800 |
|---|---|---|
| committer | Bernard Xiong <[email protected]> | 2014-11-01 09:09:52 +0800 |
| commit | 18cd95688d8e5f040329d32f12e217d3f6a6e830 (patch) | |
| tree | d489cf7ac40fb56863a256d5324d27a891fceb93 /components/drivers/sensors/sensor.cpp | |
| parent | b84123b0b42f64a659b15887d196159d90b72810 (diff) | |
[Drivers] Add sensor framework
Diffstat (limited to 'components/drivers/sensors/sensor.cpp')
| -rw-r--r-- | components/drivers/sensors/sensor.cpp | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/components/drivers/sensors/sensor.cpp b/components/drivers/sensors/sensor.cpp new file mode 100644 index 0000000000..f15ee3a3ca --- /dev/null +++ b/components/drivers/sensors/sensor.cpp @@ -0,0 +1,135 @@ +#include <stddef.h> +#include "sensor.h" + +/** + * Sensor + */ +Sensor::Sensor() +{ + this->next = this->prev = NULL; + Subscribe(NULL, NULL); +} + +Sensor::~Sensor() +{ +} + +int Sensor::GetType(void) +{ + return this->type; +} + +int Sensor::Subscribe(SensorEventHandler_t *handler, void* user_data) +{ + this->evtHandler = handler; + this->userData = user_data; + + return 0; +} + +int Sensor::Publish(sensors_event_t* event) +{ + if (this->evtHandler != NULL) + { + /* invoke subscribed handler */ + (*evtHandler)(this, event, this->userData); + } + + return 0; +} + +/** + * Sensor Manager + */ +/* sensor manager instance */ +static SensorManager _sensor_manager; + +SensorManager::SensorManager() +{ + sensorList = NULL; +} + +SensorManager::~SensorManager() +{ +} + +int SensorManager::RegisterSensor(Sensor* sensor) +{ + SensorManager* self = &_sensor_manager; + + RT_ASSERT(sensor != RT_NULL); + + /* add sensor into the list */ + if (self->sensorList = NULL) + { + sensor->prev = sensor->next = sensor; + } + else + { + sensor->prev = self->sensorList; + sensor->next = self->sensorList->next; + + self->sensorList->next->prev = sensor; + self->sensorList->next = sensor; + } + + /* point the sensorList to this sensor */ + self->sensorList = sensor; + + return 0; +} + +int SensorManager::DeregisterSensor(Sensor* sensor) +{ + SensorManager* self = &_sensor_manager; + + /* disconnect sensor list */ + sensor->next->prev = sensor->prev; + sensor->prev->next = sensor->next; + + /* check the sensorList */ + if (sensor == self->sensorList) + { + if (sensor->next == sensor) self->sensorList = NULL; /* empty list */ + else self->sensorList = sensor->next; + } + + /* re-initialize sensor node */ + sensor->next = sensor->prev = sensor; + + return 0; +} + +Sensor *SensorManager::GetDefaultSensor(int type) +{ + SensorManager* self = &_sensor_manager; + Sensor *sensor = self->sensorList; + + if (sensor == NULL) return NULL; + + do + { + /* find the same type */ + if (sensor->GetType() == type) return sensor; + + sensor = sensor->next; + } + while (sensor != self->sensorList); + + return NULL; +} + +int SensorManager::Subscribe(int type, SensorEventHandler_t *handler, void* user_data) +{ + Sensor *sensor; + + sensor = SensorManager::GetDefaultSensor(type); + if (sensor != NULL) + { + sensor->Subscribe(handler, user_data); + return 0; + } + + return -1; +} + |
