sel4_driver_interfaces/serial/
mod.rs

1//
2// Copyright 2024, Colias Group, LLC
3//
4// SPDX-License-Identifier: BSD-2-Clause
5//
6
7use core::cell::RefCell;
8use core::ops::Deref;
9
10use lock_api::{Mutex, RawMutex};
11
12use crate::{WrappedMutex, WrappedRefCell, WrappedRefCellError};
13
14pub use embedded_hal_nb::nb;
15pub use embedded_hal_nb::serial::{Error, ErrorKind, ErrorType, Read, Write};
16
17mod write_buffered;
18
19pub use write_buffered::WriteBuffered;
20
21// // //
22
23impl<E: Error> Error for WrappedRefCellError<E> {
24    fn kind(&self) -> ErrorKind {
25        match self {
26            Self::Contention => ErrorKind::Other,
27            Self::Other(err) => err.kind(),
28        }
29    }
30}
31
32impl<T: Deref<Target = RefCell<U>>, U: ErrorType> ErrorType for &WrappedRefCell<T> {
33    type Error = WrappedRefCellError<U::Error>;
34}
35
36impl<Word: Copy, T: Deref<Target = RefCell<U>>, U: Read<Word>> Read<Word> for &WrappedRefCell<T> {
37    fn read(&mut self) -> nb::Result<Word, Self::Error> {
38        self.try_borrow_mut()?
39            .read()
40            .map_err(|err| err.map(WrappedRefCellError::Other))
41    }
42}
43
44impl<Word: Copy, T: Deref<Target = RefCell<U>>, U: Write<Word>> Write<Word> for &WrappedRefCell<T> {
45    fn write(&mut self, word: Word) -> nb::Result<(), Self::Error> {
46        self.try_borrow_mut()?
47            .write(word)
48            .map_err(|err| err.map(WrappedRefCellError::Other))
49    }
50
51    fn flush(&mut self) -> nb::Result<(), Self::Error> {
52        self.try_borrow_mut()?
53            .flush()
54            .map_err(|err| err.map(WrappedRefCellError::Other))
55    }
56}
57
58impl<R: RawMutex, T: Deref<Target = Mutex<R, U>>, U: ErrorType> ErrorType for &WrappedMutex<T> {
59    type Error = U::Error;
60}
61
62impl<R: RawMutex, Word: Copy, T: Deref<Target = Mutex<R, U>>, U: Read<Word>> Read<Word>
63    for &WrappedMutex<T>
64{
65    fn read(&mut self) -> nb::Result<Word, Self::Error> {
66        self.0.lock().read()
67    }
68}
69
70impl<R: RawMutex, Word: Copy, T: Deref<Target = Mutex<R, U>>, U: Write<Word>> Write<Word>
71    for &WrappedMutex<T>
72{
73    fn write(&mut self, word: Word) -> nb::Result<(), Self::Error> {
74        self.0.lock().write(word)
75    }
76
77    fn flush(&mut self) -> nb::Result<(), Self::Error> {
78        self.0.lock().flush()
79    }
80}