mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-30 22:53:59 +00:00 
			
		
		
		
	Clean up UART Improvements code (#1190)
This commit is contained in:
		| @@ -43,7 +43,8 @@ void UARTComponent::check_logger_conflict_() { | |||||||
| #endif | #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) { |   if (this->parent_->baud_rate_ != baud_rate) { | ||||||
|     ESP_LOGE(TAG, "  Invalid baud_rate: Integration requested baud_rate %u but you have %u!", baud_rate, |     ESP_LOGE(TAG, "  Invalid baud_rate: Integration requested baud_rate %u but you have %u!", baud_rate, | ||||||
|              this->parent_->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, |     ESP_LOGE(TAG, "  Invalid stop bits: Integration requested stop_bits %u but you have %u!", stop_bits, | ||||||
|              this->parent_->stop_bits_); |              this->parent_->stop_bits_); | ||||||
|   } |   } | ||||||
|   if (this->parent_->nr_bits_ != 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!", nr_bits, |     ESP_LOGE(TAG, "  Invalid number of data bits: Integration requested %u data bits but you have %u!", data_bits, | ||||||
|              this->parent_->nr_bits_); |              this->parent_->data_bits_); | ||||||
|   } |   } | ||||||
|   if (this->parent_->parity_ != parity) { |   if (this->parent_->parity_ != parity) { | ||||||
|     ESP_LOGE(TAG, "  Invalid parity: Integration requested parity %s but you have %s!", parity_to_str(parity), |     ESP_LOGE(TAG, "  Invalid parity: Integration requested parity %s but you have %s!", parity_to_str(parity), | ||||||
|   | |||||||
| @@ -18,7 +18,7 @@ const char *parity_to_str(UARTParityOptions parity); | |||||||
| #ifdef ARDUINO_ARCH_ESP8266 | #ifdef ARDUINO_ARCH_ESP8266 | ||||||
| class ESP8266SoftwareSerial { | class ESP8266SoftwareSerial { | ||||||
|  public: |  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); |              UARTParityOptions parity, size_t rx_buffer_size); | ||||||
|  |  | ||||||
|   uint8_t read_byte(); |   uint8_t read_byte(); | ||||||
| @@ -30,8 +30,6 @@ class ESP8266SoftwareSerial { | |||||||
|  |  | ||||||
|   int available(); |   int available(); | ||||||
|  |  | ||||||
|   void begin(); |  | ||||||
|   void end(); |  | ||||||
|   GPIOPin *gpio_tx_pin_{nullptr}; |   GPIOPin *gpio_tx_pin_{nullptr}; | ||||||
|   GPIOPin *gpio_rx_pin_{nullptr}; |   GPIOPin *gpio_rx_pin_{nullptr}; | ||||||
|  |  | ||||||
| @@ -48,7 +46,7 @@ class ESP8266SoftwareSerial { | |||||||
|   volatile size_t rx_in_pos_{0}; |   volatile size_t rx_in_pos_{0}; | ||||||
|   size_t rx_out_pos_{0}; |   size_t rx_out_pos_{0}; | ||||||
|   uint8_t stop_bits_; |   uint8_t stop_bits_; | ||||||
|   uint8_t nr_bits_; |   uint8_t data_bits_; | ||||||
|   UARTParityOptions parity_; |   UARTParityOptions parity_; | ||||||
|   ISRInternalGPIOPin *tx_pin_{nullptr}; |   ISRInternalGPIOPin *tx_pin_{nullptr}; | ||||||
|   ISRInternalGPIOPin *rx_pin_{nullptr}; |   ISRInternalGPIOPin *rx_pin_{nullptr}; | ||||||
| @@ -71,8 +69,6 @@ class UARTComponent : public Component, public Stream { | |||||||
|   void write_array(const std::vector<uint8_t> &data) { this->write_array(&data[0], data.size()); } |   void write_array(const std::vector<uint8_t> &data) { this->write_array(&data[0], data.size()); } | ||||||
|  |  | ||||||
|   void write_str(const char *str); |   void write_str(const char *str); | ||||||
|   void end(); |  | ||||||
|   void begin(); |  | ||||||
|  |  | ||||||
|   bool peek_byte(uint8_t *data); |   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_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_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_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; } |   void set_parity(UARTParityOptions parity) { this->parity_ = parity; } | ||||||
|  |  | ||||||
|  protected: |  protected: | ||||||
| @@ -112,7 +108,7 @@ class UARTComponent : public Component, public Stream { | |||||||
|   size_t rx_buffer_size_; |   size_t rx_buffer_size_; | ||||||
|   uint32_t baud_rate_; |   uint32_t baud_rate_; | ||||||
|   uint8_t stop_bits_; |   uint8_t stop_bits_; | ||||||
|   uint8_t nr_bits_; |   uint8_t data_bits_; | ||||||
|   UARTParityOptions parity_; |   UARTParityOptions parity_; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| @@ -156,12 +152,10 @@ class UARTDevice : public Stream { | |||||||
|   size_t write(uint8_t data) override { return this->parent_->write(data); } |   size_t write(uint8_t data) override { return this->parent_->write(data); } | ||||||
|   int read() override { return this->parent_->read(); } |   int read() override { return this->parent_->read(); } | ||||||
|   int peek() override { return this->parent_->peek(); } |   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 |   /// 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, |   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: |  protected: | ||||||
|   UARTComponent *parent_{nullptr}; |   UARTComponent *parent_{nullptr}; | ||||||
|   | |||||||
| @@ -43,7 +43,7 @@ uint32_t UARTComponent::get_config() { | |||||||
|   else if (this->parity_ == UART_CONFIG_PARITY_ODD) |   else if (this->parity_ == UART_CONFIG_PARITY_ODD) | ||||||
|     config |= UART_PARITY_ODD | UART_PARITY_EN; |     config |= UART_PARITY_ODD | UART_PARITY_EN; | ||||||
|  |  | ||||||
|   switch (this->nr_bits_) { |   switch (this->data_bits_) { | ||||||
|     case 5: |     case 5: | ||||||
|       config |= UART_NB_BIT_5; |       config |= UART_NB_BIT_5; | ||||||
|       break; |       break; | ||||||
| @@ -94,7 +94,7 @@ void UARTComponent::dump_config() { | |||||||
|     ESP_LOGCONFIG(TAG, "  RX Buffer Size: %u", this->rx_buffer_size_); |     ESP_LOGCONFIG(TAG, "  RX Buffer Size: %u", this->rx_buffer_size_); | ||||||
|   } |   } | ||||||
|   ESP_LOGCONFIG(TAG, "  Baud Rate: %u baud", this->baud_rate_); |   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, "  Parity: %s", parity_to_str(this->parity_)); | ||||||
|   ESP_LOGCONFIG(TAG, "  Stop bits: %u", this->stop_bits_); |   ESP_LOGCONFIG(TAG, "  Stop bits: %u", this->stop_bits_); | ||||||
|   this->check_logger_conflict_(); |   this->check_logger_conflict_(); | ||||||
| @@ -114,8 +114,6 @@ void UARTComponent::write_str(const char *str) { | |||||||
|   this->hw_serial_->write(str); |   this->hw_serial_->write(str); | ||||||
|   ESP_LOGVV(TAG, "    Wrote \"%s\"", 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) { | bool UARTComponent::read_byte(uint8_t *data) { | ||||||
|   if (!this->check_read_timeout_()) |   if (!this->check_read_timeout_()) | ||||||
|     return false; |     return false; | ||||||
| @@ -161,4 +159,4 @@ void UARTComponent::flush() { | |||||||
|  |  | ||||||
| }  // namespace uart | }  // namespace uart | ||||||
| }  // namespace esphome | }  // namespace esphome | ||||||
| #endif  // ESP32 | #endif  // ARDUINO_ARCH_ESP32 | ||||||
|   | |||||||
| @@ -19,7 +19,7 @@ uint32_t UARTComponent::get_config() { | |||||||
|   else if (this->parity_ == UART_CONFIG_PARITY_ODD) |   else if (this->parity_ == UART_CONFIG_PARITY_ODD) | ||||||
|     config |= UART_PARITY_ODD; |     config |= UART_PARITY_ODD; | ||||||
|  |  | ||||||
|   switch (this->nr_bits_) { |   switch (this->data_bits_) { | ||||||
|     case 5: |     case 5: | ||||||
|       config |= UART_NB_BIT_5; |       config |= UART_NB_BIT_5; | ||||||
|       break; |       break; | ||||||
| @@ -66,7 +66,7 @@ void UARTComponent::setup() { | |||||||
|     this->sw_serial_ = new ESP8266SoftwareSerial(); |     this->sw_serial_ = new ESP8266SoftwareSerial(); | ||||||
|     int8_t tx = this->tx_pin_.has_value() ? *this->tx_pin_ : -1; |     int8_t tx = this->tx_pin_.has_value() ? *this->tx_pin_ : -1; | ||||||
|     int8_t rx = this->rx_pin_.has_value() ? *this->rx_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_); |                             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, "  RX Buffer Size: %u", this->rx_buffer_size_);  // NOLINT | ||||||
|   } |   } | ||||||
|   ESP_LOGCONFIG(TAG, "  Baud Rate: %u baud", this->baud_rate_); |   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, "  Parity: %s", parity_to_str(this->parity_)); | ||||||
|   ESP_LOGCONFIG(TAG, "  Stop bits: %u", this->stop_bits_); |   ESP_LOGCONFIG(TAG, "  Stop bits: %u", this->stop_bits_); | ||||||
|   if (this->hw_serial_ != nullptr) { |   if (this->hw_serial_ != nullptr) { | ||||||
| @@ -121,18 +121,6 @@ void UARTComponent::write_str(const char *str) { | |||||||
|   } |   } | ||||||
|   ESP_LOGVV(TAG, "    Wrote \"%s\"", 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<SerialConfig>(get_config())); |  | ||||||
|   else if (this->sw_serial_ != nullptr) |  | ||||||
|     this->sw_serial_->begin(); |  | ||||||
| } |  | ||||||
| bool UARTComponent::read_byte(uint8_t *data) { | bool UARTComponent::read_byte(uint8_t *data) { | ||||||
|   if (!this->check_read_timeout_()) |   if (!this->check_read_timeout_()) | ||||||
|     return false; |     return false; | ||||||
| @@ -198,28 +186,12 @@ void UARTComponent::flush() { | |||||||
|     this->sw_serial_->flush(); |     this->sw_serial_->flush(); | ||||||
|   } |   } | ||||||
| } | } | ||||||
| void ESP8266SoftwareSerial::end() { | void ESP8266SoftwareSerial::setup(int8_t tx_pin, int8_t rx_pin, uint32_t baud_rate, uint8_t stop_bits, | ||||||
|   /* Because of this bug: https://github.com/esp8266/Arduino/issues/6049 |                                   uint32_t data_bits, UARTParityOptions parity, size_t rx_buffer_size) { | ||||||
|    * 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) { |  | ||||||
|   this->bit_time_ = F_CPU / baud_rate; |   this->bit_time_ = F_CPU / baud_rate; | ||||||
|   this->rx_buffer_size_ = rx_buffer_size; |   this->rx_buffer_size_ = rx_buffer_size; | ||||||
|   this->stop_bits_ = stop_bits; |   this->stop_bits_ = stop_bits; | ||||||
|   this->nr_bits_ = nr_bits; |   this->data_bits_ = data_bits; | ||||||
|   this->parity_ = parity; |   this->parity_ = parity; | ||||||
|   if (tx_pin != -1) { |   if (tx_pin != -1) { | ||||||
|     auto pin = GPIOPin(tx_pin, OUTPUT); |     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(); |   const uint32_t start = ESP.getCycleCount(); | ||||||
|   uint8_t rec = 0; |   uint8_t rec = 0; | ||||||
|   // Manually unroll the loop |   // 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; |     rec |= arg->read_bit_(&wait, start) << i; | ||||||
|  |  | ||||||
|   /* If parity is enabled, just read it and ignore it. */ |   /* 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(); |     const uint32_t start = ESP.getCycleCount(); | ||||||
|     // Start bit |     // Start bit | ||||||
|     this->write_bit_(false, &wait, start); |     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); |       bool bit = data & (1 << i); | ||||||
|       this->write_bit_(bit, &wait, start); |       this->write_bit_(bit, &wait, start); | ||||||
|       if (need_parity_bit) |       if (need_parity_bit) | ||||||
| @@ -333,4 +305,4 @@ int ESP8266SoftwareSerial::available() { | |||||||
|  |  | ||||||
| }  // namespace uart | }  // namespace uart | ||||||
| }  // namespace esphome | }  // namespace esphome | ||||||
| #endif  // ESP8266 | #endif  // ARDUINO_ARCH_ESP8266 | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user