123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232 |
- /*
- * File : sensors.cpp
- * This file is part of RT-Thread RTOS
- * COPYRIGHT (C) 2014, RT-Thread Development Team
- *
- * The license and distribution terms for this file may be
- * found in the file LICENSE in this distribution or at
- * http://www.rt-thread.org/license/LICENSE
- *
- * Change Logs:
- * Date Author Notes
- * 2014-08-03 Bernard the first version
- */
- #include <stddef.h>
- #include <string.h>
- #include "sensor.h"
- /**
- * SensorBase
- */
- SensorBase::SensorBase(int type)
- {
- memset(&(this->config), 0x0, sizeof(SensorConfig));
- this->type = type;
- this->next = this->prev = NULL;
- subscribe(NULL, NULL);
- }
- SensorBase::~SensorBase()
- {
- }
- int SensorBase::getType(void)
- {
- return this->type;
- }
- 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->userData = user_data;
- return 0;
- }
- int SensorBase::publish(void)
- {
- if (this->evtHandler != NULL)
- {
- /* invoke subscribed handler */
- (*evtHandler)(this->userData);
- }
- return 0;
- }
- /**
- * Sensor Manager
- */
- /* sensors list */
- static SensorBase *sensor_list = NULL;
- SensorManager::SensorManager()
- {
- }
- SensorManager::~SensorManager()
- {
- }
- int SensorManager::registerSensor(SensorBase *sensor)
- {
- RT_ASSERT(sensor != RT_NULL);
- /* add sensor into the list */
- if (sensor_list == NULL)
- {
- sensor->prev = sensor->next = sensor;
- }
- else
- {
- sensor_list->prev->next = sensor;
- sensor->prev = sensor_list->prev;
- sensor_list->prev = sensor;
- sensor->next = sensor_list;
- }
- /* point the sensorList to this sensor */
- sensor_list = sensor;
- return 0;
- }
- int SensorManager::unregisterSensor(SensorBase *sensor)
- {
- /* disconnect sensor list */
- sensor->next->prev = sensor->prev;
- sensor->prev->next = sensor->next;
- /* check the sensorList */
- if (sensor == sensor_list)
- {
- if (sensor->next == sensor) sensor_list = NULL; /* empty list */
- else sensor_list = sensor->next;
- }
- /* re-initialize sensor node */
- sensor->next = sensor->prev = sensor;
- return 0;
- }
- SensorBase *SensorManager::getDefaultSensor(int type)
- {
- SensorBase *sensor = sensor_list;
- if (sensor == NULL) return NULL;
- do
- {
- /* find the same type */
- if (sensor->getType() == type) return sensor;
- sensor = sensor->next;
- }while (sensor != sensor_list);
- return NULL;
- }
- int SensorManager::subscribe(int type, SensorEventHandler_t handler, void *user_data)
- {
- SensorBase *sensor;
- sensor = SensorManager::getDefaultSensor(type);
- if (sensor != NULL)
- {
- sensor->subscribe(handler, user_data);
- return 0;
- }
- 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;
- }
- rt_sensor_t rt_sensor_get_default(int type)
- {
- return (rt_sensor_t)SensorManager::getDefaultSensor(type);
- }
- int rt_sensor_subscribe(rt_sensor_t sensor, SensorEventHandler_t handler, void *user_data)
- {
- SensorBase *sensor_base;
- if (sensor == NULL) return -1;
- sensor_base = (SensorBase*)sensor;
- return sensor_base->subscribe(handler, user_data);
- }
- int rt_sensor_poll(rt_sensor_t sensor, sensors_event_t *event)
- {
- SensorBase *sensor_base;
- if (sensor == NULL || event == NULL) return -1;
- sensor_base = (SensorBase*)sensor;
- return sensor_base->poll(event);
- }
- int rt_sensor_configure(rt_sensor_t sensor, SensorConfig *config)
- {
- SensorBase *sensor_base;
- if (sensor == NULL || config == NULL) return -1;
- sensor_base = (SensorBase*)sensor;
- return sensor_base->setConfig(config);
- }
- int rt_sensor_activate(rt_sensor_t sensor, int enable)
- {
- SensorBase *sensor_base;
- if (sensor == NULL) return -1;
-
- sensor_base = (SensorBase*)sensor;
- return sensor_base->activate(enable);
- }
|