sel4_driver_interfaces/serial/
mod.rs
1use 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
21impl<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}