summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/bm_plugin_interface.h4
-rw-r--r--src/bm_power_engine.c73
2 files changed, 54 insertions, 23 deletions
diff --git a/include/bm_plugin_interface.h b/include/bm_plugin_interface.h
index 451232a..e8e0b32 100644
--- a/include/bm_plugin_interface.h
+++ b/include/bm_plugin_interface.h
@@ -150,8 +150,10 @@ typedef struct {
* structure for "bluetooth" feature data.
*/
typedef struct {
- uint scanTime; /**< Total time spent by the resource in (scan) mode during the session */
+// uint scanTime; /**< Total time spent by the resource in (scan) mode during the session */
uint connectedTime; /**< Total time spent by the resource in (connected) mode during the session */
+ uint rxTime; /**< Total time spent by the resource in (RX) mode during the session */
+ uint txTime; /**< Total time spent by the resource in (TX) mode during the session */
time_t startTime; /**< start time of feature data collection session */
time_t stopTime; /**< stop time of feature data collection session */
GSList *atm_list; /**< application time map('app_time_map_st2') list for all active applications between start & stop */
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);