1 /*
2  * Copyright (C) 2020 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #pragma once
18 
19 #include <aidl/android/hardware/power/stats/BnPowerStats.h>
20 
21 #include <unordered_map>
22 
23 namespace aidl {
24 namespace android {
25 namespace hardware {
26 namespace power {
27 namespace stats {
28 
29 class PowerStats : public BnPowerStats {
30   public:
31     class IStateResidencyDataProvider {
32       public:
33         virtual ~IStateResidencyDataProvider() = default;
34         virtual bool getStateResidencies(
35                 std::unordered_map<std::string, std::vector<StateResidency>>* residencies) = 0;
36         virtual std::unordered_map<std::string, std::vector<State>> getInfo() = 0;
37     };
38 
39     class IEnergyConsumer {
40       public:
41         virtual ~IEnergyConsumer() = default;
42         virtual std::string getName() = 0;
43         virtual EnergyConsumerType getType() = 0;
44         virtual std::optional<EnergyConsumerResult> getEnergyConsumed() = 0;
45     };
46 
47     class IEnergyMeter {
48       public:
49         virtual ~IEnergyMeter() = default;
50         virtual ndk::ScopedAStatus readEnergyMeter(
51                 const std::vector<int32_t>& in_channelIds,
52                 std::vector<EnergyMeasurement>* _aidl_return) = 0;
53         virtual ndk::ScopedAStatus getEnergyMeterInfo(std::vector<Channel>* _aidl_return) = 0;
54     };
55 
56     PowerStats() = default;
57 
58     void addStateResidencyDataProvider(std::unique_ptr<IStateResidencyDataProvider> p);
59     void addEnergyConsumer(std::unique_ptr<IEnergyConsumer> p);
60     void setEnergyMeter(std::unique_ptr<IEnergyMeter> p);
61 
62     // Methods from aidl::android::hardware::power::stats::IPowerStats
63     ndk::ScopedAStatus getPowerEntityInfo(std::vector<PowerEntity>* _aidl_return) override;
64     ndk::ScopedAStatus getStateResidency(const std::vector<int32_t>& in_powerEntityIds,
65                                          std::vector<StateResidencyResult>* _aidl_return) override;
66     ndk::ScopedAStatus getEnergyConsumerInfo(std::vector<EnergyConsumer>* _aidl_return) override;
67     ndk::ScopedAStatus getEnergyConsumed(const std::vector<int32_t>& in_energyConsumerIds,
68                                          std::vector<EnergyConsumerResult>* _aidl_return) override;
69     ndk::ScopedAStatus getEnergyMeterInfo(std::vector<Channel>* _aidl_return) override;
70     ndk::ScopedAStatus readEnergyMeter(const std::vector<int32_t>& in_channelIds,
71                                        std::vector<EnergyMeasurement>* _aidl_return) override;
72 
73   private:
74     std::vector<std::unique_ptr<IStateResidencyDataProvider>> mStateResidencyDataProviders;
75     std::vector<PowerEntity> mPowerEntityInfos;
76     /* Index that maps each power entity id to an entry in mStateResidencyDataProviders */
77     std::vector<size_t> mStateResidencyDataProviderIndex;
78 
79     std::vector<std::unique_ptr<IEnergyConsumer>> mEnergyConsumers;
80     std::vector<EnergyConsumer> mEnergyConsumerInfos;
81 
82     std::unique_ptr<IEnergyMeter> mEnergyMeter;
83 };
84 
85 }  // namespace stats
86 }  // namespace power
87 }  // namespace hardware
88 }  // namespace android
89 }  // namespace aidl
90