halx_driver
読み取り中…
検索中…
一致する文字列を見つけられません
ws2812b.hpp
[詳解]
1#pragma once
2
3#include <cmath>
4#include <cstddef>
5#include <cstdint>
6#include <vector>
7
8#include <halx/core.hpp>
9
10namespace halx::driver {
11
12struct Rgb {
13 float r;
14 float g;
15 float b;
16};
17
18struct Hsv {
19 float h;
20 float s;
21 float v;
22};
23
24inline Rgb to_rgb(const Hsv &hsv) {
25 float c = hsv.v * hsv.s;
26 float x = c * (1.0f - std::fabs(std::fmod(hsv.h / 60.0f, 2.0f) - 1.0f));
27 float m = hsv.v - c;
28
29 if (hsv.h >= 0 && hsv.h < 60) {
30 return {(c + m), (x + m), (0 + m)};
31 } else if (hsv.h >= 60 && hsv.h < 120) {
32 return {(x + m), (c + m), (0 + m)};
33 } else if (hsv.h >= 120 && hsv.h < 180) {
34 return {(0 + m), (c + m), (x + m)};
35 } else if (hsv.h >= 180 && hsv.h < 240) {
36 return {(0 + m), (x + m), (c + m)};
37 } else if (hsv.h >= 240 && hsv.h < 300) {
38 return {(x + m), (0 + m), (c + m)};
39 } else {
40 return {(c + m), (0 + m), (x + m)};
41 }
42}
43
44// period: 1.25us
45// freq: 800kHz
46// counter period: 25-1
47// dma circular mode
48class Ws2812b {
49public:
50 Ws2812b(TIM_HandleTypeDef *htim, uint32_t channel, size_t size)
51 : htim_{htim}, channel_{channel}, size_{size},
52 buf_(RESET_CODE + size * 24, 0) {
53 HAL_TIM_PWM_Start_DMA(htim_, channel_,
54 reinterpret_cast<uint32_t *>(buf_.data()),
55 buf_.size());
56 }
57
58 void set_rgb(size_t index, const Rgb &rgb) {
59 uint8_t r = rgb.r * 255.0f;
60 uint8_t g = rgb.g * 255.0f;
61 uint8_t b = rgb.b * 255.0f;
62
63 // G
64 size_t offset = RESET_CODE + index * 24;
65 for (size_t i = 0; i < 8; ++i) {
66 if (g & (1 << (7 - i))) {
67 buf_[offset + i] = ONE_CODE;
68 } else {
69 buf_[offset + i] = ZERO_CODE;
70 }
71 }
72
73 // R
74 for (size_t i = 0; i < 8; ++i) {
75 if (r & (1 << (7 - i))) {
76 buf_[offset + 8 + i] = ONE_CODE;
77 } else {
78 buf_[offset + 8 + i] = ZERO_CODE;
79 }
80 }
81
82 // B
83 for (size_t i = 0; i < 8; ++i) {
84 if (b & (1 << (7 - i))) {
85 buf_[offset + 16 + i] = ONE_CODE;
86 } else {
87 buf_[offset + 16 + i] = ZERO_CODE;
88 }
89 }
90 }
91
92 void set_rgb_all(const Rgb &rgb) {
93 for (size_t i = 0; i < size_; ++i) {
94 set_rgb(i, rgb);
95 }
96 }
97
98 size_t size() { return size_; }
99
100private:
101 static constexpr uint8_t RESET_CODE = 50;
102 static constexpr uint8_t ZERO_CODE = 8;
103 static constexpr uint8_t ONE_CODE = 16;
104
105 TIM_HandleTypeDef *htim_;
106 uint32_t channel_;
107 size_t size_;
108 std::vector<uint32_t> buf_;
109};
110
111} // namespace halx::driver
Ws2812b(TIM_HandleTypeDef *htim, uint32_t channel, size_t size)
Definition ws2812b.hpp:50
size_t size()
Definition ws2812b.hpp:98
void set_rgb_all(const Rgb &rgb)
Definition ws2812b.hpp:92
void set_rgb(size_t index, const Rgb &rgb)
Definition ws2812b.hpp:58
Definition amt21.hpp:10
Rgb to_rgb(const Hsv &hsv)
Definition ws2812b.hpp:24
Definition ws2812b.hpp:18
float s
Definition ws2812b.hpp:20
float h
Definition ws2812b.hpp:19
float v
Definition ws2812b.hpp:21
Definition ws2812b.hpp:12
float b
Definition ws2812b.hpp:15
float g
Definition ws2812b.hpp:14
float r
Definition ws2812b.hpp:13