4 * Copyright (c) 2017 Samsung Electronics Co., Ltd.
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
20 #include "physical_sensor_handler.h"
22 #include <sensor_log.h>
23 #include <command_types.h>
27 using namespace sensor;
29 physical_sensor_handler::physical_sensor_handler(const sensor_info &info,
30 sensor_device *device, int hal_id,
31 physical_sensor *sensor)
38 /* TODO: temporary walkaround */
39 switch (m_info.get_type()) {
41 case HRM_LED_GREEN_SENSOR:
42 case HRM_LED_IR_SENSOR:
43 case HRM_LED_RED_SENSOR:
44 case HUMAN_PEDOMETER_SENSOR:
45 case HUMAN_SLEEP_MONITOR_SENSOR:
46 case HUMAN_SLEEP_DETECTOR_SENSOR:
47 case HUMAN_STRESS_MONITOR_SENSOR:
48 m_info.set_privilege("http://tizen.org/privilege/healthinfo");
55 physical_sensor_handler::~physical_sensor_handler()
59 const sensor_info &physical_sensor_handler::get_sensor_info(void)
64 int physical_sensor_handler::get_hal_id(void)
69 int physical_sensor_handler::get_poll_fd(void)
71 retv_if(!m_device, -EINVAL);
73 return m_device->get_poll_fd();
76 int physical_sensor_handler::read_fd(std::vector<uint32_t> &ids)
78 retv_if(observer_count() == 0, OP_ERROR);
79 retv_if(!m_device, -EINVAL);
84 size = m_device->read_fd(&_ids);
85 retv_if(size == 0, -ENODATA);
87 for (int i = 0; i < size; ++i)
88 ids.push_back(_ids[i]);
93 int physical_sensor_handler::on_event(const sensor_data_t *data, int32_t len, int32_t remains)
95 retv_if(!m_device, -EINVAL);
98 int ret = m_sensor->on_event(const_cast<sensor_data_t *>(data), len, remains);
99 retv_if(ret <= OP_ERROR, ret);
104 int physical_sensor_handler::start(sensor_observer *ob)
106 retv_if(!m_device, -EINVAL);
108 int policy = OP_DEFAULT;
111 policy = m_sensor->start(ob);
112 retv_if(policy <= OP_ERROR, policy);
117 if (policy == OP_DEFAULT) {
118 if (observer_count() > 1)
119 return OP_SUCCESS; /* already started */
122 return m_device->enable(m_hal_id);
125 int physical_sensor_handler::stop(sensor_observer *ob)
127 retv_if(!m_device, -EINVAL);
129 int policy = OP_DEFAULT;
132 policy = m_sensor->stop(ob);
133 retv_if(policy <= OP_ERROR, policy);
138 if (policy == OP_DEFAULT) {
139 if (observer_count() >= 1)
140 return OP_SUCCESS; /* already stopped */
143 return m_device->disable(m_hal_id);
146 int physical_sensor_handler::get_min_interval(void)
149 std::vector<int> temp;
151 for (auto it = m_interval_map.begin(); it != m_interval_map.end(); ++it)
153 temp.push_back(it->second);
156 return m_info.get_min_interval();
158 interval = *std::min_element(temp.begin(), temp.end());
160 if (interval < m_info.get_min_interval())
161 return m_info.get_min_interval();
166 int physical_sensor_handler::set_interval(sensor_observer *ob, int32_t interval)
168 retv_if(!m_device, -EINVAL);
171 int32_t cur_interval = interval;
172 int policy = OP_DEFAULT;
175 policy = m_sensor->set_interval(ob, cur_interval);
176 retv_if(policy <= OP_ERROR, policy);
179 m_interval_map[ob] = cur_interval;
181 if (policy == OP_DEFAULT)
182 cur_interval = get_min_interval();
184 retv_if(m_prev_interval == cur_interval, OP_SUCCESS);
186 ret = m_device->set_interval(m_hal_id, cur_interval);
188 m_prev_interval = cur_interval;
190 return (ret ? OP_SUCCESS : OP_ERROR);
193 int physical_sensor_handler::get_min_batch_latency(void)
196 std::vector<int> temp;
198 for (auto it = m_batch_latency_map.begin(); it != m_batch_latency_map.end(); ++it)
200 temp.push_back(it->second);
205 batch_latency = *std::min_element(temp.begin(), temp.end());
207 return batch_latency;
210 int physical_sensor_handler::set_batch_latency(sensor_observer *ob, int32_t latency)
212 retv_if(!m_device, -EINVAL);
215 int _latency = latency;
216 int policy = OP_DEFAULT;
219 policy = m_sensor->set_batch_latency(ob, latency);
220 retv_if(policy <= OP_ERROR, policy);
223 m_batch_latency_map[ob] = _latency;
225 if (_latency <= latency)
228 ret = m_device->set_batch_latency(m_hal_id, _latency);
230 return (ret ? OP_SUCCESS : OP_ERROR);
233 int physical_sensor_handler::set_attribute(sensor_observer *ob, int32_t attr, int32_t value)
235 retv_if(!m_device, -EINVAL);
238 int policy = OP_DEFAULT;
241 policy = m_sensor->set_attribute(ob, attr, value);
242 retv_if(policy <= OP_ERROR, policy);
246 * TODO: default policy for attribute?
247 if (policy == OP_DEFAULT) {
248 if (observer_count() > 1)
253 ret = m_device->set_attribute_int(m_hal_id, attr, value);
255 return (ret ? OP_SUCCESS : OP_ERROR);
258 int physical_sensor_handler::set_attribute(sensor_observer *ob, int32_t attr, const char *value, int len)
260 retv_if(!m_device, -EINVAL);
263 int policy = OP_DEFAULT;
266 policy = m_sensor->set_attribute(ob, attr, value, len);
267 retv_if(policy <= OP_ERROR, policy);
271 * TODO: default policy for attribute?
272 if (policy == OP_DEFAULT) {
273 if (observer_count() > 1)
278 ret = m_device->set_attribute_str(m_hal_id, attr, const_cast<char *>(value), len);
280 return (ret ? OP_SUCCESS : OP_ERROR);
283 int physical_sensor_handler::flush(sensor_observer *ob)
285 retv_if(!m_device, -EINVAL);
289 ret = m_sensor->flush(ob);
290 retv_if(ret <= OP_ERROR, ret);
293 ret = m_device->flush(m_hal_id);
295 return (ret ? OP_SUCCESS : OP_ERROR);
298 int physical_sensor_handler::get_data(sensor_data_t **data, int *len)
300 retv_if(!m_device, -EINVAL);
302 int remains = m_device->get_data(m_hal_id, data, len);
303 retvm_if(*len <= 0, OP_ERROR, "Failed to get sensor event");