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#include "stats_helper.h" 16d590543dSopenharmony_ci 17d590543dSopenharmony_ci#include <ctime> 18d590543dSopenharmony_ci 19d590543dSopenharmony_ci#include "battery_stats_info.h" 20d590543dSopenharmony_ci 21d590543dSopenharmony_cinamespace OHOS { 22d590543dSopenharmony_cinamespace PowerMgr { 23d590543dSopenharmony_ciint64_t StatsHelper::latestUnplugBootTimeMs_ = StatsUtils::DEFAULT_VALUE; 24d590543dSopenharmony_ciint64_t StatsHelper::latestUnplugUpTimeMs_ = StatsUtils::DEFAULT_VALUE; 25d590543dSopenharmony_ciint64_t StatsHelper::onBatteryBootTimeMs_ = StatsUtils::DEFAULT_VALUE; 26d590543dSopenharmony_ciint64_t StatsHelper::onBatteryUpTimeMs_ = StatsUtils::DEFAULT_VALUE; 27d590543dSopenharmony_cibool StatsHelper::onBattery_ = false; 28d590543dSopenharmony_cibool StatsHelper::screenOff_ = false; 29d590543dSopenharmony_ci 30d590543dSopenharmony_ciint64_t StatsHelper::GetBootTimeMs() 31d590543dSopenharmony_ci{ 32d590543dSopenharmony_ci int64_t bootTimeMs = StatsUtils::DEFAULT_VALUE; 33d590543dSopenharmony_ci struct timespec rawBootTime; 34d590543dSopenharmony_ci int errCode = clock_gettime(CLOCK_BOOTTIME, &rawBootTime); 35d590543dSopenharmony_ci if (errCode != 0) { 36d590543dSopenharmony_ci STATS_HILOGE(COMP_SVC, "Get boot time failed, return default time"); 37d590543dSopenharmony_ci } else { 38d590543dSopenharmony_ci bootTimeMs = static_cast<int64_t>(rawBootTime.tv_sec * StatsUtils::MS_IN_SECOND + 39d590543dSopenharmony_ci rawBootTime.tv_nsec / StatsUtils::NS_IN_MS); 40d590543dSopenharmony_ci STATS_HILOGD(COMP_SVC, "Get boot time: %{public}" PRId64 "", bootTimeMs); 41d590543dSopenharmony_ci } 42d590543dSopenharmony_ci return bootTimeMs; 43d590543dSopenharmony_ci} 44d590543dSopenharmony_ci 45d590543dSopenharmony_ciint64_t StatsHelper::GetUpTimeMs() 46d590543dSopenharmony_ci{ 47d590543dSopenharmony_ci int64_t upTimeMs = StatsUtils::DEFAULT_VALUE; 48d590543dSopenharmony_ci struct timespec rawUpTime; 49d590543dSopenharmony_ci int errCode = clock_gettime(CLOCK_MONOTONIC, &rawUpTime); 50d590543dSopenharmony_ci if (errCode != 0) { 51d590543dSopenharmony_ci STATS_HILOGE(COMP_SVC, "Get up time failed, return default time"); 52d590543dSopenharmony_ci } else { 53d590543dSopenharmony_ci upTimeMs = static_cast<int64_t>(rawUpTime.tv_sec * StatsUtils::MS_IN_SECOND + 54d590543dSopenharmony_ci rawUpTime.tv_nsec / StatsUtils::NS_IN_MS); 55d590543dSopenharmony_ci STATS_HILOGD(COMP_SVC, "Get up time: %{public}" PRId64 "", upTimeMs); 56d590543dSopenharmony_ci } 57d590543dSopenharmony_ci return upTimeMs; 58d590543dSopenharmony_ci} 59d590543dSopenharmony_ci 60d590543dSopenharmony_civoid StatsHelper::SetOnBattery(bool onBattery) 61d590543dSopenharmony_ci{ 62d590543dSopenharmony_ci if (onBattery_ != onBattery) { 63d590543dSopenharmony_ci onBattery_ = onBattery; 64d590543dSopenharmony_ci // when onBattery is ture, status is unplugin. 65d590543dSopenharmony_ci int64_t currentBootTimeMs = GetBootTimeMs(); 66d590543dSopenharmony_ci int64_t currentUpTimeMs = GetUpTimeMs(); 67d590543dSopenharmony_ci if (onBattery) { 68d590543dSopenharmony_ci latestUnplugBootTimeMs_ = currentBootTimeMs; 69d590543dSopenharmony_ci latestUnplugUpTimeMs_ = currentUpTimeMs; 70d590543dSopenharmony_ci } else { 71d590543dSopenharmony_ci onBatteryBootTimeMs_ += currentBootTimeMs - latestUnplugBootTimeMs_; 72d590543dSopenharmony_ci onBatteryUpTimeMs_ += currentUpTimeMs - latestUnplugUpTimeMs_; 73d590543dSopenharmony_ci } 74d590543dSopenharmony_ci STATS_HILOGI(COMP_SVC, "Update battery state: %{public}d", onBattery); 75d590543dSopenharmony_ci } 76d590543dSopenharmony_ci} 77d590543dSopenharmony_ci 78d590543dSopenharmony_civoid StatsHelper::SetScreenOff(bool screenOff) 79d590543dSopenharmony_ci{ 80d590543dSopenharmony_ci if (screenOff_ != screenOff) { 81d590543dSopenharmony_ci screenOff_ = screenOff; 82d590543dSopenharmony_ci STATS_HILOGD(COMP_SVC, "Update screen off state: %{public}d", screenOff); 83d590543dSopenharmony_ci } 84d590543dSopenharmony_ci} 85d590543dSopenharmony_ci 86d590543dSopenharmony_cibool StatsHelper::IsOnBattery() 87d590543dSopenharmony_ci{ 88d590543dSopenharmony_ci return onBattery_; 89d590543dSopenharmony_ci} 90d590543dSopenharmony_ci 91d590543dSopenharmony_cibool StatsHelper::IsOnBatteryScreenOff() 92d590543dSopenharmony_ci{ 93d590543dSopenharmony_ci return onBattery_ && screenOff_; 94d590543dSopenharmony_ci} 95d590543dSopenharmony_ci 96d590543dSopenharmony_ciint64_t StatsHelper::GetOnBatteryBootTimeMs() 97d590543dSopenharmony_ci{ 98d590543dSopenharmony_ci int64_t onBatteryBootTimeMs = onBatteryBootTimeMs_; 99d590543dSopenharmony_ci int64_t currentBootTimeMs = GetBootTimeMs(); 100d590543dSopenharmony_ci if (IsOnBattery()) { 101d590543dSopenharmony_ci onBatteryBootTimeMs += currentBootTimeMs - latestUnplugBootTimeMs_; 102d590543dSopenharmony_ci } 103d590543dSopenharmony_ci STATS_HILOGD(COMP_SVC, "Get on battery boot time: %{public}" PRId64 ", currentBootTimeMs: %{public}" PRId64 "," \ 104d590543dSopenharmony_ci "latestUnplugBootTimeMs_: %{public}" PRId64 "", 105d590543dSopenharmony_ci onBatteryBootTimeMs, currentBootTimeMs, latestUnplugBootTimeMs_); 106d590543dSopenharmony_ci return onBatteryBootTimeMs; 107d590543dSopenharmony_ci} 108d590543dSopenharmony_ci 109d590543dSopenharmony_ciint64_t StatsHelper::GetOnBatteryUpTimeMs() 110d590543dSopenharmony_ci{ 111d590543dSopenharmony_ci int64_t onBatteryUpTimeMs = onBatteryUpTimeMs_; 112d590543dSopenharmony_ci int64_t currentUpTimeMs = GetUpTimeMs(); 113d590543dSopenharmony_ci if (IsOnBattery()) { 114d590543dSopenharmony_ci onBatteryUpTimeMs += currentUpTimeMs - latestUnplugUpTimeMs_; 115d590543dSopenharmony_ci } 116d590543dSopenharmony_ci STATS_HILOGD(COMP_SVC, "Get on battery up time: %{public}" PRId64 "", onBatteryUpTimeMs); 117d590543dSopenharmony_ci return onBatteryUpTimeMs; 118d590543dSopenharmony_ci} 119d590543dSopenharmony_ci} // namespace PowerMgr 120d590543dSopenharmony_ci} // namespace OHOS