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>
24 #include <csensor_event_listener.h>
25 #include <client_common.h>
29 #include <sensor_info.h>
30 #include <sensor_info_manager.h>
33 #define API __attribute__((visibility("default")))
36 static const int OP_SUCCESS = 0;
37 static const int OP_ERROR = -1;
39 static csensor_event_listener &event_listener = csensor_event_listener::get_instance();
42 static int g_power_save_state = 0;
44 static int get_power_save_state(void);
45 static void power_save_state_cb(keynode_t *node, void *data);
46 static void clean_up(void);
47 static void good_bye(void);
48 static bool change_sensor_rep(sensor_id_t sensor_id, sensor_rep &prev_rep, sensor_rep &cur_rep);
49 static void restore_session(void);
50 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);
52 void init_client(void)
54 event_listener.set_hup_observer(restore_session);
58 static void good_bye(void)
60 _D("Good bye! %s\n", get_client_name());
64 static int g_power_save_state_cb_cnt = 0;
66 static void set_power_save_state_cb(void)
68 if (g_power_save_state_cb_cnt < 0)
69 _E("g_power_save_state_cb_cnt(%d) is wrong", g_power_save_state_cb_cnt);
71 ++g_power_save_state_cb_cnt;
73 if (g_power_save_state_cb_cnt == 1) {
74 _D("Power save callback is registered");
75 g_power_save_state = get_power_save_state();
76 _D("power_save_state = [%d]", g_power_save_state);
77 vconf_notify_key_changed(VCONFKEY_PM_STATE, power_save_state_cb, NULL);
81 static void unset_power_save_state_cb(void)
83 --g_power_save_state_cb_cnt;
85 if (g_power_save_state_cb_cnt < 0)
86 _E("g_power_save_state_cb_cnt(%d) is wrong", g_power_save_state_cb_cnt);
88 if (g_power_save_state_cb_cnt == 0) {
89 _D("Power save callback is unregistered");
90 vconf_ignore_key_changed(VCONFKEY_PM_STATE, power_save_state_cb);
94 static void clean_up(void)
96 handle_vector handles;
98 event_listener.get_all_handles(handles);
100 auto it_handle = handles.begin();
102 while (it_handle != handles.end()) {
103 sf_disconnect(*it_handle);
109 static int get_power_save_state (void)
114 vconf_get_int(VCONFKEY_PM_STATE, &pm_state);
116 if (pm_state == VCONFKEY_PM_STATE_LCDOFF)
117 state |= SENSOR_OPTION_ON_IN_SCREEN_OFF;
122 static void power_save_state_cb(keynode_t *node, void *data)
124 int cur_power_save_state;
125 sensor_id_vector sensors;
126 sensor_rep prev_rep, cur_rep;
130 cur_power_save_state = get_power_save_state();
132 if (cur_power_save_state == g_power_save_state) {
133 _T("g_power_save_state NOT changed : [%d]", cur_power_save_state);
137 g_power_save_state = cur_power_save_state;
138 _D("power_save_state: %d noti to %s", g_power_save_state, get_client_name());
140 event_listener.get_listening_sensors(sensors);
142 auto it_sensor = sensors.begin();
144 while (it_sensor != sensors.end()) {
145 event_listener.get_sensor_rep(*it_sensor, prev_rep);
146 event_listener.operate_sensor(*it_sensor, cur_power_save_state);
147 event_listener.get_sensor_rep(*it_sensor, cur_rep);
148 change_sensor_rep(*it_sensor, prev_rep, cur_rep);
155 static void restore_session(void)
159 _I("Trying to restore session for %s", get_client_name());
161 command_channel *cmd_channel;
164 event_listener.close_command_channel();
165 event_listener.set_client_id(CLIENT_ID_INVALID);
167 sensor_id_vector sensors;
169 event_listener.get_listening_sensors(sensors);
171 bool first_connection = true;
173 auto it_sensor = sensors.begin();
175 while (it_sensor != sensors.end()) {
176 cmd_channel = new(std::nothrow) command_channel();
177 retm_if (!cmd_channel, "Failed to allocate memory");
179 if (!cmd_channel->create_channel()) {
180 _E("%s failed to create command channel for %s", get_client_name(), get_sensor_name(*it_sensor));
185 event_listener.add_command_channel(*it_sensor, cmd_channel);
187 if (first_connection) {
188 first_connection = false;
189 if (!cmd_channel->cmd_get_id(client_id)) {
190 _E("Failed to get client id");
194 event_listener.set_client_id(client_id);
195 event_listener.start_event_listener();
198 cmd_channel->set_client_id(client_id);
200 if (!cmd_channel->cmd_hello(*it_sensor)) {
201 _E("Sending cmd_hello(%s, %d) failed for %s", get_sensor_name(*it_sensor), client_id, get_client_name());
205 sensor_rep prev_rep, cur_rep;
206 prev_rep.active = false;
207 prev_rep.option = SENSOR_OPTION_DEFAULT;
208 prev_rep.interval = 0;
210 event_listener.get_sensor_rep(*it_sensor, cur_rep);
211 if (!change_sensor_rep(*it_sensor, prev_rep, cur_rep)) {
212 _E("Failed to change rep(%s) for %s", get_sensor_name(*it_sensor), get_client_name());
219 _I("Succeeded to restore session for %s", get_client_name());
224 event_listener.clear();
225 _E("Failed to restore session for %s", get_client_name());
228 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)
230 sort(a_vec.begin(), a_vec.end());
231 sort(b_vec.begin(), b_vec.end());
233 set_difference(a_vec.begin(), a_vec.end(), b_vec.begin(), b_vec.end(), back_inserter(del_vec));
234 set_difference(b_vec.begin(), b_vec.end(), a_vec.begin(), a_vec.end(), back_inserter(add_vec));
236 return !(add_vec.empty() && del_vec.empty());
240 static bool change_sensor_rep(sensor_id_t sensor_id, sensor_rep &prev_rep, sensor_rep &cur_rep)
243 command_channel *cmd_channel;
244 event_type_vector add_event_types, del_event_types;
246 if (!event_listener.get_command_channel(sensor_id, &cmd_channel)) {
247 ERR("client %s failed to get command channel for %s", get_client_name(), get_sensor_name(sensor_id));
251 client_id = event_listener.get_client_id();
252 retvm_if ((client_id < 0), false, "Invalid client id : %d, %s, %s", client_id, get_sensor_name(sensor_id), get_client_name());
254 get_events_diff(prev_rep.event_types, cur_rep.event_types, add_event_types, del_event_types);
256 if (cur_rep.active) {
257 if (prev_rep.option != cur_rep.option) {
258 if (!cmd_channel->cmd_set_option(cur_rep.option)) {
259 ERR("Sending cmd_set_option(%d, %s, %d) failed for %s", client_id, get_sensor_name(sensor_id), cur_rep.option, get_client_name());
264 if (prev_rep.interval != cur_rep.interval) {
265 unsigned int min_interval;
267 if (cur_rep.interval == 0)
268 min_interval= POLL_MAX_HZ_MS;
270 min_interval = cur_rep.interval;
272 if (!cmd_channel->cmd_set_interval(min_interval)) {
273 ERR("Sending cmd_set_interval(%d, %s, %d) failed for %s", client_id, get_sensor_name(sensor_id), min_interval, get_client_name());
278 if (!add_event_types.empty()) {
279 if (!cmd_channel->cmd_register_events(add_event_types)) {
280 ERR("Sending cmd_register_events(%d, add_event_types) failed for %s", client_id, get_client_name());
287 if (prev_rep.active && !del_event_types.empty()) {
288 if (!cmd_channel->cmd_unregister_events(del_event_types)) {
289 ERR("Sending cmd_unregister_events(%d, del_event_types) failed for %s", client_id, get_client_name());
294 if (prev_rep.active != cur_rep.active) {
295 if (cur_rep.active) {
296 if (!cmd_channel->cmd_start()) {
297 ERR("Sending cmd_start(%d, %s) failed for %s", client_id, get_sensor_name(sensor_id), get_client_name());
301 if (!cmd_channel->cmd_unset_interval()) {
302 ERR("Sending cmd_unset_interval(%d, %s) failed for %s", client_id, get_sensor_name(sensor_id), get_client_name());
306 if (!cmd_channel->cmd_stop()) {
307 ERR("Sending cmd_stop(%d, %s) failed for %s", client_id, get_sensor_name(sensor_id), get_client_name());
316 API int sf_connect(sensor_type_t sensor_type)
320 sensor = sensord_get_sensor(sensor_type);
322 return sensord_connect(sensor);
325 API int sf_disconnect(int handle)
327 return sensord_disconnect(handle) ? OP_SUCCESS : OP_ERROR;
330 API int sf_start(int handle, int option)
332 return sensord_start(handle, option) ? OP_SUCCESS : OP_ERROR;
335 API int sf_stop(int handle)
337 return sensord_stop(handle) ? OP_SUCCESS : OP_ERROR;
340 API int sf_register_event(int handle, unsigned int event_type, event_condition_t *event_condition, sensor_callback_func_t cb, void *user_data)
342 unsigned int interval = BASE_GATHERING_INTERVAL;
344 if (event_condition != NULL) {
345 if ((event_condition->cond_op == CONDITION_EQUAL) && (event_condition->cond_value1 > 0))
346 interval = event_condition->cond_value1;
349 return register_event(handle, event_type, interval, 0, SENSOR_LEGACY_CB, (void*) cb, user_data) ? OP_SUCCESS : OP_ERROR;
352 API int sf_unregister_event(int handle, unsigned int event_type)
354 return sensord_unregister_event(handle, event_type) ? OP_SUCCESS : OP_ERROR;
357 API int sf_change_event_condition(int handle, unsigned int event_type, event_condition_t *event_condition)
359 unsigned int interval = BASE_GATHERING_INTERVAL;
361 if (event_condition != NULL) {
362 if ((event_condition->cond_op == CONDITION_EQUAL) && (event_condition->cond_value1 > 0))
363 interval = event_condition->cond_value1;
366 return sensord_change_event_interval(handle, event_type, interval) ? OP_SUCCESS : OP_ERROR;
369 API int sf_change_sensor_option(int handle, int option)
371 return sensord_set_option(handle, option) ? OP_SUCCESS : OP_ERROR;
375 API int sf_send_sensorhub_data(int handle, const char* data, int data_len)
377 return sensord_send_sensorhub_data(handle, data, data_len) ? OP_SUCCESS : OP_ERROR;
380 API int sf_get_data(int handle, unsigned int data_id, sensor_data_t* sensor_data)
382 return sensord_get_data(handle, data_id, sensor_data) ? OP_SUCCESS : OP_ERROR;
385 API int sf_check_rotation(unsigned long *rotation)
391 int sf_is_sensor_event_available(sensor_type_t sensor_type, unsigned int event_type)
396 int sf_get_data_properties(unsigned int data_id, sensor_data_properties_t *return_data_properties)
401 int sf_get_properties(sensor_type_t sensor_type, sensor_properties_t *return_properties)
406 static bool get_sensor_list(void)
409 static bool init = false;
414 command_channel cmd_channel;
416 if (!cmd_channel.create_channel()) {
417 ERR("%s failed to create command channel", get_client_name());
421 if (!cmd_channel.cmd_get_sensor_list())
430 API bool sensord_get_sensor_list(sensor_type_t type, sensor_t **list, int *sensor_count)
432 retvm_if (!get_sensor_list(), false, "Fail to get sensor list from server");
434 vector<sensor_info *> sensor_infos = sensor_info_manager::get_instance().get_infos(type);
436 if (!sensor_infos.empty()) {
437 *list = (sensor_t *) malloc(sizeof(sensor_info *) * sensor_infos.size());
438 retvm_if(!*list, false, "Failed to allocate memory");
441 for (int i = 0; i < sensor_infos.size(); ++i)
442 *(*list + i) = sensor_info_to_sensor(sensor_infos[i]);
444 *sensor_count = sensor_infos.size();
449 API sensor_t sensord_get_sensor(sensor_type_t type)
451 retvm_if (!get_sensor_list(), NULL, "Fail to get sensor list from server");
453 const sensor_info *info;
455 info = sensor_info_manager::get_instance().get_info(type);
457 return sensor_info_to_sensor(info);
460 API bool sensord_get_type(sensor_t sensor, sensor_type_t *type)
462 sensor_info* info = sensor_to_sensor_info(sensor);
464 retvm_if (!sensor_info_manager::get_instance().is_valid(info) || !type,
465 NULL, "Invalid param: sensor (%p), type(%p)", sensor, type);
467 *type = info->get_type();
472 API const char* sensord_get_name(sensor_t sensor)
474 sensor_info* info = sensor_to_sensor_info(sensor);
476 retvm_if (!sensor_info_manager::get_instance().is_valid(info),
477 NULL, "Invalid param: sensor (%p)", sensor);
479 return info->get_name();
482 API const char* sensord_get_vendor(sensor_t sensor)
484 sensor_info* info = sensor_to_sensor_info(sensor);
486 retvm_if (!sensor_info_manager::get_instance().is_valid(info),
487 NULL, "Invalid param: sensor (%p)", sensor);
489 return info->get_vendor();
492 API bool sensord_get_privilege(sensor_t sensor, sensor_privilege_t *privilege)
494 sensor_info* info = sensor_to_sensor_info(sensor);
496 retvm_if (!sensor_info_manager::get_instance().is_valid(info) || !privilege,
497 false, "Invalid param: sensor (%p), privilege(%p)", sensor, privilege);
499 *privilege = info->get_privilege();
504 API bool sensord_get_min_range(sensor_t sensor, float *min_range)
506 sensor_info* info = sensor_to_sensor_info(sensor);
508 retvm_if (!sensor_info_manager::get_instance().is_valid(info) || !min_range,
509 false, "Invalid param: sensor (%p), min_range(%p)", sensor, min_range);
511 *min_range = info->get_min_range();
516 API bool sensord_get_max_range(sensor_t sensor, float *max_range)
518 sensor_info* info = sensor_to_sensor_info(sensor);
520 retvm_if (!sensor_info_manager::get_instance().is_valid(info) || !max_range,
521 false, "Invalid param: sensor (%p), max_range(%p)", sensor, max_range);
523 *max_range = info->get_max_range();
528 API bool sensord_get_resolution(sensor_t sensor, float *resolution)
530 sensor_info* info = sensor_to_sensor_info(sensor);
532 retvm_if (!sensor_info_manager::get_instance().is_valid(info) || !resolution,
533 false, "Invalid param: sensor (%p), resolution(%p)", sensor, resolution);
535 *resolution = info->get_resolution();
540 API bool sensord_get_min_interval(sensor_t sensor, int *min_interval)
542 sensor_info* info = sensor_to_sensor_info(sensor);
544 retvm_if (!sensor_info_manager::get_instance().is_valid(info) || !min_interval,
545 false, "Invalid param: sensor (%p), min_interval(%p)", sensor, min_interval);
547 *min_interval = info->get_min_interval();
552 API bool sensord_get_fifo_count(sensor_t sensor, int *fifo_count)
554 sensor_info* info = sensor_to_sensor_info(sensor);
556 retvm_if (!sensor_info_manager::get_instance().is_valid(info) || !fifo_count,
557 false, "Invalid param: sensor (%p), fifo_count(%p)", sensor, fifo_count);
559 *fifo_count = info->get_fifo_count();
564 API bool sensord_get_max_batch_count(sensor_t sensor, int *max_batch_count)
566 sensor_info* info = sensor_to_sensor_info(sensor);
568 retvm_if (!sensor_info_manager::get_instance().is_valid(info) || !max_batch_count,
569 false, "Invalid param: sensor (%p), max_batch_count(%p)", sensor, max_batch_count);
571 *max_batch_count = info->get_max_batch_count();
576 API bool sensord_get_supported_event_types(sensor_t sensor, unsigned int **event_types, int *count)
578 sensor_info* info = sensor_to_sensor_info(sensor);
580 retvm_if (!sensor_info_manager::get_instance().is_valid(info) || !event_types || !count,
581 false, "Invalid param: sensor (%p), event_types(%p), count(%)", sensor, event_types, count);
583 vector<unsigned int> event_vec;
585 info->get_supported_events(event_vec);
586 *event_types = (unsigned int *) malloc(sizeof(unsigned int) * event_vec.size());
587 retvm_if(!*event_types, false, "Failed to allocate memory");
589 copy(event_vec.begin(), event_vec.end(), *event_types);
590 *count = event_vec.size();
595 API bool sensord_is_supported_event_type(sensor_t sensor, unsigned int event_type, bool *supported)
597 sensor_info* info = sensor_to_sensor_info(sensor);
599 retvm_if (!sensor_info_manager::get_instance().is_valid(info) || !event_type || !supported,
600 false, "Invalid param: sensor (%p), event_type(%p), supported(%)", sensor, event_type, supported);
602 *supported = info->is_supported_event(event_type);
607 API int sensord_connect(sensor_t sensor)
609 command_channel *cmd_channel = NULL;
612 bool sensor_registered;
613 bool first_connection = false;
615 sensor_info* info = sensor_to_sensor_info(sensor);
617 retvm_if (!sensor_info_manager::get_instance().is_valid(info),
618 OP_ERROR, "Invalid param: sensor (%p)", sensor);
620 sensor_id_t sensor_id = info->get_id();
624 sensor_registered = event_listener.is_sensor_registered(sensor_id);
626 handle = event_listener.create_handle(sensor_id);
627 if (handle == MAX_HANDLE) {
628 ERR("Maximum number of handles reached, sensor: %s in client %s", get_sensor_name(sensor_id), get_client_name());
632 if (!sensor_registered) {
633 cmd_channel = new(std::nothrow) command_channel();
634 retvm_if (!cmd_channel, OP_ERROR, "Failed to allocate memory");
636 if (!cmd_channel->create_channel()) {
637 ERR("%s failed to create command channel for %s", get_client_name(), get_sensor_name(sensor_id));
638 event_listener.delete_handle(handle);
643 event_listener.add_command_channel(sensor_id, cmd_channel);
646 if (!event_listener.get_command_channel(sensor_id, &cmd_channel)) {
647 ERR("%s failed to get command channel for %s", get_client_name(), get_sensor_name(sensor_id));
648 event_listener.delete_handle(handle);
652 if (!event_listener.has_client_id()) {
653 first_connection = true;
654 if(!cmd_channel->cmd_get_id(client_id)) {
655 ERR("Sending cmd_get_id() failed for %s", get_sensor_name(sensor_id));
656 event_listener.close_command_channel(sensor_id);
657 event_listener.delete_handle(handle);
661 event_listener.set_client_id(client_id);
662 INFO("%s gets client_id [%d]", get_client_name(), client_id);
663 event_listener.start_event_listener();
664 INFO("%s starts listening events with client_id [%d]", get_client_name(), client_id);
667 client_id = event_listener.get_client_id();
668 cmd_channel->set_client_id(client_id);
670 INFO("%s[%d] connects with %s[%d]", get_client_name(), client_id, get_sensor_name(sensor_id), handle);
672 event_listener.set_sensor_params(handle, SENSOR_STATE_STOPPED, SENSOR_OPTION_DEFAULT);
674 if (!sensor_registered) {
675 if(!cmd_channel->cmd_hello(sensor_id)) {
676 ERR("Sending cmd_hello(%s, %d) failed for %s", get_sensor_name(sensor_id), client_id, get_client_name());
677 event_listener.close_command_channel(sensor_id);
678 event_listener.delete_handle(handle);
679 if (first_connection) {
680 event_listener.set_client_id(CLIENT_ID_INVALID);
681 event_listener.stop_event_listener();
687 set_power_save_state_cb();
691 API bool sensord_disconnect(int handle)
693 command_channel *cmd_channel;
694 sensor_id_t sensor_id;
700 if (!event_listener.get_sensor_state(handle, sensor_state)||
701 !event_listener.get_sensor_id(handle, sensor_id)) {
702 ERR("client %s failed to get handle information", get_client_name());
706 if (!event_listener.get_command_channel(sensor_id, &cmd_channel)) {
707 ERR("client %s failed to get command channel for %s", get_client_name(), get_sensor_name(sensor_id));
711 client_id = event_listener.get_client_id();
712 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());
714 INFO("%s disconnects with %s[%d]", get_client_name(), get_sensor_name(sensor_id), handle);
716 if (sensor_state != SENSOR_STATE_STOPPED) {
717 WARN("%s[%d] for %s is not stopped before disconnecting.",
718 get_sensor_name(sensor_id), handle, get_client_name());
719 sensord_stop(handle);
722 if (!event_listener.delete_handle(handle))
725 if (!event_listener.is_active())
726 event_listener.set_client_id(CLIENT_ID_INVALID);
728 if (!event_listener.is_sensor_registered(sensor_id)) {
729 if(!cmd_channel->cmd_byebye()) {
730 ERR("Sending cmd_byebye(%d, %s) failed for %s", client_id, get_sensor_name(sensor_id), get_client_name());
733 event_listener.close_command_channel(sensor_id);
736 if (!event_listener.is_active()) {
737 INFO("Stop listening events for client %s with client id [%d]", get_client_name(), event_listener.get_client_id());
738 event_listener.stop_event_listener();
741 unset_power_save_state_cb();
747 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)
749 sensor_id_t sensor_id;
750 sensor_rep prev_rep, cur_rep;
753 retvm_if (!cb, false, "callback is NULL");
757 if (!event_listener.get_sensor_id(handle, sensor_id)) {
758 ERR("client %s failed to get handle information", get_client_name());
765 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),
766 event_type, get_sensor_name(sensor_id), handle, interval, cb, user_data);
768 event_listener.get_sensor_rep(sensor_id, prev_rep);
769 event_listener.register_event(handle, event_type, interval, cb_type, cb, user_data);
770 event_listener.get_sensor_rep(sensor_id, cur_rep);
771 ret = change_sensor_rep(sensor_id, prev_rep, cur_rep);
774 event_listener.unregister_event(handle, event_type);
779 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)
781 return register_event(handle, event_type, interval, max_batch_latency, SENSOR_EVENT_CB, (void *)cb, user_data);
784 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)
786 return register_event(handle, event_type, interval, max_batch_latency, SENSORHUB_EVENT_CB, (void *)cb, user_data);
790 API bool sensord_unregister_event(int handle, unsigned int event_type)
792 sensor_id_t sensor_id;
793 sensor_rep prev_rep, cur_rep;
795 unsigned int prev_interval;
798 void *prev_user_data;
802 if (!event_listener.get_sensor_id(handle, sensor_id)) {
803 ERR("client %s failed to get handle information", get_client_name());
807 INFO("%s unregisters event %s[0x%x] for sensor %s[%d]", get_client_name(), get_event_name(event_type),
808 event_type, get_sensor_name(sensor_id), handle);
810 event_listener.get_sensor_rep(sensor_id, prev_rep);
811 event_listener.get_event_info(handle, event_type, prev_interval, prev_cb_type, prev_cb, prev_user_data);
813 if (!event_listener.unregister_event(handle, event_type)) {
814 ERR("%s try to unregister non registered event %s[0x%x] for sensor %s[%d]",
815 get_client_name(),get_event_name(event_type), event_type, get_sensor_name(sensor_id), handle);
819 event_listener.get_sensor_rep(sensor_id, cur_rep);
820 ret = change_sensor_rep(sensor_id, prev_rep, cur_rep);
823 event_listener.register_event(handle, event_type, prev_interval, prev_cb_type, prev_cb, prev_user_data);
830 API bool sensord_register_accuracy_cb(int handle, sensor_accuracy_changed_cb_t cb, void *user_data)
832 sensor_id_t sensor_id;
834 retvm_if (!cb, false, "callback is NULL");
838 if (!event_listener.get_sensor_id(handle, sensor_id)) {
839 ERR("client %s failed to get handle information", get_client_name());
844 INFO("%s registers accuracy_changed_cb for sensor %s[%d] with cb: 0x%x, user_data: 0x%x",
845 get_client_name(), get_sensor_name(sensor_id), handle, cb, user_data);
847 event_listener.register_accuracy_cb(handle, cb , user_data);
853 API bool sensord_unregister_accuracy_cb(int handle)
855 sensor_id_t sensor_id;
859 if (!event_listener.get_sensor_id(handle, sensor_id)) {
860 ERR("client %s failed to get handle information", get_client_name());
865 INFO("%s unregisters accuracy_changed_cb for sensor %s[%d]",
866 get_client_name(), get_sensor_name(sensor_id), handle);
868 event_listener.unregister_accuracy_cb(handle);
874 API bool sensord_start(int handle, int option)
876 sensor_id_t sensor_id;
877 sensor_rep prev_rep, cur_rep;
879 int prev_state, prev_option;
883 if (!event_listener.get_sensor_id(handle, sensor_id)) {
884 ERR("client %s failed to get handle information", get_client_name());
888 retvm_if ((option < 0) || (option >= SENSOR_OPTION_END), false, "Invalid option value : %d, handle: %d, %s, %s",
889 option, handle, get_sensor_name(sensor_id), get_client_name());
891 INFO("%s starts %s[%d], with option: %d, power save state: %d", get_client_name(), get_sensor_name(sensor_id),
892 handle, option, g_power_save_state);
894 if (g_power_save_state && !(g_power_save_state & option)) {
895 event_listener.set_sensor_params(handle, SENSOR_STATE_PAUSED, option);
899 event_listener.get_sensor_rep(sensor_id, prev_rep);
900 event_listener.get_sensor_params(handle, prev_state, prev_option);
901 event_listener.set_sensor_params(handle, SENSOR_STATE_STARTED, option);
902 event_listener.get_sensor_rep(sensor_id, cur_rep);
904 ret = change_sensor_rep(sensor_id, prev_rep, cur_rep);
907 event_listener.set_sensor_params(handle, prev_state, prev_option);
912 API bool sensord_stop(int handle)
914 sensor_id_t sensor_id;
917 int prev_state, prev_option;
919 sensor_rep prev_rep, cur_rep;
923 if (!event_listener.get_sensor_state(handle, sensor_state)||
924 !event_listener.get_sensor_id(handle, sensor_id)) {
925 ERR("client %s failed to get handle information", get_client_name());
929 retvm_if ((sensor_state == SENSOR_STATE_STOPPED), true, "%s already stopped with %s[%d]",
930 get_client_name(), get_sensor_name(sensor_id), handle);
933 INFO("%s stops sensor %s[%d]", get_client_name(), get_sensor_name(sensor_id), handle);
935 event_listener.get_sensor_rep(sensor_id, prev_rep);
936 event_listener.get_sensor_params(handle, prev_state, prev_option);
937 event_listener.set_sensor_state(handle, SENSOR_STATE_STOPPED);
938 event_listener.get_sensor_rep(sensor_id, cur_rep);
940 ret = change_sensor_rep(sensor_id, prev_rep, cur_rep);
943 event_listener.set_sensor_params(handle, prev_state, prev_option);
949 API bool sensord_change_event_interval(int handle, unsigned int event_type, unsigned int interval)
951 sensor_id_t sensor_id;
952 sensor_rep prev_rep, cur_rep;
954 unsigned int prev_interval;
957 void *prev_user_data;
961 if (!event_listener.get_sensor_id(handle, sensor_id)) {
962 ERR("client %s failed to get handle information", get_client_name());
966 INFO("%s changes interval of event %s[0x%x] for %s[%d] to interval %d", get_client_name(), get_event_name(event_type),
967 event_type, get_sensor_name(sensor_id), handle, interval);
969 event_listener.get_sensor_rep(sensor_id, prev_rep);
971 event_listener.get_event_info(handle, event_type, prev_interval, prev_cb_type, prev_cb, prev_user_data);
973 if (!event_listener.set_event_interval(handle, event_type, interval))
976 event_listener.get_sensor_rep(sensor_id, cur_rep);
978 ret = change_sensor_rep(sensor_id, prev_rep, cur_rep);
981 event_listener.set_event_interval(handle, event_type, prev_interval);
987 API bool sensord_change_event_max_batch_latency(int handle, unsigned int max_batch_latency)
993 API bool sensord_set_option(int handle, int option)
995 sensor_id_t sensor_id;
996 sensor_rep prev_rep, cur_rep;
999 int prev_state, prev_option;
1003 if (!event_listener.get_sensor_state(handle, sensor_state)||
1004 !event_listener.get_sensor_id(handle, sensor_id)) {
1005 ERR("client %s failed to get handle information", get_client_name());
1009 retvm_if ((option < 0) || (option >= SENSOR_OPTION_END), false, "Invalid option value : %d, handle: %d, %s, %s",
1010 option, handle, get_sensor_name(sensor_id), get_client_name());
1013 event_listener.get_sensor_rep(sensor_id, prev_rep);
1014 event_listener.get_sensor_params(handle, prev_state, prev_option);
1016 if (g_power_save_state) {
1017 if ((option & g_power_save_state) && (sensor_state == SENSOR_STATE_PAUSED))
1018 event_listener.set_sensor_state(handle, SENSOR_STATE_STARTED);
1019 else if (!(option & g_power_save_state) && (sensor_state == SENSOR_STATE_STARTED))
1020 event_listener.set_sensor_state(handle, SENSOR_STATE_PAUSED);
1022 event_listener.set_sensor_option(handle, option);
1024 event_listener.get_sensor_rep(sensor_id, cur_rep);
1025 ret = change_sensor_rep(sensor_id, prev_rep, cur_rep);
1028 event_listener.set_sensor_option(handle, prev_option);
1034 API bool sensord_send_sensorhub_data(int handle, const char *data, int data_len)
1036 sensor_id_t sensor_id;
1037 command_channel *cmd_channel;
1042 if (!event_listener.get_sensor_id(handle, sensor_id)) {
1043 ERR("client %s failed to get handle information", get_client_name());
1047 retvm_if (sensor_id != CONTEXT_SENSOR, false, "%s use this API wrongly, only for CONTEXT_SENSOR not for %s",
1048 get_client_name(), get_sensor_name(sensor_id));
1050 if (!event_listener.get_command_channel(sensor_id, &cmd_channel)) {
1051 ERR("client %s failed to get command channel for %s", get_client_name(), get_sensor_name(sensor_id));
1055 retvm_if((data_len < 0) || (data == NULL), false, "Invalid data_len: %d, data: 0x%x, handle: %d, %s, %s",
1056 data_len, data, handle, get_sensor_name(sensor_id), get_client_name());
1058 client_id = event_listener.get_client_id();
1059 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());
1061 retvm_if (!event_listener.is_sensor_active(sensor_id), false, "%s with client_id:%d is not active state for %s with handle: %d",
1062 get_sensor_name(sensor_id), client_id, get_client_name(), handle);
1064 if (!cmd_channel->cmd_send_sensorhub_data(data, data_len)) {
1065 ERR("Sending cmd_send_sensorhub_data(%d, %d, 0x%x) failed for %s",
1066 client_id, data_len, data, get_client_name);
1074 API bool sensord_get_data(int handle, unsigned int data_id, sensor_data_t* sensor_data)
1076 sensor_id_t sensor_id;
1077 command_channel *cmd_channel;
1081 retvm_if ((!sensor_data), false, "sensor_data is NULL");
1085 if (!event_listener.get_sensor_state(handle, sensor_state)||
1086 !event_listener.get_sensor_id(handle, sensor_id)) {
1087 ERR("client %s failed to get handle information", get_client_name());
1091 if (!event_listener.get_command_channel(sensor_id, &cmd_channel)) {
1092 ERR("client %s failed to get command channel for %s", get_client_name(), get_sensor_name(sensor_id));
1096 client_id = event_listener.get_client_id();
1097 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());
1099 if (sensor_state != SENSOR_STATE_STARTED) {
1100 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);
1104 if(!cmd_channel->cmd_get_data(data_id, sensor_data)) {
1105 ERR("cmd_get_data(%d, %d, 0x%x) failed for %s", client_id, data_id, sensor_data, get_client_name());