| 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 | |