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.
23 #include <sensor_internal.h>
25 #include <sensor_private.h>
28 #include "include/sensor_log.h"
30 #define RETURN_VAL_IF(expr, err) \
38 #define RETURN_ERROR(err) \
44 #define SENSOR_SHIFT_TYPE 16
45 #define SENSOR_UNDEFINED_ID -1
46 #define SENSOR_BATCH_LATENCY_DEFAULT UINT_MAX
48 #define SENSOR_LISTENER_MAGIC 0xCAFECAFE
50 #define CONVERT_AXIS_ENUM(X) ((X) < 3 ? (X) + 0x81 : (X) - 2)
52 #define CONVERT_OPTION_PAUSE_POLICY(option) ((option) ^ 0b11)
54 #define WARN_DEPRECATED_SENSOR(X) \
56 if ((X) == SENSOR_LAST || (X) == SENSOR_CUSTOM) { \
57 _W("DEPRECATION WARNING: This sensor type is deprecated and will be removed from next release."); \
61 static int sensor_connect(sensor_h sensor, sensor_listener_h listener)
63 int id = SENSOR_UNDEFINED_ID;
69 return SENSOR_ERROR_INVALID_PARAMETER;
71 _D("called sensor_connect : listener[0x%x], sensor[0x%x]", listener, sensor);
73 sensord_get_type(sensor, &type);
74 event_type = type << SENSOR_SHIFT_TYPE | 0x1;
76 if (!sensord_is_supported_event_type(sensor, event_type, &support))
77 return SENSOR_ERROR_INVALID_PARAMETER;
80 return SENSOR_ERROR_NOT_SUPPORTED;
82 id = sensord_connect(sensor);
85 return SENSOR_ERROR_OPERATION_FAILED;
87 _D("success sensor_connect: id[%d]", id);
90 listener->type = type;
95 int sensor_is_supported(sensor_type_e type, bool *supported)
100 WARN_DEPRECATED_SENSOR(type);
102 if (type < SENSOR_ALL)
103 return SENSOR_ERROR_INVALID_PARAMETER;
106 return SENSOR_ERROR_INVALID_PARAMETER;
108 _D("called sensor_is_supported : type[%d]", type);
110 result = sensord_get_default_sensor((sensor_type_t)type, &sensor);
112 if (result == -EPERM)
113 return SENSOR_ERROR_OPERATION_FAILED;
118 * because is_supported() API is N/P API,
119 * it must not returns PERMISSION_DENIED error.
120 * -EACCES means that there is at least one sensor.
122 if (sensor || (result == -EACCES))
125 _D("success sensor(%d) is supported[%d]", type, *supported);
127 return SENSOR_ERROR_NONE;
130 int sensor_is_supported_by_uri(const char *uri, bool *supported)
136 return SENSOR_ERROR_INVALID_PARAMETER;
138 result = sensord_get_default_sensor_by_uri(uri, &sensor);
139 if (result == -EINVAL)
140 return SENSOR_ERROR_INVALID_PARAMETER;
141 else if (result == -EPERM || result == -EIO)
142 return SENSOR_ERROR_OPERATION_FAILED;
144 if (result == -ENODATA)
149 return SENSOR_ERROR_NONE;
152 int sensor_get_default_sensor(sensor_type_e type, sensor_h *sensor)
156 sensor_privilege_t privilege;
158 WARN_DEPRECATED_SENSOR(type);
160 _D("called sensor_get_default_sensor : type[%d], sensor[0x%x]", type, sensor);
162 if (type < SENSOR_ALL)
163 return SENSOR_ERROR_INVALID_PARAMETER;
166 return SENSOR_ERROR_INVALID_PARAMETER;
168 result = sensord_get_default_sensor((sensor_type_t)type, &_sensor);
169 if (result == -EACCES)
170 return SENSOR_ERROR_PERMISSION_DENIED;
171 else if (result == -EPERM)
172 return SENSOR_ERROR_OPERATION_FAILED;
175 return SENSOR_ERROR_NOT_SUPPORTED;
177 sensord_get_privilege(_sensor, &privilege);
178 if (privilege != SENSOR_PRIVILEGE_PUBLIC)
179 return SENSOR_ERROR_PERMISSION_DENIED;
183 _D("success sensor_get_default_sensor sensor[0x%x]", _sensor);
185 return SENSOR_ERROR_NONE;
188 int sensor_get_default_sensor_by_uri(const char *uri, sensor_h *sensor)
192 result = sensord_get_default_sensor_by_uri(uri, sensor);
193 if (result == -EINVAL)
194 return SENSOR_ERROR_INVALID_PARAMETER;
195 else if (result == -EACCES)
196 return SENSOR_ERROR_PERMISSION_DENIED;
197 else if (result == -ENODATA)
198 return SENSOR_ERROR_NOT_SUPPORTED;
200 return SENSOR_ERROR_OPERATION_FAILED;
202 return SENSOR_ERROR_NONE;
205 int sensor_get_sensor_list(sensor_type_e type, sensor_h **list, int *sensor_count)
211 WARN_DEPRECATED_SENSOR(type);
213 _D("called sensor_get_list : type[%d]", type);
215 if (type < SENSOR_ALL)
216 return SENSOR_ERROR_INVALID_PARAMETER;
218 if (!sensor_count || !list)
219 return SENSOR_ERROR_INVALID_PARAMETER;
221 result = sensord_get_sensors((sensor_type_t)type, &_list, &count);
223 if (result == -EACCES)
224 return SENSOR_ERROR_PERMISSION_DENIED;
225 else if (result == -EPERM)
226 return SENSOR_ERROR_OPERATION_FAILED;
227 else if (result == -ENODATA)
228 return SENSOR_ERROR_NOT_SUPPORTED;
231 int count_public = 0;
233 for (i = 0; i < count; ++i) {
234 sensor_privilege_t privilege;
236 sensord_get_privilege(_list[i], &privilege);
237 if (privilege != SENSOR_PRIVILEGE_PUBLIC)
243 if (count_public == 0) {
245 return SENSOR_ERROR_PERMISSION_DENIED;
248 *list = (sensor_h *) malloc((sizeof(int *)) * count_public);
252 return SENSOR_ERROR_OUT_OF_MEMORY;
255 for (i = 0, j = 0; i < count; ++i) {
256 sensor_privilege_t privilege;
258 sensord_get_privilege(_list[i], &privilege);
259 if (privilege != SENSOR_PRIVILEGE_PUBLIC)
262 *(*list + j) = _list[i];
268 *sensor_count = count_public;
270 _D("success sensor_get_list");
272 return SENSOR_ERROR_NONE;
275 int sensor_get_sensor_list_by_uri(const char *uri, sensor_h **list, int *sensor_count)
278 result = sensord_get_sensors_by_uri(uri, list, sensor_count);
279 if (result == -EINVAL)
280 return SENSOR_ERROR_INVALID_PARAMETER;
281 else if (result == -EACCES)
282 return SENSOR_ERROR_PERMISSION_DENIED;
283 else if (result == -ENODATA)
284 return SENSOR_ERROR_NOT_SUPPORTED;
286 return SENSOR_ERROR_OPERATION_FAILED;
288 return SENSOR_ERROR_NONE;
291 int sensor_is_wake_up(sensor_h sensor, bool *wakeup)
293 _D("called sensor_get_type");
295 if (!sensor || !wakeup)
296 return SENSOR_ERROR_INVALID_PARAMETER;
298 *wakeup = sensord_is_wakeup_supported(sensor);
300 _D("success sensor_is_wake_up : [%d]", *wakeup);
302 return SENSOR_ERROR_NONE;
305 int sensor_create_listener(sensor_h sensor, sensor_listener_h *listener)
307 struct sensor_listener_s *_listener;
310 _D("called sensor_create_listener : listener[0x%x]", listener);
312 if (!sensor || !listener)
313 return SENSOR_ERROR_INVALID_PARAMETER;
315 _listener = new(std::nothrow) struct sensor_listener_s;
318 return SENSOR_ERROR_OUT_OF_MEMORY;
320 error = sensor_connect(sensor, _listener);
323 delete (struct sensor_listener_s *)_listener;
324 return SENSOR_ERROR_OPERATION_FAILED;
327 _listener->sensor = sensor;
328 _listener->pause = SENSOR_PAUSE_ALL;
329 _listener->batch_latency = SENSOR_BATCH_LATENCY_DEFAULT;
330 _listener->magic = SENSOR_LISTENER_MAGIC;
332 *listener = (sensor_listener_h) _listener;
334 _D("success sensor_create_listener");
336 return SENSOR_ERROR_NONE;
339 int sensor_destroy_listener(sensor_listener_h listener)
341 _D("called sensor_destroy : listener[0x%x]", listener);
344 return SENSOR_ERROR_INVALID_PARAMETER;
346 if (listener->magic != SENSOR_LISTENER_MAGIC)
347 return SENSOR_ERROR_INVALID_PARAMETER;
349 sensord_disconnect(listener->id);
352 delete (sensor_listener_s *)listener;
354 _D("success sensor_destroy");
356 return SENSOR_ERROR_NONE;
359 int sensor_listener_start(sensor_listener_h listener)
362 unsigned int pause = SENSOR_PAUSE_ALL;
364 _D("called sensor_listener_start : listener[0x%x]", listener);
367 return SENSOR_ERROR_INVALID_PARAMETER;
369 if (listener->magic != SENSOR_LISTENER_MAGIC)
370 return SENSOR_ERROR_INVALID_PARAMETER;
373 pause = listener->pause;
375 if (!sensord_start(id, 0))
376 return SENSOR_ERROR_OPERATION_FAILED;
378 if (sensord_set_attribute_int(id, SENSOR_ATTRIBUTE_PAUSE_POLICY, pause) < 0)
379 return SENSOR_ERROR_OPERATION_FAILED;
381 _D("success sensor_listener_start : id[%d]", id);
383 return SENSOR_ERROR_NONE;
386 int sensor_listener_stop(sensor_listener_h listener)
390 _D("called sensor_listener_stop : listener[0x%x]", listener);
393 return SENSOR_ERROR_INVALID_PARAMETER;
395 if (listener->magic != SENSOR_LISTENER_MAGIC)
396 return SENSOR_ERROR_INVALID_PARAMETER;
400 if (!sensord_stop(id))
401 return SENSOR_ERROR_OPERATION_FAILED;
403 _D("success sensor_listener_stop");
405 return SENSOR_ERROR_NONE;
408 static void sensor_callback(sensor_t sensor, unsigned int event_type, sensor_data_t *data, void *user_data)
410 sensor_event_s *event;
411 sensor_listener_h listener;
412 listener = (sensor_listener_h)user_data;
414 if (!sensor || !listener->callback)
417 event = (sensor_event_s *)data;
419 ((sensor_event_cb) listener->callback)(sensor, event, listener->user_data);
423 int sensor_listener_set_event_cb(sensor_listener_h listener,
424 unsigned int interval, sensor_event_cb callback, void *user_data)
427 unsigned int event_id;
428 unsigned int batch_latency;
430 if (!listener || !callback)
431 return SENSOR_ERROR_INVALID_PARAMETER;
433 if (listener->magic != SENSOR_LISTENER_MAGIC)
434 return SENSOR_ERROR_INVALID_PARAMETER;
436 _D("called sensor_listener_set_event : listener[0x%x], interval[%d], callback[0x%x], user_data[0x%x], id[%d]",
437 listener, interval, callback, user_data, listener->id);
440 event_id = (listener->type) << SENSOR_SHIFT_TYPE | 0x1;
441 batch_latency = listener->batch_latency;
443 listener->callback = (void *)callback;
444 listener->user_data = user_data;
446 if (!sensord_register_event(id, event_id, interval, batch_latency,
447 sensor_callback, listener)) {
448 listener->callback = NULL;
449 listener->user_data = NULL;
451 return SENSOR_ERROR_OPERATION_FAILED;
454 _D("success sensor_listener_set_event");
456 return SENSOR_ERROR_NONE;
459 int sensor_listener_unset_event_cb(sensor_listener_h listener)
463 unsigned int event_id;
465 _D("called sensor_unregister_event : listener[0x%x]", listener);
468 return SENSOR_ERROR_INVALID_PARAMETER;
470 if (listener->magic != SENSOR_LISTENER_MAGIC)
471 return SENSOR_ERROR_INVALID_PARAMETER;
474 type = (int)listener->type;
475 event_id = type << SENSOR_SHIFT_TYPE | 0x1;
477 if (!sensord_unregister_event(id, event_id))
478 return SENSOR_ERROR_OPERATION_FAILED;
480 listener->callback = NULL;
481 listener->user_data = NULL;
483 _D("success sensor_unregister_event");
485 return SENSOR_ERROR_NONE;
488 static void accuracy_changed_callback(sensor_t sensor,
489 unsigned long long timestamp, int accuracy, void *data)
491 sensor_listener_h listener = (sensor_listener_h)data;
493 if (!sensor || !listener->accu_callback)
496 ((sensor_accuracy_changed_cb)listener->accu_callback)
497 (sensor, timestamp, (sensor_data_accuracy_e)accuracy, listener->accu_user_data);
502 int sensor_listener_set_accuracy_cb(sensor_listener_h listener,
503 sensor_accuracy_changed_cb callback, void *data)
507 _D("called sensor_register_accuracy_cb : listener[0x%x], callback[0x%x], user_data[0x%x] cb[%p]",
508 listener, callback, data, accuracy_changed_callback);
510 if (!listener || !callback)
511 return SENSOR_ERROR_INVALID_PARAMETER;
513 if (listener->magic != SENSOR_LISTENER_MAGIC)
514 return SENSOR_ERROR_INVALID_PARAMETER;
517 listener->accu_callback = (void *)callback;
518 listener->accu_user_data = data;
520 if (!sensord_register_accuracy_cb(id, accuracy_changed_callback, listener)) {
521 listener->accu_callback = NULL;
522 listener->accu_user_data = NULL;
524 return SENSOR_ERROR_OPERATION_FAILED;
527 _D("success sensor_register_accuracy_cb");
529 return SENSOR_ERROR_NONE;
532 int sensor_listener_unset_accuracy_cb(sensor_listener_h listener)
536 _D("called sensor_unregister_accuracy_cb : listener[0x%x]", listener);
539 return SENSOR_ERROR_INVALID_PARAMETER;
541 if (listener->magic != SENSOR_LISTENER_MAGIC)
542 return SENSOR_ERROR_INVALID_PARAMETER;
546 if (!sensord_unregister_accuracy_cb(id))
547 return SENSOR_ERROR_OPERATION_FAILED;
549 listener->accu_callback = NULL;
550 listener->accu_user_data = NULL;
552 _D("success sensor_unregister_accuracy_cb");
554 return SENSOR_ERROR_NONE;
557 int sensor_listener_set_interval(sensor_listener_h listener, unsigned int interval)
561 unsigned int event_id;
563 _D("called sensor_set_interval : listener[0x%x], interval[%d]", listener, interval);
566 return SENSOR_ERROR_INVALID_PARAMETER;
568 if (listener->magic != SENSOR_LISTENER_MAGIC)
569 return SENSOR_ERROR_INVALID_PARAMETER;
572 type = (int)listener->type;
573 event_id = type << SENSOR_SHIFT_TYPE | 0x1;
575 if (!sensord_change_event_interval(id, event_id, interval))
576 return SENSOR_ERROR_OPERATION_FAILED;
578 _D("success sensor_set_interval");
580 return SENSOR_ERROR_NONE;
583 int sensor_listener_set_max_batch_latency(sensor_listener_h listener, unsigned int max_batch_latency)
588 unsigned int event_id;
590 _D("called sensor_set_max_batch_latency : listener[0x%x], max_batch_latency[%d]", listener, max_batch_latency);
593 return SENSOR_ERROR_INVALID_PARAMETER;
595 if (listener->magic != SENSOR_LISTENER_MAGIC)
596 return SENSOR_ERROR_INVALID_PARAMETER;
598 if (!sensord_get_max_batch_count(listener->sensor, &max_batch_count))
599 return SENSOR_ERROR_OPERATION_FAILED;
601 if (max_batch_count == 0)
602 return SENSOR_ERROR_NOT_SUPPORTED;
605 type = (int)listener->type;
606 event_id = type << SENSOR_SHIFT_TYPE | 0x1;
608 if (!sensord_change_event_max_batch_latency(id, event_id, max_batch_latency))
609 return SENSOR_ERROR_NOT_SUPPORTED;
611 listener->batch_latency = max_batch_latency;
613 _D("success sensor_set_max_batch_latency");
615 return SENSOR_ERROR_NONE;
618 int sensor_listener_set_attribute_int(sensor_listener_h listener, sensor_attribute_e attribute, int value)
623 _D("called sensor_set_attribute_int : listener[0x%x], attribute[%d], value[%d]", listener, attribute, value);
626 return SENSOR_ERROR_INVALID_PARAMETER;
628 if (listener->magic != SENSOR_LISTENER_MAGIC)
629 return SENSOR_ERROR_INVALID_PARAMETER;
633 error = sensord_set_attribute_int(id, (int)attribute, (int)value);
635 if (error == -EINVAL)
636 return SENSOR_ERROR_INVALID_PARAMETER;
637 else if (error != SENSOR_ERROR_NONE)
638 return SENSOR_ERROR_OPERATION_FAILED;
640 if (attribute == SENSOR_ATTRIBUTE_PAUSE_POLICY)
641 listener->pause = value;
643 _D("success sensor_set_attribute_int");
645 return SENSOR_ERROR_NONE;
648 int sensor_listener_set_option(sensor_listener_h listener, sensor_option_e option)
652 _D("called sensor_set_option : listener[0x%x], option[%d]", listener, option);
655 return SENSOR_ERROR_INVALID_PARAMETER;
657 if (listener->magic != SENSOR_LISTENER_MAGIC)
658 return SENSOR_ERROR_INVALID_PARAMETER;
662 if (sensord_set_attribute_int(id, SENSOR_ATTRIBUTE_PAUSE_POLICY, CONVERT_OPTION_PAUSE_POLICY(option)) < 0)
663 return SENSOR_ERROR_OPERATION_FAILED;
665 listener->pause = CONVERT_OPTION_PAUSE_POLICY(option);
667 _D("success sensor_set_option");
669 return SENSOR_ERROR_NONE;
672 int sensor_listener_read_data(sensor_listener_h listener, sensor_event_s *event)
677 unsigned int data_id;
679 _D("called sensor_read_data : listener[0x%x]", listener);
681 if (!listener || !event)
682 return SENSOR_ERROR_INVALID_PARAMETER;
684 if (listener->magic != SENSOR_LISTENER_MAGIC)
685 return SENSOR_ERROR_INVALID_PARAMETER;
688 type = (int)listener->type;
689 data_id = type << SENSOR_SHIFT_TYPE | 0x1;
691 if (!sensord_get_data(id, data_id, &data))
692 return SENSOR_ERROR_OPERATION_FAILED;
694 event->accuracy = data.accuracy;
695 event->timestamp = data.timestamp;
696 event->value_count = data.value_count;
698 for (int i = 0; i < data.value_count; ++i)
699 event->values[i] = data.values[i];
701 _D("success sensor_read_data");
703 return SENSOR_ERROR_NONE;
706 int sensor_get_uri(sensor_h sensor, char **uri)
709 return SENSOR_ERROR_INVALID_PARAMETER;
711 *uri = strdup(sensord_get_uri(sensor));
713 return SENSOR_ERROR_NONE;
716 int sensor_get_name(sensor_h sensor, char** name)
718 _D("called sensor_get_name");
720 if (!sensor || !name)
721 return SENSOR_ERROR_INVALID_PARAMETER;
723 *name = strdup(sensord_get_name(sensor));
725 _D("success sensor_get_vendor : [%s]", *name);
727 return SENSOR_ERROR_NONE;
730 int sensor_get_vendor(sensor_h sensor, char** vendor)
732 _D("called sensor_get_vendor");
734 if (!sensor || !vendor)
735 return SENSOR_ERROR_INVALID_PARAMETER;
737 *vendor = strdup(sensord_get_vendor(sensor));
739 _D("success sensor_vendor : [%s]", *vendor);
741 return SENSOR_ERROR_NONE;
744 int sensor_get_type(sensor_h sensor, sensor_type_e *type)
747 _D("called sensor_get_type");
749 if (!sensor || !type)
750 return SENSOR_ERROR_INVALID_PARAMETER;
752 if (!sensord_get_type(sensor, &_type))
753 return SENSOR_ERROR_OPERATION_FAILED;
755 *type = (sensor_type_e) _type;
757 _D("success sensor_get_type : [%d]", *type);
759 return SENSOR_ERROR_NONE;
762 int sensor_get_min_range(sensor_h sensor, float *min_range)
764 _D("called sensor_get_min_range");
766 if (!sensor || !min_range)
767 return SENSOR_ERROR_INVALID_PARAMETER;
769 if (!sensord_get_min_range(sensor, min_range))
770 return SENSOR_ERROR_OPERATION_FAILED;
772 _D("success sensor_get_min_range : [%d]", *min_range);
774 return SENSOR_ERROR_NONE;
777 int sensor_get_max_range(sensor_h sensor, float *max_range)
779 _D("called sensor_get_max_range");
781 if (!sensor || !max_range)
782 return SENSOR_ERROR_INVALID_PARAMETER;
784 if (!sensord_get_max_range(sensor, max_range))
785 return SENSOR_ERROR_OPERATION_FAILED;
787 _D("success sensor_get_max_range : [%d]", *max_range);
789 return SENSOR_ERROR_NONE;
792 int sensor_get_resolution(sensor_h sensor, float *resolution)
794 _D("called sensor_get_resolution");
796 if (!sensor || !resolution)
797 return SENSOR_ERROR_INVALID_PARAMETER;
799 if (!sensord_get_resolution(sensor, resolution))
800 return SENSOR_ERROR_OPERATION_FAILED;
802 _D("success sensor_get_resolution : [%d]", *resolution);
804 return SENSOR_ERROR_NONE;
807 int sensor_get_min_interval(sensor_h sensor, int *min_interval)
809 _D("called sensor_get_min_interval");
811 if (!sensor || !min_interval)
812 return SENSOR_ERROR_INVALID_PARAMETER;
814 if (!sensord_get_min_interval(sensor, min_interval))
815 return SENSOR_ERROR_OPERATION_FAILED;
817 _D("success sensor_get_min_interval : [%d]", *min_interval);
819 return SENSOR_ERROR_NONE;
822 int sensor_get_fifo_count(sensor_h sensor, int *fifo_count)
824 _D("called sensor_get_fifo_count");
826 if (!sensor || !fifo_count)
827 return SENSOR_ERROR_INVALID_PARAMETER;
829 if (!sensord_get_fifo_count(sensor, fifo_count))
830 return SENSOR_ERROR_OPERATION_FAILED;
832 _D("success sensor_get_fifo_count : [%d]", *fifo_count);
834 return SENSOR_ERROR_NONE;
837 int sensor_get_max_batch_count(sensor_h sensor, int *max_batch_count)
839 _D("called sensor_get_max_batch_count");
841 if (!sensor || !max_batch_count)
842 return SENSOR_ERROR_INVALID_PARAMETER;
844 if (!sensord_get_max_batch_count(sensor, max_batch_count))
845 return SENSOR_ERROR_OPERATION_FAILED;
847 _D("success sensor_get_max_batch_count : [%d]", *max_batch_count);
849 return SENSOR_ERROR_NONE;
852 int sensor_add_sensor_added_cb(sensor_added_cb callback, void *user_data)
855 result = sensord_add_sensor_added_cb(callback, user_data);
856 if (result == -EINVAL)
857 return SENSOR_ERROR_INVALID_PARAMETER;
859 return SENSOR_ERROR_OPERATION_FAILED;
861 return SENSOR_ERROR_NONE;
864 int sensor_remove_sensor_added_cb(sensor_added_cb callback)
867 result = sensord_remove_sensor_added_cb(callback);
868 if (result == -EINVAL)
869 return SENSOR_ERROR_INVALID_PARAMETER;
871 return SENSOR_ERROR_OPERATION_FAILED;
873 return SENSOR_ERROR_NONE;
876 int sensor_add_sensor_removed_cb(sensor_removed_cb callback, void *user_data)
879 result = sensord_add_sensor_removed_cb(callback, user_data);
880 if (result == -EINVAL)
881 return SENSOR_ERROR_INVALID_PARAMETER;
883 return SENSOR_ERROR_OPERATION_FAILED;
885 return SENSOR_ERROR_NONE;
888 int sensor_remove_sensor_removed_cb(sensor_removed_cb callback)
891 result = sensord_remove_sensor_removed_cb(callback);
892 if (result == -EINVAL)
893 return SENSOR_ERROR_INVALID_PARAMETER;
895 return SENSOR_ERROR_OPERATION_FAILED;
897 return SENSOR_ERROR_NONE;
901 * FUNCTIONS : SENSOR_UTIL_*
904 int sensor_util_get_declination(float latitude, float longitude, float altitude, float *declination)
907 return SENSOR_ERROR_INVALID_PARAMETER;
909 setCoordinate(latitude, longitude, altitude, declination, NULL, 1);
911 return SENSOR_ERROR_NONE;
914 int sensor_util_get_angle_change(float R[], float prevR[], float angleChange[])
916 if (getAngleChange(R, prevR, angleChange) < 0)
917 return SENSOR_ERROR_INVALID_PARAMETER;
919 return SENSOR_ERROR_NONE;
922 int sensor_util_get_orientation(float R[], float values[])
925 return SENSOR_ERROR_INVALID_PARAMETER;
927 values[0] = (float) atan2(R[1], R[4]);
928 values[1] = (float) asin(-R[7]);
929 values[2] = (float) atan2(-R[6], R[8]);
931 return SENSOR_ERROR_NONE;
934 int sensor_util_get_inclination(float I[], float* inclination)
936 if (!I || !inclination)
937 return SENSOR_ERROR_INVALID_PARAMETER;
939 *inclination = atan2(I[5], I[4]);
941 return SENSOR_ERROR_NONE;
944 int sensor_util_remap_coordinate_system(float inR[], sensor_util_axis_e x, sensor_util_axis_e y, float outR[])
946 if (remapCoordinateSystem(inR, CONVERT_AXIS_ENUM(x), CONVERT_AXIS_ENUM(y), outR) < 0)
947 return SENSOR_ERROR_INVALID_PARAMETER;
949 return SENSOR_ERROR_NONE;
952 int sensor_util_get_rotation_matrix_from_vector(float Vx, float Vy, float Vz, float R[])
954 float RV[4] = {0, Vx, Vy, Vz};
956 RV[0] = 1 - Vx * Vx - Vy * Vy - Vz * Vz;
957 RV[0] = (Vx > 0) ? (float) (sqrt(Vx)) : 0;
959 if (quatToMatrix(RV, R) < 0)
960 return SENSOR_ERROR_INVALID_PARAMETER;
962 return SENSOR_ERROR_NONE;
965 int sensor_util_get_rotation_matrix(float Gx, float Gy, float Gz, float Mx, float My, float Mz, float R[], float I[])
967 float G[3] = {Gx, Gy, Gz};
968 float M[3] = {Mx, My, Mz};
970 if (getRotationMatrix(G, M, R, I) < 0)
971 return SENSOR_ERROR_INVALID_PARAMETER;
973 return SENSOR_ERROR_NONE;