5#ifndef MODES_DRAW_OVERLAY_HPP
6#define MODES_DRAW_OVERLAY_HPP
8namespace lampda::modes::draw {
28 uint32_t get_color()
const {
return (red << 16) | (green << 8) | blue; }
49template<
int UIElementSize = 16, u
int8_t freezeSize = 5, u
int8_t nbBlackLines = 2>
class Manager
52 Manager() : activeUiElements(0) {}
59 assert(activeUiElements < UIElementSize);
62 ctx.skipFirstLedsForFrames(0);
64 if (activeUiElements == 0)
68 for (uint8_t i = 0; i < ctx.lamp.maxWidth * nbBlackLines; ++i)
70 ctx.lamp.setPixelColor(i, 0);
74 size_t lastActiveElementIndex = 0;
75 const auto timeNow = ctx.lamp.now;
76 const size_t activeUiElementsToDisplay = activeUiElements;
78 for (uint8_t i = 0; i < activeUiElementsToDisplay; ++i)
80 const auto elementTimeout = elements[i].timeout_ms;
82 if (elementTimeout > 0 and timeNow > elementTimeout)
85 if (activeUiElements > 0)
91 drawElement(elements[i], ctx);
94 if (i != lastActiveElementIndex)
97 elements[lastActiveElementIndex] = elements[i];
99 ++lastActiveElementIndex;
104 ctx.skipFirstLedsForFrames(ctx.lamp.maxWidth * nbBlackLines, freezeSize);
108 void clear() { activeUiElements = 0; }
114 for (uint8_t i = 0; i < activeUiElements; ++i)
117 if (elements[i].type == type)
138 const uint16_t coordinateX = 0,
139 const uint16_t coordinateY = 0,
140 const uint8_t progress = 0,
141 const uint32_t activityDelay_ms = 50)
143 if (activeUiElements >= UIElementSize - 1)
152 element.
color = palette;
154 if (activityDelay_ms > 0)
155 element.
timeout_ms = ctx.lamp.now + activityDelay_ms;
169 template<
bool shouldUpdateTimeout = true>
175 elements[index].progress = progress;
178 const uint32_t newTimeout = ctx.lamp.now + freezeSize * ctx.lamp.frameDurationMs;
179 if (shouldUpdateTimeout and elements[index].timeout_ms <= newTimeout)
182 elements[index].timeout_ms = newTimeout;
198 uint16_t desiredIndex,
204 elements[index].color = palette;
207 const uint32_t newTimeout = ctx.lamp.now + freezeSize * ctx.lamp.frameDurationMs;
208 if (shouldUpdateTimeout and elements[index].timeout_ms <= newTimeout)
211 elements[index].timeout_ms = newTimeout;
218 bool update_type_timeout(
const auto& ctx,
const ElementType type, uint16_t desiredIndex,
const uint32_t timeout_ms)
224 elements[index].timeout_ms = ctx.lamp.now + timeout_ms;
238 template<
bool shouldUpdateTimeout = true>
bool update_type(
const auto& ctx,
240 uint16_t desiredIndex,
241 const uint8_t progress,
247 elements[index].progress = progress;
248 elements[index].color = palette;
251 const uint32_t newTimeout = ctx.lamp.now + freezeSize * ctx.lamp.frameDurationMs;
252 if (shouldUpdateTimeout and elements[index].timeout_ms <= newTimeout)
255 elements[index].timeout_ms = newTimeout;
267 for (uint8_t i = 0; i < activeUiElements; ++i)
270 if (elements[i].type == type)
273 if (desiredIndex <= 0)
299 case ElementType::NONE:
310 const uint8_t progress,
312 const uint16_t startCoordinateY)
const
314 const uint16_t rampScale = (progress / 255.0) * ctx.lamp.maxWidth;
315 for (uint16_t i = 0; i < rampScale; ++i)
317 const auto color = modes::colors::from_palette<false>(lmpd_map<uint8_t>(i, 0, rampScale, 0, 255), palette);
318 ctx.lamp.setPixelColorXY(i, startCoordinateY, color);
324 const uint8_t progress,
326 const uint16_t coordinateX,
327 const uint16_t coordinateY)
const
329 const auto color = modes::colors::from_palette<false>(progress, palette);
330 ctx.lamp.setPixelColorXY(coordinateX, coordinateY, color);
335 std::array<__private::UIElement, UIElementSize> elements;
337 size_t activeUiElements = 0;
Definition: overlay.hpp:50
void display_dot(auto &ctx, const uint8_t progress, const colors::PaletteTy &palette, const uint16_t coordinateX, const uint16_t coordinateY) const
Display a single colored pixel.
Definition: overlay.hpp:323
bool add_ui_element(const auto &ctx, const ElementType type, const colors::PaletteTy &palette, const uint16_t coordinateX=0, const uint16_t coordinateY=0, const uint8_t progress=0, const uint32_t activityDelay_ms=50)
Add a new UI element to the overlay.
Definition: overlay.hpp:135
void display_ramp(auto &ctx, const uint8_t progress, const colors::PaletteTy &palette, const uint16_t startCoordinateY) const
Display a colored ramp.
Definition: overlay.hpp:309
uint8_t get_element_count(const ElementType type) const
Return the count of elements of a target type.
Definition: overlay.hpp:111
bool get_N_of_type(const ElementType type, uint16_t desiredIndex, size_t &elementId) const
Find and return the Nth element of a given type.
Definition: overlay.hpp:264
void clear()
Clear all UI elements.
Definition: overlay.hpp:108
bool update_type_color(const auto &ctx, const ElementType type, uint16_t desiredIndex, const colors::PaletteTy &palette)
Update the target UI element color palette.
Definition: overlay.hpp:196
bool update_type(const auto &ctx, const ElementType type, uint16_t desiredIndex, const uint8_t progress, const colors::PaletteTy &palette)
Update the target UI element.
Definition: overlay.hpp:238
bool update_type_progress(const auto &ctx, const ElementType type, uint16_t desiredIndex, const uint8_t progress)
Update the target UI element progress.
Definition: overlay.hpp:170
void display_update(auto &ctx)
Display and update the overlay.
Definition: overlay.hpp:57
std::array< uint32_t, 16 > PaletteTy
Palette types.
Definition: palettes.hpp:18
ElementType
< Define an UI element type
Definition: overlay.hpp:14
@ DOT
Display a pixel dot.
< define a display color
Definition: overlay.hpp:24
Define an UI element.
Definition: overlay.hpp:35
uint16_t coordinateY
start Y coordinates
Definition: overlay.hpp:40
ElementType type
type of UI elements
Definition: overlay.hpp:36
colors::PaletteTy color
color palette to display
Definition: overlay.hpp:42
uint16_t coordinateX
start X coordinates
Definition: overlay.hpp:39
int32_t timeout_ms
If set to a positive number, this element will delete itself at the set time.
Definition: overlay.hpp:44
uint8_t progress
0-255 animation progress
Definition: overlay.hpp:37