X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;ds=inline;f=bt-service-adaptation%2Fservices%2Fbt-service-battery-monitor.c;h=16bd835d250744df7b02e5e6f8a3dc95319fb5a0;hb=e808cd1dcf0cc5e04b27b4900305fd77e19e5a3f;hp=e6a360e7cb85b768b7c345ccc8cf33d5a16c9914;hpb=ddbc350f29329a899931c9ea3c3cfdb4b6c8db9d;p=platform%2Fcore%2Fconnectivity%2Fbluetooth-frwk.git diff --git a/bt-service-adaptation/services/bt-service-battery-monitor.c b/bt-service-adaptation/services/bt-service-battery-monitor.c index e6a360e..16bd835 100644 --- a/bt-service-adaptation/services/bt-service-battery-monitor.c +++ b/bt-service-adaptation/services/bt-service-battery-monitor.c @@ -24,7 +24,8 @@ #include #include #include - +#include +#include #include @@ -33,12 +34,21 @@ #include "bt-service-event.h" #include "bt-service-core-adapter.h" -static time_t scan_start = 0; -static time_t connect_start = 0; -static time_t app_scan_base = 0; +/* Avoid the build error related to vconf.h's dependency */ +#ifndef VCONFKEY_BATTERY_MONITOR_STATUS +#define VCONFKEY_BATTERY_MONITOR_STATUS "db/bluetooth/bmstatus" +#endif + +/* 20 minutes */ +#define BT_BM_SESSION_TIMEOUT 1200 + +static struct timeval scan_start; +static struct timeval connect_start; +static struct timeval app_scan_base; static int scan_cnt = 0; static int connect_cnt = 0; static gboolean is_session_started = FALSE; +static guint session_timer = 0; static GSList *scan_app_list = NULL; @@ -50,10 +60,24 @@ typedef struct { _bt_battery_data_t *current_session_data = NULL; static void __bt_bm_add_prev_time(uint32_t scan_time); +static int __bt_start_session_time(void); +static void __bt_stop_session_time(void); +static bool __bt_bm_session_timeout_cb(void); + +uint32_t static __bt_dm_time_diff_msec(struct timeval prev, struct timeval cur) +{ + return (uint32_t)((cur.tv_sec - prev.tv_sec) * 1000.0f + (cur.tv_usec - prev.tv_usec) / 1000.0f); +} static void __bt_display_session_data() { BT_DBG("Displaying session data..."); + + if (current_session_data == NULL) { + BT_ERR("Session in progress but data structure is not initialized"); + return; + } + BT_DBG("session_start_time = %ld", current_session_data->session_start_time); BT_DBG("session_end_time = %ld", current_session_data->session_end_time); BT_DBG("session_scan_time = %d", current_session_data->session_scan_time); @@ -63,11 +87,11 @@ static void __bt_display_session_data() /*After reading data, the function resets it*/ int _bt_bm_read_data(_bt_battery_data_t *data) { + struct timeval cur_time; uint32_t tx_time = 0; uint32_t rx_time = 0; uint32_t idle_time = 0; uint32_t energy_used = 0; - time_t base_time = 0; uint16_t scan_time_per_app = 0; int scan_app_cnt = 0; @@ -84,6 +108,20 @@ int _bt_bm_read_data(_bt_battery_data_t *data) return BLUETOOTH_ERROR_NOT_SUPPORT; } + if (is_session_started == FALSE) { + if (__bt_start_session_time() != BLUETOOTH_ERROR_NONE) { + BT_ERR("Fail to start session time"); + return BLUETOOTH_ERROR_NOT_SUPPORT; + } + } + + if (current_session_data == NULL) { + BT_ERR("Session in progress but data structure is not initialized"); + return BLUETOOTH_ERROR_INTERNAL; + } + + gettimeofday(&cur_time, 0); + data->tx_time = tx_time; data->rx_time = rx_time; data->idle_time = idle_time; @@ -95,30 +133,30 @@ int _bt_bm_read_data(_bt_battery_data_t *data) data->session_scan_time = current_session_data->session_scan_time; if (scan_cnt) { - data->session_scan_time += (uint16_t) (time(NULL) - scan_start); - scan_start = time(NULL); - base_time = app_scan_base; - app_scan_base = scan_start; + data->session_scan_time += (uint16_t)__bt_dm_time_diff_msec(scan_start, cur_time); + gettimeofday(&scan_start, 0); } + current_session_data->session_scan_time = 0; data->session_connected_time = current_session_data->session_connected_time; if (connect_cnt) { - data->session_connected_time += (uint16_t) (time(NULL) - connect_start); - connect_start = time(NULL); + data->session_connected_time += (uint16_t)__bt_dm_time_diff_msec(connect_start, cur_time); + gettimeofday(&connect_start, 0); } + current_session_data->session_connected_time = 0; scan_app_cnt = g_slist_length(scan_app_list); if (scan_app_cnt > 0) { - scan_time_per_app = (uint32_t)(app_scan_base - base_time) / scan_app_cnt; + scan_time_per_app = (uint32_t)__bt_dm_time_diff_msec(app_scan_base, cur_time) / scan_app_cnt; __bt_bm_add_prev_time(scan_time_per_app); } - data->atm_list = current_session_data->atm_list; - if (data->atm_list == NULL) { - BT_DBG("No data transaction in this session"); - return BLUETOOTH_ERROR_NONE; - } + gettimeofday(&app_scan_base, 0); + + /* Note that this is a "shallow" copy. The pointers are copied but the actual data isn't. */ + data->atm_list = g_slist_copy(current_session_data->atm_list); + current_session_data->atm_list = NULL; BT_DBG("App-wise data transaction details"); for (GSList *l = data->atm_list; l != NULL; l = g_slist_next(l)) { @@ -126,7 +164,13 @@ int _bt_bm_read_data(_bt_battery_data_t *data) BT_DBG("%ld %ld %d %d %u", (long int)(t->uid), (long int)(t->pid), t->rx_bytes, t->tx_bytes, t->time); } - current_session_data->atm_list = NULL; + /* Reset the session timer */ + if (session_timer) + g_source_remove(session_timer); + + session_timer = g_timeout_add_seconds(BT_BM_SESSION_TIMEOUT, + (GSourceFunc)__bt_bm_session_timeout_cb, NULL); + return BLUETOOTH_ERROR_NONE; } @@ -147,8 +191,11 @@ static GSList* is_app_present(GSList *start, uid_t uid, pid_t pid) void _bt_bm_add_transaction_details(uid_t uid, pid_t pid, int value, data_transaction_type_e type) { + if (is_session_started == FALSE) + __bt_start_session_time(); + if (current_session_data == NULL) { - BT_ERR("Session in progress but data structure is not initialized"); //error handling + BT_ERR("Session in progress but data structure is not initialized"); return; } GSList *t = is_app_present(current_session_data->atm_list, uid, pid); @@ -179,35 +226,81 @@ void _bt_bm_add_transaction_details(uid_t uid, pid_t pid, int value, data_transa } } -void _bt_start_session_time() +static bool __bt_bm_session_timeout_cb(void) { - if (is_session_started == FALSE) { - BT_DBG("Bt session starting..."); - is_session_started = TRUE; - current_session_data = g_malloc0(sizeof(_bt_battery_data_t)); - current_session_data->session_start_time = time(NULL); - current_session_data->session_end_time = 0; - current_session_data->session_connected_time = 0; - current_session_data->session_scan_time = 0; - current_session_data->atm_list = NULL; - } else { - if (current_session_data == NULL) - BT_ERR("Session in progress but data structure is not initialized"); //error handling - else - BT_DBG("Bt session already in progress... Returning"); + BT_INFO("No data read calls during the time."); + + __bt_stop_session_time(); + + return FALSE; +} + + +static int __bt_start_session_time(void) +{ + int state = 0; + + if (is_session_started == TRUE) { + BT_ERR("Session is already started"); + return BLUETOOTH_ERROR_ALREADY_INITIALIZED; + } + + if (vconf_get_bool(VCONFKEY_BATTERY_MONITOR_STATUS, &state) != 0) { + BT_ERR("vconf_get_bool failed"); + return BLUETOOTH_ERROR_INTERNAL; + } + + if (state == 0) { + BT_ERR("Battery is not monitoring in now"); + return BLUETOOTH_ERROR_NOT_SUPPORT; } + + BT_DBG("Bt session starting..."); + is_session_started = TRUE; + + if (current_session_data == NULL) + current_session_data = g_malloc0(sizeof(_bt_battery_data_t)); + + current_session_data->session_start_time = time(NULL); + current_session_data->session_end_time = 0; + current_session_data->session_connected_time = 0; + current_session_data->session_scan_time = 0; + current_session_data->atm_list = NULL; + + /* After starting session if there is no read data call during the specific time, + * stop the session time to avoid the exceed of session data. + */ + if (session_timer) + g_source_remove(session_timer); + + session_timer = g_timeout_add_seconds(BT_BM_SESSION_TIMEOUT, + (GSourceFunc)__bt_bm_session_timeout_cb, NULL); + + return BLUETOOTH_ERROR_NONE; } -void _bt_stop_session_time() +static void __bt_stop_session_time(void) { + if (session_timer) { + g_source_remove(session_timer); + session_timer = 0; + } + if (is_session_started == FALSE) { - BT_DBG("BT session not in progress... Returning"); //error handling + BT_DBG("BT session not in progress... Returning"); return; } + + __bt_display_session_data(); + BT_DBG("Bt session ending..."); is_session_started = FALSE; - current_session_data->session_end_time = time(NULL); - __bt_display_session_data(); + + if (current_session_data != NULL) { + g_slist_free_full(current_session_data->atm_list, g_free); + g_free(current_session_data); + current_session_data = NULL; + } } /* 1 app can operate the regacy and ble scan at the same time */ @@ -253,15 +346,10 @@ void _bt_bm_add_scan_app(bt_bm_scan_type_e type, uid_t uid, pid_t pid) bt_bm_scan_info_t *scan_info = NULL; GSList *app_list = NULL; int app_cnt = 0; - time_t base_time = 0; - uint16_t scan_time_per_app = 0; + uint32_t scan_time_per_app = 0; BT_DBG("Scan type: %d", type); - /* Update the base time */ - base_time = app_scan_base; - app_scan_base = time(NULL); - if (scan_app_list) { app_cnt = g_slist_length(scan_app_list); app_list = __is_scan_app_present(scan_app_list, SCAN_BOTH, uid, pid); @@ -290,13 +378,16 @@ void _bt_bm_add_scan_app(bt_bm_scan_type_e type, uid_t uid, pid_t pid) scan_info->pid = pid; scan_info->type = type; - if (app_cnt > 0 && base_time != 0) { - /* Update the base time */ - base_time = app_scan_base; - app_scan_base = time(NULL); + if (app_cnt > 0) { + struct timeval cur_time; + + gettimeofday(&cur_time, 0); - scan_time_per_app = (uint32_t)(app_scan_base - base_time) / app_cnt; + scan_time_per_app = (uint32_t)(__bt_dm_time_diff_msec(app_scan_base, cur_time)) / app_cnt; __bt_bm_add_prev_time(scan_time_per_app); + + /* Update the base time */ + gettimeofday(&app_scan_base, 0); } scan_app_list = g_slist_append(scan_app_list, scan_info); @@ -309,8 +400,7 @@ void _bt_bm_remove_scan_app(bt_bm_scan_type_e type, uid_t uid, pid_t pid) bt_bm_scan_info_t *scan_info = NULL; GSList *app_list = NULL; int app_cnt = 0; - time_t base_time = 0; - uint16_t scan_time_per_app = 0; + uint32_t scan_time_per_app = 0; BT_DBG("Scan type: %d", type); @@ -329,6 +419,8 @@ void _bt_bm_remove_scan_app(bt_bm_scan_type_e type, uid_t uid, pid_t pid) app_list = __is_scan_app_present(scan_app_list, type, uid, pid); if (app_list) { + struct timeval cur_time; + scan_info = (bt_bm_scan_info_t *)(app_list->data); if (scan_info->type == SCAN_BOTH) { @@ -336,14 +428,13 @@ void _bt_bm_remove_scan_app(bt_bm_scan_type_e type, uid_t uid, pid_t pid) return; } - /* Update the base time */ - base_time = app_scan_base; - app_scan_base = time(NULL); + gettimeofday(&cur_time, 0); - if (base_time != 0) { - scan_time_per_app = (uint32_t)(app_scan_base - base_time) / app_cnt; - __bt_bm_add_prev_time(scan_time_per_app); - } + scan_time_per_app = (uint32_t)(__bt_dm_time_diff_msec(app_scan_base, cur_time)) / app_cnt; + __bt_bm_add_prev_time(scan_time_per_app); + + /* Update the base time */ + gettimeofday(&app_scan_base, 0); scan_app_list = g_slist_remove(scan_app_list, scan_info); @@ -353,62 +444,93 @@ void _bt_bm_remove_scan_app(bt_bm_scan_type_e type, uid_t uid, pid_t pid) void _bt_start_scan_time() { + if (is_session_started == FALSE) { + if (__bt_start_session_time() != BLUETOOTH_ERROR_NONE) { + BT_ERR("Fail to start session time"); + return; + } + } + if (current_session_data != NULL) { if (scan_cnt == 0) { BT_DBG("Starting scan time"); - scan_start = time(NULL); - app_scan_base = scan_start; + gettimeofday(&scan_start, 0); + gettimeofday(&app_scan_base, 0); } scan_cnt++; } else { - BT_ERR("Data structure uninitialized"); //error handling + BT_ERR("Data structure uninitialized"); } } void _bt_stop_scan_time() { + if (is_session_started == FALSE) { + if (__bt_start_session_time() != BLUETOOTH_ERROR_NONE) { + BT_ERR("Fail to start session time"); + return; + } + } + if (scan_cnt == 0 || current_session_data == NULL) - BT_ERR("Error encountered, returning..."); //error handling + BT_ERR("Error encountered, returning..."); else { scan_cnt--; if(scan_cnt == 0) { - time_t temp = time(NULL); - current_session_data->session_scan_time += (uint16_t) (temp - scan_start); - scan_start = 0; - app_scan_base = scan_start; + struct timeval cur_time; + + gettimeofday(&cur_time, 0); + current_session_data->session_scan_time += (uint16_t)(__bt_dm_time_diff_msec(scan_start, cur_time)); + gettimeofday(&scan_start, 0); + gettimeofday(&app_scan_base, 0); } } } void _bt_start_connect_time() { + if (is_session_started == FALSE) { + if (__bt_start_session_time() != BLUETOOTH_ERROR_NONE) { + BT_ERR("Fail to start session time"); + return; + } + } + if (current_session_data != NULL) { if (connect_cnt == 0) { BT_DBG("Starting connect time"); - connect_start = time(NULL); + gettimeofday(&connect_start, 0); } connect_cnt++; } else { - BT_ERR("Data structure uninitialized"); //error handling + BT_ERR("Data structure uninitialized"); } } void _bt_stop_connect_time() { - if(connect_cnt == 0 || current_session_data == NULL) { - BT_ERR("Error encountered, returning..."); //error handling + if (is_session_started == FALSE) { + if (__bt_start_session_time() != BLUETOOTH_ERROR_NONE) { + BT_ERR("Fail to start session time"); + return; + } } - else { + + if(connect_cnt == 0 || current_session_data == NULL) { + BT_ERR("Error encountered, returning..."); + } else { connect_cnt--; if(connect_cnt == 0) { - time_t temp = time(NULL); - current_session_data->session_connected_time += (uint16_t) (temp - connect_start); + struct timeval cur_time; + + gettimeofday(&cur_time, 0); + current_session_data->session_connected_time += (uint16_t)(__bt_dm_time_diff_msec(connect_start, cur_time)); } } } -static void _bt_notify_battery_data(void) +static void __bt_notify_battery_data(void) { BT_INFO("+"); _bt_battery_data_t *data = NULL; @@ -421,40 +543,42 @@ static void _bt_notify_battery_data(void) if (result != BLUETOOTH_ERROR_NONE) { BT_ERR("Battery data not collected"); + g_free(data); + return; } - else { - bt_battery_dbus_data_t dbus_data; - memset(&dbus_data, 0, sizeof(bt_battery_dbus_data_t)); - dbus_data.session_start_time = data->session_start_time; - dbus_data.session_end_time = data->session_end_time; - dbus_data.session_scan_time = data->session_scan_time; - dbus_data.session_connected_time = data->session_connected_time; - dbus_data.tx_time = data->tx_time; - dbus_data.rx_time = data->rx_time; - dbus_data.idle_time = data->idle_time; - - /*Populating app data*/ - int n = 0; - for (GSList *l = data->atm_list; l != NULL; l = g_slist_next(l)) { - bt_battery_app_data *t = (bt_battery_app_data *)(l->data); - memcpy(&dbus_data.app_data[n], t, sizeof(bt_battery_app_data)); - n++; - } - dbus_data.num_app = n; - info = g_array_new(FALSE, FALSE, sizeof(gchar)); - g_array_append_vals(info, &dbus_data, sizeof(bt_battery_dbus_data_t)); - - out_var = g_variant_new_from_data((const GVariantType *)"ay", - info->data, info->len, - TRUE, NULL, NULL); + bt_battery_dbus_data_t dbus_data; + memset(&dbus_data, 0, sizeof(bt_battery_dbus_data_t)); + dbus_data.session_start_time = data->session_start_time; + dbus_data.session_end_time = data->session_end_time; + dbus_data.session_scan_time = data->session_scan_time; + dbus_data.session_connected_time = data->session_connected_time; + dbus_data.tx_time = data->tx_time; + dbus_data.rx_time = data->rx_time; + dbus_data.idle_time = data->idle_time; + + /*Populating app data*/ + int n = 0; + for (GSList *l = data->atm_list; l != NULL; l = g_slist_next(l)) { + bt_battery_app_data *t = (bt_battery_app_data *)(l->data); + memcpy(&dbus_data.app_data[n], t, sizeof(bt_battery_app_data)); + n++; } + dbus_data.num_app = n; + + info = g_array_new(FALSE, FALSE, sizeof(gchar)); + g_array_append_vals(info, &dbus_data, sizeof(bt_battery_dbus_data_t)); + + out_var = g_variant_new_from_data((const GVariantType *)"ay", + info->data, info->len, + TRUE, NULL, NULL); + param = g_variant_new("(iv)", result, out_var); _bt_send_event(BT_ADAPTER_EVENT, BLUETOOTH_EVENT_DISABLED_BATTERY_DATA, param); - g_slist_free(data->atm_list); + g_slist_free_full(data->atm_list, g_free); g_free(data); g_array_free(info, TRUE); BT_INFO("-"); @@ -468,12 +592,15 @@ void _bt_bm_event_handler(gpointer data) switch(event_type) { case OAL_EVENT_ADAPTER_ENABLED: BT_DBG("Handling Adapter Enabled"); - _bt_start_session_time(); + if (__bt_start_session_time() != BLUETOOTH_ERROR_NONE) + BT_ERR("Fail to start session time"); break; case OAL_EVENT_ADAPTER_DISABLED: BT_DBG("Handling Adapter Disabled"); - _bt_stop_session_time(); - _bt_notify_battery_data(); + if (is_session_started == TRUE) { + __bt_notify_battery_data(); + __bt_stop_session_time(); + } break; case OAL_EVENT_ADAPTER_INQUIRY_STARTED: case OAL_EVENT_BLE_DISCOVERY_STARTED: