1*4d7e907cSAndroid Build Coastguard Worker /* 2*4d7e907cSAndroid Build Coastguard Worker * Copyright (C) 2021 The Android Open Source Project 3*4d7e907cSAndroid Build Coastguard Worker * 4*4d7e907cSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*4d7e907cSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*4d7e907cSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*4d7e907cSAndroid Build Coastguard Worker * 8*4d7e907cSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*4d7e907cSAndroid Build Coastguard Worker * 10*4d7e907cSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*4d7e907cSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*4d7e907cSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*4d7e907cSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*4d7e907cSAndroid Build Coastguard Worker * limitations under the License. 15*4d7e907cSAndroid Build Coastguard Worker */ 16*4d7e907cSAndroid Build Coastguard Worker 17*4d7e907cSAndroid Build Coastguard Worker #pragma once 18*4d7e907cSAndroid Build Coastguard Worker 19*4d7e907cSAndroid Build Coastguard Worker #include <PowerStats.h> 20*4d7e907cSAndroid Build Coastguard Worker 21*4d7e907cSAndroid Build Coastguard Worker #include <android-base/chrono_utils.h> 22*4d7e907cSAndroid Build Coastguard Worker 23*4d7e907cSAndroid Build Coastguard Worker #include <chrono> 24*4d7e907cSAndroid Build Coastguard Worker #include <random> 25*4d7e907cSAndroid Build Coastguard Worker 26*4d7e907cSAndroid Build Coastguard Worker namespace aidl { 27*4d7e907cSAndroid Build Coastguard Worker namespace android { 28*4d7e907cSAndroid Build Coastguard Worker namespace hardware { 29*4d7e907cSAndroid Build Coastguard Worker namespace power { 30*4d7e907cSAndroid Build Coastguard Worker namespace stats { 31*4d7e907cSAndroid Build Coastguard Worker 32*4d7e907cSAndroid Build Coastguard Worker class FakeEnergyMeter : public PowerStats::IEnergyMeter { 33*4d7e907cSAndroid Build Coastguard Worker public: FakeEnergyMeter(std::vector<std::pair<std::string,std::string>> channelNames)34*4d7e907cSAndroid Build Coastguard Worker FakeEnergyMeter(std::vector<std::pair<std::string, std::string>> channelNames) { 35*4d7e907cSAndroid Build Coastguard Worker int32_t channelId = 0; 36*4d7e907cSAndroid Build Coastguard Worker for (const auto& [name, subsystem] : channelNames) { 37*4d7e907cSAndroid Build Coastguard Worker Channel c; 38*4d7e907cSAndroid Build Coastguard Worker c.id = channelId++; 39*4d7e907cSAndroid Build Coastguard Worker c.name = name; 40*4d7e907cSAndroid Build Coastguard Worker c.subsystem = subsystem; 41*4d7e907cSAndroid Build Coastguard Worker 42*4d7e907cSAndroid Build Coastguard Worker EnergyMeasurement m; 43*4d7e907cSAndroid Build Coastguard Worker m.id = c.id; 44*4d7e907cSAndroid Build Coastguard Worker m.timestampMs = 0; 45*4d7e907cSAndroid Build Coastguard Worker m.durationMs = 0; 46*4d7e907cSAndroid Build Coastguard Worker m.energyUWs = 0; 47*4d7e907cSAndroid Build Coastguard Worker 48*4d7e907cSAndroid Build Coastguard Worker mChannels.push_back(c); 49*4d7e907cSAndroid Build Coastguard Worker mEnergyMeasurements.push_back(m); 50*4d7e907cSAndroid Build Coastguard Worker } 51*4d7e907cSAndroid Build Coastguard Worker } 52*4d7e907cSAndroid Build Coastguard Worker ~FakeEnergyMeter() = default; readEnergyMeter(const std::vector<int32_t> & in_channelIds,std::vector<EnergyMeasurement> * _aidl_return)53*4d7e907cSAndroid Build Coastguard Worker ndk::ScopedAStatus readEnergyMeter(const std::vector<int32_t>& in_channelIds, 54*4d7e907cSAndroid Build Coastguard Worker std::vector<EnergyMeasurement>* _aidl_return) override { 55*4d7e907cSAndroid Build Coastguard Worker for (auto& measurement : mEnergyMeasurements) { 56*4d7e907cSAndroid Build Coastguard Worker mFakeEnergyMeasurement.update(&measurement); 57*4d7e907cSAndroid Build Coastguard Worker } 58*4d7e907cSAndroid Build Coastguard Worker 59*4d7e907cSAndroid Build Coastguard Worker if (in_channelIds.empty()) { 60*4d7e907cSAndroid Build Coastguard Worker *_aidl_return = mEnergyMeasurements; 61*4d7e907cSAndroid Build Coastguard Worker } else { 62*4d7e907cSAndroid Build Coastguard Worker for (int32_t id : in_channelIds) { 63*4d7e907cSAndroid Build Coastguard Worker // check for invalid ids 64*4d7e907cSAndroid Build Coastguard Worker if (id < 0 || id >= mEnergyMeasurements.size()) { 65*4d7e907cSAndroid Build Coastguard Worker return ndk::ScopedAStatus(AStatus_fromExceptionCode(EX_ILLEGAL_ARGUMENT)); 66*4d7e907cSAndroid Build Coastguard Worker } 67*4d7e907cSAndroid Build Coastguard Worker 68*4d7e907cSAndroid Build Coastguard Worker _aidl_return->push_back(mEnergyMeasurements[id]); 69*4d7e907cSAndroid Build Coastguard Worker } 70*4d7e907cSAndroid Build Coastguard Worker } 71*4d7e907cSAndroid Build Coastguard Worker 72*4d7e907cSAndroid Build Coastguard Worker return ndk::ScopedAStatus::ok(); 73*4d7e907cSAndroid Build Coastguard Worker } 74*4d7e907cSAndroid Build Coastguard Worker getEnergyMeterInfo(std::vector<Channel> * _aidl_return)75*4d7e907cSAndroid Build Coastguard Worker ndk::ScopedAStatus getEnergyMeterInfo(std::vector<Channel>* _aidl_return) override { 76*4d7e907cSAndroid Build Coastguard Worker *_aidl_return = mChannels; 77*4d7e907cSAndroid Build Coastguard Worker return ndk::ScopedAStatus::ok(); 78*4d7e907cSAndroid Build Coastguard Worker } 79*4d7e907cSAndroid Build Coastguard Worker 80*4d7e907cSAndroid Build Coastguard Worker private: 81*4d7e907cSAndroid Build Coastguard Worker class FakeEnergyMeasurement { 82*4d7e907cSAndroid Build Coastguard Worker public: FakeEnergyMeasurement()83*4d7e907cSAndroid Build Coastguard Worker FakeEnergyMeasurement() : mDistribution(1, 100) {} update(EnergyMeasurement * measurement)84*4d7e907cSAndroid Build Coastguard Worker void update(EnergyMeasurement* measurement) { 85*4d7e907cSAndroid Build Coastguard Worker // generates number in the range 1..100 86*4d7e907cSAndroid Build Coastguard Worker auto randNum = std::bind(mDistribution, mGenerator); 87*4d7e907cSAndroid Build Coastguard Worker 88*4d7e907cSAndroid Build Coastguard Worker // Get current time since boot in milliseconds 89*4d7e907cSAndroid Build Coastguard Worker uint64_t now = std::chrono::time_point_cast<std::chrono::milliseconds>( 90*4d7e907cSAndroid Build Coastguard Worker ::android::base::boot_clock::now()) 91*4d7e907cSAndroid Build Coastguard Worker .time_since_epoch() 92*4d7e907cSAndroid Build Coastguard Worker .count(); 93*4d7e907cSAndroid Build Coastguard Worker measurement->timestampMs = now; 94*4d7e907cSAndroid Build Coastguard Worker measurement->durationMs = now; 95*4d7e907cSAndroid Build Coastguard Worker measurement->energyUWs += randNum() * 100; 96*4d7e907cSAndroid Build Coastguard Worker } 97*4d7e907cSAndroid Build Coastguard Worker 98*4d7e907cSAndroid Build Coastguard Worker private: 99*4d7e907cSAndroid Build Coastguard Worker std::default_random_engine mGenerator; 100*4d7e907cSAndroid Build Coastguard Worker std::uniform_int_distribution<int> mDistribution; 101*4d7e907cSAndroid Build Coastguard Worker }; 102*4d7e907cSAndroid Build Coastguard Worker 103*4d7e907cSAndroid Build Coastguard Worker std::vector<Channel> mChannels; 104*4d7e907cSAndroid Build Coastguard Worker FakeEnergyMeasurement mFakeEnergyMeasurement; 105*4d7e907cSAndroid Build Coastguard Worker std::vector<EnergyMeasurement> mEnergyMeasurements; 106*4d7e907cSAndroid Build Coastguard Worker }; 107*4d7e907cSAndroid Build Coastguard Worker 108*4d7e907cSAndroid Build Coastguard Worker } // namespace stats 109*4d7e907cSAndroid Build Coastguard Worker } // namespace power 110*4d7e907cSAndroid Build Coastguard Worker } // namespace hardware 111*4d7e907cSAndroid Build Coastguard Worker } // namespace android 112*4d7e907cSAndroid Build Coastguard Worker } // namespace aidl