/* * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef ANDROID_HARDWARE_POWERSTATS_V1_0_POWERSTATS_H #define ANDROID_HARDWARE_POWERSTATS_V1_0_POWERSTATS_H #include #include #include #include #include namespace android { namespace hardware { namespace power { namespace stats { namespace V1_0 { namespace implementation { using ::android::hardware::hidl_vec; using ::android::hardware::kSynchronizedReadWrite; using ::android::hardware::Return; using ::android::hardware::Void; using ::android::hardware::power::stats::V1_0::EnergyData; using ::android::hardware::power::stats::V1_0::PowerEntityInfo; using ::android::hardware::power::stats::V1_0::PowerEntityStateInfo; using ::android::hardware::power::stats::V1_0::PowerEntityStateResidencyData; using ::android::hardware::power::stats::V1_0::PowerEntityStateResidencyResult; using ::android::hardware::power::stats::V1_0::PowerEntityStateSpace; using ::android::hardware::power::stats::V1_0::PowerEntityType; using ::android::hardware::power::stats::V1_0::RailInfo; using ::android::hardware::power::stats::V1_0::Status; typedef MessageQueue MessageQueueSync; struct RailData { std::string devicePath; uint32_t index; std::string subsysName; uint32_t samplingRate; }; struct OnDeviceMmt { std::mutex mLock; bool hwEnabled; std::vector devicePaths; std::map railsInfo; std::vector reading; std::unique_ptr fmqSynchronized; }; class IStateResidencyDataProvider { public: virtual ~IStateResidencyDataProvider() = default; virtual bool getResults( std::unordered_map& results) = 0; virtual std::vector getStateSpaces() = 0; }; struct PowerStats : public IPowerStats { public: PowerStats(); uint32_t addPowerEntity(const std::string& name, PowerEntityType type); void addStateResidencyDataProvider(std::shared_ptr p); // Methods from ::android::hardware::power::stats::V1_0::IPowerStats follow. Return getRailInfo(getRailInfo_cb _hidl_cb) override; Return getEnergyData(const hidl_vec& railIndices, getEnergyData_cb _hidl_cb) override; Return streamEnergyData(uint32_t timeMs, uint32_t samplingRate, streamEnergyData_cb _hidl_cb) override; Return getPowerEntityInfo(getPowerEntityInfo_cb _hidl_cb) override; Return getPowerEntityStateInfo(const hidl_vec& powerEntityIds, getPowerEntityStateInfo_cb _hidl_cb) override; Return getPowerEntityStateResidencyData( const hidl_vec& powerEntityIds, getPowerEntityStateResidencyData_cb _hidl_cb) override; // Methods from ::android::hidl::base::V1_0::IBase follow. Return debug(const hidl_handle& fd, const hidl_vec& args) override; private: OnDeviceMmt mPm; void findIioPowerMonitorNodes(); size_t parsePowerRails(); int parseIioEnergyNode(std::string devName); Status parseIioEnergyNodes(); std::vector mPowerEntityInfos; std::unordered_map mPowerEntityStateSpaces; std::unordered_map> mStateResidencyDataProviders; }; } // namespace implementation } // namespace V1_0 } // namespace stats } // namespace power } // namespace hardware } // namespace android #endif // ANDROID_HARDWARE_POWERSTATS_V1_0_POWERSTATS_H