ESPHome 2025.12.0-dev
Loading...
Searching...
No Matches
improv_serial_component.h
Go to the documentation of this file.
1#pragma once
2
8#ifdef USE_WIFI
9#include <improv.h>
10#include <vector>
11
12#ifdef USE_ESP32
13#include <driver/uart.h>
14#if defined(USE_ESP32_VARIANT_ESP32C3) || defined(USE_ESP32_VARIANT_ESP32C6) || defined(USE_ESP32_VARIANT_ESP32S3) || \
15 defined(USE_ESP32_VARIANT_ESP32H2)
16#include <driver/usb_serial_jtag.h>
17#include <hal/usb_serial_jtag_ll.h>
18#endif
19#if defined(USE_ESP32_VARIANT_ESP32S2) || defined(USE_ESP32_VARIANT_ESP32S3)
20#include <esp_private/usb_console.h>
21#endif
22#elif defined(USE_ARDUINO)
23#include <HardwareSerial.h>
24#endif
25
26namespace esphome {
27namespace improv_serial {
28
29// TX buffer layout constants
30static constexpr uint8_t TX_HEADER_SIZE = 6; // Bytes 0-5 = "IMPROV"
31static constexpr uint8_t TX_VERSION_IDX = 6;
32static constexpr uint8_t TX_TYPE_IDX = 7;
33static constexpr uint8_t TX_LENGTH_IDX = 8;
34static constexpr uint8_t TX_DATA_IDX = 9; // For state/error messages only
35static constexpr uint8_t TX_CHECKSUM_IDX = 10;
36static constexpr uint8_t TX_NEWLINE_IDX = 11;
37static constexpr uint8_t TX_BUFFER_SIZE = 12;
38
45
46static const uint16_t IMPROV_SERIAL_TIMEOUT = 100;
47static const uint8_t IMPROV_SERIAL_VERSION = 1;
48
50 public:
51 void setup() override;
52 void loop() override;
53 void dump_config() override;
54
55 float get_setup_priority() const override { return setup_priority::AFTER_WIFI; }
56
57 protected:
58 bool parse_improv_serial_byte_(uint8_t byte);
59 bool parse_improv_payload_(improv::ImprovCommand &command);
60
61 void set_state_(improv::State state);
62 void set_error_(improv::Error error);
63 void send_response_(std::vector<uint8_t> &response);
65
66 std::vector<uint8_t> build_rpc_settings_response_(improv::Command command);
67 std::vector<uint8_t> build_version_info_();
68
70 void write_data_(const uint8_t *data = nullptr, size_t size = 0);
71
72 uint8_t tx_header_[TX_BUFFER_SIZE] = {
73 'I', // 0: Header
74 'M', // 1: Header
75 'P', // 2: Header
76 'R', // 3: Header
77 'O', // 4: Header
78 'V', // 5: Header
79 IMPROV_SERIAL_VERSION, // 6: Version
80 0, // 7: ImprovSerialType
81 0, // 8: Length
82 0, // 9...X: Data (here, one byte reserved for state/error)
83 0, // X + 10: Checksum
84 '\n',
85 };
86
87#ifdef USE_ESP32
88 uart_port_t uart_num_;
89#elif defined(USE_ARDUINO)
90 Stream *hw_serial_{nullptr};
91#endif
92
93 std::vector<uint8_t> rx_buffer_;
94 uint32_t last_read_byte_{0};
96 improv::State state_{improv::STATE_AUTHORIZED};
97};
98
99extern ImprovSerialComponent
100 *global_improv_serial_component; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables)
101
102} // namespace improv_serial
103} // namespace esphome
104#endif
std::vector< uint8_t > build_rpc_settings_response_(improv::Command command)
void write_data_(const uint8_t *data=nullptr, size_t size=0)
void send_response_(std::vector< uint8_t > &response)
bool parse_improv_payload_(improv::ImprovCommand &command)
bool state
Definition fan.h:0
ImprovSerialComponent * global_improv_serial_component
const float AFTER_WIFI
For components that should be initialized after WiFi is connected.
Definition component.cpp:66
Providing packet encoding functions for exchanging data with a remote host.
Definition a01nyub.cpp:7