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