FastLED 3.10.8
Loading...
Searching...
No Matches
engine_events.h
Go to the documentation of this file.
1#pragma once
2
3#include "fl/math/screenmap.h" // IWYU pragma: keep
4#include "fl/stl/singleton.h"
5#include "fl/stl/vector.h"
6#include "fl/math/xymap.h" // IWYU pragma: keep
7#include "fl/stl/string.h" // IWYU pragma: keep
8#include "fl/stl/int.h"
10#include "fl/stl/noexcept.h"
11
12#ifndef FASTLED_HAS_ENGINE_EVENTS
13#define FASTLED_HAS_ENGINE_EVENTS SKETCH_HAS_LARGE_MEMORY
14#endif // FASTLED_HAS_ENGINE_EVENTS
15
16
17namespace fl {
18
19class CLEDController; // forward declaration
20namespace task {
21class Scheduler;
22}
23
25 public:
26 class Listener {
27 public:
28 // Note that the subclass must call EngineEvents::addListener(this) to
29 // start listening. In the subclass destructor, the subclass should call
30 // EngineEvents::removeListener(this).
32 virtual ~Listener() FL_NO_EXCEPT;
33 virtual void onBeginFrame() FL_NO_EXCEPT {}
34 virtual void onEndShowLeds() FL_NO_EXCEPT {}
35 virtual void onEndFrame() FL_NO_EXCEPT {}
36 virtual void onStripAdded(CLEDController *strip, fl::u32 num_leds) FL_NO_EXCEPT {
37 (void)strip;
38 (void)num_leds;
39 }
40 // Called to set the canvas for UI elements for a particular strip.
41 virtual void onCanvasUiSet(CLEDController *strip,
43 (void)strip;
44 (void)screenmap;
45 }
48 virtual void onExit() FL_NO_EXCEPT {} // Called before engine shutdown
49 };
50
51 static void addListener(Listener *listener, int priority = 0) FL_NO_EXCEPT {
52#if FASTLED_HAS_ENGINE_EVENTS
53 EngineEvents::getInstance()->_addListener(listener, priority);
54#else
55 (void)listener;
56 (void)priority;
57#endif
58 }
59
60 static void removeListener(Listener *listener) FL_NO_EXCEPT {
61#if FASTLED_HAS_ENGINE_EVENTS
62 EngineEvents::getInstance()->_removeListener(listener);
63#else
64 (void)listener;
65#endif
66 }
67
68 static bool hasListener(Listener *listener) FL_NO_EXCEPT {
69#if FASTLED_HAS_ENGINE_EVENTS
70 return EngineEvents::getInstance()->_hasListener(listener);
71#else
72 (void)listener;
73 return false;
74#endif
75 }
76
77 static void onBeginFrame() FL_NO_EXCEPT;
78
80#if FASTLED_HAS_ENGINE_EVENTS
81 EngineEvents::getInstance()->_onEndShowLeds();
82#endif
83 }
84
85 static void onEndFrame() FL_NO_EXCEPT;
86
87 static void onStripAdded(CLEDController *strip, fl::u32 num_leds) FL_NO_EXCEPT {
88#if FASTLED_HAS_ENGINE_EVENTS
89 EngineEvents::getInstance()->_onStripAdded(strip, num_leds);
90#else
91 (void)strip;
92 (void)num_leds;
93#endif
94 }
95
97#if FASTLED_HAS_ENGINE_EVENTS
98 EngineEvents::getInstance()->_onCanvasUiSet(strip, xymap);
99#else
100 (void)strip;
101 (void)xymap;
102#endif
103 }
104
106#if FASTLED_HAS_ENGINE_EVENTS
107 EngineEvents::getInstance()->_onPlatformPreLoop();
108#endif
109 }
110
111 static void onExit() FL_NO_EXCEPT {
112#if FASTLED_HAS_ENGINE_EVENTS
113 EngineEvents::getInstance()->_onExit();
114#endif
115 }
116
117 // Needed by fl::vector<T>
120
121 private:
122 // Frame tasks use one dedicated final listener so they remain available
123 // when the general listener list is disabled on low-memory platforms.
124 static void setFrameTaskListener(Listener *listener) FL_NO_EXCEPT;
125
126 // Safe to add a listeners during a callback.
127 void _addListener(Listener *listener, int priority) FL_NO_EXCEPT;
128 // Safe to remove self during a callback.
133 void _onStripAdded(CLEDController *strip, fl::u32 num_leds) FL_NO_EXCEPT;
138#if FASTLED_HAS_ENGINE_EVENTS
139 struct Pair {
140 Pair() FL_NO_EXCEPT = default;
141 Listener *listener = nullptr;
142 int priority = 0;
143 Pair(Listener *listener, int priority) FL_NO_EXCEPT
144 : listener(listener), priority(priority) {}
145 };
146
147 typedef fl::vector_inlined<Pair, 16> ListenerList;
148 ListenerList mListeners;
149
150
151 static EngineEvents *getInstance() FL_NO_EXCEPT;
152
153 friend class fl::Singleton<EngineEvents>;
154#endif // FASTLED_HAS_ENGINE_EVENTS
155 friend class task::Scheduler;
156};
157
158} // namespace fl
XYMap xymap
fl::ScreenMap screenmap
virtual ~Listener() FL_NO_EXCEPT
virtual void onBeginFrame() FL_NO_EXCEPT
virtual void onEndFrame() FL_NO_EXCEPT
virtual void onPlatformPreLoop2() FL_NO_EXCEPT
virtual void onCanvasUiSet(CLEDController *strip, const ScreenMap &screenmap) FL_NO_EXCEPT
virtual void onStripAdded(CLEDController *strip, fl::u32 num_leds) FL_NO_EXCEPT
virtual void onEndShowLeds() FL_NO_EXCEPT
virtual void onPlatformPreLoop() FL_NO_EXCEPT
virtual void onExit() FL_NO_EXCEPT
void _addListener(Listener *listener, int priority) FL_NO_EXCEPT
static void onBeginFrame() FL_NO_EXCEPT
bool _hasListener(Listener *listener) FL_NO_EXCEPT
void _onPlatformPreLoop() FL_NO_EXCEPT
void _onCanvasUiSet(CLEDController *strip, const ScreenMap &xymap) FL_NO_EXCEPT
static void onStripAdded(CLEDController *strip, fl::u32 num_leds) FL_NO_EXCEPT
static void removeListener(Listener *listener) FL_NO_EXCEPT
static void onEndShowLeds() FL_NO_EXCEPT
static void onExit() FL_NO_EXCEPT
static void onEndFrame() FL_NO_EXCEPT
void _onExit() FL_NO_EXCEPT
static void setFrameTaskListener(Listener *listener) FL_NO_EXCEPT
EngineEvents() FL_NO_EXCEPT
static void onCanvasUiSet(CLEDController *strip, const ScreenMap &xymap) FL_NO_EXCEPT
void _onEndShowLeds() FL_NO_EXCEPT
static void addListener(Listener *listener, int priority=0) FL_NO_EXCEPT
void _onStripAdded(CLEDController *strip, fl::u32 num_leds) FL_NO_EXCEPT
void _onEndFrame() FL_NO_EXCEPT
void _onBeginFrame() FL_NO_EXCEPT
void _removeListener(Listener *listener) FL_NO_EXCEPT
static bool hasListener(Listener *listener) FL_NO_EXCEPT
static void onPlatformPreLoop() FL_NO_EXCEPT
fl::CLEDController CLEDController
u8 u8 fract8 blur_amount FL_NO_EXCEPT
Definition blur.h:186
pair< T1, T2 > Pair
Definition pair.h:211
VectorN< T, INLINED_SIZE > vector_inlined
Definition vector.h:1137
Base definition for an LED controller.
Definition crgb.hpp:179