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_get_default_sensor(sensor_type_e type, sensor_h *sensor)
134 sensor_privilege_t privilege;
136 WARN_DEPRECATED_SENSOR(type);
138 _D("called sensor_get_default_sensor : type[%d], sensor[0x%x]", type, sensor);
140 if (type < SENSOR_ALL)
141 return SENSOR_ERROR_INVALID_PARAMETER;
144 return SENSOR_ERROR_INVALID_PARAMETER;
146 result = sensord_get_default_sensor((sensor_type_t)type, &_sensor);
147 if (result == -EACCES)
148 return SENSOR_ERROR_PERMISSION_DENIED;
149 else if (result == -EPERM)
150 return SENSOR_ERROR_OPERATION_FAILED;
153 return SENSOR_ERROR_NOT_SUPPORTED;
155 sensord_get_privilege(_sensor, &privilege);
156 if (privilege != SENSOR_PRIVILEGE_PUBLIC)
157 return SENSOR_ERROR_PERMISSION_DENIED;
161 _D("success sensor_get_default_sensor sensor[0x%x]", _sensor);
163 return SENSOR_ERROR_NONE;
166 int sensor_get_sensor_list(sensor_type_e type, sensor_h **list, int *sensor_count)
172 WARN_DEPRECATED_SENSOR(type);
174 _D("called sensor_get_list : type[%d]", type);
176 if (type < SENSOR_ALL)
177 return SENSOR_ERROR_INVALID_PARAMETER;
179 if (!sensor_count || !list)
180 return SENSOR_ERROR_INVALID_PARAMETER;
182 result = sensord_get_sensors((sensor_type_t)type, &_list, &count);
184 if (result == -EACCES)
185 return SENSOR_ERROR_PERMISSION_DENIED;
186 else if (result == -EPERM)
187 return SENSOR_ERROR_OPERATION_FAILED;
188 else if (result == -ENODATA)
189 return SENSOR_ERROR_NOT_SUPPORTED;
192 int count_public = 0;
194 for (i = 0; i < count; ++i) {
195 sensor_privilege_t privilege;
197 sensord_get_privilege(_list[i], &privilege);
198 if (privilege != SENSOR_PRIVILEGE_PUBLIC)
204 if (count_public == 0) {
206 return SENSOR_ERROR_PERMISSION_DENIED;
209 *list = (sensor_h *) malloc((sizeof(int *)) * count_public);
213 return SENSOR_ERROR_OUT_OF_MEMORY;
216 for (i = 0, j = 0; i < count; ++i) {
217 sensor_privilege_t privilege;
219 sensord_get_privilege(_list[i], &privilege);
220 if (privilege != SENSOR_PRIVILEGE_PUBLIC)
223 *(*list + j) = _list[i];
229 *sensor_count = count_public;
231 _D("success sensor_get_list");
233 return SENSOR_ERROR_NONE;
236 int sensor_is_wake_up(sensor_h sensor, bool *wakeup)
238 _D("called sensor_get_type");
240 if (!sensor || !wakeup)
241 return SENSOR_ERROR_INVALID_PARAMETER;
243 *wakeup = sensord_is_wakeup_supported(sensor);
245 _D("success sensor_is_wake_up : [%d]", *wakeup);
247 return SENSOR_ERROR_NONE;
250 int sensor_create_listener(sensor_h sensor, sensor_listener_h *listener)
252 struct sensor_listener_s *_listener;
255 _D("called sensor_create_listener : listener[0x%x]", listener);
257 if (!sensor || !listener)
258 return SENSOR_ERROR_INVALID_PARAMETER;
260 _listener = new(std::nothrow) struct sensor_listener_s;
263 return SENSOR_ERROR_OUT_OF_MEMORY;
265 error = sensor_connect(sensor, _listener);
268 delete (struct sensor_listener_s *)_listener;
269 return SENSOR_ERROR_OPERATION_FAILED;
272 _listener->sensor = sensor;
273 _listener->pause = SENSOR_PAUSE_ALL;
274 _listener->batch_latency = SENSOR_BATCH_LATENCY_DEFAULT;
275 _listener->magic = SENSOR_LISTENER_MAGIC;
277 *listener = (sensor_listener_h) _listener;
279 _D("success sensor_create_listener");
281 return SENSOR_ERROR_NONE;
284 int sensor_destroy_listener(sensor_listener_h listener)
286 _D("called sensor_destroy : listener[0x%x]", listener);
289 return SENSOR_ERROR_INVALID_PARAMETER;
291 if (listener->magic != SENSOR_LISTENER_MAGIC)
292 return SENSOR_ERROR_INVALID_PARAMETER;
294 sensord_disconnect(listener->id);
297 delete (sensor_listener_s *)listener;
299 _D("success sensor_destroy");
301 return SENSOR_ERROR_NONE;
304 int sensor_listener_start(sensor_listener_h listener)
307 unsigned int pause = SENSOR_PAUSE_ALL;
309 _D("called sensor_listener_start : listener[0x%x]", listener);
312 return SENSOR_ERROR_INVALID_PARAMETER;
314 if (listener->magic != SENSOR_LISTENER_MAGIC)
315 return SENSOR_ERROR_INVALID_PARAMETER;
318 pause = listener->pause;
320 if (!sensord_start(id, 0))
321 return SENSOR_ERROR_OPERATION_FAILED;
323 if (sensord_set_attribute_int(id, SENSOR_ATTRIBUTE_PAUSE_POLICY, pause) < 0)
324 return SENSOR_ERROR_OPERATION_FAILED;
326 _D("success sensor_listener_start : id[%d]", id);
328 return SENSOR_ERROR_NONE;
331 int sensor_listener_stop(sensor_listener_h listener)
335 _D("called sensor_listener_stop : listener[0x%x]", listener);
338 return SENSOR_ERROR_INVALID_PARAMETER;
340 if (listener->magic != SENSOR_LISTENER_MAGIC)
341 return SENSOR_ERROR_INVALID_PARAMETER;
345 if (!sensord_stop(id))
346 return SENSOR_ERROR_OPERATION_FAILED;
348 _D("success sensor_listener_stop");
350 return SENSOR_ERROR_NONE;
353 static void sensor_callback(sensor_t sensor, unsigned int event_type, sensor_data_t *data, void *user_data)
355 sensor_event_s *event;
356 sensor_listener_h listener;
357 listener = (sensor_listener_h)user_data;
359 _D("success sensor_callback, sensor[%p] listener[%p] listener->callback[%p]", sensor, listener, listener->callback);
360 if (!sensor || !listener->callback)
363 event = (sensor_event_s *)data;
365 ((sensor_event_cb) listener->callback)(sensor, event, listener->user_data);
369 int sensor_listener_set_event_cb(sensor_listener_h listener,
370 unsigned int interval, sensor_event_cb callback, void *user_data)
373 unsigned int event_id;
374 unsigned int batch_latency;
376 if (!listener || !callback)
377 return SENSOR_ERROR_INVALID_PARAMETER;
379 if (listener->magic != SENSOR_LISTENER_MAGIC)
380 return SENSOR_ERROR_INVALID_PARAMETER;
382 _D("called sensor_listener_set_event : listener[0x%x], interval[%d], callback[0x%x], user_data[0x%x], id[%d]",
383 listener, interval, callback, user_data, listener->id);
386 event_id = (listener->type) << SENSOR_SHIFT_TYPE | 0x1;
387 batch_latency = listener->batch_latency;
389 listener->callback = (void *)callback;
390 listener->user_data = user_data;
392 if (!sensord_register_event(id, event_id, interval, batch_latency,
393 sensor_callback, listener)) {
394 listener->callback = NULL;
395 listener->user_data = NULL;
397 return SENSOR_ERROR_OPERATION_FAILED;
400 _D("success sensor_listener_set_event");
402 return SENSOR_ERROR_NONE;
405 int sensor_listener_unset_event_cb(sensor_listener_h listener)
409 unsigned int event_id;
411 _D("called sensor_unregister_event : listener[0x%x]", listener);
414 return SENSOR_ERROR_INVALID_PARAMETER;
416 if (listener->magic != SENSOR_LISTENER_MAGIC)
417 return SENSOR_ERROR_INVALID_PARAMETER;
420 type = (int)listener->type;
421 event_id = type << SENSOR_SHIFT_TYPE | 0x1;
423 if (!sensord_unregister_event(id, event_id))
424 return SENSOR_ERROR_OPERATION_FAILED;
426 listener->callback = NULL;
427 listener->user_data = NULL;
429 _D("success sensor_unregister_event");
431 return SENSOR_ERROR_NONE;
434 static void accuracy_changed_callback(sensor_t sensor,
435 unsigned long long timestamp, int accuracy, void *data)
437 sensor_listener_h listener = (sensor_listener_h)data;
439 if (!sensor || !listener->accu_callback)
442 ((sensor_accuracy_changed_cb)listener->accu_callback)
443 (sensor, timestamp, (sensor_data_accuracy_e)accuracy, listener->accu_user_data);
448 int sensor_listener_set_accuracy_cb(sensor_listener_h listener,
449 sensor_accuracy_changed_cb callback, void *data)
453 _D("called sensor_register_accuracy_cb : listener[0x%x], callback[0x%x], user_data[0x%x] cb[%p]",
454 listener, callback, data, accuracy_changed_callback);
456 if (!listener || !callback)
457 return SENSOR_ERROR_INVALID_PARAMETER;
459 if (listener->magic != SENSOR_LISTENER_MAGIC)
460 return SENSOR_ERROR_INVALID_PARAMETER;
463 listener->accu_callback = (void *)callback;
464 listener->accu_user_data = data;
466 if (!sensord_register_accuracy_cb(id, accuracy_changed_callback, listener)) {
467 listener->accu_callback = NULL;
468 listener->accu_user_data = NULL;
470 return SENSOR_ERROR_OPERATION_FAILED;
473 _D("success sensor_register_accuracy_cb");
475 return SENSOR_ERROR_NONE;
478 int sensor_listener_unset_accuracy_cb(sensor_listener_h listener)
482 _D("called sensor_unregister_accuracy_cb : listener[0x%x]", listener);
485 return SENSOR_ERROR_INVALID_PARAMETER;
487 if (listener->magic != SENSOR_LISTENER_MAGIC)
488 return SENSOR_ERROR_INVALID_PARAMETER;
492 if (!sensord_unregister_accuracy_cb(id))
493 return SENSOR_ERROR_OPERATION_FAILED;
495 listener->accu_callback = NULL;
496 listener->accu_user_data = NULL;
498 _D("success sensor_unregister_accuracy_cb");
500 return SENSOR_ERROR_NONE;
503 int sensor_listener_set_interval(sensor_listener_h listener, unsigned int interval)
507 unsigned int event_id;
509 _D("called sensor_set_interval : listener[0x%x], interval[%d]", listener, interval);
512 return SENSOR_ERROR_INVALID_PARAMETER;
514 if (listener->magic != SENSOR_LISTENER_MAGIC)
515 return SENSOR_ERROR_INVALID_PARAMETER;
518 type = (int)listener->type;
519 event_id = type << SENSOR_SHIFT_TYPE | 0x1;
521 if (!sensord_change_event_interval(id, event_id, interval))
522 return SENSOR_ERROR_OPERATION_FAILED;
524 _D("success sensor_set_interval");
526 return SENSOR_ERROR_NONE;
529 int sensor_listener_set_max_batch_latency(sensor_listener_h listener, unsigned int max_batch_latency)
534 unsigned int event_id;
536 _D("called sensor_set_max_batch_latency : listener[0x%x], max_batch_latency[%d]", listener, max_batch_latency);
539 return SENSOR_ERROR_INVALID_PARAMETER;
541 if (listener->magic != SENSOR_LISTENER_MAGIC)
542 return SENSOR_ERROR_INVALID_PARAMETER;
544 if (!sensord_get_max_batch_count(listener->sensor, &max_batch_count))
545 return SENSOR_ERROR_OPERATION_FAILED;
547 if (max_batch_count == 0)
548 return SENSOR_ERROR_NOT_SUPPORTED;
551 type = (int)listener->type;
552 event_id = type << SENSOR_SHIFT_TYPE | 0x1;
554 if (!sensord_change_event_max_batch_latency(id, event_id, max_batch_latency))
555 return SENSOR_ERROR_NOT_SUPPORTED;
557 listener->batch_latency = max_batch_latency;
559 _D("success sensor_set_max_batch_latency");
561 return SENSOR_ERROR_NONE;
564 int sensor_listener_set_attribute_int(sensor_listener_h listener, sensor_attribute_e attribute, int value)
569 _D("called sensor_set_attribute_int : listener[0x%x], attribute[%d], value[%d]", listener, attribute, value);
572 return SENSOR_ERROR_INVALID_PARAMETER;
574 if (listener->magic != SENSOR_LISTENER_MAGIC)
575 return SENSOR_ERROR_INVALID_PARAMETER;
579 error = sensord_set_attribute_int(id, (int)attribute, (int)value);
581 if (error == -EINVAL)
582 return SENSOR_ERROR_INVALID_PARAMETER;
583 else if (error != SENSOR_ERROR_NONE)
584 return SENSOR_ERROR_OPERATION_FAILED;
586 if (attribute == SENSOR_ATTRIBUTE_PAUSE_POLICY)
587 listener->pause = value;
589 _D("success sensor_set_attribute_int");
591 return SENSOR_ERROR_NONE;
594 int sensor_listener_set_option(sensor_listener_h listener, sensor_option_e option)
598 _D("called sensor_set_option : listener[0x%x], option[%d]", listener, option);
601 return SENSOR_ERROR_INVALID_PARAMETER;
603 if (listener->magic != SENSOR_LISTENER_MAGIC)
604 return SENSOR_ERROR_INVALID_PARAMETER;
608 if (sensord_set_attribute_int(id, SENSOR_ATTRIBUTE_PAUSE_POLICY, CONVERT_OPTION_PAUSE_POLICY(option)) < 0)
609 return SENSOR_ERROR_OPERATION_FAILED;
611 listener->pause = CONVERT_OPTION_PAUSE_POLICY(option);
613 _D("success sensor_set_option");
615 return SENSOR_ERROR_NONE;
618 int sensor_listener_read_data(sensor_listener_h listener, sensor_event_s *event)
623 unsigned int data_id;
625 _D("called sensor_read_data : listener[0x%x]", listener);
627 if (!listener || !event)
628 return SENSOR_ERROR_INVALID_PARAMETER;
630 if (listener->magic != SENSOR_LISTENER_MAGIC)
631 return SENSOR_ERROR_INVALID_PARAMETER;
634 type = (int)listener->type;
635 data_id = type << SENSOR_SHIFT_TYPE | 0x1;
637 if (!sensord_get_data(id, data_id, &data))
638 return SENSOR_ERROR_OPERATION_FAILED;
640 event->accuracy = data.accuracy;
641 event->timestamp = data.timestamp;
642 event->value_count = data.value_count;
644 for (int i = 0; i < data.value_count; ++i)
645 event->values[i] = data.values[i];
647 _D("success sensor_read_data");
649 return SENSOR_ERROR_NONE;
652 int sensor_get_name(sensor_h sensor, char** name)
654 _D("called sensor_get_name");
656 if (!sensor || !name)
657 return SENSOR_ERROR_INVALID_PARAMETER;
659 *name = strdup(sensord_get_name(sensor));
661 _D("success sensor_get_vendor : [%s]", *name);
663 return SENSOR_ERROR_NONE;
666 int sensor_get_vendor(sensor_h sensor, char** vendor)
668 _D("called sensor_get_vendor");
670 if (!sensor || !vendor)
671 return SENSOR_ERROR_INVALID_PARAMETER;
673 *vendor = strdup(sensord_get_vendor(sensor));
675 _D("success sensor_vendor : [%s]", *vendor);
677 return SENSOR_ERROR_NONE;
680 int sensor_get_type(sensor_h sensor, sensor_type_e *type)
683 _D("called sensor_get_type");
685 if (!sensor || !type)
686 return SENSOR_ERROR_INVALID_PARAMETER;
688 if (!sensord_get_type(sensor, &_type))
689 return SENSOR_ERROR_OPERATION_FAILED;
691 *type = (sensor_type_e) _type;
693 _D("success sensor_get_type : [%d]", *type);
695 return SENSOR_ERROR_NONE;
698 int sensor_get_min_range(sensor_h sensor, float *min_range)
700 _D("called sensor_get_min_range");
702 if (!sensor || !min_range)
703 return SENSOR_ERROR_INVALID_PARAMETER;
705 if (!sensord_get_min_range(sensor, min_range))
706 return SENSOR_ERROR_OPERATION_FAILED;
708 _D("success sensor_get_min_range : [%d]", *min_range);
710 return SENSOR_ERROR_NONE;
713 int sensor_get_max_range(sensor_h sensor, float *max_range)
715 _D("called sensor_get_max_range");
717 if (!sensor || !max_range)
718 return SENSOR_ERROR_INVALID_PARAMETER;
720 if (!sensord_get_max_range(sensor, max_range))
721 return SENSOR_ERROR_OPERATION_FAILED;
723 _D("success sensor_get_max_range : [%d]", *max_range);
725 return SENSOR_ERROR_NONE;
728 int sensor_get_resolution(sensor_h sensor, float *resolution)
730 _D("called sensor_get_resolution");
732 if (!sensor || !resolution)
733 return SENSOR_ERROR_INVALID_PARAMETER;
735 if (!sensord_get_resolution(sensor, resolution))
736 return SENSOR_ERROR_OPERATION_FAILED;
738 _D("success sensor_get_resolution : [%d]", *resolution);
740 return SENSOR_ERROR_NONE;
743 int sensor_get_min_interval(sensor_h sensor, int *min_interval)
745 _D("called sensor_get_min_interval");
747 if (!sensor || !min_interval)
748 return SENSOR_ERROR_INVALID_PARAMETER;
750 if (!sensord_get_min_interval(sensor, min_interval))
751 return SENSOR_ERROR_OPERATION_FAILED;
753 _D("success sensor_get_min_interval : [%d]", *min_interval);
755 return SENSOR_ERROR_NONE;
758 int sensor_get_fifo_count(sensor_h sensor, int *fifo_count)
760 _D("called sensor_get_fifo_count");
762 if (!sensor || !fifo_count)
763 return SENSOR_ERROR_INVALID_PARAMETER;
765 if (!sensord_get_fifo_count(sensor, fifo_count))
766 return SENSOR_ERROR_OPERATION_FAILED;
768 _D("success sensor_get_fifo_count : [%d]", *fifo_count);
770 return SENSOR_ERROR_NONE;
773 int sensor_get_max_batch_count(sensor_h sensor, int *max_batch_count)
775 _D("called sensor_get_max_batch_count");
777 if (!sensor || !max_batch_count)
778 return SENSOR_ERROR_INVALID_PARAMETER;
780 if (!sensord_get_max_batch_count(sensor, max_batch_count))
781 return SENSOR_ERROR_OPERATION_FAILED;
783 _D("success sensor_get_max_batch_count : [%d]", *max_batch_count);
785 return SENSOR_ERROR_NONE;
789 * FUNCTIONS : SENSOR_UTIL_*
792 int sensor_util_get_declination(float latitude, float longitude, float altitude, float *declination)
795 return SENSOR_ERROR_INVALID_PARAMETER;
797 setCoordinate(latitude, longitude, altitude, declination, NULL, 1);
799 return SENSOR_ERROR_NONE;
802 int sensor_util_get_angle_change(float R[], float prevR[], float angleChange[])
804 if (getAngleChange(R, prevR, angleChange) < 0)
805 return SENSOR_ERROR_INVALID_PARAMETER;
807 return SENSOR_ERROR_NONE;
810 int sensor_util_get_orientation(float R[], float values[])
813 return SENSOR_ERROR_INVALID_PARAMETER;
815 values[0] = (float) atan2(R[1], R[4]);
816 values[1] = (float) asin(-R[7]);
817 values[2] = (float) atan2(-R[6], R[8]);
819 return SENSOR_ERROR_NONE;
822 int sensor_util_get_inclination(float I[], float* inclination)
824 if (!I || !inclination)
825 return SENSOR_ERROR_INVALID_PARAMETER;
827 *inclination = atan2(I[5], I[4]);
829 return SENSOR_ERROR_NONE;
832 int sensor_util_remap_coordinate_system(float inR[], sensor_util_axis_e x, sensor_util_axis_e y, float outR[])
834 if (remapCoordinateSystem(inR, CONVERT_AXIS_ENUM(x), CONVERT_AXIS_ENUM(y), outR) < 0)
835 return SENSOR_ERROR_INVALID_PARAMETER;
837 return SENSOR_ERROR_NONE;
840 int sensor_util_get_rotation_matrix_from_vector(float Vx, float Vy, float Vz, float R[])
842 float RV[4] = {0, Vx, Vy, Vz};
844 RV[0] = 1 - Vx * Vx - Vy * Vy - Vz * Vz;
845 RV[0] = (Vx > 0) ? (float) (sqrt(Vx)) : 0;
847 if (quatToMatrix(RV, R) < 0)
848 return SENSOR_ERROR_INVALID_PARAMETER;
850 return SENSOR_ERROR_NONE;
853 int sensor_util_get_rotation_matrix(float Gx, float Gy, float Gz, float Mx, float My, float Mz, float R[], float I[])
855 float G[3] = {Gx, Gy, Gz};
856 float M[3] = {Mx, My, Mz};
858 if (getRotationMatrix(G, M, R, I) < 0)
859 return SENSOR_ERROR_INVALID_PARAMETER;
861 return SENSOR_ERROR_NONE;