4 * Copyright (c) 2015 - 2016 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Sudipto Bal <sudipto.bal@samsung.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
29 #include <oal-event.h>
31 #include "bt-service-battery-monitor.h"
32 #include "bt-service-common.h"
34 static time_t scan_start = 0;
35 static time_t connect_start = 0;
36 static int scan_cnt = 0;
37 static int connect_cnt = 0;
38 static gboolean is_session_started = FALSE;
43 } bt_service_oal_event_data_t;
45 _bt_battery_data_t *current_session_data = NULL;
47 static void __bt_display_session_data()
49 BT_DBG("Displaying session data...");
50 BT_DBG("session_start_time = %ld", current_session_data->session_start_time);
51 BT_DBG("session_end_time = %ld", current_session_data->session_end_time);
52 BT_DBG("session_scan_time = %d", current_session_data->session_scan_time);
53 BT_DBG("session_connected_time = %d", current_session_data->session_connected_time);
56 /*After reading data, the function resets it*/
57 int _bt_bm_read_data(_bt_battery_data_t *data)
62 BT_ERR("Received NULL pointer in argument, returning...");
63 return BLUETOOTH_ERROR_NO_DATA;
66 data->session_start_time = current_session_data->session_start_time;
67 data->session_end_time = time(NULL);
68 current_session_data->session_start_time = time(NULL);
69 current_session_data->session_end_time = 0;
71 data->session_scan_time = current_session_data->session_scan_time;
73 data->session_scan_time += (uint16_t) (time(NULL) - scan_start);
74 scan_start = time(NULL);
77 data->session_connected_time = current_session_data->session_connected_time;
79 data->session_connected_time += (uint16_t) (time(NULL) - connect_start);
80 connect_start = time(NULL);
83 data->atm_list = current_session_data->atm_list;
84 if (data->atm_list == NULL) {
85 BT_DBG("No data transaction in this session");
86 return BLUETOOTH_ERROR_NONE;
89 BT_DBG("App-wise data transaction details");
90 for (GSList *l = data->atm_list; l != NULL; l = g_slist_next(l)) {
91 _bt_battery_app_data_t *t = (_bt_battery_app_data_t *)(l->data);
92 BT_DBG("%ld %ld %d %d", (long int)(t->uid), (long int)(t->pid), t->rx_bytes, t->tx_bytes);
95 current_session_data->atm_list = NULL;
96 return BLUETOOTH_ERROR_NONE;
99 static GSList* is_app_present(GSList *start, uid_t uid, pid_t pid)
102 _bt_battery_app_data_t *t;
103 BT_INFO("Checking Memory location %p", start);
104 for (l=start; l != NULL; l = g_slist_next(l)) {
105 t = (_bt_battery_app_data_t *)(l->data);
106 if (t->uid == uid && t->pid == pid) {
107 BT_INFO("App details already exist");
114 void _bt_bm_add_transaction_details(uid_t uid, pid_t pid, int size, data_transaction_type_e type)
116 if (current_session_data == NULL) {
117 BT_ERR("Session in progress but data structure is not initialized"); //error handling
120 GSList *t = is_app_present(current_session_data->atm_list, uid, pid);
121 _bt_battery_app_data_t *app_data = NULL;
124 BT_INFO("Match not found, adding new node...");
125 app_data = g_malloc0(sizeof(_bt_battery_app_data_t));
129 app_data->rx_bytes = size;
131 app_data->tx_bytes = size;
132 current_session_data->atm_list = g_slist_append(current_session_data->atm_list, app_data);
135 BT_INFO("Match found, updating existing node...");
136 app_data = (_bt_battery_app_data_t *)(t->data);
138 app_data->rx_bytes += size;
140 app_data->tx_bytes += size;
144 void _bt_start_session_time()
146 if (is_session_started == FALSE) {
147 BT_DBG("Bt session starting...");
148 is_session_started = TRUE;
149 current_session_data = g_malloc0(sizeof(_bt_battery_data_t));
150 current_session_data->session_start_time = time(NULL);
151 current_session_data->session_end_time = 0;
152 current_session_data->session_connected_time = 0;
153 current_session_data->session_scan_time = 0;
154 current_session_data->atm_list = NULL;
156 if (current_session_data == NULL)
157 BT_ERR("Session in progress but data structure is not initialized"); //error handling
159 BT_DBG("Bt session already in progress... Returning");
163 void _bt_stop_session_time()
165 if (is_session_started == FALSE) {
166 BT_DBG("BT session not in progress... Returning"); //error handling
169 BT_DBG("Bt session ending...");
170 is_session_started = FALSE;
171 current_session_data->session_end_time = time(NULL);
172 __bt_display_session_data();
175 void _bt_start_scan_time()
177 if (current_session_data != NULL) {
179 BT_DBG("Starting scan time");
180 scan_start = time(NULL);
184 BT_ERR("Data structure uninitialized"); //error handling
188 void _bt_stop_scan_time()
190 if (scan_cnt == 0 || current_session_data == NULL)
191 BT_ERR("Error encountered, returning..."); //error handling
195 time_t temp = time(NULL);
196 current_session_data->session_scan_time += (uint16_t) (temp - scan_start);
201 void _bt_start_connect_time()
203 if (current_session_data != NULL) {
204 if (connect_cnt == 0) {
205 BT_DBG("Starting connect time");
206 connect_start = time(NULL);
211 BT_ERR("Data structure uninitialized"); //error handling
215 void _bt_stop_connect_time()
217 if(connect_cnt == 0 || current_session_data == NULL) {
218 BT_ERR("Error encountered, returning..."); //error handling
222 if(connect_cnt == 0) {
223 time_t temp = time(NULL);
224 current_session_data->session_connected_time += (uint16_t) (temp - connect_start);
229 void _bt_bm_event_handler(gpointer data)
231 bt_service_oal_event_data_t *oal_event = data;
232 int event_type = oal_event->type;
235 case OAL_EVENT_ADAPTER_ENABLED:
236 BT_DBG("Handling Adapter Enabled");
237 _bt_start_session_time();
239 case OAL_EVENT_ADAPTER_DISABLED:
240 BT_DBG("Handling Adapter Disabled");
241 _bt_stop_session_time();
243 case OAL_EVENT_ADAPTER_INQUIRY_STARTED:
244 case OAL_EVENT_BLE_DISCOVERY_STARTED:
245 BT_DBG("Handling Adapter Discovery Start");
246 _bt_start_scan_time();
248 case OAL_EVENT_ADAPTER_INQUIRY_FINISHED:
249 case OAL_EVENT_BLE_DISCOVERY_STOPPED:
250 BT_DBG("Handling Adapter Discovery Stop");
251 _bt_stop_scan_time();
253 case OAL_EVENT_SOCKET_OUTGOING_CONNECTED:
254 case OAL_EVENT_GATTC_CONNECTION_COMPLETED:
255 BT_DBG("Handling Connection Start");
256 _bt_start_connect_time();
258 case OAL_EVENT_SOCKET_DISCONNECTED:
259 case OAL_EVENT_GATTC_DISCONNECTION_COMPLETED:
260 BT_DBG("Handling Connection Stop");
261 _bt_stop_connect_time();
264 BT_DBG("The event is not currently being handled");