From a0519357f34c2850cd1c53ec089ba73a278f5e61 Mon Sep 17 00:00:00 2001 From: Benjamin Schwartz Date: Wed, 31 Mar 2021 12:00:43 -0700 Subject: [PATCH] powerstats: Add placeholder energy consumer for bt and wifi Bug: 184092278 Test: dumpsys android.hardware.power.stats.IPowerStats/default Change-Id: I00e277c6ddad81f970e7345870b0bf904ca433e9 --- powerstats/service.cpp | 63 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/powerstats/service.cpp b/powerstats/service.cpp index edc28ac5..16953ee5 100644 --- a/powerstats/service.cpp +++ b/powerstats/service.cpp @@ -46,6 +46,65 @@ using aidl::android::hardware::power::stats::PowerStatsEnergyConsumer; constexpr char kBootHwSoCRev[] = "ro.boot.hw.soc.rev"; +// TODO (b/181070764) (b/182941084): +// Remove this when Wifi/BT energy consumption models are available or revert before ship +using aidl::android::hardware::power::stats::EnergyConsumerResult; +using aidl::android::hardware::power::stats::Channel; +using aidl::android::hardware::power::stats::EnergyMeasurement; +class PlaceholderEnergyConsumer : public PowerStats::IEnergyConsumer { + public: + PlaceholderEnergyConsumer(std::shared_ptr p, EnergyConsumerType type, + std::string name) : kType(type), kName(name), mPowerStats(p), mChannelId(-1) { + std::vector channels; + mPowerStats->getEnergyMeterInfo(&channels); + + for (const auto &c : channels) { + if (c.name == "VSYS_PWR_WLAN_BT") { + mChannelId = c.id; + break; + } + } + } + std::pair getInfo() override { return {kType, kName}; } + + std::optional getEnergyConsumed() override { + int64_t totalEnergyUWs = 0; + int64_t timestampMs = 0; + if (mChannelId != -1) { + std::vector measurements; + if (mPowerStats->readEnergyMeter({mChannelId}, &measurements).isOk()) { + for (const auto &m : measurements) { + totalEnergyUWs += m.energyUWs; + timestampMs = m.timestampMs; + } + } else { + LOG(ERROR) << "Failed to read energy meter"; + return {}; + } + } + + return EnergyConsumerResult{.timestampMs = timestampMs, + .energyUWs = totalEnergyUWs>>1}; + } + + std::string getConsumerName() override { + return kName; + }; + + private: + const EnergyConsumerType kType; + const std::string kName; + std::shared_ptr mPowerStats; + int32_t mChannelId; +}; + +void addPlaceholderEnergyConsumers(std::shared_ptr p) { + p->addEnergyConsumer( + std::make_unique(p, EnergyConsumerType::WIFI, "Wifi")); + p->addEnergyConsumer( + std::make_unique(p, EnergyConsumerType::BLUETOOTH, "BT")); +} + void addAoC(std::shared_ptr p) { std::string prefix = "/sys/devices/platform/19000000.aoc/control/"; @@ -540,6 +599,10 @@ int main() { addWifi(p); addUfs(p); + // TODO (b/181070764) (b/182941084): + // Remove this when Wifi/BT energy consumption models are available or revert before ship + addPlaceholderEnergyConsumers(p); + const std::string instance = std::string() + PowerStats::descriptor + "/default"; binder_status_t status = AServiceManager_addService(p->asBinder().get(), instance.c_str()); LOG_ALWAYS_FATAL_IF(status != STATUS_OK);