4 * Copyright (c) 2014 Samsung Electronics Co., Ltd.
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
20 #include <sf_common.h>
21 #include <sensor_internal_deprecated.h>
22 #include <sensor_internal.h>
23 #include <csensor_event_listener.h>
24 #include <client_common.h>
28 #include <sensor_info.h>
29 #include <sensor_info_manager.h>
32 #define API __attribute__((visibility("default")))
35 static const int OP_SUCCESS = 0;
36 static const int OP_ERROR = -1;
38 static csensor_event_listener &event_listener = csensor_event_listener::get_instance();
41 static int g_power_save_state = 0;
43 static int get_power_save_state(void);
44 static void power_save_state_cb(keynode_t *node, void *data);
45 static void clean_up(void);
46 static void good_bye(void);
47 static bool change_sensor_rep(sensor_id_t sensor_id, sensor_rep &prev_rep, sensor_rep &cur_rep);
48 static void restore_session(void);
49 static bool register_event(int handle, unsigned int event_type, unsigned int interval, int max_batch_latency, int cb_type, void* cb, void *user_data);
51 void init_client(void)
53 event_listener.set_hup_observer(restore_session);
57 static void good_bye(void)
59 _D("Good bye! %s\n", get_client_name());
63 static int g_power_save_state_cb_cnt = 0;
65 static void set_power_save_state_cb(void)
67 if (g_power_save_state_cb_cnt < 0)
68 _E("g_power_save_state_cb_cnt(%d) is wrong", g_power_save_state_cb_cnt);
70 ++g_power_save_state_cb_cnt;
72 if (g_power_save_state_cb_cnt == 1) {
73 _D("Power save callback is registered");
74 g_power_save_state = get_power_save_state();
75 _D("power_save_state = [%d]", g_power_save_state);
76 vconf_notify_key_changed(VCONFKEY_PM_STATE, power_save_state_cb, NULL);
80 static void unset_power_save_state_cb(void)
82 --g_power_save_state_cb_cnt;
84 if (g_power_save_state_cb_cnt < 0)
85 _E("g_power_save_state_cb_cnt(%d) is wrong", g_power_save_state_cb_cnt);
87 if (g_power_save_state_cb_cnt == 0) {
88 _D("Power save callback is unregistered");
89 vconf_ignore_key_changed(VCONFKEY_PM_STATE, power_save_state_cb);
93 static void clean_up(void)
95 handle_vector handles;
97 event_listener.get_all_handles(handles);
99 auto it_handle = handles.begin();
101 while (it_handle != handles.end()) {
102 sf_disconnect(*it_handle);
108 static int get_power_save_state (void)
113 vconf_get_int(VCONFKEY_PM_STATE, &pm_state);
115 if (pm_state == VCONFKEY_PM_STATE_LCDOFF)
116 state |= SENSOR_OPTION_ON_IN_SCREEN_OFF;
121 static void power_save_state_cb(keynode_t *node, void *data)
123 int cur_power_save_state;
124 sensor_id_vector sensors;
125 sensor_rep prev_rep, cur_rep;
129 cur_power_save_state = get_power_save_state();
131 if (cur_power_save_state == g_power_save_state) {
132 _T("g_power_save_state NOT changed : [%d]", cur_power_save_state);
136 g_power_save_state = cur_power_save_state;
137 _D("power_save_state: %d noti to %s", g_power_save_state, get_client_name());
139 event_listener.get_listening_sensors(sensors);
141 auto it_sensor = sensors.begin();
143 while (it_sensor != sensors.end()) {
144 event_listener.get_sensor_rep(*it_sensor, prev_rep);
145 event_listener.operate_sensor(*it_sensor, cur_power_save_state);
146 event_listener.get_sensor_rep(*it_sensor, cur_rep);
147 change_sensor_rep(*it_sensor, prev_rep, cur_rep);
154 static void restore_session(void)
158 _I("Trying to restore session for %s", get_client_name());
160 command_channel *cmd_channel;
163 event_listener.close_command_channel();
164 event_listener.set_client_id(CLIENT_ID_INVALID);
166 sensor_id_vector sensors;
168 event_listener.get_listening_sensors(sensors);
170 bool first_connection = true;
172 auto it_sensor = sensors.begin();
174 while (it_sensor != sensors.end()) {
175 cmd_channel = new(std::nothrow) command_channel();
176 retm_if (!cmd_channel, "Failed to allocate memory");
178 if (!cmd_channel->create_channel()) {
179 _E("%s failed to create command channel for %s", get_client_name(), get_sensor_name(*it_sensor));
184 event_listener.add_command_channel(*it_sensor, cmd_channel);
186 if (first_connection) {
187 first_connection = false;
188 if (!cmd_channel->cmd_get_id(client_id)) {
189 _E("Failed to get client id");
193 event_listener.set_client_id(client_id);
194 event_listener.start_event_listener();
197 cmd_channel->set_client_id(client_id);
199 if (!cmd_channel->cmd_hello(*it_sensor)) {
200 _E("Sending cmd_hello(%s, %d) failed for %s", get_sensor_name(*it_sensor), client_id, get_client_name());
204 sensor_rep prev_rep, cur_rep;
205 prev_rep.active = false;
206 prev_rep.option = SENSOR_OPTION_DEFAULT;
207 prev_rep.interval = 0;
209 event_listener.get_sensor_rep(*it_sensor, cur_rep);
210 if (!change_sensor_rep(*it_sensor, prev_rep, cur_rep)) {
211 _E("Failed to change rep(%s) for %s", get_sensor_name(*it_sensor), get_client_name());
218 _I("Succeeded to restore session for %s", get_client_name());
223 event_listener.clear();
224 _E("Failed to restore session for %s", get_client_name());
227 static bool get_events_diff(event_type_vector &a_vec, event_type_vector &b_vec, event_type_vector &add_vec, event_type_vector &del_vec)
229 sort(a_vec.begin(), a_vec.end());
230 sort(b_vec.begin(), b_vec.end());
232 set_difference(a_vec.begin(), a_vec.end(), b_vec.begin(), b_vec.end(), back_inserter(del_vec));
233 set_difference(b_vec.begin(), b_vec.end(), a_vec.begin(), a_vec.end(), back_inserter(add_vec));
235 return !(add_vec.empty() && del_vec.empty());
239 static bool change_sensor_rep(sensor_id_t sensor_id, sensor_rep &prev_rep, sensor_rep &cur_rep)
242 command_channel *cmd_channel;
243 event_type_vector add_event_types, del_event_types;
245 if (!event_listener.get_command_channel(sensor_id, &cmd_channel)) {
246 ERR("client %s failed to get command channel for %s", get_client_name(), get_sensor_name(sensor_id));
250 client_id = event_listener.get_client_id();
251 retvm_if ((client_id < 0), false, "Invalid client id : %d, %s, %s", client_id, get_sensor_name(sensor_id), get_client_name());
253 get_events_diff(prev_rep.event_types, cur_rep.event_types, add_event_types, del_event_types);
255 if (cur_rep.active) {
256 if (prev_rep.option != cur_rep.option) {
257 if (!cmd_channel->cmd_set_option(cur_rep.option)) {
258 ERR("Sending cmd_set_option(%d, %s, %d) failed for %s", client_id, get_sensor_name(sensor_id), cur_rep.option, get_client_name());
263 if (prev_rep.interval != cur_rep.interval) {
264 unsigned int min_interval;
266 if (cur_rep.interval == 0)
267 min_interval= POLL_MAX_HZ_MS;
269 min_interval = cur_rep.interval;
271 if (!cmd_channel->cmd_set_interval(min_interval)) {
272 ERR("Sending cmd_set_interval(%d, %s, %d) failed for %s", client_id, get_sensor_name(sensor_id), min_interval, get_client_name());
277 if (!add_event_types.empty()) {
278 if (!cmd_channel->cmd_register_events(add_event_types)) {
279 ERR("Sending cmd_register_events(%d, add_event_types) failed for %s", client_id, get_client_name());
286 if (prev_rep.active && !del_event_types.empty()) {
287 if (!cmd_channel->cmd_unregister_events(del_event_types)) {
288 ERR("Sending cmd_unregister_events(%d, del_event_types) failed for %s", client_id, get_client_name());
293 if (prev_rep.active != cur_rep.active) {
294 if (cur_rep.active) {
295 if (!cmd_channel->cmd_start()) {
296 ERR("Sending cmd_start(%d, %s) failed for %s", client_id, get_sensor_name(sensor_id), get_client_name());
300 if (!cmd_channel->cmd_unset_interval()) {
301 ERR("Sending cmd_unset_interval(%d, %s) failed for %s", client_id, get_sensor_name(sensor_id), get_client_name());
305 if (!cmd_channel->cmd_stop()) {
306 ERR("Sending cmd_stop(%d, %s) failed for %s", client_id, get_sensor_name(sensor_id), get_client_name());
315 API int sf_connect(sensor_type_t sensor_type)
319 sensor = sensord_get_sensor(sensor_type);
321 return sensord_connect(sensor);
324 API int sf_disconnect(int handle)
326 return sensord_disconnect(handle) ? OP_SUCCESS : OP_ERROR;
329 API int sf_start(int handle, int option)
331 return sensord_start(handle, option) ? OP_SUCCESS : OP_ERROR;
334 API int sf_stop(int handle)
336 return sensord_stop(handle) ? OP_SUCCESS : OP_ERROR;
339 API int sf_register_event(int handle, unsigned int event_type, event_condition_t *event_condition, sensor_callback_func_t cb, void *user_data)
341 unsigned int interval = BASE_GATHERING_INTERVAL;
343 if (event_condition != NULL) {
344 if ((event_condition->cond_op == CONDITION_EQUAL) && (event_condition->cond_value1 > 0))
345 interval = event_condition->cond_value1;
348 return register_event(handle, event_type, interval, 0, SENSOR_LEGACY_CB, (void*) cb, user_data) ? OP_SUCCESS : OP_ERROR;
351 API int sf_unregister_event(int handle, unsigned int event_type)
353 return sensord_unregister_event(handle, event_type) ? OP_SUCCESS : OP_ERROR;
356 API int sf_change_event_condition(int handle, unsigned int event_type, event_condition_t *event_condition)
358 unsigned int interval = BASE_GATHERING_INTERVAL;
360 if (event_condition != NULL) {
361 if ((event_condition->cond_op == CONDITION_EQUAL) && (event_condition->cond_value1 > 0))
362 interval = event_condition->cond_value1;
365 return sensord_change_event_interval(handle, event_type, interval) ? OP_SUCCESS : OP_ERROR;
368 API int sf_change_sensor_option(int handle, int option)
370 return sensord_set_option(handle, option) ? OP_SUCCESS : OP_ERROR;
374 API int sf_send_sensorhub_data(int handle, const char* data, int data_len)
376 return sensord_send_sensorhub_data(handle, data, data_len) ? OP_SUCCESS : OP_ERROR;
379 API int sf_get_data(int handle, unsigned int data_id, sensor_data_t* sensor_data)
381 return sensord_get_data(handle, data_id, sensor_data) ? OP_SUCCESS : OP_ERROR;
384 static bool get_sensor_list(void)
387 static bool init = false;
392 command_channel cmd_channel;
394 if (!cmd_channel.create_channel()) {
395 ERR("%s failed to create command channel", get_client_name());
399 if (!cmd_channel.cmd_get_sensor_list())
408 API bool sensord_get_sensor_list(sensor_type_t type, sensor_t **list, int *sensor_count)
410 retvm_if (!get_sensor_list(), false, "Fail to get sensor list from server");
412 vector<sensor_info *> sensor_infos = sensor_info_manager::get_instance().get_infos(type);
413 *list = (sensor_t *) malloc(sizeof(sensor_info *) * sensor_infos.size());
414 retvm_if(!*list, false, "Failed to allocate memory");
416 for (unsigned int i = 0; i < sensor_infos.size(); ++i)
417 *(*list + i) = sensor_info_to_sensor(sensor_infos[i]);
419 *sensor_count = sensor_infos.size();
424 API sensor_t sensord_get_sensor(sensor_type_t type)
426 retvm_if (!get_sensor_list(), NULL, "Fail to get sensor list from server");
428 const sensor_info *info;
430 info = sensor_info_manager::get_instance().get_info(type);
432 return sensor_info_to_sensor(info);
435 API bool sensord_get_type(sensor_t sensor, sensor_type_t *type)
437 sensor_info* info = sensor_to_sensor_info(sensor);
439 retvm_if (!sensor_info_manager::get_instance().is_valid(info) || !type,
440 NULL, "Invalid param: sensor (%p), type(%p)", sensor, type);
442 *type = info->get_type();
447 API const char* sensord_get_name(sensor_t sensor)
449 sensor_info* info = sensor_to_sensor_info(sensor);
451 retvm_if (!sensor_info_manager::get_instance().is_valid(info),
452 NULL, "Invalid param: sensor (%p)", sensor);
454 return info->get_name();
457 API const char* sensord_get_vendor(sensor_t sensor)
459 sensor_info* info = sensor_to_sensor_info(sensor);
461 retvm_if (!sensor_info_manager::get_instance().is_valid(info),
462 NULL, "Invalid param: sensor (%p)", sensor);
464 return info->get_vendor();
467 API bool sensord_get_privilege(sensor_t sensor, sensor_privilege_t *privilege)
469 sensor_info* info = sensor_to_sensor_info(sensor);
471 retvm_if (!sensor_info_manager::get_instance().is_valid(info) || !privilege,
472 false, "Invalid param: sensor (%p), privilege(%p)", sensor, privilege);
474 *privilege = info->get_privilege();
479 API bool sensord_get_min_range(sensor_t sensor, float *min_range)
481 sensor_info* info = sensor_to_sensor_info(sensor);
483 retvm_if (!sensor_info_manager::get_instance().is_valid(info) || !min_range,
484 false, "Invalid param: sensor (%p), min_range(%p)", sensor, min_range);
486 *min_range = info->get_min_range();
491 API bool sensord_get_max_range(sensor_t sensor, float *max_range)
493 sensor_info* info = sensor_to_sensor_info(sensor);
495 retvm_if (!sensor_info_manager::get_instance().is_valid(info) || !max_range,
496 false, "Invalid param: sensor (%p), max_range(%p)", sensor, max_range);
498 *max_range = info->get_max_range();
503 API bool sensord_get_resolution(sensor_t sensor, float *resolution)
505 sensor_info* info = sensor_to_sensor_info(sensor);
507 retvm_if (!sensor_info_manager::get_instance().is_valid(info) || !resolution,
508 false, "Invalid param: sensor (%p), resolution(%p)", sensor, resolution);
510 *resolution = info->get_resolution();
515 API bool sensord_get_min_interval(sensor_t sensor, int *min_interval)
517 sensor_info* info = sensor_to_sensor_info(sensor);
519 retvm_if (!sensor_info_manager::get_instance().is_valid(info) || !min_interval,
520 false, "Invalid param: sensor (%p), min_interval(%p)", sensor, min_interval);
522 *min_interval = info->get_min_interval();
527 API bool sensord_get_fifo_count(sensor_t sensor, int *fifo_count)
529 sensor_info* info = sensor_to_sensor_info(sensor);
531 retvm_if (!sensor_info_manager::get_instance().is_valid(info) || !fifo_count,
532 false, "Invalid param: sensor (%p), fifo_count(%p)", sensor, fifo_count);
534 *fifo_count = info->get_fifo_count();
539 API bool sensord_get_max_batch_count(sensor_t sensor, int *max_batch_count)
541 sensor_info* info = sensor_to_sensor_info(sensor);
543 retvm_if (!sensor_info_manager::get_instance().is_valid(info) || !max_batch_count,
544 false, "Invalid param: sensor (%p), max_batch_count(%p)", sensor, max_batch_count);
546 *max_batch_count = info->get_max_batch_count();
551 API bool sensord_get_supported_event_types(sensor_t sensor, unsigned int **event_types, int *count)
553 sensor_info* info = sensor_to_sensor_info(sensor);
555 retvm_if (!sensor_info_manager::get_instance().is_valid(info) || !event_types || !count,
556 false, "Invalid param: sensor (%p), event_types(%p), count(%)", sensor, event_types, count);
558 vector<unsigned int> event_vec;
560 info->get_supported_events(event_vec);
561 *event_types = (unsigned int *) malloc(sizeof(unsigned int) * event_vec.size());
562 retvm_if(!*event_types, false, "Failed to allocate memory");
564 copy(event_vec.begin(), event_vec.end(), *event_types);
565 *count = event_vec.size();
570 API bool sensord_is_supported_event_type(sensor_t sensor, unsigned int event_type, bool *supported)
572 sensor_info* info = sensor_to_sensor_info(sensor);
574 retvm_if (!sensor_info_manager::get_instance().is_valid(info) || !event_type || !supported,
575 false, "Invalid param: sensor (%p), event_type(%p), supported(%)", sensor, event_type, supported);
577 *supported = info->is_supported_event(event_type);
582 API int sensord_connect(sensor_t sensor)
584 command_channel *cmd_channel = NULL;
587 bool sensor_registered;
588 bool first_connection = false;
590 sensor_info* info = sensor_to_sensor_info(sensor);
592 retvm_if (!sensor_info_manager::get_instance().is_valid(info),
593 OP_ERROR, "Invalid param: sensor (%p)", sensor);
595 sensor_id_t sensor_id = info->get_id();
599 sensor_registered = event_listener.is_sensor_registered(sensor_id);
601 handle = event_listener.create_handle(sensor_id);
602 if (handle == MAX_HANDLE) {
603 ERR("Maximum number of handles reached, sensor: %s in client %s", get_sensor_name(sensor_id), get_client_name());
607 if (!sensor_registered) {
608 cmd_channel = new(std::nothrow) command_channel();
609 retvm_if (!cmd_channel, OP_ERROR, "Failed to allocate memory");
611 if (!cmd_channel->create_channel()) {
612 ERR("%s failed to create command channel for %s", get_client_name(), get_sensor_name(sensor_id));
613 event_listener.delete_handle(handle);
618 event_listener.add_command_channel(sensor_id, cmd_channel);
621 if (!event_listener.get_command_channel(sensor_id, &cmd_channel)) {
622 ERR("%s failed to get command channel for %s", get_client_name(), get_sensor_name(sensor_id));
623 event_listener.delete_handle(handle);
627 if (!event_listener.has_client_id()) {
628 first_connection = true;
629 if(!cmd_channel->cmd_get_id(client_id)) {
630 ERR("Sending cmd_get_id() failed for %s", get_sensor_name(sensor_id));
631 event_listener.close_command_channel(sensor_id);
632 event_listener.delete_handle(handle);
636 event_listener.set_client_id(client_id);
637 INFO("%s gets client_id [%d]", get_client_name(), client_id);
638 event_listener.start_event_listener();
639 INFO("%s starts listening events with client_id [%d]", get_client_name(), client_id);
642 client_id = event_listener.get_client_id();
643 cmd_channel->set_client_id(client_id);
645 INFO("%s[%d] connects with %s[%d]", get_client_name(), client_id, get_sensor_name(sensor_id), handle);
647 event_listener.set_sensor_params(handle, SENSOR_STATE_STOPPED, SENSOR_OPTION_DEFAULT);
649 if (!sensor_registered) {
650 if(!cmd_channel->cmd_hello(sensor_id)) {
651 ERR("Sending cmd_hello(%s, %d) failed for %s", get_sensor_name(sensor_id), client_id, get_client_name());
652 event_listener.close_command_channel(sensor_id);
653 event_listener.delete_handle(handle);
654 if (first_connection) {
655 event_listener.set_client_id(CLIENT_ID_INVALID);
656 event_listener.stop_event_listener();
662 set_power_save_state_cb();
666 API bool sensord_disconnect(int handle)
668 command_channel *cmd_channel;
669 sensor_id_t sensor_id;
675 if (!event_listener.get_sensor_state(handle, sensor_state)||
676 !event_listener.get_sensor_id(handle, sensor_id)) {
677 ERR("client %s failed to get handle information", get_client_name());
681 if (!event_listener.get_command_channel(sensor_id, &cmd_channel)) {
682 ERR("client %s failed to get command channel for %s", get_client_name(), get_sensor_name(sensor_id));
686 client_id = event_listener.get_client_id();
687 retvm_if ((client_id < 0), false, "Invalid client id : %d, handle: %d, %s, %s", client_id, handle, get_sensor_name(sensor_id), get_client_name());
689 INFO("%s disconnects with %s[%d]", get_client_name(), get_sensor_name(sensor_id), handle);
691 if (sensor_state != SENSOR_STATE_STOPPED) {
692 WARN("%s[%d] for %s is not stopped before disconnecting.",
693 get_sensor_name(sensor_id), handle, get_client_name());
694 sensord_stop(handle);
697 if (!event_listener.delete_handle(handle))
700 if (!event_listener.is_active())
701 event_listener.set_client_id(CLIENT_ID_INVALID);
703 if (!event_listener.is_sensor_registered(sensor_id)) {
704 if(!cmd_channel->cmd_byebye()) {
705 ERR("Sending cmd_byebye(%d, %s) failed for %s", client_id, get_sensor_name(sensor_id), get_client_name());
708 event_listener.close_command_channel(sensor_id);
711 if (!event_listener.is_active()) {
712 INFO("Stop listening events for client %s with client id [%d]", get_client_name(), event_listener.get_client_id());
713 event_listener.stop_event_listener();
716 unset_power_save_state_cb();
722 static bool register_event(int handle, unsigned int event_type, unsigned int interval, int max_batch_latency, int cb_type, void* cb, void *user_data)
724 sensor_id_t sensor_id;
725 sensor_rep prev_rep, cur_rep;
728 retvm_if (!cb, false, "callback is NULL");
732 if (!event_listener.get_sensor_id(handle, sensor_id)) {
733 ERR("client %s failed to get handle information", get_client_name());
740 INFO("%s registers event %s[0x%x] for sensor %s[%d] with interval: %d, cb: 0x%x, user_data: 0x%x", get_client_name(), get_event_name(event_type),
741 event_type, get_sensor_name(sensor_id), handle, interval, cb, user_data);
743 event_listener.get_sensor_rep(sensor_id, prev_rep);
744 event_listener.register_event(handle, event_type, interval, cb_type, cb, user_data);
745 event_listener.get_sensor_rep(sensor_id, cur_rep);
746 ret = change_sensor_rep(sensor_id, prev_rep, cur_rep);
749 event_listener.unregister_event(handle, event_type);
754 API bool sensord_register_event(int handle, unsigned int event_type, unsigned int interval, unsigned int max_batch_latency, sensor_cb_t cb, void *user_data)
756 return register_event(handle, event_type, interval, max_batch_latency, SENSOR_EVENT_CB, (void *)cb, user_data);
759 API bool sensord_register_hub_event(int handle, unsigned int event_type, unsigned int interval, unsigned int max_batch_latency, sensorhub_cb_t cb, void *user_data)
761 return register_event(handle, event_type, interval, max_batch_latency, SENSORHUB_EVENT_CB, (void *)cb, user_data);
765 API bool sensord_unregister_event(int handle, unsigned int event_type)
767 sensor_id_t sensor_id;
768 sensor_rep prev_rep, cur_rep;
770 unsigned int prev_interval;
773 void *prev_user_data;
777 if (!event_listener.get_sensor_id(handle, sensor_id)) {
778 ERR("client %s failed to get handle information", get_client_name());
782 INFO("%s unregisters event %s[0x%x] for sensor %s[%d]", get_client_name(), get_event_name(event_type),
783 event_type, get_sensor_name(sensor_id), handle);
785 event_listener.get_sensor_rep(sensor_id, prev_rep);
786 event_listener.get_event_info(handle, event_type, prev_interval, prev_cb_type, prev_cb, prev_user_data);
788 if (!event_listener.unregister_event(handle, event_type)) {
789 ERR("%s try to unregister non registered event %s[0x%x] for sensor %s[%d]",
790 get_client_name(),get_event_name(event_type), event_type, get_sensor_name(sensor_id), handle);
794 event_listener.get_sensor_rep(sensor_id, cur_rep);
795 ret = change_sensor_rep(sensor_id, prev_rep, cur_rep);
798 event_listener.register_event(handle, event_type, prev_interval, prev_cb_type, prev_cb, prev_user_data);
805 API bool sensord_register_accuracy_cb(int handle, sensor_accuracy_changed_cb_t cb, void *user_data)
807 sensor_id_t sensor_id;
809 retvm_if (!cb, false, "callback is NULL");
813 if (!event_listener.get_sensor_id(handle, sensor_id)) {
814 ERR("client %s failed to get handle information", get_client_name());
819 INFO("%s registers accuracy_changed_cb for sensor %s[%d] with cb: 0x%x, user_data: 0x%x",
820 get_client_name(), get_sensor_name(sensor_id), handle, cb, user_data);
822 event_listener.register_accuracy_cb(handle, cb , user_data);
828 API bool sensord_unregister_accuracy_cb(int handle)
830 sensor_id_t sensor_id;
834 if (!event_listener.get_sensor_id(handle, sensor_id)) {
835 ERR("client %s failed to get handle information", get_client_name());
840 INFO("%s unregisters accuracy_changed_cb for sensor %s[%d]",
841 get_client_name(), get_sensor_name(sensor_id), handle);
843 event_listener.unregister_accuracy_cb(handle);
849 API bool sensord_start(int handle, int option)
851 sensor_id_t sensor_id;
852 sensor_rep prev_rep, cur_rep;
854 int prev_state, prev_option;
858 if (!event_listener.get_sensor_id(handle, sensor_id)) {
859 ERR("client %s failed to get handle information", get_client_name());
863 retvm_if ((option < 0) || (option >= SENSOR_OPTION_END), false, "Invalid option value : %d, handle: %d, %s, %s",
864 option, handle, get_sensor_name(sensor_id), get_client_name());
866 INFO("%s starts %s[%d], with option: %d, power save state: %d", get_client_name(), get_sensor_name(sensor_id),
867 handle, option, g_power_save_state);
869 if (g_power_save_state && !(g_power_save_state & option)) {
870 event_listener.set_sensor_params(handle, SENSOR_STATE_PAUSED, option);
874 event_listener.get_sensor_rep(sensor_id, prev_rep);
875 event_listener.get_sensor_params(handle, prev_state, prev_option);
876 event_listener.set_sensor_params(handle, SENSOR_STATE_STARTED, option);
877 event_listener.get_sensor_rep(sensor_id, cur_rep);
879 ret = change_sensor_rep(sensor_id, prev_rep, cur_rep);
882 event_listener.set_sensor_params(handle, prev_state, prev_option);
887 API bool sensord_stop(int handle)
889 sensor_id_t sensor_id;
892 int prev_state, prev_option;
894 sensor_rep prev_rep, cur_rep;
898 if (!event_listener.get_sensor_state(handle, sensor_state)||
899 !event_listener.get_sensor_id(handle, sensor_id)) {
900 ERR("client %s failed to get handle information", get_client_name());
904 retvm_if ((sensor_state == SENSOR_STATE_STOPPED), true, "%s already stopped with %s[%d]",
905 get_client_name(), get_sensor_name(sensor_id), handle);
908 INFO("%s stops sensor %s[%d]", get_client_name(), get_sensor_name(sensor_id), handle);
910 event_listener.get_sensor_rep(sensor_id, prev_rep);
911 event_listener.get_sensor_params(handle, prev_state, prev_option);
912 event_listener.set_sensor_state(handle, SENSOR_STATE_STOPPED);
913 event_listener.get_sensor_rep(sensor_id, cur_rep);
915 ret = change_sensor_rep(sensor_id, prev_rep, cur_rep);
918 event_listener.set_sensor_params(handle, prev_state, prev_option);
924 API bool sensord_change_event_interval(int handle, unsigned int event_type, unsigned int interval)
926 sensor_id_t sensor_id;
927 sensor_rep prev_rep, cur_rep;
929 unsigned int prev_interval;
932 void *prev_user_data;
936 if (!event_listener.get_sensor_id(handle, sensor_id)) {
937 ERR("client %s failed to get handle information", get_client_name());
941 INFO("%s changes interval of event %s[0x%x] for %s[%d] to interval %d", get_client_name(), get_event_name(event_type),
942 event_type, get_sensor_name(sensor_id), handle, interval);
944 event_listener.get_sensor_rep(sensor_id, prev_rep);
946 event_listener.get_event_info(handle, event_type, prev_interval, prev_cb_type, prev_cb, prev_user_data);
948 if (!event_listener.set_event_interval(handle, event_type, interval))
951 event_listener.get_sensor_rep(sensor_id, cur_rep);
953 ret = change_sensor_rep(sensor_id, prev_rep, cur_rep);
956 event_listener.set_event_interval(handle, event_type, prev_interval);
962 API bool sensord_change_event_max_batch_latency(int handle, unsigned int max_batch_latency)
968 API bool sensord_set_option(int handle, int option)
970 sensor_id_t sensor_id;
971 sensor_rep prev_rep, cur_rep;
974 int prev_state, prev_option;
978 if (!event_listener.get_sensor_state(handle, sensor_state)||
979 !event_listener.get_sensor_id(handle, sensor_id)) {
980 ERR("client %s failed to get handle information", get_client_name());
984 retvm_if ((option < 0) || (option >= SENSOR_OPTION_END), false, "Invalid option value : %d, handle: %d, %s, %s",
985 option, handle, get_sensor_name(sensor_id), get_client_name());
988 event_listener.get_sensor_rep(sensor_id, prev_rep);
989 event_listener.get_sensor_params(handle, prev_state, prev_option);
991 if (g_power_save_state) {
992 if ((option & g_power_save_state) && (sensor_state == SENSOR_STATE_PAUSED))
993 event_listener.set_sensor_state(handle, SENSOR_STATE_STARTED);
994 else if (!(option & g_power_save_state) && (sensor_state == SENSOR_STATE_STARTED))
995 event_listener.set_sensor_state(handle, SENSOR_STATE_PAUSED);
997 event_listener.set_sensor_option(handle, option);
999 event_listener.get_sensor_rep(sensor_id, cur_rep);
1000 ret = change_sensor_rep(sensor_id, prev_rep, cur_rep);
1003 event_listener.set_sensor_option(handle, prev_option);
1009 bool sensord_send_sensorhub_data(int handle, const char *data, int data_len)
1011 sensor_id_t sensor_id;
1012 command_channel *cmd_channel;
1017 if (!event_listener.get_sensor_id(handle, sensor_id)) {
1018 ERR("client %s failed to get handle information", get_client_name());
1022 retvm_if (sensor_id != CONTEXT_SENSOR, false, "%s use this API wrongly, only for CONTEXT_SENSOR not for %s",
1023 get_client_name(), get_sensor_name(sensor_id));
1025 if (!event_listener.get_command_channel(sensor_id, &cmd_channel)) {
1026 ERR("client %s failed to get command channel for %s", get_client_name(), get_sensor_name(sensor_id));
1030 retvm_if((data_len < 0) || (data == NULL), false, "Invalid data_len: %d, data: 0x%x, handle: %d, %s, %s",
1031 data_len, data, handle, get_sensor_name(sensor_id), get_client_name());
1033 client_id = event_listener.get_client_id();
1034 retvm_if ((client_id < 0), false, "Invalid client id : %d, handle: %d, %s, %s", client_id, handle, get_sensor_name(sensor_id), get_client_name());
1036 retvm_if (!event_listener.is_sensor_active(sensor_id), false, "%s with client_id:%d is not active state for %s with handle: %d",
1037 get_sensor_name(sensor_id), client_id, get_client_name(), handle);
1039 if (!cmd_channel->cmd_send_sensorhub_data(data, data_len)) {
1040 ERR("Sending cmd_send_sensorhub_data(%d, %d, 0x%x) failed for %s",
1041 client_id, data_len, data, get_client_name);
1049 API bool sensord_get_data(int handle, unsigned int data_id, sensor_data_t* sensor_data)
1051 sensor_id_t sensor_id;
1052 command_channel *cmd_channel;
1056 retvm_if ((!sensor_data), false, "sensor_data is NULL");
1060 if (!event_listener.get_sensor_state(handle, sensor_state)||
1061 !event_listener.get_sensor_id(handle, sensor_id)) {
1062 ERR("client %s failed to get handle information", get_client_name());
1066 if (!event_listener.get_command_channel(sensor_id, &cmd_channel)) {
1067 ERR("client %s failed to get command channel for %s", get_client_name(), get_sensor_name(sensor_id));
1071 client_id = event_listener.get_client_id();
1072 retvm_if ((client_id < 0), false, "Invalid client id : %d, handle: %d, %s, %s", client_id, handle, get_sensor_name(sensor_id), get_client_name());
1074 if (sensor_state != SENSOR_STATE_STARTED) {
1075 ERR("Sensor %s is not started for client %s with handle: %d, sensor_state: %d", get_sensor_name(sensor_id), get_client_name(), handle, sensor_state);
1079 if(!cmd_channel->cmd_get_data(data_id, sensor_data)) {
1080 ERR("Cmd_get_struct(%d, %d, 0x%x) failed for %s", client_id, data_id, sensor_data, get_client_name());