libNeon
Loading...
Searching...
No Matches
led.hpp
Go to the documentation of this file.
1//
2// Created by spak on 6/3/21.
3//
4
5#ifndef NEO_LED_HPP
6#define NEO_LED_HPP
7
8#include <algorithm>
9#include <array>
10#include <neo/color.hpp>
11#include <neo/gamma.hpp>
12
13namespace neo {
14
15 enum struct led_channel {
16 red,
17 green,
18 blue
19 };
20
21 template <led_channel Channel>
23 std::uint8_t value = 0;
24 };
25
26 template <led_channel Channel, led_channel... Channels>
27 struct channel_pack : public channel_storage<Channel>, public channel_pack<Channels...> {
28 };
29
30 template <led_channel Channel>
31 struct channel_pack<Channel> : public channel_storage<Channel> {};
32
33 template <led_channel... Channels>
34 class led : private channel_pack<Channels...> {
35 public:
36 led() = default;
37
38 inline led(rgb c, gamma_table const *table);
39
40 template <led_channel Channel>
41 void set(std::uint8_t v);
42 void set(led_channel chn, std::uint8_t v);
43
44 template <led_channel Channel>
45 [[nodiscard]] inline std::uint8_t get() const;
46 [[nodiscard]] inline std::uint8_t get(led_channel chn) const;
47
48 void set_color(rgb c, gamma_table const *table);
49
54 [[nodiscard]] rgb get_color(gamma_table const *table) const;
55 };
56
59
60}// namespace neo
61
62namespace neo {
63
64 template <led_channel... Channels>
65 template <led_channel Channel>
66 void led<Channels...>::set(std::uint8_t v) {
68 }
69
70 template <led_channel... Channels>
71 template <led_channel Channel>
72 std::uint8_t led<Channels...>::get() const {
74 }
75
76 template <led_channel... Channels>
77 void led<Channels...>::set(led_channel chn, std::uint8_t v) {
78 switch (chn) {
80 set<led_channel::red>(v);
81 break;
83 set<led_channel::green>(v);
84 break;
86 set<led_channel::blue>(v);
87 break;
88 default:
89 break;
90 }
91 }
92
93 template <led_channel... Channels>
94 std::uint8_t led<Channels...>::get(led_channel chn) const {
95 switch (chn) {
97 return get<led_channel::red>();
99 return get<led_channel::green>();
101 return get<led_channel::blue>();
102 default:
103 return 0;
104 }
105 }
106
107 template <led_channel... Channels>
109 if (table != nullptr) {
110 set<led_channel::red>((*table)[c.r]);
111 set<led_channel::green>((*table)[c.g]);
112 set<led_channel::blue>((*table)[c.b]);
113 } else {
114 set<led_channel::red>(c.r);
115 set<led_channel::green>(c.g);
116 set<led_channel::blue>(c.b);
117 }
118 }
119
120 template <led_channel... Channels>
122 set_color(c, table);
123 }
124
125 template <led_channel... Channels>
127 if (table != nullptr) {
128 return {table->reverse_lookup(get<led_channel::red>()),
129 table->reverse_lookup(get<led_channel::green>()),
130 table->reverse_lookup(get<led_channel::blue>())};
131 } else {
132 return {get<led_channel::red>(),
133 get<led_channel::green>(),
134 get<led_channel::blue>()};
135 }
136 }
137
138}// namespace neo
139
140#endif//NEO_LED_HPP
Definition: led.hpp:34
void set_color(rgb c, gamma_table const *table)
Definition: led.hpp:108
std::uint8_t get() const
Definition: led.hpp:72
rgb get_color(gamma_table const *table) const
Definition: led.hpp:126
void set(std::uint8_t v)
Definition: led.hpp:66
led()=default
Definition: any_fx.cpp:7
led_channel
Definition: led.hpp:15
Definition: led.hpp:27
Definition: led.hpp:22
std::uint8_t value
Definition: led.hpp:23
Definition: gamma.hpp:14
std::uint8_t reverse_lookup(std::uint8_t v) const
Definition: gamma.cpp:42
Definition: color.hpp:47
std::uint8_t r
Definition: color.hpp:48
std::uint8_t g
Definition: color.hpp:49
std::uint8_t b
Definition: color.hpp:50