Pigweed
 
Loading...
Searching...
No Matches
uart.h
1// Copyright 2023 The Pigweed Authors
2//
3// Licensed under the Apache License, Version 2.0 (the "License"); you may not
4// use this file except in compliance with the License. You may obtain a copy of
5// the License at
6//
7// https://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12// License for the specific language governing permissions and limitations under
13// the License.
14
15#pragma once
16
17#include <cstddef>
18#include <cstdint>
19#include <optional>
20
21#include "pw_assert/assert.h"
22#include "pw_bytes/span.h"
23#include "pw_chrono/system_clock.h"
24#include "pw_status/status.h"
25#include "pw_status/status_with_size.h"
26#include "pw_uart/uart_base.h"
27
28namespace pw::uart {
29
34
35class Uart : public UartBase {
36 public:
37 ~Uart() override = default;
38
55 StatusWithSize ReadAtLeast(ByteSpan rx_buffer, size_t min_bytes) {
56 return DoTryReadFor(rx_buffer, min_bytes, std::nullopt);
57 }
58
74 StatusWithSize ReadExactly(ByteSpan rx_buffer) {
75 return DoTryReadFor(rx_buffer, rx_buffer.size(), std::nullopt);
76 }
77
95 // TODO: https://pwbug.dev/368149122 - Remove after transition
96 Status Read(ByteSpan rx_buffer) {
97 return DoTryReadFor(rx_buffer, std::nullopt).status();
98 }
99
125 size_t min_bytes,
127 return DoTryReadFor(rx_buffer, min_bytes, timeout);
128 }
129
155 return DoTryReadFor(rx_buffer, rx_buffer.size(), timeout);
156 }
157
182 StatusWithSize TryReadFor(ByteSpan rx_buffer,
184 // TODO: https://pwbug.dev/368149122 - Remove after transition
185 return DoTryReadFor(rx_buffer, timeout);
186 }
187
202 Status Write(ConstByteSpan tx_buffer) {
203 return DoTryWriteFor(tx_buffer, std::nullopt).status();
204 }
205
228 StatusWithSize TryWriteFor(ConstByteSpan tx_buffer,
230 return DoTryWriteFor(tx_buffer, timeout);
231 }
232
249 Status FlushOutput() { return DoFlushOutput(); }
250
251 private:
279 // TODO: https://pwbug.dev/368149122 - Remove after transition.
281 ByteSpan rx_buffer,
282 std::optional<chrono::SystemClock::duration> timeout) {
283 return DoTryReadFor(rx_buffer, rx_buffer.size(), timeout);
284 }
285
315 // TODO: https://pwbug.dev/368149122 - Make pure virtual after transition.
317 ByteSpan /*rx_buffer*/,
318 size_t /*min_bytes*/,
319 std::optional<chrono::SystemClock::duration> /*timeout*/) {
320 return StatusWithSize::Unimplemented();
321 }
322
352 ConstByteSpan tx_buffer,
353 std::optional<chrono::SystemClock::duration> timeout) = 0;
354 virtual Status DoFlushOutput() = 0;
355};
356
357} // namespace pw::uart
Definition: status.h:85
Definition: status_with_size.h:49
Definition: uart_base.h:30
Definition: uart.h:35
StatusWithSize TryReadExactlyFor(ByteSpan rx_buffer, chrono::SystemClock::duration timeout)
Definition: uart.h:153
Status FlushOutput()
Definition: uart.h:249
virtual StatusWithSize DoTryReadFor(ByteSpan rx_buffer, std::optional< chrono::SystemClock::duration > timeout)
Definition: uart.h:280
virtual StatusWithSize DoTryWriteFor(ConstByteSpan tx_buffer, std::optional< chrono::SystemClock::duration > timeout)=0
Writes data from a provided buffer to the UART with an optional timeout.
virtual StatusWithSize DoTryReadFor(ByteSpan, size_t, std::optional< chrono::SystemClock::duration >)
Definition: uart.h:316
StatusWithSize ReadExactly(ByteSpan rx_buffer)
Definition: uart.h:74
StatusWithSize ReadAtLeast(ByteSpan rx_buffer, size_t min_bytes)
Definition: uart.h:55
StatusWithSize TryReadAtLeastFor(ByteSpan rx_buffer, size_t min_bytes, chrono::SystemClock::duration timeout)
Definition: uart.h:124
Status Write(ConstByteSpan tx_buffer)
Definition: uart.h:202
StatusWithSize TryWriteFor(ConstByteSpan tx_buffer, chrono::SystemClock::duration timeout)
Definition: uart.h:228
StatusWithSize TryReadFor(ByteSpan rx_buffer, chrono::SystemClock::duration timeout)
Definition: uart.h:182
Status Read(ByteSpan rx_buffer)
Definition: uart.h:96
std::chrono::duration< rep, period > duration
Alias for durations representable with this clock.
Definition: system_clock.h:86