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