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