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
41 #define MAX_PROVIDER 20
43 using namespace sensor;
54 typedef GSourceFunc callback_dispatcher_t;
56 static sensor::sensor_manager manager;
57 static std::unordered_map<int, sensor::sensor_listener *> listeners;
59 static uint providerCnt = 0;
61 static gboolean sensor_events_callback_dispatcher(gpointer data)
64 callback_info_s *info = (callback_info_s *)data;
69 event_type = CONVERT_TYPE_EVENT(info->sensor->get_type());
71 if (info->cb && info->sensor && listeners.find(info->listener_id) != listeners.end()) {
72 size_t element_size = sizeof(sensor_data_t);
73 size_t count = info->data_size / element_size;
74 ((sensor_events_cb_t)info->cb)(info->sensor, event_type, (sensor_data_t*)info->data, count, info->user_data);
82 static gboolean sensor_event_callback_dispatcher(gpointer data)
85 callback_info_s *info = (callback_info_s *)data;
90 event_type = CONVERT_TYPE_EVENT(info->sensor->get_type());
92 if (info->cb && info->sensor && listeners.find(info->listener_id) != listeners.end()) {
93 ((sensor_cb_t)info->cb)(info->sensor, event_type, (sensor_data_t*)info->data, info->user_data);
101 static gboolean sensor_accuracy_changed_callback_dispatcher(gpointer data)
103 callback_info_s *info = (callback_info_s *)data;
107 if (info->cb && info->sensor && listeners.find(info->listener_id) != listeners.end()) {
108 sensor_data_t * sensor_data = (sensor_data_t *)info->data;
109 ((sensor_accuracy_changed_cb_t)info->cb)(info->sensor, sensor_data->timestamp, sensor_data->accuracy, info->user_data);
112 delete [] info->data;
117 static gboolean sensor_attribute_int_changed_callback_dispatcher(gpointer data)
119 callback_info_s *info = (callback_info_s *)data;
123 if (info->cb && info->sensor && listeners.find(info->listener_id) != listeners.end()) {
124 cmd_listener_attr_int_t *d = (cmd_listener_attr_int_t *)info->data;
125 ((sensor_attribute_int_changed_cb_t)info->cb)(info->sensor, d->attribute, d->value, info->user_data);
128 delete [] info->data;
133 static gboolean sensor_attribute_str_changed_callback_dispatcher(gpointer data)
135 callback_info_s *info = (callback_info_s *)data;
139 if (info->cb && info->sensor && listeners.find(info->listener_id) != listeners.end()) {
140 cmd_listener_attr_str_t *d = (cmd_listener_attr_str_t *)info->data;
141 ((sensor_attribute_str_changed_cb_t)info->cb)(info->sensor, d->attribute, d->value, d->len, info->user_data);
144 delete [] info->data;
149 class sensor_listener_channel_handler : public ipc::channel_handler
152 sensor_listener_channel_handler(int id, sensor_t sensor, void* cb, void *user_data, callback_dispatcher_t dispatcher)
154 , m_sensor(reinterpret_cast<sensor_info *>(sensor))
156 , m_user_data(user_data)
157 , m_dispatcher(dispatcher)
160 void connected(ipc::channel *ch) {}
161 void disconnected(ipc::channel *ch) {}
162 void read(ipc::channel *ch, ipc::message &msg)
164 callback_info_s *info;
165 auto size = msg.size();
166 char *data = new(std::nothrow) char[size];
169 memcpy(data, msg.body(), size);
171 info = new(std::nothrow) callback_info_s();
172 info->listener_id = m_listener_id;
174 info->sensor = m_sensor;
176 info->data_size = size;
177 info->user_data = m_user_data;
179 g_idle_add(m_dispatcher, info);
182 void read_complete(ipc::channel *ch) {}
183 void error_caught(ipc::channel *ch, int error) {}
184 void set_handler(int num, ipc::channel_handler* handler) {}
185 void disconnect(void) {}
189 sensor_info *m_sensor;
192 callback_dispatcher_t m_dispatcher;
197 * 1. power save option / lcd vconf : move to server
198 * 2. thread-safe : ipc_client
201 API int sensord_get_sensors(sensor_type_t type, sensor_t **list, int *count)
203 return sensord_get_sensors_by_uri(utils::get_uri(type), list, count);
206 API int sensord_get_default_sensor(sensor_type_t type, sensor_t *sensor)
208 return sensord_get_default_sensor_by_uri(utils::get_uri(type), sensor);
211 API bool sensord_get_type(sensor_t sensor, sensor_type_t *type)
213 retvm_if(!type, false, "Invalid type");
214 retvm_if(!manager.connect(), false, "Failed to connect");
215 retvm_if(!manager.is_supported(sensor), false,
216 "Invalid sensor[%p]", sensor);
218 *type = static_cast<sensor_info *>(sensor)->get_type();
223 API const char* sensord_get_uri(sensor_t sensor)
225 retvm_if(!manager.connect(), NULL, "Failed to connect");
226 retvm_if(!manager.is_supported(sensor), NULL,
227 "Invalid sensor[%p]", sensor);
229 return static_cast<sensor_info *>(sensor)->get_uri().c_str();
232 API const char* sensord_get_name(sensor_t sensor)
234 retvm_if(!manager.connect(), NULL, "Failed to connect");
235 retvm_if(!manager.is_supported(sensor), NULL,
236 "Invalid sensor[%p]", sensor);
238 return static_cast<sensor_info *>(sensor)->get_model().c_str();
241 API const char* sensord_get_vendor(sensor_t sensor)
243 retvm_if(!manager.connect(), NULL, "Failed to connect");
244 retvm_if(!manager.is_supported(sensor), NULL,
245 "Invalid sensor[%p]", sensor);
247 return static_cast<sensor_info *>(sensor)->get_vendor().c_str();
250 API bool sensord_get_min_range(sensor_t sensor, float *min_range)
252 retvm_if(!min_range, false, "Invalid paramter");
253 retvm_if(!manager.connect(), false, "Failed to connect");
254 retvm_if(!manager.is_supported(sensor), false,
255 "Invalid sensor[%p]", sensor);
257 *min_range = static_cast<sensor_info *>(sensor)->get_min_range();
262 API bool sensord_get_max_range(sensor_t sensor, float *max_range)
264 retvm_if(!max_range, false, "Invalid parameter");
265 retvm_if(!manager.connect(), false, "Failed to connect");
266 retvm_if(!manager.is_supported(sensor), false,
267 "Invalid sensor[%p]", sensor);
269 *max_range = static_cast<sensor_info *>(sensor)->get_max_range();
274 API bool sensord_get_resolution(sensor_t sensor, float *resolution)
276 retvm_if(!resolution, false, "Invalid parameter");
277 retvm_if(!manager.connect(), false, "Failed to connect");
278 retvm_if(!manager.is_supported(sensor), false,
279 "Invalid sensor[%p]", sensor);
281 *resolution = static_cast<sensor_info *>(sensor)->get_resolution();
286 API bool sensord_get_min_interval(sensor_t sensor, int *min_interval)
288 retvm_if(!min_interval, false, "Invalid parameter");
289 retvm_if(!manager.connect(), false, "Failed to connect");
290 retvm_if(!manager.is_supported(sensor), false,
291 "Invalid sensor[%p]", sensor);
293 *min_interval = static_cast<sensor_info *>(sensor)->get_min_interval();
298 API bool sensord_get_fifo_count(sensor_t sensor, int *fifo_count)
300 retvm_if(!fifo_count, false, "Invalid parameter");
301 retvm_if(!manager.connect(), false, "Failed to connect");
302 retvm_if(!manager.is_supported(sensor), false,
303 "Invalid sensor[%p]", sensor);
310 API bool sensord_get_max_batch_count(sensor_t sensor, int *max_batch_count)
312 retvm_if(!max_batch_count, false, "Invalid parameter");
313 retvm_if(!manager.connect(), false, "Failed to connect");
314 retvm_if(!manager.is_supported(sensor), false,
315 "Invalid sensor[%p]", sensor);
317 *max_batch_count = static_cast<sensor_info *>(sensor)->get_max_batch_count();
322 API bool sensord_is_wakeup_supported(sensor_t sensor)
324 retvm_if(!manager.connect(), false, "Failed to connect");
325 retvm_if(!manager.is_supported(sensor), false,
326 "Invalid sensor[%p]", sensor);
328 return static_cast<sensor_info *>(sensor)->is_wakeup_supported();
331 API int sensord_connect(sensor_t sensor)
335 retvm_if(!manager.connect(), -EIO, "Failed to connect");
336 retvm_if(!manager.is_supported(sensor), -EINVAL,
337 "Invalid sensor[%p]", sensor);
338 retvm_if(listeners.size() > MAX_LISTENER, -EPERM, "Exceeded the maximum listener");
340 sensor::sensor_listener *listener;
341 static sensor_reader reader;
343 listener = new(std::nothrow) sensor::sensor_listener(sensor, reader.get_event_loop());
344 retvm_if(!listener, -ENOMEM, "Failed to allocate memory");
346 listeners[listener->get_id()] = listener;
348 _D("Connect[%d]", listener->get_id());
350 return listener->get_id();
353 API bool sensord_disconnect(int handle)
355 sensor::sensor_listener *listener;
359 auto it = listeners.find(handle);
360 retvm_if(it == listeners.end(), false, "Invalid handle[%d]", handle);
362 listener = it->second;
363 retvm_if(!listener, false, "Invalid handle[%d]", handle);
365 _D("Disconnect[%d]", listener->get_id());
368 listeners.erase(handle);
370 if (listeners.empty())
371 manager.disconnect();
376 static inline bool sensord_register_event_impl(int handle, unsigned int event_type,
377 unsigned int interval, unsigned int max_batch_latency, void* cb, bool is_events_callback, void *user_data)
379 sensor::sensor_listener *listener;
381 int prev_max_batch_latency;
382 sensor_listener_channel_handler *handler;
386 auto it = listeners.find(handle);
387 retvm_if(it == listeners.end(), false, "Invalid handle[%d]", handle);
389 listener = it->second;
391 prev_interval = listener->get_interval();
392 prev_max_batch_latency = listener->get_max_batch_latency();
394 if (listener->set_interval(interval) < 0) {
395 _E("Failed to set interval");
399 if (listener->set_max_batch_latency(max_batch_latency) < 0) {
400 listener->set_interval(prev_interval);
401 _E("Failed to set max_batch_latency");
405 if (is_events_callback) {
406 handler = new(std::nothrow)sensor_listener_channel_handler(handle, listener->get_sensor(), (void *)cb, user_data, sensor_events_callback_dispatcher);
408 handler = new(std::nothrow)sensor_listener_channel_handler(handle, listener->get_sensor(), (void *)cb, user_data, sensor_event_callback_dispatcher);
412 listener->set_max_batch_latency(prev_max_batch_latency);
413 listener->set_interval(prev_interval);
414 _E("Failed to allocate memory");
418 listener->set_event_handler(handler);
420 _D("Register event[%d]", listener->get_id());
425 API bool sensord_register_event(int handle, unsigned int event_type,
426 unsigned int interval, unsigned int max_batch_latency, sensor_cb_t cb, void *user_data)
428 return sensord_register_event_impl(handle, event_type, interval, max_batch_latency, (void*)cb, false, user_data);
431 static inline bool sensord_unregister_event_imple(int handle)
433 sensor::sensor_listener *listener;
437 auto it = listeners.find(handle);
438 retvm_if(it == listeners.end(), false, "Invalid handle[%d]", handle);
440 listener = it->second;
442 listener->unset_event_handler();
444 _D("Unregister event[%d]", listener->get_id());
449 API bool sensord_unregister_event(int handle, unsigned int event_type)
451 return sensord_unregister_event_imple(handle);
454 API bool sensord_register_events(int handle, unsigned int event_type, unsigned int max_batch_latency, sensor_events_cb_t cb, void *user_data)
456 return sensord_register_event_impl(handle, event_type, 0, max_batch_latency, (void*)cb, true, user_data);
459 API bool sensord_unregister_events(int handle, unsigned int event_type)
461 return sensord_unregister_event_imple(handle);
464 API bool sensord_register_accuracy_cb(int handle, sensor_accuracy_changed_cb_t cb, void *user_data)
466 sensor::sensor_listener *listener;
467 sensor_listener_channel_handler *handler;
471 auto it = listeners.find(handle);
472 retvm_if(it == listeners.end(), false, "Invalid handle[%d]", handle);
474 listener = it->second;
476 handler = new(std::nothrow) sensor_listener_channel_handler(handle, listener->get_sensor(), (void *)cb, user_data, sensor_accuracy_changed_callback_dispatcher);
477 retvm_if(!handler, false, "Failed to allocate memory");
479 listener->set_accuracy_handler(handler);
484 API bool sensord_unregister_accuracy_cb(int handle)
486 sensor::sensor_listener *listener;
490 auto it = listeners.find(handle);
491 retvm_if(it == listeners.end(), false, "Invalid handle[%d]", handle);
493 listener = it->second;
495 listener->unset_accuracy_handler();
500 API bool sensord_register_attribute_int_changed_cb(int handle, sensor_attribute_int_changed_cb_t cb, void *user_data)
502 sensor::sensor_listener *listener;
503 sensor_listener_channel_handler *handler;
507 auto it = listeners.find(handle);
508 retvm_if(it == listeners.end(), false, "Invalid handle[%d]", handle);
510 listener = it->second;
512 handler = new(std::nothrow) sensor_listener_channel_handler(handle, listener->get_sensor(), (void *)cb, user_data, sensor_attribute_int_changed_callback_dispatcher);
513 retvm_if(!handler, false, "Failed to allocate memory");
515 listener->set_attribute_int_changed_handler(handler);
520 API bool sensord_unregister_attribute_int_changed_cb(int handle)
522 sensor::sensor_listener *listener;
526 auto it = listeners.find(handle);
527 retvm_if(it == listeners.end(), false, "Invalid handle[%d]", handle);
529 listener = it->second;
531 listener->unset_attribute_int_changed_handler();
536 API bool sensord_register_attribute_str_changed_cb(int handle, sensor_attribute_str_changed_cb_t cb, void *user_data)
538 sensor::sensor_listener *listener;
539 sensor_listener_channel_handler *handler;
543 auto it = listeners.find(handle);
544 retvm_if(it == listeners.end(), false, "Invalid handle[%d]", handle);
546 listener = it->second;
548 handler = new(std::nothrow) sensor_listener_channel_handler(handle, listener->get_sensor(), (void *)cb, user_data, sensor_attribute_str_changed_callback_dispatcher);
549 retvm_if(!handler, false, "Failed to allocate memory");
551 listener->set_attribute_str_changed_handler(handler);
556 API bool sensord_unregister_attribute_str_changed_cb(int handle)
558 sensor::sensor_listener *listener;
562 auto it = listeners.find(handle);
563 retvm_if(it == listeners.end(), false, "Invalid handle[%d]", handle);
565 listener = it->second;
567 listener->unset_attribute_str_changed_handler();
572 API bool sensord_start(int handle, int option)
574 sensor::sensor_listener *listener;
577 int interval, batch_latency;
581 auto it = listeners.find(handle);
582 retvm_if(it == listeners.end(), false, "Invalid handle[%d]", handle);
584 listener = it->second;
586 pause = CONVERT_OPTION_TO_PAUSE_POLICY(option);
587 prev_pause = listener->get_pause_policy();
589 if (listener->set_attribute(SENSORD_ATTRIBUTE_PAUSE_POLICY, pause) < 0) {
590 _E("Failed to set pause policy[%d]", pause);
594 if (listener->start() < 0) {
595 listener->set_attribute(SENSORD_ATTRIBUTE_PAUSE_POLICY, prev_pause);
596 _E("Failed to start listener");
600 interval = listener->get_interval();
602 listener->set_interval(interval);
604 batch_latency = listener->get_max_batch_latency();
605 if (batch_latency != SENSOR_BATCH_LATENCY_DEFAULT)
606 listener->set_max_batch_latency(batch_latency);
608 _D("Start[%d] with the interval[%d] batch_latency[%d]",
609 listener->get_id(), interval, batch_latency);
614 API bool sensord_stop(int handle)
617 sensor::sensor_listener *listener;
621 auto it = listeners.find(handle);
622 retvm_if(it == listeners.end(), false, "Invalid handle[%d]", handle);
624 listener = it->second;
626 ret = listener->stop();
628 if (ret == -EAGAIN || ret == OP_SUCCESS)
631 _D("Stop[%d]", listener->get_id());
636 API bool sensord_change_event_interval(int handle, unsigned int event_type, unsigned int interval)
638 sensor::sensor_listener *listener;
642 auto it = listeners.find(handle);
643 retvm_if(it == listeners.end(), false, "Invalid handle[%d]", handle);
645 listener = it->second;
647 if (listener->set_interval(interval) < 0) {
648 _E("Failed to set interval to listener");
652 _D("Set interval[%d, %d]", listener->get_id(), interval);
657 API bool sensord_change_event_max_batch_latency(int handle, unsigned int event_type, unsigned int max_batch_latency)
659 sensor::sensor_listener *listener;
663 auto it = listeners.find(handle);
664 retvm_if(it == listeners.end(), false, "Invalid handle[%d]", handle);
666 listener = it->second;
668 if (listener->set_max_batch_latency(max_batch_latency) < 0) {
669 _E("Failed to set max_batch_latency to listener");
673 _D("Set max batch latency[%d, %u]", listener->get_id(), max_batch_latency);
678 API bool sensord_set_option(int handle, int option)
680 sensor::sensor_listener *listener;
685 auto it = listeners.find(handle);
686 retvm_if(it == listeners.end(), false, "Invalid handle[%d]", handle);
688 listener = it->second;
690 pause = CONVERT_OPTION_TO_PAUSE_POLICY(option);
692 if (listener->set_attribute(SENSORD_ATTRIBUTE_PAUSE_POLICY, pause) < 0) {
693 _E("Failed to set option[%d(%d)] to listener", option, pause);
697 _D("Set pause option[%d, %d]", listener->get_id(), pause);
702 API int sensord_listener_set_attribute_int(int handle, int attribute, int value)
704 sensor::sensor_listener *listener;
706 auto it = listeners.find(handle);
707 retvm_if(it == listeners.end(), -EINVAL, "Invalid handle[%d]", handle);
709 listener = it->second;
711 if (listener->set_attribute(attribute, value) < 0) {
712 _E("Failed to set attribute[%d, %d]", attribute, value);
716 _D("Set attribute[%d, %d, %d]", listener->get_id(), attribute, value);
721 API int sensord_listener_get_attribute_int(int handle, int attribute, int* value)
723 sensor::sensor_listener *listener;
725 auto it = listeners.find(handle);
726 retvm_if(it == listeners.end(), -EINVAL, "Invalid handle[%d]", handle);
728 listener = it->second;
730 if (listener->get_attribute(attribute, value) < 0) {
731 _E("Failed to get attribute[%d]", attribute);
735 _D("Get attribute[%d, %d, %d]", listener->get_id(), attribute, *value);
740 API int sensord_listener_set_attribute_str(int handle, int attribute, const char *value, int len)
742 sensor::sensor_listener *listener;
744 auto it = listeners.find(handle);
745 retvm_if(it == listeners.end(), -EINVAL, "Invalid handle[%d]", handle);
747 listener = it->second;
749 if (listener->set_attribute(attribute, value, len) < 0) {
750 _E("Failed to set attribute[%d, %s]", attribute, value);
753 _D("Set attribute ID[%d], attr[%d], len[%d]", listener->get_id(), attribute, len);
758 API int sensord_listener_get_attribute_str(int handle, int attribute, char **value, int* len)
760 sensor::sensor_listener *listener;
762 auto it = listeners.find(handle);
763 retvm_if(it == listeners.end(), -EINVAL, "Invalid handle[%d]", handle);
765 listener = it->second;
767 if (listener->get_attribute(attribute, value, len) < 0) {
768 _E("Failed to get attribute[%d]", attribute);
771 _D("Get attribute ID[%d], attr[%d], len[%d]", listener->get_id(), attribute, *len);
776 API int sensord_set_attribute_int(sensor_t sensor, int attribute, int value)
779 _E("Failed to validate the parameter");
783 int ret = manager.set_attribute(sensor, attribute, value);
785 _E("Failed to set attribute[%d, %d]", attribute, value);
789 _D("Set attribute[%s, %d, %d]",
790 ((sensor_info *)(sensor))->get_uri().c_str(), attribute, value);
795 API int sensord_get_attribute_int(sensor_t sensor, int attribute, int* value)
797 if (!sensor || !value) {
798 _E("Failed to validate the parameter");
802 int ret = manager.get_attribute(sensor, attribute, value);
804 _E("Failed to get attribute[%d]", attribute);
808 _D("Get attribute[%s, %d, %d]",
809 ((sensor_info *)(sensor))->get_uri().c_str(), attribute, *value);
814 API bool sensord_get_data(int handle, unsigned int data_id, sensor_data_t* sensor_data)
816 sensor::sensor_listener *listener;
820 auto it = listeners.find(handle);
821 retvm_if(it == listeners.end(), false, "Invalid handle[%d]", handle);
823 listener = it->second;
825 if (listener->get_sensor_data(sensor_data) < 0) {
826 _E("Failed to get sensor data from listener");
833 API bool sensord_get_data_list(int handle, unsigned int data_id, sensor_data_t** sensor_data, int* count)
835 sensor::sensor_listener *listener;
839 auto it = listeners.find(handle);
840 retvm_if(it == listeners.end(), false, "Invalid handle[%d]", handle);
842 listener = it->second;
844 if (listener->get_sensor_data_list(sensor_data, count) < 0) {
845 _E("Failed to get sensor data from listener");
852 API bool sensord_flush(int handle)
854 sensor::sensor_listener *listener;
858 auto it = listeners.find(handle);
859 retvm_if(it == listeners.end(), false, "Invalid handle[%d]", handle);
861 listener = it->second;
863 if (listener->flush() < 0) {
864 _E("Failed to flush sensor");
871 API bool sensord_set_passive_mode(int handle, bool passive)
873 sensor::sensor_listener *listener;
877 auto it = listeners.find(handle);
878 retvm_if(it == listeners.end(), false, "Invalid handle[%d]", handle);
880 listener = it->second;
882 if (listener->set_passive_mode(passive) < 0) {
883 _E("Failed to set passive mode");
890 /* Sensor Internal API using URI */
891 API int sensord_get_default_sensor_by_uri(const char *uri, sensor_t *sensor)
893 retvm_if(!sensor, -EINVAL, "Invalid parameter");
894 retvm_if(!manager.connect(), -EIO, "Failed to connect");
896 return manager.get_sensor(uri, sensor);
899 API int sensord_get_sensors_by_uri(const char *uri, sensor_t **list, int *count)
901 retvm_if((!list || !count), -EINVAL, "Invalid parameter");
902 retvm_if(!manager.connect(), -EIO, "Failed to connect");
904 return manager.get_sensors(uri, list, count);
907 API int sensord_add_sensor_added_cb(sensord_added_cb callback, void *user_data)
909 retvm_if(!callback, -EINVAL, "Invalid paramter");
910 retvm_if(!manager.connect(), -EIO, "Failed to connect");
912 manager.add_sensor_added_cb(callback, user_data);
916 API int sensord_remove_sensor_added_cb(sensord_added_cb callback)
918 retvm_if(!callback, -EINVAL, "Invalid paramter");
919 retvm_if(!manager.connect(), -EIO, "Failed to connect");
921 manager.remove_sensor_added_cb(callback);
925 API int sensord_add_sensor_removed_cb(sensord_removed_cb callback, void *user_data)
927 retvm_if(!callback, -EINVAL, "Invalid paramter");
928 retvm_if(!manager.connect(), -EIO, "Failed to connect");
930 manager.add_sensor_removed_cb(callback, user_data);
934 API int sensord_remove_sensor_removed_cb(sensord_removed_cb callback)
936 retvm_if(!callback, -EINVAL, "Invalid paramter");
937 retvm_if(!manager.connect(), -EIO, "Failed to connect");
939 manager.remove_sensor_removed_cb(callback);
943 /* Sensor provider */
944 API int sensord_create_provider(const char *uri, sensord_provider_h *provider)
946 retvm_if(providerCnt >= MAX_PROVIDER, -EPERM, "Exceeded the maximum provider");
947 retvm_if(!provider, -EINVAL, "Invalid paramter");
949 std::string str_uri(uri);
950 retvm_if(str_uri.find(PREDEFINED_TYPE_URI) != std::string::npos,
951 -EINVAL, "Invalid URI format[%s]", uri);
953 static std::regex uri_regex(SENSOR_URI_REGEX, std::regex::optimize);
954 retvm_if(!std::regex_match(uri, uri_regex),
955 -EINVAL, "Invalid URI format[%s]", uri);
959 p = new(std::nothrow) sensor_provider(uri);
960 retvm_if(!p, -ENOMEM, "Failed to allocate memory");
962 *provider = static_cast<sensord_provider_h>(p);
967 API int sensord_destroy_provider(sensord_provider_h provider)
969 retvm_if(!provider, -EINVAL, "Invalid paramter");
971 delete static_cast<sensor::sensor_provider *>(provider);
976 API int sensord_add_provider(sensord_provider_h provider)
978 retvm_if(!provider, -EINVAL, "Invalid paramter");
979 retvm_if(!manager.connect(), -EIO, "Failed to connect");
982 sensor_provider *p = static_cast<sensor_provider *>(provider);
985 retv_if(ret < 0, ret);
987 ret = manager.add_sensor(p);
996 API int sensord_remove_provider(sensord_provider_h provider)
998 retvm_if(!provider, -EINVAL, "Invalid paramter");
999 retvm_if(!manager.connect(), -EIO, "Failed to connect");
1002 sensor_provider *p = static_cast<sensor_provider *>(provider);
1004 if (!p->disconnect())
1007 ret = manager.remove_sensor(p);
1016 API int sensord_provider_set_name(sensord_provider_h provider, const char *name)
1018 retvm_if(!provider, -EINVAL, "Invalid paramter");
1020 sensor_provider *p = static_cast<sensor_provider *>(provider);
1022 sensor_info *info = p->get_sensor_info();
1023 info->set_model(name);
1028 API int sensord_provider_set_vendor(sensord_provider_h provider, const char *vendor)
1030 retvm_if(!provider, -EINVAL, "Invalid paramter");
1032 sensor_provider *p = static_cast<sensor_provider *>(provider);
1034 sensor_info *info = p->get_sensor_info();
1035 info->set_vendor(vendor);
1040 API int sensord_provider_set_range(sensord_provider_h provider, float min_range, float max_range)
1042 retvm_if(!provider, -EINVAL, "Invalid paramter");
1044 sensor_provider *p = static_cast<sensor_provider *>(provider);
1046 sensor_info *info = p->get_sensor_info();
1047 info->set_min_range(min_range);
1048 info->set_max_range(max_range);
1053 API int sensord_provider_set_resolution(sensord_provider_h provider, float resolution)
1055 retvm_if(!provider, -EINVAL, "Invalid paramter");
1057 sensor_provider *p = static_cast<sensor_provider *>(provider);
1059 sensor_info *info = p->get_sensor_info();
1060 info->set_resolution(resolution);
1065 API int sensord_provider_set_start_cb(sensord_provider_h provider, sensord_provider_start_cb callback, void *user_data)
1067 retvm_if(!provider, -EINVAL, "Invalid paramter");
1068 retvm_if(!callback, -EINVAL, "Invalid paramter");
1070 sensor_provider *p = static_cast<sensor_provider *>(provider);
1072 p->set_start_cb(callback, user_data);
1077 API int sensord_provider_set_stop_cb(sensord_provider_h provider, sensord_provider_stop_cb callback, void *user_data)
1079 retvm_if(!provider, -EINVAL, "Invalid paramter");
1080 retvm_if(!callback, -EINVAL, "Invalid paramter");
1082 sensor_provider *p = static_cast<sensor_provider *>(provider);
1084 p->set_stop_cb(callback, user_data);
1089 API int sensord_provider_set_interval_changed_cb(sensord_provider_h provider, sensord_provider_interval_changed_cb callback, void *user_data)
1091 retvm_if(!provider, -EINVAL, "Invalid paramter");
1092 retvm_if(!callback, -EINVAL, "Invalid paramter");
1094 sensor_provider *p = static_cast<sensor_provider *>(provider);
1096 p->set_interval_cb(callback, user_data);
1101 API int sensord_provider_set_attribute_str_cb(sensord_provider_h provider, sensord_provider_attribute_str_cb callback, void *user_data)
1103 retvm_if(!provider, -EINVAL, "Invalid paramter");
1104 retvm_if(!callback, -EINVAL, "Invalid paramter");
1106 sensor_provider *p = static_cast<sensor_provider *>(provider);
1108 p->set_attribute_str_cb(callback, user_data);
1113 API int sensord_provider_publish(sensord_provider_h provider, sensor_data_t data)
1115 retvm_if(!provider, -EINVAL, "Invalid paramter");
1117 sensor_provider *p = static_cast<sensor_provider *>(provider);
1119 /* TODO: synchronous call is enough? */
1120 return p->publish(data);
1123 API int sensord_provider_publish_events(sensord_provider_h provider, sensor_data_t events[], int count)
1125 retvm_if(!provider, -EINVAL, "Invalid paramter");
1127 sensor_provider *p = static_cast<sensor_provider *>(provider);
1129 return p->publish(events, count);
1133 API sensor_t sensord_get_sensor(sensor_type_t type)
1137 if (sensord_get_default_sensor(type, &sensor) < 0)
1144 API bool sensord_get_sensor_list(sensor_type_t type, sensor_t **list, int *sensor_count)
1146 return (sensord_get_sensors(type, list, sensor_count) == OP_SUCCESS);
1150 API bool sensord_register_hub_event(int handle, unsigned int event_type,
1151 unsigned int interval, unsigned int max_batch_latency, sensorhub_cb_t cb, void *user_data)
1157 API bool sensord_get_supported_event_types(sensor_t sensor, unsigned int **event_types, int *count)
1160 * 1. check parameter
1161 * 2. if there is no sensor, return false
1162 * 3. memory allocation
1167 /* deprecated(BUT it is used in C-API....) */
1168 API bool sensord_is_supported_event_type(sensor_t sensor, unsigned int event_type, bool *supported)
1170 if (!manager.is_supported(sensor))
1179 API bool sensord_send_sensorhub_data(int handle, const char *data, int data_len)
1181 return (sensord_listener_set_attribute_str(handle, 0, data, data_len) == OP_SUCCESS);
1185 API bool sensord_send_command(int handle, const char *command, int command_len)
1187 return (sensord_listener_set_attribute_str(handle, 0, command, command_len) == OP_SUCCESS);
1191 API bool sensord_get_privilege(sensor_t sensor, sensor_privilege_t *privilege)
1193 *privilege = SENSOR_PRIVILEGE_PUBLIC;
1199 API int sensord_external_connect(const char *key, sensor_external_command_cb_t cb, void *user_data)
1202 * 1. check parameter
1203 * 2. create handle in this client
1204 * 3. first connection(client)
1205 * 4. cmd_connect for external sensor with key
1207 retvm_if(!key, -EINVAL, "Invalid key");
1212 API bool sensord_external_disconnect(int handle)
1215 * 1. check parameter
1216 * 2. create handle in this client
1217 * 3. first connection(client)
1218 * 4. cmd_connect for external sensor with key
1219 * 5. disconnect this handle
1220 * 6. if there is no active sensor, remove client id and stop listener
1226 API bool sensord_external_post(int handle, unsigned long long timestamp, const float* data, int data_cnt)
1229 * 1. check parameter
1230 * 1.1 (data_cnt <= 0) || (data_cnt > POST_DATA_LEN_MAX)), return false