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 "external_sensor_handler.h"
23 #include <sensor_log.h>
24 #include <external_sensor.h>
27 using namespace sensor;
29 class external_sensor_notifier : public sensor_notifier {
31 external_sensor_notifier(external_sensor_handler *sensor);
36 external_sensor_handler *m_sensor;
39 external_sensor_notifier::external_sensor_notifier(external_sensor_handler *sensor)
44 int external_sensor_notifier::notify(void)
46 /* TODO: Change thread-safe function(add handler to event-loop) */
50 if (m_sensor->get_data(&data, &len) < 0)
53 /* TODO: pointer would be better */
54 sensor_info info = m_sensor->get_sensor_info();
56 return m_sensor->notify(info.get_uri().c_str(), data, len);
59 external_sensor_handler::external_sensor_handler(const sensor_info &info,
60 external_sensor *sensor)
61 : sensor_handler(info)
64 , m_policy(OP_DEFAULT)
69 external_sensor_handler::~external_sensor_handler()
74 bool external_sensor_handler::init(void)
76 m_notifier = new(std::nothrow) external_sensor_notifier(this);
77 retvm_if(!m_notifier, false, "Failed to allocate memory");
79 m_sensor->set_notifier(m_notifier);
83 void external_sensor_handler::deinit(void)
89 const sensor_info &external_sensor_handler::get_sensor_info(void)
94 int external_sensor_handler::start(sensor_observer *ob)
96 retv_if(!m_sensor, -EINVAL);
98 int policy = m_sensor->start(ob);
99 retv_if(policy <= OP_ERROR, policy);
103 _I("Started[%s]", m_info.get_uri().c_str());
108 int external_sensor_handler::stop(sensor_observer *ob)
110 retv_if(!m_sensor, -EINVAL);
112 int policy = m_sensor->stop(ob);
113 retv_if(policy <= OP_ERROR, policy);
117 _I("Stopped[%s]", m_info.get_uri().c_str());
122 int external_sensor_handler::get_min_interval(void)
125 std::vector<int> temp;
127 for (auto it = m_interval_map.begin(); it != m_interval_map.end(); ++it)
129 temp.push_back(it->second);
132 return m_info.get_min_interval();
134 interval = *std::min_element(temp.begin(), temp.end());
136 if (interval < m_info.get_min_interval())
137 return m_info.get_min_interval();
142 int external_sensor_handler::set_interval(sensor_observer *ob, int32_t interval)
144 retv_if(!m_sensor, -EINVAL);
146 int _interval = interval;
148 if ((m_policy == OP_DEFAULT && observer_count() == 0) || m_policy == OP_SUCCESS) {
149 m_policy = m_sensor->set_interval(ob, interval);
150 retv_if(m_policy <= OP_ERROR, m_policy);
153 m_interval_map[ob] = _interval;
155 int ret = OP_SUCCESS;
156 if (m_policy == OP_DEFAULT && observer_count() > 0) {
157 _interval = get_min_interval();
158 ret = m_sensor->set_interval(ob, _interval);
161 update_prev_interval(_interval);
165 int external_sensor_handler::get_interval(sensor_observer *ob, int32_t& interval)
167 retv_if(!m_sensor, -EINVAL);
168 interval = m_prev_interval;
172 int external_sensor_handler::get_min_batch_latency(void)
175 std::vector<int> temp;
177 for (auto it = m_batch_latency_map.begin(); it != m_batch_latency_map.end(); ++it)
179 temp.push_back(it->second);
184 batch_latency = *std::min_element(temp.begin(), temp.end());
186 return batch_latency;
189 int external_sensor_handler::set_batch_latency(sensor_observer *ob, int32_t latency)
191 retv_if(!m_sensor, -EINVAL);
193 int _latency = latency;
195 if ((m_policy == OP_DEFAULT && observer_count() == 0) || m_policy == OP_SUCCESS) {
196 m_policy = m_sensor->set_batch_latency(ob, latency);
197 retv_if(m_policy <= OP_ERROR, m_policy);
200 m_batch_latency_map[ob] = _latency;
202 int ret = OP_SUCCESS;
203 if (m_policy == OP_DEFAULT && observer_count() > 0) {
204 _latency = get_min_batch_latency();
205 ret = m_sensor->set_batch_latency(ob, latency);
208 update_prev_latency(_latency);
212 int external_sensor_handler::get_batch_latency(sensor_observer *ob, int32_t &latency)
214 retv_if(!m_sensor, -EINVAL);
215 latency = m_prev_latency;
219 int external_sensor_handler::set_attribute(sensor_observer *ob, int32_t attr, int32_t value)
221 retv_if(!m_sensor, -EINVAL);
223 if ((m_policy == OP_DEFAULT && observer_count() == 0) || m_policy == OP_SUCCESS) {
224 m_policy = m_sensor->set_attribute(ob, attr, value);
225 retv_if(m_policy <= OP_ERROR, m_policy);
228 if (m_policy == OP_DEFAULT) {
232 update_attribute(attr, value);
237 int external_sensor_handler::set_attribute(sensor_observer *ob, int32_t attr, const char *value, int len)
239 retv_if(!m_sensor, -EINVAL);
241 if ((m_policy == OP_DEFAULT && observer_count() == 0) || m_policy == OP_SUCCESS) {
242 m_policy = m_sensor->set_attribute(ob, attr, value, len);
243 retv_if(m_policy <= OP_ERROR, m_policy);
246 if (m_policy == OP_DEFAULT) {
250 update_attribute(attr, value, len);
255 int external_sensor_handler::get_data(sensor_data_t **data, int *len)
257 return m_sensor->get_data(data, len);
260 int external_sensor_handler::flush(sensor_observer *ob)
262 retv_if(!m_sensor, -EINVAL);
264 m_sensor->flush(this);