ESPHome 2025.5.0
Loading...
Searching...
No Matches
led_strip.h
Go to the documentation of this file.
1#pragma once
2
3#ifdef USE_RP2040
4
8
11
12#include <hardware/dma.h>
13#include <hardware/pio.h>
14#include <hardware/structs/pio.h>
15#include <pico/stdio.h>
16#include <pico/sem.h>
17#include <map>
18
19namespace esphome {
20namespace rp2040_pio_led_strip {
21
30
39
40inline const char *rgb_order_to_string(RGBOrder order) {
41 switch (order) {
42 case ORDER_RGB:
43 return "RGB";
44 case ORDER_RBG:
45 return "RBG";
46 case ORDER_GRB:
47 return "GRB";
48 case ORDER_GBR:
49 return "GBR";
50 case ORDER_BGR:
51 return "BGR";
52 case ORDER_BRG:
53 return "BRG";
54 default:
55 return "UNKNOWN";
56 }
57}
58
59using init_fn = void (*)(PIO pio, uint sm, uint offset, uint pin, float freq);
60
62 public:
63 void setup() override;
64 void write_state(light::LightState *state) override;
65 float get_setup_priority() const override;
66
67 int32_t size() const override { return this->num_leds_; }
69 auto traits = light::LightTraits();
70 this->is_rgbw_ ? traits.set_supported_color_modes({light::ColorMode::RGB_WHITE, light::ColorMode::WHITE})
71 : traits.set_supported_color_modes({light::ColorMode::RGB});
72 return traits;
73 }
74 void set_pin(uint8_t pin) { this->pin_ = pin; }
75 void set_num_leds(uint32_t num_leds) { this->num_leds_ = num_leds; }
76 void set_is_rgbw(bool is_rgbw) { this->is_rgbw_ = is_rgbw; }
77
78 void set_max_refresh_rate(float interval_us) { this->max_refresh_rate_ = interval_us; }
79
80 void set_pio(int pio_num) { pio_num ? this->pio_ = pio1 : this->pio_ = pio0; }
81 void set_program(const pio_program_t *program) { this->program_ = program; }
83
84 void set_chipset(Chipset chipset) { this->chipset_ = chipset; };
85 void set_rgb_order(RGBOrder rgb_order) { this->rgb_order_ = rgb_order; }
86 void clear_effect_data() override {
87 for (int i = 0; i < this->size(); i++) {
88 this->effect_data_[i] = 0;
89 }
90 }
91
92 void dump_config() override;
93
94 protected:
95 light::ESPColorView get_view_internal(int32_t index) const override;
96
97 size_t get_buffer_size_() const { return this->num_leds_ * (3 + this->is_rgbw_); }
98
99 static void dma_write_complete_handler_();
100
101 uint8_t *buf_{nullptr};
102 uint8_t *effect_data_{nullptr};
103
104 uint8_t pin_;
105 uint32_t num_leds_;
107
108 pio_hw_t *pio_;
109 uint sm_;
111 dma_channel_config dma_config_;
112
115
116 uint32_t last_refresh_{0};
118
119 const pio_program_t *program_;
121
122 private:
123 inline static int num_instance_[2];
124 inline static std::map<Chipset, bool> conf_count_;
125 inline static std::map<Chipset, int> chipset_offsets_;
126 inline static bool dma_chan_active_[12];
127 inline static struct semaphore dma_write_complete_sem_[12];
128};
129
130} // namespace rp2040_pio_led_strip
131} // namespace esphome
132
133#endif // USE_RP2040
This class represents the communication layer between the front-end MQTT layer and the hardware outpu...
Definition light_state.h:63
This class is used to represent the capabilities of a light.
light::ESPColorView get_view_internal(int32_t index) const override
void write_state(light::LightState *state) override
bool state
Definition fan.h:0
@ RGB_WHITE
RGB color output and a separate white output.
@ RGB
RGB color output.
@ WHITE
White output only (use only if the light also has another color mode such as RGB).
void(*)(PIO pio, uint sm, uint offset, uint pin, float freq) init_fn
Definition led_strip.h:59
const char * rgb_order_to_string(RGBOrder order)
Definition led_strip.h:40
Providing packet encoding functions for exchanging data with a remote host.
Definition a01nyub.cpp:7
void init()
Definition core.cpp:90