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 "fusion_sensor_handler.h"
21 #include "fusion_sensor.h"
24 #include <sensor_log.h>
27 const int MAX_INTERVAL = 255000;
29 using namespace sensor;
31 fusion_sensor_handler::fusion_sensor_handler(const sensor_info &info,
32 fusion_sensor *sensor)
33 : sensor_handler(info)
38 fusion_sensor_handler::~fusion_sensor_handler()
40 m_required_sensors.clear();
43 void fusion_sensor_handler::add_required_sensor(uint32_t id, sensor_handler *sensor)
45 sensor_info info = sensor->get_sensor_info();
46 m_required_sensors.emplace(info.get_uri(), required_sensor(id, sensor));
49 int fusion_sensor_handler::update(const char *uri, std::shared_ptr<ipc::message> msg)
51 retv_if(!m_sensor, -EINVAL);
53 auto it = m_required_sensors.find(uri);
54 retv_if(it == m_required_sensors.end(), OP_SUCCESS);
56 if (m_sensor->update(it->second.id, (sensor_data_t *)msg->body(), msg->size()) < 0)
62 if (m_sensor->get_data(&data, &len) < 0)
65 return notify(m_info.get_uri().c_str(), data, len);
68 const sensor_info &fusion_sensor_handler::get_sensor_info(void)
73 int fusion_sensor_handler::start(sensor_observer *ob)
75 retv_if(!m_sensor, -EINVAL);
77 int policy = OP_DEFAULT;
79 policy = m_sensor->start(ob);
80 retv_if(policy <= OP_ERROR, policy);
84 if (policy == OP_DEFAULT) {
85 if (observer_count() > 1)
89 _I("Started[%s]", m_info.get_uri().c_str());
91 return start_required_sensors();
94 int fusion_sensor_handler::stop(sensor_observer *ob)
96 retv_if(!m_sensor, -EINVAL);
98 int policy = OP_DEFAULT;
100 policy = m_sensor->stop(ob);
101 retv_if(policy <= OP_ERROR, policy);
105 if (policy == OP_DEFAULT) {
106 if (observer_count() >= 1)
107 return OP_SUCCESS; /* already started */
110 _I("Stopped[%s]", m_info.get_uri().c_str());
112 return stop_required_sensors();
115 int fusion_sensor_handler::get_min_interval(void)
118 std::vector<int> temp;
120 for (auto it = m_interval_map.begin(); it != m_interval_map.end(); ++it)
122 temp.push_back(it->second);
125 return m_info.get_min_interval();
127 interval = *std::min_element(temp.begin(), temp.end());
129 if (interval > m_info.get_min_interval())
130 return m_info.get_min_interval();
135 int fusion_sensor_handler::get_max_interval(void)
137 int ret = m_info.get_max_interval();
143 int fusion_sensor_handler::set_interval(sensor_observer *ob, int32_t interval)
145 retv_if(!m_sensor, -EINVAL);
147 int _interval = interval;
148 int max_interval = get_max_interval();
149 int min_interval = get_min_interval();
151 if (max_interval > 0 && _interval > max_interval)
152 _interval = max_interval;
153 else if (min_interval > 0 && _interval < min_interval)
154 _interval = min_interval;
156 int policy = OP_DEFAULT;
158 policy = m_sensor->set_interval(ob, _interval);
159 retv_if(policy <= OP_ERROR, policy);
161 m_interval_map[ob] = _interval;
163 update_prev_interval(_interval);
165 return set_interval_internal(_interval);
168 int fusion_sensor_handler::get_interval(sensor_observer *ob, int32_t& interval)
170 retv_if(!m_sensor, -EINVAL);
172 interval = m_prev_interval;
176 int fusion_sensor_handler::get_min_batch_latency(void)
179 std::vector<int> temp;
181 for (auto it = m_batch_latency_map.begin(); it != m_batch_latency_map.end(); ++it)
183 temp.push_back(it->second);
188 batch_latency = *std::min_element(temp.begin(), temp.end());
190 return batch_latency;
193 int fusion_sensor_handler::set_batch_latency(sensor_observer *ob, int32_t latency)
195 retv_if(!m_sensor, -EINVAL);
197 int _latency = latency;
198 int policy = OP_DEFAULT;
201 policy = m_sensor->set_batch_latency(ob, _latency);
202 retv_if(policy <= OP_ERROR, policy);
205 m_batch_latency_map[ob] = _latency;
207 if (policy == OP_DEFAULT)
208 _latency = get_min_batch_latency();
210 update_prev_latency(_latency);
212 return set_batch_latency_internal(_latency);
215 int fusion_sensor_handler::get_batch_latency(sensor_observer *ob, int32_t &latency)
217 retv_if(!m_sensor, -EINVAL);
219 latency = m_prev_latency;
223 int fusion_sensor_handler::set_attribute(sensor_observer *ob, int32_t attr, int32_t value)
225 retv_if(!m_sensor, -EINVAL);
227 int policy = OP_DEFAULT;
229 policy = m_sensor->set_attribute(ob, attr, value);
230 retv_if(policy <= OP_ERROR, policy);
232 if (policy == OP_DEFAULT) {
236 update_attribute(attr, value);
238 return set_attribute_internal(attr, value);
241 int fusion_sensor_handler::set_attribute(sensor_observer *ob, int32_t attr, const char *value, int len)
243 retv_if(!m_sensor, -EINVAL);
245 int policy = OP_DEFAULT;
247 policy = m_sensor->set_attribute(ob, attr, value, len);
248 retv_if(policy <= OP_ERROR, policy);
250 if (policy == OP_DEFAULT) {
254 update_attribute(attr, value, len);
256 return set_attribute_internal(attr, value, len);
259 int fusion_sensor_handler::get_data(sensor_data_t **data, int *len)
261 retv_if(!m_sensor, -EINVAL);
263 return m_sensor->get_data(data, len);
266 int fusion_sensor_handler::flush(sensor_observer *ob)
268 retv_if(!m_sensor, -EINVAL);
270 m_sensor->flush(this);
275 int fusion_sensor_handler::start_required_sensors(void)
277 auto it = m_required_sensors.begin();
278 for (; it != m_required_sensors.end(); ++it) {
279 if (it->second.sensor->start(this) < 0)
286 int fusion_sensor_handler::stop_required_sensors(void)
288 auto it = m_required_sensors.begin();
289 for (; it != m_required_sensors.end(); ++it) {
290 if (it->second.sensor->stop(this) < 0)
297 int fusion_sensor_handler::set_interval_internal(int32_t interval)
299 auto it = m_required_sensors.begin();
300 for (; it != m_required_sensors.end(); ++it) {
301 if (it->second.sensor->set_interval(this, interval) < 0)
308 int fusion_sensor_handler::set_batch_latency_internal(int32_t latency)
310 auto it = m_required_sensors.begin();
311 for (; it != m_required_sensors.end(); ++it) {
312 if (it->second.sensor->set_batch_latency(this, latency) < 0)
319 int fusion_sensor_handler::set_attribute_internal(int32_t attr, int32_t value)
321 auto it = m_required_sensors.begin();
322 for (; it != m_required_sensors.end(); ++it) {
323 if (it->second.sensor->set_attribute(this, attr, value) < 0)
330 int fusion_sensor_handler::set_attribute_internal(int32_t attr, const char *value, int len)
332 auto it = m_required_sensors.begin();
333 for (; it != m_required_sensors.end(); ++it) {
334 if (it->second.sensor->set_attribute(this, attr, value, len) < 0)