4 * Copyright (c) 2013 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_internal.h>
21 #include <sensor_internal_deprecated.h>
22 #include <sensor_types.h>
23 #include <sensor_types_private.h>
24 #include <sensor_utils.h>
26 #include <channel_handler.h>
27 #include <sensor_manager.h>
28 #include <sensor_listener.h>
29 #include <sensor_provider.h>
30 #include <sensor_log.h>
31 #include <unordered_map>
35 #include <command_types.h>
37 #include "sensor_reader.h"
39 #define CONVERT_OPTION_TO_PAUSE_POLICY(option) ((option) ^ 0b11)
40 #define MAX_LISTENER 100
42 using namespace sensor;
53 typedef GSourceFunc callback_dispatcher_t;
55 static sensor::sensor_manager manager;
56 static std::unordered_map<int, sensor::sensor_listener *> listeners;
59 static gboolean sensor_events_callback_dispatcher(gpointer data)
62 callback_info_s *info = (callback_info_s *)data;
67 event_type = CONVERT_TYPE_EVENT(info->sensor->get_type());
69 if (info->cb && info->sensor && listeners.find(info->listener_id) != listeners.end()) {
70 size_t element_size = sizeof(sensor_data_t);
71 size_t count = info->data_size / element_size;
72 ((sensor_events_cb_t)info->cb)(info->sensor, event_type, (sensor_data_t*)info->data, count, info->user_data);
80 static gboolean sensor_event_callback_dispatcher(gpointer data)
83 callback_info_s *info = (callback_info_s *)data;
88 event_type = CONVERT_TYPE_EVENT(info->sensor->get_type());
90 if (info->cb && info->sensor && listeners.find(info->listener_id) != listeners.end()) {
91 ((sensor_cb_t)info->cb)(info->sensor, event_type, (sensor_data_t*)info->data, info->user_data);
99 static gboolean sensor_accuracy_changed_callback_dispatcher(gpointer data)
101 callback_info_s *info = (callback_info_s *)data;
105 if (info->cb && info->sensor && listeners.find(info->listener_id) != listeners.end()) {
106 sensor_data_t * data = (sensor_data_t *)info->data;
107 ((sensor_accuracy_changed_cb_t)info->cb)(info->sensor, data->timestamp, data->accuracy, info->user_data);
110 delete [] info->data;
115 static gboolean sensor_attribute_int_changed_callback_dispatcher(gpointer data)
117 callback_info_s *info = (callback_info_s *)data;
121 if (info->cb && info->sensor && listeners.find(info->listener_id) != listeners.end()) {
122 cmd_listener_attr_int_t *d = (cmd_listener_attr_int_t *)info->data;
123 ((sensor_attribute_int_changed_cb_t)info->cb)(info->sensor, d->attribute, d->value, info->user_data);
126 delete [] info->data;
131 static gboolean sensor_attribute_str_changed_callback_dispatcher(gpointer data)
133 callback_info_s *info = (callback_info_s *)data;
137 if (info->cb && info->sensor && listeners.find(info->listener_id) != listeners.end()) {
138 cmd_listener_attr_str_t *d = (cmd_listener_attr_str_t *)info->data;
139 ((sensor_attribute_str_changed_cb_t)info->cb)(info->sensor, d->attribute, d->value, d->len, info->user_data);
142 delete [] info->data;
147 class sensor_listener_channel_handler : public ipc::channel_handler
150 sensor_listener_channel_handler(int id, sensor_t sensor, void* cb, void *user_data, callback_dispatcher_t dispatcher)
152 , m_sensor(reinterpret_cast<sensor_info *>(sensor))
154 , m_user_data(user_data)
155 , m_dispatcher(dispatcher)
158 void connected(ipc::channel *ch) {}
159 void disconnected(ipc::channel *ch) {}
160 void read(ipc::channel *ch, ipc::message &msg)
162 callback_info_s *info;
163 auto size = msg.size();
164 char *data = new(std::nothrow) char[size];
166 memcpy(data, msg.body(), size);
168 info = new(std::nothrow) callback_info_s();
169 info->listener_id = m_listener_id;
171 info->sensor = m_sensor;
173 info->data_size = size;
174 info->user_data = m_user_data;
176 g_idle_add(m_dispatcher, info);
179 void read_complete(ipc::channel *ch) {}
180 void error_caught(ipc::channel *ch, int error) {}
184 sensor_info *m_sensor;
187 callback_dispatcher_t m_dispatcher;
192 * 1. power save option / lcd vconf : move to server
193 * 2. thread-safe : ipc_client
196 API int sensord_get_sensors(sensor_type_t type, sensor_t **list, int *count)
198 return sensord_get_sensors_by_uri(utils::get_uri(type), list, count);
201 API int sensord_get_default_sensor(sensor_type_t type, sensor_t *sensor)
203 return sensord_get_default_sensor_by_uri(utils::get_uri(type), sensor);
206 API bool sensord_get_type(sensor_t sensor, sensor_type_t *type)
208 retvm_if(!type, false, "Invalid type");
209 retvm_if(!manager.connect(), false, "Failed to connect");
210 retvm_if(!manager.is_supported(sensor), false,
211 "Invalid sensor[%p]", sensor);
213 *type = static_cast<sensor_info *>(sensor)->get_type();
218 API const char* sensord_get_uri(sensor_t sensor)
220 retvm_if(!manager.connect(), NULL, "Failed to connect");
221 retvm_if(!manager.is_supported(sensor), NULL,
222 "Invalid sensor[%p]", sensor);
224 return static_cast<sensor_info *>(sensor)->get_uri().c_str();
227 API const char* sensord_get_name(sensor_t sensor)
229 retvm_if(!manager.connect(), NULL, "Failed to connect");
230 retvm_if(!manager.is_supported(sensor), NULL,
231 "Invalid sensor[%p]", sensor);
233 return static_cast<sensor_info *>(sensor)->get_model().c_str();
236 API const char* sensord_get_vendor(sensor_t sensor)
238 retvm_if(!manager.connect(), NULL, "Failed to connect");
239 retvm_if(!manager.is_supported(sensor), NULL,
240 "Invalid sensor[%p]", sensor);
242 return static_cast<sensor_info *>(sensor)->get_vendor().c_str();
245 API bool sensord_get_min_range(sensor_t sensor, float *min_range)
247 retvm_if(!min_range, false, "Invalid paramter");
248 retvm_if(!manager.connect(), false, "Failed to connect");
249 retvm_if(!manager.is_supported(sensor), false,
250 "Invalid sensor[%p]", sensor);
252 *min_range = static_cast<sensor_info *>(sensor)->get_min_range();
257 API bool sensord_get_max_range(sensor_t sensor, float *max_range)
259 retvm_if(!max_range, false, "Invalid parameter");
260 retvm_if(!manager.connect(), false, "Failed to connect");
261 retvm_if(!manager.is_supported(sensor), false,
262 "Invalid sensor[%p]", sensor);
264 *max_range = static_cast<sensor_info *>(sensor)->get_max_range();
269 API bool sensord_get_resolution(sensor_t sensor, float *resolution)
271 retvm_if(!resolution, false, "Invalid parameter");
272 retvm_if(!manager.connect(), false, "Failed to connect");
273 retvm_if(!manager.is_supported(sensor), false,
274 "Invalid sensor[%p]", sensor);
276 *resolution = static_cast<sensor_info *>(sensor)->get_resolution();
281 API bool sensord_get_min_interval(sensor_t sensor, int *min_interval)
283 retvm_if(!min_interval, false, "Invalid parameter");
284 retvm_if(!manager.connect(), false, "Failed to connect");
285 retvm_if(!manager.is_supported(sensor), false,
286 "Invalid sensor[%p]", sensor);
288 *min_interval = static_cast<sensor_info *>(sensor)->get_min_interval();
293 API bool sensord_get_fifo_count(sensor_t sensor, int *fifo_count)
295 retvm_if(!fifo_count, false, "Invalid parameter");
296 retvm_if(!manager.connect(), false, "Failed to connect");
297 retvm_if(!manager.is_supported(sensor), false,
298 "Invalid sensor[%p]", sensor);
305 API bool sensord_get_max_batch_count(sensor_t sensor, int *max_batch_count)
307 retvm_if(!max_batch_count, false, "Invalid parameter");
308 retvm_if(!manager.connect(), false, "Failed to connect");
309 retvm_if(!manager.is_supported(sensor), false,
310 "Invalid sensor[%p]", sensor);
312 *max_batch_count = static_cast<sensor_info *>(sensor)->get_max_batch_count();
317 API bool sensord_is_wakeup_supported(sensor_t sensor)
319 retvm_if(!manager.connect(), false, "Failed to connect");
320 retvm_if(!manager.is_supported(sensor), false,
321 "Invalid sensor[%p]", sensor);
323 return static_cast<sensor_info *>(sensor)->is_wakeup_supported();
326 API int sensord_connect(sensor_t sensor)
330 retvm_if(!manager.connect(), -EIO, "Failed to connect");
331 retvm_if(!manager.is_supported(sensor), -EINVAL,
332 "Invalid sensor[%p]", sensor);
333 retvm_if(listeners.size() > MAX_LISTENER, -EPERM, "Exceeded the maximum listener");
335 sensor::sensor_listener *listener;
336 static sensor_reader reader;
338 listener = new(std::nothrow) sensor::sensor_listener(sensor, reader.get_event_loop());
339 retvm_if(!listener, -ENOMEM, "Failed to allocate memory");
341 listeners[listener->get_id()] = listener;
343 _D("Connect[%d]", listener->get_id());
345 return listener->get_id();
348 API bool sensord_disconnect(int handle)
350 sensor::sensor_listener *listener;
354 auto it = listeners.find(handle);
355 retvm_if(it == listeners.end(), false, "Invalid handle[%d]", handle);
357 listener = it->second;
358 retvm_if(!listener, false, "Invalid handle[%d]", handle);
360 _D("Disconnect[%d]", listener->get_id());
363 listeners.erase(handle);
368 static inline bool sensord_register_event_impl(int handle, unsigned int event_type,
369 unsigned int interval, unsigned int max_batch_latency, void* cb, bool is_events_callback, void *user_data)
371 sensor::sensor_listener *listener;
373 int prev_max_batch_latency;
374 sensor_listener_channel_handler *handler;
378 auto it = listeners.find(handle);
379 retvm_if(it == listeners.end(), false, "Invalid handle[%d]", handle);
381 listener = it->second;
383 prev_interval = listener->get_interval();
384 prev_max_batch_latency = listener->get_max_batch_latency();
386 if (listener->set_interval(interval) < 0) {
387 _E("Failed to set interval");
391 if (listener->set_max_batch_latency(max_batch_latency) < 0) {
392 listener->set_interval(prev_interval);
393 _E("Failed to set max_batch_latency");
397 if (is_events_callback) {
398 handler = new(std::nothrow)sensor_listener_channel_handler(handle, listener->get_sensor(), (void *)cb, user_data, sensor_events_callback_dispatcher);
400 handler = new(std::nothrow)sensor_listener_channel_handler(handle, listener->get_sensor(), (void *)cb, user_data, sensor_event_callback_dispatcher);
404 listener->set_max_batch_latency(prev_max_batch_latency);
405 listener->set_interval(prev_interval);
406 _E("Failed to allocate memory");
410 listener->set_event_handler(handler);
412 _D("Register event[%d]", listener->get_id());
417 API bool sensord_register_event(int handle, unsigned int event_type,
418 unsigned int interval, unsigned int max_batch_latency, sensor_cb_t cb, void *user_data)
420 return sensord_register_event_impl(handle, event_type, interval, max_batch_latency, (void*)cb, false, user_data);
423 static inline bool sensord_unregister_event_imple(int handle)
425 sensor::sensor_listener *listener;
429 auto it = listeners.find(handle);
430 retvm_if(it == listeners.end(), false, "Invalid handle[%d]", handle);
432 listener = it->second;
434 listener->unset_event_handler();
436 _D("Unregister event[%d]", listener->get_id());
441 API bool sensord_unregister_event(int handle, unsigned int event_type)
443 return sensord_unregister_event_imple(handle);
446 API bool sensord_register_events(int handle, unsigned int event_type, unsigned int max_batch_latency, sensor_events_cb_t cb, void *user_data)
448 return sensord_register_event_impl(handle, event_type, 0, max_batch_latency, (void*)cb, true, user_data);
451 API bool sensord_unregister_events(int handle, unsigned int event_type)
453 return sensord_unregister_event_imple(handle);
456 API bool sensord_register_accuracy_cb(int handle, sensor_accuracy_changed_cb_t cb, void *user_data)
458 sensor::sensor_listener *listener;
459 sensor_listener_channel_handler *handler;
463 auto it = listeners.find(handle);
464 retvm_if(it == listeners.end(), false, "Invalid handle[%d]", handle);
466 listener = it->second;
468 handler = new(std::nothrow) sensor_listener_channel_handler(handle, listener->get_sensor(), (void *)cb, user_data, sensor_accuracy_changed_callback_dispatcher);
469 retvm_if(!handler, false, "Failed to allocate memory");
471 listener->set_accuracy_handler(handler);
476 API bool sensord_unregister_accuracy_cb(int handle)
478 sensor::sensor_listener *listener;
482 auto it = listeners.find(handle);
483 retvm_if(it == listeners.end(), false, "Invalid handle[%d]", handle);
485 listener = it->second;
487 listener->unset_accuracy_handler();
492 API bool sensord_register_attribute_int_changed_cb(int handle, sensor_attribute_int_changed_cb_t cb, void *user_data)
494 sensor::sensor_listener *listener;
495 sensor_listener_channel_handler *handler;
499 auto it = listeners.find(handle);
500 retvm_if(it == listeners.end(), false, "Invalid handle[%d]", handle);
502 listener = it->second;
504 handler = new(std::nothrow) sensor_listener_channel_handler(handle, listener->get_sensor(), (void *)cb, user_data, sensor_attribute_int_changed_callback_dispatcher);
505 retvm_if(!handler, false, "Failed to allocate memory");
507 listener->set_attribute_int_changed_handler(handler);
512 API bool sensord_unregister_attribute_int_changed_cb(int handle)
514 sensor::sensor_listener *listener;
518 auto it = listeners.find(handle);
519 retvm_if(it == listeners.end(), false, "Invalid handle[%d]", handle);
521 listener = it->second;
523 listener->unset_attribute_int_changed_handler();
528 API bool sensord_register_attribute_str_changed_cb(int handle, sensor_attribute_str_changed_cb_t cb, void *user_data)
530 sensor::sensor_listener *listener;
531 sensor_listener_channel_handler *handler;
535 auto it = listeners.find(handle);
536 retvm_if(it == listeners.end(), false, "Invalid handle[%d]", handle);
538 listener = it->second;
540 handler = new(std::nothrow) sensor_listener_channel_handler(handle, listener->get_sensor(), (void *)cb, user_data, sensor_attribute_str_changed_callback_dispatcher);
541 retvm_if(!handler, false, "Failed to allocate memory");
543 listener->set_attribute_str_changed_handler(handler);
548 API bool sensord_unregister_attribute_str_changed_cb(int handle)
550 sensor::sensor_listener *listener;
554 auto it = listeners.find(handle);
555 retvm_if(it == listeners.end(), false, "Invalid handle[%d]", handle);
557 listener = it->second;
559 listener->unset_attribute_str_changed_handler();
564 API bool sensord_start(int handle, int option)
566 sensor::sensor_listener *listener;
569 int interval, batch_latency;
573 auto it = listeners.find(handle);
574 retvm_if(it == listeners.end(), false, "Invalid handle[%d]", handle);
576 listener = it->second;
578 pause = CONVERT_OPTION_TO_PAUSE_POLICY(option);
579 prev_pause = listener->get_pause_policy();
581 if (listener->set_attribute(SENSORD_ATTRIBUTE_PAUSE_POLICY, pause) < 0) {
582 _E("Failed to set pause policy[%d]", pause);
586 if (listener->start() < 0) {
587 listener->set_attribute(SENSORD_ATTRIBUTE_PAUSE_POLICY, prev_pause);
588 _E("Failed to start listener");
592 interval = listener->get_interval();
594 listener->set_interval(interval);
596 batch_latency = listener->get_max_batch_latency();
597 listener->set_max_batch_latency(batch_latency);
599 _D("Start[%d] with the interval[%d] batch_latency[%d]",
600 listener->get_id(), interval, batch_latency);
605 API bool sensord_stop(int handle)
608 sensor::sensor_listener *listener;
612 auto it = listeners.find(handle);
613 retvm_if(it == listeners.end(), false, "Invalid handle[%d]", handle);
615 listener = it->second;
617 ret = listener->stop();
619 if (ret == -EAGAIN || ret == OP_SUCCESS)
622 _D("Stop[%d]", listener->get_id());
627 API bool sensord_change_event_interval(int handle, unsigned int event_type, unsigned int interval)
629 sensor::sensor_listener *listener;
633 auto it = listeners.find(handle);
634 retvm_if(it == listeners.end(), false, "Invalid handle[%d]", handle);
636 listener = it->second;
638 if (listener->set_interval(interval) < 0) {
639 _E("Failed to set interval to listener");
643 _D("Set interval[%d, %d]", listener->get_id(), interval);
648 API bool sensord_change_event_max_batch_latency(int handle, unsigned int event_type, unsigned int max_batch_latency)
650 sensor::sensor_listener *listener;
654 auto it = listeners.find(handle);
655 retvm_if(it == listeners.end(), false, "Invalid handle[%d]", handle);
657 listener = it->second;
659 if (listener->set_max_batch_latency(max_batch_latency) < 0) {
660 _E("Failed to set max_batch_latency to listener");
664 _D("Set max batch latency[%d, %u]", listener->get_id(), max_batch_latency);
669 API bool sensord_set_option(int handle, int option)
671 sensor::sensor_listener *listener;
676 auto it = listeners.find(handle);
677 retvm_if(it == listeners.end(), false, "Invalid handle[%d]", handle);
679 listener = it->second;
681 pause = CONVERT_OPTION_TO_PAUSE_POLICY(option);
683 if (listener->set_attribute(SENSORD_ATTRIBUTE_PAUSE_POLICY, pause) < 0) {
684 _E("Failed to set option[%d(%d)] to listener", option, pause);
688 _D("Set pause option[%d, %d]", listener->get_id(), pause);
693 API int sensord_set_attribute_int(int handle, int attribute, int value)
695 sensor::sensor_listener *listener;
697 auto it = listeners.find(handle);
698 retvm_if(it == listeners.end(), -EINVAL, "Invalid handle[%d]", handle);
700 listener = it->second;
702 if (listener->set_attribute(attribute, value) < 0) {
703 _E("Failed to set attribute[%d, %d]", attribute, value);
707 _D("Set attribute[%d, %d, %d]", listener->get_id(), attribute, value);
712 API int sensord_get_attribute_int(int handle, int attribute, int* value)
714 sensor::sensor_listener *listener;
716 auto it = listeners.find(handle);
717 retvm_if(it == listeners.end(), -EINVAL, "Invalid handle[%d]", handle);
719 listener = it->second;
721 if (listener->get_attribute(attribute, value) < 0) {
722 _E("Failed to get attribute[%d]", attribute);
726 _D("Get attribute[%d, %d, %d]", listener->get_id(), attribute, *value);
731 API int sensord_set_attribute_str(int handle, int attribute, const char *value, int len)
733 sensor::sensor_listener *listener;
735 auto it = listeners.find(handle);
736 retvm_if(it == listeners.end(), -EINVAL, "Invalid handle[%d]", handle);
738 listener = it->second;
740 if (listener->set_attribute(attribute, value, len) < 0) {
741 _E("Failed to set attribute[%d, %s]", attribute, value);
744 _D("Set attribute ID[%d], attr[%d], len[%d]", listener->get_id(), attribute, len);
749 API int sensord_get_attribute_str(int handle, int attribute, char **value, int* len)
751 sensor::sensor_listener *listener;
753 auto it = listeners.find(handle);
754 retvm_if(it == listeners.end(), -EINVAL, "Invalid handle[%d]", handle);
756 listener = it->second;
758 if (listener->get_attribute(attribute, value, len) < 0) {
759 _E("Failed to get attribute[%d]", attribute);
762 _D("Get attribute ID[%d], attr[%d], len[%d]", listener->get_id(), attribute, *len);
767 API bool sensord_get_data(int handle, unsigned int data_id, sensor_data_t* sensor_data)
769 sensor::sensor_listener *listener;
773 auto it = listeners.find(handle);
774 retvm_if(it == listeners.end(), false, "Invalid handle[%d]", handle);
776 listener = it->second;
778 if (listener->get_sensor_data(sensor_data) < 0) {
779 _E("Failed to get sensor data from listener");
786 API bool sensord_get_data_list(int handle, unsigned int data_id, sensor_data_t** sensor_data, int* count)
788 sensor::sensor_listener *listener;
792 auto it = listeners.find(handle);
793 retvm_if(it == listeners.end(), false, "Invalid handle[%d]", handle);
795 listener = it->second;
797 if (listener->get_sensor_data_list(sensor_data, count) < 0) {
798 _E("Failed to get sensor data from listener");
805 API bool sensord_flush(int handle)
807 sensor::sensor_listener *listener;
811 auto it = listeners.find(handle);
812 retvm_if(it == listeners.end(), false, "Invalid handle[%d]", handle);
814 listener = it->second;
816 if (listener->flush() < 0) {
817 _E("Failed to flush sensor");
824 API bool sensord_set_passive_mode(int handle, bool passive)
826 sensor::sensor_listener *listener;
830 auto it = listeners.find(handle);
831 retvm_if(it == listeners.end(), false, "Invalid handle[%d]", handle);
833 listener = it->second;
835 if (listener->set_passive_mode(passive) < 0) {
836 _E("Failed to set passive mode");
843 /* Sensor Internal API using URI */
844 API int sensord_get_default_sensor_by_uri(const char *uri, sensor_t *sensor)
846 retvm_if(!sensor, -EINVAL, "Invalid parameter");
847 retvm_if(!manager.connect(), -EIO, "Failed to connect");
849 return manager.get_sensor(uri, sensor);
852 API int sensord_get_sensors_by_uri(const char *uri, sensor_t **list, int *count)
854 retvm_if((!list || !count), -EINVAL, "Invalid parameter");
855 retvm_if(!manager.connect(), -EIO, "Failed to connect");
857 return manager.get_sensors(uri, list, count);
860 API int sensord_add_sensor_added_cb(sensord_added_cb callback, void *user_data)
862 retvm_if(!callback, -EINVAL, "Invalid paramter");
863 retvm_if(!manager.connect(), -EIO, "Failed to connect");
865 manager.add_sensor_added_cb(callback, user_data);
869 API int sensord_remove_sensor_added_cb(sensord_added_cb callback)
871 retvm_if(!callback, -EINVAL, "Invalid paramter");
872 retvm_if(!manager.connect(), -EIO, "Failed to connect");
874 manager.remove_sensor_added_cb(callback);
878 API int sensord_add_sensor_removed_cb(sensord_removed_cb callback, void *user_data)
880 retvm_if(!callback, -EINVAL, "Invalid paramter");
881 retvm_if(!manager.connect(), -EIO, "Failed to connect");
883 manager.add_sensor_removed_cb(callback, user_data);
887 API int sensord_remove_sensor_removed_cb(sensord_removed_cb callback)
889 retvm_if(!callback, -EINVAL, "Invalid paramter");
890 retvm_if(!manager.connect(), -EIO, "Failed to connect");
892 manager.remove_sensor_removed_cb(callback);
896 /* Sensor provider */
897 API int sensord_create_provider(const char *uri, sensord_provider_h *provider)
899 retvm_if(!provider, -EINVAL, "Invalid paramter");
901 std::string str_uri(uri);
902 retvm_if(str_uri.find(PREDEFINED_TYPE_URI) != std::string::npos,
903 -EINVAL, "Invalid URI format[%s]", uri);
905 static std::regex uri_regex(SENSOR_URI_REGEX, std::regex::optimize);
906 retvm_if(!std::regex_match(uri, uri_regex),
907 -EINVAL, "Invalid URI format[%s]", uri);
911 p = new(std::nothrow) sensor_provider(uri);
912 retvm_if(!p, -ENOMEM, "Failed to allocate memory");
914 *provider = static_cast<sensord_provider_h>(p);
918 API int sensord_destroy_provider(sensord_provider_h provider)
920 retvm_if(!provider, -EINVAL, "Invalid paramter");
922 delete static_cast<sensor::sensor_provider *>(provider);
926 API int sensord_add_provider(sensord_provider_h provider)
928 retvm_if(!provider, -EINVAL, "Invalid paramter");
929 retvm_if(!manager.connect(), -EIO, "Failed to connect");
932 sensor_provider *p = static_cast<sensor_provider *>(provider);
935 retv_if(ret < 0, ret);
937 ret = manager.add_sensor(p);
946 API int sensord_remove_provider(sensord_provider_h provider)
948 retvm_if(!provider, -EINVAL, "Invalid paramter");
949 retvm_if(!manager.connect(), -EIO, "Failed to connect");
952 sensor_provider *p = static_cast<sensor_provider *>(provider);
954 if (!p->disconnect())
957 ret = manager.remove_sensor(p);
966 API int sensord_provider_set_name(sensord_provider_h provider, const char *name)
968 retvm_if(!provider, -EINVAL, "Invalid paramter");
970 sensor_provider *p = static_cast<sensor_provider *>(provider);
972 sensor_info *info = p->get_sensor_info();
973 info->set_model(name);
978 API int sensord_provider_set_vendor(sensord_provider_h provider, const char *vendor)
980 retvm_if(!provider, -EINVAL, "Invalid paramter");
982 sensor_provider *p = static_cast<sensor_provider *>(provider);
984 sensor_info *info = p->get_sensor_info();
985 info->set_vendor(vendor);
990 API int sensord_provider_set_range(sensord_provider_h provider, float min_range, float max_range)
992 retvm_if(!provider, -EINVAL, "Invalid paramter");
994 sensor_provider *p = static_cast<sensor_provider *>(provider);
996 sensor_info *info = p->get_sensor_info();
997 info->set_min_range(min_range);
998 info->set_max_range(max_range);
1003 API int sensord_provider_set_resolution(sensord_provider_h provider, float resolution)
1005 retvm_if(!provider, -EINVAL, "Invalid paramter");
1007 sensor_provider *p = static_cast<sensor_provider *>(provider);
1009 sensor_info *info = p->get_sensor_info();
1010 info->set_resolution(resolution);
1015 API int sensord_provider_set_start_cb(sensord_provider_h provider, sensord_provider_start_cb callback, void *user_data)
1017 retvm_if(!provider, -EINVAL, "Invalid paramter");
1018 retvm_if(!callback, -EINVAL, "Invalid paramter");
1020 sensor_provider *p = static_cast<sensor_provider *>(provider);
1022 p->set_start_cb(callback, user_data);
1027 API int sensord_provider_set_stop_cb(sensord_provider_h provider, sensord_provider_stop_cb callback, void *user_data)
1029 retvm_if(!provider, -EINVAL, "Invalid paramter");
1030 retvm_if(!callback, -EINVAL, "Invalid paramter");
1032 sensor_provider *p = static_cast<sensor_provider *>(provider);
1034 p->set_stop_cb(callback, user_data);
1039 API int sensord_provider_set_interval_changed_cb(sensord_provider_h provider, sensord_provider_interval_changed_cb callback, void *user_data)
1041 retvm_if(!provider, -EINVAL, "Invalid paramter");
1042 retvm_if(!callback, -EINVAL, "Invalid paramter");
1044 sensor_provider *p = static_cast<sensor_provider *>(provider);
1046 p->set_interval_cb(callback, user_data);
1051 API int sensord_provider_set_attribute_str_cb(sensord_provider_h provider, sensord_provider_attribute_str_cb callback, void *user_data)
1053 retvm_if(!provider, -EINVAL, "Invalid paramter");
1054 retvm_if(!callback, -EINVAL, "Invalid paramter");
1056 sensor_provider *p = static_cast<sensor_provider *>(provider);
1058 p->set_attribute_str_cb(callback, user_data);
1063 API int sensord_provider_publish(sensord_provider_h provider, sensor_data_t data)
1065 retvm_if(!provider, -EINVAL, "Invalid paramter");
1067 sensor_provider *p = static_cast<sensor_provider *>(provider);
1069 /* TODO: synchronous call is enough? */
1070 return p->publish(data);
1073 API int sensord_provider_publish_events(sensord_provider_h provider, sensor_data_t events[], int count)
1075 retvm_if(!provider, -EINVAL, "Invalid paramter");
1077 sensor_provider *p = static_cast<sensor_provider *>(provider);
1079 return p->publish(events, count);
1083 API sensor_t sensord_get_sensor(sensor_type_t type)
1087 if (sensord_get_default_sensor(type, &sensor) < 0)
1094 API bool sensord_get_sensor_list(sensor_type_t type, sensor_t **list, int *sensor_count)
1096 return (sensord_get_sensors(type, list, sensor_count) == OP_SUCCESS);
1100 API bool sensord_register_hub_event(int handle, unsigned int event_type,
1101 unsigned int interval, unsigned int max_batch_latency, sensorhub_cb_t cb, void *user_data)
1107 API bool sensord_get_supported_event_types(sensor_t sensor, unsigned int **event_types, int *count)
1110 * 1. check parameter
1111 * 2. if there is no sensor, return false
1112 * 3. memory allocation
1117 /* deprecated(BUT it is used in C-API....) */
1118 API bool sensord_is_supported_event_type(sensor_t sensor, unsigned int event_type, bool *supported)
1120 if (!manager.is_supported(sensor))
1129 API bool sensord_send_sensorhub_data(int handle, const char *data, int data_len)
1131 return (sensord_set_attribute_str(handle, 0, data, data_len) == OP_SUCCESS);
1135 API bool sensord_send_command(int handle, const char *command, int command_len)
1137 return (sensord_set_attribute_str(handle, 0, command, command_len) == OP_SUCCESS);
1141 API bool sensord_get_privilege(sensor_t sensor, sensor_privilege_t *privilege)
1143 *privilege = SENSOR_PRIVILEGE_PUBLIC;
1149 API int sensord_external_connect(const char *key, sensor_external_command_cb_t cb, void *user_data)
1152 * 1. check parameter
1153 * 2. create handle in this client
1154 * 3. first connection(client)
1155 * 4. cmd_connect for external sensor with key
1157 retvm_if(!key, -EINVAL, "Invalid key");
1162 API bool sensord_external_disconnect(int handle)
1165 * 1. check parameter
1166 * 2. create handle in this client
1167 * 3. first connection(client)
1168 * 4. cmd_connect for external sensor with key
1169 * 5. disconnect this handle
1170 * 6. if there is no active sensor, remove client id and stop listener
1176 API bool sensord_external_post(int handle, unsigned long long timestamp, const float* data, int data_cnt)
1179 * 1. check parameter
1180 * 1.1 (data_cnt <= 0) || (data_cnt > POST_DATA_LEN_MAX)), return false