SensESP 3.3.0
Universal Signal K sensor toolkit ESP32
Loading...
Searching...
No Matches
repeat.h
Go to the documentation of this file.
1#ifndef SENSESP_SRC_SENSESP_TRANSFORMS_REPEAT_H_
2#define SENSESP_SRC_SENSESP_TRANSFORMS_REPEAT_H_
3
4#include <elapsedMillis.h>
5
7#include "sensesp_base_app.h"
8#include "transform.h"
9
10namespace sensesp {
11
27template <typename FROM, typename TO>
28class Repeat : public Transform<FROM, TO> {
29 public:
30 Repeat(unsigned long interval) : Transform<FROM, TO>(), interval_{interval} {
31 if (interval_ == 0) {
32 ESP_LOGW("Repeat", "Interval is 0. This will cause a busy loop.");
33 }
34 }
35
36 virtual ~Repeat() {
37 if (repeat_event_ != nullptr) {
38 repeat_event_->remove(event_loop());
39 }
40 }
41
42 virtual void set(const FROM& input) override {
43 this->emit(input);
44 if (repeat_event_ != nullptr) {
45 // Delete the old repeat event
46 repeat_event_->remove(event_loop());
47 }
49 event_loop()->onRepeat(interval_, [this]() { this->notify(); });
50 }
51
52 protected:
53 unsigned long interval_;
54 reactesp::RepeatEvent* repeat_event_ = nullptr;
55};
56
57// For compatibility with the old RepeatReport class
58template <typename T>
59class RepeatReport : public Repeat<T, T> {};
60
67template <typename T>
68class RepeatStopping : public Repeat<T, T> {
69 public:
70 RepeatStopping(unsigned long interval, unsigned long max_age)
71 : Repeat<T, T>(interval), max_age_{max_age} {
72 age_ = max_age;
73
74 if (this->repeat_event_ != nullptr) {
75 // Delete the old repeat event
76 this->repeat_event_->remove();
77 }
78 this->repeat_event_ = event_loop()->onRepeat(
79 this->interval_, [this]() { this->repeat_function(); });
80 }
81
82 virtual void set(const T& input) override {
83 this->emit(input);
84 age_ = 0;
85 if (this->repeat_event_ != nullptr) {
86 // Delete the old repeat event
87 this->repeat_event_->remove();
88 }
89 this->repeat_event_ = event_loop()->onRepeat(
90 this->interval_, [this]() { this->repeat_function(); });
91 }
92
93 protected:
94 elapsedMillis age_;
95 unsigned long max_age_;
96
97 protected:
99 if (age_ < max_age_) {
100 this->notify();
101 } else {
102 if (this->repeat_event_ != nullptr) {
103 // Delete the old repeat event
104 this->repeat_event_->remove();
105 this->repeat_event_ = nullptr;
106 }
107 }
108 };
109};
110
117template <typename T>
118class RepeatExpiring : public Repeat<T, Nullable<T>> {
119 public:
120 RepeatExpiring(unsigned long interval, unsigned long max_age)
121 : Repeat<T, Nullable<T>>(interval), max_age_{max_age} {
122 ESP_LOGD("RepeatExpiring", "interval: %lu, max_age: %lu", interval,
123 max_age);
124
125 age_ = max_age;
126
127 if (this->repeat_event_ != nullptr) {
128 // Delete the old repeat event
129 this->repeat_event_->remove(event_loop());
130 }
131 this->repeat_event_ = event_loop()->onRepeat(
132 this->interval_, [this]() { this->repeat_function(); });
133 }
134
135 virtual void set(const T& input) override {
136 this->emit(input);
137 age_ = 0;
138 if (this->repeat_event_ != nullptr) {
139 // Delete the old repeat event
140 this->repeat_event_->remove(event_loop());
141 }
142 this->repeat_event_ = event_loop()->onRepeat(
143 this->interval_, [this]() { this->repeat_function(); });
144 }
145
146 protected:
147 elapsedMillis age_;
148 unsigned long max_age_;
149
150 protected:
152 // Note: This could've been implemented with the new ExpiringValue class,
153 // but this is more in line with the other Repeat classes.
154 if (age_ < max_age_) {
155 this->notify();
156 } else {
157 this->emit(this->get().invalid());
158 }
159 };
160};
161
173template <typename T>
175 public:
176 RepeatConstantRate(unsigned long interval, unsigned long max_age)
177 : RepeatExpiring<T>(interval, max_age) {
178 if (this->repeat_event_ != nullptr) {
179 // Delete the old repeat event
180 this->repeat_event_->remove();
181 }
182
183 this->repeat_event_ =
184 event_loop()->onRepeat(interval, [this]() { this->repeat_function(); });
185 }
186
187 void set(T input) override {
188 this->output_ = input;
189 this->age_ = 0;
190 }
191};
192
193} // namespace sensesp
194
195#endif // SENSESP_SRC_SENSESP_TRANSFORMS_REPEAT_H_
Template class that supports a special invalid magic value for a type.
Definition nullable.h:15
void set(T input) override
Definition repeat.h:187
RepeatConstantRate(unsigned long interval, unsigned long max_age)
Definition repeat.h:176
RepeatExpiring(unsigned long interval, unsigned long max_age)
Definition repeat.h:120
elapsedMillis age_
Definition repeat.h:147
virtual void set(const T &input) override
Definition repeat.h:135
unsigned long max_age_
Definition repeat.h:148
virtual void set(const FROM &input) override
Definition repeat.h:42
reactesp::RepeatEvent * repeat_event_
Definition repeat.h:54
virtual ~Repeat()
Definition repeat.h:36
unsigned long interval_
Definition repeat.h:53
Repeat(unsigned long interval)
Definition repeat.h:30
virtual void set(const T &input) override
Definition repeat.h:82
RepeatStopping(unsigned long interval, unsigned long max_age)
Definition repeat.h:70
unsigned long max_age_
Definition repeat.h:95
elapsedMillis age_
Definition repeat.h:94
Transform(String config_path="")
Definition transform.h:55
void emit(const TO &new_value)
std::shared_ptr< reactesp::EventLoop > event_loop()
Definition sensesp.cpp:9