mirror of
https://github.com/esphome/esphome.git
synced 2025-01-18 12:05:41 +00:00
[spi_led_strip] Fix priority (#8021)
This commit is contained in:
parent
0df6a913b3
commit
f1712cffa8
@ -1,8 +1,7 @@
|
||||
import esphome.codegen as cg
|
||||
from esphome.components import light, spi
|
||||
import esphome.config_validation as cv
|
||||
from esphome.components import light
|
||||
from esphome.components import spi
|
||||
from esphome.const import CONF_OUTPUT_ID, CONF_NUM_LEDS
|
||||
from esphome.const import CONF_NUM_LEDS, CONF_OUTPUT_ID
|
||||
|
||||
spi_led_strip_ns = cg.esphome_ns.namespace("spi_led_strip")
|
||||
SpiLedStrip = spi_led_strip_ns.class_(
|
||||
@ -18,8 +17,7 @@ CONFIG_SCHEMA = light.ADDRESSABLE_LIGHT_SCHEMA.extend(
|
||||
|
||||
|
||||
async def to_code(config):
|
||||
var = cg.new_Pvariable(config[CONF_OUTPUT_ID])
|
||||
cg.add(var.set_num_leds(config[CONF_NUM_LEDS]))
|
||||
var = cg.new_Pvariable(config[CONF_OUTPUT_ID], config[CONF_NUM_LEDS])
|
||||
await light.register_light(var, config)
|
||||
await spi.register_spi_device(var, config)
|
||||
await cg.register_component(var, config)
|
||||
|
67
esphome/components/spi_led_strip/spi_led_strip.cpp
Normal file
67
esphome/components/spi_led_strip/spi_led_strip.cpp
Normal file
@ -0,0 +1,67 @@
|
||||
#include "spi_led_strip.h"
|
||||
|
||||
namespace esphome {
|
||||
namespace spi_led_strip {
|
||||
|
||||
SpiLedStrip::SpiLedStrip(uint16_t num_leds) {
|
||||
this->num_leds_ = num_leds;
|
||||
ExternalRAMAllocator<uint8_t> allocator(ExternalRAMAllocator<uint8_t>::ALLOW_FAILURE);
|
||||
this->buffer_size_ = num_leds * 4 + 8;
|
||||
this->buf_ = allocator.allocate(this->buffer_size_);
|
||||
if (this->buf_ == nullptr) {
|
||||
ESP_LOGE(TAG, "Failed to allocate buffer of size %u", this->buffer_size_);
|
||||
return;
|
||||
}
|
||||
|
||||
this->effect_data_ = allocator.allocate(num_leds);
|
||||
if (this->effect_data_ == nullptr) {
|
||||
ESP_LOGE(TAG, "Failed to allocate effect data of size %u", num_leds);
|
||||
return;
|
||||
}
|
||||
memset(this->buf_, 0xFF, this->buffer_size_);
|
||||
memset(this->buf_, 0, 4);
|
||||
}
|
||||
void SpiLedStrip::setup() {
|
||||
if (this->effect_data_ == nullptr || this->buf_ == nullptr) {
|
||||
this->mark_failed();
|
||||
return;
|
||||
}
|
||||
this->spi_setup();
|
||||
}
|
||||
light::LightTraits SpiLedStrip::get_traits() {
|
||||
auto traits = light::LightTraits();
|
||||
traits.set_supported_color_modes({light::ColorMode::RGB});
|
||||
return traits;
|
||||
}
|
||||
void SpiLedStrip::dump_config() {
|
||||
esph_log_config(TAG, "SPI LED Strip:");
|
||||
esph_log_config(TAG, " LEDs: %d", this->num_leds_);
|
||||
if (this->data_rate_ >= spi::DATA_RATE_1MHZ) {
|
||||
esph_log_config(TAG, " Data rate: %uMHz", (unsigned) (this->data_rate_ / 1000000));
|
||||
} else {
|
||||
esph_log_config(TAG, " Data rate: %ukHz", (unsigned) (this->data_rate_ / 1000));
|
||||
}
|
||||
}
|
||||
void SpiLedStrip::write_state(light::LightState *state) {
|
||||
if (this->is_failed())
|
||||
return;
|
||||
if (ESPHOME_LOG_LEVEL >= ESPHOME_LOG_LEVEL_VERBOSE) {
|
||||
char strbuf[49];
|
||||
size_t len = std::min(this->buffer_size_, (size_t) (sizeof(strbuf) - 1) / 3);
|
||||
memset(strbuf, 0, sizeof(strbuf));
|
||||
for (size_t i = 0; i != len; i++) {
|
||||
sprintf(strbuf + i * 3, "%02X ", this->buf_[i]);
|
||||
}
|
||||
esph_log_v(TAG, "write_state: buf = %s", strbuf);
|
||||
}
|
||||
this->enable();
|
||||
this->write_array(this->buf_, this->buffer_size_);
|
||||
this->disable();
|
||||
}
|
||||
light::ESPColorView SpiLedStrip::get_view_internal(int32_t index) const {
|
||||
size_t pos = index * 4 + 5;
|
||||
return {this->buf_ + pos + 2, this->buf_ + pos + 1, this->buf_ + pos + 0, nullptr,
|
||||
this->effect_data_ + index, &this->correction_};
|
||||
}
|
||||
} // namespace spi_led_strip
|
||||
} // namespace esphome
|
@ -13,74 +13,22 @@ class SpiLedStrip : public light::AddressableLight,
|
||||
public spi::SPIDevice<spi::BIT_ORDER_MSB_FIRST, spi::CLOCK_POLARITY_HIGH, spi::CLOCK_PHASE_TRAILING,
|
||||
spi::DATA_RATE_1MHZ> {
|
||||
public:
|
||||
void setup() override { this->spi_setup(); }
|
||||
SpiLedStrip(uint16_t num_leds);
|
||||
void setup() override;
|
||||
float get_setup_priority() const override { return setup_priority::IO; }
|
||||
|
||||
int32_t size() const override { return this->num_leds_; }
|
||||
|
||||
light::LightTraits get_traits() override {
|
||||
auto traits = light::LightTraits();
|
||||
traits.set_supported_color_modes({light::ColorMode::RGB});
|
||||
return traits;
|
||||
}
|
||||
void set_num_leds(uint16_t num_leds) {
|
||||
this->num_leds_ = num_leds;
|
||||
ExternalRAMAllocator<uint8_t> allocator(ExternalRAMAllocator<uint8_t>::ALLOW_FAILURE);
|
||||
this->buffer_size_ = num_leds * 4 + 8;
|
||||
this->buf_ = allocator.allocate(this->buffer_size_);
|
||||
if (this->buf_ == nullptr) {
|
||||
esph_log_e(TAG, "Failed to allocate buffer of size %u", this->buffer_size_);
|
||||
this->mark_failed();
|
||||
return;
|
||||
}
|
||||
light::LightTraits get_traits() override;
|
||||
|
||||
this->effect_data_ = allocator.allocate(num_leds);
|
||||
if (this->effect_data_ == nullptr) {
|
||||
esph_log_e(TAG, "Failed to allocate effect data of size %u", num_leds);
|
||||
this->mark_failed();
|
||||
return;
|
||||
}
|
||||
memset(this->buf_, 0xFF, this->buffer_size_);
|
||||
memset(this->buf_, 0, 4);
|
||||
}
|
||||
void dump_config() override;
|
||||
|
||||
void dump_config() override {
|
||||
esph_log_config(TAG, "SPI LED Strip:");
|
||||
esph_log_config(TAG, " LEDs: %d", this->num_leds_);
|
||||
if (this->data_rate_ >= spi::DATA_RATE_1MHZ) {
|
||||
esph_log_config(TAG, " Data rate: %uMHz", (unsigned) (this->data_rate_ / 1000000));
|
||||
} else {
|
||||
esph_log_config(TAG, " Data rate: %ukHz", (unsigned) (this->data_rate_ / 1000));
|
||||
}
|
||||
}
|
||||
void write_state(light::LightState *state) override;
|
||||
|
||||
void write_state(light::LightState *state) override {
|
||||
if (this->is_failed())
|
||||
return;
|
||||
if (ESPHOME_LOG_LEVEL >= ESPHOME_LOG_LEVEL_VERBOSE) {
|
||||
char strbuf[49];
|
||||
size_t len = std::min(this->buffer_size_, (size_t) (sizeof(strbuf) - 1) / 3);
|
||||
memset(strbuf, 0, sizeof(strbuf));
|
||||
for (size_t i = 0; i != len; i++) {
|
||||
sprintf(strbuf + i * 3, "%02X ", this->buf_[i]);
|
||||
}
|
||||
esph_log_v(TAG, "write_state: buf = %s", strbuf);
|
||||
}
|
||||
this->enable();
|
||||
this->write_array(this->buf_, this->buffer_size_);
|
||||
this->disable();
|
||||
}
|
||||
|
||||
void clear_effect_data() override {
|
||||
for (int i = 0; i < this->size(); i++)
|
||||
this->effect_data_[i] = 0;
|
||||
}
|
||||
void clear_effect_data() override { memset(this->effect_data_, 0, this->num_leds_ * sizeof(this->effect_data_[0])); }
|
||||
|
||||
protected:
|
||||
light::ESPColorView get_view_internal(int32_t index) const override {
|
||||
size_t pos = index * 4 + 5;
|
||||
return {this->buf_ + pos + 2, this->buf_ + pos + 1, this->buf_ + pos + 0, nullptr,
|
||||
this->effect_data_ + index, &this->correction_};
|
||||
}
|
||||
light::ESPColorView get_view_internal(int32_t index) const override;
|
||||
|
||||
size_t buffer_size_{};
|
||||
uint8_t *effect_data_{nullptr};
|
||||
|
Loading…
x
Reference in New Issue
Block a user