diff --git a/powerstats/Android.bp b/powerstats/Android.bp index fd3d3050..491498dd 100644 --- a/powerstats/Android.bp +++ b/powerstats/Android.bp @@ -33,6 +33,8 @@ cc_binary { "liblog", "libutils", "android.hardware.power.stats@1.0", + "pixelpowerstats_provider_aidl_interface-cpp", + "libbinder", ], vendor: true, } diff --git a/powerstats/service.cpp b/powerstats/service.cpp index 022f41af..b2d3fd05 100644 --- a/powerstats/service.cpp +++ b/powerstats/service.cpp @@ -17,8 +17,12 @@ #define LOG_TAG "android.hardware.power.stats@1.0-service.pixel" #include +#include +#include +#include #include +#include #include #include #include @@ -40,6 +44,7 @@ using android::hardware::power::stats::V1_0::PowerEntityType; using android::hardware::power::stats::V1_0::implementation::PowerStats; // Pixel specific +using android::hardware::google::pixel::powerstats::AidlStateResidencyDataProvider; using android::hardware::google::pixel::powerstats::GenericStateResidencyDataProvider; using android::hardware::google::pixel::powerstats::PowerEntityConfig; using android::hardware::google::pixel::powerstats::StateResidencyConfig; @@ -65,8 +70,8 @@ int main(int /* argc */, char ** /* argv */) { .totalTimeTransform = rpmConvertToMs, .lastEntrySupported = false}}; - auto rpmSdp = - std::make_shared("/d/system_stats"); + sp rpmSdp = + new GenericStateResidencyDataProvider("/d/system_stats"); uint32_t apssId = service->addPowerEntity("APSS", PowerEntityType::SUBSYSTEM); rpmSdp->addEntity(apssId, PowerEntityConfig("APSS", rpmStateResidencyConfigs)); @@ -80,7 +85,7 @@ int main(int /* argc */, char ** /* argv */) { uint32_t slpiId = service->addPowerEntity("SLPI", PowerEntityType::SUBSYSTEM); rpmSdp->addEntity(slpiId, PowerEntityConfig("SLPI", rpmStateResidencyConfigs)); - service->addStateResidencyDataProvider(std::move(rpmSdp)); + service->addStateResidencyDataProvider(rpmSdp); // Add SoC power entity std::vector socStateResidencyConfigs = { @@ -99,24 +104,43 @@ int main(int /* argc */, char ** /* argv */) { .totalTimePrefix = "actual last sleep(msec):", .lastEntrySupported = false}}; - auto socSdp = - std::make_shared("/d/system_stats"); + sp socSdp = + new GenericStateResidencyDataProvider("/d/system_stats"); uint32_t socId = service->addPowerEntity("SoC", PowerEntityType::POWER_DOMAIN); socSdp->addEntity(socId, PowerEntityConfig(socStateResidencyConfigs)); - service->addStateResidencyDataProvider(std::move(socSdp)); + service->addStateResidencyDataProvider(socSdp); // Add WLAN power entity uint32_t wlanId = service->addPowerEntity("WLAN", PowerEntityType::SUBSYSTEM); - auto wlanSdp = - std::make_shared(wlanId, "/d/wlan0/power_stats"); - service->addStateResidencyDataProvider(std::move(wlanSdp)); + sp wlanSdp = + new WlanStateResidencyDataProvider(wlanId, "/d/wlan0/power_stats"); + service->addStateResidencyDataProvider(wlanSdp); // Add Easel power entity uint32_t easelId = service->addPowerEntity("Easel", PowerEntityType::SUBSYSTEM); - auto easelSdp = std::make_shared(easelId); - service->addStateResidencyDataProvider(std::move(easelSdp)); + sp easelSdp = new EaselStateResidencyDataProvider(easelId); + service->addStateResidencyDataProvider(easelSdp); + + // Add Power Entities that require the Aidl data provider + sp aidlSdp = new AidlStateResidencyDataProvider(); + // TODO(117585786): Add real power entities here + // uint32_t mock1Id = service->addPowerEntity("Mock1", PowerEntityType::SUBSYSTEM); + // aidlSdp->addEntity(mock1Id, "Mock1", {"state_a", "state_b"}); + // uint32_t mock2Id = service->addPowerEntity("Mock2", PowerEntityType::SUBSYSTEM); + // aidlSdp->addEntity(mock2Id, "Mock2", {"state_c", "state_d"}); + + auto serviceStatus = android::defaultServiceManager()->addService( + android::String16("power.stats-vendor"), aidlSdp); + if (serviceStatus != android::OK) { + ALOGE("Unable to register power.stats-vendor service %d", serviceStatus); + return 1; + } + sp ps{android::ProcessState::self()}; // Create non-HW binder threadpool + ps->startThreadPool(); + + service->addStateResidencyDataProvider(aidlSdp); // Configure the threadpool configureRpcThreadpool(1, true /*callerWillJoin*/);