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>
36 #include "sensor_reader.h"
38 #define CONVERT_OPTION_PAUSE_POLICY(option) ((option) ^ 0b11)
39 #define MAX_LISTENER 100
41 using namespace sensor;
47 sensor_accuracy_changed_cb_t acc_cb;
54 static sensor::sensor_manager manager;
55 static std::unordered_map<int, sensor::sensor_listener *> listeners;
58 static gboolean callback_dispatcher(gpointer data)
61 callback_info_s *info = (callback_info_s *)data;
66 event_type = CONVERT_TYPE_EVENT(info->sensor->get_type());
68 if (info->cb && info->sensor && listeners.find(info->listener_id) != listeners.end()) {
69 if (info->is_events_cb) {
70 size_t element_size = sizeof(sensor_data_t);
71 size_t count = info->data_size / element_size;
72 sensor_data_t *events[count];
73 char* p = (char*)info->data;
74 for (size_t i = 0 ; i < count; ++i) {
75 events[i] = (sensor_data_t *)(p + i * element_size);
77 ((sensor_events_cb_t)info->cb)(info->sensor, event_type, events, count, info->user_data);
79 ((sensor_cb_t)info->cb)(info->sensor, event_type, (sensor_data_t*)info->data, info->user_data);
88 static gboolean accuracy_callback_dispatcher(gpointer data)
90 callback_info_s *info = (callback_info_s *)data;
94 if (info->acc_cb && info->sensor && listeners.find(info->listener_id) != listeners.end()) {
95 sensor_data_t * data = (sensor_data_t *)info->data;
96 info->acc_cb(info->sensor, data->timestamp, data->accuracy, info->user_data);
104 class sensor_event_handler : public ipc::channel_handler
107 sensor_event_handler(int id, sensor_t sensor, void* cb, bool is_events_cb, void *user_data)
109 , m_sensor(reinterpret_cast<sensor_info *>(sensor))
111 , m_user_data(user_data)
112 , m_is_events_cb(is_events_cb)
115 void connected(ipc::channel *ch) {}
116 void disconnected(ipc::channel *ch) {}
117 void read(ipc::channel *ch, ipc::message &msg)
119 callback_info_s *info;
120 auto size = msg.size();
121 char *data = new(std::nothrow) char[size];
123 memcpy(data, msg.body(), size);
125 info = new(std::nothrow) callback_info_s();
126 info->listener_id = m_listener_id;
128 info->sensor = m_sensor;
130 info->data_size = size;
131 info->user_data = m_user_data;
132 info->is_events_cb = m_is_events_cb;
134 g_idle_add(callback_dispatcher, info);
137 void read_complete(ipc::channel *ch) {}
138 void error_caught(ipc::channel *ch, int error) {}
142 sensor_info *m_sensor;
148 class sensor_accuracy_handler : public ipc::channel_handler
151 sensor_accuracy_handler(int id, sensor_t sensor, sensor_accuracy_changed_cb_t cb, void *user_data)
153 , m_sensor(reinterpret_cast<sensor_info *>(sensor))
155 , m_user_data(user_data)
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 char *data = new(std::nothrow) char[msg.size()];
165 memcpy(data, msg.body(), msg.size());
167 info = new(std::nothrow) callback_info_s();
168 info->listener_id = m_listener_id;
170 info->sensor = m_sensor;
172 info->user_data = m_user_data;
174 g_idle_add(accuracy_callback_dispatcher, info);
177 void read_complete(ipc::channel *ch) {}
178 void error_caught(ipc::channel *ch, int error) {}
182 sensor_info *m_sensor;
183 sensor_accuracy_changed_cb_t m_cb;
189 * 1. power save option / lcd vconf : move to server
190 * 2. thread-safe : ipc_client
193 API int sensord_get_sensors(sensor_type_t type, sensor_t **list, int *count)
195 return sensord_get_sensors_by_uri(utils::get_uri(type), list, count);
198 API int sensord_get_default_sensor(sensor_type_t type, sensor_t *sensor)
200 return sensord_get_default_sensor_by_uri(utils::get_uri(type), sensor);
203 API bool sensord_get_type(sensor_t sensor, sensor_type_t *type)
205 retvm_if(!type, false, "Invalid type");
206 retvm_if(!manager.connect(), false, "Failed to connect");
207 retvm_if(!manager.is_supported(sensor), false,
208 "Invalid sensor[%p]", sensor);
210 *type = static_cast<sensor_info *>(sensor)->get_type();
215 API const char* sensord_get_uri(sensor_t sensor)
217 retvm_if(!manager.connect(), NULL, "Failed to connect");
218 retvm_if(!manager.is_supported(sensor), NULL,
219 "Invalid sensor[%p]", sensor);
221 return static_cast<sensor_info *>(sensor)->get_uri().c_str();
224 API const char* sensord_get_name(sensor_t sensor)
226 retvm_if(!manager.connect(), NULL, "Failed to connect");
227 retvm_if(!manager.is_supported(sensor), NULL,
228 "Invalid sensor[%p]", sensor);
230 return static_cast<sensor_info *>(sensor)->get_model().c_str();
233 API const char* sensord_get_vendor(sensor_t sensor)
235 retvm_if(!manager.connect(), NULL, "Failed to connect");
236 retvm_if(!manager.is_supported(sensor), NULL,
237 "Invalid sensor[%p]", sensor);
239 return static_cast<sensor_info *>(sensor)->get_vendor().c_str();
242 API bool sensord_get_min_range(sensor_t sensor, float *min_range)
244 retvm_if(!min_range, false, "Invalid paramter");
245 retvm_if(!manager.connect(), false, "Failed to connect");
246 retvm_if(!manager.is_supported(sensor), false,
247 "Invalid sensor[%p]", sensor);
249 *min_range = static_cast<sensor_info *>(sensor)->get_min_range();
254 API bool sensord_get_max_range(sensor_t sensor, float *max_range)
256 retvm_if(!max_range, false, "Invalid parameter");
257 retvm_if(!manager.connect(), false, "Failed to connect");
258 retvm_if(!manager.is_supported(sensor), false,
259 "Invalid sensor[%p]", sensor);
261 *max_range = static_cast<sensor_info *>(sensor)->get_max_range();
266 API bool sensord_get_resolution(sensor_t sensor, float *resolution)
268 retvm_if(!resolution, false, "Invalid parameter");
269 retvm_if(!manager.connect(), false, "Failed to connect");
270 retvm_if(!manager.is_supported(sensor), false,
271 "Invalid sensor[%p]", sensor);
273 *resolution = static_cast<sensor_info *>(sensor)->get_resolution();
278 API bool sensord_get_min_interval(sensor_t sensor, int *min_interval)
280 retvm_if(!min_interval, false, "Invalid parameter");
281 retvm_if(!manager.connect(), false, "Failed to connect");
282 retvm_if(!manager.is_supported(sensor), false,
283 "Invalid sensor[%p]", sensor);
285 *min_interval = static_cast<sensor_info *>(sensor)->get_min_interval();
290 API bool sensord_get_fifo_count(sensor_t sensor, int *fifo_count)
292 retvm_if(!fifo_count, false, "Invalid parameter");
293 retvm_if(!manager.connect(), false, "Failed to connect");
294 retvm_if(!manager.is_supported(sensor), false,
295 "Invalid sensor[%p]", sensor);
302 API bool sensord_get_max_batch_count(sensor_t sensor, int *max_batch_count)
304 retvm_if(!max_batch_count, false, "Invalid parameter");
305 retvm_if(!manager.connect(), false, "Failed to connect");
306 retvm_if(!manager.is_supported(sensor), false,
307 "Invalid sensor[%p]", sensor);
309 *max_batch_count = static_cast<sensor_info *>(sensor)->get_max_batch_count();
314 API bool sensord_is_wakeup_supported(sensor_t sensor)
316 retvm_if(!manager.connect(), false, "Failed to connect");
317 retvm_if(!manager.is_supported(sensor), false,
318 "Invalid sensor[%p]", sensor);
320 return static_cast<sensor_info *>(sensor)->is_wakeup_supported();
323 API int sensord_connect(sensor_t sensor)
327 retvm_if(!manager.connect(), -EIO, "Failed to connect");
328 retvm_if(!manager.is_supported(sensor), -EINVAL,
329 "Invalid sensor[%p]", sensor);
330 retvm_if(listeners.size() > MAX_LISTENER, -EPERM, "Exceeded the maximum listener");
332 sensor::sensor_listener *listener;
333 static sensor_reader reader;
335 listener = new(std::nothrow) sensor::sensor_listener(sensor, reader.get_event_loop());
336 retvm_if(!listener, -ENOMEM, "Failed to allocate memory");
338 listeners[listener->get_id()] = listener;
340 _D("Connect[%d]", listener->get_id());
342 return listener->get_id();
345 API bool sensord_disconnect(int handle)
347 sensor::sensor_listener *listener;
351 auto it = listeners.find(handle);
352 retvm_if(it == listeners.end(), false, "Invalid handle[%d]", handle);
354 listener = it->second;
355 retvm_if(!listener, false, "Invalid handle[%d]", handle);
357 _D("Disconnect[%d]", listener->get_id());
360 listeners.erase(handle);
365 static inline bool sensord_register_event_impl(int handle, unsigned int event_type,
366 unsigned int interval, unsigned int max_batch_latency, void* cb, bool is_events_callback, void *user_data)
368 sensor::sensor_listener *listener;
370 int prev_max_batch_latency;
371 sensor_event_handler *handler;
375 auto it = listeners.find(handle);
376 retvm_if(it == listeners.end(), false, "Invalid handle[%d]", handle);
378 listener = it->second;
380 prev_interval = listener->get_interval();
381 prev_max_batch_latency = listener->get_max_batch_latency();
383 if (listener->set_interval(interval) < 0) {
384 _E("Failed to set interval");
388 if (listener->set_max_batch_latency(max_batch_latency) < 0) {
389 listener->set_interval(prev_interval);
390 _E("Failed to set max_batch_latency");
394 handler = new(std::nothrow) sensor_event_handler(handle, listener->get_sensor(), cb, is_events_callback, user_data);
396 listener->set_max_batch_latency(prev_max_batch_latency);
397 listener->set_interval(prev_interval);
398 _E("Failed to allocate memory");
402 listener->set_event_handler(handler);
404 _D("Register event[%d]", listener->get_id());
409 API bool sensord_register_event(int handle, unsigned int event_type,
410 unsigned int interval, unsigned int max_batch_latency, sensor_cb_t cb, void *user_data)
412 return sensord_register_event_impl(handle, event_type, interval, max_batch_latency, (void*)cb, false, user_data);
415 static inline bool sensord_unregister_event_imple(int handle)
417 sensor::sensor_listener *listener;
421 auto it = listeners.find(handle);
422 retvm_if(it == listeners.end(), false, "Invalid handle[%d]", handle);
424 listener = it->second;
426 listener->unset_event_handler();
428 _D("Unregister event[%d]", listener->get_id());
433 API bool sensord_unregister_event(int handle, unsigned int event_type)
435 return sensord_unregister_event_imple(handle);
438 API bool sensord_register_events(int handle, unsigned int event_type, unsigned int max_batch_latency, sensor_events_cb_t cb, void *user_data)
440 return sensord_register_event_impl(handle, event_type, 0, max_batch_latency, (void*)cb, true, user_data);
443 API bool sensord_unregister_events(int handle, unsigned int event_type)
445 return sensord_unregister_event_imple(handle);
448 API bool sensord_register_accuracy_cb(int handle, sensor_accuracy_changed_cb_t cb, void *user_data)
450 sensor::sensor_listener *listener;
451 sensor_accuracy_handler *handler;
455 auto it = listeners.find(handle);
456 retvm_if(it == listeners.end(), false, "Invalid handle[%d]", handle);
458 listener = it->second;
460 handler = new(std::nothrow) sensor_accuracy_handler(handle, listener->get_sensor(), cb, user_data);
461 retvm_if(!handler, false, "Failed to allocate memory");
463 listener->set_accuracy_handler(handler);
468 API bool sensord_unregister_accuracy_cb(int handle)
470 sensor::sensor_listener *listener;
474 auto it = listeners.find(handle);
475 retvm_if(it == listeners.end(), false, "Invalid handle[%d]", handle);
477 listener = it->second;
479 listener->unset_accuracy_handler();
484 API bool sensord_start(int handle, int option)
486 sensor::sensor_listener *listener;
489 int interval, batch_latency;
493 auto it = listeners.find(handle);
494 retvm_if(it == listeners.end(), false, "Invalid handle[%d]", handle);
496 listener = it->second;
498 pause = CONVERT_OPTION_PAUSE_POLICY(option);
499 prev_pause = listener->get_pause_policy();
501 if (listener->set_attribute(SENSORD_ATTRIBUTE_PAUSE_POLICY, pause) < 0) {
502 _E("Failed to set pause policy[%d]", pause);
506 if (listener->start() < 0) {
507 listener->set_attribute(SENSORD_ATTRIBUTE_PAUSE_POLICY, prev_pause);
508 _E("Failed to start listener");
512 interval = listener->get_interval();
514 listener->set_interval(interval);
516 batch_latency = listener->get_max_batch_latency();
517 listener->set_max_batch_latency(batch_latency);
519 _D("Start[%d] with the interval[%d] batch_latency[%d]",
520 listener->get_id(), interval, batch_latency);
525 API bool sensord_stop(int handle)
528 sensor::sensor_listener *listener;
532 auto it = listeners.find(handle);
533 retvm_if(it == listeners.end(), false, "Invalid handle[%d]", handle);
535 listener = it->second;
537 ret = listener->stop();
539 if (ret == -EAGAIN || ret == OP_SUCCESS)
542 _D("Stop[%d]", listener->get_id());
547 API bool sensord_change_event_interval(int handle, unsigned int event_type, unsigned int interval)
549 sensor::sensor_listener *listener;
553 auto it = listeners.find(handle);
554 retvm_if(it == listeners.end(), false, "Invalid handle[%d]", handle);
556 listener = it->second;
558 if (listener->set_interval(interval) < 0) {
559 _E("Failed to set interval to listener");
563 _D("Set interval[%d, %d]", listener->get_id(), interval);
568 API bool sensord_change_event_max_batch_latency(int handle, unsigned int event_type, unsigned int max_batch_latency)
570 sensor::sensor_listener *listener;
574 auto it = listeners.find(handle);
575 retvm_if(it == listeners.end(), false, "Invalid handle[%d]", handle);
577 listener = it->second;
579 if (listener->set_max_batch_latency(max_batch_latency) < 0) {
580 _E("Failed to set max_batch_latency to listener");
584 _D("Set max batch latency[%d, %u]", listener->get_id(), max_batch_latency);
589 API bool sensord_set_option(int handle, int option)
591 sensor::sensor_listener *listener;
596 auto it = listeners.find(handle);
597 retvm_if(it == listeners.end(), false, "Invalid handle[%d]", handle);
599 listener = it->second;
601 pause = CONVERT_OPTION_PAUSE_POLICY(option);
603 if (listener->set_attribute(SENSORD_ATTRIBUTE_PAUSE_POLICY, pause) < 0) {
604 _E("Failed to set option[%d(%d)] to listener", option, pause);
608 _D("Set pause option[%d, %d]", listener->get_id(), pause);
613 API int sensord_set_attribute_int(int handle, int attribute, int value)
615 sensor::sensor_listener *listener;
617 auto it = listeners.find(handle);
618 retvm_if(it == listeners.end(), -EINVAL, "Invalid handle[%d]", handle);
620 listener = it->second;
622 if (listener->set_attribute(attribute, value) < 0) {
623 _E("Failed to set attribute[%d, %d]", attribute, value);
627 _D("Set attribute[%d, %d, %d]", listener->get_id(), attribute, value);
632 API int sensord_set_attribute_str(int handle, int attribute, const char *value, int len)
634 sensor::sensor_listener *listener;
636 auto it = listeners.find(handle);
637 retvm_if(it == listeners.end(), -EINVAL, "Invalid handle[%d]", handle);
639 listener = it->second;
641 if (listener->set_attribute(attribute, value, len) < 0) {
642 _E("Failed to set attribute[%d, %s]", attribute, value);
649 API bool sensord_get_data(int handle, unsigned int data_id, sensor_data_t* sensor_data)
651 sensor::sensor_listener *listener;
655 auto it = listeners.find(handle);
656 retvm_if(it == listeners.end(), false, "Invalid handle[%d]", handle);
658 listener = it->second;
660 if (listener->get_sensor_data(sensor_data) < 0) {
661 _E("Failed to get sensor data from listener");
668 API bool sensord_flush(int handle)
670 sensor::sensor_listener *listener;
674 auto it = listeners.find(handle);
675 retvm_if(it == listeners.end(), false, "Invalid handle[%d]", handle);
677 listener = it->second;
679 if (listener->flush() < 0) {
680 _E("Failed to flush sensor");
687 API bool sensord_set_passive_mode(int handle, bool passive)
689 sensor::sensor_listener *listener;
693 auto it = listeners.find(handle);
694 retvm_if(it == listeners.end(), false, "Invalid handle[%d]", handle);
696 listener = it->second;
698 if (listener->set_passive_mode(passive) < 0) {
699 _E("Failed to set passive mode");
706 /* Sensor Internal API using URI */
707 API int sensord_get_default_sensor_by_uri(const char *uri, sensor_t *sensor)
709 retvm_if(!sensor, -EINVAL, "Invalid parameter");
710 retvm_if(!manager.connect(), -EIO, "Failed to connect");
712 return manager.get_sensor(uri, sensor);
715 API int sensord_get_sensors_by_uri(const char *uri, sensor_t **list, int *count)
717 retvm_if((!list || !count), -EINVAL, "Invalid parameter");
718 retvm_if(!manager.connect(), -EIO, "Failed to connect");
720 return manager.get_sensors(uri, list, count);
723 API int sensord_add_sensor_added_cb(sensord_added_cb callback, void *user_data)
725 retvm_if(!callback, -EINVAL, "Invalid paramter");
726 retvm_if(!manager.connect(), -EIO, "Failed to connect");
728 manager.add_sensor_added_cb(callback, user_data);
732 API int sensord_remove_sensor_added_cb(sensord_added_cb callback)
734 retvm_if(!callback, -EINVAL, "Invalid paramter");
735 retvm_if(!manager.connect(), -EIO, "Failed to connect");
737 manager.remove_sensor_added_cb(callback);
741 API int sensord_add_sensor_removed_cb(sensord_removed_cb callback, void *user_data)
743 retvm_if(!callback, -EINVAL, "Invalid paramter");
744 retvm_if(!manager.connect(), -EIO, "Failed to connect");
746 manager.add_sensor_removed_cb(callback, user_data);
750 API int sensord_remove_sensor_removed_cb(sensord_removed_cb callback)
752 retvm_if(!callback, -EINVAL, "Invalid paramter");
753 retvm_if(!manager.connect(), -EIO, "Failed to connect");
755 manager.remove_sensor_removed_cb(callback);
759 /* Sensor provider */
760 API int sensord_create_provider(const char *uri, sensord_provider_h *provider)
762 retvm_if(!provider, -EINVAL, "Invalid paramter");
764 std::string str_uri(uri);
765 retvm_if(str_uri.find(PREDEFINED_TYPE_URI) != std::string::npos,
766 -EINVAL, "Invalid URI format[%s]", uri);
768 static std::regex uri_regex(SENSOR_URI_REGEX, std::regex::optimize);
769 retvm_if(!std::regex_match(uri, uri_regex),
770 -EINVAL, "Invalid URI format[%s]", uri);
774 p = new(std::nothrow) sensor_provider(uri);
775 retvm_if(!p, -ENOMEM, "Failed to allocate memory");
777 *provider = static_cast<sensord_provider_h>(p);
781 API int sensord_destroy_provider(sensord_provider_h provider)
783 retvm_if(!provider, -EINVAL, "Invalid paramter");
785 delete static_cast<sensor::sensor_provider *>(provider);
789 API int sensord_add_provider(sensord_provider_h provider)
791 retvm_if(!provider, -EINVAL, "Invalid paramter");
792 retvm_if(!manager.connect(), -EIO, "Failed to connect");
795 sensor_provider *p = static_cast<sensor_provider *>(provider);
798 retv_if(ret < 0, ret);
800 ret = manager.add_sensor(p);
809 API int sensord_remove_provider(sensord_provider_h provider)
811 retvm_if(!provider, -EINVAL, "Invalid paramter");
812 retvm_if(!manager.connect(), -EIO, "Failed to connect");
815 sensor_provider *p = static_cast<sensor_provider *>(provider);
817 if (!p->disconnect())
820 ret = manager.remove_sensor(p);
829 API int sensord_provider_set_name(sensord_provider_h provider, const char *name)
831 retvm_if(!provider, -EINVAL, "Invalid paramter");
833 sensor_provider *p = static_cast<sensor_provider *>(provider);
835 sensor_info *info = p->get_sensor_info();
836 info->set_model(name);
841 API int sensord_provider_set_vendor(sensord_provider_h provider, const char *vendor)
843 retvm_if(!provider, -EINVAL, "Invalid paramter");
845 sensor_provider *p = static_cast<sensor_provider *>(provider);
847 sensor_info *info = p->get_sensor_info();
848 info->set_vendor(vendor);
853 API int sensord_provider_set_range(sensord_provider_h provider, float min_range, float max_range)
855 retvm_if(!provider, -EINVAL, "Invalid paramter");
857 sensor_provider *p = static_cast<sensor_provider *>(provider);
859 sensor_info *info = p->get_sensor_info();
860 info->set_min_range(min_range);
861 info->set_max_range(max_range);
866 API int sensord_provider_set_resolution(sensord_provider_h provider, float resolution)
868 retvm_if(!provider, -EINVAL, "Invalid paramter");
870 sensor_provider *p = static_cast<sensor_provider *>(provider);
872 sensor_info *info = p->get_sensor_info();
873 info->set_resolution(resolution);
878 API int sensord_provider_set_start_cb(sensord_provider_h provider, sensord_provider_start_cb callback, void *user_data)
880 retvm_if(!provider, -EINVAL, "Invalid paramter");
881 retvm_if(!callback, -EINVAL, "Invalid paramter");
883 sensor_provider *p = static_cast<sensor_provider *>(provider);
885 p->set_start_cb(callback, user_data);
890 API int sensord_provider_set_stop_cb(sensord_provider_h provider, sensord_provider_stop_cb callback, void *user_data)
892 retvm_if(!provider, -EINVAL, "Invalid paramter");
893 retvm_if(!callback, -EINVAL, "Invalid paramter");
895 sensor_provider *p = static_cast<sensor_provider *>(provider);
897 p->set_stop_cb(callback, user_data);
902 API int sensord_provider_set_interval_changed_cb(sensord_provider_h provider, sensord_provider_interval_changed_cb callback, void *user_data)
904 retvm_if(!provider, -EINVAL, "Invalid paramter");
905 retvm_if(!callback, -EINVAL, "Invalid paramter");
907 sensor_provider *p = static_cast<sensor_provider *>(provider);
909 p->set_interval_cb(callback, user_data);
914 API int sensord_provider_set_attribute_str_cb(sensord_provider_h provider, sensord_provider_attribute_str_cb callback, void *user_data)
916 retvm_if(!provider, -EINVAL, "Invalid paramter");
917 retvm_if(!callback, -EINVAL, "Invalid paramter");
919 sensor_provider *p = static_cast<sensor_provider *>(provider);
921 p->set_attribute_str_cb(callback, user_data);
926 API int sensord_provider_publish(sensord_provider_h provider, sensor_data_t data)
928 retvm_if(!provider, -EINVAL, "Invalid paramter");
930 sensor_provider *p = static_cast<sensor_provider *>(provider);
932 /* TODO: synchronous call is enough? */
933 return p->publish(data);
936 API int sensord_provider_publish_events(sensord_provider_h provider, sensor_data_t events[], int count)
938 retvm_if(!provider, -EINVAL, "Invalid paramter");
940 sensor_provider *p = static_cast<sensor_provider *>(provider);
942 return p->publish(events, count);
946 API sensor_t sensord_get_sensor(sensor_type_t type)
950 if (sensord_get_default_sensor(type, &sensor) < 0)
957 API bool sensord_get_sensor_list(sensor_type_t type, sensor_t **list, int *sensor_count)
959 return (sensord_get_sensors(type, list, sensor_count) == OP_SUCCESS);
963 API bool sensord_register_hub_event(int handle, unsigned int event_type,
964 unsigned int interval, unsigned int max_batch_latency, sensorhub_cb_t cb, void *user_data)
970 API bool sensord_get_supported_event_types(sensor_t sensor, unsigned int **event_types, int *count)
974 * 2. if there is no sensor, return false
975 * 3. memory allocation
980 /* deprecated(BUT it is used in C-API....) */
981 API bool sensord_is_supported_event_type(sensor_t sensor, unsigned int event_type, bool *supported)
983 if (!manager.is_supported(sensor))
992 API bool sensord_send_sensorhub_data(int handle, const char *data, int data_len)
994 return (sensord_set_attribute_str(handle, 0, data, data_len) == OP_SUCCESS);
998 API bool sensord_send_command(int handle, const char *command, int command_len)
1000 return (sensord_set_attribute_str(handle, 0, command, command_len) == OP_SUCCESS);
1004 API bool sensord_get_privilege(sensor_t sensor, sensor_privilege_t *privilege)
1006 *privilege = SENSOR_PRIVILEGE_PUBLIC;
1012 API int sensord_external_connect(const char *key, sensor_external_command_cb_t cb, void *user_data)
1015 * 1. check parameter
1016 * 2. create handle in this client
1017 * 3. first connection(client)
1018 * 4. cmd_connect for external sensor with key
1020 retvm_if(!key, -EINVAL, "Invalid key");
1025 API bool sensord_external_disconnect(int handle)
1028 * 1. check parameter
1029 * 2. create handle in this client
1030 * 3. first connection(client)
1031 * 4. cmd_connect for external sensor with key
1032 * 5. disconnect this handle
1033 * 6. if there is no active sensor, remove client id and stop listener
1039 API bool sensord_external_post(int handle, unsigned long long timestamp, const float* data, int data_cnt)
1042 * 1. check parameter
1043 * 1.1 (data_cnt <= 0) || (data_cnt > POST_DATA_LEN_MAX)), return false