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 FakeEnergyConsumer : public PowerStats::IEnergyConsumer { 33*4d7e907cSAndroid Build Coastguard Worker public: FakeEnergyConsumer(EnergyConsumerType type,std::string name)34*4d7e907cSAndroid Build Coastguard Worker FakeEnergyConsumer(EnergyConsumerType type, std::string name) : mType(type), mName(name) { 35*4d7e907cSAndroid Build Coastguard Worker mResult.timestampMs = 0; 36*4d7e907cSAndroid Build Coastguard Worker mResult.energyUWs = 0; 37*4d7e907cSAndroid Build Coastguard Worker mResult.attribution = {}; 38*4d7e907cSAndroid Build Coastguard Worker } 39*4d7e907cSAndroid Build Coastguard Worker 40*4d7e907cSAndroid Build Coastguard Worker ~FakeEnergyConsumer() = default; 41*4d7e907cSAndroid Build Coastguard Worker getName()42*4d7e907cSAndroid Build Coastguard Worker std::string getName() override { return mName; } 43*4d7e907cSAndroid Build Coastguard Worker getType()44*4d7e907cSAndroid Build Coastguard Worker EnergyConsumerType getType() override { return mType; } 45*4d7e907cSAndroid Build Coastguard Worker getEnergyConsumed()46*4d7e907cSAndroid Build Coastguard Worker std::optional<EnergyConsumerResult> getEnergyConsumed() override { 47*4d7e907cSAndroid Build Coastguard Worker mFakeEnergyConsumerResult.update(&mResult); 48*4d7e907cSAndroid Build Coastguard Worker return mResult; 49*4d7e907cSAndroid Build Coastguard Worker } 50*4d7e907cSAndroid Build Coastguard Worker 51*4d7e907cSAndroid Build Coastguard Worker private: 52*4d7e907cSAndroid Build Coastguard Worker class FakeEnergyConsumerResult { 53*4d7e907cSAndroid Build Coastguard Worker public: FakeEnergyConsumerResult()54*4d7e907cSAndroid Build Coastguard Worker FakeEnergyConsumerResult() : mDistribution(1, 100) {} update(EnergyConsumerResult * result)55*4d7e907cSAndroid Build Coastguard Worker void update(EnergyConsumerResult* result) { 56*4d7e907cSAndroid Build Coastguard Worker // generates number in the range 1..100 57*4d7e907cSAndroid Build Coastguard Worker auto randNum = std::bind(mDistribution, mGenerator); 58*4d7e907cSAndroid Build Coastguard Worker 59*4d7e907cSAndroid Build Coastguard Worker // Get current time since boot in milliseconds 60*4d7e907cSAndroid Build Coastguard Worker uint64_t now = std::chrono::time_point_cast<std::chrono::milliseconds>( 61*4d7e907cSAndroid Build Coastguard Worker ::android::base::boot_clock::now()) 62*4d7e907cSAndroid Build Coastguard Worker .time_since_epoch() 63*4d7e907cSAndroid Build Coastguard Worker .count(); 64*4d7e907cSAndroid Build Coastguard Worker result->timestampMs = now; 65*4d7e907cSAndroid Build Coastguard Worker result->energyUWs += randNum() * 100; 66*4d7e907cSAndroid Build Coastguard Worker } 67*4d7e907cSAndroid Build Coastguard Worker 68*4d7e907cSAndroid Build Coastguard Worker private: 69*4d7e907cSAndroid Build Coastguard Worker std::default_random_engine mGenerator; 70*4d7e907cSAndroid Build Coastguard Worker std::uniform_int_distribution<int> mDistribution; 71*4d7e907cSAndroid Build Coastguard Worker }; 72*4d7e907cSAndroid Build Coastguard Worker 73*4d7e907cSAndroid Build Coastguard Worker EnergyConsumerType mType; 74*4d7e907cSAndroid Build Coastguard Worker std::string mName; 75*4d7e907cSAndroid Build Coastguard Worker FakeEnergyConsumerResult mFakeEnergyConsumerResult; 76*4d7e907cSAndroid Build Coastguard Worker EnergyConsumerResult mResult; 77*4d7e907cSAndroid Build Coastguard Worker }; 78*4d7e907cSAndroid Build Coastguard Worker 79*4d7e907cSAndroid Build Coastguard Worker } // namespace stats 80*4d7e907cSAndroid Build Coastguard Worker } // namespace power 81*4d7e907cSAndroid Build Coastguard Worker } // namespace hardware 82*4d7e907cSAndroid Build Coastguard Worker } // namespace android 83*4d7e907cSAndroid Build Coastguard Worker } // namespace aidl