libNeon
Loading...
Searching...
No Matches
gradient_fx.hpp
Go to the documentation of this file.
1//
2// Created by spak on 6/6/21.
3//
4
5#ifndef NEO_GRADIENT_FX_HPP
6#define NEO_GRADIENT_FX_HPP
7
8#include <chrono>
9#include <functional>
10#include <mlab/bin_data.hpp>
11#include <mlab/unique_tracker.hpp>
12#include <neo/gradient.hpp>
13#include <neo/strip.hpp>
14
15namespace neo {
16 namespace {
17 using namespace std::chrono_literals;
18 }
19
20 class gradient_fx : public mlab::uniquely_tracked {
22 std::chrono::milliseconds _duration = 0ms;
23 float _repeats = 1.f;
24 mutable std::recursive_mutex _gradient_mutex = {};
25
26 public:
27 gradient_fx() = default;
28
29 inline explicit gradient_fx(neo::gradient g, std::chrono::milliseconds duration = 1s, float repeats = 1.f);
30
31 gradient_fx(gradient_fx &&g_fx) noexcept;
32 gradient_fx &operator=(gradient_fx &&g_fx) noexcept;
33
34 [[nodiscard]] inline neo::gradient get_gradient() const;
35 inline void set_gradient(neo::gradient g);
36 [[nodiscard]] inline float repeats() const;
37 [[nodiscard]] inline std::chrono::milliseconds duration() const;
38
39 inline void set_repeats(float n);
40 inline void set_duration(std::chrono::milliseconds d);
41
42 [[nodiscard]] std::vector<rgb> sample(std::size_t n_leds, std::chrono::milliseconds time_since_start,
43 std::vector<rgb> recycle_buffer = {}, blending_method method = blend_linear) const;
44
45 [[nodiscard]] std::function<void(std::chrono::milliseconds)> make_steady_timer_callback(
46 transmittable_rgb_strip &strip, rmt_channel_t channel, blending_method method = blend_linear) const;
47
48 std::vector<rgb> render_frame(transmittable_rgb_strip &strip, rmt_channel_t channel,
49 std::chrono::milliseconds elapsed, std::vector<rgb> recycle_buffer = {},
50 blending_method method = blend_linear) const;
51 };
52
55 float repeats = 1.f;
56 std::uint32_t duration_ms = 1000;
57
58 gradient_fx_config() = default;
59
60 void apply(gradient_fx &g_fx) const;
61
62 [[nodiscard]] std::string to_string() const;
63 };
64}// namespace neo
65
66namespace mlab {
67 mlab::bin_stream &operator>>(mlab::bin_stream &s, neo::gradient_fx_config &g_fx_cfg);
68}
69namespace neo {
70 gradient_fx::gradient_fx(neo::gradient g, std::chrono::milliseconds duration, float repeats)
71 : _gradient{std::move(g)},
72 _duration{duration},
73 _repeats{repeats} {}
74
75 std::chrono::milliseconds gradient_fx::duration() const {
76 return _duration;
77 }
78
79 float gradient_fx::repeats() const {
80 return _repeats;
81 }
82
84 std::scoped_lock lock{_gradient_mutex};
85 _gradient = std::move(g);
86 }
87
89 std::scoped_lock lock{_gradient_mutex};
90 return _gradient;
91 }
92
93 void gradient_fx::set_duration(std::chrono::milliseconds d) {
94 _duration = d;
95 }
96
98 _repeats = n;
99 }
100
101}// namespace neo
102
103#endif//NEO_GRADIENT_FX_HPP
Definition: gradient_fx.hpp:20
void set_repeats(float n)
Definition: gradient_fx.hpp:97
neo::gradient get_gradient() const
Definition: gradient_fx.hpp:88
std::recursive_mutex _gradient_mutex
Definition: gradient_fx.hpp:24
void set_gradient(neo::gradient g)
Definition: gradient_fx.hpp:83
void set_duration(std::chrono::milliseconds d)
Definition: gradient_fx.hpp:93
std::vector< rgb > render_frame(transmittable_rgb_strip &strip, rmt_channel_t channel, std::chrono::milliseconds elapsed, std::vector< rgb > recycle_buffer={}, blending_method method=blend_linear) const
Definition: gradient_fx.cpp:39
float _repeats
Definition: gradient_fx.hpp:23
std::chrono::milliseconds _duration
Definition: gradient_fx.hpp:22
std::chrono::milliseconds duration() const
Definition: gradient_fx.hpp:75
float repeats() const
Definition: gradient_fx.hpp:79
std::function< void(std::chrono::milliseconds)> make_steady_timer_callback(transmittable_rgb_strip &strip, rmt_channel_t channel, blending_method method=blend_linear) const
Definition: gradient_fx.cpp:53
gradient_fx & operator=(gradient_fx &&g_fx) noexcept
Definition: gradient_fx.cpp:27
gradient_fx()=default
std::vector< rgb > sample(std::size_t n_leds, std::chrono::milliseconds time_since_start, std::vector< rgb > recycle_buffer={}, blending_method method=blend_linear) const
Definition: gradient_fx.cpp:11
neo::gradient _gradient
Definition: gradient_fx.hpp:21
Definition: gradient.hpp:86
Definition: strip.hpp:39
Definition: strip.hpp:29
Definition: any_fx.cpp:81
mlab::bin_stream & operator>>(mlab::bin_stream &s, neo::any_fx_config &fx_cfg)
Definition: any_fx.cpp:83
Definition: any_fx.cpp:7
rgb(&)(rgb l, rgb r, float t) blending_method
Definition: gradient.hpp:13
rgb blend_linear(rgb l, rgb r, float t)
Definition: gradient.cpp:96
Definition: gradient_fx.hpp:53
std::string to_string() const
Definition: gradient_fx.cpp:71
void apply(gradient_fx &g_fx) const
Definition: gradient_fx.cpp:65
std::uint32_t duration_ms
Definition: gradient_fx.hpp:56
float repeats
Definition: gradient_fx.hpp:55