1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
/**
* \file
* \brief SoftwareTimer class header
*
* \author Copyright (C) 2015 Kamil Szczygiel http://www.distortec.com http://www.freddiechopin.info
*
* \par License
* This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not
* distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
#ifndef INCLUDE_DISTORTOS_SOFTWARETIMER_HPP_
#define INCLUDE_DISTORTOS_SOFTWARETIMER_HPP_
#include "distortos/TickClock.hpp"
namespace distortos
{
/**
* \brief SoftwareTimer class is an abstract interface for software timers
*
* \ingroup softwareTimers
*/
class SoftwareTimer
{
public:
/**
* \brief SoftwareTimer's destructor
*/
virtual ~SoftwareTimer() = 0;
/**
* \return true if the timer is running, false otherwise
*/
virtual bool isRunning() const = 0;
/**
* \brief Starts the timer.
*
* \note The duration will never be shorter, so one additional tick is always added to the duration.
*
* \param [in] duration is the duration after which the function will be executed
*
* \return 0 on success, error code otherwise
*/
int start(TickClock::duration duration);
/**
* \brief Starts the timer.
*
* \note The duration must not be shorter, so one additional tick is always added to the duration.
*
* \tparam Rep is type of tick counter
* \tparam Period is std::ratio type representing the tick period of the clock, in seconds
*
* \param [in] duration is the duration after which the function will be executed
*
* \return 0 on success, error code otherwise
*/
template<typename Rep, typename Period>
int start(const std::chrono::duration<Rep, Period> duration)
{
return start(std::chrono::duration_cast<TickClock::duration>(duration));
}
/**
* \brief Starts the timer.
*
* \param [in] timePoint is the time point at which the function will be executed
*
* \return 0 on success, error code otherwise
*/
virtual int start(TickClock::time_point timePoint) = 0;
/**
* \brief Starts the timer.
*
* \tparam Duration is a std::chrono::duration type used to measure duration
*
* \param [in] timePoint is the time point at which the function will be executed
*
* \return 0 on success, error code otherwise
*/
template<typename Duration>
int start(const std::chrono::time_point<TickClock, Duration> timePoint)
{
return start(std::chrono::time_point_cast<TickClock::duration>(timePoint));
}
/**
* \brief Stops the timer.
*
* \return 0 on success, error code otherwise
*/
virtual int stop() = 0;
protected:
/**
* \brief Software timer's function runner
*
* \param [in] softwareTimer is a reference to SoftwareTimer object that is being run
*/
static void softwareTimerRunner(SoftwareTimer& softwareTimer);
private:
/**
* \brief "Run" function of software timer
*
* This should be overridden by derived classes.
*/
virtual void run() = 0;
};
} // namespace distortos
#endif // INCLUDE_DISTORTOS_SOFTWARETIMER_HPP_
|