4 * Copyright (c) 2014 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 <sensor_base.h>
24 #define UNKNOWN_NAME "UNKNOWN_SENSOR"
26 sensor_base::sensor_base()
27 : m_privilege(SENSOR_PRIVILEGE_PUBLIC)
28 , m_permission(SENSOR_PERMISSION_STANDARD)
35 sensor_base::~sensor_base()
40 bool sensor_base::init()
45 bool sensor_base::is_virtual()
50 void sensor_base::set_id(sensor_id_t id)
55 sensor_id_t sensor_base::get_id(void)
60 sensor_privilege_t sensor_base::get_privilege(void)
65 int sensor_base::get_permission(void)
71 void sensor_base::set_privilege(sensor_privilege_t privilege)
73 m_privilege = privilege;
76 void sensor_base::set_permission(int permission)
78 m_permission = permission;
82 sensor_type_t sensor_base::get_type()
84 return UNKNOWN_SENSOR;
87 const char* sensor_base::get_name()
92 return m_name.c_str();
95 bool sensor_base::on_start()
100 bool sensor_base::on_stop()
105 bool sensor_base::start()
108 AUTOLOCK(m_client_mutex);
114 ERR("[%s] sensor failed to start", get_name());
121 INFO("[%s] sensor started, #client = %d", get_name(), m_client);
126 bool sensor_base::stop(void)
129 AUTOLOCK(m_client_mutex);
135 ERR("[%s] sensor faild to stop", get_name());
142 INFO("[%s] sensor stopped, #client = %d", get_name(), m_client);
148 bool sensor_base::is_started(void)
151 AUTOLOCK(m_client_mutex);
156 bool sensor_base::add_client(unsigned int event_type)
158 if (!is_supported(event_type)) {
159 ERR("Invaild event type: 0x%x", event_type);
163 AUTOLOCK(m_client_info_mutex);
165 ++(m_client_info[event_type]);
169 bool sensor_base::delete_client(unsigned int event_type)
171 if (!is_supported(event_type)) {
172 ERR("Invaild event type: 0x%x", event_type);
176 AUTOLOCK(m_client_info_mutex);
178 auto iter = m_client_info.find(event_type);
180 if (iter == m_client_info.end())
183 if (iter->second == 0)
191 bool sensor_base::add_interval(int client_id, unsigned int interval, bool is_processor)
193 unsigned int prev_min, cur_min;
195 AUTOLOCK(m_interval_info_list_mutex);
197 prev_min = m_interval_info_list.get_min();
199 if (!m_interval_info_list.add_interval(client_id, interval, is_processor))
202 cur_min = m_interval_info_list.get_min();
204 if (cur_min != prev_min) {
205 INFO("Min interval for sensor[0x%x] is changed from %dms to %dms"
206 " by%sclient[%d] adding interval",
207 get_type(), prev_min, cur_min,
208 is_processor ? " processor " : " ", client_id);
209 set_interval(cur_min);
215 bool sensor_base::delete_interval(int client_id, bool is_processor)
217 unsigned int prev_min, cur_min;
218 AUTOLOCK(m_interval_info_list_mutex);
220 prev_min = m_interval_info_list.get_min();
222 if (!m_interval_info_list.delete_interval(client_id, is_processor))
225 cur_min = m_interval_info_list.get_min();
228 INFO("No interval for sensor[0x%x] by%sclient[%d] deleting interval, "
229 "so set to default %dms",
230 get_type(), is_processor ? " processor " : " ",
231 client_id, POLL_1HZ_MS);
233 set_interval(POLL_1HZ_MS);
234 } else if (cur_min != prev_min) {
235 INFO("Min interval for sensor[0x%x] is changed from %dms to %dms"
236 " by%sclient[%d] deleting interval",
237 get_type(), prev_min, cur_min,
238 is_processor ? " processor " : " ", client_id);
240 set_interval(cur_min);
246 unsigned int sensor_base::get_interval(int client_id, bool is_processor)
248 AUTOLOCK(m_interval_info_list_mutex);
250 return m_interval_info_list.get_interval(client_id, is_processor);
253 void sensor_base::get_sensor_info(sensor_info &info)
255 sensor_properties_s properties;
256 get_properties(properties);
258 info.set_type(get_type());
259 info.set_id(get_id());
260 info.set_privilege(m_privilege);
261 info.set_name(properties.name.c_str());
262 info.set_vendor(properties.vendor.c_str());
263 info.set_min_range(properties.min_range);
264 info.set_max_range(properties.max_range);
265 info.set_resolution(properties.resolution);
266 info.set_min_interval(properties.min_interval);
267 info.set_fifo_count(properties.fifo_count);
268 info.set_max_batch_count(properties.max_batch_count);
269 info.set_supported_events(m_supported_event_info);
274 bool sensor_base::get_properties(sensor_properties_s &properties)
279 bool sensor_base::is_supported(unsigned int event_type)
281 auto iter = find(m_supported_event_info.begin(), m_supported_event_info.end(), event_type);
283 if (iter == m_supported_event_info.end())
289 long sensor_base::set_command(unsigned int cmd, long value)
294 int sensor_base::send_sensorhub_data(const char* data, int data_len)
299 int sensor_base::get_sensor_data(unsigned int type, sensor_data_t &data)
304 void sensor_base::register_supported_event(unsigned int event_type)
306 m_supported_event_info.push_back(event_type);
309 unsigned int sensor_base::get_client_cnt(unsigned int event_type)
311 AUTOLOCK(m_client_info_mutex);
313 auto iter = m_client_info.find(event_type);
315 if (iter == m_client_info.end())
321 bool sensor_base::set_interval(unsigned long val)
326 unsigned long long sensor_base::get_timestamp(void)
329 clock_gettime(CLOCK_MONOTONIC, &t);
330 return ((unsigned long long)(t.tv_sec)*1000000000LL + t.tv_nsec) / 1000;
333 unsigned long long sensor_base::get_timestamp(timeval *t)
340 return ((unsigned long long)(t->tv_sec)*1000000LL +t->tv_usec);