1d590543dSopenharmony_ci/* 2d590543dSopenharmony_ci * Copyright (c) 2021-2022 Huawei Device Co., Ltd. 3d590543dSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4d590543dSopenharmony_ci * you may not use this file except in compliance with the License. 5d590543dSopenharmony_ci * You may obtain a copy of the License at 6d590543dSopenharmony_ci * 7d590543dSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8d590543dSopenharmony_ci * 9d590543dSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10d590543dSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11d590543dSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12d590543dSopenharmony_ci * See the License for the specific language governing permissions and 13d590543dSopenharmony_ci * limitations under the License. 14d590543dSopenharmony_ci */ 15d590543dSopenharmony_ci 16d590543dSopenharmony_ci#include "entities/audio_entity.h" 17d590543dSopenharmony_ci 18d590543dSopenharmony_ci#include <cinttypes> 19d590543dSopenharmony_ci 20d590543dSopenharmony_ci#include "battery_stats_service.h" 21d590543dSopenharmony_ci#include "stats_log.h" 22d590543dSopenharmony_ci 23d590543dSopenharmony_cinamespace OHOS { 24d590543dSopenharmony_cinamespace PowerMgr { 25d590543dSopenharmony_cinamespace { 26d590543dSopenharmony_ci} 27d590543dSopenharmony_ci 28d590543dSopenharmony_ciAudioEntity::AudioEntity() 29d590543dSopenharmony_ci{ 30d590543dSopenharmony_ci consumptionType_ = BatteryStatsInfo::CONSUMPTION_TYPE_AUDIO; 31d590543dSopenharmony_ci} 32d590543dSopenharmony_ci 33d590543dSopenharmony_ciint64_t AudioEntity::GetActiveTimeMs(int32_t uid, StatsUtils::StatsType statsType, int16_t level) 34d590543dSopenharmony_ci{ 35d590543dSopenharmony_ci int64_t activeTimeMs = StatsUtils::DEFAULT_VALUE; 36d590543dSopenharmony_ci switch (statsType) { 37d590543dSopenharmony_ci case StatsUtils::STATS_TYPE_AUDIO_ON: { 38d590543dSopenharmony_ci auto iter = audioTimerMap_.find(uid); 39d590543dSopenharmony_ci if (iter != audioTimerMap_.end()) { 40d590543dSopenharmony_ci activeTimeMs = iter->second->GetRunningTimeMs(); 41d590543dSopenharmony_ci STATS_HILOGD(COMP_SVC, "Get audio on time: %{public}" PRId64 "ms for uid: %{public}d", 42d590543dSopenharmony_ci activeTimeMs, uid); 43d590543dSopenharmony_ci break; 44d590543dSopenharmony_ci } 45d590543dSopenharmony_ci STATS_HILOGD(COMP_SVC, "Didn't find related timer for uid: %{public}d, return 0", uid); 46d590543dSopenharmony_ci break; 47d590543dSopenharmony_ci } 48d590543dSopenharmony_ci default: 49d590543dSopenharmony_ci break; 50d590543dSopenharmony_ci } 51d590543dSopenharmony_ci return activeTimeMs; 52d590543dSopenharmony_ci} 53d590543dSopenharmony_ci 54d590543dSopenharmony_civoid AudioEntity::Calculate(int32_t uid) 55d590543dSopenharmony_ci{ 56d590543dSopenharmony_ci auto bss = BatteryStatsService::GetInstance(); 57d590543dSopenharmony_ci auto audioOnAverageMa = bss->GetBatteryStatsParser()->GetAveragePowerMa(StatsUtils::CURRENT_AUDIO_ON); 58d590543dSopenharmony_ci auto audioOnTimeMs = GetActiveTimeMs(uid, StatsUtils::STATS_TYPE_AUDIO_ON); 59d590543dSopenharmony_ci auto audioOnPowerMah = audioOnAverageMa * audioOnTimeMs / StatsUtils::MS_IN_HOUR; 60d590543dSopenharmony_ci auto iter = audioPowerMap_.find(uid); 61d590543dSopenharmony_ci if (iter != audioPowerMap_.end()) { 62d590543dSopenharmony_ci STATS_HILOGD(COMP_SVC, "Update audio on power consumption: %{public}lfmAh for uid: %{public}d", 63d590543dSopenharmony_ci audioOnAverageMa, uid); 64d590543dSopenharmony_ci iter->second = audioOnPowerMah; 65d590543dSopenharmony_ci } else { 66d590543dSopenharmony_ci STATS_HILOGD(COMP_SVC, "Create audio on power consumption: %{public}lfmAh for uid: %{public}d", 67d590543dSopenharmony_ci audioOnPowerMah, uid); 68d590543dSopenharmony_ci audioPowerMap_.insert(std::pair<int32_t, double>(uid, audioOnPowerMah)); 69d590543dSopenharmony_ci } 70d590543dSopenharmony_ci} 71d590543dSopenharmony_ci 72d590543dSopenharmony_cidouble AudioEntity::GetEntityPowerMah(int32_t uidOrUserId) 73d590543dSopenharmony_ci{ 74d590543dSopenharmony_ci double power = StatsUtils::DEFAULT_VALUE; 75d590543dSopenharmony_ci auto iter = audioPowerMap_.find(uidOrUserId); 76d590543dSopenharmony_ci if (iter != audioPowerMap_.end()) { 77d590543dSopenharmony_ci power = iter->second; 78d590543dSopenharmony_ci STATS_HILOGD(COMP_SVC, "Get app audio power consumption: %{public}lfmAh for uid: %{public}d", 79d590543dSopenharmony_ci power, uidOrUserId); 80d590543dSopenharmony_ci } else { 81d590543dSopenharmony_ci STATS_HILOGD(COMP_SVC, 82d590543dSopenharmony_ci "No app audio power consumption related to uid: %{public}d was found, return 0", uidOrUserId); 83d590543dSopenharmony_ci } 84d590543dSopenharmony_ci return power; 85d590543dSopenharmony_ci} 86d590543dSopenharmony_ci 87d590543dSopenharmony_cidouble AudioEntity::GetStatsPowerMah(StatsUtils::StatsType statsType, int32_t uid) 88d590543dSopenharmony_ci{ 89d590543dSopenharmony_ci double power = StatsUtils::DEFAULT_VALUE; 90d590543dSopenharmony_ci if (statsType == StatsUtils::STATS_TYPE_AUDIO_ON) { 91d590543dSopenharmony_ci auto audioOnIter = audioPowerMap_.find(uid); 92d590543dSopenharmony_ci if (audioOnIter != audioPowerMap_.end()) { 93d590543dSopenharmony_ci power = audioOnIter->second; 94d590543dSopenharmony_ci STATS_HILOGD(COMP_SVC, "Get audio on power consumption: %{public}lfmAh for uid: %{public}d", 95d590543dSopenharmony_ci power, uid); 96d590543dSopenharmony_ci } else { 97d590543dSopenharmony_ci STATS_HILOGD(COMP_SVC, 98d590543dSopenharmony_ci "No audio on power consumption related to uid: %{public}d was found, return 0", uid); 99d590543dSopenharmony_ci } 100d590543dSopenharmony_ci } 101d590543dSopenharmony_ci return power; 102d590543dSopenharmony_ci} 103d590543dSopenharmony_ci 104d590543dSopenharmony_cistd::shared_ptr<StatsHelper::ActiveTimer> AudioEntity::GetOrCreateTimer(int32_t uid, StatsUtils::StatsType statsType, 105d590543dSopenharmony_ci int16_t level) 106d590543dSopenharmony_ci{ 107d590543dSopenharmony_ci std::shared_ptr<StatsHelper::ActiveTimer> timer = nullptr; 108d590543dSopenharmony_ci switch (statsType) { 109d590543dSopenharmony_ci case StatsUtils::STATS_TYPE_AUDIO_ON: { 110d590543dSopenharmony_ci auto audioOnIter = audioTimerMap_.find(uid); 111d590543dSopenharmony_ci if (audioOnIter != audioTimerMap_.end()) { 112d590543dSopenharmony_ci STATS_HILOGD(COMP_SVC, "Get audio on timer for uid: %{public}d", uid); 113d590543dSopenharmony_ci timer = audioOnIter->second; 114d590543dSopenharmony_ci break; 115d590543dSopenharmony_ci } 116d590543dSopenharmony_ci STATS_HILOGD(COMP_SVC, "Create audio on timer for uid: %{public}d", uid); 117d590543dSopenharmony_ci std::shared_ptr<StatsHelper::ActiveTimer> audioTimer = std::make_shared<StatsHelper::ActiveTimer>(); 118d590543dSopenharmony_ci audioTimerMap_.insert(std::pair<int32_t, std::shared_ptr<StatsHelper::ActiveTimer>>(uid, audioTimer)); 119d590543dSopenharmony_ci timer = audioTimer; 120d590543dSopenharmony_ci break; 121d590543dSopenharmony_ci } 122d590543dSopenharmony_ci default: 123d590543dSopenharmony_ci STATS_HILOGW(COMP_SVC, "Create active timer failed"); 124d590543dSopenharmony_ci break; 125d590543dSopenharmony_ci } 126d590543dSopenharmony_ci return timer; 127d590543dSopenharmony_ci} 128d590543dSopenharmony_ci 129d590543dSopenharmony_civoid AudioEntity::Reset() 130d590543dSopenharmony_ci{ 131d590543dSopenharmony_ci // Reset app Audio on total power consumption 132d590543dSopenharmony_ci for (auto& iter : audioPowerMap_) { 133d590543dSopenharmony_ci iter.second = StatsUtils::DEFAULT_VALUE; 134d590543dSopenharmony_ci } 135d590543dSopenharmony_ci 136d590543dSopenharmony_ci // Reset Audio on timer 137d590543dSopenharmony_ci for (auto& iter : audioTimerMap_) { 138d590543dSopenharmony_ci if (iter.second) { 139d590543dSopenharmony_ci iter.second->Reset(); 140d590543dSopenharmony_ci } 141d590543dSopenharmony_ci } 142d590543dSopenharmony_ci} 143d590543dSopenharmony_ci} // namespace PowerMgr 144d590543dSopenharmony_ci} // namespace OHOS