4#if (defined ESP32 || defined ROO_TESTING)
7#include "hal/uart_types.h"
8#include "roo_io/uart/arduino/serial_input_stream.h"
9#include "roo_io/uart/arduino/serial_output_stream.h"
10#include "roo_io/uart/esp32/uart_input_stream.h"
11#include "roo_io/uart/esp32/uart_output_stream.h"
12#include "roo_threads.h"
13#include "roo_threads/thread.h"
23template <
typename SerialType>
24class Esp32SerialLinkTransportBase {
26 Esp32SerialLinkTransportBase(SerialType& serial, uart_port_t ignored)
27 : serial_(serial), output_(serial_), input_(serial_) {}
31 roo_io::ArduinoSerialOutputStream output_;
32 roo_io::ArduinoSerialInputStream input_;
38class Esp32SerialLinkTransportBase<HardwareSerial> {
40 Esp32SerialLinkTransportBase(HardwareSerial& serial, uart_port_t port)
41 : serial_(serial), output_(port), input_(port) {}
44 HardwareSerial& serial_;
45 roo_io::Esp32UartOutputStream output_;
46 roo_io::Esp32UartInputStream input_;
54template <
typename SerialType>
55class Esp32SerialLinkTransport
56 :
public Esp32SerialLinkTransportBase<SerialType> {
58 Esp32SerialLinkTransport(SerialType& serial, uart_port_t port,
59 roo::string_view name,
60 LinkBufferSize sendbuf = kBufferSize4KB,
61 LinkBufferSize recvbuf = kBufferSize4KB)
62 : Esp32SerialLinkTransportBase<SerialType>(serial, port),
63 sender_(this->output_),
64 receiver_(this->input_),
65 transport_(sender_, name, sendbuf, recvbuf),
66 process_fn_([this](const roo::byte* buf, size_t len) {
67 transport_.processIncomingPacket(buf, len);
72 this->serial_.onReceive([
this]() { receiver_.tryReceive(process_fn_); });
73 this->serial_.onReceiveError(
74 [
this](hardwareSerial_error_t) { receiver_.tryReceive(process_fn_); });
78 this->serial_.onReceive(
nullptr);
79 this->serial_.onReceiveError(
nullptr);
84 LinkStream connect(std::function<
void()> disconnect_fn =
nullptr) {
85 LinkStream link = connectAsync(std::move(disconnect_fn));
86 link.awaitConnected();
87 return LinkStream(std::move(link));
93 LinkStream connectAsync(std::function<
void()> disconnect_fn =
nullptr) {
94 return LinkStream(transport_.connect(std::move(disconnect_fn)));
100 LinkStream connectOrDie() {
102 []() { LOG(FATAL) <<
"LinkTransport: peer reset; rebooting"; });
105 LinkTransport& transport() {
return transport_; }
110 operator LinkTransport&() {
return transport_; }
112 LinkTransport::StatsMonitor statsMonitor() {
113 return LinkTransport::StatsMonitor(transport_);
117 PacketSenderOverStream sender_;
118 PacketReceiverOverStream receiver_;
120 LinkTransport transport_;
122 std::function<void(
const roo::byte* buf,
size_t len)> process_fn_;
133#if defined(ROO_TESTING)
139class ReliableSerial :
public Esp32SerialLinkTransport<decltype(Serial)> {
141 ReliableSerial(LinkBufferSize sendbuf = kBufferSize4KB,
142 LinkBufferSize recvbuf = kBufferSize4KB)
143 : ReliableSerial(
"serial", sendbuf, recvbuf) {}
145 ReliableSerial(roo::string_view name, LinkBufferSize sendbuf = kBufferSize4KB,
146 LinkBufferSize recvbuf = kBufferSize4KB)
147 : Esp32SerialLinkTransport<decltype(Serial)>(Serial, UART_NUM_0, name,
152class ReliableSerial1 :
public Esp32SerialLinkTransport<decltype(Serial1)> {
154 ReliableSerial1(LinkBufferSize sendbuf = kBufferSize4KB,
155 LinkBufferSize recvbuf = kBufferSize4KB)
156 : ReliableSerial1(
"serial1", sendbuf, recvbuf) {}
158 ReliableSerial1(roo::string_view name,
159 LinkBufferSize sendbuf = kBufferSize4KB,
160 LinkBufferSize recvbuf = kBufferSize4KB)
161 : Esp32SerialLinkTransport<decltype(Serial1)>(Serial1, UART_NUM_1, name,
166class ReliableSerial2 :
public Esp32SerialLinkTransport<decltype(Serial2)> {
168 ReliableSerial2(LinkBufferSize sendbuf = kBufferSize4KB,
169 LinkBufferSize recvbuf = kBufferSize4KB)
170 : ReliableSerial2(
"serial2", sendbuf, recvbuf) {}
172 ReliableSerial2(roo::string_view name,
173 LinkBufferSize sendbuf = kBufferSize4KB,
174 LinkBufferSize recvbuf = kBufferSize4KB)
175 : Esp32SerialLinkTransport<decltype(Serial2)>(Serial2, UART_NUM_2, name,