Sync code between branch 36/234736/2
authorDewal Agarwal <d1.agarwal@samsung.com>
Thu, 28 May 2020 07:33:16 +0000 (13:03 +0530)
committerDewal Agarwal <d1.agarwal@samsung.com>
Thu, 28 May 2020 07:57:31 +0000 (13:27 +0530)
- Merge remote-tracking branch 'tizen_5.5' into 'tizen'
- Squashed commit to reflect the following changes:

commit 47a34ff11ed11f66d19aa4334348152303de1be0
Author: Kichan Kwon <k_c.kwon@samsung.com>
Date:   Wed May 27 15:36:20 2020 +0900

    Separate parameter file for TW3

    - Read model_name from model-config
    - Link bm_power_profile_params_MODEL.json
    - If there is no MODEL.json file, use dummy.json

    - If other device has a plan to use batterymonitor,
      measure their own parameter and make new package

    Change-Id: Iffb00d4ef8aab80afe9b9c3be662d50823368200
Signed-off-by: Kichan Kwon <k_c.kwon@samsung.com>
commit 3456f72a59868a09744c94f26ef9a6a1d1f016c5
Author: Kichan Kwon <k_c.kwon@samsung.com>
Date:   Thu Mar 26 11:37:41 2020 +0900

    Update power profile parameters for TW3

    - Parameters of disabled plugins are set to 0

    Change-Id: I5ca35d14858e9af22cb9ca22a0b61d31b7f4a74c
Signed-off-by: Kichan Kwon <k_c.kwon@samsung.com>
commit 6cb00737cf5e02df605004b55fd3256ba0330438
Merge: 32ec029 d06a26b
Author: Kunhoon Baik <knhoon.baik@samsung.com>
Date:   Tue May 26 00:47:42 2020 +0000

    Merge "Detach pthread after using it" into tizen_5.5

commit d06a26b63d009260f68e89c3b8346e20c59d392b
Author: Kichan Kwon <k_c.kwon@samsung.com>
Date:   Mon May 25 12:12:37 2020 +0900

    Detach pthread after using it

    Change-Id: Id15d3b1943c95c669e2a44962d4cca23d6e55790
Signed-off-by: Kichan Kwon <k_c.kwon@samsung.com>
commit 32ec0297d7e965e044d945a0c449de4569f7ef77
Merge: 0d2fb92 54eadfa
Author: Randeep Singh <randeep.s@samsung.com>
Date:   Tue May 26 00:36:33 2020 +0000

    Merge "[Non-ACR][Batterymonitor] BT scan initialization modified" into tizen_5.5

commit 54eadfa7dc989a682d0ae4a6a0567b21a93cbcee
Author: kamaljeet chauhan <kamal.jc@samsung.com>
Date:   Sun May 24 20:55:05 2020 +0530

    [Non-ACR][Batterymonitor] BT scan initialization modified

    Change-Id: I5f7e0bc81900396c8f2b92067be4b7eef2440017
Signed-off-by: kamaljeet chauhan <kamal.jc@samsung.com>
commit 0d2fb92893d24a33e05b71799c368cb62ea52556
Author: Kichan Kwon <k_c.kwon@samsung.com>
Date:   Thu May 21 17:54:13 2020 +0900

    No more duplicate one-time used string from GVariant

    Change-Id: Ie7aea4e8302c5f159afa13caef14c2f59c5d65f3
Signed-off-by: Kichan Kwon <k_c.kwon@samsung.com>
commit 745afdac00ae63a342c86072392239745cd9f504
Author: Randeep Singh <randeep.s@samsung.com>
Date:   Mon May 18 15:29:38 2020 +0530

    [Non-ACR] added events & states for modem power

    Change-Id: Ife5db285499536a2719a91ba80182107303ae2eb
Signed-off-by: Randeep Singh <randeep.s@samsung.com>
commit 7da835c43985e72999d5049ae7a318d7945b55e6
Author: Abhishek Vijay <abhishek.v@samsung.com>
Date:   Fri May 15 14:47:02 2020 +0530

    [Non-ACR] add modem power state listener

    Change-Id: I99664719e69106b8d5a556b89a8818f5ef180bf9

commit b56dc10c90e8ae7f039de5c2339b9af7dc8b564b
Author: kamaljeet chauhan <kamal.jc@samsung.com>
Date:   Sun May 17 18:21:19 2020 +0530

    Modification in Listeners initialization

    Change-Id: I2be142cfc3945456b2fd1269f14ab7e953cae2d1
Signed-off-by: kamaljeet chauhan <kamal.jc@samsung.com>
commit e8837fbfa67c04780e40533e18503106c6bfd955
Author: Dewal Agarwal <d1.agarwal@samsung.com>
Date:   Fri May 15 12:17:12 2020 +0530

    Add wr(wakereason) tag

    Change-Id: I9db5835b3748d534ddc6a4c133bc2fe599bf1831
Signed-off-by: Dewal Agarwal <d1.agarwal@samsung.com>
commit 5525f210b090cec7746a667a6f0218224cdb2330
Author: Dewal Agarwal <d1.agarwal@samsung.com>
Date:   Thu May 14 22:24:42 2020 +0530

    Change print order

    Change-Id: I3a089cf34369cbe7a73debd10868d719b7f28f86
Signed-off-by: Dewal Agarwal <d1.agarwal@samsung.com>
commit 859b233aac49dbbf10a12c2b34573348da6bccc5
Author: Dewal Agarwal <d1.agarwal@samsung.com>
Date:   Thu May 14 18:28:01 2020 +0530

    Fix: HSP sequence

    Change-Id: I931a103bb6cc86974d2578e86f17132017ecf887
Signed-off-by: Dewal Agarwal <d1.agarwal@samsung.com>
commit 089fe2b09899adbb39f6eb251727d5eadc27a5c3
Author: Dewal Agarwal <d1.agarwal@samsung.com>
Date:   Thu May 14 11:50:57 2020 +0530

    Dumpsys Tag for sleep/wakeup

    Change-Id: I350eec79af637922f27e3b4d74057daee19283b6
Signed-off-by: Dewal Agarwal <d1.agarwal@samsung.com>
commit 1c5308c98409d599e5d6debbc31348a8db0e619f
Author: Dewal Agarwal <d1.agarwal@samsung.com>
Date:   Thu May 14 11:18:04 2020 +0530

    AC plug type for last charge

    Change-Id: Ifff27e031c8cabd505e67eda0958cc5ae2572a99
Signed-off-by: Dewal Agarwal <d1.agarwal@samsung.com>
commit b15ed76e109ca0fb4687bce74af19acd26191124
Author: kamaljeet chauhan <kamal.jc@samsung.com>
Date:   Thu May 7 22:19:19 2020 +0530

    Events related to Application status ,power lock and sleep/wakeup added

    Change-Id: I49f2da929ba518fd27d0a563ad140b912e4eb8e5
Signed-off-by: kamaljeet chauhan <kamal.jc@samsung.com>
commit 032f0425f89ca0a97e7c242b745c96dd23684d74
Merge: ec7555b 1adb528
Author: Randeep Singh <randeep.s@samsung.com>
Date:   Wed May 13 05:08:20 2020 +0000

    Merge "Integrate bm_atm_free" into tizen_5.5

commit ec7555bd4113db815bf82686bfaf6226bb1440b4
Author: Dewal Agarwal <d1.agarwal@samsung.com>
Date:   Tue May 12 12:30:10 2020 +0530

    SVACE Fix

    Change-Id: If00336758a96a6a4efd5bf0f732c4985de29c14d
Signed-off-by: Dewal Agarwal <d1.agarwal@samsung.com>
commit 0583bc2ebe5f5b1e3e634a6ea427611360d08484
Author: Randeep Singh <randeep.s@samsung.com>
Date:   Mon May 11 18:05:08 2020 +0530

    added check for missing resource

    Change-Id: I5388e108da0850600c547ecf7d77d969bff528aa
Signed-off-by: Randeep Singh <randeep.s@samsung.com>
commit 1adb528a3db104a541dbedb10e25ac26b5d081b1
Author: Kichan Kwon <k_c.kwon@samsung.com>
Date:   Mon May 11 11:12:15 2020 +0900

    Integrate bm_atm_free

    - st1_free and st2_free are same
    - Now, st2_free isn't used
    - So, remove one to increase function coverage

    Change-Id: Id0cddd8099f3ed0051d30844242ba179df6bb972
Signed-off-by: Kichan Kwon <k_c.kwon@samsung.com>
commit 70404116d6d81e5617006df16bf9e6868264d1df
Author: Kichan Kwon <k_c.kwon@samsung.com>
Date:   Fri May 8 14:50:21 2020 +0900

    No more remove the ATM node of BLE usage via SAP

    - It was removed to prevent considering it as app usage
    - However, it doesn't be considered without removing it

    Change-Id: I0d210fed851ba2005ddfd22c2989fc47cf4e8d8b
Signed-off-by: Kichan Kwon <k_c.kwon@samsung.com>
commit c68237502d2f8629249e4bf35b482954d83c200c
Author: Kichan Kwon <k_c.kwon@samsung.com>
Date:   Wed May 6 20:02:45 2020 +0900

    Update CPU usage checker configuration

    Change-Id: I03d5cded93a8113d1cee47aac9ca0783856e2f10
Signed-off-by: Kichan Kwon <k_c.kwon@samsung.com>
commit fd8ae0c3641441c19cb6c60c6250f157b5bc8f2f
Author: Kichan Kwon <k_c.kwon@samsung.com>
Date:   Wed May 6 19:54:02 2020 +0900

    Update CPU idle model

    - Reset CPU idle counter on busy
    - Threshold variance policy is changed
      - On idle, decrease threshold with variance
      - Initialize after idle accept count times

    Change-Id: Ifdb04013689926e7cda512dbd1590817376b28bd
Signed-off-by: Kichan Kwon <k_c.kwon@samsung.com>
commit 363210884fa54c2687a4e13f8703fd58cf14a1b4
Author: Dewal Agarwal <d1.agarwal@samsung.com>
Date:   Wed May 6 11:41:57 2020 +0530

    Prevent mem leak upon return

    Change-Id: I1f2c10c47c619d756de7e1282a132defc2159f62
Signed-off-by: Dewal Agarwal <d1.agarwal@samsung.com>
commit ce991b3b149dd0d0b131b8caf4a3d76f3601e945
Author: Dewal Agarwal <d1.agarwal@samsung.com>
Date:   Mon May 4 17:20:06 2020 +0530

    Battery Last Charge time

    Change-Id: I4de8f8bd9897c2e7c61f59037d0643c1f168d81a
Signed-off-by: Dewal Agarwal <d1.agarwal@samsung.com>
commit 133c967c14eea03ad0cc952900d2e54f24421d44
Author: Dewal Agarwal <d1.agarwal@samsung.com>
Date:   Fri May 1 16:14:44 2020 +0530

    Correct code align

    Change-Id: Ib17fabd11b5c53daaa3faabd68c22a91dfe3ffc9
Signed-off-by: Dewal Agarwal <d1.agarwal@samsung.com>
commit 514f8a1d2d6a1452927b9d55540431a16a2aaccb
Author: Kichan Kwon <k_c.kwon@samsung.com>
Date:   Wed Apr 29 19:24:08 2020 +0900

    Fix memory leak

    Change-Id: I55e40606d05d0231c3e4db8abfcf95ce1d413ff7
Signed-off-by: Kichan Kwon <k_c.kwon@samsung.com>
commit 660861076184a6a3646c3e96ff37974e92296ae1
Author: Kichan Kwon <k_c.kwon@samsung.com>
Date:   Wed Apr 29 18:54:20 2020 +0900

    Don't allocate dynamic memory for app/res usage

    - We need to free these variables below
      - app_usage->AppId
      - res_usage->ResourceId
    - But, if they are freed on usage_free function,
      crash occurs because some code try to free
      without dynamic memory allocation
    - Not to use usage_free function, declare without
      dynamic memory allocation and don't free it

    Change-Id: I777f8408dcbc64da173f3edcf20d30a9aa932ad0
Signed-off-by: Kichan Kwon <k_c.kwon@samsung.com>
commit f592cf82a585c450de42f4bf8b469559979994b4
Author: Dewal Agarwal <d1.agarwal@samsung.com>
Date:   Wed Apr 29 12:04:08 2020 +0530

    Correct AppId duplication

    Change-Id: I8218a4af0436d2ba1743d321a647a0eef8859a2f
Signed-off-by: Dewal Agarwal <d1.agarwal@samsung.com>
commit 353dbdd71c0c15c9a12a78db2655b85300051e9e
Author: Dewal Agarwal <d1.agarwal@samsung.com>
Date:   Tue Apr 28 12:00:26 2020 +0530

    Correct for last charge in runtime

    Change-Id: I53df84feb058e42f22aca230c1357acabd25966e
Signed-off-by: Dewal Agarwal <d1.agarwal@samsung.com>
commit 6b4cdadc35ad14ac929acf86be9eff4a015cbe46
Author: Dewal Agarwal <d1.agarwal@samsung.com>
Date:   Mon Apr 27 14:42:09 2020 +0530

    Correct rx & tx time

    Change-Id: I608992436db3a20469848a33c60f4a247d005ca2
Signed-off-by: Dewal Agarwal <d1.agarwal@samsung.com>
commit 31759f61ff9c3039d3fbb3cbed9fb342c46e9b4c
Author: Dewal Agarwal <d1.agarwal@samsung.com>
Date:   Mon Apr 27 11:41:31 2020 +0530

    Chnage usage to mah

    Change-Id: I513b1fb7aabdd3c192f89898ab23e50517c73082
Signed-off-by: Dewal Agarwal <d1.agarwal@samsung.com>
commit 7e0b00ff75626818ebd1e2afce710b73e9a025ce
Merge: cb4dee7 37a91a6
Author: Randeep Singh <randeep.s@samsung.com>
Date:   Mon Apr 27 04:06:48 2020 +0000

    Merge "Add Base System Battery Usage Dump" into tizen_5.5

commit 37a91a61388eb4a49293748d163bb21f2518ee39
Author: Dewal Agarwal <d1.agarwal@samsung.com>
Date:   Fri Apr 24 12:09:20 2020 +0530

    Add Base System Battery Usage Dump

    Change-Id: I8c2d97b864393d34293a4f44391b8c15fcfcbc8c
Signed-off-by: Dewal Agarwal <d1.agarwal@samsung.com>
commit cb4dee786ac9da6d4afd649a467ffa585ab29e6b
Merge: f89fc8f c0a3b33
Author: Randeep Singh <randeep.s@samsung.com>
Date:   Thu Apr 23 12:24:56 2020 +0000

    Merge "Record System base usage" into tizen_5.5

commit f89fc8f23699d9607a1137e6ece64584acf6c424
Author: Kichan Kwon <k_c.kwon@samsung.com>
Date:   Tue Apr 21 16:23:38 2020 +0900

    Dump BT/Wi-Fi usage as bytes per minute

    - In addition, check period parameters to prevent divide by zero

    Change-Id: I6b50f755961418b2eb63bcec6d063c4723f3067b
Signed-off-by: Kichan Kwon <k_c.kwon@samsung.com>
commit c0a3b331e9bb3bca6c8ef139f86af1eb09a49791
Author: Dewal Agarwal <d1.agarwal@samsung.com>
Date:   Mon Apr 20 18:52:25 2020 +0530

    Record System base usage

    Change-Id: Ib62082b047e4a2d39fa2b3e2bfad6e6019ce1e10
Signed-off-by: Dewal Agarwal <d1.agarwal@samsung.com>
Change-Id: Id9f7b7a88f3ebff29f67c3f60d3a686afcbda996

15 files changed:
config/bm_params.json
config/bm_power_profile_params.json [deleted file]
config/bm_power_profile_params_TW3.json [new file with mode: 0644]
config/bm_power_profile_params_dummy.json [new file with mode: 0644]
include/bm_config_parser.h
include/bm_listeners.h
include/bm_server_db.h
include/bm_util.h
packaging/batterymonitor.spec
src/battery_dump/bd_history_item.c
src/battery_dump/bm_listeners.c
src/bm_config_parser.c
src/bm_power_engine.c
src/bm_server_db.c
src/bm_util.c

index 546c550..37bdc5c 100644 (file)
@@ -2,13 +2,13 @@
        "job_scheduler": {
                "data_collection_period": 600000,
                "data_collection_try_period": 1000,
-               "data_collection_accept_count": 5,
+               "data_collection_accept_count": 3,
                "delete_db_period": 86400000
        },
        "cpu_usage_checker": {
-               "timeout": 60000,
+               "timeout": 30000,
                "initial_threshold": 0.60,
-               "minimum_threshold": 0.50,
-               "threshold_reduction": 0.00
+               "maximum_threshold": 0.70,
+               "threshold_variance": 0.01
        }
 }
diff --git a/config/bm_power_profile_params.json b/config/bm_power_profile_params.json
deleted file mode 100644 (file)
index 2d3a4f5..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-{
-       "wifi": {
-               "p_wifi_rssi_0": 10.12345,
-               "p_wifi_rssi_1": 20.12345,
-               "p_wifi_rssi_2": 30.12345,
-               "p_wifi_rssi_3": 40.12345,
-               "p_wifi_rssi_4": 50.12345,
-               "p_wifi_scan": 60.12345,
-               "p_wifi_idle": 70.12345,
-               "p_wifi_rx": 80.12345,
-               "p_wifi_tx": 90.12345
-       },
-       "bluetooth": {
-               "p_bt_idle": 10.12345,
-               "p_bt_scan": 12.12345,
-               "p_bt_connected": 13.12345,
-               "p_bt_rx": 14.12345,
-               "p_bt_tx": 15.12345
-       },
-       "device_network": {
-               "p_dnw_sig_strength_0": 20.12345,
-               "p_dnw_sig_strength_1": 21.12345,
-               "p_dnw_sig_strength_2": 22.12345,
-               "p_dnw_sig_strength_3": 23.12345,
-               "p_dnw_sig_strength_4": 24.12345,
-               "p_dnw_sig_strength_5": 25.12345,
-               "p_dnw_sig_strength_6": 26.12345,
-               "p_dnw_rx": 21.12345,
-               "p_dnw_tx": 22.12345
-       },
-       "display": {
-               "p_dp_high": 30.12345,
-               "p_dp_medium": 31.12345,
-               "p_dp_low": 32.12345
-       },
-       "gps_sensor": {
-               "p_gps_inuse": 40.12345
-       },
-       "hrm_Sensor": {
-               "p_hrm_inuse": 50.12345
-       },
-       "cpu": {
-               "p_cpu_user": 60.12345,
-               "p_cpu_system": 61.12345
-       },
-       "battery": {
-               "p_battery": 500
-       }
-}
diff --git a/config/bm_power_profile_params_TW3.json b/config/bm_power_profile_params_TW3.json
new file mode 100644 (file)
index 0000000..df18236
--- /dev/null
@@ -0,0 +1,49 @@
+{
+       "wifi": {
+               "p_wifi_rssi_0": 1.29,
+               "p_wifi_rssi_1": 1.21,
+               "p_wifi_rssi_2": 1.13,
+               "p_wifi_rssi_3": 1.05,
+               "p_wifi_rssi_4": 0.97,
+               "p_wifi_scan": 74.50,
+               "p_wifi_idle": 0.36,
+               "p_wifi_rx": 60.42,
+               "p_wifi_tx": 60.42
+       },
+       "bluetooth": {
+               "p_bt_idle": 0.56,
+               "p_bt_scan": 11.73,
+               "p_bt_connected": 1.03,
+               "p_bt_rx": 37.52,
+               "p_bt_tx": 55.81
+       },
+       "device_network": {
+               "p_dnw_sig_strength_0": 0.0,
+               "p_dnw_sig_strength_1": 0.0,
+               "p_dnw_sig_strength_2": 0.0,
+               "p_dnw_sig_strength_3": 0.0,
+               "p_dnw_sig_strength_4": 0.0,
+               "p_dnw_sig_strength_5": 0.0,
+               "p_dnw_sig_strength_6": 0.0,
+               "p_dnw_rx": 0.0,
+               "p_dnw_tx": 0.0
+       },
+       "display": {
+               "p_dp_high": 50.29,
+               "p_dp_medium": 16.99,
+               "p_dp_low": 10.31
+       },
+       "gps_sensor": {
+               "p_gps_inuse": 0.0
+       },
+       "hrm_Sensor": {
+               "p_hrm_inuse": 0.0
+       },
+       "cpu": {
+               "p_cpu_user": 0.000006212057435,
+               "p_cpu_system": 0.000006212057435
+       },
+       "battery": {
+               "p_battery": 472
+       }
+}
diff --git a/config/bm_power_profile_params_dummy.json b/config/bm_power_profile_params_dummy.json
new file mode 100644 (file)
index 0000000..df18236
--- /dev/null
@@ -0,0 +1,49 @@
+{
+       "wifi": {
+               "p_wifi_rssi_0": 1.29,
+               "p_wifi_rssi_1": 1.21,
+               "p_wifi_rssi_2": 1.13,
+               "p_wifi_rssi_3": 1.05,
+               "p_wifi_rssi_4": 0.97,
+               "p_wifi_scan": 74.50,
+               "p_wifi_idle": 0.36,
+               "p_wifi_rx": 60.42,
+               "p_wifi_tx": 60.42
+       },
+       "bluetooth": {
+               "p_bt_idle": 0.56,
+               "p_bt_scan": 11.73,
+               "p_bt_connected": 1.03,
+               "p_bt_rx": 37.52,
+               "p_bt_tx": 55.81
+       },
+       "device_network": {
+               "p_dnw_sig_strength_0": 0.0,
+               "p_dnw_sig_strength_1": 0.0,
+               "p_dnw_sig_strength_2": 0.0,
+               "p_dnw_sig_strength_3": 0.0,
+               "p_dnw_sig_strength_4": 0.0,
+               "p_dnw_sig_strength_5": 0.0,
+               "p_dnw_sig_strength_6": 0.0,
+               "p_dnw_rx": 0.0,
+               "p_dnw_tx": 0.0
+       },
+       "display": {
+               "p_dp_high": 50.29,
+               "p_dp_medium": 16.99,
+               "p_dp_low": 10.31
+       },
+       "gps_sensor": {
+               "p_gps_inuse": 0.0
+       },
+       "hrm_Sensor": {
+               "p_hrm_inuse": 0.0
+       },
+       "cpu": {
+               "p_cpu_user": 0.000006212057435,
+               "p_cpu_system": 0.000006212057435
+       },
+       "battery": {
+               "p_battery": 472
+       }
+}
index c0f5f8e..bd00f1f 100644 (file)
@@ -51,7 +51,7 @@ int bm_get_battery_power_params(int *battery);
 
 int bm_get_job_scheduler_params(int *data_collection_period, int *data_collection_try_period, int *data_collection_accept_count, int *delete_db_period);
 
-int bm_get_cpu_usage_checker_params(int *timeout, double *initial_threshold, double *minimum_threshold, double *threshold_reduction);
+int bm_get_cpu_usage_checker_params(int *timeout, double *initial_threshold, double *maximum_threshold, double *threshold_variance);
 
 #ifdef __cplusplus
 }
index e37bf14..c9266bc 100644 (file)
@@ -28,7 +28,7 @@
 #include <pthread.h>
 
 
-#define MAX_BUFF 10
+#define MAX_BUFF 1
 #define        LISTEN_BT_STATE 0
 #define        LISTEN_BT_CONNECTION_STATE 1
 #define        LISTEN_BT_SCAN_STATE 2
 #define        LISTEN_LOCATION_CHANGE 9
 #define        LISTEN_CHARGING_STATUS_CHANGE 10
 #define        LISTEN_SIGNAL_STRENGTH_CHANGE 11
+#define LISTEN_POWERLOCKUNLOCK_STATE 12
+#define LISTEN_SLEEP_WAKEUP_STATE 13
+#define LISTEN_APP_STATUS 14
+#define LISTEN_MODEM_POWER_STATE 15
 
 
 
@@ -51,6 +55,7 @@ int bd_deinitialize_listeners();
 typedef struct _event_pool {
        int type;
        int val;
+       char *app;
 } event_pool;
 
 
index 887105b..c600c6a 100644 (file)
@@ -38,11 +38,9 @@ BM_RESOURCE_ID_DEVICE_NETWORK,
 BM_RESOURCE_ID_GPS_SENSOR,
 BM_RESOURCE_ID_ID_HRM_SENSOR,
 BM_RESOURCE_ID_BATTERY,
-BM_RESOURCE_ID_MAX,
-*/
+BM_RESOURCE_ID_MAX,*/
 
 /* Battery Monitor AppId Vs Integer Map */
-/* TO DO: Cleaning of redundant records from DB */
 #define APP_ID_MAP_SCHEMA "create table appid_map \n"\
        "(\n"\
 "id INTEGER PRIMARY KEY AUTOINCREMENT, "\
@@ -65,7 +63,6 @@ BM_RESOURCE_ID_MAX,
 ");"
 
 /* Battery Monitor RESOURCE ID Vs TIME */
-/* TO DO: Adding Enum for Resources */
 #define RESOURCE_ID_USAGE_SCHEMA "create table resourceid_usage \n"\
        "(\n"\
 "ResourceId TEXT, "\
@@ -73,6 +70,13 @@ BM_RESOURCE_ID_MAX,
 "usage INT "\
 ");"
 
+#define RES_ID_BASE_USAGE_SCHEMA "create table res_base_usage \n"\
+       "(\n"\
+"ResourceId TEXT, "\
+"log_time INT, "\
+"usage INT "\
+");"
+
 #define GBL_BLE_STAT_SCHEMA "create table gble_stat \n"\
        "(\n"\
 "time_s LONG INT, "\
@@ -82,7 +86,6 @@ BM_RESOURCE_ID_MAX,
 "ble_pwi_val INT "\
 ");"
 
-
 #define GBL_WFL_STAT_SCHEMA "create table gwfl_stat \n"\
        "(\n"\
 "time_s LONG INT, "\
@@ -168,6 +171,7 @@ BM_RESOURCE_ID_MAX,
 #define BATTERY_MONITOR_APP_ID_MAP_TABLE               "appid_map"
 #define BATTERY_MONITOR_APP_ID_USAGE_TABLE             "appid_usage"
 #define BATTERY_MONITOR_RESOURCE_ID_USAGE_TABLE                "resourceid_usage"
+#define BATTERY_MONITOR_RES_ID_BASE_USAGE_TABLE                "res_base_usage"
 #define BATTERY_MONITOR_GBL_BLE_STAT_TABLE             "gble_stat"
 #define BATTERY_MONITOR_GBL_WFL_STAT_TABLE             "gwfl_stat"
 #define BATTERY_MONITOR_GBL_NT_STAT_TABLE              "gn_stat"
@@ -178,7 +182,7 @@ BM_RESOURCE_ID_MAX,
 #define BATTERY_MONITOR_GBL_CPU_STAT_TABLE             "gcpu_stat"
 #define BATTERY_MONITOR_SQLITE_SEQ                     "sqlite_sequence"
 #define BATTERY_MONITOR_SQL_LEN_MAX                    1024
-#define BATTERY_MONITOR_TABLE_COUNT                    11
+#define BATTERY_MONITOR_TABLE_COUNT                    12
 
 typedef sqlite3_stmt *bm_stmt;
 
@@ -197,8 +201,14 @@ resourceid_usage_s *bm_server_query_resource_usage_resourceid(const char *resour
 
 resourceid_usage_s *bm_server_query_resource_usage_resourceid_ci(const char *resource_id, long long s_time, long long e_time, int *error_code);
 
+resourceid_usage_s *bm_server_query_resource_base_usage_resourceid_ci(const char *resource_id, long long s_time, long long e_time, int *error_code);
+
+resourceid_usage_s *bm_server_query_battery_last_charge(const char *resource_id, int *error_code);
+
 int bm_server_resource_usage_insert_to_db(resourceid_usage_s *bm_resource_type);
 
+int bm_server_resource_base_usage_insert_to_db(resourceid_usage_s *bm_resource_type);
+
 int bm_server_battery_dump_insert_to_db(void* str_data, int type);
 
 int bm_server_battery_dump_query_from_db(void *str_data, int type, long int duration);
index e9b093d..ed3091c 100644 (file)
@@ -53,9 +53,7 @@ const char *bm_get_resource_id_string(gint resource_id);
 
 void bm_data_free(gpointer data);
 
-void bm_atm_st1_free(gpointer data);
-
-void bm_atm_st2_free(gpointer data);
+void bm_atm_free(gpointer data);
 
 void bm_appid_usage_free(appid_usage_s *data);
 
index 924ffcd..091c56a 100644 (file)
@@ -65,8 +65,8 @@ cmake . -DCMAKE_INSTALL_PREFIX=%{_prefix} \
 %install
 %make_install
 mkdir -p %{buildroot}/usr/etc/batterymonitor/config
-cp config/bm_params.json %{buildroot}%{power_profile_config_path}/bm_params.json
-cp config/bm_power_profile_params.json %{buildroot}%{power_profile_config_path}/bm_power_profile_params.json
+cp config/bm_params.json %{buildroot}%{power_profile_config_path}
+cp config/bm_power_profile_params_*.json %{buildroot}%{power_profile_config_path}
 
 mkdir -p %{buildroot}%{_sysconfdir}/dbus-1/system.d
 cp org.tizen.battery.monitor.conf %{buildroot}%{_sysconfdir}/dbus-1/system.d/org.tizen.battery.monitor.conf
@@ -92,6 +92,7 @@ then
        CREATE TABLE if not exists appid_usage (AppId TEXT, log_time INT, rId_ble INT, rId_wifi INT, rId_cpu INT, rId_display INT, rId_device_network INT,
        rId_gps INT, rId_hrm INT, rId_battery INT);
        CREATE TABLE if not exists resourceid_usage (ResourceId TEXT, log_time INT, usage INT);
+       CREATE TABLE if not exists res_base_usage (ResourceId TEXT, log_time INT, usage INT);
        CREATE TABLE if not exists gble_stat (time_s LONG INT, ble_idle_time INT, ble_rx_time INT, ble_tx_time INT, ble_pwi_val INT);
        CREATE TABLE if not exists gwfl_stat (time_s LONG INT, wifi_on_time INT, wifi_conn_time INT, wifi_idle_time INT,
        wifi_rx_time INT, wifi_tx_time INT, wifi_pwi_val INT);
@@ -117,7 +118,38 @@ chmod 644 %{TZ_SYS_DB}/.battery-monitor.db-journal
 chsmack -a "System" %{TZ_SYS_DB}/.battery-monitor.db
 chsmack -a "System" %{TZ_SYS_DB}/.battery-monitor.db-journal
 
-%postun -p /sbin/ldconfig
+%posttrans
+# Read model name
+while read line; do
+       if [[ "${line}" =~ "tizen.org/system/model_name" ]]; then
+               model=$(echo ${line} | sed -e 's/<.*>\(.*\)<.*>/\1/' | sed -e 's/[[:space:]]//g')
+               echo "model_name =" ${model}
+
+               # If there is power parameter file for this model, link it
+               if [ -f %{power_profile_config_path}/bm_power_profile_params_${model}.json ]; then
+                       echo "Use parameter file for" ${model}
+                       ln -s %{power_profile_config_path}/bm_power_profile_params_${model}.json %{power_profile_config_path}/bm_power_profile_params.json
+               else
+                       echo "There is no parameter file for" ${model}
+               fi
+       fi
+done < /etc/config/model-config.xml
+
+# Otherwise, link dummy parameter file
+if [ ! -L %{power_profile_config_path}/bm_power_profile_params.json ]; then
+       echo "Use dummy paremeter file"
+       ln -s %{power_profile_config_path}/bm_power_profile_params_dummy.json %{power_profile_config_path}/bm_power_profile_params.json
+fi
+
+chsmack -a "_" %{power_profile_config_path}/bm_power_profile_params.json
+
+%postun
+/sbin/ldconfig
+
+# Remove symbolic link
+if [ -L %{power_profile_config_path}/bm_power_profile_params.json ]; then
+       unlink %{power_profile_config_path}/bm_power_profile_params.json
+fi
 
 %files
 %manifest %{name}.manifest
@@ -126,7 +158,7 @@ chsmack -a "System" %{TZ_SYS_DB}/.battery-monitor.db-journal
 %attr(755,-,-) %{_bindir}/batterymonitor-svcd
 %config %{_sysconfdir}/dbus-1/system.d/org.tizen.battery.monitor.conf
 %config %attr(755,root,root) %{power_profile_config_path}/bm_params.json
-%config %attr(755,root,root) %{power_profile_config_path}/bm_power_profile_params.json
+%config %attr(755,root,root) %{power_profile_config_path}/bm_power_profile_params_*.json
 %attr(644,root,root) %{_datadir}/dbus-1/system-services/*
 %attr(644,root,root) %{_unitdir}/batterymonitor.service
 %attr(644,root,root) %{_unitdir}/multi-user.target.wants/batterymonitor.service
index bfdbc18..0911957 100644 (file)
@@ -47,8 +47,9 @@ char event_map[32][4] = {"Enl", "Epr", "Efg", "Etp", "Esy", "Ewl", "Ejb", "Eur",
 char usage_map[32][4] = {"Bu", "Wu", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
        "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""};
 GHashTable *app_map = NULL;
+static long int lst_charge = -1;
 
-static int bd_print_pool_entry(int fd, int idx, history_tag_s *pool_info)
+static int bd_print_pool_entry(int fd, int idx, int pc, history_tag_s *pool_info)
 {
        ENTER;
 
@@ -62,7 +63,7 @@ static int bd_print_pool_entry(int fd, int idx, history_tag_s *pool_info)
        g_string_append_c(dump_p, ',');
        g_string_append(dump_p, DUMP_DATA_TAG_1);
        g_string_append_c(dump_p, ',');
-       g_string_append_printf(dump_p, "%d,", pool_info->sp_idx);
+       g_string_append_printf(dump_p, "%d,", pc);
        g_string_append_printf(dump_p, "%d,", pool_info->uid);
        g_string_append(dump_p, "\"");
 
@@ -110,32 +111,26 @@ static int bd_get_pool_entry_from_dump(int fd)
        int log_count = h_count; int pool_count = 0;
        for (int i = 0; i < log_count; i++) {
                history_tag_s *pool_info = NULL;
-               if (history_data[i].event_tag != NULL) {
+               if (history_data[i].event_tag != NULL && (history_data[i].event_code & ET_FLAG_START)) {
                        pool_info = history_data[i].event_tag;
-                       if (pool_count == pool_info->sp_idx) {
-                               ret = bd_print_pool_entry(fd, i, pool_info);
+                               ret = bd_print_pool_entry(fd, i, pool_count, pool_info);
                                pool_count++;
                                if (ret != BATTERY_MONITOR_ERROR_NONE)
                                        return BATTERY_MONITOR_ERROR_INTERNAL;
-                       }
                }
                if (history_data[i].wakelock_tag != NULL) {
                        pool_info = history_data[i].wakelock_tag;
-                       if (pool_count == pool_info->sp_idx) {
-                               ret = bd_print_pool_entry(fd, i, pool_info);
+                               ret = bd_print_pool_entry(fd, i, pool_count, pool_info);
                                pool_count++;
                                if (ret != BATTERY_MONITOR_ERROR_NONE)
                                        return BATTERY_MONITOR_ERROR_INTERNAL;
-                       }
                }
                if (history_data[i].wakereason_tag != NULL) {
                        pool_info = history_data[i].wakereason_tag;
-                       if (pool_count == pool_info->sp_idx) {
-                               ret = bd_print_pool_entry(fd, i, pool_info);
+                               ret = bd_print_pool_entry(fd, i, pool_count, pool_info);
                                pool_count++;
                                if (ret != BATTERY_MONITOR_ERROR_NONE)
                                        return BATTERY_MONITOR_ERROR_INTERNAL;
-                       }
                }
        }
 
@@ -143,6 +138,48 @@ static int bd_get_pool_entry_from_dump(int fd)
        return BATTERY_MONITOR_ERROR_NONE;
 }
 
+static int bd_get_and_print_system_base_battery_usage_from_dump(int fd, long int duration)
+{
+       ENTER;
+
+       int ret = BATTERY_MONITOR_ERROR_NONE;
+       float usage_mah = 0;
+       time_t crr_time = 0; time(&crr_time);
+       int uid_n = 1000; //For Tizen
+       // Base Resource usage;
+       const char *rid_str = NULL;
+       for (int i = 0; i < 6; i++) {
+               rid_str = bm_get_resource_id_string(i);
+               if (g_strcmp0(rid_str, "UNKNOWN RESOURCE-ID") == 0) {
+                       _ERR("invalid resource-id");
+                       return BATTERY_MONITOR_ERROR_INTERNAL;
+               }
+               resourceid_usage_s *res_use =
+                       bm_server_query_resource_base_usage_resourceid_ci(rid_str, duration, crr_time, &ret);
+               if (res_use == NULL || ret != BATTERY_MONITOR_ERROR_NONE) {
+                       _ERR("For resourceid %s", rid_str);
+                       continue;
+               }
+               usage_mah += res_use->usage;
+               bm_resourceid_usage_free(res_use);
+       }
+       usage_mah /= 3600;
+       GString *dump_p = NULL;
+       dump_p = g_string_sized_new(30);
+       BM_CHECK_MEM_ALLOC(dump_p, {});
+       g_string_append(dump_p, TIZEN_DUMP_VERSION);
+       g_string_append_printf(dump_p, ",%d,l,pwi,uid,", uid_n);
+       g_string_append_printf(dump_p, "%0.2f", usage_mah);
+       g_string_append(dump_p, "\n");
+       _DBG("%s", dump_p->str);
+       if (write(fd, dump_p->str, dump_p->len) < 0)
+               _WARN("write error");
+       g_string_free(dump_p, TRUE);
+
+       EXIT;
+       return ret;
+}
+
 static int bd_get_and_print_battery_usage_from_dump(int fd, long int duration)
 {
        ENTER;
@@ -151,6 +188,8 @@ static int bd_get_and_print_battery_usage_from_dump(int fd, long int duration)
        GHashTableIter iter;
        gpointer key, value; GString *dump_p = NULL;
        char *appid = NULL; int *uid_n = NULL;
+       time_t crr_time = 0; time(&crr_time);
+       long int end_t = crr_time;
        float usageMAh = 0; int battery_capacity = 500;//default
 
        ret = bm_get_battery_power_params(&battery_capacity);
@@ -180,7 +219,7 @@ static int bd_get_and_print_battery_usage_from_dump(int fd, long int duration)
                _DBG("%d %s", *uid_n, appid); usageMAh = 0;
                // Currently giving app usage of last one week;
                // Modify it wrt to time
-               appid_usage_s *app_use = bm_server_query_app_usage_by_appid(appid, 1, &ret);
+               appid_usage_s *app_use = bm_server_query_app_usage_by_appid_ci(appid, duration, end_t, &ret);
                if (app_use == NULL || ret != BATTERY_MONITOR_ERROR_NONE) {
                        _ERR("For appid %s", appid);
                        continue;
@@ -212,7 +251,7 @@ static int bd_get_and_print_battery_usage_from_dump(int fd, long int duration)
                        return BATTERY_MONITOR_ERROR_INTERNAL;
                }
                resourceid_usage_s *res_use =
-                       bm_server_query_resource_usage_resourceid(rid_str, 1, &ret);
+                       bm_server_query_resource_usage_resourceid_ci(rid_str, duration, end_t, &ret);
                if (res_use == NULL || ret != BATTERY_MONITOR_ERROR_NONE) {
                        _ERR("For resourceid %s", rid_str);
                        continue;
@@ -252,6 +291,10 @@ static int bd_get_and_print_battery_usage_from_dump(int fd, long int duration)
                g_string_free(dump_p, TRUE);
        }
 
+       ret = bd_get_and_print_system_base_battery_usage_from_dump(fd, duration);
+       if (ret != BATTERY_MONITOR_ERROR_NONE)
+               _ERR("Base usage dump failed");
+
        EXIT;
        return ret;
 }
@@ -318,9 +361,10 @@ static int bd_get_and_print_misc_stat_entry_from_dump(int fd, long int duration)
        g_string_append_printf(dump_p, "%ld,", on_time);
        g_string_append_printf(dump_p, "%ld", off_time);
        g_string_append(dump_p, "\n");
+/*
        _DBG("%s", dump_p->str);
        if (write(fd, dump_p->str, dump_p->len) < 0)
-               _WARN("write error");
+               _WARN("write error");*/
        g_string_free(dump_p, TRUE);
        BM_FREE(gbr_stat);
 
@@ -408,9 +452,10 @@ static int bd_get_and_print_gwf_stat_entry_from_dump(int fd, long int duration)
        g_string_append(dump_p, ",0,l,");
        g_string_append(dump_p, "gwfcd,");
        //idle rx pwi tx
+       float usage_mah = (float)gwfl_stat->wifi_pwi_val/3600;
        g_string_append_printf(dump_p, "%ld,", gwfl_stat->wifi_idle_time);
        g_string_append_printf(dump_p, "%ld,", gwfl_stat->wifi_rx_time);
-       g_string_append_printf(dump_p, "%ld,", gwfl_stat->wifi_pwi_val);
+       g_string_append_printf(dump_p, "%0.2f,", usage_mah);
        g_string_append_printf(dump_p, "%ld", gwfl_stat->wifi_tx_time);
        g_string_append(dump_p, "\n");
        _DBG("%s", dump_p->str);//write
@@ -443,10 +488,11 @@ static int bd_get_and_print_gble_stat_entry_from_dump(int fd, long int duration)
        g_string_append(dump_p, TIZEN_DUMP_VERSION);
        g_string_append(dump_p, ",0,l,");
        g_string_append(dump_p, "gble,");
+       float usage_mah = (float)gble_stat->ble_pwi_val/3600;
        g_string_append_printf(dump_p, "%ld,", gble_stat->ble_idle_time);
        g_string_append_printf(dump_p, "%ld,", gble_stat->ble_rx_time);
        g_string_append_printf(dump_p, "%ld,", gble_stat->ble_tx_time);
-       g_string_append_printf(dump_p, "%ld", gble_stat->ble_pwi_val);
+       g_string_append_printf(dump_p, "%0.2f", usage_mah);
        g_string_append(dump_p, "\n");
 
        _DBG("%s", dump_p->str);//write
@@ -556,9 +602,11 @@ static int bd_get_and_print_gcpu_stat_entry_from_dump(int fd, long int duration)
 
        int ret = BATTERY_MONITOR_ERROR_NONE;
        const char *rid_str = NULL; int usage = 0;
+       time_t crr_time = 0; time(&crr_time);
+       long int end_t = crr_time;
        rid_str = bm_get_resource_id_string(2);
        resourceid_usage_s *res_use =
-               bm_server_query_resource_usage_resourceid(rid_str, 1, &ret);
+               bm_server_query_resource_usage_resourceid_ci(rid_str, duration, end_t, &ret);
        if (res_use == NULL || ret != BATTERY_MONITOR_ERROR_NONE) {
                _ERR("For resourceid %s", rid_str);
                return ret;
@@ -611,7 +659,7 @@ static int bd_get_and_print_uid_info_entry_from_dump(int fd)
        dump_p = g_string_sized_new(30);
        BM_CHECK_MEM_ALLOC(dump_p, {bm_set_free_gslist_appid_map(list); });
        g_string_append(dump_p, TIZEN_DUMP_VERSION);
-       g_string_append(dump_p, ",0,i,uid,1000,tizen\n");
+       g_string_append(dump_p, ",0,i,uid,1000,Tizen\n");
        if (write(fd, dump_p->str, dump_p->len) < 0)
                _WARN("write error");
        g_string_free(dump_p, TRUE);
@@ -631,11 +679,16 @@ static int bd_get_and_print_uid_info_entry_from_dump(int fd)
                _DBG("%s", dump_p->str);//write
                if (write(fd, dump_p->str, dump_p->len) < 0)
                        _WARN("write error");
-               int *temp_id = (int *)malloc(4);
-               *temp_id = (amap_data->id + 10000);
-               _DBG("Insert id %d, str %s, res %d", *temp_id, temp_str,
-               g_hash_table_insert(app_map, temp_id, temp_str));
                g_string_free(dump_p, TRUE);
+               int *temp_id = (int *)calloc(1, sizeof(int));
+               if (temp_id != NULL) {
+                       *temp_id = (amap_data->id + 10000);
+                       _DBG("Insert id %d, str %s, res %d", *temp_id, temp_str,
+                       g_hash_table_insert(app_map, temp_id, temp_str));
+               } else {
+                       _WARN("Memory Allocation Failed");
+                       g_free(temp_str);
+               }
        }
        bm_set_free_gslist_appid_map(list);
 
@@ -699,9 +752,6 @@ static int bd_get_history_detail_from_dump(int index, history_item_s* dump_node)
        dump_node->event_tag = history_data[index].event_tag;
        if (dump_node->event_tag == NULL)
                _DBG("Event_Tag_NULL");
-       else//Remove
-               _DBG("%d %d %s", dump_node->event_tag->uid, dump_node->event_tag->sp_idx,
-               dump_node->event_tag->string_info->str);
        dump_node->wakelock_tag = history_data[index].wakelock_tag;
        if (dump_node->wakelock_tag == NULL)
                _DBG("Wakelock_Tag_NULL");
@@ -726,6 +776,30 @@ static int bd_get_history_detail_from_dump(int index, history_item_s* dump_node)
        return BATTERY_MONITOR_ERROR_NONE;
 }
 
+static void bd_get_last_charge_time(long int def_time, int *ret)
+{
+       ENTER;
+
+       if (lst_charge < 0) {
+               char *str = "battery";
+               resourceid_usage_s *bat_use = bm_server_query_battery_last_charge(str, ret);
+               if (*ret == BATTERY_MONITOR_ERROR_NONE) {
+                       if (bat_use->log_time > 0)
+                               lst_charge = bat_use->log_time;
+                       else
+                               lst_charge = def_time;
+                       _DBG("LC [%ld]", lst_charge);
+                       BM_FREE(bat_use);
+               } else {
+                       _ERR("LAST CHG time failed");
+                       lst_charge = def_time;
+               }
+       }
+
+       EXIT;
+       return;
+}
+
 int bd_print_history_item_reset(history_item_s* old_state)
 {
        ENTER;
@@ -1139,6 +1213,7 @@ int bd_print_history_item_main(int fd, int num_h_items, long long base_time, boo
        // Dump the elapsed time from last event
        // It should be dumped without storing
        GString *dump_tmp_p = g_string_sized_new(30);
+       BM_CHECK_MEM_ALLOC(dump_tmp_p, {});
        struct timeval tv;
        gettimeofday(&tv, NULL);
 
@@ -1159,8 +1234,10 @@ int bd_print_history_item_main(int fd, int num_h_items, long long base_time, boo
        if (ret != BATTERY_MONITOR_ERROR_NONE)
                _ERR("UID data dump failed");
        // Get Last charge time to dump "l" field
-       // for the time being dumping all data
-       long int duration = 0; //Time of last charge
+       long int duration = 0;
+       bd_get_last_charge_time(base_time/1000, &ret);
+       duration = lst_charge;
+
        ret = bd_get_and_print_gn_stat_entry_from_dump(fd, duration);
        if (ret != BATTERY_MONITOR_ERROR_NONE)
                _ERR("GN dump failed");
@@ -1186,8 +1263,6 @@ int bd_print_history_item_main(int fd, int num_h_items, long long base_time, boo
        if (ret != BATTERY_MONITOR_ERROR_NONE)
                _ERR("MISc data dump failed");
        // Battery Usage Dump
-       // Add usage for each of the resource
-       // and each of the application
        ret = bd_get_and_print_battery_usage_from_dump(fd, duration);
        if (ret != BATTERY_MONITOR_ERROR_NONE)
                _ERR("Battery Usage failed");
@@ -1233,21 +1308,15 @@ static int bd_free_history_data_memory()
        _DBG("Free History Data Memory");
        for (int i = 0; i < h_count; i++) {
                if (history_data[i].wakelock_tag != NULL) {
-                       _DBG("WL str");
                        g_string_free(history_data[i].wakelock_tag->string_info, TRUE);
-                       _DBG("WL");
                        free(history_data[i].wakelock_tag);
                }
                if (history_data[i].wakereason_tag != NULL) {
-                       _DBG("WR str");
                        g_string_free(history_data[i].wakereason_tag->string_info, TRUE);
-                       _DBG("WR");
                        free(history_data[i].wakereason_tag);
                }
                if (history_data[i].event_tag != NULL) {
-                       _DBG("ET str");
                        g_string_free(history_data[i].event_tag->string_info, TRUE);
-                       _DBG("ET");
                        free(history_data[i].event_tag);
                }
                ret = bd_dump_data_item_reset(&history_data[i]);
@@ -1277,6 +1346,9 @@ static int bd_set_history_from_listener(history_item_s* nrec)
        history_data[h_count].time_s = ((long long)tv.tv_sec * 1000) + ((long long)tv.tv_usec / 1000);
 #endif
 
+       if (nrec->battery_plugtype == BD_BPLT_AC || nrec->battery_plugtype == BD_BPLT_WL)
+               lst_charge = tv.tv_sec;
+
        dvar1 = ((nrec->cmd_s) & 0xff) | ((nrec->battery_level << 8) & 0xff00) |
                ((nrec->battery_status << 16) & 0xf0000) |
                ((nrec->battery_health << 20) & 0xf00000) |
@@ -1401,7 +1473,7 @@ int bd_initialize_battery_dump()
        int ret = BATTERY_MONITOR_ERROR_NONE;
 
        h_count = 0; h_flag = true;
-
+       lst_charge = -1;
 #ifdef DUMP_DUMMY
        bd_dummy_test_fn();
 #else
@@ -1439,6 +1511,16 @@ int bd_deinitialize_battery_dump()
                return BATTERY_MONITOR_ERROR_NOT_INITIALIZED;
        }
 
+       if (lst_charge != -1) {
+               resourceid_usage_s battery_use;
+               battery_use.ResourceId = "battery";
+               battery_use.log_time = lst_charge;
+               battery_use.usage = 0;
+               ret = bm_server_resource_base_usage_insert_to_db(&battery_use);
+               if (ret != BATTERY_MONITOR_ERROR_NONE)
+                       _WARN("Battery Time Insert fail");
+       }
+
        ret = bd_free_history_data_memory();
        if (ret != BATTERY_MONITOR_ERROR_NONE)
                _WARN("memory free failed (%x)", ret);
index 74ca5ab..bec0915 100644 (file)
@@ -15,8 +15,6 @@
  *
  */
 
-
-
 #include "bm_listeners.h"
 #include "bm_dbg.h"
 #include <bm_common.h>
@@ -26,6 +24,7 @@
 #include <sys/time.h>
 #include <TapiUtility.h>
 #include <ITapiNetwork.h>
+#include <glib.h>
 
 wifi_manager_h wifi = NULL;
 static bool display_on;
@@ -35,11 +34,14 @@ static int ss_val = 0;
 static int ss_flag = 0;
 static history_item_s *data_obj = NULL;
 
-static int listener_hsp = 0;
+display_state_e display_flag = DISPLAY_STATE_SCREEN_OFF;
+static int listener_hsp = -1;
+static int bt_adaptor = 0;
+static int location_flag = 0;
 static int bt_hsp = 0;
 static int bt_connected_hsp = 0;
 static int bt_scan_hsp = 0;
-static int bt_discovery_state = 0;
+static int bt_discovery_state = 1;
 static int bt_flag = 0;
 static int wifi_flag = 0;
 static int wifi_hsp = 0;
@@ -47,18 +49,73 @@ static int wifi_scan_hsp = 0;
 static int wifi_connected_hsp = 0;
 static int display_hsp = 0;
 static int gps_hsp = 0;
-static int charging_hsp = 0;
+static int lock_hsp = 0;
+static int app_hsp = 0;
+//static int charging_hsp = 0;
+static int wakeup_hsp = 0;
+static int modem_hsp = 0;
+static int modem_flag = 0;
+static int prev_wakeup = 0;
+static int prev_lock = 0;
+static int prev_battery_level = 0;
 static event_pool events_buf[10];
 static int buff_count = 0;
+static pthread_attr_t attr;
 static pthread_cond_t fill = PTHREAD_COND_INITIALIZER;
 static pthread_cond_t empty = PTHREAD_COND_INITIALIZER;
 static pthread_mutex_t battery_lister_mutex = PTHREAD_MUTEX_INITIALIZER;
 static int fill_ptr = 0;
 static int use_ptr = 0;
 static TapiHandle *handle = NULL;
+GHashTable *app_list = NULL;
+
+#define DBUS_DEVICED "org.tizen.system.deviced"
+#define DBUS_DEVICED_PATH "/Org/Tizen/System/DeviceD/Display"
+#define DBUS_DEVICED_IFACE "org.tizen.system.deviced.display"
+#define DBUS_DEVICED_PL_MEMBER "PowerLock"
+#define DBUS_DEVICED_PU_MEMBER "PowerUnlock"
+#define DBUS_DEVICED_SLEEP_MEMBER "sleep"
+#define DBUS_DEVICED_WAKEUP_MEMBER "wakeup"
+
+static GDBusConnection *dbus_connection;
+
+static int bm_listener_dbus_init(void)
+{
+       ENTER;
+
+       GDBusConnection *conn;
+       GError *err = NULL;
+
+       if (dbus_connection) {
+               _DBG("dbus connection already initialized");
+               return 0;
+       }
+
+       conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &err);
+       if (!conn || err) {
+               _ERR("failed to get dbus connection:%s", err->message);
+               g_error_free(err);
+               conn = NULL;
+               return -1;
+       }
+
+       dbus_connection = conn;
+
+       EXIT;
+       return 0;
+}
 
+int bm_listener_dbus_deinit()
+{
+       ENTER;
 
+       if (dbus_connection)
+               g_object_unref(dbus_connection);
+       dbus_connection = NULL;
 
+       EXIT;
+       return BATTERY_MONITOR_ERROR_NONE;
+}
 
 static int bm_battery_level_listener()
 {
@@ -76,9 +133,6 @@ static int bm_battery_level_listener()
        return battery_level;
 }
 
-
-
-
 static int bm_battery_status_listener()
 {
        ENTER;
@@ -92,7 +146,6 @@ static int bm_battery_status_listener()
        }
 
        BD_BSTA_IDX bm_status;
-
        if (battery_status == DEVICE_BATTERY_STATUS_CHARGING)
                bm_status = BD_BSTA_CHAR;
        else if (battery_status == DEVICE_BATTERY_STATUS_DISCHARGING)
@@ -108,8 +161,6 @@ static int bm_battery_status_listener()
        return bm_status;
 }
 
-
-
 static int bm_battery_health_listener()
 {
        ENTER;
@@ -123,7 +174,6 @@ static int bm_battery_health_listener()
                return -1;
        }
 
-
        if (health == DEVICE_BATTERY_HEALTH_GOOD)
                bm_health = BD_BHLT_GOOD;
        else if (health == DEVICE_BATTERY_HEALTH_COLD)
@@ -137,13 +187,10 @@ static int bm_battery_health_listener()
        else
                return BD_BHLT_NONE;
 
-
        EXIT;
        return bm_health;
 }
 
-
-
 static int bm_battery_plugtype_listener()
 {
        ENTER;
@@ -156,7 +203,6 @@ static int bm_battery_plugtype_listener()
                return -1;
        }
 
-
        BD_BPLT_IDX bm_plugtype = BD_BPLT_NONE;
        if (source == DEVICE_BATTERY_POWER_SOURCE_AC)
                bm_plugtype = BD_BPLT_AC;
@@ -179,24 +225,22 @@ static int bm_battery_voltage_temperature_charge_listener(history_item_s *ts)
        int val, ret;
 
        /* get the battery voltage*/
-
-               property = DEVICE_BATTERY_PROPERTY_VOLTAGE_NOW;
-               ret = device_battery_get_property(property, &val);
-               if (ret != BATTERY_MONITOR_ERROR_NONE) {
-                       _ERR("Failed to get battery voltage (%d)", ret);
-                       return ret;
-               }
-               ts->battery_voltage = val;
+       property = DEVICE_BATTERY_PROPERTY_VOLTAGE_NOW;
+       ret = device_battery_get_property(property, &val);
+       if (ret != BATTERY_MONITOR_ERROR_NONE) {
+               _ERR("Failed to get battery voltage (%d)", ret);
+               return ret;
+       }
+       ts->battery_voltage = val;
 
        /* get the battery temperature*/
-
-               property = DEVICE_BATTERY_PROPERTY_TEMPERATURE;
-               ret = device_battery_get_property(property, &val);
-               if (ret != BATTERY_MONITOR_ERROR_NONE) {
-                       _ERR("Failed to get battery temperature (%d)", ret);
-                       return ret;
-               }
-               ts->battery_temperature = val;
+       property = DEVICE_BATTERY_PROPERTY_TEMPERATURE;
+       ret = device_battery_get_property(property, &val);
+       if (ret != BATTERY_MONITOR_ERROR_NONE) {
+               _ERR("Failed to get battery temperature (%d)", ret);
+               return ret;
+       }
+       ts->battery_temperature = val;
 
        /* get the battery charge*/
        /*      property = DEVICE_BATTERY_PROPERTY_CAPACITY;
@@ -207,20 +251,18 @@ static int bm_battery_voltage_temperature_charge_listener(history_item_s *ts)
                }
                _INFO("success to get battery capacity (%d)", ret);
        */
-               ts->battery_charge = 0;
+
+       ts->battery_charge = 0;
        EXIT;
        return BATTERY_MONITOR_ERROR_NONE;
 }
 
-
-
-
 static void fill_bt_adapter_state_changed_data(int adapter_state)
 {
        ENTER;
 
        _INFO("state: %s", (adapter_state == BT_ADAPTER_ENABLED) ? "ENABLED" : "DISABLED");
-       int bt_state ;
+       int bt_state;
        if (adapter_state == BT_ADAPTER_ENABLED)
                bt_state = 1;
        else
@@ -228,7 +270,6 @@ static void fill_bt_adapter_state_changed_data(int adapter_state)
 
        _INFO("__bm_bt_adapter_state_changed_cb  bt_state = %d ", bt_state);
 
-
        if (data_obj) {
                if (adapter_state == BT_ADAPTER_ENABLED) {
                        data_obj->event_code = ET_NONE;
@@ -245,7 +286,6 @@ static void fill_bt_adapter_state_changed_data(int adapter_state)
                                _ERR("  data_obj->event_tag object creation fails ");
                                return;
                        }
-
                        data_obj->state_2 |= ST2_BLUETOOTH_ON_FLAG;
                } else {
                        data_obj->event_code = ET_NONE;
@@ -258,29 +298,20 @@ static void fill_bt_adapter_state_changed_data(int adapter_state)
                                data_obj->event_tag->sp_idx = bt_hsp;
                        } else {
                                _ERR("  data_obj->event_tag object creation fails ");
-                               return ;
+                               return;
                        }
-
                        data_obj->state_2 &= ~(ST2_BLUETOOTH_ON_FLAG);
                }
        }
 
        EXIT;
        return;
-
-
-
 }
 
-
-
-
-
 static void fill_bt_device_discovery_state_changed_data(int discovery_state)
 {
-
        ENTER;
-       _INFO("__bt_adapter_state_changed_cb");
+
        _INFO(" discovery_state = %d", discovery_state);
 
        if (data_obj) {
@@ -301,12 +332,11 @@ static void fill_bt_device_discovery_state_changed_data(int discovery_state)
                                data_obj->event_tag->sp_idx = bt_scan_hsp;
                        } else {
                                _ERR("  data_obj->event_tag object creation fails ");
-                               return ;
+                               return;
                        }
                        data_obj->state_2 |= ST2_BLUETOOTH_SCAN_FLAG;
                        break;
                case BT_ADAPTER_DEVICE_DISCOVERY_FINISHED:
-
                        data_obj->event_code = ET_NONE;
                        data_obj->event_code = ET_CONNECTIVITY_CHANGED;
                        data_obj->event_code |= ET_FLAG_FINISH;
@@ -317,7 +347,7 @@ static void fill_bt_device_discovery_state_changed_data(int discovery_state)
                                data_obj->event_tag->sp_idx = bt_scan_hsp;
                        } else {
                                _ERR("  data_obj->event_tag object creation fails ");
-                               return ;
+                               return;
                        }
                        data_obj->state_2 &= ~(ST2_BLUETOOTH_SCAN_FLAG);
                        bt_flag = 0;
@@ -328,13 +358,9 @@ static void fill_bt_device_discovery_state_changed_data(int discovery_state)
        }
 
        EXIT;
-
+       return;
 }
 
-
-
-
-
 static void fill_bt_device_connection_state_changed_data(int connected)
 {
        ENTER;
@@ -343,7 +369,6 @@ static void fill_bt_device_connection_state_changed_data(int connected)
        if (!connected)
                _INFO("bt is disconnected");
 
-
        if (data_obj) {
                if (connected) {
                        data_obj->event_code = ET_NONE;
@@ -377,9 +402,9 @@ static void fill_bt_device_connection_state_changed_data(int connected)
        }
 
        EXIT;
+       return;
 }
 
-
 static void fill_wifi_device_state_data(int state)
 {
        ENTER;
@@ -394,8 +419,8 @@ static void fill_wifi_device_state_data(int state)
        if (data_obj) {
                if (state == WIFI_MANAGER_DEVICE_STATE_ACTIVATED) {
                        data_obj->event_code = ET_NONE;
+                       data_obj->event_code |= ET_ACTIVE;
                        data_obj->event_code |= ET_FLAG_START;
-                       data_obj->event_code |= ET_CONNECTIVITY_CHANGED;
                        data_obj->event_tag = NULL;
                        data_obj->event_tag = (history_tag_s *)calloc(1, sizeof(history_tag_s));
                        if (data_obj->event_tag) {
@@ -405,13 +430,13 @@ static void fill_wifi_device_state_data(int state)
                                data_obj->event_tag->sp_idx = wifi_hsp;
                        } else {
                                _ERR("  data_obj->event_tag object creation fails ");
-                               return ;
+                               return;
                        }
                        data_obj->state_2 |= ST2_WIFI_ON_FLAG;
                } else {
                        data_obj->event_code = ET_NONE;
+                       data_obj->event_code |= ET_ACTIVE;
                        data_obj->event_code |= ET_FLAG_FINISH;
-                       data_obj->event_code |= ET_CONNECTIVITY_CHANGED;
                        data_obj->event_tag = NULL;
                        data_obj->event_tag = (history_tag_s *)calloc(1, sizeof(history_tag_s));
                        if (data_obj->event_tag) {
@@ -419,26 +444,21 @@ static void fill_wifi_device_state_data(int state)
                                data_obj->event_tag->sp_idx = wifi_hsp;
                        } else {
                                _ERR("  data_obj->event_tag object creation fails ");
-                               return ;
+                               return;
                        }
                        data_obj->state_2 &= ~(ST2_WIFI_ON_FLAG);
                }
        }
 
-
-
        EXIT;
+       return;
 }
 
-
-
-
 static void fill_wifi_scan_changed_data(int state)
 {
        ENTER;
 
        _INFO("Wifi Scan changed, scan state : %d\n", state);
-
        if (data_obj) {
                if (state == WIFI_MANAGER_SCAN_STATE_SCANNING) {
                        data_obj->event_code = ET_NONE;
@@ -447,7 +467,7 @@ static void fill_wifi_scan_changed_data(int state)
                        data_obj->event_tag = NULL;
                        data_obj->event_tag = (history_tag_s *)calloc(1, sizeof(history_tag_s));
                        if (data_obj->event_tag) {
-                               if (!wifi_flag) {
+                               if (!wifi_flag) {
                                        listener_hsp++;
                                        wifi_scan_hsp = listener_hsp;
                                        wifi_flag = 1;
@@ -456,7 +476,7 @@ static void fill_wifi_scan_changed_data(int state)
                                data_obj->event_tag->sp_idx = wifi_scan_hsp;
                        } else {
                                _ERR("  data_obj->event_tag object creation fails ");
-                               return ;
+                               return;
                        }
                        data_obj->state_1 |= ST1_WIFI_SCAN_FLAG;
                } else {
@@ -470,7 +490,7 @@ static void fill_wifi_scan_changed_data(int state)
                                data_obj->event_tag->sp_idx = wifi_scan_hsp;
                        } else {
                                _ERR("  data_obj->event_tag object creation fails ");
-                               return ;
+                               return;
                        }
                        data_obj->state_1 &= ~(ST1_WIFI_SCAN_FLAG);
                        wifi_flag = 0;
@@ -478,9 +498,9 @@ static void fill_wifi_scan_changed_data(int state)
        }
 
        EXIT;
+       return;
 }
 
-
 static void fill_wifi_connection_state_changed_data(int state)
 {
        ENTER;
@@ -502,7 +522,7 @@ static void fill_wifi_connection_state_changed_data(int state)
                                data_obj->event_tag->sp_idx = wifi_connected_hsp;
                        } else {
                                _ERR("  data_obj->event_tag object creation fails ");
-                               return ;
+                               return;
                        }
                        break;
                case WIFI_MANAGER_CONNECTION_STATE_DISCONNECTED:
@@ -516,7 +536,7 @@ static void fill_wifi_connection_state_changed_data(int state)
                                data_obj->event_tag->sp_idx = wifi_connected_hsp;
                        } else {
                                _ERR("  data_obj->event_tag object creation fails ");
-                               return ;
+                               return;
                        }
                        break;
                default:
@@ -525,12 +545,9 @@ static void fill_wifi_connection_state_changed_data(int state)
        }
 
        EXIT;
+       return;
 }
 
-
-
-
-
 static void fill_device_display_change(int value)
 {
        ENTER;
@@ -552,7 +569,7 @@ static void fill_device_display_change(int value)
                        data_obj->event_tag->sp_idx = display_hsp;
                } else {
                        _ERR("  data_obj->event_tag object creation fails ");
-                       return ;
+                       return;
                }
                data_obj->state_1 |= ST1_SCREEN_ON_FLAG;
                data_obj->state_1 &= ~(ST1_SCREEN_DOZE_FLAG);
@@ -561,14 +578,15 @@ static void fill_device_display_change(int value)
                _INFO("Display dim");
                data_obj->event_code = ET_NONE;
                data_obj->event_tag = NULL;
-               data_obj->event_tag = (history_tag_s *)calloc(1, sizeof(history_tag_s));
+/*             data_obj->event_tag = (history_tag_s *)calloc(1, sizeof(history_tag_s));
                if (data_obj->event_tag) {
                        _INFO("event Tag creation succeeded \n");
                        data_obj->event_tag->sp_idx = display_hsp;
                } else {
                        _ERR("  data_obj->event_tag object creation fails ");
-                       return ;
+                       return;
                }
+*/
                data_obj->state_1 |= ST1_SCREEN_DOZE_FLAG;
                break;
        case DISPLAY_STATE_SCREEN_OFF:
@@ -583,7 +601,7 @@ static void fill_device_display_change(int value)
                        data_obj->event_tag->sp_idx = display_hsp;
                } else {
                        _ERR("  data_obj->event_tag object creation fails ");
-                       return ;
+                       return;
                }
                data_obj->state_1 &= ~(ST1_SCREEN_ON_FLAG);
                data_obj->state_1 &= ~(ST1_SCREEN_DOZE_FLAG);
@@ -591,12 +609,10 @@ static void fill_device_display_change(int value)
                break;
        }
 
-
        EXIT;
+       return;
 }
 
-
-
 static void fill_display_brightness_change(int brightness_level)
 {
        ENTER;
@@ -611,9 +627,9 @@ static void fill_display_brightness_change(int brightness_level)
        }
 
        EXIT;
+       return;
 }
 
-
 static void fill_battery_capacity_change(int charging_level)
 {
        ENTER;
@@ -625,10 +641,9 @@ static void fill_battery_capacity_change(int charging_level)
        }
 
        EXIT;
+       return;
 }
 
-
-
 static void fill_charging_status_change(int charging)
 {
        ENTER;
@@ -637,8 +652,9 @@ static void fill_charging_status_change(int charging)
        if (data_obj) {
                if (charging) {
                        data_obj->event_code = ET_NONE;
-                       data_obj->event_code |= ET_FLAG_START;
+//                     data_obj->event_code |= ET_FLAG_START;
                        data_obj->event_tag = NULL;
+/*
                        data_obj->event_tag = (history_tag_s *)calloc(1, sizeof(history_tag_s));
                        if (data_obj->event_tag) {
                                listener_hsp++;
@@ -646,34 +662,33 @@ static void fill_charging_status_change(int charging)
                                _INFO("event Tag creation succeeded \n");
                                data_obj->event_tag->sp_idx = charging_hsp;
                        } else {
-                               _ERR("  data_obj->event_tag object creation fails ");
+                               _ERR(" data_obj->event_tag object creation fails ");
                                return;
                        }
-
+*/
                        data_obj->state_2 |= ST2_CHARGING_FLAG;
                } else {
                        data_obj->event_code = ET_NONE;
-                       data_obj->event_code |= ET_FLAG_FINISH;
+//                     data_obj->event_code |= ET_FLAG_FINISH;
                        data_obj->event_tag = NULL;
+/*
                        data_obj->event_tag = (history_tag_s *)calloc(1, sizeof(history_tag_s));
                        if (data_obj->event_tag) {
                                _INFO("event Tag creation succeeded \n");
                                data_obj->event_tag->sp_idx = charging_hsp;
                        } else {
-                               _ERR("  data_obj->event_tag object creation fails ");
-                               return ;
+                               _ERR(" data_obj->event_tag object creation fails ");
+                               return;
                        }
-
+*/
                        data_obj->state_2 &= ~(ST2_CHARGING_FLAG);
                }
        }
 
        EXIT;
+       return;
 }
 
-
-
-
 static void fill_signal_strength_change(int ss)
 {
        ENTER;
@@ -688,10 +703,64 @@ static void fill_signal_strength_change(int ss)
        }
 
        EXIT;
+       return;
 }
 
 
+static void fill_sleep_wakeup_change(int val)
+{
+       ENTER;
+
+       _INFO(" sleep/wake up changed =%d ", val);
+       if (val) {
+               data_obj->event_code = ET_NONE;
+               data_obj->event_tag = NULL;
+               data_obj->wakereason_tag = NULL;
+               data_obj->wakereason_tag = (history_tag_s *)calloc(1, sizeof(history_tag_s));
+               if (data_obj->wakereason_tag) {
+                       listener_hsp++;
+                       wakeup_hsp = listener_hsp;
+                       _INFO("Wakereason Tag creation succeeded \n");
+                       data_obj->wakereason_tag->sp_idx = wakeup_hsp;
+                       data_obj->wakereason_tag->uid = 1000;
+                       data_obj->wakereason_tag->string_info = g_string_sized_new(10);
+                       if (data_obj->wakereason_tag->string_info == NULL) {
+                               _ERR("data_obj->wakereason_tag->string_info creation failed");
+                               BM_FREE(data_obj->wakereason_tag);
+                               return;
+                       }
+                       g_string_append_printf(data_obj->wakereason_tag->string_info, "%s", "Tizen");
+               } else {
+                       _ERR(" data_obj->wakereason_tag object creation fails ");
+                       return;
+               }
+               data_obj->state_1 |= ST1_CPU_RUNNING_FLAG;
+       } else {
+               data_obj->event_code = ET_NONE;
+               data_obj->event_tag = NULL;
+               data_obj->wakereason_tag = NULL;
+               data_obj->wakereason_tag = (history_tag_s *)calloc(1, sizeof(history_tag_s));
+               if (data_obj->wakereason_tag) {
+                       _INFO("Wakereason Tag creation succeeded \n");
+                       data_obj->wakereason_tag->sp_idx = wakeup_hsp;
+                       data_obj->wakereason_tag->uid = 1000;
+                       data_obj->wakereason_tag->string_info = g_string_sized_new(10);
+                       if (data_obj->wakereason_tag->string_info == NULL) {
+                               _ERR("data_obj->wakereason_tag->string_info creation failed");
+                               BM_FREE(data_obj->wakereason_tag);
+                               return;
+                       }
+                       g_string_append_printf(data_obj->wakereason_tag->string_info, "%s", "Tizen");
+               } else {
+                       _ERR(" data_obj->wakereason_tag object creation fails ");
+                       return;
+               }
+               data_obj->state_1 &= ~(ST1_CPU_RUNNING_FLAG);
+       }
 
+       EXIT;
+       return;
+}
 
 static void fill_location_change(int gps)
 {
@@ -711,10 +780,9 @@ static void fill_location_change(int gps)
                                _INFO("event Tag creation succeeded \n");
                                data_obj->event_tag->sp_idx = gps_hsp;
                        } else {
-                               _ERR("  data_obj->event_tag object creation fails ");
+                               _ERR(" data_obj->event_tag object creation fails ");
                                return;
                        }
-
                        data_obj->state_1 |= ST1_GPS_ON_FLAG;
                } else {
                        data_obj->event_code = ET_NONE;
@@ -726,27 +794,199 @@ static void fill_location_change(int gps)
                                _INFO("event Tag creation succeeded \n");
                                data_obj->event_tag->sp_idx = gps_hsp;
                        } else {
-                               _ERR("  data_obj->event_tag object creation fails ");
-                               return ;
+                               _ERR(" data_obj->event_tag object creation fails ");
+                               return;
                        }
-
                        data_obj->state_1 &= ~(ST1_GPS_ON_FLAG);
                }
        }
 
+       EXIT;
+       return;
+}
+
+static int fill_power_lock_unlock_change(int lock)
+{
+       ENTER;
+
+       _INFO(" fill_powerlock_change changed =%d ", lock);
+       if(prev_wakeup == lock)
+               return 1;
+       else
+               prev_wakeup = lock;
+
+       if (data_obj) {
+               if (lock) {
+                       data_obj->event_code = ET_NONE;
+//                     data_obj->event_code |= ET_WAKE_LOCK;
+//                     data_obj->event_code |= ET_FLAG_START;
+                       data_obj->wakelock_tag = NULL;
+                       data_obj->event_tag = NULL;
+                       data_obj->wakelock_tag = (history_tag_s *)calloc(1, sizeof(history_tag_s));
+                       if (data_obj->wakelock_tag) {
+                               listener_hsp++;
+                               lock_hsp = listener_hsp;
+                               _INFO("wakelock Tag creation succeeded \n");
+                               data_obj->wakelock_tag->sp_idx = lock_hsp;
+                               data_obj->wakelock_tag->uid = 1000;
+                               data_obj->wakelock_tag->string_info = g_string_sized_new(10);
+                               BM_CHECK_MEM_ALLOC(data_obj->wakelock_tag->string_info, {BM_FREE(data_obj->wakelock_tag); });
+                               g_string_append_printf(data_obj->wakelock_tag->string_info, "%s", "Tizen");
+                               //WRITE THE WL TAG
+                       } else {
+                               _ERR(" data_obj->wakelock_tag object creation fails ");
+                               return 1;
+                       }
+                       data_obj->state_1 |= ST1_WAKE_LOCK_FLAG;
+               } else {
+                       data_obj->event_code = ET_NONE;
+//                     data_obj->event_code |= ET_WAKE_LOCK;
+//                     data_obj->event_code |= ET_FLAG_FINISH;
+                       data_obj->wakelock_tag = NULL;
+                       data_obj->event_tag = NULL;
+                       //WAKE LOCK TAG INFORMATION NOT REQ. AT UNSET.
+/*
+                       data_obj->wakelock_tag = (history_tag_s *)calloc(1, sizeof(history_tag_s));
+                       if (data_obj->wakelock_tag) {
+                               _INFO("event Tag creation succeeded \n");
+                               data_obj->wakelock_tag->sp_idx = lock_hsp;
+                       } else {
+                               _ERR("data_obj->event_tag object creation fails ");
+                               return 1;
+                       }
+*/
+                       data_obj->state_1 &= ~(ST1_WAKE_LOCK_FLAG);
+               }
+       }
+
+       EXIT;
+       return 0;
+}
+
+static int fill_app_status_change(int val, char *app_id)
+{
+       ENTER;
+
+       void *prv_data = NULL;
+       void *prv_app_id = NULL;
+
+       _INFO(" App status changed for = %s ", app_id);
+       if (data_obj) {
+               if (val) {
+                       data_obj->event_code = ET_NONE;
+                       data_obj->event_code |= ET_FOREGROUND;
+                       data_obj->event_code |= ET_FLAG_START;
+                       data_obj->event_tag = NULL;
+                       data_obj->event_tag = (history_tag_s *)calloc(1, sizeof(history_tag_s));
+                       if (data_obj->event_tag) {
+                               listener_hsp++;
+                               app_hsp = listener_hsp;
+                               _INFO("event Tag creation succeeded \n");
+                               data_obj->event_tag->sp_idx = app_hsp;
+                               if (g_hash_table_lookup_extended(app_list, app_id, &prv_app_id, &prv_data) == true) {
+                                       _INFO(" This App is already present in the list  ");
+                                       int *temp = (int *)prv_data;
+                                       *temp = app_hsp;
+                                       _INFO(" sp index for this app id is = %d and apphsp= %d", *temp, app_hsp);
+                               } else {
+                                       int *temp = (int *)calloc(1, sizeof(int));
+                                       if (temp == NULL) {
+                                               _ERR("memory allocation failed");
+                                               return 1;
+                                       }
+                                       *temp = app_hsp;
+                                       _INFO(" This App is not present in the list , inserting it ");
+                                       g_hash_table_insert(app_list, app_id, temp);
+                               }
+                       } else {
+                               _ERR(" data_obj->event_tag object creation fails ");
+                               return 1;
+                       }
+               } else {
+                       data_obj->event_code = ET_NONE;
+                       data_obj->event_code |= ET_FOREGROUND;
+                       data_obj->event_code |= ET_FLAG_FINISH;
+                       data_obj->event_tag = NULL;
+                       data_obj->event_tag = (history_tag_s *)calloc(1, sizeof(history_tag_s));
+                       if (data_obj->event_tag) {
+                               _INFO("event Tag creation succeeded \n");
+                               _INFO("looking for key = %s \n",app_id);
+                               if (g_hash_table_lookup_extended(app_list, app_id, &prv_app_id, &prv_data) == true) {
+                                       _INFO("found  key = %s \n", (char *)prv_app_id);
+                                       int *tmp = (int *)prv_data;
+                                       app_hsp = *tmp;
+                               } else {
+                                       _INFO(" This App is not present in the list and in background");
+                                       return 1;
+                               }
+                               data_obj->event_tag->sp_idx = app_hsp;
+                       } else {
+                               _ERR(" data_obj->event_tag object creation fails ");
+                               return 1;
+                       }
+               }
+       }
 
        EXIT;
+       return 0;
 }
 
+static void fill_modem_power_state_change(int state)
+{
+       ENTER;
+
+       _INFO("fill_modem_power_state_change - state[%d]", state);
+
+       if (data_obj && state == 0) { /* ON */
+               data_obj->event_code = ET_NONE;
+               data_obj->event_code |= ET_ACTIVE;
+               data_obj->event_code |= ET_FLAG_START;
+               data_obj->event_tag = NULL;
+
+               data_obj->event_tag = (history_tag_s *)calloc(1, sizeof(history_tag_s));
+               if (data_obj->event_tag) {
+                       listener_hsp++;
+                       modem_hsp = listener_hsp;
+                       data_obj->event_tag->sp_idx = modem_hsp;
+                       _DBG("ON event tag - success");
+               } else {
+                       _ERR("ON event tag - failure");
+                       return;
+               }
+
+               data_obj->state_1 |= ST1_MOBILE_RADIO_ACTIVE_FLAG;
+
+       } else if (data_obj && state == 1) { /* OFF */
+               data_obj->event_code = ET_NONE;
+               data_obj->event_code |= ET_ACTIVE;
+               data_obj->event_code |= ET_FLAG_FINISH;
+               data_obj->event_tag = NULL;
+
+               data_obj->event_tag = (history_tag_s *)calloc(1, sizeof(history_tag_s));
+               if (data_obj->event_tag) {
+                       data_obj->event_tag->sp_idx = modem_hsp;
+                       _DBG("OFF event tag - success");
+               } else {
+                       _ERR("OFF event tag - failure");
+                       return;
+               }
+
+               data_obj->state_1 &= ~(ST1_MOBILE_RADIO_ACTIVE_FLAG);
+
+       } else {
+               _ERR("invalid data-object or state");
+       }
 
+       EXIT;
+       return;
+}
 
-static void bm_create_event_data(int type, int val)
+static void bm_create_event_data(int type, int val, char *app)
 {
        ENTER;
        if (!data_obj)
                return;
 
-
        switch (type) {
        case LISTEN_BT_STATE:
                fill_bt_adapter_state_changed_data(val);
@@ -784,11 +1024,26 @@ static void bm_create_event_data(int type, int val)
        case LISTEN_SIGNAL_STRENGTH_CHANGE:
                fill_signal_strength_change(val);
                break;
+       case LISTEN_POWERLOCKUNLOCK_STATE:
+               if (fill_power_lock_unlock_change(val) == BATTERY_MONITOR_ERROR_NONE)
+                       break;
+               else
+                       return;
+       case LISTEN_SLEEP_WAKEUP_STATE:
+               fill_sleep_wakeup_change(val);
+               break;
+       case LISTEN_APP_STATUS:
+               if (fill_app_status_change(val, app) == BATTERY_MONITOR_ERROR_NONE)
+                       break;
+               else
+                       return;
+       case LISTEN_MODEM_POWER_STATE:
+               fill_modem_power_state_change(val);
+               break;
        default:
                return;
        }
 
-
        data_obj->cmd_s = CM_UPD;
        data_obj->time_current = 0;
 
@@ -800,48 +1055,60 @@ static void bm_create_event_data(int type, int val)
        if (data_obj->battery_level < 0) {
                _ERR("Failed to get  ts->battery_level = %d ", data_obj->battery_level);
                return;
-       }
-
+       } else {
+               if (type == LISTEN_BATTERY_CAPACITY_CHANGE && prev_battery_level == data_obj->battery_level)
+                       return;
+               else
+                       prev_battery_level = data_obj->battery_level;
+       }
+
        data_obj->battery_status = bm_battery_status_listener();
        if (data_obj->battery_status < 0) {
-               _ERR("Failed to get   ts->battery_status = %d ", data_obj->battery_status);
+               _ERR("Failed to get ts->battery_status = %d ", data_obj->battery_status);
                return;
        }
 
        data_obj->battery_health = bm_battery_health_listener();
        if (data_obj->battery_health < 0) {
-               _ERR("Failed to get  ts->battery_health = %d ", data_obj->battery_health);
+               _ERR("Failed to get ts->battery_health = %d ", data_obj->battery_health);
                return;
        }
 
        data_obj->battery_plugtype = bm_battery_plugtype_listener();
        if (data_obj->battery_plugtype < 0)
-               _WARN("Failed to get   ts->battery_plugtype = %d ", data_obj->battery_plugtype);
+               _WARN("Failed to get ts->battery_plugtype = %d ", data_obj->battery_plugtype);
 
-       _INFO("battery_level = %d , battery_status = %d , battery_health = %d , battery_plugtype = %d ", data_obj->battery_level , data_obj->battery_status , data_obj->battery_health, data_obj->battery_plugtype);
+       _INFO("battery_level = %d, battery_status = %d, battery_health = %d, battery_plugtype = %d",
+               data_obj->battery_level, data_obj->battery_status, data_obj->battery_health, data_obj->battery_plugtype);
 
        int ret = bm_battery_voltage_temperature_charge_listener(data_obj);
        if (ret != BATTERY_MONITOR_ERROR_NONE) {
                _ERR("bm_battery_voltage_temperature_charge_listener failed ");
                return;
        } else
-               _INFO("battery_voltage = %d ,battery_temperature = %d ,battery_charge = %d ", data_obj->battery_voltage , data_obj->battery_temperature , data_obj->battery_charge);
+               _INFO("battery_voltage = %d, battery_temperature = %d, battery_charge = %d",
+                       data_obj->battery_voltage, data_obj->battery_temperature, data_obj->battery_charge);
 
        if (data_obj->event_tag) {
-               data_obj->event_tag->uid = 1000 ;
-               data_obj->event_tag->string_info = g_string_sized_new(30);
+               data_obj->event_tag->uid = 1000;
+               data_obj->event_tag->string_info = g_string_sized_new(7);
                if (!data_obj->event_tag->string_info) {
                        _ERR("memory allocation  failed ");
                        return;
                }
-               g_string_append(data_obj->event_tag->string_info, BM_APPID_SYSTEM);
-               _DBG("Data Value of listener event uid : %d ",  data_obj->event_tag->uid);
-               _DBG("Data Value of listener event string : %s , sp index =%d",  data_obj->event_tag->string_info->str, data_obj->event_tag->sp_idx);
+               g_string_append_printf(data_obj->event_tag->string_info, "%s", "Tizen");
+               _DBG("Data Value of listener event uid : %d ", data_obj->event_tag->uid);
+               _DBG("Data Value of listener event string : %s  sp index = `%d",
+                               data_obj->event_tag->string_info->str, data_obj->event_tag->sp_idx);
        }
 
-       data_obj->wakelock_tag = NULL;
-       data_obj->wakereason_tag = NULL;
+       if (type == LISTEN_POWERLOCKUNLOCK_STATE)
+               data_obj->event_tag = NULL;
+       else
+               data_obj->wakelock_tag = NULL;
 
+       if (type != LISTEN_SLEEP_WAKEUP_STATE)
+               data_obj->wakereason_tag = NULL;
 
        if (bd_store_history_item(data_obj) != BATTERY_MONITOR_ERROR_NONE) {
                _ERR("Failed to store history items ");
@@ -849,12 +1116,9 @@ static void bm_create_event_data(int type, int val)
        }
 
        EXIT;
-
+       return;
 }
 
-
-
-
 void* event_producer(void *data)
 {
        ENTER;
@@ -868,6 +1132,7 @@ void* event_producer(void *data)
 
        events_buf[fill_ptr].type = event->type;
        events_buf[fill_ptr].val = event->val;
+       events_buf[fill_ptr].app = event->app;
        _INFO("type: %d and val = %d", events_buf[fill_ptr].type , events_buf[fill_ptr].val);
        fill_ptr = (fill_ptr + 1) % MAX_BUFF;
        buff_count++;
@@ -878,15 +1143,9 @@ void* event_producer(void *data)
        BM_FREE(event);
        EXIT;
        pthread_exit(NULL);
-
-
 }
 
