M5Unified
M5Timer.cpp
Go to the documentation of this file.
1 // Copyright (c) M5Stack. All rights reserved.
2 // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3 
4 #include "M5Timer.h"
5 #include <M5GFX.h>
6 
8  _enable_count = 0;
9  for (uint_fast8_t i = 0; i < MAX_TIMERS; i++) {
10  _timer_info[i].clear();
11  }
12 }
13 
14 void M5Timer::timer_info_t::clear(void) {
15  _callback = 0;
16  _enabled = false;
17  _interval = 0;
18  _remain = 0;
19 }
20 
21 void M5Timer::timer_info_t::set(uint32_t interval_msec, timer_callback cb, uint32_t times) {
22  _callback = cb;
23  _interval = interval_msec;
24  _remain = times;
25  _enabled = true;
26  _prev_msec = m5gfx::millis();
27 }
28 
29 bool M5Timer::timer_info_t::run(uint32_t current_msec) {
30  if (_callback != nullptr && current_msec - _prev_msec >= _interval) {
31  _prev_msec += _interval;
32 
33  if (_enabled) {
34  _callback();
35  // Check the remaining number of executions; if 0, assume unlimited.
36  if (_remain != 0) {
37  return --_remain;
38  }
39  }
40  }
41  return true;
42 }
43 
44 void M5Timer::run(void) {
45  auto msec = m5gfx::millis();
46 
47  for (auto &t : _timer_info) {
48  if (!t.getCallback()) { continue; }
49  if (!t.run(msec)) {
50  t.clear();
51  _enable_count--;
52  }
53  }
54 }
55 
56 int_fast8_t M5Timer::setTimer(uint32_t interval, timer_callback cb, uint32_t times) {
57  if (cb == nullptr || _enable_count >= MAX_TIMERS) {
58  return -1;
59  }
60  for (uint_fast8_t i = 0; i < MAX_TIMERS; i++) {
61  if (_timer_info[i].getCallback()) { continue; }
62  _timer_info[i].set(interval, cb, times);
63  _enable_count++;
64  return i;
65  }
66  return -1;
67 }
68 
69 void M5Timer::deleteTimer(int_fast8_t id) {
70  if ((uint_fast8_t)id < MAX_TIMERS && _timer_info[id].getCallback() != nullptr) {
71  _timer_info[id].clear();
72  _enable_count--;
73  }
74 }
75 
76 void M5Timer::restartTimer(int_fast8_t id) {
77  if ((uint_fast8_t)id < MAX_TIMERS) {
78  _timer_info[id].setPreviousMsec(m5gfx::millis());
79  }
80 }
std::function< void(void)> timer_callback
Definition: M5Timer.h:11
void restartTimer(int_fast8_t id)
Definition: M5Timer.cpp:76
void deleteTimer(int_fast8_t id)
Definition: M5Timer.cpp:69
static constexpr const uint32_t MAX_TIMERS
maximum number of timers
Definition: M5Timer.h:16
void run(void)
this function must be called inside loop()
Definition: M5Timer.cpp:44
M5Timer(void)
constructor
Definition: M5Timer.cpp:7
int_fast8_t setTimer(uint32_t interval_msec, timer_callback function, uint32_t times)
Definition: M5Timer.cpp:56