Add embedded-io blocking Read + Write for BufferedUart
This commit is contained in:
		
							parent
							
								
									299689dfa2
								
							
						
					
					
						commit
						2d7f35cf57
					
				| @ -197,6 +197,40 @@ impl<'d, T: BasicInstance> BufferedUart<'d, T> { | ||||
|         .await | ||||
|     } | ||||
| 
 | ||||
|     fn inner_blocking_read<'a>(&'a self, buf: &'a mut [u8]) -> Result<usize, Error> { | ||||
|         loop { | ||||
|             let mut do_pend = false; | ||||
|             let mut inner = self.inner.borrow_mut(); | ||||
|             let n = inner.with(|state| { | ||||
|                 compiler_fence(Ordering::SeqCst); | ||||
| 
 | ||||
|                 // We have data ready in buffer? Return it.
 | ||||
|                 let data = state.rx.pop_buf(); | ||||
|                 if !data.is_empty() { | ||||
|                     let len = data.len().min(buf.len()); | ||||
|                     buf[..len].copy_from_slice(&data[..len]); | ||||
| 
 | ||||
|                     if state.rx.is_full() { | ||||
|                         do_pend = true; | ||||
|                     } | ||||
|                     state.rx.pop(len); | ||||
| 
 | ||||
|                     return len; | ||||
|                 } | ||||
| 
 | ||||
|                 0 | ||||
|             }); | ||||
| 
 | ||||
|             if do_pend { | ||||
|                 inner.pend(); | ||||
|             } | ||||
| 
 | ||||
|             if n > 0 { | ||||
|                 return Ok(n); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     async fn inner_write<'a>(&'a self, buf: &'a [u8]) -> Result<usize, Error> { | ||||
|         poll_fn(move |cx| { | ||||
|             let mut inner = self.inner.borrow_mut(); | ||||
| @ -236,6 +270,39 @@ impl<'d, T: BasicInstance> BufferedUart<'d, T> { | ||||
|         .await | ||||
|     } | ||||
| 
 | ||||
|     fn inner_blocking_write<'a>(&'a self, buf: &'a [u8]) -> Result<usize, Error> { | ||||
|         loop { | ||||
|             let mut inner = self.inner.borrow_mut(); | ||||
|             let (n, empty) = inner.with(|state| { | ||||
|                 let empty = state.tx.is_empty(); | ||||
|                 let tx_buf = state.tx.push_buf(); | ||||
|                 if tx_buf.is_empty() { | ||||
|                     return (0, empty); | ||||
|                 } | ||||
| 
 | ||||
|                 let n = core::cmp::min(tx_buf.len(), buf.len()); | ||||
|                 tx_buf[..n].copy_from_slice(&buf[..n]); | ||||
|                 state.tx.push(n); | ||||
| 
 | ||||
|                 (n, empty) | ||||
|             }); | ||||
|             if empty { | ||||
|                 inner.pend(); | ||||
|             } | ||||
|             if n != 0 { | ||||
|                 return Ok(n); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     fn inner_blocking_flush(&self) -> Result<(), Error> { | ||||
|         loop { | ||||
|             if !self.inner.borrow_mut().with(|state| state.tx.is_empty()) { | ||||
|                 return Ok(()); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     async fn inner_fill_buf<'a>(&'a self) -> Result<&'a [u8], Error> { | ||||
|         poll_fn(move |cx| { | ||||
|             self.inner.borrow_mut().with(|state| { | ||||
| @ -419,3 +486,35 @@ impl<'u, 'd, T: BasicInstance> embedded_io::asynch::Write for BufferedUartTx<'u, | ||||
|         self.inner.inner_flush().await | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl<'d, T: BasicInstance> embedded_io::blocking::Read for BufferedUart<'d, T> { | ||||
|     fn read(&mut self, buf: &mut [u8]) -> Result<usize, Self::Error> { | ||||
|         self.inner_blocking_read(buf) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl<'u, 'd, T: BasicInstance> embedded_io::blocking::Read for BufferedUartRx<'u, 'd, T> { | ||||
|     fn read(&mut self, buf: &mut [u8]) -> Result<usize, Self::Error> { | ||||
|         self.inner.inner_blocking_read(buf) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl<'d, T: BasicInstance> embedded_io::blocking::Write for BufferedUart<'d, T> { | ||||
|     fn write(&mut self, buf: &[u8]) -> Result<usize, Self::Error> { | ||||
|         self.inner_blocking_write(buf) | ||||
|     } | ||||
| 
 | ||||
|     fn flush(&mut self) -> Result<(), Self::Error> { | ||||
|         self.inner_blocking_flush() | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl<'u, 'd, T: BasicInstance> embedded_io::blocking::Write for BufferedUartTx<'u, 'd, T> { | ||||
|     fn write(&mut self, buf: &[u8]) -> Result<usize, Self::Error> { | ||||
|         self.inner.inner_blocking_write(buf) | ||||
|     } | ||||
| 
 | ||||
|     fn flush(&mut self) -> Result<(), Self::Error> { | ||||
|         self.inner.inner_blocking_flush() | ||||
|     } | ||||
| } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user