diff options
Diffstat (limited to 'src/bm_power_engine.c')
-rw-r--r-- | src/bm_power_engine.c | 73 |
1 files changed, 51 insertions, 22 deletions
diff --git a/src/bm_power_engine.c b/src/bm_power_engine.c index 77b849b..f9bdd67 100644 --- a/src/bm_power_engine.c +++ b/src/bm_power_engine.c @@ -551,16 +551,17 @@ int bm_ble_calc_power_and_commit(bm_bluetooth_st *handle, bool mode) GHashTable *hash = g_hash_table_new_full(g_str_hash, g_str_equal, bm_data_free, bm_atm_st2_free); long int edTime = 0, stTime = 0; - long int sesTime = 0, scTime = 0, conTime = 0, RX_app = 0, TX_app = 0; - long int RX_system = 0, TX_system = 0; + long int sesTime = 0, conTime = 0, RX_app = 0, TX_app = 0; + long int RX_system = 0, TX_system = 0, tx_time = 0, rx_time = 0; + long int scTime = 0; double onTime = 0; /* iterating over list for data accumulation */ for (bt_data_iterator = handle->bt_data_list; bt_data_iterator; bt_data_iterator = bt_data_iterator->next) { bm_bluetooth_st *datalistnode = (bm_bluetooth_st *)(bt_data_iterator->data); - edTime = datalistnode->stopTime; - stTime = datalistnode->startTime; - scTime += datalistnode->scanTime; + edTime = datalistnode->stopTime; stTime = datalistnode->startTime; +// scTime += datalistnode->scanTime; conTime += datalistnode->connectedTime; + rx_time += datalistnode->rxTime; tx_time += datalistnode->txTime; sesTime += (edTime-stTime); bt_atm_iterator = datalistnode->atm_list; for ( ; bt_atm_iterator; bt_atm_iterator = bt_atm_iterator->next) { @@ -618,42 +619,72 @@ int bm_ble_calc_power_and_commit(bm_bluetooth_st *handle, bool mode) sP_power_bt_idle, sP_power_bt_scan, sP_power_bt_conn, sP_power_bt_tx, sP_power_bt_rx); /* BT power consumption Level - 1 at the Resource Level */ long int P_power_bt = 0, P_power_data = 0, P_power_conn = 0; - P_power_conn = ((sP_power_bt_idle) * (sesTime - (scTime + conTime))) + ((sP_power_bt_scan) * (scTime)) + ((sP_power_bt_conn) * (conTime)); - P_power_data = ((sP_power_bt_tx) * TX_app) + ((sP_power_bt_rx) * RX_app); + /* Remove transmit time from connected time */ + long int rconTime = conTime - (rx_time + tx_time); + P_power_conn = ((sP_power_bt_idle) * (sesTime - conTime)) + ((sP_power_bt_conn) * (rconTime)); + /* Amount based usage calculation */ +// P_power_data = ((sP_power_bt_tx) * TX_app) + ((sP_power_bt_rx) * RX_app); + + /* Use rx and tx time to calculate the usage */ + P_power_data = ((sP_power_bt_tx) * tx_time + (sP_power_bt_rx) * rx_time); P_power_bt = P_power_conn + P_power_data; _DBG("Calculated Power for Bluetooth P_power_bt(%ld), P_power_conn (%ld), P_power_data(%ld)", P_power_bt, P_power_conn, P_power_data); /* BT power consumption Level - 2 at the Application Level */ - GHashTableIter iter; + GHashTableIter iter1; gpointer key, value; - g_hash_table_iter_init(&iter, hash); + g_hash_table_iter_init(&iter1, hash); + + long int rx_tx_time = tx_time + rx_time; + long int left_rx_tx_time = rx_tx_time; + double apptime = 0, csc_t = 0; + //Normalize + if (onTime != 0 && onTime > rx_tx_time) { + _DBG("Normalize the scan app scan time"); + csc_t = (double)rx_tx_time/onTime; + while (g_hash_table_iter_next(&iter1, &key, &value)) { + app_time_map_st2 *temp = (app_time_map_st2 *)value; + apptime = temp->time; + if (temp->time > 0) { + temp->time = (apptime * csc_t); + left_rx_tx_time -= temp->time; + } + } + } else + left_rx_tx_time -= onTime; long int P_power_app_bt = 0, P_power_app_data = 0, P_power_app_conn = 0; char *appid = NULL; long int apprx = 0, apptx = 0; - double apptime = 0; - long int rx_t = 0, tx_t = 0; long int ret_time = bm_get_log_time(); + /* Coefficient to divide the rx and tx time wrt rx and tx bytes */ + double crtx_t = 0; + if ((left_rx_tx_time > 0) && (RX_app != 0 || TX_app != 0)) + crtx_t = (double)left_rx_tx_time/(TX_app + RX_app + RX_system + TX_system); + appid_usage_s *app_usage = (appid_usage_s *)calloc(1, sizeof(appid_usage_s)); if (app_usage == NULL) { _ERR("memory allocation failed"); return BATTERY_MONITOR_ERROR_OUT_OF_MEMORY; } + GHashTableIter iter; + g_hash_table_iter_init(&iter, hash); while (g_hash_table_iter_next(&iter, &key, &value)) { P_power_app_bt = 0, P_power_app_data = 0, P_power_app_conn = 0; apprx = 0, apptx = 0, apptime = 0; app_time_map_st2 *temp = (app_time_map_st2 *)value; appid = temp->app_id; - apprx = temp->rx; rx_t += apprx; - apptx = temp->tx; tx_t += apptx; + apprx = temp->rx; apptx = temp->tx; apptime = temp->time; - P_power_app_data = ((sP_power_bt_tx) * apptx) + ((sP_power_bt_rx) * apprx); - if (onTime != 0) - P_power_app_conn = (P_power_conn * apptime)/onTime; //check for 0 denominator & same units - P_power_app_bt = P_power_app_data + P_power_app_conn; - + /* Coefficient of unit byte total transmitted bytes */ +// P_power_app_data = (sP_power_bt_tx * (crx_t * apptx)) + (sP_power_bt_rx * (ctx_t * apprx)); +// if (onTime != 0) +// P_power_app_conn = (P_power_conn * apptime)/onTime; //check for 0 denominator & same units +// P_power_app_bt = P_power_app_data + P_power_app_conn; + int app_transmit = apprx + apptx; + P_power_app_bt = sP_power_bt_rx * ((crtx_t * app_transmit) + apptime); app_usage->AppId = appid; app_usage->rId_ble = P_power_app_bt; app_usage->log_time = ret_time; @@ -698,10 +729,8 @@ int bm_ble_calc_power_and_commit(bm_bluetooth_st *handle, bool mode) return BATTERY_MONITOR_ERROR_OUT_OF_MEMORY; } gble_st->time_s = ret_time; gble_st->ble_idle_time = (sesTime - (scTime + conTime)); - if (tx_t != 0 || rx_t != 0) { - gble_st->ble_rx_time = (conTime * rx_t) / (rx_t + tx_t); - gble_st->ble_tx_time = (conTime * tx_t) / (rx_t + tx_t); - } + gble_st->ble_rx_time = rx_time; + gble_st->ble_tx_time = tx_time; gble_st->ble_pwi_val = P_power_bt; ret_val = bm_server_battery_dump_insert_to_db(gble_st, 0); |