9#ifdef USE_IMPROV_SERIAL
18#ifdef USE_IMPROV_SERIAL_UART
20#elif defined(USE_ESP32)
21#include <driver/uart.h>
22#ifdef USE_LOGGER_USB_SERIAL_JTAG
23#include <driver/usb_serial_jtag.h>
24#include <hal/usb_serial_jtag_ll.h>
26#if defined(USE_ESP32_VARIANT_ESP32S2) || defined(USE_ESP32_VARIANT_ESP32S3)
27#include <esp_private/usb_console.h>
29#elif defined(USE_ARDUINO)
30#include <HardwareSerial.h>
36static constexpr uint8_t TX_HEADER_SIZE = 6;
37static constexpr uint8_t TX_VERSION_IDX = 6;
38static constexpr uint8_t TX_TYPE_IDX = 7;
39static constexpr uint8_t TX_LENGTH_IDX = 8;
40static constexpr uint8_t TX_DATA_IDX = 9;
41static constexpr uint8_t TX_CHECKSUM_IDX = 10;
42static constexpr uint8_t TX_NEWLINE_IDX = 11;
43static constexpr uint8_t TX_BUFFER_SIZE = 12;
52static const uint16_t IMPROV_SERIAL_TIMEOUT = 100;
53static const uint8_t IMPROV_SERIAL_VERSION = 1;
59static const uint32_t WIFI_CONNECT_TIMEOUT_MS = 30000;
60static const uint32_t WIFI_SWITCH_TIMEOUT_MS = 90000;
64static constexpr size_t MAX_SERIAL_RESPONSE = 255;
66static constexpr size_t RPC_RESPONSE_OVERHEAD = 3;
67static constexpr size_t MAX_SERIAL_PAYLOAD = MAX_SERIAL_RESPONSE - RPC_RESPONSE_OVERHEAD;
71static constexpr size_t WEBSERVER_URL_RESERVE = 1 + 7 + 15 + 1 + 5;
73static constexpr size_t WEBSERVER_URL_RESERVE = 0;
76static constexpr size_t MAX_NEXT_URL_LEN = MAX_SERIAL_PAYLOAD - WEBSERVER_URL_RESERVE - 1;
78static_assert(MAX_SERIAL_RESPONSE <= improv::RPC_RESPONSE_MAX_SIZE,
"builder buffer too small for the frame");
82 void setup()
override;
88#ifdef USE_IMPROV_SERIAL_UART
107 void add_webserver_urls_(improv::RpcResponseBuilder &builder, [[maybe_unused]]
bool wifi_first);
113 optional<uint8_t> byte;
115#ifdef USE_IMPROV_SERIAL_UART
119#elif defined(USE_ESP32)
123#if defined(USE_ESP32_VARIANT_ESP32)
128 uart_get_buffered_data_len(this->
uart_num_, &available);
130 uart_read_bytes(this->
uart_num_, &data, 1, 0);
135#if defined(USE_LOGGER_USB_CDC) && defined(CONFIG_ESP_CONSOLE_USB_CDC)
137 if (esp_usb_console_available_for_read()) {
138 esp_usb_console_read_buf((
char *) &data, 1);
143#ifdef USE_LOGGER_USB_SERIAL_JTAG
145 if (usb_serial_jtag_read_bytes((
char *) &data, 1, 0)) {
154#elif defined(USE_ARDUINO)
171 IMPROV_SERIAL_VERSION,
179#ifdef USE_IMPROV_SERIAL_UART
181#elif defined(USE_ESP32)
184#elif defined(USE_ARDUINO)
193 improv::State
state_{improv::STATE_AUTHORIZED};
196extern ImprovSerialComponent
std::vector< uint8_t > rx_buffer_
void send_version_info_()
float get_setup_priority() const override
void set_state_(improv::State state)
wifi::WiFiAP connecting_sta_
void on_wifi_connect_timeout_()
void send_settings_response_(improv::Command command)
void set_uart(uart::UARTComponent *uart)
void write_data_(const uint8_t *data=nullptr, size_t size=0)
void send_response_(std::span< const uint8_t > response)
void dump_config() override
ESPHOME_ALWAYS_INLINE optional< uint8_t > read_byte_()
bool parse_improv_serial_byte_(uint8_t byte)
logger::UARTSelection uart_selection_
void send_current_state_(improv::State state)
void add_webserver_urls_(improv::RpcResponseBuilder &builder, bool wifi_first)
Append one web server URL per interface that has a usable IPv4.
uint8_t tx_header_[TX_BUFFER_SIZE]
bool parse_improv_payload_(improv::ImprovCommand &command)
void set_error_(improv::Error error)
uart::UARTComponent * uart_
virtual size_t available()=0
ImprovSerialComponent * global_improv_serial_component
UARTSelection
Enum for logging UART selection.
@ UART_SELECTION_USB_SERIAL_JTAG
constexpr float AFTER_WIFI
For components that should be initialized after WiFi is connected.