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.
22 #include <sensor_internal.h>
24 #include <sensor_private.h>
27 #include <sensor_log.h>
29 #define RETURN_VAL_IF(expr, err) \
37 #define RETURN_ERROR(err) \
43 #define SENSOR_SHIFT_TYPE 16
44 #define SENSOR_UNDEFINED_ID -1
46 #define SENSOR_LISTENER_MAGIC 0xCAFECAFE
48 static int sensor_connect (sensor_h sensor, sensor_listener_h listener)
50 int id = SENSOR_UNDEFINED_ID;
56 return SENSOR_ERROR_INVALID_PARAMETER;
58 _D("called sensor_connect : listener[0x%x], sensor[0x%x]", listener, sensor);
60 sensord_get_type(sensor, &type);
61 event_type = type << SENSOR_SHIFT_TYPE | 0x1;
63 if (!sensord_is_supported_event_type(sensor, event_type, &support))
64 return SENSOR_ERROR_INVALID_PARAMETER;
67 return SENSOR_ERROR_NOT_SUPPORTED;
69 id = sensord_connect(sensor);
72 return SENSOR_ERROR_OPERATION_FAILED;
74 _D("success sensor_connect: id[%d]", id);
77 listener->type = type;
82 int sensor_is_supported(sensor_type_e type, bool *supported)
86 if (type < SENSOR_ALL)
87 return SENSOR_ERROR_INVALID_PARAMETER;
90 return SENSOR_ERROR_INVALID_PARAMETER;
92 _D("called sensor_is_supported : type[%d]", type);
94 sensor = sensord_get_sensor((sensor_type_t)type);
101 _D("success sensor(%d) is supported[%d] : sensor[0x%x]",
102 type, *supported, sensor);
104 return SENSOR_ERROR_NONE;
107 int sensor_get_default_sensor(sensor_type_e type, sensor_h *sensor)
110 sensor_privilege_t privilege;
112 _D("called sensor_get_default_sensor : type[%d], sensor[0x%x]", type, sensor);
114 if (type < SENSOR_ALL)
115 return SENSOR_ERROR_INVALID_PARAMETER;
118 return SENSOR_ERROR_INVALID_PARAMETER;
120 _sensor = sensord_get_sensor((sensor_type_t)type);
123 return SENSOR_ERROR_NOT_SUPPORTED;
125 sensord_get_privilege(_sensor, &privilege);
127 if (privilege != SENSOR_PRIVILEGE_PUBLIC)
128 return SENSOR_ERROR_PERMISSION_DENIED;
132 _D("success sensor_get_default_sensor sensor[0x%x]", _sensor);
134 return SENSOR_ERROR_NONE;
137 int sensor_get_sensor_list(sensor_type_e type, sensor_h **list, int *sensor_count)
139 sensor_h *_list = NULL;
142 _D("called sensor_get_list : type[%d]");
144 if (type < SENSOR_ALL)
145 return SENSOR_ERROR_INVALID_PARAMETER;
147 if (!sensor_count || !list)
148 return SENSOR_ERROR_INVALID_PARAMETER;
150 sensord_get_sensor_list((sensor_type_t)type, &_list, &count);
153 return SENSOR_ERROR_NOT_SUPPORTED;
156 int count_public = 0;
158 for (i = 0; i < count; ++i) {
159 sensor_privilege_t privilege;
161 sensord_get_privilege(_list[i], &privilege);
162 if (privilege != SENSOR_PRIVILEGE_PUBLIC)
168 if (count_public == 0) {
170 return SENSOR_ERROR_PERMISSION_DENIED;
173 *list = (sensor_h *) malloc((sizeof(int *)) * count_public);
177 return SENSOR_ERROR_OUT_OF_MEMORY;
180 for (i = 0, j = 0; i < count; ++i) {
181 sensor_privilege_t privilege;
183 sensord_get_privilege(_list[i], &privilege);
184 if (privilege != SENSOR_PRIVILEGE_PUBLIC)
187 *(*list + j) = _list[i];
193 *sensor_count = count_public;
195 _D("success sensor_get_list");
197 return SENSOR_ERROR_NONE;
200 int sensor_is_wake_up(sensor_h sensor, bool *wakeup)
202 return SENSOR_ERROR_NOT_SUPPORTED;
205 int sensor_create_listener(sensor_h sensor, sensor_listener_h *listener)
207 struct sensor_listener_s *_listener;
210 _D("called sensor_create_listener : listener[0x%x]", listener);
212 if (!sensor || !listener)
213 return SENSOR_ERROR_INVALID_PARAMETER;
215 _listener = new(std::nothrow) struct sensor_listener_s;
218 return SENSOR_ERROR_OUT_OF_MEMORY;
220 error = sensor_connect(sensor, _listener);
223 delete (struct sensor_listener_s *)_listener;
224 return SENSOR_ERROR_OPERATION_FAILED;
227 _listener->sensor = sensor;
228 _listener->option = SENSOR_OPTION_DEFAULT;
229 _listener->magic = SENSOR_LISTENER_MAGIC;
231 *listener = (sensor_listener_h) _listener;
233 _D("success sensor_create_listener");
235 return SENSOR_ERROR_NONE;
238 int sensor_destroy_listener(sensor_listener_h listener)
240 _D("called sensor_destroy : listener[0x%x]", listener);
243 return SENSOR_ERROR_INVALID_PARAMETER;
245 if (listener->magic != SENSOR_LISTENER_MAGIC)
246 return SENSOR_ERROR_INVALID_PARAMETER;
248 sensord_disconnect(listener->id);
251 delete (sensor_listener_s *)listener;
253 _D("success sensor_destroy");
255 return SENSOR_ERROR_NONE;
258 int sensor_listener_start(sensor_listener_h listener)
261 unsigned int option = 0;
263 _D("called sensor_listener_start : listener[0x%x]", listener);
266 return SENSOR_ERROR_INVALID_PARAMETER;
268 if (listener->magic != SENSOR_LISTENER_MAGIC)
269 return SENSOR_ERROR_INVALID_PARAMETER;
272 option = listener->option;
274 if (!sensord_start(id, option))
275 return SENSOR_ERROR_OPERATION_FAILED;
277 _D("success sensor_listener_start : id[%d]", id);
279 return SENSOR_ERROR_NONE;
282 int sensor_listener_stop(sensor_listener_h listener)
286 _D("called sensor_listener_stop : listener[0x%x]", listener);
289 return SENSOR_ERROR_INVALID_PARAMETER;
291 if (listener->magic != SENSOR_LISTENER_MAGIC)
292 return SENSOR_ERROR_INVALID_PARAMETER;
296 if (!sensord_stop(id))
297 return SENSOR_ERROR_OPERATION_FAILED;
299 _D("success sensor_listener_stop");
301 return SENSOR_ERROR_NONE;
304 static void sensor_callback(sensor_t sensor, unsigned int event_type, sensor_data_t *data, void *user_data)
306 sensor_event_s *event;
307 sensor_listener_h listener;
308 listener = (sensor_listener_h)user_data;
310 _D("success sensor_callback, sensor[%p] listener[%p] listener->callback[%p]", sensor, listener, listener->callback);
311 if (!sensor || !listener->callback)
314 event = (sensor_event_s *)data;
316 ((sensor_event_cb) listener->callback)(sensor, event, listener->user_data);
320 int sensor_listener_set_event_cb(sensor_listener_h listener,
321 unsigned int interval, sensor_event_cb callback, void *user_data)
324 unsigned int event_id;
326 if (!listener || !callback)
327 return SENSOR_ERROR_INVALID_PARAMETER;
329 if (listener->magic != SENSOR_LISTENER_MAGIC)
330 return SENSOR_ERROR_INVALID_PARAMETER;
332 _D("called sensor_listener_set_event : listener[0x%x], interval[%d], callback[0x%x], user_data[0x%x], id[%d]",
333 listener, interval, callback, user_data, listener->id);
336 event_id = (listener->type) << SENSOR_SHIFT_TYPE | 0x1;
338 listener->callback = (void *)callback;
339 listener->user_data = user_data;
341 if (!sensord_register_event(id, event_id, interval, 0,
342 sensor_callback, listener)) {
343 listener->callback = NULL;
344 listener->user_data = NULL;
346 return SENSOR_ERROR_OPERATION_FAILED;
349 _D("success sensor_listener_set_event");
351 return SENSOR_ERROR_NONE;
354 int sensor_listener_unset_event_cb(sensor_listener_h listener)
358 unsigned int event_id;
360 _D("called sensor_unregister_event : listener[0x%x]", listener);
363 return SENSOR_ERROR_INVALID_PARAMETER;
365 if (listener->magic != SENSOR_LISTENER_MAGIC)
366 return SENSOR_ERROR_INVALID_PARAMETER;
369 type = (int)listener->type;
370 event_id = type << SENSOR_SHIFT_TYPE | 0x1;
372 if (!sensord_unregister_event(id, event_id))
373 return SENSOR_ERROR_OPERATION_FAILED;
375 listener->callback = NULL;
376 listener->user_data = NULL;
378 _D("success sensor_unregister_event");
380 return SENSOR_ERROR_NONE;
383 static void accuracy_changed_callback(sensor_t sensor,
384 unsigned long long timestamp, int accuracy, void *data)
386 sensor_listener_h listener = (sensor_listener_h)data;
388 if (!sensor || !listener->accu_callback)
391 ((sensor_accuracy_changed_cb)listener->accu_callback)
392 (sensor, timestamp, (sensor_data_accuracy_e)accuracy, listener->accu_user_data);
397 int sensor_listener_set_accuracy_cb(sensor_listener_h listener,
398 sensor_accuracy_changed_cb callback, void *data)
402 _D("called sensor_register_accuracy_cb : listener[0x%x], callback[0x%x], user_data[0x%x] cb[%p]",
403 listener, callback, data, accuracy_changed_callback);
405 if (!listener || !callback)
406 return SENSOR_ERROR_INVALID_PARAMETER;
408 if (listener->magic != SENSOR_LISTENER_MAGIC)
409 return SENSOR_ERROR_INVALID_PARAMETER;
412 listener->accu_callback = (void *)callback;
413 listener->accu_user_data = data;
415 if (!sensord_register_accuracy_cb(id, accuracy_changed_callback, listener)) {
416 listener->accu_callback = NULL;
417 listener->accu_user_data = NULL;
419 return SENSOR_ERROR_OPERATION_FAILED;
422 _D("success sensor_register_accuracy_cb");
424 return SENSOR_ERROR_NONE;
427 int sensor_listener_unset_accuracy_cb(sensor_listener_h listener)
431 _D("called sensor_unregister_accuracy_cb : listener[0x%x]", listener);
434 return SENSOR_ERROR_INVALID_PARAMETER;
436 if (listener->magic != SENSOR_LISTENER_MAGIC)
437 return SENSOR_ERROR_INVALID_PARAMETER;
441 if (!sensord_unregister_accuracy_cb(id))
442 return SENSOR_ERROR_OPERATION_FAILED;
444 listener->accu_callback = NULL;
445 listener->accu_user_data = NULL;
447 _D("success sensor_unregister_accuracy_cb");
449 return SENSOR_ERROR_NONE;
452 int sensor_listener_set_interval(sensor_listener_h listener, unsigned int interval)
456 unsigned int event_id;
458 _D("called sensor_set_interval : listener[0x%x], interval[%d]", listener, interval);
461 return SENSOR_ERROR_INVALID_PARAMETER;
463 if (listener->magic != SENSOR_LISTENER_MAGIC)
464 return SENSOR_ERROR_INVALID_PARAMETER;
467 type = (int)listener->type;
468 event_id = type << SENSOR_SHIFT_TYPE | 0x1;
470 if (!sensord_change_event_interval(id, event_id, interval))
471 return SENSOR_ERROR_OPERATION_FAILED;
473 _D("success sensor_set_interval");
475 return SENSOR_ERROR_NONE;
478 int sensor_listener_set_max_batch_latency(sensor_listener_h listener, unsigned int max_batch_latency)
482 unsigned int event_id;
484 _D("called sensor_set_max_batch_latency : listener[0x%x], max_batch_latency[%d]", listener, max_batch_latency);
487 return SENSOR_ERROR_INVALID_PARAMETER;
489 if (listener->magic != SENSOR_LISTENER_MAGIC)
490 return SENSOR_ERROR_INVALID_PARAMETER;
493 type = (int)listener->type;
494 event_id = type << SENSOR_SHIFT_TYPE | 0x1;
496 if (!sensord_change_event_max_batch_latency(id, event_id, max_batch_latency))
497 return SENSOR_ERROR_NOT_SUPPORTED;
499 _D("success sensor_set_max_batch_latency");
501 return SENSOR_ERROR_NONE;
504 int sensor_listener_set_attribute_int(sensor_listener_h listener, sensor_attribute_e attribute, int value)
506 return SENSOR_ERROR_NOT_SUPPORTED;
509 int sensor_listener_set_option(sensor_listener_h listener, sensor_option_e option)
513 _D("called sensor_set_option : listener[0x%x], option[%d]", listener, option);
516 return SENSOR_ERROR_INVALID_PARAMETER;
518 if (listener->magic != SENSOR_LISTENER_MAGIC)
519 return SENSOR_ERROR_INVALID_PARAMETER;
523 if (!sensord_set_option(id, (int)option))
524 return SENSOR_ERROR_OPERATION_FAILED;
526 listener->option = option;
528 _D("success sensor_set_option");
530 return SENSOR_ERROR_NONE;
533 int sensor_listener_read_data(sensor_listener_h listener, sensor_event_s *event)
538 unsigned int data_id;
540 _D("called sensor_read_data : listener[0x%x]", listener);
542 if (!listener || !event)
543 return SENSOR_ERROR_INVALID_PARAMETER;
545 if (listener->magic != SENSOR_LISTENER_MAGIC)
546 return SENSOR_ERROR_INVALID_PARAMETER;
549 type = (int)listener->type;
550 data_id = type << SENSOR_SHIFT_TYPE | 0x1;
552 if (!sensord_get_data(id, data_id, &data))
553 return SENSOR_ERROR_OPERATION_FAILED;
555 event->accuracy = data.accuracy;
556 event->timestamp = data.timestamp;
557 event->value_count = data.value_count;
559 for (int i = 0; i < data.value_count; ++i)
560 event->values[i] = data.values[i];
562 _D("success sensor_read_data");
564 return SENSOR_ERROR_NONE;
567 int sensor_get_name(sensor_h sensor, char** name)
569 _D("called sensor_get_name");
571 if (!sensor || !name)
572 return SENSOR_ERROR_INVALID_PARAMETER;
574 *name = strdup(sensord_get_name(sensor));
576 _D("success sensor_get_vendor : [%s]", *name);
578 return SENSOR_ERROR_NONE;
581 int sensor_get_vendor(sensor_h sensor, char** vendor)
583 _D("called sensor_get_vendor");
585 if (!sensor || !vendor)
586 return SENSOR_ERROR_INVALID_PARAMETER;
588 *vendor = strdup(sensord_get_vendor(sensor));
590 _D("success sensor_vendor : [%s]", *vendor);
592 return SENSOR_ERROR_NONE;
595 int sensor_get_type(sensor_h sensor, sensor_type_e *type)
598 _D("called sensor_get_type");
600 if (!sensor || !type)
601 return SENSOR_ERROR_INVALID_PARAMETER;
603 if (!sensord_get_type(sensor, &_type))
604 return SENSOR_ERROR_OPERATION_FAILED;
606 *type = (sensor_type_e) _type;
608 _D("success sensor_get_type : [%d]", *type);
610 return SENSOR_ERROR_NONE;
613 int sensor_get_min_range(sensor_h sensor, float *min_range)
615 _D("called sensor_get_min_range");
617 if (!sensor || !min_range)
618 return SENSOR_ERROR_INVALID_PARAMETER;
620 if (!sensord_get_min_range(sensor, min_range))
621 return SENSOR_ERROR_OPERATION_FAILED;
623 _D("success sensor_get_min_range : [%d]", *min_range);
625 return SENSOR_ERROR_NONE;
628 int sensor_get_max_range(sensor_h sensor, float *max_range)
630 _D("called sensor_get_max_range");
632 if (!sensor || !max_range)
633 return SENSOR_ERROR_INVALID_PARAMETER;
635 if (!sensord_get_max_range(sensor, max_range))
636 return SENSOR_ERROR_OPERATION_FAILED;
638 _D("success sensor_get_max_range : [%d]", *max_range);
640 return SENSOR_ERROR_NONE;
643 int sensor_get_resolution(sensor_h sensor, float *resolution)
645 _D("called sensor_get_resolution");
647 if (!sensor || !resolution)
648 return SENSOR_ERROR_INVALID_PARAMETER;
650 if (!sensord_get_resolution(sensor, resolution))
651 return SENSOR_ERROR_OPERATION_FAILED;
653 _D("success sensor_get_resolution : [%d]", *resolution);
655 return SENSOR_ERROR_NONE;
658 int sensor_get_min_interval(sensor_h sensor, int *min_interval)
660 _D("called sensor_get_min_interval");
662 if (!sensor || !min_interval)
663 return SENSOR_ERROR_INVALID_PARAMETER;
665 if (!sensord_get_min_interval(sensor, min_interval))
666 return SENSOR_ERROR_OPERATION_FAILED;
668 _D("success sensor_get_min_interval : [%d]", *min_interval);
670 return SENSOR_ERROR_NONE;
673 int sensor_get_fifo_count(sensor_h sensor, int *fifo_count)
675 _D("called sensor_get_fifo_count");
677 if (!sensor || !fifo_count)
678 return SENSOR_ERROR_INVALID_PARAMETER;
680 if (!sensord_get_fifo_count(sensor, fifo_count))
681 return SENSOR_ERROR_OPERATION_FAILED;
683 _D("success sensor_get_fifo_count : [%d]", *fifo_count);
685 return SENSOR_ERROR_NONE;
688 int sensor_get_max_batch_count(sensor_h sensor, int *max_batch_count)
690 _D("called sensor_get_max_batch_count");
692 if (!sensor || !max_batch_count)
693 return SENSOR_ERROR_INVALID_PARAMETER;
695 if (!sensord_get_max_batch_count(sensor, max_batch_count))
696 return SENSOR_ERROR_OPERATION_FAILED;
698 _D("success sensor_get_max_batch_count : [%d]", *max_batch_count);
700 return SENSOR_ERROR_NONE;
704 * FUNCTIONS : SENSOR_UTIL_*
707 int sensor_util_get_declination (float latitude, float longitude, float altitude, float *declination)
710 return SENSOR_ERROR_INVALID_PARAMETER;
712 setCoordinate (latitude, longitude, altitude, declination, NULL, 1);
714 return SENSOR_ERROR_NONE;
717 int sensor_util_get_angle_change (float R[], float prevR[], float angleChange[])
719 if (getAngleChange (R, prevR, angleChange) < 0)
720 return SENSOR_ERROR_INVALID_PARAMETER;
722 return SENSOR_ERROR_NONE;
725 int sensor_util_get_orientation (float R[], float values[])
728 return SENSOR_ERROR_INVALID_PARAMETER;
730 values[0] = (float) atan2 (R[1], R[4]);
731 values[1] = (float) asin (-R[7]);
732 values[2] = (float) atan2 (-R[6], R[8]);
734 return SENSOR_ERROR_NONE;
737 int sensor_util_get_inclination (float I[], float* inclination)
739 if (!I || !inclination)
740 return SENSOR_ERROR_INVALID_PARAMETER;
742 *inclination = atan2(I[5], I[4]);
744 return SENSOR_ERROR_NONE;
747 int sensor_util_remap_coordinate_system (float inR[], sensor_util_axis_e x, sensor_util_axis_e y, float outR[])
749 if (remapCoordinateSystem (inR, x, y, outR) < 0)
750 return SENSOR_ERROR_INVALID_PARAMETER;
752 return SENSOR_ERROR_NONE;
755 int sensor_util_get_rotation_matrix_from_vector (float Vx, float Vy, float Vz, float R[])
757 float RV[4] = {0, Vx, Vy, Vz};
759 RV[0] = 1 - Vx * Vx - Vy*Vy - Vz*Vz;
760 RV[0] = (Vx > 0) ? (float) (sqrt (Vx)) : 0;
762 if (quatToMatrix(RV, R) < 0)
763 return SENSOR_ERROR_INVALID_PARAMETER;
765 return SENSOR_ERROR_NONE;
768 int sensor_util_get_rotation_matrix (float Gx, float Gy, float Gz,float Mx, float My, float Mz,float R[], float I[])
770 float G[3] = {Gx, Gy, Gz};
771 float M[3] = {Mx, My, Mz};
773 if (getRotationMatrix (G, M, R, I) < 0)
774 return SENSOR_ERROR_INVALID_PARAMETER;
776 return SENSOR_ERROR_NONE;