119e95205Sopenharmony_ci/*
219e95205Sopenharmony_ci * Copyright (C) 2021-2022 Huawei Device Co., Ltd.
319e95205Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
419e95205Sopenharmony_ci * you may not use this file except in compliance with the License.
519e95205Sopenharmony_ci * You may obtain a copy of the License at
619e95205Sopenharmony_ci *
719e95205Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
819e95205Sopenharmony_ci *
919e95205Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
1019e95205Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
1119e95205Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1219e95205Sopenharmony_ci * See the License for the specific language governing permissions and
1319e95205Sopenharmony_ci * limitations under the License.
1419e95205Sopenharmony_ci */
1519e95205Sopenharmony_ci
1619e95205Sopenharmony_ci#ifndef TIMER_H
1719e95205Sopenharmony_ci#define TIMER_H
1819e95205Sopenharmony_ci
1919e95205Sopenharmony_ci#include "base_def.h"
2019e95205Sopenharmony_ci#include <mutex>
2119e95205Sopenharmony_ci#include <functional>
2219e95205Sopenharmony_ci
2319e95205Sopenharmony_cinamespace utility {
2419e95205Sopenharmony_ci#define MS_PER_SECOND 1000
2519e95205Sopenharmony_ci#define NS_PER_MS 1000000
2619e95205Sopenharmony_ci
2719e95205Sopenharmony_ciclass Timer {
2819e95205Sopenharmony_cipublic:
2919e95205Sopenharmony_ci    /**
3019e95205Sopenharmony_ci     * @brief Construct a new Timer object
3119e95205Sopenharmony_ci     *
3219e95205Sopenharmony_ci     * @param callback Timer's callback function.
3319e95205Sopenharmony_ci     * @since 6
3419e95205Sopenharmony_ci     */
3519e95205Sopenharmony_ci    Timer(const std::function<void()> &callback);
3619e95205Sopenharmony_ci
3719e95205Sopenharmony_ci    /**
3819e95205Sopenharmony_ci     * @brief Destroy the Timer object
3919e95205Sopenharmony_ci     *
4019e95205Sopenharmony_ci     * @since 6
4119e95205Sopenharmony_ci     */
4219e95205Sopenharmony_ci    ~Timer();
4319e95205Sopenharmony_ci
4419e95205Sopenharmony_ci    /**
4519e95205Sopenharmony_ci     * @brief Start Running Timer.
4619e95205Sopenharmony_ci     *
4719e95205Sopenharmony_ci     * @param ms Countdown time.
4819e95205Sopenharmony_ci     * @param isPeriodic Timer isPeriodic.
4919e95205Sopenharmony_ci     * @return Success set timer return true, else return false.
5019e95205Sopenharmony_ci     * @since 6
5119e95205Sopenharmony_ci     */
5219e95205Sopenharmony_ci    bool Start(int ms, bool isPeriodic = false);
5319e95205Sopenharmony_ci
5419e95205Sopenharmony_ci    /**
5519e95205Sopenharmony_ci     * @brief Stop Running Timer.
5619e95205Sopenharmony_ci     *
5719e95205Sopenharmony_ci     * @return Success stop timer return true, else return false.
5819e95205Sopenharmony_ci     * @since 6
5919e95205Sopenharmony_ci     */
6019e95205Sopenharmony_ci    bool Stop();
6119e95205Sopenharmony_ci
6219e95205Sopenharmony_ciprivate:
6319e95205Sopenharmony_ci    int fd_ {-1};
6419e95205Sopenharmony_ci    std::mutex mutex_ {};
6519e95205Sopenharmony_ci    std::function<void()> callback_ {};
6619e95205Sopenharmony_ci
6719e95205Sopenharmony_ci    friend class TimerManager;
6819e95205Sopenharmony_ci    BT_DISALLOW_COPY_AND_ASSIGN(Timer);
6919e95205Sopenharmony_ci};
7019e95205Sopenharmony_ci}  // namespace utility
7119e95205Sopenharmony_ci
7219e95205Sopenharmony_ci#endif  // TIMER_H
73