Modify BT Power Model 14/228514/2
authorDewal Agarwal <d1.agarwal@samsung.com>
Mon, 23 Mar 2020 10:54:15 +0000 (16:24 +0530)
committerDewal Agarwal <d1.agarwal@samsung.com>
Thu, 26 Mar 2020 08:35:49 +0000 (14:05 +0530)
Change-Id: I26180b4f100fc5e979f60c104a148503ed1e9587

include/bm_plugin_interface.h
src/bm_power_engine.c

index 451232a..e8e0b32 100644 (file)
@@ -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 */
index 670561e..9a92711 100644 (file)
@@ -550,16 +550,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) {
@@ -617,42 +618,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;
@@ -697,10 +728,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);