ESPHome 2026.11.0-dev
Loading...
Searching...
No Matches
uart.h
Go to the documentation of this file.
1#pragma once
2
3#include <algorithm>
4#include <cstdint>
5#include <type_traits>
6#include <vector>
8#include "esphome/core/hal.h"
10#include "esphome/core/log.h"
11#include "uart_component.h"
12
13namespace esphome::uart {
14
16 public:
17 UARTDevice() = default;
18 UARTDevice(UARTComponent *parent) : parent_(parent) {}
19
20 void set_uart_parent(UARTComponent *parent) { this->parent_ = parent; }
21
22 void write_byte(uint8_t data) { this->parent_->write_byte(data); }
23
24 void set_rx_full_threshold(size_t rx_full_threshold) { this->parent_->set_rx_full_threshold(rx_full_threshold); }
25 void set_rx_full_threshold_ms(size_t time) { this->parent_->set_rx_full_threshold_ms(time); }
27 void set_rx_timeout(size_t rx_timeout) { this->parent_->set_rx_timeout(rx_timeout); }
28 size_t get_rx_timeout() { return this->parent_->get_rx_timeout(); }
29
30 void write_array(const uint8_t *data, size_t len) { this->parent_->write_array(data, len); }
31 void write_array_progmem(const uint8_t *data, size_t len) { this->parent_->write_array_progmem(data, len); }
32 void write_array(const std::vector<uint8_t> &data) { this->parent_->write_array(data); }
33 template<size_t N> void write_array(const std::array<uint8_t, N> &data) {
34 this->parent_->write_array(data.data(), data.size());
35 }
36
37 void write_str(const char *str) { this->parent_->write_str(str); }
38
39 bool read_byte(uint8_t *data) { return this->parent_->read_byte(data); }
40 bool peek_byte(uint8_t *data) { return this->parent_->peek_byte(data); }
41
42 bool read_array(uint8_t *data, size_t len) { return this->parent_->read_array(data, len); }
43 template<size_t N> optional<std::array<uint8_t, N>> read_array() { // NOLINT
44 // One object returned on both paths; a separate empty optional trips GCC's -Wmaybe-uninitialized.
45 optional<std::array<uint8_t, N>> res(std::in_place);
46 if (!this->read_array(res->data(), N)) {
47 res.reset();
48 }
49 return res;
50 }
51
52 size_t available() { return this->parent_->available(); }
53
56 template<size_t N = 64, typename F> bool read_available_chunks(F &&on_chunk) {
57 return this->read_available_chunks<N>(on_chunk, this->available());
58 }
60 template<size_t N = 64, typename F> bool read_available_chunks(F &&on_chunk, size_t count) {
61 static_assert(N > 0, "read buffer size must be non-zero");
62 uint8_t buf[N];
63 while (count > 0) {
64 const size_t len = std::min(count, N);
65 if (!this->read_array(buf, len)) {
66 return false;
67 }
68 count -= len;
69 if (!continue_after(on_chunk, static_cast<const uint8_t *>(buf), len)) {
70 break;
71 }
72 }
73 return true;
74 }
75
77 template<size_t N = 64, typename F> bool read_available(F &&on_byte) {
78 return this->read_available<N>(on_byte, this->available());
79 }
80 template<size_t N = 64, typename F> bool read_available(F &&on_byte, size_t count) {
81 return this->read_available_chunks<N>(
82 [&on_byte](const uint8_t *data, size_t len) {
83 for (const uint8_t *p = data; p != data + len; p++) {
84 if (!continue_after(on_byte, *p)) {
85 return false;
86 }
87 }
88 return true;
89 },
90 count);
91 }
92
94 void discard_available();
95
96 UARTFlushResult flush() { return this->parent_->flush(); }
97
98 // Compat APIs
99 int read() {
100 uint8_t data;
101 if (!this->read_byte(&data))
102 return -1;
103 return data;
104 }
105 size_t write(uint8_t data) {
106 this->write_byte(data);
107 return 1;
108 }
109 int peek() {
110 uint8_t data;
111 if (!this->peek_byte(&data))
112 return -1;
113 return data;
114 }
115
117 ESPDEPRECATED("Use uart.final_validate_device_schema() in Python instead. Removed in 2027.3.0", "2026.9.0")
118 void check_uart_settings(uint32_t baud_rate, uint8_t stop_bits = 1,
120
121 protected:
123 template<typename F, typename... A> static bool continue_after(F &f, A... args) {
124 using R = std::invoke_result_t<F &, A...>;
125 if constexpr (std::is_void_v<R>) {
126 f(args...);
127 return true;
128 } else {
129 static_assert(std::is_same_v<std::remove_cvref_t<R>, bool>, "callback must return void or bool");
130 return f(args...);
131 }
132 }
133
135};
136
137} // namespace esphome::uart
void write_byte(uint8_t data)
void write_array_progmem(const uint8_t *data, size_t len)
void write_array(const std::vector< uint8_t > &data)
void write_str(const char *str)
void set_rx_full_threshold_ms(uint8_t time)
virtual void set_rx_full_threshold(size_t rx_full_threshold)
bool read_byte(uint8_t *data)
virtual UARTFlushResult flush()=0
virtual size_t available()=0
virtual bool peek_byte(uint8_t *data)=0
virtual void set_rx_timeout(size_t rx_timeout)
virtual bool read_array(uint8_t *data, size_t len)=0
UARTFlushResult flush()
Definition uart.h:96
optional< std::array< uint8_t, N > > read_array()
Definition uart.h:43
bool peek_byte(uint8_t *data)
Definition uart.h:40
ESPDEPRECATED("Use uart.final_validate_device_schema() in Python instead. Removed in 2027.3.0", "2026.9.0") void check_uart_settings(uint32_t baud_rate
Check that the configuration of the UART bus matches the provided values and otherwise print a warnin...
bool read_available_chunks(F &&on_chunk, size_t count)
Same, reading exactly count bytes; count must not exceed available().
Definition uart.h:60
UARTComponent * parent_
Definition uart.h:134
void set_rx_full_threshold(size_t rx_full_threshold)
Definition uart.h:24
void write_array(const std::array< uint8_t, N > &data)
Definition uart.h:33
void write_array_progmem(const uint8_t *data, size_t len)
Definition uart.h:31
bool read_available_chunks(F &&on_chunk)
Pass the bytes available now to on_chunk(data, len) in N byte chunks; returning false stops.
Definition uart.h:56
void discard_available()
Read and drop every byte waiting in the receive buffer.
Definition uart.cpp:36
void set_rx_full_threshold_ms(size_t time)
Definition uart.h:25
void write_str(const char *str)
Definition uart.h:37
bool read_available(F &&on_byte, size_t count)
Definition uart.h:80
bool read_byte(uint8_t *data)
Definition uart.h:39
void write_byte(uint8_t data)
Definition uart.h:22
void set_rx_timeout(size_t rx_timeout)
Definition uart.h:27
static bool continue_after(F &f, A... args)
Call f(args...) and return its result; a void callback always continues.
Definition uart.h:123
bool read_available(F &&on_byte)
Same as read_available_chunks(), calling on_byte(uint8_t) once per byte.
Definition uart.h:77
void write_array(const uint8_t *data, size_t len)
Definition uart.h:30
uint8_t UARTParityOptions parity
Definition uart.h:119
size_t write(uint8_t data)
Definition uart.h:105
void write_array(const std::vector< uint8_t > &data)
Definition uart.h:32
uint8_t UARTParityOptions uint8_t data_bits
Definition uart.h:119
size_t get_rx_full_threshold()
Definition uart.h:26
size_t get_rx_timeout()
Definition uart.h:28
UARTDevice(UARTComponent *parent)
Definition uart.h:18
void set_uart_parent(UARTComponent *parent)
Definition uart.h:20
bool read_array(uint8_t *data, size_t len)
Definition uart.h:42
unsigned count
Definition gif.cpp:51
UARTFlushResult
Result of a flush() call.
const void size_t len
Definition hal.h:68
static void uint32_t