2 * Copyright (c) 2019 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.
18 #include "bm_listeners.h"
20 #include <bm_common.h>
21 #include <bd_history_item.h>
25 #include <TapiUtility.h>
26 #include <ITapiNetwork.h>
28 #include <device/battery-internal.h>
30 wifi_manager_h wifi = NULL;
31 static bool display_on;
32 static int brightness_val = 0;
33 static int brightness_flag = 0;
34 static int ss_val = 0;
35 static int ss_flag = -1;
36 static history_item_s *data_obj = NULL;
37 struct timeval prev_event_time;
39 display_state_e display_flag = DISPLAY_STATE_SCREEN_OFF;
40 static int listener_hsp = -1;
41 static int bt_adaptor = 0;
42 static int location_flag = 0;
43 static int bt_hsp = 0;
44 static int bt_connected_hsp = 0;
45 static int bt_scan_hsp = 0;
46 static int bt_discovery_state = 1;
47 static int bt_flag = 0;
48 static int wifi_flag = 0;
49 static int wifi_hsp = 0;
50 static int wifi_scan_hsp = 0;
51 static int wifi_connected_hsp = 0;
52 static int display_hsp = 0;
53 static int gps_hsp = 0;
54 static int lock_hsp = 0;
55 static int app_hsp = 0;
56 static int wakeup_hsp = 0;
57 static int modem_hsp = 0;
58 static int modem_flag = 0;
59 static int prev_wakeup = 0;
60 static int prev_lock = 0;
61 static int prev_battery_level = 0;
62 static event_pool events_buf[10];
63 static int buff_count = 0;
64 static pthread_attr_t attr;
65 static pthread_cond_t fill = PTHREAD_COND_INITIALIZER;
66 static pthread_cond_t empty = PTHREAD_COND_INITIALIZER;
67 static pthread_mutex_t battery_lister_mutex = PTHREAD_MUTEX_INITIALIZER;
68 static int fill_ptr = 0;
69 static int use_ptr = 0;
70 static TapiHandle *handle = NULL;
71 GHashTable *app_list = NULL;
73 #define DBUS_DEVICED "org.tizen.system.deviced"
74 #define DBUS_DEVICED_PATH "/Org/Tizen/System/DeviceD/Display"
75 #define DBUS_DEVICED_IFACE "org.tizen.system.deviced.display"
76 #define DBUS_DEVICED_PL_MEMBER "PowerLock"
77 #define DBUS_DEVICED_PU_MEMBER "PowerUnlock"
78 #define DBUS_DEVICED_SLEEP_MEMBER "sleep"
79 #define DBUS_DEVICED_WAKEUP_MEMBER "wakeup"
81 static GDBusConnection *dbus_connection;
83 static int bm_listener_dbus_init(void)
87 GDBusConnection *conn;
90 if (dbus_connection) {
91 _DBG("dbus connection already initialized");
95 conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &err);
97 _ERR("failed to get dbus connection:%s", err->message);
103 dbus_connection = conn;
109 int bm_listener_dbus_deinit()
114 g_object_unref(dbus_connection);
115 dbus_connection = NULL;
118 return BATTERY_MONITOR_ERROR_NONE;
121 static int fill_AppId_info(char *app_id)
125 data_obj->event_tag->uid = 1000;
126 data_obj->event_tag->string_info = g_string_sized_new(7);
127 if (!data_obj->event_tag->string_info) {
128 _ERR("memory allocation failed ");
132 g_string_append_printf(data_obj->event_tag->string_info, "%s", app_id);
137 static int fill_battery_info()
140 struct battery_info info;
141 int ret = device_battery_get_info(&info);
142 if (ret == DEVICE_ERROR_NONE) {
143 data_obj->battery_level = info.capacity;
144 if (data_obj->battery_level < 0)
145 _ERR("Failed to get ts->battery_level = %d ", data_obj->battery_level);
147 size_t len = strlen(info.status);
148 if (!strncmp(info.status, "Charging", len))
149 data_obj->battery_status = BD_BSTA_CHAR;
150 else if (!strncmp(info.status, "Discharging", len))
151 data_obj->battery_status = BD_BSTA_DISC;
152 else if (!strncmp(info.status, "Full", len))
153 data_obj->battery_status = BD_BSTA_FULL;
154 else if (!strncmp(info.status, "Not charging", len))
155 data_obj->battery_status = BD_BSTA_NCHA;
157 _ERR("Failed to get info.status = %s ", info.status);
158 data_obj->battery_status = BD_BSTA_UNKN;
161 len = strlen(info.health);
162 if (!strncmp(info.health, "Good", len))
163 data_obj->battery_health = BD_BHLT_GOOD;
164 else if (!strncmp(info.health, "Cold", len))
165 data_obj->battery_health = BD_BHLT_CLD;
166 else if (!strncmp(info.health, "Dead", len))
167 data_obj->battery_health = BD_BHLT_DEAD;
168 else if (!strncmp(info.health, "Overheat", len))
169 data_obj->battery_health = BD_BHLT_OVRH;
170 else if (!strncmp(info.health, "Over voltage", len))
171 data_obj->battery_health = BD_BHLT_OVRV;
173 data_obj->battery_health = BD_BHLT_UNKN;
175 len = strlen(info.power_source);
176 if (!strncmp(info.power_source, "ac", len))
177 data_obj->battery_plugtype = BD_BPLT_AC;
178 else if (!strncmp(info.power_source, "usb", len))
179 data_obj->battery_plugtype = BD_BPLT_USB;
180 else if (!strncmp(info.power_source, "wireless", len))
181 data_obj->battery_plugtype = BD_BPLT_WL;
183 data_obj->battery_plugtype = BD_BPLT_NONE;
185 _INFO("battery_level = %d, battery_status = %d, battery_health = %d, battery_plugtype = %d",
186 data_obj->battery_level, data_obj->battery_status, data_obj->battery_health, data_obj->battery_plugtype);
188 data_obj->battery_temperature = info.temperature;
189 data_obj->battery_voltage = info.voltage_now;
191 _INFO("battery_voltage = %d, battery_temperature = %d", data_obj->battery_voltage, data_obj->battery_temperature);
193 _ERR("Failed to get battery info (%d)", ret);
200 static void fill_bt_adapter_state_changed_data(int adapter_state)
204 _WARN("state: %s", (adapter_state == BT_ADAPTER_ENABLED) ? "ENABLED" : "DISABLED");
206 if (adapter_state == BT_ADAPTER_ENABLED)
211 _INFO("__bm_bt_adapter_state_changed_cb bt_state = %d ", bt_state);
214 if (adapter_state == BT_ADAPTER_ENABLED) {
215 data_obj->event_code = ET_NONE;
216 data_obj->event_code |= ET_ACTIVE;
217 data_obj->event_code |= ET_FLAG_START;
218 data_obj->event_tag = NULL;
219 data_obj->event_tag = (history_tag_s *)calloc(1, sizeof(history_tag_s));
220 if (data_obj->event_tag) {
222 bt_hsp = listener_hsp;
223 _INFO("event Tag creation succeeded \n");
224 data_obj->event_tag->sp_idx = bt_hsp;
226 _ERR(" data_obj->event_tag object creation fails ");
229 data_obj->state_2 |= ST2_BLUETOOTH_ON_FLAG;
231 data_obj->event_code = ET_NONE;
232 data_obj->event_code |= ET_ACTIVE;
233 data_obj->event_code |= ET_FLAG_FINISH;
234 data_obj->event_tag = NULL;
235 data_obj->event_tag = (history_tag_s *)calloc(1, sizeof(history_tag_s));
236 if (data_obj->event_tag) {
237 _INFO("event Tag creation succeeded \n");
238 data_obj->event_tag->sp_idx = bt_hsp;
240 _ERR(" data_obj->event_tag object creation fails ");
243 data_obj->state_2 &= ~(ST2_BLUETOOTH_ON_FLAG);
251 static void fill_bt_device_discovery_state_changed_data(int discovery_state)
255 _WARN(" discovery_state = %d", discovery_state);
258 switch (discovery_state) {
259 case BT_ADAPTER_DEVICE_DISCOVERY_STARTED:
260 data_obj->event_code = ET_NONE;
261 data_obj->event_code = ET_CONNECTIVITY_CHANGED;
262 data_obj->event_code |= ET_FLAG_START;
263 data_obj->event_tag = NULL;
264 data_obj->event_tag = (history_tag_s *)calloc(1, sizeof(history_tag_s));
265 if (data_obj->event_tag) {
268 bt_scan_hsp = listener_hsp;
271 _INFO("event Tag creation succeeded \n");
272 data_obj->event_tag->sp_idx = bt_scan_hsp;
274 _ERR(" data_obj->event_tag object creation fails ");
277 data_obj->state_2 |= ST2_BLUETOOTH_SCAN_FLAG;
279 case BT_ADAPTER_DEVICE_DISCOVERY_FINISHED:
280 data_obj->event_code = ET_NONE;
281 data_obj->event_code = ET_CONNECTIVITY_CHANGED;
282 data_obj->event_code |= ET_FLAG_FINISH;
283 data_obj->event_tag = NULL;
284 data_obj->event_tag = (history_tag_s *)calloc(1, sizeof(history_tag_s));
285 if (data_obj->event_tag) {
286 _INFO("event Tag creation succeeded \n");
287 data_obj->event_tag->sp_idx = bt_scan_hsp;
289 _ERR(" data_obj->event_tag object creation fails ");
292 data_obj->state_2 &= ~(ST2_BLUETOOTH_SCAN_FLAG);
304 static void fill_bt_device_connection_state_changed_data(int connected)
308 _WARN("__bt_device_connection_state_changed_cb [%d]", connected);
310 _INFO("bt is disconnected");
314 data_obj->event_code = ET_NONE;
315 data_obj->event_code |= ET_CONNECTIVITY_CHANGED ;
316 data_obj->event_code |= ET_FLAG_START;
317 data_obj->event_tag = NULL;
318 data_obj->event_tag = (history_tag_s *)calloc(1, sizeof(history_tag_s));
319 if (data_obj->event_tag) {
321 bt_connected_hsp = listener_hsp;
322 _INFO("event Tag creation succeeded \n");
323 data_obj->event_tag->sp_idx = bt_connected_hsp;
325 _ERR(" data_obj->event_tag object creation fails ");
329 data_obj->event_code = ET_NONE;
330 data_obj->event_code |= ET_CONNECTIVITY_CHANGED;
331 data_obj->event_code |= ET_FLAG_FINISH;
332 data_obj->event_tag = NULL;
333 data_obj->event_tag = (history_tag_s *)calloc(1, sizeof(history_tag_s));
334 if (data_obj->event_tag) {
335 _INFO("event Tag creation succeeded \n");
336 data_obj->event_tag->sp_idx = bt_connected_hsp;
338 _ERR(" data_obj->event_tag object creation fails ");
348 static void fill_wifi_device_state_data(int state)
352 _WARN(" Wifi Device state changed callback");
354 if (state == WIFI_MANAGER_DEVICE_STATE_ACTIVATED)
355 _INFO(", state : Activated\n");
357 _INFO(", state : Deactivated\n");
360 if (state == WIFI_MANAGER_DEVICE_STATE_ACTIVATED) {
361 data_obj->event_code = ET_NONE;
362 data_obj->event_code |= ET_ACTIVE;
363 data_obj->event_code |= ET_FLAG_START;
364 data_obj->event_tag = NULL;
365 data_obj->event_tag = (history_tag_s *)calloc(1, sizeof(history_tag_s));
366 if (data_obj->event_tag) {
368 wifi_hsp = listener_hsp;
369 _INFO("event Tag creation succeeded \n");
370 data_obj->event_tag->sp_idx = wifi_hsp;
372 _ERR(" data_obj->event_tag object creation fails ");
375 data_obj->state_2 |= ST2_WIFI_ON_FLAG;
377 data_obj->event_code = ET_NONE;
378 data_obj->event_code |= ET_ACTIVE;
379 data_obj->event_code |= ET_FLAG_FINISH;
380 data_obj->event_tag = NULL;
381 data_obj->event_tag = (history_tag_s *)calloc(1, sizeof(history_tag_s));
382 if (data_obj->event_tag) {
383 _INFO("event Tag creation succeeded \n");
384 data_obj->event_tag->sp_idx = wifi_hsp;
386 _ERR(" data_obj->event_tag object creation fails ");
389 data_obj->state_2 &= ~(ST2_WIFI_ON_FLAG);
397 static void fill_wifi_scan_changed_data(int state)
401 _WARN("Wifi Scan changed, scan state : %d\n", state);
403 if (state == WIFI_MANAGER_SCAN_STATE_SCANNING) {
404 data_obj->event_code = ET_NONE;
405 data_obj->event_code |= ET_FLAG_START;
406 data_obj->event_code |= ET_CONNECTIVITY_CHANGED;
407 data_obj->event_tag = NULL;
408 data_obj->event_tag = (history_tag_s *)calloc(1, sizeof(history_tag_s));
409 if (data_obj->event_tag) {
412 wifi_scan_hsp = listener_hsp;
415 _INFO("event Tag creation succeeded \n");
416 data_obj->event_tag->sp_idx = wifi_scan_hsp;
418 _ERR(" data_obj->event_tag object creation fails ");
421 data_obj->state_1 |= ST1_WIFI_SCAN_FLAG;
423 data_obj->event_code = ET_NONE;
424 data_obj->event_code |= ET_FLAG_FINISH;
425 data_obj->event_code |= ET_CONNECTIVITY_CHANGED;
426 data_obj->event_tag = NULL;
427 data_obj->event_tag = (history_tag_s *)calloc(1, sizeof(history_tag_s));
428 if (data_obj->event_tag) {
429 _INFO("event Tag creation succeeded \n");
430 data_obj->event_tag->sp_idx = wifi_scan_hsp;
432 _ERR(" data_obj->event_tag object creation fails ");
435 data_obj->state_1 &= ~(ST1_WIFI_SCAN_FLAG);
444 static void fill_wifi_connection_state_changed_data(int state)
448 _WARN("Wifi Connection changed, connection state : %d\n", state);
452 case WIFI_MANAGER_CONNECTION_STATE_CONNECTED:
453 data_obj->event_code = ET_NONE;
454 data_obj->event_code |= ET_CONNECTIVITY_CHANGED;
455 data_obj->event_code |= ET_FLAG_START;
456 data_obj->event_tag = NULL;
457 data_obj->event_tag = (history_tag_s *)calloc(1, sizeof(history_tag_s));
458 if (data_obj->event_tag) {
459 _INFO("event Tag creation succeeded \n");
461 wifi_connected_hsp = listener_hsp;
462 data_obj->event_tag->sp_idx = wifi_connected_hsp;
464 _ERR(" data_obj->event_tag object creation fails ");
468 case WIFI_MANAGER_CONNECTION_STATE_DISCONNECTED:
469 data_obj->event_code = ET_NONE;
470 data_obj->event_code |= ET_CONNECTIVITY_CHANGED;
471 data_obj->event_code |= ET_FLAG_FINISH;
472 data_obj->event_tag = NULL;
473 data_obj->event_tag = (history_tag_s *)calloc(1, sizeof(history_tag_s));
474 if (data_obj->event_tag) {
475 _INFO("event Tag creation succeeded \n");
476 data_obj->event_tag->sp_idx = wifi_connected_hsp;
478 _ERR(" data_obj->event_tag object creation fails ");
491 static void fill_device_display_change(int value)
494 _WARN("device state changed succeeded\n");
497 case DISPLAY_STATE_NORMAL:
500 data_obj->event_code = ET_NONE;
501 data_obj->event_code |= ET_SCREEN_WAKE_UP;
502 data_obj->event_code |= ET_FLAG_START;
503 data_obj->event_tag = NULL;
504 data_obj->event_tag = (history_tag_s *)calloc(1, sizeof(history_tag_s));
505 if (data_obj->event_tag) {
507 display_hsp = listener_hsp;
508 _INFO("event Tag creation succeeded \n");
509 data_obj->event_tag->sp_idx = display_hsp;
511 _ERR(" data_obj->event_tag object creation fails ");
514 data_obj->state_1 |= ST1_SCREEN_ON_FLAG;
515 data_obj->state_1 &= ~(ST1_SCREEN_DOZE_FLAG);
517 case DISPLAY_STATE_SCREEN_DIM:
518 _INFO("Display dim");
519 data_obj->event_code = ET_NONE;
520 data_obj->event_tag = NULL;
521 data_obj->state_1 |= ST1_SCREEN_DOZE_FLAG;
523 case DISPLAY_STATE_SCREEN_OFF:
524 _INFO("Display off");
525 data_obj->event_code = ET_NONE;
526 data_obj->event_code |= ET_SCREEN_WAKE_UP;
527 data_obj->event_code |= ET_FLAG_FINISH;
528 data_obj->event_tag = NULL;
529 data_obj->event_tag = (history_tag_s *)calloc(1, sizeof(history_tag_s));
530 if (data_obj->event_tag) {
531 _INFO("event Tag creation succeeded \n");
532 data_obj->event_tag->sp_idx = display_hsp;
534 _ERR(" data_obj->event_tag object creation fails ");
537 data_obj->state_1 &= ~(ST1_SCREEN_ON_FLAG);
538 data_obj->state_1 &= ~(ST1_SCREEN_DOZE_FLAG);
547 static void fill_display_brightness_change(int brightness_level)
551 _WARN(" device brightness changed =%d ", brightness_level);
553 data_obj->state_1 &= ~brightness_val;
554 brightness_val = brightness_level;
555 data_obj->state_1 |= brightness_val;
556 data_obj->event_code = ET_NONE;
557 data_obj->event_tag = NULL;
564 static void fill_battery_capacity_change(int charging_level)
568 _WARN(" device battery_capacity changed =%d ", charging_level);
570 data_obj->event_code = ET_NONE;
571 data_obj->event_tag = NULL;
578 static void fill_charging_status_change(int charging)
582 _INFO(" device charging_status changed =%d ", charging);
585 data_obj->event_code = ET_NONE;
586 data_obj->event_tag = NULL;
587 data_obj->state_2 |= ST2_CHARGING_FLAG;
589 data_obj->event_code = ET_NONE;
590 data_obj->event_tag = NULL;
591 data_obj->state_2 &= ~(ST2_CHARGING_FLAG);
599 static void fill_signal_strength_change(int ss)
603 _WARN(" device signal_strength changed =%d ", ss);
605 data_obj->state_1 &= ~ss_val << ST1_PHONE_SIGNAL_STRENGTH_SHIFT;
607 data_obj->state_1 |= ss_val << ST1_PHONE_SIGNAL_STRENGTH_SHIFT;
608 data_obj->event_code = ET_NONE;
609 data_obj->event_tag = NULL;
616 static void fill_sleep_wakeup_change(int val)
620 _WARN(" sleep/wake up changed =%d ", val);
622 data_obj->event_code = ET_NONE;
623 data_obj->event_tag = NULL;
624 data_obj->wakereason_tag = NULL;
625 data_obj->wakereason_tag = (history_tag_s *)calloc(1, sizeof(history_tag_s));
626 if (data_obj->wakereason_tag) {
628 wakeup_hsp = listener_hsp;
629 _INFO("Wakereason Tag creation succeeded \n");
630 data_obj->wakereason_tag->sp_idx = wakeup_hsp;
631 data_obj->wakereason_tag->uid = 1000;
632 data_obj->wakereason_tag->string_info = g_string_sized_new(10);
633 if (data_obj->wakereason_tag->string_info == NULL) {
634 _ERR("data_obj->wakereason_tag->string_info creation failed");
635 BM_FREE(data_obj->wakereason_tag);
638 g_string_append_printf(data_obj->wakereason_tag->string_info, "%s", "Tizen");
640 _ERR(" data_obj->wakereason_tag object creation fails ");
643 data_obj->state_1 |= ST1_CPU_RUNNING_FLAG;
645 data_obj->event_code = ET_NONE;
646 data_obj->event_tag = NULL;
647 data_obj->wakereason_tag = NULL;
648 data_obj->wakereason_tag = (history_tag_s *)calloc(1, sizeof(history_tag_s));
649 if (data_obj->wakereason_tag) {
650 _INFO("Wakereason Tag creation succeeded \n");
651 data_obj->wakereason_tag->sp_idx = wakeup_hsp;
652 data_obj->wakereason_tag->uid = 1000;
653 data_obj->wakereason_tag->string_info = g_string_sized_new(10);
654 if (data_obj->wakereason_tag->string_info == NULL) {
655 _ERR("data_obj->wakereason_tag->string_info creation failed");
656 BM_FREE(data_obj->wakereason_tag);
659 g_string_append_printf(data_obj->wakereason_tag->string_info, "%s", "Tizen");
661 _ERR(" data_obj->wakereason_tag object creation fails ");
664 data_obj->state_1 &= ~(ST1_CPU_RUNNING_FLAG);
671 static void fill_location_change(int gps)
675 _WARN(" maps location changed =%d ", gps);
678 data_obj->event_code = ET_NONE;
679 data_obj->event_code |= ET_ACTIVE;
680 data_obj->event_code |= ET_FLAG_START;
681 data_obj->event_tag = NULL;
682 data_obj->event_tag = (history_tag_s *)calloc(1, sizeof(history_tag_s));
683 if (data_obj->event_tag) {
685 gps_hsp = listener_hsp;
686 _INFO("event Tag creation succeeded \n");
687 data_obj->event_tag->sp_idx = gps_hsp;
689 _ERR(" data_obj->event_tag object creation fails ");
692 data_obj->state_1 |= ST1_GPS_ON_FLAG;
694 data_obj->event_code = ET_NONE;
695 data_obj->event_code |= ET_ACTIVE;
696 data_obj->event_code |= ET_FLAG_FINISH;
697 data_obj->event_tag = NULL;
698 data_obj->event_tag = (history_tag_s *)calloc(1, sizeof(history_tag_s));
699 if (data_obj->event_tag) {
700 _INFO("event Tag creation succeeded \n");
701 data_obj->event_tag->sp_idx = gps_hsp;
703 _ERR(" data_obj->event_tag object creation fails ");
706 data_obj->state_1 &= ~(ST1_GPS_ON_FLAG);
714 static int fill_power_lock_unlock_change(int lock)
718 _WARN(" fill_powerlock_change changed =%d ", lock);
719 if (prev_wakeup == lock)
726 data_obj->event_code = ET_NONE;
727 data_obj->wakelock_tag = NULL;
728 data_obj->event_tag = NULL;
729 data_obj->wakelock_tag = (history_tag_s *)calloc(1, sizeof(history_tag_s));
730 if (data_obj->wakelock_tag) {
732 lock_hsp = listener_hsp;
733 _INFO("wakelock Tag creation succeeded \n");
734 data_obj->wakelock_tag->sp_idx = lock_hsp;
735 data_obj->wakelock_tag->uid = 1000;
736 data_obj->wakelock_tag->string_info = g_string_sized_new(10);
737 BM_CHECK_MEM_ALLOC(data_obj->wakelock_tag->string_info, {BM_FREE(data_obj->wakelock_tag); });
738 g_string_append_printf(data_obj->wakelock_tag->string_info, "%s", "Tizen");
741 _ERR(" data_obj->wakelock_tag object creation fails ");
744 data_obj->state_1 |= ST1_WAKE_LOCK_FLAG;
746 data_obj->event_code = ET_NONE;
747 data_obj->wakelock_tag = NULL;
748 data_obj->event_tag = NULL;
749 //WAKE LOCK TAG INFORMATION NOT REQ. AT UNSET.
750 data_obj->state_1 &= ~(ST1_WAKE_LOCK_FLAG);
758 static int fill_app_status_change(int val, char *app_id)
765 void *prv_data = NULL;
766 void *prv_app_id = NULL;
769 _WARN(" App status changed for = %s ", app_id);
772 data_obj->event_code = ET_NONE;
773 data_obj->event_code |= ET_FOREGROUND;
774 data_obj->event_code |= ET_FLAG_START;
775 data_obj->event_tag = NULL;
776 data_obj->event_tag = (history_tag_s *)calloc(1, sizeof(history_tag_s));
777 if (data_obj->event_tag) {
779 app_hsp = listener_hsp;
780 _INFO("event Tag creation succeeded \n");
781 data_obj->event_tag->sp_idx = app_hsp;
782 if (g_hash_table_lookup_extended(app_list, app_id, &prv_app_id, &prv_data) == true) {
783 int *temp = (int *)prv_data;
785 _INFO(" sp index for this app id is = %d and apphsp= %d", *temp, app_hsp);
786 if (fill_AppId_info(app_id)) {
793 int *temp = (int *)calloc(1, sizeof(int));
795 _ERR("memory allocation failed");
796 BM_FREE(data_obj->event_tag);
801 _INFO("This App is not present in the list, inserting it");
802 g_hash_table_insert(app_list, app_id, temp);
803 if (fill_AppId_info(app_id)) {
811 _ERR(" data_obj->event_tag object creation fails ");
816 data_obj->event_code = ET_NONE;
817 data_obj->event_code |= ET_FOREGROUND;
818 data_obj->event_code |= ET_FLAG_FINISH;
819 data_obj->event_tag = NULL;
820 data_obj->event_tag = (history_tag_s *)calloc(1, sizeof(history_tag_s));
821 if (data_obj->event_tag) {
822 _INFO("looking for key = %s \n", app_id);
823 if (g_hash_table_lookup_extended(app_list, app_id, &prv_app_id, &prv_data) == true) {
824 int *tmp = (int *)prv_data;
827 data_obj->event_tag->sp_idx = app_hsp;
828 if (fill_AppId_info(app_id))
832 _INFO(" This App is not present in the list and in background");
833 BM_FREE(data_obj->event_tag);
838 _ERR(" data_obj->event_tag object creation fails ");
853 static void fill_modem_power_state_change(int state)
857 _WARN("fill_modem_power_state_change - state[%d]", state);
859 if (data_obj && state == 0) { /* ON */
860 data_obj->event_code = ET_NONE;
861 data_obj->event_code |= ET_ACTIVE;
862 data_obj->event_code |= ET_FLAG_START;
863 data_obj->event_tag = NULL;
865 data_obj->event_tag = (history_tag_s *)calloc(1, sizeof(history_tag_s));
866 if (data_obj->event_tag) {
868 modem_hsp = listener_hsp;
869 data_obj->event_tag->sp_idx = modem_hsp;
870 _DBG("ON event tag - success");
872 _ERR("ON event tag - failure");
876 data_obj->state_1 |= ST1_MOBILE_RADIO_ACTIVE_FLAG;
878 } else if (data_obj && state == 1) { /* OFF */
879 data_obj->event_code = ET_NONE;
880 data_obj->event_code |= ET_ACTIVE;
881 data_obj->event_code |= ET_FLAG_FINISH;
882 data_obj->event_tag = NULL;
884 data_obj->event_tag = (history_tag_s *)calloc(1, sizeof(history_tag_s));
885 if (data_obj->event_tag) {
886 data_obj->event_tag->sp_idx = modem_hsp;
887 _DBG("OFF event tag - success");
889 _ERR("OFF event tag - failure");
893 data_obj->state_1 &= ~(ST1_MOBILE_RADIO_ACTIVE_FLAG);
896 _ERR("invalid data-object or state");
903 static void bm_create_event_data(int type, int val, char *app)
910 case LISTEN_BT_STATE:
911 fill_bt_adapter_state_changed_data(val);
913 case LISTEN_BT_CONNECTION_STATE:
914 fill_bt_device_connection_state_changed_data(val);
916 case LISTEN_BT_SCAN_STATE:
917 fill_bt_device_discovery_state_changed_data(val);
919 case LISTEN_WIFI_STATE:
920 fill_wifi_device_state_data(val);
922 case LISTEN_WIFI_CONNECTION_STATE:
923 fill_wifi_connection_state_changed_data(val);
925 case LISTEN_WIFI_SCAN_STATE:
926 fill_wifi_scan_changed_data(val);
928 case LISTEN_DEVICE_DISPLAY_STATE:
929 fill_device_display_change(val);
931 case LISTEN_BRIGHTNESS_CHANGE:
932 fill_display_brightness_change(val);
934 case LISTEN_BATTERY_CAPACITY_CHANGE:
935 fill_battery_capacity_change(val);
937 case LISTEN_LOCATION_CHANGE:
938 fill_location_change(val);
940 case LISTEN_CHARGING_STATUS_CHANGE:
941 fill_charging_status_change(val);
943 case LISTEN_SIGNAL_STRENGTH_CHANGE:
944 fill_signal_strength_change(val);
946 case LISTEN_POWERLOCKUNLOCK_STATE:
947 if (fill_power_lock_unlock_change(val) == BATTERY_MONITOR_ERROR_NONE)
951 case LISTEN_SLEEP_WAKEUP_STATE:
952 fill_sleep_wakeup_change(val);
954 case LISTEN_APP_STATUS:
955 if (fill_app_status_change(val, app) == BATTERY_MONITOR_ERROR_NONE)
959 case LISTEN_MODEM_POWER_STATE:
960 fill_modem_power_state_change(val);
966 data_obj->cmd_s = CM_UPD;
967 data_obj->time_current = 0;
970 gettimeofday(&tv, NULL);
971 data_obj->time_s = ((long long)tv.tv_sec * 1000) + ((long long)tv.tv_usec / 1000);
974 time_taken = (tv.tv_sec - prev_event_time.tv_sec) * 1000000;
975 time_taken = (time_taken + (tv.tv_usec - prev_event_time.tv_usec)) * 0.000001;
977 _DBG("time_taken = %lf ", time_taken);
979 if (time_taken >= BATTERY_INFO_DELAY) {
980 if (fill_battery_info() != DEVICE_ERROR_NONE)
981 _ERR("Fill Battery information failed ");
983 prev_event_time = tv;
985 _DBG("Event occur too early, not updating battery information ");
988 if (type == LISTEN_BATTERY_CAPACITY_CHANGE && prev_battery_level == data_obj->battery_level)
991 prev_battery_level = data_obj->battery_level;
993 if (data_obj->event_tag && type != LISTEN_APP_STATUS) {
994 data_obj->event_tag->uid = 1000;
995 data_obj->event_tag->string_info = g_string_sized_new(7);
996 if (!data_obj->event_tag->string_info) {
997 _ERR("memory allocation failed ");
1001 g_string_append_printf(data_obj->event_tag->string_info, "%s", "Tizen");
1003 if (data_obj->event_tag) {
1004 _DBG("Data Value of listener event uid : %d ", data_obj->event_tag->uid);
1005 _DBG("Data Value of listener event string : %s sp index = %d",
1006 data_obj->event_tag->string_info->str, data_obj->event_tag->sp_idx);
1009 if (type == LISTEN_POWERLOCKUNLOCK_STATE)
1010 data_obj->event_tag = NULL;
1012 data_obj->wakelock_tag = NULL;
1014 if (type != LISTEN_SLEEP_WAKEUP_STATE)
1015 data_obj->wakereason_tag = NULL;
1017 if (bd_store_history_item(data_obj) != BATTERY_MONITOR_ERROR_NONE) {
1018 _ERR("Failed to store history items ");
1026 void* event_producer(void *data)
1029 event_pool *event = (event_pool*) data;
1033 pthread_mutex_lock(&battery_lister_mutex);
1034 while (buff_count == MAX_BUFF)
1035 pthread_cond_wait(&empty, &battery_lister_mutex);
1037 events_buf[fill_ptr].type = event->type;
1038 events_buf[fill_ptr].val = event->val;
1039 events_buf[fill_ptr].app = event->app;
1040 _INFO("type: %d and val = %d", events_buf[fill_ptr].type , events_buf[fill_ptr].val);
1041 fill_ptr = (fill_ptr + 1) % MAX_BUFF;
1044 pthread_cond_signal(&fill);
1045 pthread_mutex_unlock(&battery_lister_mutex);
1052 void __bm_bt_adapter_state_changed_cb(int result, bt_adapter_state_e adapter_state, void *user_data)
1055 _INFO("__bt_adapter_state_changed_cb");
1056 _INFO("result: %d", result);
1057 _INFO("state: %s", (adapter_state == BT_ADAPTER_ENABLED) ? "ENABLED" : "DISABLED");
1059 if (adapter_state == BT_ADAPTER_ENABLED)
1064 if (bt_adaptor == bt_state)
1067 bt_adaptor = bt_state;
1068 _INFO("__bm_bt_adapter_state_changed_cb bt_state = %d ", bt_state);
1069 _INFO("buff_count: %d and fill_ptr = %d", buff_count , fill_ptr);
1071 event_pool *bt_event = (event_pool *)calloc(1, sizeof(event_pool));
1073 _ERR("Failed to allocated memory ");
1076 bt_event->type = LISTEN_BT_STATE;
1077 bt_event->val = bt_state;
1078 bt_event->app = NULL;
1081 if (pthread_create(&producer, &attr, event_producer, bt_event)) {
1082 _ERR("Failed to pthread_create.");
1091 void __bm_bt_device_connection_state_changed_cb(bool connected, bt_device_connection_info_s *conn_info, void *user_data)
1095 _INFO("__bt_device_connection_state_changed_cb [%d]", connected);
1096 _INFO("address [%s]", conn_info->remote_address);
1097 _INFO("link type [%d]", conn_info->link);
1099 _INFO("disconnection reason [%d]", conn_info->disconn_reason);
1101 event_pool *bt_event = (event_pool *)calloc(1, sizeof(event_pool));
1103 _ERR("Failed to allocated memory ");
1106 bt_event->type = LISTEN_BT_CONNECTION_STATE;
1107 bt_event->val = connected;
1108 bt_event->app = NULL;
1111 if (pthread_create(&producer, &attr, event_producer, bt_event)) {
1112 _ERR("Failed to pthread_create.");
1121 static void __bm_bt_device_discovery_state_changed_cb(int result, bt_adapter_device_discovery_state_e discovery_state,
1122 bt_adapter_device_discovery_info_s *discovery_info, void *user_data)
1125 _INFO("__bt_adapter_state_changed_cb");
1126 _INFO("result: %d , discovery_state = %d", result, discovery_state);
1127 if (discovery_state > 1) {
1128 _INFO(" This state will be handled later");
1132 if (bt_discovery_state == discovery_state) {
1133 _INFO(" state is same as last state, didnt changed");
1136 bt_discovery_state = discovery_state;
1138 event_pool *bt_event = (event_pool *)calloc(1, sizeof(event_pool));
1140 _ERR("Failed to allocated memory ");
1143 bt_event->type = LISTEN_BT_SCAN_STATE;
1144 bt_event->val = discovery_state;
1145 bt_event->app = NULL;
1148 if (pthread_create(&producer, &attr, event_producer, bt_event)) {
1149 _ERR("Failed to pthread_create.");
1158 static void __bm_wifi_device_state_callback(wifi_manager_device_state_e state, void* user_data)
1162 _INFO("Wifi Device state changed callback");
1164 if (state == WIFI_MANAGER_DEVICE_STATE_ACTIVATED)
1165 _INFO(", state : Activated\n");
1167 _INFO(", state : Deactivated\n");
1169 event_pool *wifi_event = (event_pool *)calloc(1, sizeof(event_pool));
1171 _ERR("Failed to allocated memory ");
1174 wifi_event->type = LISTEN_WIFI_STATE;
1175 wifi_event->val = state;
1176 wifi_event->app = NULL;
1179 if (pthread_create(&producer, &attr, event_producer, wifi_event)) {
1180 _ERR("Failed to pthread_create.");
1181 BM_FREE(wifi_event);
1189 static void __bm_wifi_scan_changed_callback(wifi_manager_scan_state_e state, void* user_data)
1193 _INFO("Wifi Scan changed, scan state : %d\n", state);
1195 event_pool *wifi_event = (event_pool *)calloc(1, sizeof(event_pool));
1197 _ERR("Failed to allocated memory ");
1200 wifi_event->type = LISTEN_WIFI_SCAN_STATE;
1201 wifi_event->val = state;
1202 wifi_event->app = NULL;
1205 if (pthread_create(&producer, &attr, event_producer, wifi_event)) {
1206 _ERR("Failed to pthread_create.");
1207 BM_FREE(wifi_event);
1215 static void __bm_wifi_connection_state_changed_callback(wifi_manager_connection_state_e state, wifi_manager_ap_h ap, void *user_data)
1219 _INFO("Wifi Connection changed, new connection state : %d\n", state);
1220 if (state == -1 || state == 1 || state == 2) {
1221 _WARN("These connection states are not related ");
1225 event_pool *wifi_event = (event_pool *)calloc(1, sizeof(event_pool));
1227 _ERR("Failed to allocated memory ");
1230 wifi_event->type = LISTEN_WIFI_CONNECTION_STATE;
1231 wifi_event->val = state;
1232 wifi_event->app = NULL;
1235 if (pthread_create(&producer, &attr, event_producer, wifi_event)) {
1236 _ERR("Failed to pthread_create.");
1237 BM_FREE(wifi_event);
1245 static void __bm_device_display_change(device_callback_e type, void *value, void *user_data)
1248 _INFO("device state changed succeeded\n");
1250 if (type != DEVICE_CALLBACK_DISPLAY_STATE)
1253 display_state_e state = (display_state_e)value;
1255 if (state == display_flag)
1258 display_flag = state;
1260 event_pool *device_event = (event_pool *)calloc(1, sizeof(event_pool));
1261 if (!device_event) {
1262 _ERR("Failed to allocated memory ");
1265 device_event->type = LISTEN_DEVICE_DISPLAY_STATE;
1266 device_event->val = state;
1267 device_event->app = NULL;
1270 if (pthread_create(&producer, &attr, event_producer, device_event)) {
1271 _ERR("Failed to pthread_create.");
1272 BM_FREE(device_event);
1280 static void __bm_display_brightness_change(keynode_t *key, void* data)
1283 _INFO("device brightness changed succeeded\n");
1284 int brightness_level = 0;
1285 vconf_get_int(VCONFKEY_SETAPPL_LCD_BRIGHTNESS, &brightness_level);
1288 if (brightness_level >= 0 && brightness_level <= 10) {
1290 if (brightness_flag == flag)
1293 brightness_flag = flag;
1294 } else if (brightness_level > 10 && brightness_level <= 25) {
1296 if (brightness_flag == flag)
1299 brightness_flag = flag;
1300 } else if (brightness_level > 25 && brightness_level <= 50) {
1302 if (brightness_flag == flag)
1305 brightness_flag = flag;
1306 } else if (brightness_level > 50 && brightness_level <= 75) {
1308 if (brightness_flag == flag)
1311 brightness_flag = flag;
1312 } else if (brightness_level > 75 && brightness_level <= 100) {
1314 if (brightness_flag == flag)
1317 brightness_flag = flag;
1320 _INFO(" device brightness changed =%d ", brightness_level);
1322 event_pool *display_event = (event_pool *)calloc(1, sizeof(event_pool));
1323 if (!display_event) {
1324 _ERR("Failed to allocated memory ");
1327 display_event->type = LISTEN_BRIGHTNESS_CHANGE;
1328 display_event->val = brightness_flag;
1329 display_event->app = NULL;
1332 if (pthread_create(&producer, &attr, event_producer, display_event)) {
1333 _ERR("Failed to pthread_create.");
1334 BM_FREE(display_event);
1342 static void __bm_battery_capacity_change(keynode_t *key, void* data)
1345 _INFO("device battery_capacity changed succeeded\n");
1347 vconf_get_int(VCONFKEY_SYSMAN_BATTERY_CAPACITY, &charging);
1349 _INFO(" device battery_capacity changed =%d ", charging);
1351 event_pool *charging_event = (event_pool *)calloc(1, sizeof(event_pool));
1352 if (!charging_event) {
1353 _ERR("Failed to allocated memory ");
1356 charging_event->type = LISTEN_BATTERY_CAPACITY_CHANGE;
1357 charging_event->val = charging;
1358 charging_event->app = NULL;
1361 if (pthread_create(&producer, &attr, event_producer, charging_event)) {
1362 _ERR("Failed to pthread_create.");
1363 BM_FREE(charging_event);
1371 static void __bm_charging_status_change(keynode_t *key, void* data)
1374 _INFO("device charging_status changed succeeded\n");
1376 vconf_get_int(VCONFKEY_SYSMAN_CHARGER_STATUS, &charging);
1378 _INFO(" device charging_status changed = %d ", charging);
1380 event_pool *charging_event = (event_pool *)calloc(1, sizeof(event_pool));
1381 if (!charging_event) {
1382 _ERR("Failed to allocated memory ");
1385 charging_event->type = LISTEN_CHARGING_STATUS_CHANGE;
1386 charging_event->val = charging;
1387 charging_event->app = NULL;
1390 if (pthread_create(&producer, &attr, event_producer, charging_event)) {
1391 _ERR("Failed to pthread_create.");
1392 BM_FREE(charging_event);
1400 static void __bm_location_change(keynode_t *key, void* data)
1403 _INFO("device location changed succeeded\n");
1405 vconf_get_int(VCONFKEY_LOCATION_ENABLED, &location);
1407 _INFO(" device location changed = %d ", location);
1409 if (location == location_flag)
1412 location_flag = location;
1414 event_pool *location_event = (event_pool *)calloc(1, sizeof(event_pool));
1415 if (!location_event) {
1416 _ERR("Failed to allocated memory ");
1419 location_event->type = LISTEN_LOCATION_CHANGE;
1420 location_event->val = location;
1421 location_event->app = NULL;
1424 if (pthread_create(&producer, &attr, event_producer, location_event)) {
1425 _ERR("Failed to pthread_create.");
1426 BM_FREE(location_event);
1434 static void _bm_notify_signal_strength(TapiHandle *handle, const char *noti_id, void *data, void *user_data)
1439 _ERR("invalid data");
1443 int sig_strength_level = *((int *)data);
1445 _INFO(" device signal strength changed = %d ", sig_strength_level);
1447 if (ss_flag == sig_strength_level)
1450 ss_flag = sig_strength_level;
1452 event_pool *signal_event = (event_pool *)calloc(1, sizeof(event_pool));
1453 if (!signal_event) {
1454 _ERR("Failed to allocated memory ");
1457 signal_event->type = LISTEN_SIGNAL_STRENGTH_CHANGE;
1458 signal_event->val = ss_flag;
1459 signal_event->app = NULL;
1462 if (pthread_create(&producer, &attr, event_producer, signal_event)) {
1463 _ERR("Failed to pthread_create.");
1464 BM_FREE(signal_event);
1472 static void _bm_notify_modem_power(TapiHandle *handle, const char *noti_id, void *data, void *user_data)
1477 _ERR("invalid data");
1481 _INFO("modem power change notification - data[%d]", *((int *)data));
1483 int *status = (int *)data;
1485 if (*status && !modem_flag) {
1486 _DBG("redundant request");
1492 /* handling only On/Off states */
1507 event_pool *modem_power_event = (event_pool *)calloc(1, sizeof(event_pool));
1508 if (!modem_power_event) {
1509 _ERR("Failed to allocated memory ");
1512 modem_power_event->type = LISTEN_MODEM_POWER_STATE;
1513 modem_power_event->val = state;
1514 modem_power_event->app = NULL;
1517 if (pthread_create(&producer, &attr, event_producer, modem_power_event)) {
1518 _ERR("Failed to pthread_create.");
1519 BM_FREE(modem_power_event);
1528 static void create_lock_event(char *lock_type)
1532 if (g_strcmp0(lock_type, "lcdoff") == 0)
1534 else if (g_strcmp0(lock_type, "lcddim") == 0)
1536 else if (g_strcmp0(lock_type, "lcdon") == 0)
1541 if (prev_lock == val)
1546 event_pool *lock_event = (event_pool *)calloc(1, sizeof(event_pool));
1548 _ERR("Failed to allocated memory ");
1552 lock_event->type = LISTEN_POWERLOCKUNLOCK_STATE;
1553 lock_event->val = val;
1554 lock_event->app = NULL;
1557 if (pthread_create(&producer, &attr, event_producer, lock_event)) {
1558 _ERR("Failed to pthread_create.");
1559 BM_FREE(lock_event);
1567 static void __powerlock_signal_callback(GDBusConnection *conn,
1568 const gchar *sender,
1571 const gchar *signal,
1578 unsigned int timeout;
1579 g_variant_get(params, "(&sii)", &lock_type, &pid, &timeout);
1581 _INFO(" powerlock value changed =%s Pid=%d, timeout=%d", lock_type, pid, timeout);
1583 create_lock_event(lock_type);
1589 static void __powerunlock_signal_callback(GDBusConnection *conn,
1590 const gchar *sender,
1593 const gchar *signal,
1600 unsigned int timeout;
1602 g_variant_get(params, "(&sii)", &lock_type, &pid, &timeout);
1604 _INFO(" powerUnlock value changed =%s Pid=%d, timeout=%d", lock_type, pid, timeout);
1606 create_lock_event(lock_type);
1612 static void __sleep_signal_callback(GDBusConnection *conn,
1613 const gchar *sender,
1616 const gchar *signal,
1622 event_pool *sleep_event = (event_pool *)calloc(1, sizeof(event_pool));
1624 _ERR("Failed to allocated memory ");
1628 sleep_event->type = LISTEN_SLEEP_WAKEUP_STATE;
1629 sleep_event->val = 0;
1630 sleep_event->app = NULL;
1633 if (pthread_create(&producer, &attr, event_producer, sleep_event)) {
1634 _ERR("Failed to pthread_create.");
1635 BM_FREE(sleep_event);
1643 static void __wakeup_signal_callback(GDBusConnection *conn,
1644 const gchar *sender,
1647 const gchar *signal,
1653 event_pool *wakeup_event = (event_pool *)calloc(1, sizeof(event_pool));
1654 if (!wakeup_event) {
1655 _ERR("Failed to allocated memory ");
1659 wakeup_event->type = LISTEN_SLEEP_WAKEUP_STATE;
1660 wakeup_event->val = 1;
1661 wakeup_event->app = NULL;
1664 if (pthread_create(&producer, &attr, event_producer, wakeup_event)) {
1665 _ERR("Failed to pthread_create.");
1666 BM_FREE(wakeup_event);
1674 static void __app_status_signal_callback(GDBusConnection *conn,
1675 const gchar *sender,
1678 const gchar *signal,
1687 /* (issss) : pid, appid, pkgid, status, type */
1688 g_variant_get(params, "(i&s&s&s&s)", &pid, &appid, NULL, &status, NULL);
1690 if (status == NULL) {
1691 _ERR("Status is NULL");
1695 if (appid == NULL) {
1696 _ERR("appid is NULL");
1700 event_pool *app_event = (event_pool *)calloc(1, sizeof(event_pool));
1702 _ERR("Failed to allocated memory ");
1706 _DBG("pid:%d, appid:%s, status:%s", pid, appid, status);
1708 if (g_strcmp0(status, "fg") == 0)
1713 app_event->type = LISTEN_APP_STATUS;
1714 app_event->val = val;
1715 app_event->app = g_strdup(appid);
1718 if (pthread_create(&producer, &attr, event_producer, app_event)) {
1719 _ERR("Failed to pthread_create.");
1720 BM_FREE(app_event->app);
1728 static int bm_charging_status_listeners()
1732 /* Charging callbacks */
1734 ret = vconf_notify_key_changed(VCONFKEY_SYSMAN_CHARGER_STATUS, __bm_charging_status_change, NULL);
1736 _ERR("failed to register a cb key:%s err:%d", "VCONFKEY_SYSMAN_CHARGER_STATUS", ret);
1744 static int bm_battery_capacity_listeners()
1748 /* Charging callbacks */
1750 ret = vconf_notify_key_changed(VCONFKEY_SYSMAN_BATTERY_CAPACITY, __bm_battery_capacity_change, NULL);
1752 _ERR("failed to register a cb key:%s err:%d", "VCONFKEY_SYSMAN_BATTERY_CAPACITY", ret);
1760 static int bm_location_listeners()
1764 /* Charging callbacks */
1766 ret = vconf_notify_key_changed(VCONFKEY_LOCATION_ENABLED, __bm_location_change, NULL);
1768 _ERR("failed to register a cb key:%s err:%d", "VCONFKEY_LOCATION_ENABLED", ret);
1776 static int bm_screen_subscribe_listeners()
1780 /* Screen callbacks */
1781 int ret = device_add_callback(DEVICE_CALLBACK_DISPLAY_STATE, __bm_device_display_change, NULL);
1782 if (ret != BATTERY_MONITOR_ERROR_NONE) {
1783 _ERR("device_add_callback failed: %s", get_error_message(ret));
1791 static int bm_telephony_listeners()
1796 handle = tel_init(NULL);
1797 if (handle == NULL) {
1798 _ERR("invalid handle - signal strength");
1802 int ret = BATTERY_MONITOR_ERROR_NONE;
1804 /* register signal strength notification */
1805 ret = tel_register_noti_event(handle, TAPI_PROP_NETWORK_SIGNALSTRENGTH_LEVEL, _bm_notify_signal_strength, NULL);
1806 if (ret != BATTERY_MONITOR_ERROR_NONE) {
1807 _ERR("register for signal-strength failed");
1811 /* register modem power notification */
1812 ret = tel_register_noti_event(handle, TAPI_PROP_MODEM_POWER, _bm_notify_modem_power, NULL);
1813 if (ret != BATTERY_MONITOR_ERROR_NONE) {
1814 _ERR("register for modem-power failed");
1822 static int bm_display_brightness_listeners()
1826 /* Screen callbacks */
1828 ret = vconf_notify_key_changed(VCONFKEY_SETAPPL_LCD_BRIGHTNESS, __bm_display_brightness_change, NULL);
1830 _ERR("failed to register a cb key:%s err:%d", "VCONFKEY_SETAPPL_LCD_BRIGHTNESS", ret);
1838 static int bm_wifi_subscribe_listeners()
1842 /* Wifi callbacks */
1843 int rv = wifi_manager_initialize(&wifi);
1844 if (rv == WIFI_MANAGER_ERROR_NONE) {
1845 int ret = wifi_manager_set_device_state_changed_cb(wifi, __bm_wifi_device_state_callback, NULL);
1846 if (ret == WIFI_MANAGER_ERROR_NONE)
1847 _INFO("wifi_manager_set_device_state_changed_cb success : [%p]\n", __bm_wifi_device_state_callback);
1849 _ERR("wifi_manager_set_device_state_changed_cb failed");
1851 ret = wifi_manager_set_scan_state_changed_cb(wifi, __bm_wifi_scan_changed_callback, NULL);
1852 if (ret == WIFI_MANAGER_ERROR_NONE)
1853 _INFO("wifi_manager_set_scan_state_changed_cb success\n");
1855 _ERR("wifi_manager_set_scan_state_changed_cb failed");
1857 ret = wifi_manager_set_connection_state_changed_cb(wifi, __bm_wifi_connection_state_changed_callback, NULL);
1858 if (ret == WIFI_MANAGER_ERROR_NONE)
1859 _INFO("wifi_manager_set_connection_state_changed_cb success\n");
1861 _ERR("wifi_manager_set_scan_state_changed_cb failed");
1863 _ERR(" Wifi init failed \n");
1867 _INFO("Wifi init succeeded\n");
1873 static int bm_bluetooth_subscribe_listeners()
1877 /* Bluetooth callbacks */
1878 int rv = bt_initialize();
1880 if (rv == BT_ERROR_NONE) {
1881 int ret = bt_device_set_connection_state_changed_cb(__bm_bt_device_connection_state_changed_cb, NULL);
1882 _INFO("bt_device_set_connection_state_changed_cb ret =%d \n", ret);
1884 ret = bt_adapter_set_state_changed_cb(__bm_bt_adapter_state_changed_cb, NULL);
1885 _INFO("bt_adapter_set_state_changed_cb ret =%d \n", ret);
1887 ret = bt_adapter_set_device_discovery_state_changed_cb(__bm_bt_device_discovery_state_changed_cb, NULL);
1888 _INFO("bt_adapter_set_device_discovery_state_changed_cb ret =%d \n", ret);
1891 _ERR(" bluetooth init failed \n");
1895 _INFO("bluetooth init succeeded\n");
1900 static int bm_powerlock_unlock_subscribe_listener(void)
1905 if (!dbus_connection) {
1906 _ERR("dbus connection is null");
1911 ret = g_dbus_connection_signal_subscribe(dbus_connection,
1914 DBUS_DEVICED_PL_MEMBER,
1917 G_DBUS_SIGNAL_FLAGS_NONE,
1918 __powerlock_signal_callback,
1923 _ERR("Failed to subscrive bus signal"); //LCOV_EXCL_LINE System Error
1927 ret = g_dbus_connection_signal_subscribe(dbus_connection,
1930 DBUS_DEVICED_PU_MEMBER,
1933 G_DBUS_SIGNAL_FLAGS_NONE,
1934 __powerunlock_signal_callback,
1939 _ERR("Failed to subscrive bus signal"); //LCOV_EXCL_LINE System Error
1944 return BATTERY_MONITOR_ERROR_NONE;
1947 static int bm_sleep_wakeup_subscribe_listener(void)
1952 if (!dbus_connection) {
1953 _ERR("dbus connection is null");
1958 ret = g_dbus_connection_signal_subscribe(dbus_connection,
1961 DBUS_DEVICED_SLEEP_MEMBER,
1964 G_DBUS_SIGNAL_FLAGS_NONE,
1965 __sleep_signal_callback,
1970 _ERR("Failed to subscrive bus signal"); //LCOV_EXCL_LINE System Error
1974 ret = g_dbus_connection_signal_subscribe(dbus_connection,
1977 DBUS_DEVICED_WAKEUP_MEMBER,
1980 G_DBUS_SIGNAL_FLAGS_NONE,
1981 __wakeup_signal_callback,
1986 _ERR("Failed to subscrive bus signal"); //LCOV_EXCL_LINE System Error
1991 return BATTERY_MONITOR_ERROR_NONE;
1994 static int bm_app_status_listener(void)
1999 if (!dbus_connection) {
2000 _ERR("dbus connection is null");
2005 ret = g_dbus_connection_signal_subscribe(dbus_connection,
2007 "org.tizen.aul.AppStatus",
2009 "/Org/Tizen/Aul/AppStatus",
2011 G_DBUS_SIGNAL_FLAGS_NONE,
2012 __app_status_signal_callback,
2017 _ERR("Failed to subscrive bus signal"); //LCOV_EXCL_LINE System Error
2022 return BATTERY_MONITOR_ERROR_NONE;
2025 void* event_consumer()
2030 pthread_mutex_lock(&battery_lister_mutex);
2031 while (buff_count == 0)
2032 pthread_cond_wait(&fill, &battery_lister_mutex);
2034 bm_create_event_data(events_buf[use_ptr].type, events_buf[use_ptr].val, events_buf[use_ptr].app);
2036 _INFO("type: %d and val = %d", events_buf[use_ptr].type, events_buf[use_ptr].val);
2037 _INFO("buff_count: %d and fill_ptr = %d , use_ptr = %d", buff_count, fill_ptr, use_ptr);
2039 use_ptr = (use_ptr + 1) % MAX_BUFF;
2042 pthread_cond_signal(&empty);
2043 pthread_mutex_unlock(&battery_lister_mutex);
2048 static int bm_initialize_history_data_obj()
2053 if (pthread_create(&consumer, &attr, event_consumer, NULL)) {
2054 _ERR("Failed to pthread_create.");
2055 return BATTERY_MONITOR_ERROR_NOT_SUPPORTED;
2058 // Hash table initialize for application list
2059 app_list = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
2061 if (data_obj != NULL) {
2062 _WARN(" History data object already exits");
2063 return BATTERY_MONITOR_ERROR_NONE;
2065 data_obj = (history_item_s *)calloc(1, sizeof(history_item_s));
2067 data_obj->state_1 = 0;
2068 data_obj->state_2 = 0;
2069 data_obj->event_code = ET_NONE;
2070 data_obj->event_tag = NULL;
2072 _ERR(" history_item_s data object creation fails ");
2073 return BATTERY_MONITOR_ERROR_OUT_OF_MEMORY;
2076 if (fill_battery_info() != DEVICE_ERROR_NONE) {
2077 _ERR("Battery information failed ");
2078 data_obj->battery_level = 0;
2079 data_obj->battery_temperature = 0;
2080 data_obj->battery_voltage = 0;
2081 data_obj->battery_health = BD_BHLT_UNKN;
2082 data_obj->battery_plugtype = BD_BPLT_NONE;
2083 data_obj->battery_status = BD_BSTA_UNKN;
2086 gettimeofday(&prev_event_time, NULL);
2089 return BATTERY_MONITOR_ERROR_NONE;
2092 int bd_initialize_listeners(void)
2098 /* Initialize Hash Table */
2099 if (!bm_initialize_history_data_obj())
2100 _INFO("bm_initialize_history_data_obj succeeded \n");
2102 _ERR("bm_initialize_history_data_obj failed \n");
2103 return BATTERY_MONITOR_ERROR_OUT_OF_MEMORY;
2106 /* Initialize pthread attributes */
2107 if (pthread_attr_init(&attr) != 0) {
2108 _ERR("pthread_attr_init failed");
2109 return BATTERY_MONITOR_ERROR_OUT_OF_MEMORY;
2112 if (pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED) != 0)
2113 _ERR("pthread_attr_setdetachstate failed");
2116 if (bm_listener_dbus_init())
2117 _ERR("bm_listener_dbus_init failed \n");
2119 /* Wifi callbacks */
2120 if (!bm_wifi_subscribe_listeners())
2121 _INFO("Wifi listeners succeeded to subscribed\n");
2123 _ERR("Wifi listeners failed to subscribed\n");
2125 /* BlueTooth callbacks */
2126 if (!bm_bluetooth_subscribe_listeners())
2127 _INFO("bluetooth listeners succeeded to subscribed\n");
2129 _ERR("bluetooth listeners failed to subscribed\n");
2131 /* Screen wakeup callbacks */
2132 if (!bm_screen_subscribe_listeners())
2133 _INFO("Display listeners succeeded to subscribed\n");
2135 _ERR("Display listeners failed to subscribed\n");
2137 /* Brightness change callbacks */
2138 if (!bm_display_brightness_listeners())
2139 _INFO("Brightness listeners succeeded to subscribed\n");
2141 _ERR("Brightness listeners failed to subscribed\n");
2143 /* battery_capacity change callbacks */
2144 if (!bm_battery_capacity_listeners())
2145 _INFO("battery_capacity listeners succeeded to subscribed\n");
2147 _ERR("battery_capacity listeners failed to subscribed\n");
2149 /* battery charging change callbacks */
2150 if (!bm_charging_status_listeners())
2151 _INFO("battery charging listeners succeeded to subscribed\n");
2153 _ERR("battery charging listeners failed to subscribed\n");
2155 /* GPS change callbacks */
2156 if (!bm_location_listeners())
2157 _INFO("location listeners succeeded to subscribed\n");
2159 _ERR("location listeners failed to subscribed\n");
2161 /* telephony listeners */
2162 if (!bm_telephony_listeners())
2163 _INFO("telephony listeners succeeded to subscribed\n");
2165 _ERR("telephony listeners failed to subscribed\n");
2167 /* Powerlock callbacks */
2168 if (!bm_powerlock_unlock_subscribe_listener())
2169 _INFO("Pwoerlock listeners succeeded to subscribed\n");
2171 _ERR("Powerlock listeners failed to subscribed\n");
2173 /* Device Sleep callbacks */
2174 if (!bm_sleep_wakeup_subscribe_listener())
2175 _INFO("Sleep Wakeup listeners succeeded to subscribed\n");
2177 _ERR("Sleep Wakeup listeners failed to subscribed\n");
2179 /* App Status callbacks */
2180 if (!bm_app_status_listener())
2181 _INFO("FG listeners succeeded to subscribed\n");
2183 _ERR("FG Wakeup listeners failed to subscribed\n");
2186 return BATTERY_MONITOR_ERROR_NONE;
2189 int bd_deinitialize_listeners()
2193 _INFO("de-initializing History listeners");
2196 /*unset the callbacks related to wifi*/
2197 if (wifi_manager_unset_connection_state_changed_cb(wifi) != WIFI_MANAGER_ERROR_NONE)
2198 _ERR("wifi_manager_unset_connection_state_changed_cb() failed.\n");
2200 _INFO("wifi_manager_unset_connection_state_changed_cb() success.\n");
2202 if (wifi_manager_deinitialize(wifi) != WIFI_MANAGER_ERROR_NONE)
2203 _ERR("wifi_manager_deinitialize() failed.\n");
2205 _INFO("wifi_manager_deinitialize() success.\n");
2208 /* unset bluetooth device connection state changed state event callback*/
2209 if (bt_device_unset_connection_state_changed_cb() != BT_ERROR_NONE)
2210 _ERR("bt_device_unset_connection_state_changed_cb() failed.\n");
2212 _INFO("bt_device_unset_connection_state_changed_cb() success.\n");
2214 /* unset bluetooth adapter changed state event callback*/
2215 if (bt_adapter_unset_state_changed_cb() != BT_ERROR_NONE)
2216 _ERR("bt_adapter_unset_state_changed_cb() failed.\n");
2218 _INFO("bt_adapter_unset_state_changed_cb() success.\n");
2220 /* deinit bluetooth api*/
2221 if (bt_deinitialize() != BT_ERROR_NONE)
2222 _ERR("bt_deinitialize() failed.\n");
2224 _INFO("bt_deinitialize() success.\n");
2227 if (vconf_ignore_key_changed(VCONFKEY_SETAPPL_LCD_BRIGHTNESS, __bm_display_brightness_change) < 0)
2228 _ERR("failed to de-register vconf callback");
2231 if (vconf_ignore_key_changed(VCONFKEY_SYSMAN_BATTERY_CAPACITY, __bm_battery_capacity_change) < 0)
2232 _ERR("failed to de-register vconf callback");
2235 if (vconf_ignore_key_changed(VCONFKEY_SYSMAN_CHARGER_STATUS, __bm_charging_status_change) < 0)
2236 _ERR("failed to de-register vconf callback");
2238 /* de-register telephony callbacks */
2240 int ret = tel_deregister_noti_event(handle, TAPI_NOTI_NETWORK_SIGNALSTRENGTH);
2241 if (ret != BATTERY_MONITOR_ERROR_NONE) {
2242 _ERR("tel_deregister_noti_event failed: %s", get_error_message(ret));
2245 ret = tel_deregister_noti_event(handle, TAPI_NOTI_MODEM_POWER);
2246 if (ret != BATTERY_MONITOR_ERROR_NONE) {
2247 _ERR("tel_deregister_noti_event failed: %s", get_error_message(ret));
2253 /*Dbus Deinitialize*/
2254 if (bm_listener_dbus_deinit())
2255 _ERR("failed to de-init dbus ");
2257 /* de-initialize pthread attributes */
2258 if (pthread_attr_destroy(&attr) != 0)
2259 _ERR("pthread_attr_destroy failed");
2261 g_hash_table_destroy(app_list);
2267 return BATTERY_MONITOR_ERROR_NONE;