10#include "driver/gpio.h"
11#include "soc/gpio_num.h"
19static const char *
const TAG =
"uart.idf";
22 uart_parity_t parity = UART_PARITY_DISABLE;
24 parity = UART_PARITY_EVEN;
26 parity = UART_PARITY_ODD;
29 uart_word_length_t data_bits;
32 data_bits = UART_DATA_5_BITS;
35 data_bits = UART_DATA_6_BITS;
38 data_bits = UART_DATA_7_BITS;
41 data_bits = UART_DATA_8_BITS;
44 data_bits = UART_DATA_BITS_MAX;
48 uart_config_t uart_config{};
50 uart_config.data_bits = data_bits;
51 uart_config.parity = parity;
52 uart_config.stop_bits = this->
stop_bits_ == 1 ? UART_STOP_BITS_1 : UART_STOP_BITS_2;
53 uart_config.flow_ctrl = UART_HW_FLOWCTRL_DISABLE;
54 uart_config.source_clk = UART_SCLK_DEFAULT;
55 uart_config.rx_flow_ctrl_thresh = 122;
61 static uint8_t next_uart_num = 0;
64 bool logger_uses_hardware_uart =
true;
66#ifdef USE_LOGGER_USB_CDC
69 logger_uses_hardware_uart =
false;
73#ifdef USE_LOGGER_USB_SERIAL_JTAG
76 logger_uses_hardware_uart =
false;
86 if (next_uart_num >= SOC_UART_NUM) {
87 ESP_LOGW(TAG,
"Maximum number of UART components created already");
91 this->
uart_num_ =
static_cast<uart_port_t
>(next_uart_num++);
92 this->
lock_ = xSemaphoreCreateMutex();
94 xSemaphoreTake(this->
lock_, portMAX_DELAY);
98 xSemaphoreGive(this->
lock_);
103 esp_err_t err = uart_param_config(this->
uart_num_, &uart_config);
105 ESP_LOGW(TAG,
"uart_param_config failed: %s", esp_err_to_name(err));
123 invert |= UART_SIGNAL_TXD_INV;
125 invert |= UART_SIGNAL_RXD_INV;
127 err = uart_set_line_inverse(this->
uart_num_, invert);
129 ESP_LOGW(TAG,
"uart_set_line_inverse failed: %s", esp_err_to_name(err));
134 err = uart_set_pin(this->
uart_num_, tx, rx, flow_control, UART_PIN_NO_CHANGE);
136 ESP_LOGW(TAG,
"uart_set_pin failed: %s", esp_err_to_name(err));
141 if (uart_is_driver_installed(this->
uart_num_)) {
144 ESP_LOGW(TAG,
"uart_driver_delete failed: %s", esp_err_to_name(err));
156 ESP_LOGW(TAG,
"uart_driver_install failed: %s", esp_err_to_name(err));
163 ESP_LOGW(TAG,
"uart_set_rx_full_threshold failed: %s", esp_err_to_name(err));
170 ESP_LOGW(TAG,
"uart_set_rx_timeout failed: %s", esp_err_to_name(err));
178 ESP_LOGW(TAG,
"uart_set_mode failed: %s", esp_err_to_name(err));
184 ESP_LOGCONFIG(TAG,
"UART %u was reloaded.", this->
uart_num_);
190 ESP_LOGCONFIG(TAG,
"UART Bus %u:", this->
uart_num_);
194 if (this->
rx_pin_ !=
nullptr) {
196 " RX Buffer Size: %u\n"
197 " RX Full Threshold: %u\n"
202 " Baud Rate: %" PRIu32
" baud\n"
212 esp_err_t err = uart_set_rx_full_threshold(this->
uart_num_, rx_full_threshold);
214 ESP_LOGW(TAG,
"uart_set_rx_full_threshold failed: %s", esp_err_to_name(err));
223 esp_err_t err = uart_set_rx_timeout(this->
uart_num_, rx_timeout);
225 ESP_LOGW(TAG,
"uart_set_rx_timeout failed: %s", esp_err_to_name(err));
233 xSemaphoreTake(this->
lock_, portMAX_DELAY);
235 xSemaphoreGive(this->
lock_);
236#ifdef USE_UART_DEBUGGER
237 for (
size_t i = 0; i <
len; i++) {
246 xSemaphoreTake(this->
lock_, portMAX_DELAY);
250 int len = uart_read_bytes(this->
uart_num_, data, 1, 20 / portTICK_PERIOD_MS);
258 xSemaphoreGive(this->
lock_);
263 size_t length_to_read =
len;
266 xSemaphoreTake(this->
lock_, portMAX_DELAY);
273 if (length_to_read > 0)
274 uart_read_bytes(this->
uart_num_, data, length_to_read, 20 / portTICK_PERIOD_MS);
275 xSemaphoreGive(this->
lock_);
276#ifdef USE_UART_DEBUGGER
277 for (
size_t i = 0; i <
len; i++) {
287 xSemaphoreTake(this->
lock_, portMAX_DELAY);
288 uart_get_buffered_data_len(this->
uart_num_, &available);
291 xSemaphoreGive(this->
lock_);
297 ESP_LOGVV(TAG,
" Flushing");
298 xSemaphoreTake(this->
lock_, portMAX_DELAY);
299 uart_wait_tx_done(this->
uart_num_, portMAX_DELAY);
300 xSemaphoreGive(this->
lock_);
BedjetMode mode
BedJet operating mode.
virtual void mark_failed()
Mark this component as failed.
virtual uint8_t get_pin() const =0
virtual bool is_inverted() const =0
void dump_config() override
void set_rx_timeout(size_t rx_timeout) override
uart_config_t get_config_()
void check_logger_conflict() override
bool peek_byte(uint8_t *data) override
void write_array(const uint8_t *data, size_t len) override
void set_rx_full_threshold(size_t rx_full_threshold) override
bool read_array(uint8_t *data, size_t len) override
QueueHandle_t uart_event_queue_
void load_settings() override
UARTParityOptions parity_
bool check_read_timeout_(size_t len=1)
InternalGPIOPin * tx_pin_
uint32_t get_baud_rate() const
InternalGPIOPin * flow_control_pin_
CallbackManager< void(UARTDirection, uint8_t)> debug_callback_
size_t rx_full_threshold_
InternalGPIOPin * rx_pin_
@ UART_SELECTION_USB_SERIAL_JTAG
const LogString * parity_to_str(UARTParityOptions parity)
@ UART_CONFIG_PARITY_EVEN
Providing packet encoding functions for exchanging data with a remote host.