2 * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
26 #include <sensor-internal.h>
27 #include <sensor-private.h>
28 #include <sensor-log-private.h>
30 #define SENSOR_SHIFT_TYPE 16
31 #define SENSOR_UNDEFINED_ID -1
33 #define SENSOR_LISTENER_MAGIC 0xCAFECAFE
35 #define CONVERT_AXIS_ENUM(X) ((X) < 3 ? (X) + 0x81 : (X) - 2)
37 #define CONVERT_OPTION_PAUSE_POLICY(option) ((option) ^ 0b11)
39 #define WARN_DEPRECATED_SENSOR(X) \
41 if ((X) == SENSOR_LAST || (X) == SENSOR_CUSTOM || (X) == SENSOR_HUMAN_STRESS_MONITOR) { \
42 _W("DEPRECATION WARNING: This sensor type is deprecated and will be removed from next release."); \
46 static int sensor_connect(sensor_h sensor, sensor_listener_h listener)
48 int id = SENSOR_UNDEFINED_ID;
54 return SENSOR_ERROR_INVALID_PARAMETER;
56 _D("called sensor_connect : listener[%p], sensor[%p]", listener, sensor);
58 sensord_get_type(sensor, &type);
59 event_type = type << SENSOR_SHIFT_TYPE | 0x1;
61 if (!sensord_is_supported_event_type(sensor, event_type, &support))
62 return SENSOR_ERROR_INVALID_PARAMETER;
65 return SENSOR_ERROR_NOT_SUPPORTED;
67 id = sensord_connect(sensor);
70 return SENSOR_ERROR_OPERATION_FAILED;
72 _D("success sensor_connect: id[%d]", id);
75 listener->type = type;
80 static void sensor_callback(sensor_t sensor, unsigned int event_type, sensor_data_t *data, void *user_data)
82 sensor_event_s *event;
83 sensor_listener_h listener;
84 listener = (sensor_listener_h)user_data;
86 if (!sensor || !listener->callback)
89 event = (sensor_event_s *)data;
91 ((sensor_event_cb) listener->callback)(sensor, event, listener->user_data);
95 static void sensor_events_callback(sensor_t sensor, unsigned int event_type, sensor_data_t datas[], int events_count, void *user_data)
97 sensor_event_s *events;
98 sensor_listener_h listener;
99 listener = (sensor_listener_h)user_data;
101 if (!sensor || !listener->callback)
104 events = (sensor_event_s *)datas;
106 ((sensor_events_cb) listener->callback)(sensor, events, events_count, listener->user_data);
110 static inline int sensor_listener_unset_event_cb_impl(sensor_listener_h listener, bool is_events_callback)
114 unsigned int event_id;
116 _D("called sensor_listener_unset_event_cb_impl : listener[%p]", listener);
119 return SENSOR_ERROR_INVALID_PARAMETER;
121 if (listener->magic != SENSOR_LISTENER_MAGIC)
122 return SENSOR_ERROR_INVALID_PARAMETER;
125 type = (int)listener->type;
126 event_id = type << SENSOR_SHIFT_TYPE | 0x1;
129 if (is_events_callback) {
130 ret = sensord_unregister_events(id, event_id);
132 ret = sensord_unregister_event(id, event_id);
136 return SENSOR_ERROR_OPERATION_FAILED;
138 listener->callback = NULL;
139 listener->user_data = NULL;
141 _D("success sensor_unregister_event");
143 return SENSOR_ERROR_NONE;
146 static inline int sensor_listener_set_event_cb_impl(sensor_listener_h listener,
147 unsigned int interval, void* callback, bool is_events_callback, void *user_data)
150 unsigned int event_id;
151 unsigned int batch_latency;
153 if (!listener || !callback)
154 return SENSOR_ERROR_INVALID_PARAMETER;
156 if (listener->magic != SENSOR_LISTENER_MAGIC)
157 return SENSOR_ERROR_INVALID_PARAMETER;
159 _D("called sensor_listener_set_event_cb_impl : listener[%p], interval[%u], callback[%p], user_data[%p], id[%d]",
160 listener, interval, callback, user_data, listener->id);
163 event_id = (listener->type) << SENSOR_SHIFT_TYPE | 0x1;
164 batch_latency = listener->batch_latency;
166 listener->callback = (void *)callback;
167 listener->user_data = user_data;
170 if (is_events_callback) {
171 ret = sensord_register_events(id, event_id, batch_latency, sensor_events_callback, listener);
173 ret = sensord_register_event(id, event_id, interval, batch_latency, sensor_callback, listener);
177 listener->callback = NULL;
178 listener->user_data = NULL;
179 return SENSOR_ERROR_OPERATION_FAILED;
182 _D("success sensor_listener_set_event");
184 return SENSOR_ERROR_NONE;
187 int sensor_is_supported(sensor_type_e type, bool *supported)
192 WARN_DEPRECATED_SENSOR(type);
194 if (type < SENSOR_ALL)
195 return SENSOR_ERROR_INVALID_PARAMETER;
198 return SENSOR_ERROR_INVALID_PARAMETER;
200 _D("called sensor_is_supported : type[%d]", type);
202 result = sensord_get_default_sensor((sensor_type_t)type, &sensor);
204 if (result == -EPERM)
205 return SENSOR_ERROR_OPERATION_FAILED;
210 * because is_supported() API is N/P API,
211 * it must not returns PERMISSION_DENIED error.
212 * -EACCES means that there is at least one sensor.
214 if (sensor || (result == -EACCES))
217 _D("success sensor(%d) is supported[%d]", type, *supported);
219 return SENSOR_ERROR_NONE;
222 int sensor_is_supported_by_uri(const char *uri, bool *supported)
228 return SENSOR_ERROR_INVALID_PARAMETER;
230 result = sensord_get_default_sensor_by_uri(uri, &sensor);
231 if (result == -EINVAL)
232 return SENSOR_ERROR_INVALID_PARAMETER;
233 else if (result == -EPERM || result == -EIO)
234 return SENSOR_ERROR_OPERATION_FAILED;
236 if (result == -ENODATA)
241 return SENSOR_ERROR_NONE;
244 int sensor_get_default_sensor(sensor_type_e type, sensor_h *sensor)
248 sensor_privilege_t privilege;
250 WARN_DEPRECATED_SENSOR(type);
252 _D("called sensor_get_default_sensor : type[%d], sensor[%p]", type, sensor);
254 if (type < SENSOR_ALL)
255 return SENSOR_ERROR_INVALID_PARAMETER;
258 return SENSOR_ERROR_INVALID_PARAMETER;
260 result = sensord_get_default_sensor((sensor_type_t)type, &_sensor);
261 if (result == -EACCES)
262 return SENSOR_ERROR_PERMISSION_DENIED;
263 else if (result == -EPERM)
264 return SENSOR_ERROR_OPERATION_FAILED;
267 return SENSOR_ERROR_NOT_SUPPORTED;
269 sensord_get_privilege(_sensor, &privilege);
270 if (privilege != SENSOR_PRIVILEGE_PUBLIC)
271 return SENSOR_ERROR_PERMISSION_DENIED;
275 _D("success sensor_get_default_sensor sensor[%p]", _sensor);
277 return SENSOR_ERROR_NONE;
280 int sensor_get_default_sensor_by_uri(const char *uri, sensor_h *sensor)
284 result = sensord_get_default_sensor_by_uri(uri, sensor);
285 if (result == -EINVAL)
286 return SENSOR_ERROR_INVALID_PARAMETER;
287 else if (result == -EACCES)
288 return SENSOR_ERROR_PERMISSION_DENIED;
289 else if (result == -ENODATA)
290 return SENSOR_ERROR_NOT_SUPPORTED;
292 return SENSOR_ERROR_OPERATION_FAILED;
294 return SENSOR_ERROR_NONE;
297 int sensor_get_sensor_list(sensor_type_e type, sensor_h **list, int *sensor_count)
303 WARN_DEPRECATED_SENSOR(type);
305 _D("called sensor_get_list : type[%d]", type);
307 if (type < SENSOR_ALL)
308 return SENSOR_ERROR_INVALID_PARAMETER;
310 if (!sensor_count || !list)
311 return SENSOR_ERROR_INVALID_PARAMETER;
313 result = sensord_get_sensors((sensor_type_t)type, &_list, &count);
315 if (result == -EACCES)
316 return SENSOR_ERROR_PERMISSION_DENIED;
317 else if (result == -EPERM)
318 return SENSOR_ERROR_OPERATION_FAILED;
319 else if (result == -ENODATA)
320 return SENSOR_ERROR_NOT_SUPPORTED;
323 int count_public = 0;
325 for (i = 0; i < count; ++i) {
326 sensor_privilege_t privilege;
328 sensord_get_privilege(_list[i], &privilege);
329 if (privilege != SENSOR_PRIVILEGE_PUBLIC)
335 if (count_public == 0) {
337 return SENSOR_ERROR_PERMISSION_DENIED;
340 *list = (sensor_h *) malloc((sizeof(int *)) * count_public);
344 return SENSOR_ERROR_OUT_OF_MEMORY;
347 for (i = 0, j = 0; i < count; ++i) {
348 sensor_privilege_t privilege;
350 sensord_get_privilege(_list[i], &privilege);
351 if (privilege != SENSOR_PRIVILEGE_PUBLIC)
354 *(*list + j) = _list[i];
360 *sensor_count = count_public;
362 _D("success sensor_get_list");
364 return SENSOR_ERROR_NONE;
367 int sensor_get_sensor_list_by_uri(const char *uri, sensor_h **list, int *sensor_count)
370 result = sensord_get_sensors_by_uri(uri, list, sensor_count);
371 if (result == -EINVAL)
372 return SENSOR_ERROR_INVALID_PARAMETER;
373 else if (result == -EACCES)
374 return SENSOR_ERROR_PERMISSION_DENIED;
375 else if (result == -ENODATA)
376 return SENSOR_ERROR_NOT_SUPPORTED;
378 return SENSOR_ERROR_OPERATION_FAILED;
380 return SENSOR_ERROR_NONE;
383 int sensor_is_wake_up(sensor_h sensor, bool *wakeup)
385 _D("called sensor_get_type");
387 if (!sensor || !wakeup)
388 return SENSOR_ERROR_INVALID_PARAMETER;
390 *wakeup = sensord_is_wakeup_supported(sensor);
392 _D("success sensor_is_wake_up : [%d]", *wakeup);
394 return SENSOR_ERROR_NONE;
397 int sensor_create_listener(sensor_h sensor, sensor_listener_h *listener)
399 struct sensor_listener_s *_listener;
402 _D("called sensor_create_listener : listener[%p]", listener);
404 if (!sensor || !listener)
405 return SENSOR_ERROR_INVALID_PARAMETER;
407 _listener = new(std::nothrow) struct sensor_listener_s;
410 return SENSOR_ERROR_OUT_OF_MEMORY;
412 error = sensor_connect(sensor, _listener);
415 delete (struct sensor_listener_s *)_listener;
416 return SENSOR_ERROR_OPERATION_FAILED;
419 _listener->sensor = sensor;
420 _listener->pause = SENSOR_PAUSE_ALL;
421 _listener->batch_latency = SENSOR_BATCH_LATENCY_DEFAULT;
422 _listener->magic = SENSOR_LISTENER_MAGIC;
424 *listener = (sensor_listener_h) _listener;
426 _D("success sensor_create_listener");
428 return SENSOR_ERROR_NONE;
431 int sensor_destroy_listener(sensor_listener_h listener)
433 _D("called sensor_destroy : listener[%p]", listener);
436 return SENSOR_ERROR_INVALID_PARAMETER;
438 if (listener->magic != SENSOR_LISTENER_MAGIC)
439 return SENSOR_ERROR_INVALID_PARAMETER;
441 sensord_disconnect(listener->id);
444 delete (sensor_listener_s *)listener;
446 _D("success sensor_destroy");
448 return SENSOR_ERROR_NONE;
451 int sensor_listener_start(sensor_listener_h listener)
454 unsigned int pause = SENSOR_PAUSE_ALL;
456 _D("called sensor_listener_start : listener[%p]", listener);
459 return SENSOR_ERROR_INVALID_PARAMETER;
461 if (listener->magic != SENSOR_LISTENER_MAGIC)
462 return SENSOR_ERROR_INVALID_PARAMETER;
465 pause = listener->pause;
467 if (!sensord_start(id, 0))
468 return SENSOR_ERROR_OPERATION_FAILED;
470 if (sensord_set_attribute_int(id, SENSOR_ATTRIBUTE_PAUSE_POLICY, pause) < 0)
471 return SENSOR_ERROR_OPERATION_FAILED;
473 _D("success sensor_listener_start : id[%d]", id);
475 return SENSOR_ERROR_NONE;
478 int sensor_listener_stop(sensor_listener_h listener)
482 _D("called sensor_listener_stop : listener[%p]", listener);
485 return SENSOR_ERROR_INVALID_PARAMETER;
487 if (listener->magic != SENSOR_LISTENER_MAGIC)
488 return SENSOR_ERROR_INVALID_PARAMETER;
492 if (!sensord_stop(id))
493 return SENSOR_ERROR_OPERATION_FAILED;
495 _D("success sensor_listener_stop");
497 return SENSOR_ERROR_NONE;
500 int sensor_listener_set_event_cb(sensor_listener_h listener,
501 unsigned int interval, sensor_event_cb callback, void *user_data)
503 _W("DEPRECATION WARNING: sensor_listener_set_event_cb() is deprecated and will be removed from next release. Use sensor_listener_set_events_cb() instead.");
504 _D("called sensor_listener_set_event_cb : listener[%p]", listener);
505 return sensor_listener_set_event_cb_impl(listener, interval, (void*) callback, false, user_data);
508 int sensor_listener_unset_event_cb(sensor_listener_h listener)
510 _W("DEPRECATION WARNING: sensor_listener_unset_event_cb() is deprecated and will be removed from next release. Use sensor_listener_unset_events_cb() instead.");
511 _D("called sensor_listener_unset_event_cb : listener[%p]", listener);
512 return sensor_listener_unset_event_cb_impl(listener, false);
515 int sensor_listener_set_events_cb(sensor_listener_h listener, sensor_events_cb callback, void *user_data)
517 _D("called sensor_listener_set_events_cb : listener[%p]", listener);
518 return sensor_listener_set_event_cb_impl(listener, 0, (void*) callback, true, user_data);
521 int sensor_listener_unset_events_cb(sensor_listener_h listener)
523 _D("called sensor_listener_unset_events_cb : listener[%p]", listener);
524 return sensor_listener_unset_event_cb_impl(listener, true);
527 static void accuracy_changed_callback(sensor_t sensor,
528 unsigned long long timestamp, int accuracy, void *data)
530 sensor_listener_h listener = (sensor_listener_h)data;
532 if (!sensor || !listener->accu_callback)
535 ((sensor_accuracy_changed_cb)listener->accu_callback)
536 (sensor, timestamp, (sensor_data_accuracy_e)accuracy, listener->accu_user_data);
541 int sensor_listener_set_accuracy_cb(sensor_listener_h listener,
542 sensor_accuracy_changed_cb callback, void *data)
546 _D("called sensor_register_accuracy_cb : listener[%p], callback[%p], user_data[%p] cb[%p]",
547 listener, callback, data, accuracy_changed_callback);
549 if (!listener || !callback)
550 return SENSOR_ERROR_INVALID_PARAMETER;
552 if (listener->magic != SENSOR_LISTENER_MAGIC)
553 return SENSOR_ERROR_INVALID_PARAMETER;
556 listener->accu_callback = (void *)callback;
557 listener->accu_user_data = data;
559 if (!sensord_register_accuracy_cb(id, accuracy_changed_callback, listener)) {
560 listener->accu_callback = NULL;
561 listener->accu_user_data = NULL;
563 return SENSOR_ERROR_OPERATION_FAILED;
566 _D("success sensor_register_accuracy_cb");
568 return SENSOR_ERROR_NONE;
571 int sensor_listener_unset_accuracy_cb(sensor_listener_h listener)
575 _D("called sensor_unregister_accuracy_cb : listener[%p]", listener);
578 return SENSOR_ERROR_INVALID_PARAMETER;
580 if (listener->magic != SENSOR_LISTENER_MAGIC)
581 return SENSOR_ERROR_INVALID_PARAMETER;
585 if (!sensord_unregister_accuracy_cb(id))
586 return SENSOR_ERROR_OPERATION_FAILED;
588 listener->accu_callback = NULL;
589 listener->accu_user_data = NULL;
591 _D("success sensor_unregister_accuracy_cb");
593 return SENSOR_ERROR_NONE;
596 int sensor_listener_set_interval(sensor_listener_h listener, unsigned int interval)
600 unsigned int event_id;
602 _D("called sensor_set_interval : listener[%p], interval[%u]", listener, interval);
605 return SENSOR_ERROR_INVALID_PARAMETER;
607 if (listener->magic != SENSOR_LISTENER_MAGIC)
608 return SENSOR_ERROR_INVALID_PARAMETER;
611 type = (int)listener->type;
612 event_id = type << SENSOR_SHIFT_TYPE | 0x1;
614 if (!sensord_change_event_interval(id, event_id, interval))
615 return SENSOR_ERROR_OPERATION_FAILED;
617 _D("success sensor_set_interval");
619 return SENSOR_ERROR_NONE;
622 int sensor_listener_set_max_batch_latency(sensor_listener_h listener, unsigned int max_batch_latency)
627 unsigned int event_id;
629 _D("called sensor_set_max_batch_latency : listener[%p], max_batch_latency[%u]", listener, max_batch_latency);
632 return SENSOR_ERROR_INVALID_PARAMETER;
634 if (listener->magic != SENSOR_LISTENER_MAGIC)
635 return SENSOR_ERROR_INVALID_PARAMETER;
637 if (!sensord_get_max_batch_count(listener->sensor, &max_batch_count))
638 return SENSOR_ERROR_OPERATION_FAILED;
640 if (max_batch_count == 0)
641 return SENSOR_ERROR_NOT_SUPPORTED;
644 type = (int)listener->type;
645 event_id = type << SENSOR_SHIFT_TYPE | 0x1;
647 if (!sensord_change_event_max_batch_latency(id, event_id, max_batch_latency))
648 return SENSOR_ERROR_NOT_SUPPORTED;
650 listener->batch_latency = max_batch_latency;
652 _D("success sensor_set_max_batch_latency");
654 return SENSOR_ERROR_NONE;
657 int sensor_listener_set_attribute_int(sensor_listener_h listener, sensor_attribute_e attribute, int value)
662 _D("called sensor_set_attribute_int : listener[%p], attribute[%d], value[%d]", listener, attribute, value);
665 return SENSOR_ERROR_INVALID_PARAMETER;
667 if (listener->magic != SENSOR_LISTENER_MAGIC)
668 return SENSOR_ERROR_INVALID_PARAMETER;
672 error = sensord_set_attribute_int(id, (int)attribute, (int)value);
674 if (error == -EINVAL)
675 return SENSOR_ERROR_INVALID_PARAMETER;
676 else if (error != SENSOR_ERROR_NONE)
677 return SENSOR_ERROR_OPERATION_FAILED;
679 if (attribute == SENSOR_ATTRIBUTE_PAUSE_POLICY)
680 listener->pause = value;
682 _D("success sensor_set_attribute_int");
684 return SENSOR_ERROR_NONE;
687 int sensor_listener_set_option(sensor_listener_h listener, sensor_option_e option)
691 _D("called sensor_set_option : listener[%p], option[%d]", listener, option);
694 return SENSOR_ERROR_INVALID_PARAMETER;
696 if (listener->magic != SENSOR_LISTENER_MAGIC)
697 return SENSOR_ERROR_INVALID_PARAMETER;
701 if (sensord_set_attribute_int(id, SENSOR_ATTRIBUTE_PAUSE_POLICY, CONVERT_OPTION_PAUSE_POLICY(option)) < 0)
702 return SENSOR_ERROR_OPERATION_FAILED;
704 listener->pause = CONVERT_OPTION_PAUSE_POLICY(option);
706 _D("success sensor_set_option");
708 return SENSOR_ERROR_NONE;
711 int sensor_listener_read_data(sensor_listener_h listener, sensor_event_s *event)
716 unsigned int data_id;
718 _W("DEPRECATION WARNING: sensor_listener_read_data() is deprecated and will be removed from next release. Use sensor_listener_read_data_list() instead.");
719 _D("called sensor_read_data : listener[%p]", listener);
721 if (!listener || !event)
722 return SENSOR_ERROR_INVALID_PARAMETER;
724 if (listener->magic != SENSOR_LISTENER_MAGIC)
725 return SENSOR_ERROR_INVALID_PARAMETER;
728 type = (int)listener->type;
729 data_id = type << SENSOR_SHIFT_TYPE | 0x1;
731 if (!sensord_get_data(id, data_id, &data))
732 return SENSOR_ERROR_OPERATION_FAILED;
734 event->accuracy = data.accuracy;
735 event->timestamp = data.timestamp;
736 event->value_count = data.value_count;
738 for (int i = 0; i < data.value_count; ++i)
739 event->values[i] = data.values[i];
741 _D("success sensor_read_data");
743 return SENSOR_ERROR_NONE;
746 int sensor_listener_read_data_list(sensor_listener_h listener, sensor_event_s **events, int *count)
750 sensor_data_t* data_list = NULL;
751 int data_list_count = 0;
752 unsigned int data_id;
754 _D("called sensor_get_data_list : listener[%p]", listener);
756 if (!listener || !events || !count)
757 return SENSOR_ERROR_INVALID_PARAMETER;
759 if (listener->magic != SENSOR_LISTENER_MAGIC)
760 return SENSOR_ERROR_INVALID_PARAMETER;
763 type = (int)listener->type;
764 data_id = type << SENSOR_SHIFT_TYPE | 0x1;
766 if (!sensord_get_data_list(id, data_id, &data_list, &data_list_count))
767 return SENSOR_ERROR_OPERATION_FAILED;
769 *events = (sensor_event_s *)data_list;
770 *count = data_list_count;
772 _D("success sensor_get_data_list");
774 return SENSOR_ERROR_NONE;
777 int sensor_listener_flush(sensor_listener_h listener)
781 _D("called sensor_flush : listener[%p]", listener);
784 return SENSOR_ERROR_INVALID_PARAMETER;
786 if (listener->magic != SENSOR_LISTENER_MAGIC)
787 return SENSOR_ERROR_INVALID_PARAMETER;
791 if (!sensord_flush(id))
792 return SENSOR_ERROR_OPERATION_FAILED;
794 _D("success sensor_flush");
796 return SENSOR_ERROR_NONE;;
799 int sensor_get_uri(sensor_h sensor, char **uri)
804 return SENSOR_ERROR_INVALID_PARAMETER;
806 if ((ret_url = sensord_get_uri(sensor)) == NULL)
807 return SENSOR_ERROR_OPERATION_FAILED;
809 *uri = strdup(ret_url);
811 return SENSOR_ERROR_NONE;
814 int sensor_get_name(sensor_h sensor, char** name)
816 _D("called sensor_get_name");
818 const char *ret_name;
820 if (!sensor || !name)
821 return SENSOR_ERROR_INVALID_PARAMETER;
823 if ((ret_name = sensord_get_name(sensor)) == NULL)
824 return SENSOR_ERROR_OPERATION_FAILED;
826 *name = strdup(ret_name);
828 _D("success sensor_get_vendor : [%s]", *name);
830 return SENSOR_ERROR_NONE;
833 int sensor_get_vendor(sensor_h sensor, char** vendor)
835 _D("called sensor_get_vendor");
837 const char *ret_vendor;
839 if (!sensor || !vendor)
840 return SENSOR_ERROR_INVALID_PARAMETER;
842 if ((ret_vendor = sensord_get_vendor(sensor)) == NULL)
843 return SENSOR_ERROR_OPERATION_FAILED;
845 *vendor = strdup(ret_vendor);
847 _D("success sensor_vendor : [%s]", *vendor);
849 return SENSOR_ERROR_NONE;
852 int sensor_get_type(sensor_h sensor, sensor_type_e *type)
855 //_D("called sensor_get_type");
857 if (!sensor || !type)
858 return SENSOR_ERROR_INVALID_PARAMETER;
860 if (!sensord_get_type(sensor, &_type))
861 return SENSOR_ERROR_OPERATION_FAILED;
863 *type = (sensor_type_e) _type;
865 //_D("success sensor_get_type : [%d]", *type);
867 return SENSOR_ERROR_NONE;
870 int sensor_get_min_range(sensor_h sensor, float *min_range)
872 _D("called sensor_get_min_range");
874 if (!sensor || !min_range)
875 return SENSOR_ERROR_INVALID_PARAMETER;
877 if (!sensord_get_min_range(sensor, min_range))
878 return SENSOR_ERROR_OPERATION_FAILED;
880 _D("success sensor_get_min_range : [%f]", *min_range);
882 return SENSOR_ERROR_NONE;
885 int sensor_get_max_range(sensor_h sensor, float *max_range)
887 _D("called sensor_get_max_range");
889 if (!sensor || !max_range)
890 return SENSOR_ERROR_INVALID_PARAMETER;
892 if (!sensord_get_max_range(sensor, max_range))
893 return SENSOR_ERROR_OPERATION_FAILED;
895 _D("success sensor_get_max_range : [%f]", *max_range);
897 return SENSOR_ERROR_NONE;
900 int sensor_get_resolution(sensor_h sensor, float *resolution)
902 _D("called sensor_get_resolution");
904 if (!sensor || !resolution)
905 return SENSOR_ERROR_INVALID_PARAMETER;
907 if (!sensord_get_resolution(sensor, resolution))
908 return SENSOR_ERROR_OPERATION_FAILED;
910 _D("success sensor_get_resolution : [%f]", *resolution);
912 return SENSOR_ERROR_NONE;
915 int sensor_get_min_interval(sensor_h sensor, int *min_interval)
917 _D("called sensor_get_min_interval");
919 if (!sensor || !min_interval)
920 return SENSOR_ERROR_INVALID_PARAMETER;
922 if (!sensord_get_min_interval(sensor, min_interval))
923 return SENSOR_ERROR_OPERATION_FAILED;
925 _D("success sensor_get_min_interval : [%d]", *min_interval);
927 return SENSOR_ERROR_NONE;
930 int sensor_get_fifo_count(sensor_h sensor, int *fifo_count)
932 _D("called sensor_get_fifo_count");
934 if (!sensor || !fifo_count)
935 return SENSOR_ERROR_INVALID_PARAMETER;
937 if (!sensord_get_fifo_count(sensor, fifo_count))
938 return SENSOR_ERROR_OPERATION_FAILED;
940 _D("success sensor_get_fifo_count : [%d]", *fifo_count);
942 return SENSOR_ERROR_NONE;
945 int sensor_get_max_batch_count(sensor_h sensor, int *max_batch_count)
947 _D("called sensor_get_max_batch_count");
949 if (!sensor || !max_batch_count)
950 return SENSOR_ERROR_INVALID_PARAMETER;
952 if (!sensord_get_max_batch_count(sensor, max_batch_count))
953 return SENSOR_ERROR_OPERATION_FAILED;
955 _D("success sensor_get_max_batch_count : [%d]", *max_batch_count);
957 return SENSOR_ERROR_NONE;
960 int sensor_add_sensor_added_cb(sensor_added_cb callback, void *user_data)
963 result = sensord_add_sensor_added_cb(callback, user_data);
964 if (result == -EINVAL)
965 return SENSOR_ERROR_INVALID_PARAMETER;
967 return SENSOR_ERROR_OPERATION_FAILED;
969 return SENSOR_ERROR_NONE;
972 int sensor_remove_sensor_added_cb(sensor_added_cb callback)
975 result = sensord_remove_sensor_added_cb(callback);
976 if (result == -EINVAL)
977 return SENSOR_ERROR_INVALID_PARAMETER;
979 return SENSOR_ERROR_OPERATION_FAILED;
981 return SENSOR_ERROR_NONE;
984 int sensor_add_sensor_removed_cb(sensor_removed_cb callback, void *user_data)
987 result = sensord_add_sensor_removed_cb(callback, user_data);
988 if (result == -EINVAL)
989 return SENSOR_ERROR_INVALID_PARAMETER;
991 return SENSOR_ERROR_OPERATION_FAILED;
993 return SENSOR_ERROR_NONE;
996 int sensor_remove_sensor_removed_cb(sensor_removed_cb callback)
999 result = sensord_remove_sensor_removed_cb(callback);
1000 if (result == -EINVAL)
1001 return SENSOR_ERROR_INVALID_PARAMETER;
1002 else if (result < 0)
1003 return SENSOR_ERROR_OPERATION_FAILED;
1005 return SENSOR_ERROR_NONE;
1009 * FUNCTIONS : SENSOR_UTIL_*
1012 int sensor_util_get_declination(float latitude, float longitude, float altitude, float *declination)
1015 return SENSOR_ERROR_INVALID_PARAMETER;
1017 setCoordinate(latitude, longitude, altitude, declination, NULL, 1);
1019 return SENSOR_ERROR_NONE;
1022 int sensor_util_get_angle_change(float R[], float prevR[], float angleChange[])
1024 if (getAngleChange(R, prevR, angleChange) < 0)
1025 return SENSOR_ERROR_INVALID_PARAMETER;
1027 return SENSOR_ERROR_NONE;
1030 int sensor_util_get_orientation(float R[], float values[])
1033 return SENSOR_ERROR_INVALID_PARAMETER;
1035 values[0] = (float) atan2(R[1], R[4]);
1036 values[1] = (float) asin(-R[7]);
1037 values[2] = (float) atan2(-R[6], R[8]);
1039 return SENSOR_ERROR_NONE;
1042 int sensor_util_get_inclination(float I[], float* inclination)
1044 if (!I || !inclination)
1045 return SENSOR_ERROR_INVALID_PARAMETER;
1047 *inclination = atan2(I[5], I[4]);
1049 return SENSOR_ERROR_NONE;
1052 int sensor_util_remap_coordinate_system(float inR[], sensor_util_axis_e x, sensor_util_axis_e y, float outR[])
1054 if (remapCoordinateSystem(inR, CONVERT_AXIS_ENUM(x), CONVERT_AXIS_ENUM(y), outR) < 0)
1055 return SENSOR_ERROR_INVALID_PARAMETER;
1057 return SENSOR_ERROR_NONE;
1060 int sensor_util_get_rotation_matrix_from_vector(float Vx, float Vy, float Vz, float R[])
1062 float RV[4] = {0, Vx, Vy, Vz};
1064 RV[0] = 1 - Vx * Vx - Vy * Vy - Vz * Vz;
1065 RV[0] = (Vx > 0) ? (float) (sqrt(Vx)) : 0;
1067 if (quatToMatrix(RV, R) < 0)
1068 return SENSOR_ERROR_INVALID_PARAMETER;
1070 return SENSOR_ERROR_NONE;
1073 int sensor_util_get_rotation_matrix(float Gx, float Gy, float Gz, float Mx, float My, float Mz, float R[], float I[])
1075 float G[3] = {Gx, Gy, Gz};
1076 float M[3] = {Mx, My, Mz};
1078 if (getRotationMatrix(G, M, R, I) < 0)
1079 return SENSOR_ERROR_INVALID_PARAMETER;
1081 return SENSOR_ERROR_NONE;
1084 int sensor_util_get_altitude(float pressure, float sea_level_pressure, float temperature, float* altitude)
1087 return SENSOR_ERROR_INVALID_PARAMETER;
1088 if (sea_level_pressure <= 0)
1089 return SENSOR_ERROR_INVALID_PARAMETER;
1091 return SENSOR_ERROR_INVALID_PARAMETER;
1093 *altitude = (temperature + 273.15f) / 0.0065f * (1.0f - pow(pressure/sea_level_pressure, 1.0f/5.255f));
1095 return SENSOR_ERROR_NONE;