mirror of
				https://github.com/esphome/esphome.git
				synced 2025-11-04 09:01:49 +00:00 
			
		
		
		
	[spi_led_strip] Fix priority (#8021)
This commit is contained in:
		@@ -1,8 +1,7 @@
 | 
				
			|||||||
import esphome.codegen as cg
 | 
					import esphome.codegen as cg
 | 
				
			||||||
 | 
					from esphome.components import light, spi
 | 
				
			||||||
import esphome.config_validation as cv
 | 
					import esphome.config_validation as cv
 | 
				
			||||||
from esphome.components import light
 | 
					from esphome.const import CONF_NUM_LEDS, CONF_OUTPUT_ID
 | 
				
			||||||
from esphome.components import spi
 | 
					 | 
				
			||||||
from esphome.const import CONF_OUTPUT_ID, CONF_NUM_LEDS
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
spi_led_strip_ns = cg.esphome_ns.namespace("spi_led_strip")
 | 
					spi_led_strip_ns = cg.esphome_ns.namespace("spi_led_strip")
 | 
				
			||||||
SpiLedStrip = spi_led_strip_ns.class_(
 | 
					SpiLedStrip = spi_led_strip_ns.class_(
 | 
				
			||||||
@@ -18,8 +17,7 @@ CONFIG_SCHEMA = light.ADDRESSABLE_LIGHT_SCHEMA.extend(
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
async def to_code(config):
 | 
					async def to_code(config):
 | 
				
			||||||
    var = cg.new_Pvariable(config[CONF_OUTPUT_ID])
 | 
					    var = cg.new_Pvariable(config[CONF_OUTPUT_ID], config[CONF_NUM_LEDS])
 | 
				
			||||||
    cg.add(var.set_num_leds(config[CONF_NUM_LEDS]))
 | 
					 | 
				
			||||||
    await light.register_light(var, config)
 | 
					    await light.register_light(var, config)
 | 
				
			||||||
    await spi.register_spi_device(var, config)
 | 
					    await spi.register_spi_device(var, config)
 | 
				
			||||||
    await cg.register_component(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,
 | 
					                    public spi::SPIDevice<spi::BIT_ORDER_MSB_FIRST, spi::CLOCK_POLARITY_HIGH, spi::CLOCK_PHASE_TRAILING,
 | 
				
			||||||
                                          spi::DATA_RATE_1MHZ> {
 | 
					                                          spi::DATA_RATE_1MHZ> {
 | 
				
			||||||
 public:
 | 
					 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_; }
 | 
					  int32_t size() const override { return this->num_leds_; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  light::LightTraits get_traits() override {
 | 
					  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;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    this->effect_data_ = allocator.allocate(num_leds);
 | 
					  void dump_config() override;
 | 
				
			||||||
    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 write_state(light::LightState *state) 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 clear_effect_data() override { memset(this->effect_data_, 0, this->num_leds_ * sizeof(this->effect_data_[0])); }
 | 
				
			||||||
    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;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 protected:
 | 
					 protected:
 | 
				
			||||||
  light::ESPColorView get_view_internal(int32_t index) const override {
 | 
					  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_};
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  size_t buffer_size_{};
 | 
					  size_t buffer_size_{};
 | 
				
			||||||
  uint8_t *effect_data_{nullptr};
 | 
					  uint8_t *effect_data_{nullptr};
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user