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#ifndef STATS_HELPER_H
17d590543dSopenharmony_ci#define STATS_HELPER_H
18d590543dSopenharmony_ci
19d590543dSopenharmony_ci#include <cinttypes>
20d590543dSopenharmony_ci
21d590543dSopenharmony_ci#include "stats_log.h"
22d590543dSopenharmony_ci#include "stats_utils.h"
23d590543dSopenharmony_ci
24d590543dSopenharmony_cinamespace OHOS {
25d590543dSopenharmony_cinamespace PowerMgr {
26d590543dSopenharmony_ciclass StatsHelper {
27d590543dSopenharmony_cipublic:
28d590543dSopenharmony_ci    class ActiveTimer {
29d590543dSopenharmony_ci    public:
30d590543dSopenharmony_ci        ActiveTimer() = default;
31d590543dSopenharmony_ci        ~ActiveTimer() = default;
32d590543dSopenharmony_ci        bool StartRunning()
33d590543dSopenharmony_ci        {
34d590543dSopenharmony_ci            if (isRunning_) {
35d590543dSopenharmony_ci                STATS_HILOGD(COMP_SVC, "Active timer was already started");
36d590543dSopenharmony_ci                return false;
37d590543dSopenharmony_ci            }
38d590543dSopenharmony_ci            startTimeMs_ = GetOnBatteryBootTimeMs();
39d590543dSopenharmony_ci            isRunning_ = true;
40d590543dSopenharmony_ci            STATS_HILOGD(COMP_SVC, "Active timer is started");
41d590543dSopenharmony_ci            return true;
42d590543dSopenharmony_ci        }
43d590543dSopenharmony_ci
44d590543dSopenharmony_ci        bool StopRunning()
45d590543dSopenharmony_ci        {
46d590543dSopenharmony_ci            if (!isRunning_) {
47d590543dSopenharmony_ci                STATS_HILOGD(COMP_SVC, "No related active timer is running");
48d590543dSopenharmony_ci                return false;
49d590543dSopenharmony_ci            }
50d590543dSopenharmony_ci            auto stopTimeMs = GetOnBatteryBootTimeMs();
51d590543dSopenharmony_ci            totalTimeMs_ += stopTimeMs - startTimeMs_;
52d590543dSopenharmony_ci            isRunning_ = false;
53d590543dSopenharmony_ci            STATS_HILOGD(COMP_SVC, "Active timer is stopped");
54d590543dSopenharmony_ci            return true;
55d590543dSopenharmony_ci        }
56d590543dSopenharmony_ci
57d590543dSopenharmony_ci        int64_t GetRunningTimeMs()
58d590543dSopenharmony_ci        {
59d590543dSopenharmony_ci            if (isRunning_) {
60d590543dSopenharmony_ci                auto tmpStopTimeMs = GetOnBatteryBootTimeMs();
61d590543dSopenharmony_ci                totalTimeMs_ += tmpStopTimeMs - startTimeMs_;
62d590543dSopenharmony_ci                startTimeMs_ = tmpStopTimeMs;
63d590543dSopenharmony_ci            }
64d590543dSopenharmony_ci            return totalTimeMs_;
65d590543dSopenharmony_ci        }
66d590543dSopenharmony_ci
67d590543dSopenharmony_ci        void AddRunningTimeMs(int64_t avtiveTime)
68d590543dSopenharmony_ci        {
69d590543dSopenharmony_ci            if (avtiveTime > StatsUtils::DEFAULT_VALUE) {
70d590543dSopenharmony_ci                totalTimeMs_ += avtiveTime;
71d590543dSopenharmony_ci                STATS_HILOGD(COMP_SVC, "Add on active Time: %{public}" PRId64 "", avtiveTime);
72d590543dSopenharmony_ci            } else {
73d590543dSopenharmony_ci                STATS_HILOGW(COMP_SVC, "Invalid active time, ignore");
74d590543dSopenharmony_ci            }
75d590543dSopenharmony_ci        }
76d590543dSopenharmony_ci
77d590543dSopenharmony_ci        void Reset()
78d590543dSopenharmony_ci        {
79d590543dSopenharmony_ci            isRunning_ = false;
80d590543dSopenharmony_ci            startTimeMs_ = GetOnBatteryBootTimeMs();
81d590543dSopenharmony_ci            totalTimeMs_ = StatsUtils::DEFAULT_VALUE;
82d590543dSopenharmony_ci        }
83d590543dSopenharmony_ci    private:
84d590543dSopenharmony_ci        bool isRunning_ = false;
85d590543dSopenharmony_ci        int64_t startTimeMs_ = StatsUtils::DEFAULT_VALUE;
86d590543dSopenharmony_ci        int64_t totalTimeMs_ = StatsUtils::DEFAULT_VALUE;
87d590543dSopenharmony_ci    };
88d590543dSopenharmony_ci
89d590543dSopenharmony_ci    class Counter {
90d590543dSopenharmony_ci    public:
91d590543dSopenharmony_ci        Counter() = default;
92d590543dSopenharmony_ci        ~Counter() = default;
93d590543dSopenharmony_ci        void AddCount(int64_t count)
94d590543dSopenharmony_ci        {
95d590543dSopenharmony_ci            if (count > StatsUtils::DEFAULT_VALUE) {
96d590543dSopenharmony_ci                if (IsOnBattery()) {
97d590543dSopenharmony_ci                    totalCount_ += count;
98d590543dSopenharmony_ci                }
99d590543dSopenharmony_ci                STATS_HILOGD(COMP_SVC, "Add data bytes: %{public}" PRId64 ", total data bytes is: %{public}" PRId64 "",
100d590543dSopenharmony_ci                    count, totalCount_);
101d590543dSopenharmony_ci            } else {
102d590543dSopenharmony_ci                STATS_HILOGW(COMP_SVC, "Invalid data counts");
103d590543dSopenharmony_ci            }
104d590543dSopenharmony_ci        }
105d590543dSopenharmony_ci
106d590543dSopenharmony_ci        int64_t GetCount()
107d590543dSopenharmony_ci        {
108d590543dSopenharmony_ci            return totalCount_;
109d590543dSopenharmony_ci        }
110d590543dSopenharmony_ci
111d590543dSopenharmony_ci        void Reset()
112d590543dSopenharmony_ci        {
113d590543dSopenharmony_ci            totalCount_ = StatsUtils::DEFAULT_VALUE;
114d590543dSopenharmony_ci        }
115d590543dSopenharmony_ci    private:
116d590543dSopenharmony_ci        int64_t totalCount_ = StatsUtils::DEFAULT_VALUE;
117d590543dSopenharmony_ci    };
118d590543dSopenharmony_ci    static void SetOnBattery(bool onBattery);
119d590543dSopenharmony_ci    static void SetScreenOff(bool screenOff);
120d590543dSopenharmony_ci    static int64_t GetOnBatteryBootTimeMs();
121d590543dSopenharmony_ci    static int64_t GetOnBatteryUpTimeMs();
122d590543dSopenharmony_ci    static bool IsOnBattery();
123d590543dSopenharmony_ci    static bool IsOnBatteryScreenOff();
124d590543dSopenharmony_ci    static int64_t GetBootTimeMs();
125d590543dSopenharmony_ci    static int64_t GetUpTimeMs();
126d590543dSopenharmony_ciprivate:
127d590543dSopenharmony_ci    static int64_t latestUnplugBootTimeMs_;
128d590543dSopenharmony_ci    static int64_t latestUnplugUpTimeMs_;
129d590543dSopenharmony_ci    static int64_t onBatteryBootTimeMs_;
130d590543dSopenharmony_ci    static int64_t onBatteryUpTimeMs_;
131d590543dSopenharmony_ci    static bool onBattery_;
132d590543dSopenharmony_ci    static bool screenOff_;
133d590543dSopenharmony_ci};
134d590543dSopenharmony_ci} // namespace PowerMgr
135d590543dSopenharmony_ci} // namespace OHOS
136d590543dSopenharmony_ci#endif // STATS_HELPER_H