esphome-api-client 0.5.0
Modern C++17 client for the ESPHome native API (plaintext + Noise)
Loading...
Searching...
No Matches
serial_proxy.hpp
Go to the documentation of this file.
1#pragma once
2
5
8
9#include <cstdint>
10#include <functional>
11#include <string>
12#include <unordered_map>
13#include <vector>
14
15namespace esphome::api {
16
19 std::uint32_t instance = 0;
20 std::uint32_t baudrate = 0;
21 bool flow_control = false;
23 std::uint32_t stop_bits = 1;
24 std::uint32_t data_size = 8;
25};
26
29 std::uint32_t instance = 0;
30 std::string data;
31};
32
40
45 bool rts = false;
46 bool dtr = false;
47
48 static constexpr std::uint32_t rts_bit = 1U << 0;
49 static constexpr std::uint32_t dtr_bit = 1U << 1;
50
51 [[nodiscard]] static SerialProxyLineStates from_bits(const std::uint32_t bits) {
52 return {(bits & rts_bit) != 0, (bits & dtr_bit) != 0};
53 }
54 [[nodiscard]] std::uint32_t to_bits() const {
55 return (rts ? rts_bit : 0U) | (dtr ? dtr_bit : 0U);
56 }
57};
58
64
65class SerialPort;
66
68class SerialProxy : public Subsystem {
69public:
70 using DataHandler = std::function<void(const SerialProxyData&)>;
71 using ResponseHandler = std::function<void(const SerialProxyResponse&)>;
72 using ModemPinsHandler = std::function<void(const SerialProxyModemPins&)>;
73
74 explicit SerialProxy(Client& client) : Subsystem(client) {}
75
78 [[nodiscard]] SerialPort instance(std::uint32_t index);
79
82 void on_data(DataHandler handler);
83
85 void on_data(std::uint32_t instance, DataHandler handler);
86
89
92
94 void request(std::uint32_t instance, SerialProxyRequestType type) const;
95
97 void configure(const SerialProxyConfig& config) const;
98
100 void write(std::uint32_t instance, const std::string& data) const;
101
106 void get_modem_pins(std::uint32_t instance, ModemPinsHandler once = {});
107
109 void set_modem_pins(std::uint32_t instance, SerialProxyLineStates lines) const;
110
112 void set_modem_pins_raw(std::uint32_t instance, std::uint32_t line_states) const;
113
114private:
115 void ensure_modem_pins_handler();
116 void ensure_data_handler();
117
118 DataHandler data_handler_;
119 std::unordered_map<std::uint32_t, DataHandler> instance_data_handlers_;
120 ResponseHandler response_handler_;
121 ModemPinsHandler modem_pins_handler_;
122 std::unordered_map<std::uint32_t, std::vector<ModemPinsHandler>> pending_modem_pins_;
123 bool data_registered_ = false;
124 bool modem_pins_registered_ = false;
125};
126
130public:
131 SerialPort(SerialProxy& proxy, const std::uint32_t instance)
132 : proxy_(&proxy), instance_(instance) {}
133
134 [[nodiscard]] std::uint32_t index() const noexcept {
135 return instance_;
136 }
137
138 void subscribe() const {
139 proxy_->request(instance_, SerialProxyRequestType::Subscribe);
140 }
141 void unsubscribe() const {
143 }
144 void flush() const {
145 proxy_->request(instance_, SerialProxyRequestType::Flush);
146 }
147
148 void configure(SerialProxyConfig config) const {
149 config.instance = instance_;
150 proxy_->configure(config);
151 }
152 void write(const std::string& data) const {
153 proxy_->write(instance_, data);
154 }
155
157 proxy_->get_modem_pins(instance_, std::move(once));
158 }
159 void set_modem_pins(const SerialProxyLineStates lines) const {
160 proxy_->set_modem_pins(instance_, lines);
161 }
162
164 void on_data(SerialProxy::DataHandler handler) const {
165 proxy_->on_data(instance_, std::move(handler));
166 }
167
168private:
169 SerialProxy* proxy_;
170 std::uint32_t instance_;
171};
172
173inline SerialPort SerialProxy::instance(const std::uint32_t index) {
174 return SerialPort(*this, index);
175}
176
177} // namespace esphome::api
Async client for a single device.
Definition client.hpp:38
A single serial-proxy instance bound to its index — the instance-aware, ergonomic front end to Serial...
Definition serial_proxy.hpp:129
void configure(SerialProxyConfig config) const
Definition serial_proxy.hpp:148
std::uint32_t index() const noexcept
Definition serial_proxy.hpp:134
void on_data(SerialProxy::DataHandler handler) const
Receive data for this instance only.
Definition serial_proxy.hpp:164
void unsubscribe() const
Definition serial_proxy.hpp:141
void flush() const
Definition serial_proxy.hpp:144
SerialPort(SerialProxy &proxy, const std::uint32_t instance)
Definition serial_proxy.hpp:131
void set_modem_pins(const SerialProxyLineStates lines) const
Definition serial_proxy.hpp:159
void get_modem_pins(SerialProxy::ModemPinsHandler once={}) const
Definition serial_proxy.hpp:156
void subscribe() const
Definition serial_proxy.hpp:138
void write(const std::string &data) const
Definition serial_proxy.hpp:152
Proxies a UART on the device, forwarding data and control to clients.
Definition serial_proxy.hpp:68
void write(std::uint32_t instance, const std::string &data) const
Write raw data to the serial device.
SerialPort instance(std::uint32_t index)
An instance-bound handle so you don't repeat the instance index on every call: client....
Definition serial_proxy.hpp:173
void configure(const SerialProxyConfig &config) const
Configure UART parameters for an instance.
void get_modem_pins(std::uint32_t instance, ModemPinsHandler once={})
Request the current modem control pin states.
void set_modem_pins_raw(std::uint32_t instance, std::uint32_t line_states) const
Set modem control pin states from a raw bitmask (advanced).
void on_modem_pins(ModemPinsHandler handler)
Register a persistent callback fired for every modem-pin response.
void request(std::uint32_t instance, SerialProxyRequestType type) const
Issue a simple control request (subscribe, unsubscribe, flush).
std::function< void(const SerialProxyModemPins &)> ModemPinsHandler
Definition serial_proxy.hpp:72
void on_request_response(ResponseHandler handler)
Register a callback fired for each SerialProxyRequestResponse.
std::function< void(const SerialProxyData &)> DataHandler
Definition serial_proxy.hpp:70
void on_data(DataHandler handler)
Register a callback fired for every incoming SerialProxyDataReceived (any instance).
void set_modem_pins(std::uint32_t instance, SerialProxyLineStates lines) const
Set modem control pin states (RTS and DTR).
std::function< void(const SerialProxyResponse &)> ResponseHandler
Definition serial_proxy.hpp:71
SerialProxy(Client &client)
Definition serial_proxy.hpp:74
void on_data(std::uint32_t instance, DataHandler handler)
Register a callback fired only for data from instance.
Shared base for the subsystems exposed by Client (log streaming, the various proxies,...
Definition subsystem.hpp:18
Typed mirrors of the ESPHome protobuf enums.
Definition bytes.hpp:10
SerialProxyStatus
Mirror of proto enum SerialProxyStatus.
Definition enums.hpp:405
SerialProxyParity
Mirror of proto enum SerialProxyParity.
Definition enums.hpp:391
SerialProxyRequestType
Mirror of proto enum SerialProxyRequestType.
Definition enums.hpp:398
UART parameters for a serial proxy instance (api: SerialProxyConfigureRequest).
Definition serial_proxy.hpp:18
std::uint32_t data_size
Definition serial_proxy.hpp:24
bool flow_control
Definition serial_proxy.hpp:21
std::uint32_t baudrate
Definition serial_proxy.hpp:20
std::uint32_t stop_bits
Definition serial_proxy.hpp:23
std::uint32_t instance
Definition serial_proxy.hpp:19
SerialProxyParity parity
Definition serial_proxy.hpp:22
Data forwarded from a serial device (api: SerialProxyDataReceived).
Definition serial_proxy.hpp:28
std::string data
Definition serial_proxy.hpp:30
std::uint32_t instance
Definition serial_proxy.hpp:29
Typed view of the modem control/status lines exchanged with the proxy.
Definition serial_proxy.hpp:44
bool rts
Request To Send (bit 0)
Definition serial_proxy.hpp:45
static SerialProxyLineStates from_bits(const std::uint32_t bits)
Definition serial_proxy.hpp:51
bool dtr
Data Terminal Ready (bit 1)
Definition serial_proxy.hpp:46
static constexpr std::uint32_t dtr_bit
Definition serial_proxy.hpp:49
static constexpr std::uint32_t rts_bit
Definition serial_proxy.hpp:48
std::uint32_t to_bits() const
Definition serial_proxy.hpp:54
Current modem control pin states (api: SerialProxyGetModemPinsResponse).
Definition serial_proxy.hpp:60
std::uint32_t instance
Definition serial_proxy.hpp:61
SerialProxyLineStates lines
Definition serial_proxy.hpp:62
Result of a SerialProxyRequest (api: SerialProxyRequestResponse).
Definition serial_proxy.hpp:34
std::uint32_t instance
Definition serial_proxy.hpp:35
SerialProxyRequestType type
Definition serial_proxy.hpp:36
SerialProxyStatus status
Definition serial_proxy.hpp:37
std::string error_message
Definition serial_proxy.hpp:38
Common base for the Client-owned subsystems.