libNeon
Loading...
Searching...
No Matches
timer.hpp
Go to the documentation of this file.
1//
2// Created by spak on 6/7/21.
3//
4
5#ifndef NEO_TIMER_HPP
6#define NEO_TIMER_HPP
7
8#include <chrono>
9#include <driver/timer.h>
10#include <driver/timer_types_legacy.h>
11#include <freertos/FreeRTOS.h>
12#include <freertos/semphr.h>
13#include <freertos/timers.h>
14#include <functional>
15#include <mlab/unique_tracker.hpp>
16#include <string>
17
18namespace neo {
19
20 namespace {
21 using namespace std::chrono_literals;
22 }
23
24 class generic_timer : public mlab::uniquely_tracked {
25
30 static constexpr std::uint32_t generic_timer_base_frequency = 2'000;
31
32 static constexpr timer_config_t timer_config_default{
33 .alarm_en = TIMER_ALARM_EN,
34 .counter_en = TIMER_PAUSE,
35 .intr_type = TIMER_INTR_LEVEL,
36 .counter_dir = TIMER_COUNT_UP,
37 .auto_reload = TIMER_AUTORELOAD_EN,
38 .clk_src = TIMER_SRC_CLK_DEFAULT,
39 .divider = 80'000'000 / generic_timer_base_frequency};
40
41 timer_config_t _cfg = timer_config_default;
42 timer_group_t _group = TIMER_GROUP_MAX;
43 timer_idx_t _idx = TIMER_MAX;
44 BaseType_t _core_affinity = tskNO_AFFINITY;
45 std::function<void(generic_timer &)> _cbk = nullptr;
46 TaskHandle_t _cbk_task = nullptr;
47 std::chrono::milliseconds _period = 0ms;
48 bool _active = false;
49
50 static bool IRAM_ATTR isr_callback(void *tracker);
51
52 static void cbk_task_body(void *tracker);
53
54 [[nodiscard]] static std::uint64_t get_alarm_value(std::chrono::milliseconds period);
55
56 [[nodiscard]] inline timer_group_t group() const;
57
58 [[nodiscard]] inline timer_idx_t index() const;
59
60 [[nodiscard]] inline BaseType_t core_affinity() const;
61
62 [[nodiscard]] inline bool is_valid_timer() const;
63
64 void setup_callbacks();
65
66 void teardown_callbacks();
67
68 public:
69 generic_timer() = default;
70
71 generic_timer(std::chrono::milliseconds period, std::function<void(generic_timer &)> cbk,
72 BaseType_t core_affinity = tskNO_AFFINITY, timer_idx_t timer_idx = TIMER_0,
73 timer_group_t timer_group = TIMER_GROUP_0);
74
75 generic_timer(generic_timer const &) = delete;
76
78
80
81 generic_timer(generic_timer &&t) noexcept;
82
83 virtual ~generic_timer();
84
85 [[nodiscard]] inline std::chrono::milliseconds period() const;
86
87 [[nodiscard]] inline bool is_active() const;
88
89 virtual void start();
90
91 virtual void stop();
92
93 virtual void reset();
94
95 inline explicit operator bool() const;
96 };
97
98 class steady_timer : private generic_timer {
99 std::chrono::time_point<std::chrono::steady_clock> _last_start;
100 std::chrono::milliseconds _previous_laps_duration;
101
102 static void elapsed_callback(generic_timer &gen_timer);
103
104 [[nodiscard]] std::chrono::milliseconds elapsed_since_last_start() const;
105
106 public:
107 using generic_timer::operator bool;
110
111 steady_timer();
112
113 steady_timer(std::chrono::milliseconds period, std::function<void(std::chrono::milliseconds)> cbk,
114 BaseType_t core_affinity = tskNO_AFFINITY, timer_idx_t timer_idx = TIMER_0,
115 timer_group_t timer_group = TIMER_GROUP_0);
116
117 steady_timer(steady_timer const &) = delete;
118
119 steady_timer(steady_timer &&) noexcept = default;
120
121 steady_timer &operator=(steady_timer const &) = delete;
122
123 steady_timer &operator=(steady_timer &&) noexcept = default;
124
125 [[nodiscard]] std::chrono::milliseconds elapsed() const;
126
127 void start() override;
128
129 void stop() override;
130
131 void reset() override;
132 };
133
134}// namespace neo
135
136namespace neo {
137
138 timer_group_t generic_timer::group() const {
139 return _group;
140 }
141
142 timer_idx_t generic_timer::index() const {
143 return _idx;
144 }
145
146 BaseType_t generic_timer::core_affinity() const {
147 return _core_affinity;
148 }
149
150 std::chrono::milliseconds generic_timer::period() const {
151 return _period;
152 }
153
155 return _active;
156 }
157
158 generic_timer::operator bool() const {
159 return is_active();
160 }
161}// namespace neo
162
163#endif//NEO_TIMER_HPP
Definition: timer.hpp:24
static std::uint64_t get_alarm_value(std::chrono::milliseconds period)
Definition: timer.cpp:132
std::function< void(generic_timer &)> _cbk
Definition: timer.hpp:45
static constexpr std::uint32_t generic_timer_base_frequency
Definition: timer.hpp:30
BaseType_t core_affinity() const
Definition: timer.hpp:146
std::chrono::milliseconds _period
Definition: timer.hpp:47
std::chrono::milliseconds period() const
Definition: timer.hpp:150
virtual ~generic_timer()
Definition: timer.cpp:151
BaseType_t _core_affinity
Definition: timer.hpp:44
virtual void reset()
Definition: timer.cpp:144
virtual void start()
Definition: timer.cpp:115
bool _active
Definition: timer.hpp:48
generic_timer & operator=(generic_timer const &)=delete
timer_group_t group() const
Definition: timer.hpp:138
void setup_callbacks()
Definition: timer.cpp:78
timer_idx_t index() const
Definition: timer.hpp:142
timer_group_t _group
Definition: timer.hpp:42
static bool IRAM_ATTR isr_callback(void *tracker)
Definition: timer.cpp:123
TaskHandle_t _cbk_task
Definition: timer.hpp:46
timer_idx_t _idx
Definition: timer.hpp:43
bool is_active() const
Definition: timer.hpp:154
generic_timer(generic_timer const &)=delete
virtual void stop()
Definition: timer.cpp:136
static constexpr timer_config_t timer_config_default
Definition: timer.hpp:32
void teardown_callbacks()
Definition: timer.cpp:100
static void cbk_task_body(void *tracker)
Definition: timer.cpp:53
timer_config_t _cfg
Definition: timer.hpp:41
generic_timer()=default
bool is_valid_timer() const
Definition: timer.cpp:111
Definition: timer.hpp:98
std::chrono::milliseconds period() const
Definition: timer.hpp:150
steady_timer(steady_timer const &)=delete
void reset() override
Definition: timer.cpp:196
std::chrono::milliseconds elapsed_since_last_start() const
Definition: timer.cpp:181
bool is_active() const
Definition: timer.hpp:154
std::chrono::time_point< std::chrono::steady_clock > _last_start
Definition: timer.hpp:99
static void elapsed_callback(generic_timer &gen_timer)
Definition: timer.cpp:161
std::chrono::milliseconds elapsed() const
Definition: timer.cpp:185
void start() override
Definition: timer.cpp:174
std::chrono::milliseconds _previous_laps_duration
Definition: timer.hpp:100
steady_timer(steady_timer &&) noexcept=default
steady_timer()
Definition: timer.cpp:159
void stop() override
Definition: timer.cpp:189
Definition: any_fx.cpp:7