xref: /nrf52832-nimble/rt-thread/components/drivers/sensors/sensor.cpp (revision 104654410c56c573564690304ae786df310c91fc)
1*10465441SEvalZero /*
2*10465441SEvalZero  * Copyright (c) 2006-2018, RT-Thread Development Team
3*10465441SEvalZero  *
4*10465441SEvalZero  * SPDX-License-Identifier: Apache-2.0
5*10465441SEvalZero  *
6*10465441SEvalZero  * Change Logs:
7*10465441SEvalZero  * Date           Author       Notes
8*10465441SEvalZero  * 2014-08-03     Bernard      the first version
9*10465441SEvalZero  */
10*10465441SEvalZero 
11*10465441SEvalZero #include <stddef.h>
12*10465441SEvalZero #include <string.h>
13*10465441SEvalZero 
14*10465441SEvalZero #include "sensor.h"
15*10465441SEvalZero 
16*10465441SEvalZero /**
17*10465441SEvalZero  * SensorBase
18*10465441SEvalZero  */
SensorBase(int type)19*10465441SEvalZero SensorBase::SensorBase(int type)
20*10465441SEvalZero {
21*10465441SEvalZero     memset(&(this->config), 0x0, sizeof(SensorConfig));
22*10465441SEvalZero 
23*10465441SEvalZero     this->type = type;
24*10465441SEvalZero     this->next = this->prev = NULL;
25*10465441SEvalZero     subscribe(NULL, NULL);
26*10465441SEvalZero }
27*10465441SEvalZero 
~SensorBase()28*10465441SEvalZero SensorBase::~SensorBase()
29*10465441SEvalZero {
30*10465441SEvalZero }
31*10465441SEvalZero 
getType(void)32*10465441SEvalZero int SensorBase::getType(void)
33*10465441SEvalZero {
34*10465441SEvalZero     return this->type;
35*10465441SEvalZero }
36*10465441SEvalZero 
setConfig(SensorConfig * config)37*10465441SEvalZero int SensorBase::setConfig(SensorConfig *config)
38*10465441SEvalZero {
39*10465441SEvalZero     int result;
40*10465441SEvalZero 
41*10465441SEvalZero     /* configure to the low level sensor */
42*10465441SEvalZero     result = this->configure(config);
43*10465441SEvalZero     if (result == 0)
44*10465441SEvalZero     {
45*10465441SEvalZero         this->config = *config;
46*10465441SEvalZero     }
47*10465441SEvalZero 
48*10465441SEvalZero     return result;
49*10465441SEvalZero }
50*10465441SEvalZero 
getConfig(SensorConfig * config)51*10465441SEvalZero int SensorBase::getConfig(SensorConfig *config)
52*10465441SEvalZero {
53*10465441SEvalZero     *config = this->config;
54*10465441SEvalZero     return 0;
55*10465441SEvalZero }
56*10465441SEvalZero 
subscribe(SensorEventHandler_t handler,void * user_data)57*10465441SEvalZero int SensorBase::subscribe(SensorEventHandler_t handler, void *user_data)
58*10465441SEvalZero {
59*10465441SEvalZero     this->evtHandler = handler;
60*10465441SEvalZero     this->userData = user_data;
61*10465441SEvalZero 
62*10465441SEvalZero     return 0;
63*10465441SEvalZero }
64*10465441SEvalZero 
publish(void)65*10465441SEvalZero int SensorBase::publish(void)
66*10465441SEvalZero {
67*10465441SEvalZero     if (this->evtHandler != NULL)
68*10465441SEvalZero     {
69*10465441SEvalZero         /* invoke subscribed handler */
70*10465441SEvalZero         (*evtHandler)(this->userData);
71*10465441SEvalZero     }
72*10465441SEvalZero 
73*10465441SEvalZero     return 0;
74*10465441SEvalZero }
75*10465441SEvalZero 
76*10465441SEvalZero /**
77*10465441SEvalZero  * Sensor Manager
78*10465441SEvalZero  */
79*10465441SEvalZero /* sensors list */
80*10465441SEvalZero static SensorBase *sensor_list = NULL;
81*10465441SEvalZero 
SensorManager()82*10465441SEvalZero SensorManager::SensorManager()
83*10465441SEvalZero {
84*10465441SEvalZero }
85*10465441SEvalZero 
~SensorManager()86*10465441SEvalZero SensorManager::~SensorManager()
87*10465441SEvalZero {
88*10465441SEvalZero }
89*10465441SEvalZero 
registerSensor(SensorBase * sensor)90*10465441SEvalZero int SensorManager::registerSensor(SensorBase *sensor)
91*10465441SEvalZero {
92*10465441SEvalZero     RT_ASSERT(sensor != RT_NULL);
93*10465441SEvalZero 
94*10465441SEvalZero     /* add sensor into the list */
95*10465441SEvalZero     if (sensor_list == NULL)
96*10465441SEvalZero     {
97*10465441SEvalZero         sensor->prev = sensor->next = sensor;
98*10465441SEvalZero     }
99*10465441SEvalZero     else
100*10465441SEvalZero     {
101*10465441SEvalZero         sensor_list->prev->next = sensor;
102*10465441SEvalZero         sensor->prev = sensor_list->prev;
103*10465441SEvalZero 
104*10465441SEvalZero         sensor_list->prev = sensor;
105*10465441SEvalZero         sensor->next = sensor_list;
106*10465441SEvalZero     }
107*10465441SEvalZero 
108*10465441SEvalZero     /* point the sensorList to this sensor */
109*10465441SEvalZero     sensor_list = sensor;
110*10465441SEvalZero 
111*10465441SEvalZero     return 0;
112*10465441SEvalZero }
113*10465441SEvalZero 
unregisterSensor(SensorBase * sensor)114*10465441SEvalZero int SensorManager::unregisterSensor(SensorBase *sensor)
115*10465441SEvalZero {
116*10465441SEvalZero     /* disconnect sensor list */
117*10465441SEvalZero     sensor->next->prev = sensor->prev;
118*10465441SEvalZero     sensor->prev->next = sensor->next;
119*10465441SEvalZero 
120*10465441SEvalZero     /* check the sensorList */
121*10465441SEvalZero     if (sensor == sensor_list)
122*10465441SEvalZero     {
123*10465441SEvalZero         if (sensor->next == sensor) sensor_list = NULL; /* empty list */
124*10465441SEvalZero         else sensor_list = sensor->next;
125*10465441SEvalZero     }
126*10465441SEvalZero 
127*10465441SEvalZero     /* re-initialize sensor node */
128*10465441SEvalZero     sensor->next = sensor->prev = sensor;
129*10465441SEvalZero 
130*10465441SEvalZero     return 0;
131*10465441SEvalZero }
132*10465441SEvalZero 
getDefaultSensor(int type)133*10465441SEvalZero SensorBase *SensorManager::getDefaultSensor(int type)
134*10465441SEvalZero {
135*10465441SEvalZero     SensorBase *sensor = sensor_list;
136*10465441SEvalZero 
137*10465441SEvalZero     if (sensor == NULL) return NULL;
138*10465441SEvalZero 
139*10465441SEvalZero     do
140*10465441SEvalZero     {
141*10465441SEvalZero         /* find the same type */
142*10465441SEvalZero         if (sensor->getType() == type) return sensor;
143*10465441SEvalZero 
144*10465441SEvalZero         sensor = sensor->next;
145*10465441SEvalZero     }while (sensor != sensor_list);
146*10465441SEvalZero 
147*10465441SEvalZero     return NULL;
148*10465441SEvalZero }
149*10465441SEvalZero 
subscribe(int type,SensorEventHandler_t handler,void * user_data)150*10465441SEvalZero int SensorManager::subscribe(int type, SensorEventHandler_t handler, void *user_data)
151*10465441SEvalZero {
152*10465441SEvalZero     SensorBase *sensor;
153*10465441SEvalZero 
154*10465441SEvalZero     sensor = SensorManager::getDefaultSensor(type);
155*10465441SEvalZero     if (sensor != NULL)
156*10465441SEvalZero     {
157*10465441SEvalZero         sensor->subscribe(handler, user_data);
158*10465441SEvalZero         return 0;
159*10465441SEvalZero     }
160*10465441SEvalZero 
161*10465441SEvalZero     return -1;
162*10465441SEvalZero }
163*10465441SEvalZero 
sensorEventReady(SensorBase * sensor)164*10465441SEvalZero int SensorManager::sensorEventReady(SensorBase *sensor)
165*10465441SEvalZero {
166*10465441SEvalZero     return 0;
167*10465441SEvalZero }
168*10465441SEvalZero 
pollSensor(SensorBase * sensor,sensors_event_t * events,int number,int duration)169*10465441SEvalZero int SensorManager::pollSensor(SensorBase *sensor, sensors_event_t *events, int number, int duration)
170*10465441SEvalZero {
171*10465441SEvalZero     rt_tick_t tick;
172*10465441SEvalZero     int result, index;
173*10465441SEvalZero 
174*10465441SEvalZero     if (sensor == NULL) return -1;
175*10465441SEvalZero 
176*10465441SEvalZero     tick = rt_tick_get();
177*10465441SEvalZero     for (index = 0; index < number; index ++)
178*10465441SEvalZero     {
179*10465441SEvalZero         result = sensor->poll(&events[index]);
180*10465441SEvalZero         if (result < 0) break;
181*10465441SEvalZero 
182*10465441SEvalZero         if (rt_tick_get() - tick > duration) break;
183*10465441SEvalZero     }
184*10465441SEvalZero 
185*10465441SEvalZero     return index;
186*10465441SEvalZero }
187*10465441SEvalZero 
rt_sensor_get_default(int type)188*10465441SEvalZero rt_sensor_t rt_sensor_get_default(int type)
189*10465441SEvalZero {
190*10465441SEvalZero     return (rt_sensor_t)SensorManager::getDefaultSensor(type);
191*10465441SEvalZero }
192*10465441SEvalZero 
rt_sensor_subscribe(rt_sensor_t sensor,SensorEventHandler_t handler,void * user_data)193*10465441SEvalZero int rt_sensor_subscribe(rt_sensor_t sensor, SensorEventHandler_t handler, void *user_data)
194*10465441SEvalZero {
195*10465441SEvalZero     SensorBase *sensor_base;
196*10465441SEvalZero     if (sensor == NULL) return -1;
197*10465441SEvalZero 
198*10465441SEvalZero     sensor_base = (SensorBase*)sensor;
199*10465441SEvalZero 
200*10465441SEvalZero     return sensor_base->subscribe(handler, user_data);
201*10465441SEvalZero }
202*10465441SEvalZero 
rt_sensor_poll(rt_sensor_t sensor,sensors_event_t * event)203*10465441SEvalZero int rt_sensor_poll(rt_sensor_t sensor, sensors_event_t *event)
204*10465441SEvalZero {
205*10465441SEvalZero     SensorBase *sensor_base;
206*10465441SEvalZero     if (sensor == NULL || event == NULL) return -1;
207*10465441SEvalZero 
208*10465441SEvalZero     sensor_base = (SensorBase*)sensor;
209*10465441SEvalZero     return sensor_base->poll(event);
210*10465441SEvalZero }
211*10465441SEvalZero 
rt_sensor_configure(rt_sensor_t sensor,SensorConfig * config)212*10465441SEvalZero int rt_sensor_configure(rt_sensor_t sensor, SensorConfig *config)
213*10465441SEvalZero {
214*10465441SEvalZero     SensorBase *sensor_base;
215*10465441SEvalZero     if (sensor == NULL || config == NULL) return -1;
216*10465441SEvalZero 
217*10465441SEvalZero     sensor_base = (SensorBase*)sensor;
218*10465441SEvalZero     return sensor_base->setConfig(config);
219*10465441SEvalZero }
220*10465441SEvalZero 
rt_sensor_activate(rt_sensor_t sensor,int enable)221*10465441SEvalZero int rt_sensor_activate(rt_sensor_t sensor, int enable)
222*10465441SEvalZero {
223*10465441SEvalZero     SensorBase *sensor_base;
224*10465441SEvalZero     if (sensor == NULL) return -1;
225*10465441SEvalZero 
226*10465441SEvalZero     sensor_base = (SensorBase*)sensor;
227*10465441SEvalZero     return sensor_base->activate(enable);
228*10465441SEvalZero }
229