diff --git a/conf/init.gs101.rc b/conf/init.gs101.rc index cdf992f0..f4c2dd17 100644 --- a/conf/init.gs101.rc +++ b/conf/init.gs101.rc @@ -169,6 +169,9 @@ on init # Charge stats (write 0) chown system system /sys/class/power_supply/battery/charge_stats + # Power Stats HAL + chown system system /dev/bbd_pwrstat + # start watchdogd start watchdogd diff --git a/powerstats/Gs101CommonDataProviders.cpp b/powerstats/Gs101CommonDataProviders.cpp index d9d435bf..87dc8648 100644 --- a/powerstats/Gs101CommonDataProviders.cpp +++ b/powerstats/Gs101CommonDataProviders.cpp @@ -494,6 +494,36 @@ void addMobileRadio(std::shared_ptr p) void addGNSS(std::shared_ptr p) { + // A constant to represent the number of microseconds in one millisecond. + const int US_TO_MS = 1000; + + // gnss power_stats are reported in microseconds. The transform function + // converts microseconds to milliseconds. + std::function gnssUsToMs = [](uint64_t a) { return a / US_TO_MS; }; + + const GenericStateResidencyDataProvider::StateResidencyConfig gnssStateConfig = { + .entryCountSupported = true, + .entryCountPrefix = "count:", + .totalTimeSupported = true, + .totalTimePrefix = "duration_usec:", + .totalTimeTransform = gnssUsToMs, + .lastEntrySupported = true, + .lastEntryPrefix = "last_entry_timestamp_usec:", + .lastEntryTransform = gnssUsToMs, + }; + + const std::vector> gnssStateHeaders = { + std::make_pair("ON", "GPS_ON:"), + std::make_pair("OFF", "GPS_OFF:"), + }; + + std::vector cfgs; + cfgs.emplace_back(generateGenericStateResidencyConfigs(gnssStateConfig, gnssStateHeaders), + "GPS", ""); + + p->addStateResidencyDataProvider(std::make_unique( + "/dev/bbd_pwrstat", cfgs)); + p->addEnergyConsumer(PowerStatsEnergyConsumer::createMeterConsumer(p, EnergyConsumerType::GNSS, "GPS", {"L9S_GNSS_CORE"})); }