1#ifndef MODES_BLUETOOTH_CONTROLFIXEDMODES_H
2#define MODES_BLUETOOTH_CONTROLFIXEDMODES_H
6#include "src/system/ext/math8.h"
7#include "src/system/ext/noise.h"
21 uint32_t color = 0xFFFFFF;
24 static void loop(
auto& ctx)
27 ctx.lamp.fill(ctx.state.color);
33uint32_t get_color_at(
size_t index)
36 assert(
false and
"Invalid color index reached");
40template<
typename Head,
typename... Tail> uint32_t get_color_at(
size_t index, Head head, Tail... tail)
44 return get_color_at(index - 1, tail...);
50 static constexpr float fadeRate = fadeRateUint / (2.0 * UINT8_MAX);
51 static constexpr size_t colorCount =
sizeof...(fadeColors);
52 static_assert((fadeRate == 0 and colorCount != 0) or (fadeRate > 0 and colorCount >= 2),
53 "Cannot fade colors without at least two colors");
60 uint32_t colorStartTime_ms;
64 static uint32_t next_color_index(
auto& ctx)
66 const uint32_t nextIndex = ctx.state.colorIndex + 1;
67 if (nextIndex >= colorCount)
72 static void on_enter_mode(
auto& ctx)
74 ctx.template set_config_bool<ConfigKeys::rampSaturates>(
true);
76 ctx.state.colorStartTime_ms = ctx.lamp.now;
77 ctx.state.colorIndex = 0;
80 static void loop(
auto& ctx)
83 static constexpr uint32_t lowestTiming = fastMode ? 100 : 1000;
84 static constexpr uint32_t highestTiming = fastMode ? 15 : 100;
86 const uint32_t wholePaletteLoopTiming =
87 lmpd_map<float>(ctx.get_active_custom_ramp(), 0, 255, lowestTiming, highestTiming);
89 uint32_t timeSinceStart = ctx.lamp.now - ctx.state.colorStartTime_ms;
90 if (timeSinceStart >= wholePaletteLoopTiming)
92 ctx.state.colorStartTime_ms = ctx.lamp.now;
93 ctx.state.colorIndex = next_color_index(ctx);
95 timeSinceStart = ctx.lamp.now - ctx.state.colorStartTime_ms;
98 uint32_t color = __private::get_color_at(ctx.state.colorIndex, fadeColors...);
100 if constexpr (fadeRateUint != 0)
102 const uint32_t fixedTime_ms = wholePaletteLoopTiming * (1.0 - fadeRate);
103 if (timeSinceStart >= fixedTime_ms)
105 const uint32_t fadeTime_ms = wholePaletteLoopTiming * fadeRate;
106 const float fadeProgress =
107 lmpd_constrain((timeSinceStart - fixedTime_ms) /
static_cast<float>(fadeTime_ms), 0.0f, 0.95f);
108 const uint32_t colorEnd = __private::get_color_at(next_color_index(ctx), fadeColors...);
113 ctx.lamp.fill(color);
Contains basic interface types to implement custom user modes.
Definition: control_fixed_modes.hpp:12
uint32_t get_gradient(const uint32_t colorStart, const uint32_t colorEnd, const float level)
Return the color gradient between colorStart to colorEnd.
Definition: utils.cpp:60
static constexpr T lmpd_constrain(const T &a, const T &mini, const T &maxi)
Constrain a number between two numbers.
Definition: utils.h:57
Define some useful color palettes, and tools to use them.
Parent object for all custom user modes.
Definition: mode_type.hpp:53
Definition: control_fixed_modes.hpp:19
Definition: control_fixed_modes.hpp:17
Definition: control_fixed_modes.hpp:59
Definition: control_fixed_modes.hpp:49
static constexpr bool hasCustomRamp
hint manager to save our custom ramp
Definition: control_fixed_modes.hpp:56
Definition: control_fixed_modes.hpp:130
fixed modes
Definition: control_fixed_modes.hpp:119
Definition: control_fixed_modes.hpp:135
jump color
Definition: control_fixed_modes.hpp:124