1 | //! Blocking serial API |
2 | |
3 | /// Write half of a serial interface (blocking variant) |
4 | pub trait Write<Word> { |
5 | /// The type of error that can occur when writing |
6 | type Error; |
7 | |
8 | /// Writes a slice, blocking until everything has been written |
9 | /// |
10 | /// An implementation can choose to buffer the write, returning `Ok(())` |
11 | /// after the complete slice has been written to a buffer, but before all |
12 | /// words have been sent via the serial interface. To make sure that |
13 | /// everything has been sent, call [`bflush`] after this function returns. |
14 | /// |
15 | /// [`bflush`]: #tymethod.bflush |
16 | fn bwrite_all(&mut self, buffer: &[Word]) -> Result<(), Self::Error>; |
17 | |
18 | /// Block until the serial interface has sent all buffered words |
19 | fn bflush(&mut self) -> Result<(), Self::Error>; |
20 | } |
21 | |
22 | /// Blocking serial write |
23 | pub mod write { |
24 | /// Marker trait to opt into default blocking write implementation |
25 | /// |
26 | /// Implementers of [`serial::Write`] can implement this marker trait |
27 | /// for their type. Doing so will automatically provide the default |
28 | /// implementation of [`blocking::serial::Write`] for the type. |
29 | /// |
30 | /// [`serial::Write`]: ../../serial/trait.Write.html |
31 | /// [`blocking::serial::Write`]: ../trait.Write.html |
32 | pub trait Default<Word>: ::serial::Write<Word> {} |
33 | |
34 | impl<S, Word> ::blocking::serial::Write<Word> for S |
35 | where |
36 | S: Default<Word>, |
37 | Word: Clone, |
38 | { |
39 | type Error = S::Error; |
40 | |
41 | fn bwrite_all(&mut self, buffer: &[Word]) -> Result<(), Self::Error> { |
42 | for word in buffer { |
43 | block!(self.write(word.clone()))?; |
44 | } |
45 | |
46 | Ok(()) |
47 | } |
48 | |
49 | fn bflush(&mut self) -> Result<(), Self::Error> { |
50 | block!(self.flush())?; |
51 | Ok(()) |
52 | } |
53 | } |
54 | } |
55 | |