Clean up UART Improvements code (#1190)

This commit is contained in:
Otto Winter 2020-07-25 13:56:08 +02:00 committed by GitHub
parent 43d5e7a8cc
commit 62468198d6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 22 additions and 57 deletions

View file

@ -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),

View file

@ -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};

View file

@ -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

View file

@ -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