diff --git a/esphome/components/uart/uart.cpp b/esphome/components/uart/uart.cpp index cf2d00c929..1cfdb38a90 100644 --- a/esphome/components/uart/uart.cpp +++ b/esphome/components/uart/uart.cpp @@ -43,7 +43,8 @@ void UARTComponent::check_logger_conflict_() { #endif } -void UARTDevice::check_uart_settings(uint32_t baud_rate, uint8_t stop_bits, UARTParityOptions parity, uint8_t nr_bits) { +void UARTDevice::check_uart_settings(uint32_t baud_rate, uint8_t stop_bits, UARTParityOptions parity, + uint8_t data_bits) { if (this->parent_->baud_rate_ != baud_rate) { ESP_LOGE(TAG, " Invalid baud_rate: Integration requested baud_rate %u but you have %u!", baud_rate, this->parent_->baud_rate_); @@ -52,9 +53,9 @@ void UARTDevice::check_uart_settings(uint32_t baud_rate, uint8_t stop_bits, UART ESP_LOGE(TAG, " Invalid stop bits: Integration requested stop_bits %u but you have %u!", stop_bits, this->parent_->stop_bits_); } - if (this->parent_->nr_bits_ != nr_bits) { - ESP_LOGE(TAG, " Invalid number of data bits: Integration requested %u data bits but you have %u!", nr_bits, - this->parent_->nr_bits_); + if (this->parent_->data_bits_ != data_bits) { + ESP_LOGE(TAG, " Invalid number of data bits: Integration requested %u data bits but you have %u!", data_bits, + this->parent_->data_bits_); } if (this->parent_->parity_ != parity) { ESP_LOGE(TAG, " Invalid parity: Integration requested parity %s but you have %s!", parity_to_str(parity), diff --git a/esphome/components/uart/uart.h b/esphome/components/uart/uart.h index dedfdd74af..7430a4ee05 100644 --- a/esphome/components/uart/uart.h +++ b/esphome/components/uart/uart.h @@ -18,7 +18,7 @@ const char *parity_to_str(UARTParityOptions parity); #ifdef ARDUINO_ARCH_ESP8266 class ESP8266SoftwareSerial { public: - void setup(int8_t tx_pin, int8_t rx_pin, uint32_t baud_rate, uint8_t stop_bits, uint32_t nr_bits, + void setup(int8_t tx_pin, int8_t rx_pin, uint32_t baud_rate, uint8_t stop_bits, uint32_t data_bits, UARTParityOptions parity, size_t rx_buffer_size); uint8_t read_byte(); @@ -30,8 +30,6 @@ class ESP8266SoftwareSerial { int available(); - void begin(); - void end(); GPIOPin *gpio_tx_pin_{nullptr}; GPIOPin *gpio_rx_pin_{nullptr}; @@ -48,7 +46,7 @@ class ESP8266SoftwareSerial { volatile size_t rx_in_pos_{0}; size_t rx_out_pos_{0}; uint8_t stop_bits_; - uint8_t nr_bits_; + uint8_t data_bits_; UARTParityOptions parity_; ISRInternalGPIOPin *tx_pin_{nullptr}; ISRInternalGPIOPin *rx_pin_{nullptr}; @@ -71,8 +69,6 @@ class UARTComponent : public Component, public Stream { void write_array(const std::vector &data) { this->write_array(&data[0], data.size()); } void write_str(const char *str); - void end(); - void begin(); bool peek_byte(uint8_t *data); @@ -95,7 +91,7 @@ class UARTComponent : public Component, public Stream { void set_rx_pin(uint8_t rx_pin) { this->rx_pin_ = rx_pin; } void set_rx_buffer_size(size_t rx_buffer_size) { this->rx_buffer_size_ = rx_buffer_size; } void set_stop_bits(uint8_t stop_bits) { this->stop_bits_ = stop_bits; } - void set_data_bits(uint8_t nr_bits) { this->nr_bits_ = nr_bits; } + void set_data_bits(uint8_t data_bits) { this->data_bits_ = data_bits; } void set_parity(UARTParityOptions parity) { this->parity_ = parity; } protected: @@ -112,7 +108,7 @@ class UARTComponent : public Component, public Stream { size_t rx_buffer_size_; uint32_t baud_rate_; uint8_t stop_bits_; - uint8_t nr_bits_; + uint8_t data_bits_; UARTParityOptions parity_; }; @@ -156,12 +152,10 @@ class UARTDevice : public Stream { size_t write(uint8_t data) override { return this->parent_->write(data); } int read() override { return this->parent_->read(); } int peek() override { return this->parent_->peek(); } - void end() { this->parent_->end(); } - void begin() { this->parent_->begin(); } /// Check that the configuration of the UART bus matches the provided values and otherwise print a warning void check_uart_settings(uint32_t baud_rate, uint8_t stop_bits = 1, - UARTParityOptions parity = UART_CONFIG_PARITY_NONE, uint8_t nr_bits = 8); + UARTParityOptions parity = UART_CONFIG_PARITY_NONE, uint8_t data_bits = 8); protected: UARTComponent *parent_{nullptr}; diff --git a/esphome/components/uart/uart_esp32.cpp b/esphome/components/uart/uart_esp32.cpp index e18f9c5b1f..f7af85cf7b 100644 --- a/esphome/components/uart/uart_esp32.cpp +++ b/esphome/components/uart/uart_esp32.cpp @@ -43,7 +43,7 @@ uint32_t UARTComponent::get_config() { else if (this->parity_ == UART_CONFIG_PARITY_ODD) config |= UART_PARITY_ODD | UART_PARITY_EN; - switch (this->nr_bits_) { + switch (this->data_bits_) { case 5: config |= UART_NB_BIT_5; break; @@ -94,7 +94,7 @@ void UARTComponent::dump_config() { ESP_LOGCONFIG(TAG, " RX Buffer Size: %u", this->rx_buffer_size_); } ESP_LOGCONFIG(TAG, " Baud Rate: %u baud", this->baud_rate_); - ESP_LOGCONFIG(TAG, " Bits: %u", this->nr_bits_); + ESP_LOGCONFIG(TAG, " Data Bits: %u", this->data_bits_); ESP_LOGCONFIG(TAG, " Parity: %s", parity_to_str(this->parity_)); ESP_LOGCONFIG(TAG, " Stop bits: %u", this->stop_bits_); this->check_logger_conflict_(); @@ -114,8 +114,6 @@ void UARTComponent::write_str(const char *str) { this->hw_serial_->write(str); ESP_LOGVV(TAG, " Wrote \"%s\"", str); } -void UARTComponent::end() { this->hw_serial_->end(); } -void UARTComponent::begin() { this->hw_serial_->begin(this->baud_rate_, get_config()); } bool UARTComponent::read_byte(uint8_t *data) { if (!this->check_read_timeout_()) return false; @@ -161,4 +159,4 @@ void UARTComponent::flush() { } // namespace uart } // namespace esphome -#endif // ESP32 +#endif // ARDUINO_ARCH_ESP32 diff --git a/esphome/components/uart/uart_esp8266.cpp b/esphome/components/uart/uart_esp8266.cpp index 40975b6e5e..edb530f537 100644 --- a/esphome/components/uart/uart_esp8266.cpp +++ b/esphome/components/uart/uart_esp8266.cpp @@ -19,7 +19,7 @@ uint32_t UARTComponent::get_config() { else if (this->parity_ == UART_CONFIG_PARITY_ODD) config |= UART_PARITY_ODD; - switch (this->nr_bits_) { + switch (this->data_bits_) { case 5: config |= UART_NB_BIT_5; break; @@ -66,7 +66,7 @@ void UARTComponent::setup() { this->sw_serial_ = new ESP8266SoftwareSerial(); int8_t tx = this->tx_pin_.has_value() ? *this->tx_pin_ : -1; int8_t rx = this->rx_pin_.has_value() ? *this->rx_pin_ : -1; - this->sw_serial_->setup(tx, rx, this->baud_rate_, this->stop_bits_, this->nr_bits_, this->parity_, + this->sw_serial_->setup(tx, rx, this->baud_rate_, this->stop_bits_, this->data_bits_, this->parity_, this->rx_buffer_size_); } } @@ -81,7 +81,7 @@ void UARTComponent::dump_config() { ESP_LOGCONFIG(TAG, " RX Buffer Size: %u", this->rx_buffer_size_); // NOLINT } ESP_LOGCONFIG(TAG, " Baud Rate: %u baud", this->baud_rate_); - ESP_LOGCONFIG(TAG, " Bits: %u", this->nr_bits_); + ESP_LOGCONFIG(TAG, " Data Bits: %u", this->data_bits_); ESP_LOGCONFIG(TAG, " Parity: %s", parity_to_str(this->parity_)); ESP_LOGCONFIG(TAG, " Stop bits: %u", this->stop_bits_); if (this->hw_serial_ != nullptr) { @@ -121,18 +121,6 @@ void UARTComponent::write_str(const char *str) { } ESP_LOGVV(TAG, " Wrote \"%s\"", str); } -void UARTComponent::end() { - if (this->hw_serial_ != nullptr) - this->hw_serial_->end(); - else if (this->sw_serial_ != nullptr) - this->sw_serial_->end(); -} -void UARTComponent::begin() { - if (this->hw_serial_ != nullptr) - this->hw_serial_->begin(this->baud_rate_, static_cast(get_config())); - else if (this->sw_serial_ != nullptr) - this->sw_serial_->begin(); -} bool UARTComponent::read_byte(uint8_t *data) { if (!this->check_read_timeout_()) return false; @@ -198,28 +186,12 @@ void UARTComponent::flush() { this->sw_serial_->flush(); } } -void ESP8266SoftwareSerial::end() { - /* Because of this bug: https://github.com/esp8266/Arduino/issues/6049 - * detach_interrupt can't called. - * So simply reset rx_in_pos and rx_out_pos even if it's totally racy with - * the interrupt. - */ - // this->gpio_rx_pin_->detach_interrupt(); - this->rx_in_pos_ = 0; - this->rx_out_pos_ = 0; -} -void ESP8266SoftwareSerial::begin() { - /* attach_interrupt() is also not safe because gpio_intr() may - * endup with arg == nullptr. - */ - // this->gpio_rx_pin_->attach_interrupt(ESP8266SoftwareSerial::gpio_intr, this, FALLING); -} -void ESP8266SoftwareSerial::setup(int8_t tx_pin, int8_t rx_pin, uint32_t baud_rate, uint8_t stop_bits, uint32_t nr_bits, - UARTParityOptions parity, size_t rx_buffer_size) { +void ESP8266SoftwareSerial::setup(int8_t tx_pin, int8_t rx_pin, uint32_t baud_rate, uint8_t stop_bits, + uint32_t data_bits, UARTParityOptions parity, size_t rx_buffer_size) { this->bit_time_ = F_CPU / baud_rate; this->rx_buffer_size_ = rx_buffer_size; this->stop_bits_ = stop_bits; - this->nr_bits_ = nr_bits; + this->data_bits_ = data_bits; this->parity_ = parity; if (tx_pin != -1) { auto pin = GPIOPin(tx_pin, OUTPUT); @@ -242,7 +214,7 @@ void ICACHE_RAM_ATTR ESP8266SoftwareSerial::gpio_intr(ESP8266SoftwareSerial *arg const uint32_t start = ESP.getCycleCount(); uint8_t rec = 0; // Manually unroll the loop - for (int i = 0; i < arg->nr_bits_; i++) + for (int i = 0; i < arg->data_bits_; i++) rec |= arg->read_bit_(&wait, start) << i; /* If parity is enabled, just read it and ignore it. */ @@ -282,7 +254,7 @@ void ICACHE_RAM_ATTR HOT ESP8266SoftwareSerial::write_byte(uint8_t data) { const uint32_t start = ESP.getCycleCount(); // Start bit this->write_bit_(false, &wait, start); - for (int i = 0; i < this->nr_bits_; i++) { + for (int i = 0; i < this->data_bits_; i++) { bool bit = data & (1 << i); this->write_bit_(bit, &wait, start); if (need_parity_bit) @@ -333,4 +305,4 @@ int ESP8266SoftwareSerial::available() { } // namespace uart } // namespace esphome -#endif // ESP8266 +#endif // ARDUINO_ARCH_ESP8266