mirror of
https://github.com/esphome/esphome.git
synced 2024-11-16 10:45:48 +01:00
ledc: do not try to write_state to an uninitialized output (#1732)
Co-authored-by: Philipp Tölke <ptoelke@tecracer.de> Co-authored-by: Otto winter <otto@otto-winter.com>
This commit is contained in:
parent
f463cd98f8
commit
edb557f79e
@ -31,6 +31,11 @@ optional<uint8_t> ledc_bit_depth_for_frequency(float frequency) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void LEDCOutput::write_state(float state) {
|
void LEDCOutput::write_state(float state) {
|
||||||
|
if (!initialized_) {
|
||||||
|
ESP_LOGW(TAG, "LEDC output hasn't been initialized yet!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (this->pin_->is_inverted())
|
if (this->pin_->is_inverted())
|
||||||
state = 1.0f - state;
|
state = 1.0f - state;
|
||||||
|
|
||||||
@ -81,6 +86,7 @@ void LEDCOutput::setup() {
|
|||||||
chan_conf.duty = inverted_ == pin_->is_inverted() ? 0 : (1U << bit_depth_);
|
chan_conf.duty = inverted_ == pin_->is_inverted() ? 0 : (1U << bit_depth_);
|
||||||
chan_conf.hpoint = 0;
|
chan_conf.hpoint = 0;
|
||||||
ledc_channel_config(&chan_conf);
|
ledc_channel_config(&chan_conf);
|
||||||
|
initialized_ = true;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -101,8 +107,13 @@ void LEDCOutput::update_frequency(float frequency) {
|
|||||||
this->frequency_ = frequency;
|
this->frequency_ = frequency;
|
||||||
#ifdef USE_ARDUINO
|
#ifdef USE_ARDUINO
|
||||||
ledcSetup(this->channel_, frequency, this->bit_depth_);
|
ledcSetup(this->channel_, frequency, this->bit_depth_);
|
||||||
|
initialized_ = true;
|
||||||
#endif // USE_ARDUINO
|
#endif // USE_ARDUINO
|
||||||
#ifdef USE_ESP_IDF
|
#ifdef USE_ESP_IDF
|
||||||
|
if (!initialized_) {
|
||||||
|
ESP_LOGW(TAG, "LEDC output hasn't been initialized yet!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
auto speed_mode = channel_ < 8 ? LEDC_HIGH_SPEED_MODE : LEDC_LOW_SPEED_MODE;
|
auto speed_mode = channel_ < 8 ? LEDC_HIGH_SPEED_MODE : LEDC_LOW_SPEED_MODE;
|
||||||
auto timer_num = static_cast<ledc_timer_t>((channel_ % 8) / 2);
|
auto timer_num = static_cast<ledc_timer_t>((channel_ % 8) / 2);
|
||||||
|
|
||||||
|
@ -36,6 +36,7 @@ class LEDCOutput : public output::FloatOutput, public Component {
|
|||||||
uint8_t bit_depth_{};
|
uint8_t bit_depth_{};
|
||||||
float frequency_{};
|
float frequency_{};
|
||||||
float duty_{0.0f};
|
float duty_{0.0f};
|
||||||
|
bool initialized_ = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename... Ts> class SetFrequencyAction : public Action<Ts...> {
|
template<typename... Ts> class SetFrequencyAction : public Action<Ts...> {
|
||||||
|
Loading…
Reference in New Issue
Block a user