roo_transport
API Documentation for roo_transport
Loading...
Searching...
No Matches
reliable_serial.h
Go to the documentation of this file.
1#pragma once
2
3#if defined(ARDUINO_ARCH_RP2040)
4
5#include "Arduino.h"
6#include "roo_threads.h"
7#include "roo_threads/atomic.h"
9
10namespace roo_transport {
11namespace rp2040 {
12
13// Implementation of the LinkStreamTransport that uses a newly created receiver
14// thread to read from the underlying serial.
15class ReliableUartLinkTransport : public LinkStreamTransport {
16 public:
17 ReliableUartLinkTransport(SerialUART &serial, roo::string_view name,
18 LinkBufferSize sendbuf = kBufferSize4KB,
19 LinkBufferSize recvbuf = kBufferSize4KB)
20 : LinkStreamTransport(serial, sendbuf, recvbuf),
21 serial_(serial),
22 receiver_thread_name_(name) {}
23
24 ReliableUartLinkTransport(SerialUART &serial,
25 LinkBufferSize sendbuf = kBufferSize4KB,
26 LinkBufferSize recvbuf = kBufferSize4KB)
27 : ReliableUartLinkTransport(serial, "serialRcv", sendbuf, recvbuf) {}
28
29 void begin() {
30 LinkStreamTransport::begin();
31 running_ = true;
32 roo::thread::attributes attrs;
33 attrs.set_name(receiver_thread_name_.c_str());
34 // Run at high priority to ensure timely processing of incoming packets.
35 attrs.set_priority(configMAX_PRIORITIES - 1);
36 receiver_thread_ = roo::thread(attrs, [this]() {
37 while (running_) {
38 int avail = serial_.available();
39 if (avail == 0) {
40 // Don't busy-wait; give lower-priority tasks a chance to run.
41 while (true) {
42 roo::this_thread::sleep_for(roo_time::Millis(1));
43 int avail = serial_.available();
44 if (avail > 0) {
45 break;
46 }
47 }
48 }
49 tryReceive();
50 }
51 });
52 }
53
54 void end() {
55 running_ = false;
56 receiver_thread_.join();
57 }
58
59 private:
60 SerialUART &serial_;
61 std::string receiver_thread_name_;
62 roo::thread receiver_thread_;
63 roo::atomic<bool> running_{false};
64};
65
66// class ReliableSerialTransport
67// : public Rp2040ReliableSerialTransport<decltype(Serial)> {
68// public:
69// ReliableSerialTransport(LinkBufferSize sendbuf = kBufferSize4KB,
70// LinkBufferSize recvbuf = kBufferSize4KB)
71// : Rp2040SerialLinkTransport<decltype(Serial)>(Serial, sendbuf, recvbuf)
72// {}
73// };
74
75class ReliableSerial1 : public ReliableUartLinkTransport {
76 public:
77 ReliableSerial1(LinkBufferSize sendbuf = kBufferSize4KB,
78 LinkBufferSize recvbuf = kBufferSize4KB)
79 : ReliableSerial1("serial1", sendbuf, recvbuf) {}
80
81 ReliableSerial1(roo::string_view name,
82 LinkBufferSize sendbuf = kBufferSize4KB,
83 LinkBufferSize recvbuf = kBufferSize4KB)
84 : ReliableUartLinkTransport(Serial1, name, sendbuf, recvbuf) {}
85};
86
87class ReliableSerial2 : public ReliableUartLinkTransport {
88 public:
89 ReliableSerial2(LinkBufferSize sendbuf = kBufferSize4KB,
90 LinkBufferSize recvbuf = kBufferSize4KB)
91 : ReliableSerial2("serial2", sendbuf, recvbuf) {}
92
93 ReliableSerial2(roo::string_view name,
94 LinkBufferSize sendbuf = kBufferSize4KB,
95 LinkBufferSize recvbuf = kBufferSize4KB)
96 : ReliableUartLinkTransport(Serial2, name, sendbuf, recvbuf) {}
97};
98
99} // namespace rp2040
100} // namespace roo_transport
101
102#endif // defined(ARDUINO)