#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;
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)
{
gettimeofday(&app_scan_base, 0);
- 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;
- }
+ /* 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)) {
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;
}
}
}
+static bool __bt_bm_session_timeout_cb(void)
+{
+ 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;
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(void)
+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");
return;
}
+ __bt_display_session_data();
+
BT_DBG("Bt session ending...");
is_session_started = FALSE;
- if (current_session_data == NULL) {
- BT_ERR("Session in progress but data structure is not initialized");
- return;
+ 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;
}
-
- current_session_data->session_end_time = time(NULL);
- __bt_display_session_data();
}
/* 1 app can operate the regacy and ble scan at the same time */
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));
+ 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;
- out_var = g_variant_new_from_data((const GVariantType *)"ay",
- info->data, info->len,
- TRUE, NULL, NULL);
+ /*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("-");
case OAL_EVENT_ADAPTER_DISABLED:
BT_DBG("Handling Adapter Disabled");
if (is_session_started == TRUE) {
- _bt_stop_session_time();
__bt_notify_battery_data();
+ __bt_stop_session_time();
}
break;
case OAL_EVENT_ADAPTER_INQUIRY_STARTED: