bcl: Support thismeal binary

Add command for dump_power to create thismeal.txt
from thismeal.bin.

Support BatteryMitigationService to monitor
brownout event and generate thismeal.bin.

Test: /vendor/bin/hw/battery_mitigation -d
Bug: 293899466
Change-Id: I3fcbd62af25204a7469dd3952a91cd6d281bccd7
Signed-off-by: samou <samou@google.com>
diff --git a/battery_mitigation/battery_mitigation.cpp b/battery_mitigation/battery_mitigation.cpp
index a09b8a4..79c7ec1 100644
--- a/battery_mitigation/battery_mitigation.cpp
+++ b/battery_mitigation/battery_mitigation.cpp
@@ -18,15 +18,18 @@
 
 #include <android/binder_process.h>
 #include <battery_mitigation/BatteryMitigation.h>
+#include <battery_mitigation/BatteryMitigationService.h>
 #include <sys/resource.h>
 #include <system/thread_defs.h>
 
 #define COUNT_LIMIT 10
 
 using android::hardware::google::pixel::BatteryMitigation;
+using android::hardware::google::pixel::BatteryMitigationService;
 using android::hardware::google::pixel::MitigationConfig;
 
 android::sp<BatteryMitigation> bmSp;
+android::sp<BatteryMitigationService> batteryMitigationService;
 
 const struct MitigationConfig::Config cfg = {
     .SystemPath = {
@@ -86,10 +89,52 @@
     .TriggeredIdxPath = "/sys/devices/virtual/pmic/mitigation/br_stats/triggered_idx",
     .BrownoutStatsPath = "/sys/devices/virtual/pmic/mitigation/br_stats/stats",
     .StoringPath = "/data/vendor/mitigation/thismeal.bin",
-    .BackupPath = "/data/vendor/mitigation/lastmeal.bin",
+    .ParsedThismealPath = "/data/vendor/mitigation/thismeal.txt",
+    .ParsedLastmealPath = "/data/vendor/mitigation/lastmeal.txt",
     .FvpStatsPath = "/sys/devices/platform/acpm_stats/fvp_stats",
-    .PcieModemPath = "/sys/devices/platform/12100000.pcie/power_stats",
-    .PcieWifiPath = "/sys/devices/platform/13120000.pcie/power_stats",
+    .PmicCommon = {
+                /* Main Pmic */
+                {
+                    .OdpmDir = "/sys/bus/iio/devices/iio:device0",
+                    .OdpmEnabledRailsPath = "/sys/bus/iio/devices/iio:device0/enabled_rails",
+                    .PmicNamePath = "/sys/bus/iio/devices/iio:device0/name",
+                },
+                /* Sub Pmic */
+                {
+                    .OdpmDir = "/sys/bus/iio/devices/iio:device1",
+                    .OdpmEnabledRailsPath = "/sys/bus/iio/devices/iio:device1/enabled_rails",
+                    .PmicNamePath = "/sys/bus/iio/devices/iio:device1/name",
+                },
+    },
+    .PlatformSpecific = {
+                /* MIN_SUPPORTED_PLATFORM */
+                {
+                    .MainPmicName = "s2mpg10-odpm\n",
+                    .SubPmicName = "s2mpg11-odpm\n",
+                    .PcieModemPath = "/sys/devices/platform/11920000.pcie/power_stats",
+                    .PcieWifiPath = "/sys/devices/platform/14520000.pcie/power_stats",
+                },
+                {
+                    .MainPmicName = "s2mpg12-odpm\n",
+                    .SubPmicName = "s2mpg13-odpm\n",
+                    .PcieModemPath = "/sys/devices/platform/11920000.pcie/power_stats",
+                    .PcieWifiPath = "/sys/devices/platform/14520000.pcie/power_stats",
+                },
+                {
+                    .MainPmicName = "s2mpg14-odpm\n",
+                    .SubPmicName = "s2mpg15-odpm\n",
+                    .PcieModemPath = "/sys/devices/platform/12100000.pcie/power_stats",
+                    .PcieWifiPath = "/sys/devices/platform/13120000.pcie/power_stats",
+                },
+                /* MAX_SUPPORTED_PLATFORM */
+                {
+                    .MainPmicName = "s2mpg14-odpm\n",
+                    .SubPmicName = "s2mpg15-odpm\n",
+                    .PcieModemPath = "/sys/devices/platform/12100000.pcie/power_stats",
+                    .PcieWifiPath = "/sys/devices/platform/13120000.pcie/power_stats",
+                },
+
+    },
 };
 
 const char kReadyFilePath[] = "/sys/devices/virtual/pmic/mitigation/instruction/ready";
@@ -106,31 +151,60 @@
     return std::string(value);
 }
 
-int main(int /*argc*/, char ** /*argv*/) {
+int main(int argc, char **argv) {
+    std::string cdt = GetSystemProperty(kCDTProperty);
+    int platformNum  = atoi(cdt.substr(5, 1).c_str());
+    batteryMitigationService = new BatteryMitigationService(eventThreadCfg,
+                                                            platformNum);
+    if (!batteryMitigationService) {
+        return 0;
+    }
+    bool platformSupported = batteryMitigationService->isPlatformSupported();
+    bool brownoutStatsBinarySupported = batteryMitigationService->isBrownoutStatsBinarySupported();
+    if (argc == 2) {
+        if(strcmp(argv[1], "-d") == 0 &&
+           brownoutStatsBinarySupported &&
+           platformSupported) {
+            /* Create thismeal.txt from thismeal.bin */
+            batteryMitigationService->genParsedMeal(eventThreadCfg.ParsedThismealPath);
+        }
+        return 0;
+    }
+
     setpriority(PRIO_PROCESS, 0, ANDROID_PRIORITY_AUDIO);
     auto batteryMitigationStartTime = std::chrono::system_clock::now();
     ABinderProcess_setThreadPoolMaxThreadCount(1);
     ABinderProcess_startThreadPool();
-    bmSp = new BatteryMitigation(cfg, eventThreadCfg);
-    if (!bmSp) {
-        return 0;
-    }
-    std::string cdt = GetSystemProperty(kCDTProperty);
-    int platform_num  = atoi(cdt.substr(5, 1).c_str());
-    if (platform_num >= MIN_SUPPORTED_PLATFORM) {
-        bmSp->startBrownoutEventThread();
-    }
-    bool mitigationLogTimeValid = bmSp->isMitigationLogTimeValid(batteryMitigationStartTime,
-                                                                 cfg.LogFilePath,
-                                                                 cfg.TimestampFormat,
-                                                                 kTimestampRegex);
+
+    bool mitigationLogTimeValid;
     std::string reason = android::base::GetProperty(kBRRequestedProperty, "");
-    if (!reason.empty() && mitigationLogTimeValid) {
-        std::ifstream src(cfg.LogFilePath, std::ios::in);
-        std::ofstream dst(kLastMealPath, std::ios::out);
-        dst << src.rdbuf();
-        android::base::SetProperty(kLastMealProperty, "1");
+    if (brownoutStatsBinarySupported) {
+        /* Create lastmeal.txt if the dump time in thismeal.bin are valid */
+        mitigationLogTimeValid = batteryMitigationService->isTimeValid(eventThreadCfg.StoringPath,
+                                                                       batteryMitigationStartTime);
+        if (!reason.empty() && mitigationLogTimeValid &&
+            batteryMitigationService->genParsedMeal(eventThreadCfg.ParsedLastmealPath)) {
+            android::base::SetProperty(kLastMealProperty, "1");
+        }
+        /* Start BrownoutEventThread to poll brownout event from kernel */
+        batteryMitigationService->startBrownoutEventThread();
+    } else{
+        bmSp = new BatteryMitigation(cfg);
+        if (!bmSp) {
+            return 0;
+        }
+        mitigationLogTimeValid = bmSp->isMitigationLogTimeValid(batteryMitigationStartTime,
+                                                                cfg.LogFilePath,
+                                                                cfg.TimestampFormat,
+                                                                kTimestampRegex);
+        if (!reason.empty() && mitigationLogTimeValid) {
+            std::ifstream src(cfg.LogFilePath, std::ios::in);
+            std::ofstream dst(kLastMealPath, std::ios::out);
+            dst << src.rdbuf();
+            android::base::SetProperty(kLastMealProperty, "1");
+        }
     }
+
     bool isBatteryMitigationReady = false;
     std::string ready_str;
     int val = 0;