1/* 2 * Copyright (c) 2021-2023 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16#include "entities/wifi_entity.h" 17 18#include <cinttypes> 19 20#include "battery_stats_service.h" 21#include "stats_log.h" 22 23namespace OHOS { 24namespace PowerMgr { 25namespace { 26} 27 28WifiEntity::WifiEntity() 29{ 30 consumptionType_ = BatteryStatsInfo::CONSUMPTION_TYPE_WIFI; 31} 32 33void WifiEntity::Calculate(int32_t uid) 34{ 35 auto bss = BatteryStatsService::GetInstance(); 36 // Calculate Wifi on power 37 auto wifiOnAverageMa = bss->GetBatteryStatsParser()->GetAveragePowerMa(StatsUtils::CURRENT_WIFI_ON); 38 auto wifiOnTimeMs = GetActiveTimeMs(StatsUtils::STATS_TYPE_WIFI_ON); 39 auto wifiOnPowerMah = wifiOnAverageMa * wifiOnTimeMs / StatsUtils::MS_IN_HOUR; 40 41 // Calculate Wifi scan power 42 auto wifiScanAverageMa = bss->GetBatteryStatsParser()->GetAveragePowerMa(StatsUtils::CURRENT_WIFI_SCAN); 43 auto wifiScanCount = GetConsumptionCount(StatsUtils::STATS_TYPE_WIFI_SCAN); 44 auto wifiScanPowerMah = wifiScanAverageMa * wifiScanCount; 45 46 wifiPowerMah_ = wifiOnPowerMah + wifiScanPowerMah; 47 totalPowerMah_ += wifiPowerMah_; 48 std::shared_ptr<BatteryStatsInfo> statsInfo = std::make_shared<BatteryStatsInfo>(); 49 statsInfo->SetConsumptioType(BatteryStatsInfo::CONSUMPTION_TYPE_WIFI); 50 statsInfo->SetPower(wifiPowerMah_); 51 statsInfoList_.push_back(statsInfo); 52 STATS_HILOGD(COMP_SVC, "Calculate wifi power consumption: %{public}lfmAh", wifiPowerMah_); 53} 54 55int64_t WifiEntity::GetActiveTimeMs(StatsUtils::StatsType statsType, int16_t level) 56{ 57 int64_t time = StatsUtils::DEFAULT_VALUE; 58 if (statsType != StatsUtils::STATS_TYPE_WIFI_ON) { 59 return time; 60 } 61 if (wifiOnTimer_) { 62 time = wifiOnTimer_->GetRunningTimeMs(); 63 STATS_HILOGD(COMP_SVC, "Get wifi on time: %{public}" PRId64 "ms", time); 64 return time; 65 } 66 STATS_HILOGD(COMP_SVC, "Wifi has not been turned on yet, return 0"); 67 return time; 68} 69 70double WifiEntity::GetEntityPowerMah(int32_t uidOrUserId) 71{ 72 return wifiPowerMah_; 73} 74 75double WifiEntity::GetStatsPowerMah(StatsUtils::StatsType statsType, int32_t uid) 76{ 77 return wifiPowerMah_; 78} 79 80int64_t WifiEntity::GetConsumptionCount(StatsUtils::StatsType statsType, int32_t uid) 81{ 82 int64_t count = StatsUtils::DEFAULT_VALUE; 83 if (statsType != StatsUtils::STATS_TYPE_WIFI_SCAN) { 84 return count; 85 } 86 if (wifiScanCounter_) { 87 count = wifiScanCounter_->GetCount(); 88 STATS_HILOGD(COMP_SVC, "Get wifi scan count: %{public}" PRId64 "", count); 89 return count; 90 } 91 STATS_HILOGD(COMP_SVC, "Wifi scan has not been triggered yet, return 0"); 92 return count; 93} 94 95std::shared_ptr<StatsHelper::ActiveTimer> WifiEntity::GetOrCreateTimer(StatsUtils::StatsType statsType, int16_t level) 96{ 97 if (statsType != StatsUtils::STATS_TYPE_WIFI_ON) { 98 return nullptr; 99 } 100 101 if (wifiOnTimer_ != nullptr) { 102 STATS_HILOGD(COMP_SVC, "Get wifi on timer"); 103 return wifiOnTimer_; 104 } 105 wifiOnTimer_ = std::make_shared<StatsHelper::ActiveTimer>(); 106 return wifiOnTimer_; 107} 108 109std::shared_ptr<StatsHelper::Counter> WifiEntity::GetOrCreateCounter(StatsUtils::StatsType statsType, int32_t uid) 110{ 111 if (statsType != StatsUtils::STATS_TYPE_WIFI_SCAN) { 112 return nullptr; 113 } 114 if (wifiScanCounter_ != nullptr) { 115 STATS_HILOGD(COMP_SVC, "Get wifi scan counter"); 116 return wifiScanCounter_; 117 } 118 STATS_HILOGD(COMP_SVC, "Create wifi scan counter"); 119 wifiScanCounter_ = std::make_shared<StatsHelper::Counter>(); 120 return wifiScanCounter_; 121} 122 123void WifiEntity::Reset() 124{ 125 // Reset Wifi power consumption 126 wifiPowerMah_ = StatsUtils::DEFAULT_VALUE; 127 128 // Reset Wifi on timer 129 if (wifiOnTimer_) { 130 wifiOnTimer_->Reset(); 131 } 132 133 // Reset Wifi scan counter 134 if (wifiScanCounter_) { 135 wifiScanCounter_->Reset(); 136 } 137} 138 139void WifiEntity::DumpInfo(std::string& result, int32_t uid) 140{ 141 int64_t time = GetActiveTimeMs(StatsUtils::STATS_TYPE_WIFI_ON); 142 int64_t conut = GetConsumptionCount(StatsUtils::STATS_TYPE_WIFI_SCAN); 143 result.append("Wifi dump:\n") 144 .append("Wifi on time: ") 145 .append(ToString(time)) 146 .append("ms") 147 .append("\n") 148 .append("Wifi scan count: ") 149 .append(ToString(conut)) 150 .append("\n"); 151} 152} // namespace PowerMgr 153} // namespace OHOS 154