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)
87 if (type < SENSOR_ALL)
88 return SENSOR_ERROR_INVALID_PARAMETER;
91 return SENSOR_ERROR_INVALID_PARAMETER;
93 _D("called sensor_is_supported : type[%d]", type);
95 sensor = sensord_get_sensor((sensor_type_t)type);
101 *supported = _supported;
103 _D("success sensor(%d) is supported[%d] : sensor[0x%x]",
104 type, _supported, sensor);
106 return SENSOR_ERROR_NONE;
109 int sensor_get_default_sensor(sensor_type_e type, sensor_h *sensor)
112 sensor_privilege_t privilege;
114 _D("called sensor_get_default_sensor : type[%d], sensor[0x%x]", type, sensor);
116 if (type < SENSOR_ALL)
117 return SENSOR_ERROR_INVALID_PARAMETER;
120 return SENSOR_ERROR_INVALID_PARAMETER;
122 _sensor = sensord_get_sensor((sensor_type_t)type);
125 return SENSOR_ERROR_NOT_SUPPORTED;
127 sensord_get_privilege(_sensor, &privilege);
129 if (privilege != SENSOR_PRIVILEGE_PUBLIC)
130 return SENSOR_ERROR_PERMISSION_DENIED;
134 _D("success sensor_get_default_sensor sensor[0x%x]", _sensor);
136 return SENSOR_ERROR_NONE;
139 int sensor_get_sensor_list(sensor_type_e type, sensor_h **list, int *sensor_count)
141 sensor_h *_list = NULL;
144 _D("called sensor_get_list : type[%d]");
146 if (type < SENSOR_ALL)
147 return SENSOR_ERROR_INVALID_PARAMETER;
149 if (!sensor_count || !list)
150 return SENSOR_ERROR_INVALID_PARAMETER;
152 sensord_get_sensor_list((sensor_type_t)type, &_list, &count);
155 return SENSOR_ERROR_NOT_SUPPORTED;
158 int count_public = 0;
160 for (i = 0; i < count; ++i) {
161 sensor_privilege_t privilege;
163 sensord_get_privilege(_list[i], &privilege);
164 if (privilege != SENSOR_PRIVILEGE_PUBLIC)
170 if (count_public == 0) {
172 return SENSOR_ERROR_PERMISSION_DENIED;
175 *list = (sensor_h *) malloc((sizeof(int *)) * count_public);
179 return SENSOR_ERROR_OUT_OF_MEMORY;
182 for (i = 0, j = 0; i < count; ++i) {
183 sensor_privilege_t privilege;
185 sensord_get_privilege(_list[i], &privilege);
186 if (privilege != SENSOR_PRIVILEGE_PUBLIC)
189 *(*list + j) = _list[i];
195 *sensor_count = count_public;
197 _D("success sensor_get_list");
199 return SENSOR_ERROR_NONE;
202 int sensor_is_wake_up(sensor_h sensor, bool *wakeup)
204 return SENSOR_ERROR_NOT_SUPPORTED;
207 int sensor_create_listener(sensor_h sensor, sensor_listener_h *listener)
209 struct sensor_listener_s *_listener;
212 _D("called sensor_create_listener : listener[0x%x]", listener);
214 if (!sensor || !listener)
215 return SENSOR_ERROR_INVALID_PARAMETER;
217 _listener = new(std::nothrow) struct sensor_listener_s;
220 return SENSOR_ERROR_OUT_OF_MEMORY;
222 error = sensor_connect(sensor, _listener);
225 delete (struct sensor_listener_s *)_listener;
226 return SENSOR_ERROR_OPERATION_FAILED;
229 _listener->sensor = sensor;
230 _listener->option = SENSOR_OPTION_DEFAULT;
231 _listener->magic = SENSOR_LISTENER_MAGIC;
233 *listener = (sensor_listener_h) _listener;
235 _D("success sensor_create_listener");
237 return SENSOR_ERROR_NONE;
240 int sensor_destroy_listener(sensor_listener_h listener)
242 _D("called sensor_destroy : listener[0x%x]", listener);
245 return SENSOR_ERROR_INVALID_PARAMETER;
247 if (listener->magic != SENSOR_LISTENER_MAGIC)
248 return SENSOR_ERROR_INVALID_PARAMETER;
250 sensord_disconnect(listener->id);
253 delete (sensor_listener_s *)listener;
255 _D("success sensor_destroy");
257 return SENSOR_ERROR_NONE;
260 int sensor_listener_start(sensor_listener_h listener)
263 unsigned int option = 0;
265 _D("called sensor_listener_start : listener[0x%x]", listener);
268 return SENSOR_ERROR_INVALID_PARAMETER;
270 if (listener->magic != SENSOR_LISTENER_MAGIC)
271 return SENSOR_ERROR_INVALID_PARAMETER;
274 option = listener->option;
276 if (!sensord_start(id, option))
277 return SENSOR_ERROR_OPERATION_FAILED;
279 _D("success sensor_listener_start : id[%d]", id);
281 return SENSOR_ERROR_NONE;
284 int sensor_listener_stop(sensor_listener_h listener)
288 _D("called sensor_listener_stop : listener[0x%x]", listener);
291 return SENSOR_ERROR_INVALID_PARAMETER;
293 if (listener->magic != SENSOR_LISTENER_MAGIC)
294 return SENSOR_ERROR_INVALID_PARAMETER;
298 if (!sensord_stop(id))
299 return SENSOR_ERROR_OPERATION_FAILED;
301 _D("success sensor_listener_stop");
303 return SENSOR_ERROR_NONE;
306 static void sensor_callback(sensor_t sensor, unsigned int event_type, sensor_data_t *data, void *user_data)
308 sensor_event_s *event;
309 sensor_listener_h listener;
310 listener = (sensor_listener_h)user_data;
312 _D("success sensor_callback, sensor[%p] listener[%p] listener->callback[%p]", sensor, listener, listener->callback);
313 if (!sensor || !listener->callback)
316 event = (sensor_event_s *)data;
318 ((sensor_event_cb) listener->callback)(sensor, event, listener->user_data);
322 int sensor_listener_set_event_cb(sensor_listener_h listener,
323 unsigned int interval, sensor_event_cb callback, void *user_data)
326 unsigned int event_id;
328 if (!listener || !callback)
329 return SENSOR_ERROR_INVALID_PARAMETER;
331 if (listener->magic != SENSOR_LISTENER_MAGIC)
332 return SENSOR_ERROR_INVALID_PARAMETER;
334 _D("called sensor_listener_set_event : listener[0x%x], interval[%d], callback[0x%x], user_data[0x%x], id[%d]",
335 listener, interval, callback, user_data, listener->id);
338 event_id = (listener->type) << SENSOR_SHIFT_TYPE | 0x1;
340 listener->callback = (void *)callback;
341 listener->user_data = user_data;
343 if (!sensord_register_event(id, event_id, interval, 0,
344 sensor_callback, listener)) {
345 listener->callback = NULL;
346 listener->user_data = NULL;
348 return SENSOR_ERROR_OPERATION_FAILED;
351 _D("success sensor_listener_set_event");
353 return SENSOR_ERROR_NONE;
356 int sensor_listener_unset_event_cb(sensor_listener_h listener)
360 unsigned int event_id;
362 _D("called sensor_unregister_event : listener[0x%x]", listener);
365 return SENSOR_ERROR_INVALID_PARAMETER;
367 if (listener->magic != SENSOR_LISTENER_MAGIC)
368 return SENSOR_ERROR_INVALID_PARAMETER;
371 type = (int)listener->type;
372 event_id = type << SENSOR_SHIFT_TYPE | 0x1;
374 if (!sensord_unregister_event(id, event_id))
375 return SENSOR_ERROR_OPERATION_FAILED;
377 listener->callback = NULL;
378 listener->user_data = NULL;
380 _D("success sensor_unregister_event");
382 return SENSOR_ERROR_NONE;
385 static void accuracy_changed_callback(sensor_t sensor,
386 unsigned long long timestamp, int accuracy, void *data)
388 sensor_listener_h listener = (sensor_listener_h)data;
390 if (!sensor || !listener->accu_callback)
393 ((sensor_accuracy_changed_cb)listener->accu_callback)
394 (sensor, timestamp, (sensor_data_accuracy_e)accuracy, listener->accu_user_data);
399 int sensor_listener_set_accuracy_cb(sensor_listener_h listener,
400 sensor_accuracy_changed_cb callback, void *data)
404 _D("called sensor_register_accuracy_cb : listener[0x%x], callback[0x%x], user_data[0x%x] cb[%p]",
405 listener, callback, data, accuracy_changed_callback);
407 if (!listener || !callback)
408 return SENSOR_ERROR_INVALID_PARAMETER;
410 if (listener->magic != SENSOR_LISTENER_MAGIC)
411 return SENSOR_ERROR_INVALID_PARAMETER;
414 listener->accu_callback = (void *)callback;
415 listener->accu_user_data = data;
417 if (!sensord_register_accuracy_cb(id, accuracy_changed_callback, listener)) {
418 listener->accu_callback = NULL;
419 listener->accu_user_data = NULL;
421 return SENSOR_ERROR_OPERATION_FAILED;
424 _D("success sensor_register_accuracy_cb");
426 return SENSOR_ERROR_NONE;
429 int sensor_listener_unset_accuracy_cb(sensor_listener_h listener)
433 _D("called sensor_unregister_accuracy_cb : listener[0x%x]", listener);
436 return SENSOR_ERROR_INVALID_PARAMETER;
438 if (listener->magic != SENSOR_LISTENER_MAGIC)
439 return SENSOR_ERROR_INVALID_PARAMETER;
443 if (!sensord_unregister_accuracy_cb(id))
444 return SENSOR_ERROR_OPERATION_FAILED;
446 listener->accu_callback = NULL;
447 listener->accu_user_data = NULL;
449 _D("success sensor_unregister_accuracy_cb");
451 return SENSOR_ERROR_NONE;
454 int sensor_listener_set_interval(sensor_listener_h listener, unsigned int interval)
458 unsigned int event_id;
460 _D("called sensor_set_interval : listener[0x%x], interval[%d]", listener, interval);
463 return SENSOR_ERROR_INVALID_PARAMETER;
465 if (listener->magic != SENSOR_LISTENER_MAGIC)
466 return SENSOR_ERROR_INVALID_PARAMETER;
469 type = (int)listener->type;
470 event_id = type << SENSOR_SHIFT_TYPE | 0x1;
472 if (!sensord_change_event_interval(id, event_id, interval))
473 return SENSOR_ERROR_OPERATION_FAILED;
475 _D("success sensor_set_interval");
477 return SENSOR_ERROR_NONE;
480 int sensor_listener_set_max_batch_latency(sensor_listener_h listener, unsigned int max_batch_latency)
484 unsigned int event_id;
486 _D("called sensor_set_max_batch_latency : listener[0x%x], max_batch_latency[%d]", listener, max_batch_latency);
489 return SENSOR_ERROR_INVALID_PARAMETER;
491 if (listener->magic != SENSOR_LISTENER_MAGIC)
492 return SENSOR_ERROR_INVALID_PARAMETER;
495 type = (int)listener->type;
496 event_id = type << SENSOR_SHIFT_TYPE | 0x1;
498 if (!sensord_change_event_max_batch_latency(id, event_id, max_batch_latency))
499 return SENSOR_ERROR_NOT_SUPPORTED;
501 _D("success sensor_set_max_batch_latency");
503 return SENSOR_ERROR_NONE;
506 int sensor_listener_set_attribute_int(sensor_listener_h listener, sensor_attribute_e attribute, int value)
508 return SENSOR_ERROR_NOT_SUPPORTED;
511 int sensor_listener_set_option(sensor_listener_h listener, sensor_option_e option)
515 _D("called sensor_set_option : listener[0x%x], option[%d]", listener, option);
518 return SENSOR_ERROR_INVALID_PARAMETER;
520 if (listener->magic != SENSOR_LISTENER_MAGIC)
521 return SENSOR_ERROR_INVALID_PARAMETER;
525 if (!sensord_set_option(id, (int)option))
526 return SENSOR_ERROR_OPERATION_FAILED;
528 listener->option = option;
530 _D("success sensor_set_option");
532 return SENSOR_ERROR_NONE;
535 int sensor_listener_read_data(sensor_listener_h listener, sensor_event_s *event)
540 unsigned int data_id;
542 _D("called sensor_read_data : listener[0x%x]", listener);
544 if (!listener || !event)
545 return SENSOR_ERROR_INVALID_PARAMETER;
547 if (listener->magic != SENSOR_LISTENER_MAGIC)
548 return SENSOR_ERROR_INVALID_PARAMETER;
551 type = (int)listener->type;
552 data_id = type << SENSOR_SHIFT_TYPE | 0x1;
554 if (!sensord_get_data(id, data_id, &data))
555 return SENSOR_ERROR_OPERATION_FAILED;
557 event->accuracy = data.accuracy;
558 event->timestamp = data.timestamp;
559 event->value_count = data.value_count;
561 for (int i = 0; i < data.value_count; ++i)
562 event->values[i] = data.values[i];
564 _D("success sensor_read_data");
566 return SENSOR_ERROR_NONE;
569 int sensor_get_name(sensor_h sensor, char** name)
571 _D("called sensor_get_name");
573 if (!sensor || !name)
574 return SENSOR_ERROR_INVALID_PARAMETER;
576 *name = strdup(sensord_get_name(sensor));
578 _D("success sensor_get_vendor : [%s]", *name);
580 return SENSOR_ERROR_NONE;
583 int sensor_get_vendor(sensor_h sensor, char** vendor)
585 _D("called sensor_get_vendor");
587 if (!sensor || !vendor)
588 return SENSOR_ERROR_INVALID_PARAMETER;
590 *vendor = strdup(sensord_get_vendor(sensor));
592 _D("success sensor_vendor : [%s]", *vendor);
594 return SENSOR_ERROR_NONE;
597 int sensor_get_type(sensor_h sensor, sensor_type_e *type)
600 _D("called sensor_get_type");
602 if (!sensor || !type)
603 return SENSOR_ERROR_INVALID_PARAMETER;
605 if (!sensord_get_type(sensor, &_type))
606 return SENSOR_ERROR_OPERATION_FAILED;
608 *type = (sensor_type_e) _type;
610 _D("success sensor_get_type : [%d]", *type);
612 return SENSOR_ERROR_NONE;
615 int sensor_get_min_range(sensor_h sensor, float *min_range)
617 _D("called sensor_get_min_range");
619 if (!sensor || !min_range)
620 return SENSOR_ERROR_INVALID_PARAMETER;
622 if (!sensord_get_min_range(sensor, min_range))
623 return SENSOR_ERROR_OPERATION_FAILED;
625 _D("success sensor_get_min_range : [%d]", *min_range);
627 return SENSOR_ERROR_NONE;
630 int sensor_get_max_range(sensor_h sensor, float *max_range)
632 _D("called sensor_get_max_range");
634 if (!sensor || !max_range)
635 return SENSOR_ERROR_INVALID_PARAMETER;
637 if (!sensord_get_max_range(sensor, max_range))
638 return SENSOR_ERROR_OPERATION_FAILED;
640 _D("success sensor_get_max_range : [%d]", *max_range);
642 return SENSOR_ERROR_NONE;
645 int sensor_get_resolution(sensor_h sensor, float *resolution)
647 _D("called sensor_get_resolution");
649 if (!sensor || !resolution)
650 return SENSOR_ERROR_INVALID_PARAMETER;
652 if (!sensord_get_resolution(sensor, resolution))
653 return SENSOR_ERROR_OPERATION_FAILED;
655 _D("success sensor_get_resolution : [%d]", *resolution);
657 return SENSOR_ERROR_NONE;
660 int sensor_get_min_interval(sensor_h sensor, int *min_interval)
662 _D("called sensor_get_min_interval");
664 if (!sensor || !min_interval)
665 return SENSOR_ERROR_INVALID_PARAMETER;
667 if (!sensord_get_min_interval(sensor, min_interval))
668 return SENSOR_ERROR_OPERATION_FAILED;
670 _D("success sensor_get_min_interval : [%d]", *min_interval);
672 return SENSOR_ERROR_NONE;
675 int sensor_get_fifo_count(sensor_h sensor, int *fifo_count)
677 _D("called sensor_get_fifo_count");
679 if (!sensor || !fifo_count)
680 return SENSOR_ERROR_INVALID_PARAMETER;
682 if (!sensord_get_fifo_count(sensor, fifo_count))
683 return SENSOR_ERROR_OPERATION_FAILED;
685 _D("success sensor_get_fifo_count : [%d]", *fifo_count);
687 return SENSOR_ERROR_NONE;
690 int sensor_get_max_batch_count(sensor_h sensor, int *max_batch_count)
692 _D("called sensor_get_max_batch_count");
694 if (!sensor || !max_batch_count)
695 return SENSOR_ERROR_INVALID_PARAMETER;
697 if (!sensord_get_max_batch_count(sensor, max_batch_count))
698 return SENSOR_ERROR_OPERATION_FAILED;
700 _D("success sensor_get_max_batch_count : [%d]", *max_batch_count);
702 return SENSOR_ERROR_NONE;
706 * FUNCTIONS : SENSOR_UTIL_*
709 int sensor_util_get_declination (float latitude, float longitude, float altitude, float *declination)
712 return SENSOR_ERROR_INVALID_PARAMETER;
714 setCoordinate (latitude, longitude, altitude, declination, NULL, 1);
716 return SENSOR_ERROR_NONE;
719 int sensor_util_get_angle_change (float R[], float prevR[], float angleChange[])
721 if (getAngleChange (R, prevR, angleChange) < 0)
722 return SENSOR_ERROR_INVALID_PARAMETER;
724 return SENSOR_ERROR_NONE;
727 int sensor_util_get_orientation (float R[], float values[])
730 return SENSOR_ERROR_INVALID_PARAMETER;
732 values[0] = (float) atan2 (R[1], R[4]);
733 values[1] = (float) asin (-R[7]);
734 values[2] = (float) atan2 (-R[6], R[8]);
736 return SENSOR_ERROR_NONE;
739 int sensor_util_get_inclination (float I[], float* inclination)
741 if (!I || !inclination)
742 return SENSOR_ERROR_INVALID_PARAMETER;
744 *inclination = atan2(I[5], I[4]);
746 return SENSOR_ERROR_NONE;
749 int sensor_util_remap_coordinate_system (float inR[], sensor_util_axis_e x, sensor_util_axis_e y, float outR[])
751 if (remapCoordinateSystem (inR, x, y, outR) < 0)
752 return SENSOR_ERROR_INVALID_PARAMETER;
754 return SENSOR_ERROR_NONE;
757 int sensor_util_get_rotation_matrix_from_vector (float Vx, float Vy, float Vz, float R[])
759 float RV[4] = {0, Vx, Vy, Vz};
761 RV[0] = 1 - Vx * Vx - Vy*Vy - Vz*Vz;
762 RV[0] = (Vx > 0) ? (float) (sqrt (Vx)) : 0;
764 if (quatToMatrix(RV, R) < 0)
765 return SENSOR_ERROR_INVALID_PARAMETER;
767 return SENSOR_ERROR_NONE;
770 int sensor_util_get_rotation_matrix (float Gx, float Gy, float Gz,float Mx, float My, float Mz,float R[], float I[])
772 float G[3] = {Gx, Gy, Gz};
773 float M[3] = {Mx, My, Mz};
775 if (getRotationMatrix (G, M, R, I) < 0)
776 return SENSOR_ERROR_INVALID_PARAMETER;
778 return SENSOR_ERROR_NONE;