-
-
-
-void __bm_bt_adapter_state_changed_cb(int result,
-               bt_adapter_state_e adapter_state, void *user_data)
+void __bm_bt_adapter_state_changed_cb(int result, bt_adapter_state_e adapter_state, void *user_data)
 {
        ENTER;
        _INFO("__bt_adapter_state_changed_cb");
@@ -898,6 +1157,10 @@ void __bm_bt_adapter_state_changed_cb(int result,
        else
                bt_state = 0;
 
+       if(bt_adaptor == bt_state)
+               return;
+       else
+               bt_adaptor = bt_state;
        _INFO("__bm_bt_adapter_state_changed_cb  bt_state = %d ", bt_state);
        _INFO("buff_count: %d and fill_ptr = %d", buff_count , fill_ptr);
 
@@ -908,22 +1171,19 @@ void __bm_bt_adapter_state_changed_cb(int result,
        }
        bt_event->type = LISTEN_BT_STATE;
        bt_event->val = bt_state;
+       bt_event->app = NULL;
 
-       pthread_t producer ;
-       if (pthread_create(&producer, NULL, event_producer, bt_event)) {
+       pthread_t producer;
+       if (pthread_create(&producer, &attr, event_producer, bt_event)) {
                _ERR("Failed to pthread_create.");
                return;
        }
 
-
        EXIT;
+       return;
 }
 
-
-
-
-void __bm_bt_device_connection_state_changed_cb(bool connected,
-               bt_device_connection_info_s *conn_info, void *user_data)
+void __bm_bt_device_connection_state_changed_cb(bool connected, bt_device_connection_info_s *conn_info, void *user_data)
 {
        ENTER;
 
@@ -933,7 +1193,6 @@ void __bm_bt_device_connection_state_changed_cb(bool connected,
        if (!connected)
                _INFO("disconnection reason [%d]", conn_info->disconn_reason);
 
-
        event_pool *bt_event = (event_pool *)calloc(1, sizeof(event_pool));
        if (!bt_event) {
                _ERR("Failed to allocated memory ");
@@ -941,25 +1200,20 @@ void __bm_bt_device_connection_state_changed_cb(bool connected,
        }
        bt_event->type = LISTEN_BT_CONNECTION_STATE;
        bt_event->val = connected;
+       bt_event->app = NULL;
 
-       pthread_t producer ;
-       if (pthread_create(&producer, NULL, event_producer, bt_event)) {
+       pthread_t producer;
+       if (pthread_create(&producer, &attr, event_producer, bt_event)) {
                _ERR("Failed to pthread_create.");
                return;
        }
 
-
        EXIT;
+       return;
 }
 
-
-
-
-
-static void __bm_bt_device_discovery_state_changed_cb(
-       int result, bt_adapter_device_discovery_state_e discovery_state,
-       bt_adapter_device_discovery_info_s *discovery_info,
-       void *user_data)
+static void __bm_bt_device_discovery_state_changed_cb(int result, bt_adapter_device_discovery_state_e discovery_state,
+       bt_adapter_device_discovery_info_s *discovery_info, void *user_data)
 {
        ENTER;
        _INFO("__bt_adapter_state_changed_cb");
@@ -982,17 +1236,18 @@ static void __bm_bt_device_discovery_state_changed_cb(
        }
        bt_event->type = LISTEN_BT_SCAN_STATE;
        bt_event->val = discovery_state;
-       pthread_t producer ;
-       if (pthread_create(&producer, NULL, event_producer, bt_event)) {
+       bt_event->app = NULL;
+
+       pthread_t producer;
+       if (pthread_create(&producer, &attr, event_producer, bt_event)) {
                _ERR("Failed to pthread_create.");
                return;
        }
 
        EXIT;
+       return;
 }
 
-
-
 static void __bm_wifi_device_state_callback(wifi_manager_device_state_e state, void* user_data)
 {
        ENTER;
@@ -1011,22 +1266,18 @@ static void __bm_wifi_device_state_callback(wifi_manager_device_state_e state, v
        }
        wifi_event->type = LISTEN_WIFI_STATE;
        wifi_event->val = state;
+       wifi_event->app = NULL;
 
-       pthread_t producer ;
-       if (pthread_create(&producer, NULL, event_producer, wifi_event)) {
+       pthread_t producer;
+       if (pthread_create(&producer, &attr, event_producer, wifi_event)) {
                _ERR("Failed to pthread_create.");
                return;
        }
 
-
-
        EXIT;
+       return;
 }
 
-
-
-
-
 static void __bm_wifi_scan_changed_callback(wifi_manager_scan_state_e state, void* user_data)
 {
        ENTER;
@@ -1040,18 +1291,18 @@ static void __bm_wifi_scan_changed_callback(wifi_manager_scan_state_e state, voi
        }
        wifi_event->type = LISTEN_WIFI_SCAN_STATE;
        wifi_event->val = state;
+       wifi_event->app = NULL;
 
-       pthread_t producer ;
-       if (pthread_create(&producer, NULL, event_producer, wifi_event)) {
+       pthread_t producer;
+       if (pthread_create(&producer, &attr, event_producer, wifi_event)) {
                _ERR("Failed to pthread_create.");
                return;
        }
 
        EXIT;
+       return;
 }
 
-
-
 static void __bm_wifi_connection_state_changed_callback(wifi_manager_connection_state_e state, wifi_manager_ap_h ap, void *user_data)
 {
        ENTER;
@@ -1069,18 +1320,18 @@ static void __bm_wifi_connection_state_changed_callback(wifi_manager_connection_
        }
        wifi_event->type = LISTEN_WIFI_CONNECTION_STATE;
        wifi_event->val = state;
+       wifi_event->app = NULL;
 
-       pthread_t producer ;
-       if (pthread_create(&producer, NULL, event_producer, wifi_event)) {
+       pthread_t producer;
+       if (pthread_create(&producer, &attr, event_producer, wifi_event)) {
                _ERR("Failed to pthread_create.");
                return;
        }
 
        EXIT;
+       return;
 }
 
-
-
 static void __bm_device_display_change(device_callback_e type, void *value, void *user_data)
 {
        ENTER;
@@ -1091,6 +1342,11 @@ static void __bm_device_display_change(device_callback_e type, void *value, void
 
        display_state_e state = (display_state_e)value;
 
+       if(state == display_flag)
+               return;
+       else
+               display_flag = state;
+
        event_pool *device_event = (event_pool *)calloc(1, sizeof(event_pool));
        if (!device_event) {
                _ERR("Failed to allocated memory ");
@@ -1098,18 +1354,18 @@ static void __bm_device_display_change(device_callback_e type, void *value, void
        }
        device_event->type = LISTEN_DEVICE_DISPLAY_STATE;
        device_event->val = state;
+       device_event->app = NULL;
 
-       pthread_t producer ;
-       if (pthread_create(&producer, NULL, event_producer, device_event)) {
+       pthread_t producer;
+       if (pthread_create(&producer, &attr, event_producer, device_event)) {
                _ERR("Failed to pthread_create.");
                return;
        }
 
        EXIT;
+       return;
 }
 
-
-
 static void __bm_display_brightness_change(keynode_t *key, void* data)
 {
        ENTER;
@@ -1118,7 +1374,7 @@ static void __bm_display_brightness_change(keynode_t *key, void* data)
        vconf_get_int(VCONFKEY_SETAPPL_LCD_BRIGHTNESS, &brightness_level);
 
        int flag;
-       if (brightness_level > 0 && brightness_level <= 10) {
+       if (brightness_level >= 0 && brightness_level <= 10) {
                flag = 0;
                if (brightness_flag == flag)
                        return;
@@ -1150,7 +1406,6 @@ static void __bm_display_brightness_change(keynode_t *key, void* data)
                        brightness_flag = flag;
        }
 
-
        _INFO(" device brightness changed =%d ", brightness_level);
 
        event_pool *display_event = (event_pool *)calloc(1, sizeof(event_pool));
@@ -1160,20 +1415,18 @@ static void __bm_display_brightness_change(keynode_t *key, void* data)
        }
        display_event->type = LISTEN_BRIGHTNESS_CHANGE;
        display_event->val = brightness_flag;
+       display_event->app = NULL;
 
-
-       pthread_t producer ;
-       if (pthread_create(&producer, NULL, event_producer, display_event)) {
+       pthread_t producer;
+       if (pthread_create(&producer, &attr, event_producer, display_event)) {
                _ERR("Failed to pthread_create.");
                return;
        }
 
-
        EXIT;
+       return;
 }
 
-
-
 static void __bm_battery_capacity_change(keynode_t *key, void* data)
 {
        ENTER;
@@ -1190,19 +1443,18 @@ static void __bm_battery_capacity_change(keynode_t *key, void* data)
        }
        charging_event->type = LISTEN_BATTERY_CAPACITY_CHANGE;
        charging_event->val = charging;
+       charging_event->app = NULL;
 
-
-       pthread_t producer ;
-       if (pthread_create(&producer, NULL, event_producer, charging_event)) {
+       pthread_t producer;
+       if (pthread_create(&producer, &attr, event_producer, charging_event)) {
                _ERR("Failed to pthread_create.");
                return;
        }
 
-
        EXIT;
+       return;
 }
 
-
 static void __bm_charging_status_change(keynode_t *key, void* data)
 {
        ENTER;
@@ -1210,7 +1462,7 @@ static void __bm_charging_status_change(keynode_t *key, void* data)
        int charging = 0;
        vconf_get_int(VCONFKEY_SYSMAN_CHARGER_STATUS, &charging);
 
-       _INFO(" device charging_status changed =%d ", charging);
+       _INFO(" device charging_status changed = %d ", charging);
 
        event_pool *charging_event = (event_pool *)calloc(1, sizeof(event_pool));
        if (!charging_event) {
@@ -1219,28 +1471,31 @@ static void __bm_charging_status_change(keynode_t *key, void* data)
        }
        charging_event->type = LISTEN_CHARGING_STATUS_CHANGE;
        charging_event->val = charging;
+       charging_event->app = NULL;
 
-
-       pthread_t producer ;
-       if (pthread_create(&producer, NULL, event_producer, charging_event)) {
+       pthread_t producer;
+       if (pthread_create(&producer, &attr, event_producer, charging_event)) {
                _ERR("Failed to pthread_create.");
                return;
        }
 
-
        EXIT;
+       return;
 }
 
-
-
 static void __bm_location_change(keynode_t *key, void* data)
 {
        ENTER;
        _INFO("device location changed succeeded\n");
-       int charging = 0;
-       vconf_get_int(VCONFKEY_LOCATION_ENABLED, &charging);
+       int location = 0;
+       vconf_get_int(VCONFKEY_LOCATION_ENABLED, &location);
 
-       _INFO(" device location changed =%d ", charging);
+       _INFO(" device location changed = %d ", location);
+
+       if(location == location_flag)
+               return;
+       else
+               location_flag = location;
 
        event_pool *location_event = (event_pool *)calloc(1, sizeof(event_pool));
        if (!location_event) {
@@ -1248,30 +1503,27 @@ static void __bm_location_change(keynode_t *key, void* data)
                return;
        }
        location_event->type = LISTEN_LOCATION_CHANGE;
-       location_event->val = charging;
-
+       location_event->val = location;
+       location_event->app = NULL;
 
-       pthread_t producer ;
-       if (pthread_create(&producer, NULL, event_producer, location_event)) {
+       pthread_t producer;
+       if (pthread_create(&producer, &attr, event_producer, location_event)) {
                _ERR("Failed to pthread_create.");
                return;
        }
 
-
        EXIT;
+       return;
 }
 
-
-
-
-static void __bm_noti_signal_strength(TapiHandle *handle, const char *noti_id, void *data, void *user_data)
+static void _bm_notify_signal_strength(TapiHandle *handle, const char *noti_id, void *data, void *user_data)
 {
        ENTER;
        _INFO("device signal strength changed succeeded\n");
        struct tel_noti_network_signal_strength *noti = data;
        int sig_strength = noti->dbm;
 
-       _INFO(" device signal strength changed =%d ", sig_strength);
+       _INFO(" device signal strength changed = %d ", sig_strength);
 
        int flag;
        if (sig_strength >= 0 && sig_strength <= 12) {
@@ -1331,25 +1583,265 @@ static void __bm_noti_signal_strength(TapiHandle *handle, const char *noti_id, v
        }
        signal_event->type = LISTEN_SIGNAL_STRENGTH_CHANGE;
        signal_event->val = ss_flag;
+       signal_event->app = NULL;
+
+       pthread_t producer;
+       if (pthread_create(&producer, &attr, event_producer, signal_event)) {
+               _ERR("Failed to pthread_create.");
+               return;
+       }
+
+       EXIT;
+       return;
+}
+
+static void _bm_notify_modem_power(TapiHandle *handle, const char *noti_id, void *data, void *user_data)
+{
+       ENTER;
+
+       if (data == NULL) {
+               _ERR("invalid data");
+               return;
+       }
+
+       _INFO("modem power change notification - data[%d]", *((int *)data));
+
+       int *status = (int *)data;
+
+       if (*status && !modem_flag) {
+               _DBG("redundant request");
+               return;
+       }
+
+       int state = -1;
+
+       /* handling only On/Off states */
+       switch(*status) {
+               case 0: /* ON */
+                       state = 0;
+                       modem_flag = 1;
+                       break;
+               case 1: /* OFF */
+                       state = 1;
+                       modem_flag = 0;
+                       break;
+               default:
+                       break;
+       }
+
+       if (state != -1) {
+               event_pool *modem_power_event = (event_pool *)calloc(1, sizeof(event_pool));
+               if (!modem_power_event) {
+                       _ERR("Failed to allocated memory ");
+                       return;
+               }
+               modem_power_event->type = LISTEN_MODEM_POWER_STATE;
+               modem_power_event->val = state;
+               modem_power_event->app = NULL;
+
+               pthread_t producer;
+               if (pthread_create(&producer, &attr, event_producer, modem_power_event)) {
+                       _ERR("Failed to pthread_create.");
+                       return;
+               }
+       }
+
+       EXIT;
+       return;
+}
 
 
-       pthread_t producer ;
-       if (pthread_create(&producer, NULL, event_producer, signal_event)) {
+static void create_lock_event(char *lock_type)
+{
+       int val;
+
+       if (g_strcmp0(lock_type, "lcdoff") == 0)
+               val = 0;
+       else if (g_strcmp0(lock_type, "lcddim") == 0)
+               val = 1;
+       else if (g_strcmp0(lock_type, "lcdon") == 0)
+               val = 2;
+       else
+               return;
+
+       if (prev_lock == val)
+               return;
+       else
+               prev_lock = val;
+
+       event_pool *location_event = (event_pool *)calloc(1, sizeof(event_pool));
+       if (!location_event) {
+               _ERR("Failed to allocated memory ");
+               return;
+       }
+
+       location_event->type = LISTEN_POWERLOCKUNLOCK_STATE;
+       location_event->val = val;
+       location_event->app = NULL;
+
+       pthread_t producer;
+       if (pthread_create(&producer, &attr, event_producer, location_event)) {
                _ERR("Failed to pthread_create.");
                return;
        }
 
+       return;
+}
+
+static void __powerlock_signal_callback(GDBusConnection *conn,
+               const gchar *sender,
+               const gchar *path,
+               const gchar *iface,
+               const gchar *signal,
+               GVariant *params,
+               gpointer user_data)
+{
+       ENTER;
+       pid_t pid;
+       char *lock_type;
+       unsigned int timeout;
+       g_variant_get(params, "(&sii)", &lock_type, &pid, &timeout);
+
+       _INFO(" powerlock value changed =%s Pid=%d, timeout=%d", lock_type, pid, timeout);
+
+       create_lock_event(lock_type);
 
        EXIT;
+       return;
 }
 
 
+static void __powerunlock_signal_callback(GDBusConnection *conn,
+               const gchar *sender,
+               const gchar *path,
+               const gchar *iface,
+               const gchar *signal,
+               GVariant *params,
+               gpointer user_data)
+{
+       ENTER;
+       pid_t pid;
+       char *lock_type;
+       unsigned int timeout;
+
+       g_variant_get(params, "(&sii)", &lock_type, &pid, &timeout);
+
+       _INFO(" powerUnlock value changed =%s Pid=%d, timeout=%d", lock_type, pid, timeout);
+
+       create_lock_event(lock_type);
+
+       EXIT;
+       return;
+}
+
+static void __sleep_signal_callback(GDBusConnection *conn,
+               const gchar *sender,
+               const gchar *path,
+               const gchar *iface,
+               const gchar *signal,
+               GVariant *params,
+               gpointer user_data)
+{
+       ENTER;
+
+       event_pool *sleep_event = (event_pool *)calloc(1, sizeof(event_pool));
+       if (!sleep_event) {
+               _ERR("Failed to allocated memory ");
+               return;
+       }
+
+       sleep_event->type = LISTEN_SLEEP_WAKEUP_STATE;
+       sleep_event->val = 0;
+       sleep_event->app = NULL;
+
+       pthread_t producer;
+       if (pthread_create(&producer, &attr, event_producer, sleep_event)) {
+               _ERR("Failed to pthread_create.");
+               return;
+       }
+
+       EXIT;
+       return;
+}
+
+static void __wakeup_signal_callback(GDBusConnection *conn,
+               const gchar *sender,
+               const gchar *path,
+               const gchar *iface,
+               const gchar *signal,
+               GVariant *params,
+               gpointer user_data)
+{
+       ENTER;
+
+       event_pool *wakeup_event = (event_pool *)calloc(1, sizeof(event_pool));
+       if (!wakeup_event) {
+               _ERR("Failed to allocated memory ");
+               return;
+       }
+
+       wakeup_event->type = LISTEN_SLEEP_WAKEUP_STATE;
+       wakeup_event->val = 1;
+       wakeup_event->app = NULL;
+
+       pthread_t producer;
+       if (pthread_create(&producer, &attr, event_producer, wakeup_event)) {
+               _ERR("Failed to pthread_create.");
+               return;
+       }
+
+       EXIT;
+       return;
+}
+
+static void __app_status_signal_callback(GDBusConnection *conn,
+               const gchar *sender,
+               const gchar *path,
+               const gchar *iface,
+               const gchar *signal,
+               GVariant *params,
+               gpointer user_data)
+{
+       ENTER;
+       int pid,val;
+       char *appid;
+       char *status;
+
+       /* (issss) : pid, appid, pkgid, status, type */
+       g_variant_get(params, "(is&s&s&s)", &pid, &appid, NULL, &status, NULL);
+
+       _DBG("pid:%d, appid:%s, status:%s", pid, appid, status);
+
+       if (g_strcmp0(status, "fg") == 0)
+               val = 1;
+       else
+               val = 0;
+
+       event_pool *app_event = (event_pool *)calloc(1, sizeof(event_pool));
+       if (!app_event) {
+               _ERR("Failed to allocated memory ");
+               return;
+       }
+
+       app_event->type = LISTEN_APP_STATUS;
+       app_event->val = val;
+       app_event->app = appid;
+
+       pthread_t producer;
+       if (pthread_create(&producer, &attr, event_producer, app_event)) {
+               _ERR("Failed to pthread_create.");
+               return;
+       }
+
+       EXIT;
+       return;
+}
 
 static int  bm_charging_status_listeners()
 {
        ENTER;
 
-       /*      Charging callbacks */
+       /* Charging callbacks */
        int ret = 0;
        ret = vconf_notify_key_changed(VCONFKEY_SYSMAN_CHARGER_STATUS, __bm_charging_status_change, NULL);
        if (ret != 0) {
@@ -1359,16 +1851,13 @@ static int  bm_charging_status_listeners()
 
        EXIT;
        return 0;
-
 }
 
-
-
 static int  bm_battery_capacity_listeners()
 {
        ENTER;
 
-       /*      Charging callbacks */
+       /* Charging callbacks */
        int ret = 0;
        ret = vconf_notify_key_changed(VCONFKEY_SYSMAN_BATTERY_CAPACITY, __bm_battery_capacity_change, NULL);
        if (ret != 0) {
@@ -1380,13 +1869,11 @@ static int  bm_battery_capacity_listeners()
        return 0;
 }
 
-
-
 static int  bm_location_listeners()
 {
        ENTER;
 
-       /*      Charging callbacks */
+       /* Charging callbacks */
        int ret = 0;
        ret = vconf_notify_key_changed(VCONFKEY_LOCATION_ENABLED, __bm_location_change, NULL);
        if (ret != 0) {
@@ -1398,12 +1885,11 @@ static int  bm_location_listeners()
        return 0;
 }
 
-
 static int  bm_screen_subscribe_listeners()
 {
        ENTER;
 
-       /*      Screen callbacks */
+       /* Screen callbacks */
        int ret = device_add_callback(DEVICE_CALLBACK_DISPLAY_STATE, __bm_device_display_change, NULL);
        if (ret != BATTERY_MONITOR_ERROR_NONE) {
                _ERR("device_add_callback failed: %s", get_error_message(ret));
@@ -1414,32 +1900,42 @@ static int  bm_screen_subscribe_listeners()
        return 0;
 }
 
-
-
-static int  bm_signal_strength_listeners()
+static int bm_telephony_listeners()
 {
        ENTER;
-       /*      Screen callbacks */
+
+       /* get handle */
        handle = tel_init(NULL);
-       if (handle) {
-               int ret = tel_register_noti_event(handle, TAPI_NOTI_NETWORK_SIGNALSTRENGTH, __bm_noti_signal_strength, NULL);
-               if (ret != BATTERY_MONITOR_ERROR_NONE) {
-                       _ERR("device_add_callback failed: %s", get_error_message(ret));
-                       return 1;
-               }
+       if (handle == NULL) {
+               _ERR("invalid handle - signal strength");
+               return 1;
+       }
+
+       int ret = BATTERY_MONITOR_ERROR_NONE;
+
+       /* register signal strength notification */
+       ret = tel_register_noti_event(handle, TAPI_NOTI_NETWORK_SIGNALSTRENGTH, _bm_notify_signal_strength, NULL);
+       if (ret != BATTERY_MONITOR_ERROR_NONE) {
+               _ERR("register for signal-strength failed");
+               return 1;
+       }
+
+       /* register modem power notification */
+       ret = tel_register_noti_event(handle, TAPI_NOTI_MODEM_POWER, _bm_notify_modem_power, NULL);
+       if (ret != BATTERY_MONITOR_ERROR_NONE) {
+               _ERR("register for modem-power failed");
+               return 1;
        }
 
        EXIT;
        return 0;
 }
 
-
-
 static int  bm_display_brightness_listeners()
 {
        ENTER;
 
-       /*      Screen callbacks */
+       /* Screen callbacks */
        int ret = 0;
        ret = vconf_notify_key_changed(VCONFKEY_SETAPPL_LCD_BRIGHTNESS, __bm_display_brightness_change, NULL);
        if (ret != 0) {
@@ -1449,17 +1945,13 @@ static int  bm_display_brightness_listeners()
 
        EXIT;
        return 0;
-
 }
 
-
-
-
 static int  bm_wifi_subscribe_listeners()
 {
        ENTER;
 
-       /*      Wifi callbacks */
+       /* Wifi callbacks */
        int rv = wifi_manager_initialize(&wifi);
        if (rv == WIFI_MANAGER_ERROR_NONE) {
                int ret = wifi_manager_set_device_state_changed_cb(wifi, __bm_wifi_device_state_callback, NULL);
@@ -1488,15 +1980,13 @@ static int  bm_wifi_subscribe_listeners()
 
        EXIT;
        return 0;
-
 }
 
-
 static int  bm_bluetooth_subscribe_listeners()
 {
        ENTER;
 
-       /*      Bluetooth callbacks */
+       /* Bluetooth callbacks */
        int rv = bt_initialize();
 
        if (rv == BT_ERROR_NONE) {
@@ -1504,7 +1994,7 @@ static int  bm_bluetooth_subscribe_listeners()
                _INFO("bt_device_set_connection_state_changed_cb  ret =%d \n", ret);
 
                ret = bt_adapter_set_state_changed_cb(__bm_bt_adapter_state_changed_cb, NULL);
-                       _INFO("bt_adapter_set_state_changed_cb ret =%d \n", ret);
+               _INFO("bt_adapter_set_state_changed_cb ret =%d \n", ret);
 
                ret = bt_adapter_set_device_discovery_state_changed_cb(__bm_bt_device_discovery_state_changed_cb, NULL);
                _INFO("bt_adapter_set_device_discovery_state_changed_cb ret =%d \n", ret);
@@ -1517,11 +2007,133 @@ static int  bm_bluetooth_subscribe_listeners()
        _INFO("bluetooth init succeeded\n");
        EXIT;
        return 0;
+}
+
+static int bm_powerlock_unlock_subscribe_listener(void)
+{
+       ENTER;
+       guint ret = 0;
+
+       if (!dbus_connection) {
+               _ERR("dbus connection is null");
+               EXIT;
+               return 1;
+       }
 
+       ret = g_dbus_connection_signal_subscribe(dbus_connection,
+                               NULL,
+                               DBUS_DEVICED_IFACE,
+                               DBUS_DEVICED_PL_MEMBER,
+                               DBUS_DEVICED_PATH,
+                               NULL,
+                               G_DBUS_SIGNAL_FLAGS_NONE,
+                               __powerlock_signal_callback,
+                               NULL,
+                               NULL);
+
+       if (ret == 0) {
+               _ERR("Failed to subscrive bus signal"); //LCOV_EXCL_LINE System Error
+               return 1;
+       }
+
+       ret = g_dbus_connection_signal_subscribe(dbus_connection,
+                                       NULL,
+                                       DBUS_DEVICED_IFACE,
+                                       DBUS_DEVICED_PU_MEMBER,
+                                       DBUS_DEVICED_PATH,
+                                       NULL,
+                                       G_DBUS_SIGNAL_FLAGS_NONE,
+                                       __powerunlock_signal_callback,
+                                       NULL,
+                                       NULL);
+
+       if (ret == 0) {
+               _ERR("Failed to subscrive bus signal"); //LCOV_EXCL_LINE System Error
+               return 1;
+       }
+
+       EXIT;
+       return BATTERY_MONITOR_ERROR_NONE;
+}
+
+
+static int bm_sleep_wakeup_subscribe_listener(void)
+{
+       ENTER;
+       guint ret = 0;
+
+       if (!dbus_connection) {
+               _ERR("dbus connection is null");
+               EXIT;
+               return 1;
+       }
+
+       ret = g_dbus_connection_signal_subscribe(dbus_connection,
+                               NULL,
+                               DBUS_DEVICED_IFACE,
+                               DBUS_DEVICED_SLEEP_MEMBER,
+                               DBUS_DEVICED_PATH,
+                               NULL,
+                               G_DBUS_SIGNAL_FLAGS_NONE,
+                               __sleep_signal_callback,
+                               NULL,
+                               NULL);
+
+       if (ret == 0) {
+               _ERR("Failed to subscrive bus signal"); //LCOV_EXCL_LINE System Error
+               return 1;
+       }
+
+       ret = g_dbus_connection_signal_subscribe(dbus_connection,
+                               NULL,
+                               DBUS_DEVICED_IFACE,
+                               DBUS_DEVICED_WAKEUP_MEMBER,
+                               DBUS_DEVICED_PATH,
+                               NULL,
+                               G_DBUS_SIGNAL_FLAGS_NONE,
+                               __wakeup_signal_callback,
+                               NULL,
+                               NULL);
+
+       if (ret == 0) {
+               _ERR("Failed to subscrive bus signal"); //LCOV_EXCL_LINE System Error
+               return 1;
+       }
+
+       EXIT;
+       return BATTERY_MONITOR_ERROR_NONE;
 }
 
+static int bm_app_status_listener(void)
+{
+       ENTER;
+       guint ret = 0;
+
+       if (!dbus_connection) {
+               _ERR("dbus connection is null");
+               EXIT;
+               return 1;
+       }
+
+       ret = g_dbus_connection_signal_subscribe(dbus_connection,
+                               NULL,
+                               "org.tizen.aul.AppStatus",
+                               "AppStatusChange",
+                               "/Org/Tizen/Aul/AppStatus",
+                               NULL,
+                               G_DBUS_SIGNAL_FLAGS_NONE,
+                               __app_status_signal_callback,
+                               NULL,
+                               NULL);
 
+       if (ret == 0) {
+               _ERR("Failed to subscrive bus signal"); //LCOV_EXCL_LINE System Error
+               return 1;
+       }
 
+       EXIT;
+       return BATTERY_MONITOR_ERROR_NONE;
+}
 
 void* event_consumer()
 {
@@ -1532,7 +2144,7 @@ void* event_consumer()
                while (buff_count == 0)
                        pthread_cond_wait(&fill, &battery_lister_mutex);
 
-               bm_create_event_data(events_buf[use_ptr].type, events_buf[use_ptr].val);
+               bm_create_event_data(events_buf[use_ptr].type, events_buf[use_ptr].val, events_buf[use_ptr].app);
 
                _INFO("type: %d and val = %d", events_buf[use_ptr].type, events_buf[use_ptr].val);
                _INFO("buff_count: %d and fill_ptr = %d , use_ptr = %d", buff_count, fill_ptr, use_ptr);
@@ -1546,18 +2158,19 @@ void* event_consumer()
        EXIT;
 }
 
-
-
 static int bm_initialize_history_data_obj()
 {
        ENTER;
 
-       pthread_t  consumer;
-       if (pthread_create(&consumer, NULL, event_consumer, NULL)) {
+       pthread_t consumer;
+       if (pthread_create(&consumer, &attr, event_consumer, NULL)) {
                _ERR("Failed to pthread_create.");
                return BATTERY_MONITOR_ERROR_NOT_SUPPORTED;
        }
 
+       // Hash table initialize for application list
+       app_list = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
+
        if (data_obj != NULL) {
                _WARN(" History data object already exits");
                return BATTERY_MONITOR_ERROR_NONE;
@@ -1577,25 +2190,32 @@ static int bm_initialize_history_data_obj()
        return BATTERY_MONITOR_ERROR_NONE;
 }
 
-
-
-
-
 int bd_initialize_listeners(void)
 {
        ENTER;
 
-
+       listener_hsp = -1;
 
        /* Initialize Hash Table */
-       if (!bm_initialize_history_data_obj()) {
+       if (!bm_initialize_history_data_obj())
                _INFO("bm_initialize_history_data_obj succeeded \n");
-       else {
+       else {
                _ERR("bm_initialize_history_data_obj failed \n");
                return BATTERY_MONITOR_ERROR_OUT_OF_MEMORY;
        }
 
+       /* Initialize pthread attributes */
+       if (pthread_attr_init(&attr) != 0) {
+               _ERR("pthread_attr_init failed");
+               return BATTERY_MONITOR_ERROR_OUT_OF_MEMORY;
+       }
+
+       if (pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED) != 0)
+               _ERR("pthread_attr_setdetachstate failed");
 
+       /*Initialize DBus*/
+       if(bm_listener_dbus_init())
+               _ERR("bm_listener_dbus_init failed \n");
 
        /*  Wifi callbacks */
        if (!bm_wifi_subscribe_listeners())
@@ -1603,69 +2223,77 @@ int bd_initialize_listeners(void)
        else
                _ERR("Wifi listeners failed to subscribed\n");
 
-
-
        /*  BlueTooth callbacks */
-
        if (!bm_bluetooth_subscribe_listeners())
                _INFO("bluetooth listeners succeeded to subscribed\n");
        else
                _ERR("bluetooth listeners failed to subscribed\n");
 
-
        /*  Screen wakeup callbacks */
        if (!bm_screen_subscribe_listeners())
                _INFO("Display listeners succeeded to subscribed\n");
        else
                _ERR("Display listeners failed to subscribed\n");
 
-
-       /*      Brightness change callbacks */
+       /* Brightness change callbacks */
        if (!bm_display_brightness_listeners())
                _INFO("Brightness listeners succeeded to subscribed\n");
        else
                _ERR("Brightness listeners failed to subscribed\n");
 
-
-       /*      battery_capacity change callbacks */
+       /* battery_capacity change callbacks */
        if (!bm_battery_capacity_listeners())
                _INFO("battery_capacity listeners succeeded to subscribed\n");
        else
                _ERR("battery_capacity listeners failed to subscribed\n");
 
-       /*      battery charging change callbacks */
+       /* battery charging change callbacks */
        if (!bm_charging_status_listeners())
                _INFO("battery charging listeners succeeded to subscribed\n");
        else
                _ERR("battery charging listeners failed to subscribed\n");
 
-       /*      GPS change callbacks */
+       /* GPS change callbacks */
        if (!bm_location_listeners())
                _INFO("location listeners succeeded to subscribed\n");
        else
                _ERR("location listeners failed to subscribed\n");
 
+       /* telephony listeners */
+       if (!bm_telephony_listeners())
+               _INFO("telephony listeners succeeded to subscribed\n");
+       else
+               _ERR("telephony  listeners failed to subscribed\n");
 
-       /*      Signal strength callbacks */
-       if (!bm_signal_strength_listeners())
-               _INFO("Signal strength listeners succeeded to subscribed\n");
+       /* Powerlock callbacks */
+       if (!bm_powerlock_unlock_subscribe_listener())
+               _INFO("Pwoerlock listeners succeeded to subscribed\n");
        else
-               _ERR("Signal strength listeners failed to subscribed\n");
+               _ERR("Powerlock listeners failed to subscribed\n");
+
+       /* Device Sleep callbacks */
+       if (!bm_sleep_wakeup_subscribe_listener())
+               _INFO("Sleep Wakeup listeners succeeded to subscribed\n");
+       else
+               _ERR("Sleep Wakeup listeners failed to subscribed\n");
+
+       /* App Status callbacks */
+       if (!bm_app_status_listener())
+               _INFO("FG listeners succeeded to subscribed\n");
+       else
+               _ERR("FG Wakeup listeners failed to subscribed\n");
 
        EXIT;
        return BATTERY_MONITOR_ERROR_NONE;
 }
 
-
 int bd_deinitialize_listeners()
 {
        ENTER;
 
        _INFO("de-initializing History listeners");
 
-
-       /* wifi */
-
+       /* Wi-Fi */
        /*unset the callbacks related to wifi*/
        if (wifi_manager_unset_connection_state_changed_cb(wifi) != WIFI_MANAGER_ERROR_NONE)
                _ERR("wifi_manager_unset_connection_state_changed_cb() failed.\n");
@@ -1677,9 +2305,7 @@ int bd_deinitialize_listeners()
        else
                _INFO("wifi_manager_deinitialize() success.\n");
 
-
        /* Bluetooth */
-
        /* unset bluetooth device connection state changed state event callback*/
        if (bt_device_unset_connection_state_changed_cb() != BT_ERROR_NONE)
                _ERR("bt_device_unset_connection_state_changed_cb() failed.\n");
@@ -1698,7 +2324,6 @@ int bd_deinitialize_listeners()
        else
                _INFO("bt_deinitialize() success.\n");
 
-
        //Brightness
        if (vconf_ignore_key_changed(VCONFKEY_SETAPPL_LCD_BRIGHTNESS, __bm_display_brightness_change) < 0)
                _ERR("failed to de-register vconf callback");
@@ -1711,21 +2336,34 @@ int bd_deinitialize_listeners()
        if (vconf_ignore_key_changed(VCONFKEY_SYSMAN_CHARGER_STATUS, __bm_charging_status_change) < 0)
                _ERR("failed to de-register vconf callback");
 
+       /* de-register telephony callbacks */
        if (handle) {
                int ret = tel_deregister_noti_event(handle, TAPI_NOTI_NETWORK_SIGNALSTRENGTH);
                if (ret != BATTERY_MONITOR_ERROR_NONE) {
                        _ERR("tel_deregister_noti_event failed: %s", get_error_message(ret));
                        return 1;
                }
+               ret = tel_deregister_noti_event(handle, TAPI_NOTI_MODEM_POWER);
+               if (ret != BATTERY_MONITOR_ERROR_NONE) {
+                       _ERR("tel_deregister_noti_event failed: %s", get_error_message(ret));
+                       return 1;
+               }
                tel_deinit(handle);
        }
 
+       /*Dbus Deinitialize*/
+       if(bm_listener_dbus_deinit())
+               _ERR("failed to de-init dbus ");
+
+       /* de-initialize pthread attributes */
+       if (pthread_attr_destroy(&attr) != 0)
+               _ERR("pthread_attr_destroy failed");
+
+       g_hash_table_destroy(app_list);
+
        if (data_obj)
                BM_FREE(data_obj);
 
        EXIT;
        return BATTERY_MONITOR_ERROR_NONE;
-
 }
-
-
index 9641bc6..730db07 100644 (file)
@@ -615,7 +615,7 @@ END:
 }
 
 int bm_get_cpu_usage_checker_params(int *timeout, double *initial_threshold,
-                                       double *minimum_threshold, double *threshold_reduction)
+                                       double *maximum_threshold, double *threshold_variance)
 {
        ENTER;
 
@@ -626,8 +626,8 @@ int bm_get_cpu_usage_checker_params(int *timeout, double *initial_threshold,
 
        BM_CHECK_INPUT_PARAM(timeout);
        BM_CHECK_INPUT_PARAM(initial_threshold);
-       BM_CHECK_INPUT_PARAM(minimum_threshold);
-       BM_CHECK_INPUT_PARAM(threshold_reduction);
+       BM_CHECK_INPUT_PARAM(maximum_threshold);
+       BM_CHECK_INPUT_PARAM(threshold_variance);
 
        contents = bm_read_content_from_file(BATTERY_MONITOR_CONFIG_FILE_PATH);
 
@@ -652,19 +652,19 @@ int bm_get_cpu_usage_checker_params(int *timeout, double *initial_threshold,
                goto END;
        *initial_threshold = json_object_get_double(jdouble);
 
-       json_object_object_get_ex(jvalue, "minimum_threshold", &jdouble);
+       json_object_object_get_ex(jvalue, "maximum_threshold", &jdouble);
        if (!jdouble)
                goto END;
-       *minimum_threshold = json_object_get_double(jdouble);
+       *maximum_threshold = json_object_get_double(jdouble);
 
-       json_object_object_get_ex(jvalue, "threshold_reduction", &jdouble);
+       json_object_object_get_ex(jvalue, "threshold_variance", &jdouble);
        if (!jdouble)
                goto END;
-       *threshold_reduction = json_object_get_double(jdouble);
+       *threshold_variance = json_object_get_double(jdouble);
 
        _DBG("data collection params - timeout[%d], initial_threshold[%lf], \
-               minimum_threshold[%lf], threshold_reduction[%lf]", *timeout, *initial_threshold,
-               *minimum_threshold, *threshold_reduction);
+               maximum_threshold[%lf], threshold_variance[%lf]", *timeout, *initial_threshold,
+               *maximum_threshold, *threshold_variance);
 
        ret = BATTERY_MONITOR_ERROR_NONE;
 END:
index 2f839d2..8b820c0 100644 (file)
@@ -152,6 +152,12 @@ int bm_engine_get_total_mah_usage_by_resource_id_ci(gint resource_id, gint64 sta
                _ERR("error reported, error = %d", error);
                return BATTERY_MONITOR_ERROR_INTERNAL;
        }
+       if (resource_usage->ResourceId == NULL) {
+                _ERR("Battery Usage for ResourceId not found");
+                bm_resourceid_usage_free(resource_usage);
+                return BATTERY_MONITOR_ERROR_RECORD_NOT_FOUND;
+       }
+
        *battery_usage = bm_calc_individual_mah_consumption(resource_usage->usage, cmah);
        bm_resourceid_usage_free(resource_usage);
 
@@ -310,7 +316,7 @@ static int bm_appid_session_usage_map(char *app_id, int app_usage, bm_plugin_id_
                else if (resource_id == BM_PLUGIN_ID_CPU)
                        temp->rId_cpu = app_usage;
                else if (resource_id == BM_PLUGIN_ID_DISPLAY)
-               temp->rId_display = app_usage;
+                       temp->rId_display = app_usage;
                else if (resource_id == BM_PLUGIN_ID_DEVICE_NETWORK)
                        temp->rId_device_network = app_usage;
 #ifdef DISABLE_FEATURE_DATA_FROM_GPS_HRM_PLUGIN
@@ -322,7 +328,7 @@ static int bm_appid_session_usage_map(char *app_id, int app_usage, bm_plugin_id_
 
                _DBG("insert - app_usage app_id(%s), for resource(%d), by usage(%d)", app_id, resource_id, app_usage);
 
-               _INFO("inserted - %d", g_hash_table_insert(gl_hash, app_id, temp));
+               _INFO("inserted - %d", g_hash_table_insert(gl_hash, g_strdup(app_id), temp));
        }
 
        EXIT;
@@ -384,7 +390,7 @@ int bm_ble_calc_power_and_commit(bm_bluetooth_st *handle, bool mode)
        int ret_val = BATTERY_MONITOR_ERROR_NONE;
 
        /* creating hash-map with (key, value) = (app-id, data) */
-       GHashTable *hash = g_hash_table_new_full(g_str_hash, g_str_equal, bm_data_free, bm_atm_st2_free);
+       GHashTable *hash = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, NULL);
 
        long int edTime = 0, stTime = 0;
        long int sesTime = 0, conTime = 0, RX_app = 0, TX_app = 0;
@@ -416,9 +422,6 @@ int bm_ble_calc_power_and_commit(bm_bluetooth_st *handle, bool mode)
 
                                RX_system += bt_atm_node->rx;
                                TX_system += bt_atm_node->tx;
-
-                               bm_data_free(bt_atm_node->app_id);
-                               bm_atm_st2_free(bt_atm_node);
                                continue;
                        }
 
@@ -495,17 +498,14 @@ int bm_ble_calc_power_and_commit(bm_bluetooth_st *handle, bool mode)
        char *appid = NULL;
        long int apprx = 0, apptx = 0;
        long int ret_time = bm_get_log_time(data_collection_period);
+       long int total_app_pw = 0, base_res_pw = 0;
 
        /* 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;
-       }
+       appid_usage_s app_usage;
 
        GHashTableIter iter;
        g_hash_table_iter_init(&iter, hash);
@@ -516,50 +516,47 @@ int bm_ble_calc_power_and_commit(bm_bluetooth_st *handle, bool mode)
                appid = temp->app_id;
                apprx = temp->rx; apptx = temp->tx;
                apptime = temp->time;
-               /* 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;
+               app_usage.AppId = appid;
+               app_usage.rId_ble = P_power_app_bt;
+               app_usage.log_time = ret_time;
+               total_app_pw += P_power_app_bt;
                /* Call Insert Function */
                _DBG("Calculated Power for Appid(%s) -  P_power_app_bt(%ld), P_power_app_conn(%ld), P_power_app_data(%ld)",
                                        appid, P_power_app_bt, P_power_app_conn, P_power_app_data);
                if (mode) {
-                       ret_val = bm_server_appid_insert_to_db(app_usage->AppId);
+                       ret_val = bm_server_appid_insert_to_db(app_usage.AppId);
                        if (ret_val != BATTERY_MONITOR_ERROR_NONE)
                                _ERR("Insert of BT appid failed ");
-                       ret_val = bm_server_app_usage_insert_to_db(app_usage);
+                       ret_val = bm_server_app_usage_insert_to_db(&app_usage);
                } else/* Call Global Hash */
-                       ret_val = bm_appid_session_usage_map(g_strdup(app_usage->AppId), app_usage->rId_ble, BM_PLUGIN_ID_BLE);
+                       ret_val = bm_appid_session_usage_map(app_usage.AppId, app_usage.rId_ble, BM_PLUGIN_ID_BLE);
                if (ret_val != BATTERY_MONITOR_ERROR_NONE)
                        _ERR("Insert of BT App failed ");
-               else
-                       _DBG("Insert successful");
        }
 
        /* commit to database the output after power calculation */
-       resourceid_usage_s *res_usage = (resourceid_usage_s *)calloc(1, sizeof(resourceid_usage_s));
-       if (res_usage == NULL) {
-               _ERR("memory allocation failed");
-               bm_appid_usage_free(app_usage);
-               return BATTERY_MONITOR_ERROR_OUT_OF_MEMORY;
-       }
+       resourceid_usage_s res_usage;
 
-       res_usage->ResourceId = BM_RID_BLE;
-       res_usage->log_time = ret_time;
-       res_usage->usage = P_power_bt;
-
-       ret_val = bm_server_resource_usage_insert_to_db(res_usage);
+       res_usage.ResourceId = BM_RID_BLE;
+       res_usage.log_time = ret_time;
+       res_usage.usage = P_power_bt;
+       ret_val = bm_server_resource_usage_insert_to_db(&res_usage);
        if (ret_val != BATTERY_MONITOR_ERROR_NONE)
                _ERR("Insert of BT resource failed ");
 
-       bm_appid_usage_free(app_usage);
-       bm_resourceid_usage_free(res_usage);
+       if (P_power_bt > total_app_pw) {
+               base_res_pw = (P_power_bt - total_app_pw);
+               res_usage.usage = base_res_pw;
+               ret_val = bm_server_resource_base_usage_insert_to_db(&res_usage);
+               if (ret_val != BATTERY_MONITOR_ERROR_NONE)
+                       _ERR("Insert of BT base resource failed ");
+       }
 
        bd_gl_ble_stat_s *gble_st = (bd_gl_ble_stat_s *)calloc(1, sizeof(bd_gl_ble_stat_s));
        if (gble_st == NULL) {
@@ -620,7 +617,7 @@ int bm_wifi_calc_power_and_commit(bm_wifi_st *handle, bool mode)
        int ret_val = BATTERY_MONITOR_ERROR_NONE;
 
        /* creating hash-map with (key, value) = (app-id, data) */
-       GHashTable *hash = g_hash_table_new_full(g_str_hash, g_str_equal, bm_data_free, bm_atm_st2_free);
+       GHashTable *hash = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, NULL);
 
        long int edTime = 0, stTime = 0;
        long int sesTime = 0, scTime = 0, tl_total = 0;
@@ -711,6 +708,7 @@ int bm_wifi_calc_power_and_commit(bm_wifi_st *handle, bool mode)
        double apptime = 0, crx_t = 0, ctx_t = 0;
        long int rx_t = 0, tx_t = 0;
        long int ret_time = bm_get_log_time(data_collection_period);
+       long int total_app_pw = 0, base_res_pw = 0;
 
        /* Coefficient to divide the rx and tx time wrt rx and tx bytes */
        if (RX != 0)
@@ -718,11 +716,7 @@ int bm_wifi_calc_power_and_commit(bm_wifi_st *handle, bool mode)
        if (TX != 0)
                ctx_t = (double)tx_time/TX;
 
-       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;
-       }
+       appid_usage_s app_usage;
 
        while (g_hash_table_iter_next(&iter, &key, &value)) {
                P_power_app_wifi = 0; P_power_app_data = 0; P_power_app_conn = 0;
@@ -739,46 +733,42 @@ int bm_wifi_calc_power_and_commit(bm_wifi_st *handle, bool mode)
                        P_power_app_conn = (P_power_conn * apptime)/onTime; //check for 0 denominator & same units
                P_power_app_wifi = P_power_app_data + P_power_app_conn;
 
-               app_usage->AppId = appid;
-               app_usage->rId_wifi = P_power_app_wifi;
-               app_usage->log_time = ret_time;
+               app_usage.AppId = appid;
+               app_usage.rId_wifi = P_power_app_wifi;
+               app_usage.log_time = ret_time;
+               total_app_pw += P_power_app_wifi;
                /* Call Insert Function */
                _DBG("Calculated Power for Appid(%s) -  P_power_app_wifi(%ld), P_power_app_conn(%ld), P_power_app_data(%ld)",
                                        appid, P_power_app_wifi, P_power_app_conn, P_power_app_data);
 
                if (mode) {
-                       ret_val = bm_server_appid_insert_to_db(app_usage->AppId);
+                       ret_val = bm_server_appid_insert_to_db(app_usage.AppId);
                        if (ret_val != BATTERY_MONITOR_ERROR_NONE)
                                _ERR("Insert of WiFi appid failed ");
-                       ret_val = bm_server_app_usage_insert_to_db(app_usage);
+                       ret_val = bm_server_app_usage_insert_to_db(&app_usage);
                } else/* Call Global Hash */
-                       ret_val = bm_appid_session_usage_map(g_strdup(app_usage->AppId), app_usage->rId_wifi, BM_PLUGIN_ID_WIFI);
+                       ret_val = bm_appid_session_usage_map(app_usage.AppId, app_usage.rId_wifi, BM_PLUGIN_ID_WIFI);
                if (ret_val != BATTERY_MONITOR_ERROR_NONE)
                        _ERR("Insert of Wifi App failed ");
-               else
-                       _DBG("Insert successful");
        }
 
        /* commit to database the output after power calculation */
-       resourceid_usage_s *res_usage = (resourceid_usage_s *)calloc(1, sizeof(resourceid_usage_s));
-       if (res_usage == NULL) {
-               _ERR("memory allocation failed");
-               bm_appid_usage_free(app_usage);
-               return BATTERY_MONITOR_ERROR_OUT_OF_MEMORY;
-       }
-
-       res_usage->ResourceId = BM_RID_WIFI;
-       res_usage->log_time = ret_time;
-       res_usage->usage = P_power_wifi;
+       resourceid_usage_s res_usage;
 
-       ret_val = bm_server_resource_usage_insert_to_db(res_usage);
+       res_usage.ResourceId = BM_RID_WIFI;
+       res_usage.log_time = ret_time;
+       res_usage.usage = P_power_wifi;
+       ret_val = bm_server_resource_usage_insert_to_db(&res_usage);
        if (ret_val != BATTERY_MONITOR_ERROR_NONE)
                _ERR("Insert of Wifi resource failed ");
-       else
-               _DBG("Insert successful");
 
-       bm_appid_usage_free(app_usage);
-       bm_resourceid_usage_free(res_usage);
+       if (P_power_wifi > total_app_pw) {
+               base_res_pw = (P_power_wifi - total_app_pw);
+               res_usage.usage = base_res_pw;
+               ret_val = bm_server_resource_base_usage_insert_to_db(&res_usage);
+               if (ret_val != BATTERY_MONITOR_ERROR_NONE)
+                       _ERR("Insert of Wifi base resource failed ");
+       }
 
        bd_gl_wifi_stat_s *gwfl_st = (bd_gl_wifi_stat_s *)calloc(1, sizeof(bd_gl_wifi_stat_s));
        if (gwfl_st == NULL) {
@@ -787,10 +777,8 @@ int bm_wifi_calc_power_and_commit(bm_wifi_st *handle, bool mode)
        }
        gwfl_st->time_s = ret_time; gwfl_st->wifi_on_time = sesTime;
        gwfl_st->wifi_conn_time = tl_total; gwfl_st->wifi_idle_time = (sesTime - (tl_total + scTime));
-       if (tx_t != 0 || rx_t != 0) {
-               gwfl_st->wifi_rx_time = (tl_total * rx_t) / (rx_t + tx_t);
-               gwfl_st->wifi_tx_time = (tl_total * tx_t) / (rx_t + tx_t);
-       }
+       gwfl_st->wifi_rx_time = rx_time;
+       gwfl_st->wifi_tx_time = tx_time;
        ret_val = bm_server_battery_dump_insert_to_db(gwfl_st, 1);
        if (ret_val != BATTERY_MONITOR_ERROR_NONE)
                _ERR("Insert of GWFL failed ");
@@ -845,7 +833,7 @@ int bm_cpu_calc_power_and_commit(bm_cpu_st *handle, bool mode)
        int ret_val = BATTERY_MONITOR_ERROR_NONE;
 
        /* creating hash-map with (key, value) = (app-id, data) */
-       GHashTable *hash = g_hash_table_new_full(g_str_hash, g_str_equal, bm_data_free, bm_atm_st1_free);
+       GHashTable *hash = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, NULL);
 
        long int uTime = 0, sTime = 0;
        double onTime = 0;
@@ -887,7 +875,6 @@ int bm_cpu_calc_power_and_commit(bm_cpu_st *handle, bool mode)
        _DBG("received cpu power params - user[%lf]\n, system[%lf]\n", sP_power_cpu_user, sP_power_cpu_system);
        /* CPU power consumption Level - 1 at the Resource Level */
        long int P_power_cpu = 0, P_power_user = 0, P_power_system = 0;
-       _DBG("%ld %ld %lf", uTime, sTime, onTime);
        uTime /= 1000; sTime /= 1000; onTime /= 1000;
        P_power_user = ((sP_power_cpu_user * uTime));
        P_power_system = ((sP_power_cpu_system * sTime));
@@ -903,12 +890,9 @@ int bm_cpu_calc_power_and_commit(bm_cpu_st *handle, bool mode)
        double apptime = 0;
        char *appid = NULL;
        long int ret_time = bm_get_log_time(data_collection_period);
+       long int total_app_pw = 0, base_res_pw = 0;
 
-       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;
-       }
+       appid_usage_s app_usage;
 
        while (g_hash_table_iter_next(&iter, &key, &value)) {
                P_power_app_cpu = 0; P_power_app_use = 0;
@@ -921,43 +905,41 @@ int bm_cpu_calc_power_and_commit(bm_cpu_st *handle, bool mode)
                        P_power_app_use = (P_power_cpu * apptime)/onTime; //check for 0 denominator & same units
                P_power_app_cpu = P_power_app_use;
 
-               app_usage->AppId = appid;
-               app_usage->rId_cpu = P_power_app_cpu;
-               app_usage->log_time = ret_time;
+               app_usage.AppId = appid;
+               app_usage.rId_cpu = P_power_app_cpu;
+               app_usage.log_time = ret_time;
+               total_app_pw += P_power_app_cpu;
                /* Call Insert Function */
                _DBG("Calculated Power for Appid (%s) P_power_app_cpu (%ld),  P_power_app_use (%ld)", appid, P_power_app_cpu, P_power_app_use);
 
                if (mode) {
-                       ret_val = bm_server_appid_insert_to_db(app_usage->AppId);
+                       ret_val = bm_server_appid_insert_to_db(app_usage.AppId);
                        if (ret_val != BATTERY_MONITOR_ERROR_NONE)
                                _ERR("Insert of CPU appid failed ");
-                       ret_val = bm_server_app_usage_insert_to_db(app_usage);
+                       ret_val = bm_server_app_usage_insert_to_db(&app_usage);
                } else
-                       ret_val = bm_appid_session_usage_map(g_strdup(app_usage->AppId), app_usage->rId_cpu, BM_PLUGIN_ID_CPU);
+                       ret_val = bm_appid_session_usage_map(app_usage.AppId, app_usage.rId_cpu, BM_PLUGIN_ID_CPU);
                /* Error Check */
                if (ret_val != BATTERY_MONITOR_ERROR_NONE)
                        _ERR("Insert of CPU App failed ");
-               else
-                       _DBG("Insert successful");
-       }
-
-       resourceid_usage_s *res_usage = (resourceid_usage_s *)calloc(1, sizeof(resourceid_usage_s));
-       if (res_usage == NULL) {
-               _ERR("memory allocation failed");
-               bm_appid_usage_free(app_usage);
-               return BATTERY_MONITOR_ERROR_OUT_OF_MEMORY;
        }
 
-       res_usage->ResourceId = BM_RID_CPU;
-       res_usage->log_time = ret_time;
-       res_usage->usage = P_power_cpu;
+       resourceid_usage_s res_usage;
 
-       ret_val = bm_server_resource_usage_insert_to_db(res_usage);
+       res_usage.ResourceId = BM_RID_CPU;
+       res_usage.log_time = ret_time;
+       res_usage.usage = P_power_cpu;
+       ret_val = bm_server_resource_usage_insert_to_db(&res_usage);
        if (ret_val != BATTERY_MONITOR_ERROR_NONE)
                _ERR("Insert of CPU resource failed ");
 
-       bm_appid_usage_free(app_usage);
-       bm_resourceid_usage_free(res_usage);
+       if (P_power_cpu > total_app_pw) {
+               base_res_pw = (P_power_cpu - total_app_pw);
+               res_usage.usage = base_res_pw;
+               ret_val = bm_server_resource_base_usage_insert_to_db(&res_usage);
+               if (ret_val != BATTERY_MONITOR_ERROR_NONE)
+                       _ERR("Insert of CPU base resource failed ");
+       }
 
        bd_gl_cpu_stat_s *gcpu_st = (bd_gl_cpu_stat_s *)calloc(1, sizeof(bd_gl_cpu_stat_s));
        if (gcpu_st == NULL) {
@@ -969,8 +951,6 @@ int bm_cpu_calc_power_and_commit(bm_cpu_st *handle, bool mode)
        ret_val = bm_server_battery_dump_insert_to_db(gcpu_st, 7);
        if (ret_val != BATTERY_MONITOR_ERROR_NONE)
                _ERR("Insert GCPU failed");
-       else
-               _DBG("Insert GCPU successful");
        BM_FREE(gcpu_st);
        /* Free the Hash Map */
        g_hash_table_destroy(hash);
@@ -992,7 +972,7 @@ int bm_display_calc_power_and_commit(bm_display_st *handle, bool mode)
        int ret_val = BATTERY_MONITOR_ERROR_NONE;
 
        /* creating hash-map with (key, value) = (app-id, data) */
-       GHashTable *hash = g_hash_table_new_full(g_str_hash, g_str_equal, bm_data_free, bm_atm_st1_free);
+       GHashTable *hash = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, NULL);
 
        long int edTime = 0, stTime = 0, sesTime = 0;
        long int highTime = 0, medTime = 0, lowTime = 0;
@@ -1041,7 +1021,6 @@ int bm_display_calc_power_and_commit(bm_display_st *handle, bool mode)
        /* Display power consumption Level - 1 at the Resource Level */
        lowTime /= 1000; medTime /= 1000; highTime /= 1000; onTime /= 1000;
        long int P_power_disp = 0, P_power_on = 0;
-       _DBG("Total Time in s low %ld med %ld high %ld session %ld onTime %lf", lowTime, medTime, highTime, sesTime, onTime);
        P_power_on = ((sP_power_dp_low * lowTime) + (sP_power_dp_med * medTime) + (sP_power_dp_high * highTime));
        P_power_disp = P_power_on;
        _DBG("Calculated Power for Display P_power_disp (%ld),  P_power_on (%ld)", P_power_disp, P_power_on);
@@ -1054,12 +1033,9 @@ int bm_display_calc_power_and_commit(bm_display_st *handle, bool mode)
        char *appid = NULL;
        double apptime = 0;
        long int ret_time = bm_get_log_time(data_collection_period);
+       long int total_app_pw = 0, base_res_pw = 0;
 
-       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;
-       }
+       appid_usage_s app_usage;
 
        while (g_hash_table_iter_next(&iter, &key, &value)) {
                P_power_app_disp = 0; P_power_app_on = 0;
@@ -1072,45 +1048,41 @@ int bm_display_calc_power_and_commit(bm_display_st *handle, bool mode)
                        P_power_app_on = (P_power_on * apptime)/onTime; //check for 0 denominator & same units
                P_power_app_disp = P_power_app_on;
 
-               app_usage->AppId = appid;
-               app_usage->rId_display = P_power_app_disp;
-               app_usage->log_time = ret_time;
+               app_usage.AppId = appid;
+               app_usage.rId_display = P_power_app_disp;
+               app_usage.log_time = ret_time;
+               total_app_pw += P_power_app_disp;
                /* Call Insert Function */
                _DBG("Calculated Power for Appid (%s) P_power_app_disp(%ld),  P_power_app_on (%ld)", appid, P_power_app_disp, P_power_app_on);
                if (mode) {
-                       ret_val = bm_server_appid_insert_to_db(app_usage->AppId);
+                       ret_val = bm_server_appid_insert_to_db(app_usage.AppId);
                        if (ret_val != BATTERY_MONITOR_ERROR_NONE)
                                _ERR("Insert of DSP appid failed ");
-                       ret_val = bm_server_app_usage_insert_to_db(app_usage);
+                       ret_val = bm_server_app_usage_insert_to_db(&app_usage);
                } else
-                       ret_val = bm_appid_session_usage_map(g_strdup(app_usage->AppId), app_usage->rId_display, BM_PLUGIN_ID_DISPLAY);
+                       ret_val = bm_appid_session_usage_map(app_usage.AppId, app_usage.rId_display, BM_PLUGIN_ID_DISPLAY);
                /* Error Check */
                if (ret_val != BATTERY_MONITOR_ERROR_NONE)
                        _ERR("Insert of Display App failed ");
-               else
-                       _DBG("Insert successful");
        }
 
        /* commit to database the output after power calculation */
-       resourceid_usage_s *res_usage = (resourceid_usage_s *)calloc(1, sizeof(resourceid_usage_s));
-       if (res_usage == NULL) {
-               _ERR("memory allocation failed");
-               bm_appid_usage_free(app_usage);
-               return BATTERY_MONITOR_ERROR_OUT_OF_MEMORY;
-       }
+       resourceid_usage_s res_usage;
 
-       res_usage->ResourceId = BM_RID_DISP;
-       res_usage->log_time = ret_time;
-       res_usage->usage = P_power_disp;
-
-       ret_val = bm_server_resource_usage_insert_to_db(res_usage);
+       res_usage.ResourceId = BM_RID_DISP;
+       res_usage.log_time = ret_time;
+       res_usage.usage = P_power_disp;
+       ret_val = bm_server_resource_usage_insert_to_db(&res_usage);
        if (ret_val != BATTERY_MONITOR_ERROR_NONE)
                _ERR("Insert of Display resource failed ");
-       else
-               _DBG("Insert successful");
 
-       bm_appid_usage_free(app_usage);
-       bm_resourceid_usage_free(res_usage);
+       if (P_power_disp > total_app_pw) {
+               base_res_pw = (P_power_disp - total_app_pw);
+               res_usage.usage = base_res_pw;
+               ret_val = bm_server_resource_base_usage_insert_to_db(&res_usage);
+               if (ret_val != BATTERY_MONITOR_ERROR_NONE)
+                       _ERR("Insert of Display base resource failed ");
+       }
 
        bd_gl_sbr_stat_s *gbr_st = (bd_gl_sbr_stat_s *)calloc(1, sizeof(bd_gl_sbr_stat_s));
        if (gbr_st == NULL) {
@@ -1148,7 +1120,7 @@ int bm_device_network_calc_power_and_commit(bm_device_network_st *handle, bool m
        int ret_val = BATTERY_MONITOR_ERROR_NONE;
 
        /* creating hash-map with (key, value) = (app-id, data) */
-       GHashTable *hash = g_hash_table_new_full(g_str_hash, g_str_equal, bm_data_free, bm_atm_st2_free);
+       GHashTable *hash = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, NULL);
 
        long int tl0 = 0, tl1 = 0, tl2 = 0, tl3 = 0, tl4 = 0, tl5 = 0, tl6 = 0;
        long int RX = 0, TX = 0;
@@ -1224,12 +1196,9 @@ int bm_device_network_calc_power_and_commit(bm_device_network_st *handle, bool m
        long int apprx = 0, apptx = 0;
        double apptime = 0;
        long int ret_time = bm_get_log_time(data_collection_period);
+       long int total_app_pw = 0, base_res_pw = 0;
 
-       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;
-       }
+       appid_usage_s app_usage;
 
        while (g_hash_table_iter_next(&iter, &key, &value)) {
                P_power_app_dntw = 0; P_power_app_data = 0 ; P_power_app_conn = 0;
@@ -1243,44 +1212,40 @@ int bm_device_network_calc_power_and_commit(bm_device_network_st *handle, bool m
                        P_power_app_conn = (P_power_conn * apptime)/tl_total; //check for 0 denominator & same units
                P_power_app_dntw = P_power_app_data + P_power_app_conn;
 
-               app_usage->AppId = appid;
-               app_usage->rId_device_network = P_power_app_dntw;
-               app_usage->log_time = ret_time;
+               app_usage.AppId = appid;
+               app_usage.rId_device_network = P_power_app_dntw;
+               app_usage.log_time = ret_time;
+               total_app_pw += P_power_app_dntw;
                /* Call Insert Function */
                _DBG("Calculated Power for Appid (%s) P_power_app_dntw(%ld),  P_power_app_conn (%ld), P_power_app_data(%ld)", appid, P_power_app_dntw, P_power_app_conn, P_power_app_data);
                if (mode) {
-                       ret_val = bm_server_appid_insert_to_db(app_usage->AppId);
+                       ret_val = bm_server_appid_insert_to_db(app_usage.AppId);
                        if (ret_val != BATTERY_MONITOR_ERROR_NONE)
                                _ERR("Insert of DN appid failed ");
-                       ret_val = bm_server_app_usage_insert_to_db(app_usage);
+                       ret_val = bm_server_app_usage_insert_to_db(&app_usage);
                } else
-                       ret_val = bm_appid_session_usage_map(g_strdup(app_usage->AppId), app_usage->rId_device_network, BM_PLUGIN_ID_DEVICE_NETWORK);
+                       ret_val = bm_appid_session_usage_map(app_usage.AppId, app_usage.rId_device_network, BM_PLUGIN_ID_DEVICE_NETWORK);
                if (ret_val != BATTERY_MONITOR_ERROR_NONE)
                        _ERR("Insert of Data Ntwk App failed ");
-               else
-                       _DBG("Insert successful");
        }
 
        /* commit to database the output after power calculation */
-       resourceid_usage_s *res_usage = (resourceid_usage_s *)calloc(1, sizeof(resourceid_usage_s));
-       if (res_usage == NULL) {
-               _ERR("memory allocation failed");
-               bm_appid_usage_free(app_usage);
-               return BATTERY_MONITOR_ERROR_OUT_OF_MEMORY;
-       }
-
-       res_usage->ResourceId = BM_RID_DNTW;
-       res_usage->log_time = ret_time;
-       res_usage->usage = P_power_dntw;
+       resourceid_usage_s res_usage;
 
-       ret_val = bm_server_resource_usage_insert_to_db(res_usage);
+       res_usage.ResourceId = BM_RID_DNTW;
+       res_usage.log_time = ret_time;
+       res_usage.usage = P_power_dntw;
+       ret_val = bm_server_resource_usage_insert_to_db(&res_usage);
        if (ret_val != BATTERY_MONITOR_ERROR_NONE)
                _ERR("Insert of Data Network resource failed ");
-       else
-               _DBG("Insert successful");
 
-       bm_appid_usage_free(app_usage);
-       bm_resourceid_usage_free(res_usage);
+       if (P_power_dntw > total_app_pw) {
+               base_res_pw = (P_power_dntw - total_app_pw);
+               res_usage.usage = base_res_pw;
+               ret_val = bm_server_resource_base_usage_insert_to_db(&res_usage);
+               if (ret_val != BATTERY_MONITOR_ERROR_NONE)
+                       _ERR("Insert of Data Network base resource failed ");
+       }
 
        bd_gl_sgt_stat_s *gst_st = (bd_gl_sgt_stat_s *)calloc(1, sizeof(bd_gl_sgt_stat_s));
        if (gst_st == NULL) {
@@ -1294,8 +1259,6 @@ int bm_device_network_calc_power_and_commit(bm_device_network_st *handle, bool m
        ret_val = bm_server_battery_dump_insert_to_db(gst_st, 4);
        if (ret_val != BATTERY_MONITOR_ERROR_NONE)
                _ERR("Insert of GWFL failed ");
-       else
-               _DBG("Insert successful");
        BM_FREE(gst_st);
 
        /* Free the Hash Map */
@@ -1319,7 +1282,7 @@ int bm_gps_calc_power_and_commit(bm_gps_st *handle)
        int ret_val = BATTERY_MONITOR_ERROR_NONE;
 
        /* creating hash-map with (key, value) = (app-id, data) */
-       GHashTable *hash = g_hash_table_new_full(g_str_hash, g_str_equal, bm_data_free, bm_atm_st1_free);
+       GHashTable *hash = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, NULL);
 
        long int edTime = 0;
        long int stTime = 0;
@@ -1379,56 +1342,48 @@ int bm_gps_calc_power_and_commit(bm_gps_st *handle)
        char *appid = NULL;
        int apptime = 0;
        long int ret_time = bm_get_log_time(data_collection_period);
+       long int total_app_pw = 0, base_res_pw = 0;
 
-       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;
-       }
+       appid_usage_s app_usage;
 
        while (g_hash_table_iter_next(&iter, &key, &value)) {
                P_power_app_gps = 0; P_power_app_conn = 0;
                apptime = 0;
                app_time_map_st1 *temp = (app_time_map_st1 *)value;
-               appid = temp->app_id;
-               apptime = temp->time;
+               appid = temp->app_id; apptime = temp->time;
 
                if (onTime != 0)
                        P_power_app_conn = (P_power_conn * apptime)/onTime; //check for 0 denominator & same units
                P_power_app_gps = P_power_app_conn;
 
-               app_usage->AppId = appid;
-               app_usage->rId_gps = P_power_app_gps;
-               app_usage->log_time = ret_time;
+               app_usage.AppId = appid;
+               app_usage.rId_gps = P_power_app_gps;
+               app_usage.log_time = ret_time;
+               total_app_pw += P_power_app_gps;
                /* Call Insert Function */
                _DBG("Calculated Power for Appid (%s) P_power_app_gps (%d),  P_power_app_conn (%d)", appid, P_power_app_gps, P_power_app_conn);
-               ret_val = bm_server_app_usage_insert_to_db(app_usage);
+               ret_val = bm_server_app_usage_insert_to_db(&app_usage);
                if (ret_val != BATTERY_MONITOR_ERROR_NONE)
                        _ERR("Insert of GPS App failed ");
-               else
-                       _DBG("Insert successful");
        }
 
        /* commit to database the output after power calculation */
-       resourceid_usage_s *res_usage = (resourceid_usage_s *)calloc(1, sizeof(resourceid_usage_s));
-       if (res_usage == NULL) {
-               _ERR("memory allocation failed");
-               bm_appid_usage_free(app_usage);
-               return BATTERY_MONITOR_ERROR_OUT_OF_MEMORY;
-       }
+       resourceid_usage_s res_usage;
 
-       res_usage->ResourceId = BM_RID_GPS;
-       res_usage->log_time = ret_time;
-       res_usage->usage = P_power_gps;
-
-       ret_val = bm_server_resource_usage_insert_to_db(res_usage);
+       res_usage.ResourceId = BM_RID_GPS;
+       res_usage.log_time = ret_time;
+       res_usage.usage = P_power_gps;
+       ret_val = bm_server_resource_usage_insert_to_db(&res_usage);
        if (ret_val != BATTERY_MONITOR_ERROR_NONE)
                _ERR("Insert of GPS resource failed ");
-       else
-               _DBG("Insert successful");
 
-       bm_appid_usage_free(app_usage);
-       bm_resourceid_usage_free(res_usage);
+       if (P_power_gps > total_app_pw) {
+               base_res_pw = (P_power_gps - total_app_pw);
+               res_usage.usage = base_res_pw;
+               ret_val = bm_server_resource_base_usage_insert_to_db(&res_usage);
+               if (ret_val != BATTERY_MONITOR_ERROR_NONE)
+                       _ERR("Insert of GPS base resource failed ");
+       }
 
        /* Free the Hash Map */
        g_hash_table_destroy(hash);
@@ -1452,7 +1407,7 @@ int bm_hrm_calc_power_and_commit(bm_hrm_sensor_st *handle)
        int ret_val = BATTERY_MONITOR_ERROR_NONE;
 
        /* creating hash-map with (key, value) = (app-id, data) */
-       GHashTable *hash = g_hash_table_new_full(g_str_hash, g_str_equal, bm_data_free, bm_atm_st1_free);
+       GHashTable *hash = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, NULL);
 
        /* iterating over list for data accumulation */
        for (hrm_data_iterator = handle->hrm_data_list; hrm_data_iterator; hrm_data_iterator = hrm_data_iterator->next) {
@@ -1584,7 +1539,7 @@ int bm_get_data_from_handles(void)
        int ret_val = BATTERY_MONITOR_ERROR_NONE;
        bool mode = false;
 
-       gl_hash = g_hash_table_new_full(g_str_hash, g_str_equal, bm_data_free, bm_atm_st1_free);
+       gl_hash = g_hash_table_new_full(g_str_hash, g_str_equal, bm_data_free, bm_atm_free);
        if (!gl_hash)
                _ERR("Global Hash creation failed");
 
@@ -1892,17 +1847,9 @@ int bm_get_up_time(double *up_time)
        return BATTERY_MONITOR_ERROR_NONE;
 }
 
-gboolean is_cpu_idle(void)
+gboolean is_cpu_idle(double usage_ratio_threshold)
 {
-       static gboolean is_parameter_loaded = FALSE;
-       static int timeout = 60000;
-       static double initial_threshold = 0.60;
-       static double minimum_threshold = 0.50;
-       static double threshold_reduction = 0.0;
-       static int num_cpu_core = 1;
-
-       static int remaining_timeout = 60000;
-       static double usage_ratio_threshold = 0.60;
+       static int num_cpu_core = -1;
 
        int idx;
        unsigned long long cpu_time_cur[CT_NUM];
@@ -1911,37 +1858,23 @@ gboolean is_cpu_idle(void)
        double up_time_diff;
        double usage_ratio;
 
-       if (!is_parameter_loaded) {
-               if (bm_get_cpu_usage_checker_params(&timeout, &initial_threshold, &minimum_threshold, &threshold_reduction) != BATTERY_MONITOR_ERROR_NONE) {
-                       _ERR("error getting cpu usage checker parameters");
-                       return FALSE;
-               }
-               remaining_timeout = timeout;
-               usage_ratio_threshold = initial_threshold;
-
+       if (num_cpu_core < 0) {
                if (runtime_info_get_processor_count(&num_cpu_core) != RUNTIME_INFO_ERROR_NONE) {
                        _ERR("error getting the number of cpu core");
                        return FALSE;
                }
-
-               is_parameter_loaded = TRUE;
-       }
-
-       if (remaining_timeout <= 0) {
-               _DBG("timeout!");
-               goto satisfy;
        }
 
        // Get CPU time
        if (bm_get_cpu_time(cpu_time_cur) != BATTERY_MONITOR_ERROR_NONE) {
                _ERR("error getting CPU time");
-               goto unsatisfy;
+               return FALSE;
        }
 
        for (idx = 0; idx < CT_NUM; idx++) {
                if (cpu_time_last[idx] > cpu_time_cur[idx]) {
                        _ERR("error invalid CPU time");
-                       goto unsatisfy;
+                       return FALSE;
                }
                cpu_time_diff[idx] = cpu_time_cur[idx] - cpu_time_last[idx];
        }
@@ -1952,12 +1885,12 @@ gboolean is_cpu_idle(void)
        // Get uptime
        if (bm_get_up_time(&up_time_cur) != BATTERY_MONITOR_ERROR_NONE) {
                _ERR("error getting uptime");
-               goto unsatisfy;
+               return FALSE;
        }
 
        if (up_time_last >= up_time_cur) {
                _ERR("error invalid uptime");
-               goto unsatisfy;
+               return FALSE;
        }
 
        up_time_diff = up_time_cur - up_time_last;
@@ -1969,23 +1902,11 @@ gboolean is_cpu_idle(void)
                usage_ratio = 1.0;
        if (usage_ratio > usage_ratio_threshold) {
                _WARN("CPU usage = %.2lf%% (BUSY, criteria[%.2lf%%])", usage_ratio * 100, usage_ratio_threshold * 100);
-               goto unsatisfy;
+               return FALSE;
        }
 
-       _DBG("CPU usage = %.2lf%% (IDLE)", usage_ratio * 100);
-
-satisfy:
-       remaining_timeout = timeout;
-       usage_ratio_threshold = initial_threshold;
-
+       _DBG("CPU usage = %.2lf%% (IDLE, criteria[%.2lf%%])", usage_ratio * 100, usage_ratio_threshold * 100);
        return TRUE;
-
-unsatisfy:
-       remaining_timeout -= data_collection_try_period;
-       if (usage_ratio_threshold > minimum_threshold)
-               usage_ratio_threshold -= threshold_reduction;
-
-       return FALSE;
 }
 
 gboolean bm_try_request_feature_data(gpointer data)
@@ -1995,19 +1916,56 @@ gboolean bm_try_request_feature_data(gpointer data)
                CALC_AND_STORE,
        };
 
+       static gboolean is_parameter_loaded = FALSE;
+       static int timeout = 60000;
+       static double initial_threshold = 0.60;
+       static double maximum_threshold = 0.70;
+       static double threshold_variance = 0.0;
+
+       static int remaining_timeout = 60000;
+       static double usage_ratio_threshold = 0.60;
+
        static enum status status = GET_DATA;
        static int idle_count = 0;
        int ret_val;
 
-       if (!is_cpu_idle())
+       if (!is_parameter_loaded) {
+               if (bm_get_cpu_usage_checker_params(&timeout, &initial_threshold, &maximum_threshold, &threshold_variance) != BATTERY_MONITOR_ERROR_NONE) {
+                       _ERR("error getting cpu usage checker parameters");
+                       return G_SOURCE_REMOVE;
+               }
+               remaining_timeout = timeout;
+               usage_ratio_threshold = initial_threshold;
+
+               is_parameter_loaded = TRUE;
+       }
+
+       if (remaining_timeout <= 0) {
+               _DBG("timeout!");
+               goto request;
+       }
+       remaining_timeout -= data_collection_try_period;
+
+       if (!is_cpu_idle(usage_ratio_threshold)) {
+               idle_count = 0;
+               if (usage_ratio_threshold < maximum_threshold)
+                       usage_ratio_threshold += threshold_variance;
+
                return G_SOURCE_CONTINUE;
+       }
 
        idle_count++;
+       if (usage_ratio_threshold > initial_threshold)
+               usage_ratio_threshold -= threshold_variance;
+
        _DBG("Idle count(%d/%d)", idle_count, data_collection_accept_count);
        if (idle_count < data_collection_accept_count)
                return G_SOURCE_CONTINUE;
 
+request:
        idle_count = 0;
+       remaining_timeout = timeout;
+       usage_ratio_threshold = initial_threshold;
 
        switch (status) {
        case GET_DATA:  // Request data to plugin
index da75f4f..db079f1 100644 (file)
@@ -549,6 +549,17 @@ static void bm_convert_column_to_resourceid_usage(bm_stmt hstmt, resourceid_usag
        return;
 }
 
+static void bm_convert_column_to_battery_last_charge(bm_stmt hstmt, resourceid_usage_s* bm_resource_type)
+{
+       ENTER;
+
+       bm_resource_type->log_time = bm_query_table_column_int(hstmt, 0);
+       _DBG("log-time %ld", bm_resource_type->log_time);
+
+       EXIT;
+       return;
+}
+
 static void bm_convert_column_to_appid_usage(bm_stmt hstmt, appid_usage_s* bm_app_type)
 {
        ENTER;
@@ -759,18 +770,18 @@ static int bm_check_is_all_table_exists(sqlite3 *bm_db_handle)
        BM_MEMSET(query, 0, sizeof(query));
 
        BM_SNPRINTF(query, sizeof(query), "select count(*) from sqlite_master where name in \
-                       ('%s', '%s', '%s', '%s','%s', '%s', '%s', '%s','%s', '%s', '%s')",
+                       ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s')",
                        BATTERY_MONITOR_APP_ID_MAP_TABLE, BATTERY_MONITOR_APP_ID_USAGE_TABLE,
-                       BATTERY_MONITOR_RESOURCE_ID_USAGE_TABLE, BATTERY_MONITOR_GBL_BLE_STAT_TABLE,
-                       BATTERY_MONITOR_GBL_WFL_STAT_TABLE, BATTERY_MONITOR_GBL_NT_STAT_TABLE,
-                       BATTERY_MONITOR_GBL_BR_STAT_TABLE, BATTERY_MONITOR_GBL_SGT_STAT_TABLE,
-                       BATTERY_MONITOR_GBL_WST_STAT_TABLE, BATTERY_MONITOR_GBL_BST_STAT_TABLE,
-                       BATTERY_MONITOR_GBL_CPU_STAT_TABLE);
+                       BATTERY_MONITOR_RESOURCE_ID_USAGE_TABLE, BATTERY_MONITOR_RES_ID_BASE_USAGE_TABLE,
+                       BATTERY_MONITOR_GBL_BLE_STAT_TABLE, BATTERY_MONITOR_GBL_WFL_STAT_TABLE,
+                       BATTERY_MONITOR_GBL_NT_STAT_TABLE, BATTERY_MONITOR_GBL_BR_STAT_TABLE,
+                       BATTERY_MONITOR_GBL_SGT_STAT_TABLE, BATTERY_MONITOR_GBL_WST_STAT_TABLE,
+                       BATTERY_MONITOR_GBL_BST_STAT_TABLE, BATTERY_MONITOR_GBL_CPU_STAT_TABLE);
 
        rc = bm_get_record_count(bm_db_handle, query);
 
        if (rc != BATTERY_MONITOR_TABLE_COUNT)
-               _ERR("Table count is not matched rc=%d\n", rc);
+               _ERR("Table count is not matched rc = %d\n", rc);
 
        EXIT;
        return rc;
@@ -821,6 +832,18 @@ static int bm_create_all_tables(sqlite3 *bm_db_handle)
                        ("bm_execute_query(bm_db_handle, %s) failed(%d, %s).\n",
                         RESOURCE_ID_USAGE_SCHEMA, rc, bm_db_err_msg(bm_db_handle)));
        }
+       /* Create the resource base usage table */
+       BM_SNPRINTF(query, sizeof(query), "select count(*) from sqlite_master where name in ('%s')",
+                                               BATTERY_MONITOR_RES_ID_BASE_USAGE_TABLE);
+       rc = bm_get_record_count(bm_db_handle, query);
+       if (rc <= 0) {
+               rc = bm_execute_query(bm_db_handle, RES_ID_BASE_USAGE_SCHEMA);
+               if (rc == SQLITE_BUSY)
+                       return BATTERY_MONITOR_ERROR_DATABASE_BUSY;
+               BM_RETURN_VAL((SQLITE_OK == rc), {}, BATTERY_MONITOR_ERROR_DB_FAILED,
+                       ("bm_execute_query(bm_db_handle, %s) failed(%d, %s).\n",
+                       RES_ID_BASE_USAGE_SCHEMA, rc, bm_db_err_msg(bm_db_handle)));
+       }
 
        /* Battery Dump Tables */
        /* Create the global bluetooth stats table */
@@ -1030,55 +1053,6 @@ static int bm_db_close(void)
        return ret;
 }
 
-/*
-int bm_get_appint_by_app_name(sqlite3 *bm_db_handle, const char *AppId)
-{
-       ENTER;
-
-       char query[BATTERY_MONITOR_SQL_LEN_MAX] = {0, };
-       int rc = -1;
-       int ncount = 0;
-       bm_stmt pStmt = NULL;
-
-       BM_RETURN_VAL((bm_db_handle != NULL), {}, BATTERY_MONITOR_ERROR_DB_NOT_OPENED, ("The database isn't connected."));
-       BM_RETURN_VAL((AppId != NULL), {}, BATTERY_MONITOR_ERROR_INVALID_PARAMETER, ("AppId is NULL."));
-
-       BM_MEMSET(query, 0x00, sizeof(query));
-       BM_SNPRINTF(query, sizeof(query), "SELECT AppId FROM %s WHERE AppName='%s'", BATTERY_MONITOR_APP_ID_MAP_TABLE, AppId);
-
-       rc = sqlite3_prepare_v2(bm_db_handle, query, strlen(query), &pStmt, NULL);
-
-       if (SQLITE_BUSY == rc) {
-               _ERR("sqlite3_prepare_v2() failed(%d, %s).", rc, bm_db_err_msg(bm_db_handle));
-               sqlite3_finalize(pStmt);
-               return BATTERY_MONITOR_ERROR_DATABASE_BUSY;
-       } else if (SQLITE_OK != rc) {
-               _ERR("sqlite3_prepare_v2() failed(%d, %s).", rc, bm_db_err_msg(bm_db_handle));
-               sqlite3_finalize(pStmt);
-               return BATTERY_MONITOR_ERROR_DB_FAILED;
-       }
-
-       rc = sqlite3_step(pStmt);
-       if (SQLITE_BUSY == rc) {
-               _ERR("sqlite3_step() failed(%d, %s).", rc, bm_db_err_msg(bm_db_handle));
-               sqlite3_finalize(pStmt);
-               return BATTERY_MONITOR_ERROR_DATABASE_BUSY;
-       } else if (SQLITE_ROW != rc) {
-               _ERR("sqlite3_step() failed(%d, %s).", rc, bm_db_err_msg(bm_db_handle));
-               sqlite3_finalize(pStmt);
-               return BATTERY_MONITOR_ERROR_DB_FAILED;
-       }
-
-       ncount = sqlite3_column_int(pStmt, 1);
-
-       _INFO("bm appint for appname [%d]", ncount);
-       sqlite3_finalize(pStmt);
-
-       EXIT;
-       return ncount;
-}
-*/
-
 static gboolean app_name_check_duplicated(sqlite3 *bm_db_handle, const char *app_id, int *error_code)
 {
        ENTER;
@@ -1385,6 +1359,54 @@ static int bm_resourceid_usage_insert_to_db(sqlite3 *bm_db_handle, resourceid_us
        return error_code;
 }
 
+static int bm_resourceid_base_usage_insert_to_db(sqlite3 *bm_db_handle, resourceid_usage_s *bm_resource_type)
+{
+       ENTER;
+
+       int rc = 0;
+       char query[BATTERY_MONITOR_SQL_LEN_MAX] = {0, };
+       int error_code = BATTERY_MONITOR_ERROR_NONE;
+       bm_stmt hstmt = NULL;
+
+       BM_RETURN_VAL((bm_db_handle != NULL), {}, BATTERY_MONITOR_ERROR_DB_NOT_OPENED, ("The database isn't connected."));
+       BM_RETURN_VAL((bm_resource_type != NULL), {}, BATTERY_MONITOR_ERROR_INVALID_PARAMETER, ("The battery monitor handle is NULL"));
+
+       /* check mandatory field(Resource id)*/
+       if (!bm_resource_type->ResourceId)
+               return BATTERY_MONITOR_ERROR_INVALID_PARAMETER;
+
+       BM_MEMSET(query, 0x00, sizeof(query));
+       BM_SNPRINTF(query, sizeof(query), "INSERT INTO %s( ResourceId, log_time, usage ) values " "(?, ?, ?)", BATTERY_MONITOR_RES_ID_BASE_USAGE_TABLE);
+
+       hstmt = bm_prepare_query(bm_db_handle, query);
+       if (bm_db_err_code(bm_db_handle) == SQLITE_PERM) {
+               _ERR("Access failed(%s)", bm_db_err_msg(bm_db_handle));
+               return BATTERY_MONITOR_ERROR_PERMISSION_DENIED;
+       } else if (bm_db_err_code(bm_db_handle) == SQLITE_BUSY) {
+               _ERR("Database Busy(%s)", bm_db_err_msg(bm_db_handle));
+               return BATTERY_MONITOR_ERROR_DATABASE_BUSY;
+       }
+
+       BM_RETURN_VAL((hstmt != NULL), {}, BATTERY_MONITOR_ERROR_DB_FAILED, ("bm_prepare_query() failed(%s).\n", bm_db_err_msg(bm_db_handle)));
+
+       bm_resourceid_usage_convert_to_sql(bm_resource_type, hstmt, query);
+       rc = bm_query_step(hstmt);
+       if (rc == SQLITE_BUSY) {
+               _ERR("bm_db_query_step() failed(%d, %s)", rc, bm_db_err_msg(bm_db_handle));
+               error_code = BATTERY_MONITOR_ERROR_DATABASE_BUSY;
+       } else if (rc != SQLITE_DONE) {
+               _ERR("bm_db_query_step() failed(%d, %s)", rc, bm_db_err_msg(bm_db_handle));
+               error_code = BATTERY_MONITOR_ERROR_DB_FAILED;
+       }
+
+       rc = bm_query_finalize(hstmt);
+       BM_RETURN_VAL((rc == BATTERY_MONITOR_ERROR_NONE), {}, rc, ("finalize error"));
+       hstmt = NULL;
+
+       EXIT;
+       return error_code;
+}
+
 int bm_appid_map_insert_to_db(sqlite3 *bm_db_handle, const char *app_id)
 {
        ENTER;
@@ -1942,6 +1964,130 @@ CATCH:
        return NULL;
 }
 
+static resourceid_usage_s* bm_query_base_usage_by_resourceid_ci(sqlite3 *bm_db_handle, const char *resource_id, long long s_time, long long e_time, int *error_code)
+{
+       ENTER;
+       bm_stmt hstmt = NULL;
+       int rc = 0;
+       *error_code = BATTERY_MONITOR_ERROR_NONE;
+       long int s_t = (long)s_time;
+       long int e_t = (long)e_time;
+       char query[BATTERY_MONITOR_SQL_LEN_MAX] = {0, };
+       BM_MEMSET(query, 0x00, BATTERY_MONITOR_SQL_LEN_MAX);
+       BM_SNPRINTF(query, sizeof(query), "SELECT ResourceId, sum(usage) FROM %s WHERE ResourceId = '%s' \
+                       AND log_time > %ld AND log_time < %ld", BATTERY_MONITOR_RES_ID_BASE_USAGE_TABLE, resource_id, s_t, e_t);
+
+       hstmt = bm_prepare_query(bm_db_handle, query);
+       if (bm_db_err_code(bm_db_handle) == SQLITE_PERM) {
+               _ERR("Access failed(%s)", bm_db_err_msg(bm_db_handle));
+               *error_code = BATTERY_MONITOR_ERROR_PERMISSION_DENIED;
+               return NULL;
+       }
+
+       resourceid_usage_s *bm_resource_type = NULL;
+       rc = bm_query_step(hstmt);
+       BM_CATCH_ERROR_P(rc == SQLITE_ROW, {}, BATTERY_MONITOR_ERROR_RECORD_NOT_FOUND, ("The record isn't found.(%s)\n", resource_id));
+
+       bm_resource_type = (resourceid_usage_s *)calloc(1, sizeof(resourceid_usage_s));
+       if (bm_resource_type == NULL) {
+               _ERR("memory allocation failed");
+               if (hstmt != NULL) {
+                       rc = bm_query_finalize(hstmt);
+                       BM_RETURN_VAL((rc == BATTERY_MONITOR_ERROR_NONE), { *error_code = rc; }, NULL, ("finalize error"));
+                       hstmt = NULL;
+               }
+               *error_code = BATTERY_MONITOR_ERROR_OUT_OF_MEMORY;
+               return NULL;
+       }
+       bm_convert_column_to_resourceid_usage(hstmt, bm_resource_type);
+
+       rc = bm_query_finalize(hstmt);
+       BM_CATCH_ERROR_P((rc == BATTERY_MONITOR_ERROR_NONE), {}, rc, ("finalize error"));
+       hstmt = NULL;
+       *error_code = BATTERY_MONITOR_ERROR_NONE;
+
+CATCH:
+       if (hstmt != NULL) {
+               rc = bm_query_finalize(hstmt);
+               if (rc != BATTERY_MONITOR_ERROR_NONE) {
+                       *error_code = rc;
+                       _ERR("finalize error");
+               }
+               hstmt = NULL;
+       }
+       if ((*error_code != BATTERY_MONITOR_ERROR_NONE) && bm_resource_type) {
+               BM_FREE(bm_resource_type);
+               bm_resource_type = NULL;
+       }
+       if ((*error_code == BATTERY_MONITOR_ERROR_NONE) && bm_resource_type != NULL) {
+               _INFO("Returning appid usage");
+               return bm_resource_type;
+       }
+       EXIT;
+       return NULL;
+}
+
+static resourceid_usage_s* bm_query_battery_last_charge(sqlite3 *bm_db_handle, const char *resource_id, int *error_code)
+{
+       ENTER;
+       bm_stmt hstmt = NULL;
+       int rc = 0;
+       *error_code = BATTERY_MONITOR_ERROR_NONE;
+       char query[BATTERY_MONITOR_SQL_LEN_MAX] = {0, };
+       BM_MEMSET(query, 0x00, BATTERY_MONITOR_SQL_LEN_MAX);
+       BM_SNPRINTF(query, sizeof(query), "SELECT MAX(log_time) FROM %s WHERE ResourceId = '%s'",
+                       BATTERY_MONITOR_RES_ID_BASE_USAGE_TABLE, resource_id);
+
+       hstmt = bm_prepare_query(bm_db_handle, query);
+       if (bm_db_err_code(bm_db_handle) == SQLITE_PERM) {
+               _ERR("Access failed(%s)", bm_db_err_msg(bm_db_handle));
+               *error_code = BATTERY_MONITOR_ERROR_PERMISSION_DENIED;
+               return NULL;
+       }
+
+       resourceid_usage_s *bm_resource_type = NULL;
+       rc = bm_query_step(hstmt);
+       BM_CATCH_ERROR_P(rc == SQLITE_ROW, {}, BATTERY_MONITOR_ERROR_RECORD_NOT_FOUND, ("The record isn't found.(%s)\n", resource_id));
+
+       bm_resource_type = (resourceid_usage_s *)calloc(1, sizeof(resourceid_usage_s));
+       if (bm_resource_type == NULL) {
+               _ERR("memory allocation failed");
+               if (hstmt != NULL) {
+                       rc = bm_query_finalize(hstmt);
+                       BM_RETURN_VAL((rc == BATTERY_MONITOR_ERROR_NONE), { *error_code = rc; }, NULL, ("finalize error"));
+                       hstmt = NULL;
+               }
+               *error_code = BATTERY_MONITOR_ERROR_OUT_OF_MEMORY;
+               return NULL;
+       }
+       bm_convert_column_to_battery_last_charge(hstmt, bm_resource_type);
+
+       rc = bm_query_finalize(hstmt);
+       BM_CATCH_ERROR_P((rc == BATTERY_MONITOR_ERROR_NONE), {}, rc, ("finalize error"));
+       hstmt = NULL;
+       *error_code = BATTERY_MONITOR_ERROR_NONE;
+
+CATCH:
+       if (hstmt != NULL) {
+               rc = bm_query_finalize(hstmt);
+               if (rc != BATTERY_MONITOR_ERROR_NONE) {
+                       *error_code = rc;
+                       _ERR("finalize error");
+               }
+               hstmt = NULL;
+       }
+       if ((*error_code != BATTERY_MONITOR_ERROR_NONE) && bm_resource_type) {
+               BM_FREE(bm_resource_type);
+               bm_resource_type = NULL;
+       }
+       if ((*error_code == BATTERY_MONITOR_ERROR_NONE) && bm_resource_type != NULL) {
+               _INFO("Returning battery plug time");
+               return bm_resource_type;
+       }
+       EXIT;
+       return NULL;
+}
+
 static int bm_delete_table(sqlite3 *bm_db_handle, bm_stmt *phstmt, int num_app_id, const char *app_id, const char* table)
 {
        ENTER;
@@ -2081,7 +2227,8 @@ static int bm_delete_table_by_time_interval(sqlite3 *bm_db_handle, const char* t
        BM_RETURN_VAL((bm_db_handle != NULL), {}, BATTERY_MONITOR_ERROR_DB_NOT_OPENED, ("The database isn't connected."));
        BM_RETURN_VAL((table != NULL), {}, BATTERY_MONITOR_ERROR_INVALID_PARAMETER, ("table is null!"));
 
-       if ((g_strcmp0(table, BATTERY_MONITOR_APP_ID_USAGE_TABLE) == 0 || g_strcmp0(table, BATTERY_MONITOR_RESOURCE_ID_USAGE_TABLE) == 0))
+       if ((g_strcmp0(table, BATTERY_MONITOR_APP_ID_USAGE_TABLE) == 0 || g_strcmp0(table, BATTERY_MONITOR_RESOURCE_ID_USAGE_TABLE) == 0
+                               || g_strcmp0(table, BATTERY_MONITOR_RES_ID_BASE_USAGE_TABLE) == 0))
                BM_SNPRINTF(query, sizeof(query), "DELETE FROM %s WHERE log_time <= %ld", table, duration);
        else
                BM_SNPRINTF(query, sizeof(query), "DELETE FROM %s WHERE time_s <= %ld", table, duration);
@@ -2213,6 +2360,49 @@ int bm_server_resource_usage_insert_to_db(resourceid_usage_s *bm_resource_type)
        return BATTERY_MONITOR_ERROR_NONE;
 }
 
+int bm_server_resource_base_usage_insert_to_db(resourceid_usage_s *bm_resource_type)
+{
+       ENTER;
+
+       int error_code = BATTERY_MONITOR_ERROR_NONE;
+       int ret_transaction = 0;
+
+       BM_RETURN_VAL((g_hBatteryMonitorDB != NULL), {}, BATTERY_MONITOR_ERROR_DB_NOT_OPENED, ("The database isn't connected."));
+       BM_RETURN_VAL((bm_resource_type != NULL), {}, BATTERY_MONITOR_ERROR_INVALID_PARAMETER, ("The Battery Monitor Handle is NULL"));
+
+       pthread_mutex_lock(&battery_monitor_mutex);
+
+       /* Transaction Control Required */
+       ret_transaction = bm_begin_transaction(g_hBatteryMonitorDB);
+       if (bm_db_err_code(g_hBatteryMonitorDB) == SQLITE_PERM) {
+               pthread_mutex_unlock(&battery_monitor_mutex);
+               _ERR("Access failed(%s)", bm_db_err_msg(g_hBatteryMonitorDB));
+               return BATTERY_MONITOR_ERROR_PERMISSION_DENIED;
+       }
+       if (ret_transaction == BATTERY_MONITOR_ERROR_DATABASE_BUSY) {
+               _ERR("Resource Base Usage insert:bm_begin_transaction fail %d\n", ret_transaction);
+               pthread_mutex_unlock(&battery_monitor_mutex);
+               return BATTERY_MONITOR_ERROR_DATABASE_BUSY;
+       } else if (ret_transaction != BATTERY_MONITOR_ERROR_NONE) {
+               _ERR("Resource Base Usage insert:bm_begin_transaction fail %d\n", ret_transaction);
+               pthread_mutex_unlock(&battery_monitor_mutex);
+               return ret_transaction;
+       }
+
+       error_code = bm_resourceid_base_usage_insert_to_db(g_hBatteryMonitorDB, bm_resource_type);
+       if (error_code != BATTERY_MONITOR_ERROR_NONE) {
+               ret_transaction = bm_end_transaction(g_hBatteryMonitorDB, false);
+               _ERR("INSERT resource base usage fail, rollback insert query(%d)!!!!\n", ret_transaction);
+               pthread_mutex_unlock(&battery_monitor_mutex);
+               return error_code;
+       }
+       pthread_mutex_unlock(&battery_monitor_mutex);
+       bm_end_transaction(g_hBatteryMonitorDB, true);
+
+       EXIT;
+       return BATTERY_MONITOR_ERROR_NONE;
+}
+
 int bm_server_app_usage_insert_to_db(appid_usage_s *bm_app_type)
 {
        ENTER;
@@ -2321,6 +2511,34 @@ resourceid_usage_s *bm_server_query_resource_usage_resourceid_ci(const char *res
        return bm_resource_type;
 }
 
+resourceid_usage_s *bm_server_query_resource_base_usage_resourceid_ci(const char *resource_id, long long s_time, long long e_time, int *error_code)
+{
+       resourceid_usage_s *bm_resource_type = NULL;
+       *error_code = BATTERY_MONITOR_ERROR_NONE;
+
+       BM_RETURN_VAL((g_hBatteryMonitorDB != NULL), { *error_code = BATTERY_MONITOR_ERROR_DB_NOT_OPENED; }, NULL, ("The database isn't connected."));
+       BM_RETURN_VAL((resource_id != NULL), { *error_code = BATTERY_MONITOR_ERROR_INVALID_PARAMETER; }, NULL, ("The Battery Monitor Handle is NULL"));
+
+       bm_resource_type = bm_query_base_usage_by_resourceid_ci(g_hBatteryMonitorDB, resource_id, s_time, e_time, error_code);
+
+       EXIT;
+       return bm_resource_type;
+}
+
+resourceid_usage_s *bm_server_query_battery_last_charge(const char *resource_id, int *error_code)
+{
+       resourceid_usage_s *bm_resource_type = NULL;
+       *error_code = BATTERY_MONITOR_ERROR_NONE;
+
+       BM_RETURN_VAL((g_hBatteryMonitorDB != NULL), { *error_code = BATTERY_MONITOR_ERROR_DB_NOT_OPENED; }, NULL, ("The database isn't connected."));
+       BM_RETURN_VAL((resource_id != NULL), { *error_code = BATTERY_MONITOR_ERROR_INVALID_PARAMETER; }, NULL, ("The Battery Monitor Handle is NULL"));
+
+       bm_resource_type = bm_query_battery_last_charge(g_hBatteryMonitorDB, resource_id, error_code);
+
+       EXIT;
+       return bm_resource_type;
+}
+
 GSList* bm_server_query_appid_map(int *error_code)
 {
        ENTER;
@@ -2395,6 +2613,13 @@ int bm_server_delete_table_by_time_interval(void)
                pthread_mutex_unlock(&battery_monitor_mutex);
                return error_code;
        }
+       error_code = bm_delete_table_by_time_interval(g_hBatteryMonitorDB, BATTERY_MONITOR_RES_ID_BASE_USAGE_TABLE);
+       if (error_code != BATTERY_MONITOR_ERROR_NONE) {
+               ret_transaction = bm_end_transaction(g_hBatteryMonitorDB, false);
+               _ERR("Delete old resource base usage fail, rollback delete query(%d)!!!!\n", ret_transaction);
+               pthread_mutex_unlock(&battery_monitor_mutex);
+               return error_code;
+       }
        error_code = bm_delete_table_by_time_interval(g_hBatteryMonitorDB, BATTERY_MONITOR_GBL_BLE_STAT_TABLE);
        if (error_code != BATTERY_MONITOR_ERROR_NONE) {
                ret_transaction = bm_end_transaction(g_hBatteryMonitorDB, false);
index 0a2b90e..ea86712 100644 (file)
@@ -332,22 +332,7 @@ void bm_data_free(gpointer data)
        return;
 }
 
-void bm_atm_st1_free(gpointer data)
-{
-       ENTER;
-
-       if (!data) {
-               _ERR("data handle is null");
-               return;
-       }
-
-       BM_FREE(data);
-
-       EXIT;
-       return;
-}
-
-void bm_atm_st2_free(gpointer data)
+void bm_atm_free(gpointer data)
 {
        ENTER;
 
@@ -371,6 +356,7 @@ void bm_appid_usage_free(appid_usage_s *data)
                return;
        }
 
+       BM_FREE(data->AppId);
        BM_FREE(data);
 
        EXIT;
@@ -386,6 +372,7 @@ void bm_resourceid_usage_free(resourceid_usage_s *data)
                return;
        }
 
+       BM_FREE(data->ResourceId);
        BM_FREE(data);
 
        EXIT;
@@ -422,12 +409,12 @@ void bm_set_free_atm_st2_list(GSList *atm_list)
                        atm_list_iterator = atm_list_iterator->next) {
 
                app_time_map_st2 *atm_node = (app_time_map_st2 *)atm_list_iterator->data;
-               if (atm_node != NULL && !atm_node->app_id)
+               if (atm_node != NULL && atm_node->app_id)
                        BM_FREE(atm_node->app_id);
        }
 
        /* free atm-list */
-       g_slist_free(atm_list);
+       g_slist_free_full(atm_list, free);
 
        EXIT;
        return;
@@ -448,12 +435,12 @@ void bm_set_free_atm_st1_list(GSList *atm_list)
                        atm_list_iterator = atm_list_iterator->next) {
 
                app_time_map_st1 *atm_node = (app_time_map_st1 *)atm_list_iterator->data;
-               if (atm_node != NULL && !atm_node->app_id)
+               if (atm_node != NULL && atm_node->app_id)
                        BM_FREE(atm_node->app_id);
        }
 
        /* free atm-list */
-       g_slist_free(atm_list);
+       g_slist_free_full(atm_list, free);
 
        EXIT;
        return;
@@ -495,7 +482,7 @@ void bm_set_free_ble_data_handle(bm_bluetooth_st **bt_handle)
        _DBG("after atm_list free");
 
        /* free data-list */
-       g_slist_free(handle->bt_data_list);
+       g_slist_free_full(handle->bt_data_list, free);
 
        _DBG("after data_list free");
 
@@ -542,7 +529,7 @@ void bm_set_free_wifi_data_handle(bm_wifi_st **wifi_handle)
        _DBG("after atm_list free");
 
        /* free data-list */
-       g_slist_free(handle->wifi_data_list);
+       g_slist_free_full(handle->wifi_data_list, free);
 
        _DBG("after data_list free");
 
@@ -590,7 +577,7 @@ void bm_set_free_cpu_data_handle(bm_cpu_st **cpu_handle)
        _DBG("after atm_list free");
 
        /* free data-list */
-       g_slist_free(handle->cpu_data_list);
+       g_slist_free_full(handle->cpu_data_list, free);
 
        _DBG("after data_list free");
 
@@ -638,7 +625,7 @@ void bm_set_free_display_data_handle(bm_display_st **display_handle)
        _DBG("after atm_list free");
 
        /* free data-list */
-       g_slist_free(handle->display_list);
+       g_slist_free_full(handle->display_list, free);
 
        _DBG("after data_list free");
 
@@ -685,7 +672,7 @@ void bm_set_free_device_network_data_handle(bm_device_network_st **dn_handle)
        _DBG("after atm_list free");
 
        /* free data-list */
-       g_slist_free(handle->dn_data_list);
+       g_slist_free_full(handle->dn_data_list, free);
 
        _DBG("after data_list free");
 
@@ -733,7 +720,7 @@ void bm_set_free_gps_sensor_data_handle(bm_gps_st **gps_handle)
        _DBG("after atm_list free");
 
        /* free data-list */
-       g_slist_free(handle->gps_data_list);
+       g_slist_free_full(handle->gps_data_list, free);
 
        _DBG("after data_list free");
 
@@ -780,7 +767,7 @@ void bm_set_free_hrm_sensor_data_handle(bm_hrm_sensor_st **hrm_handle)
        _DBG("after atm_list free");
 
        /* free data-list */
-       g_slist_free(handle->hrm_data_list);
+       g_slist_free_full(handle->hrm_data_list, free);
 
        _DBG("after data_list free");