diff options
| author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2023-03-23 13:27:14 +0000 |
|---|---|---|
| committer | GitHub <[email protected]> | 2023-03-23 13:27:14 +0000 |
| commit | 299689dfa2a5e160dbd6aa474772a9317a219084 (patch) | |
| tree | c473fedcfb8537fafa01e31b526fb4ecd3c43677 | |
| parent | aa77a06d58a02340b455888a113287d8cac05973 (diff) | |
| parent | 88483b5abebc8b0e52197aade18ceec7fef2a0a6 (diff) | |
Merge #1295
1295: (embassy-rp): Add embedded-io blocking Read + Write for BufferedUart r=MathiasKoch a=MathiasKoch
Co-authored-by: Mathias <[email protected]>
| -rw-r--r-- | embassy-rp/src/uart/buffered.rs | 74 |
1 files changed, 60 insertions, 14 deletions
diff --git a/embassy-rp/src/uart/buffered.rs b/embassy-rp/src/uart/buffered.rs index 32e5ddf14..1a573b311 100644 --- a/embassy-rp/src/uart/buffered.rs +++ b/embassy-rp/src/uart/buffered.rs | |||
| @@ -124,7 +124,7 @@ impl<'d, T: Instance> BufferedUart<'d, T> { | |||
| 124 | } | 124 | } |
| 125 | } | 125 | } |
| 126 | 126 | ||
| 127 | pub fn blocking_write(&mut self, buffer: &[u8]) -> Result<(), Error> { | 127 | pub fn blocking_write(&mut self, buffer: &[u8]) -> Result<usize, Error> { |
| 128 | self.tx.blocking_write(buffer) | 128 | self.tx.blocking_write(buffer) |
| 129 | } | 129 | } |
| 130 | 130 | ||
| @@ -132,7 +132,7 @@ impl<'d, T: Instance> BufferedUart<'d, T> { | |||
| 132 | self.tx.blocking_flush() | 132 | self.tx.blocking_flush() |
| 133 | } | 133 | } |
| 134 | 134 | ||
| 135 | pub fn blocking_read(&mut self, buffer: &mut [u8]) -> Result<(), Error> { | 135 | pub fn blocking_read(&mut self, buffer: &mut [u8]) -> Result<usize, Error> { |
| 136 | self.rx.blocking_read(buffer) | 136 | self.rx.blocking_read(buffer) |
| 137 | } | 137 | } |
| 138 | 138 | ||
| @@ -201,7 +201,7 @@ impl<'d, T: Instance> BufferedUartRx<'d, T> { | |||
| 201 | }) | 201 | }) |
| 202 | } | 202 | } |
| 203 | 203 | ||
| 204 | pub fn blocking_read(&mut self, buf: &mut [u8]) -> Result<(), Error> { | 204 | pub fn blocking_read(&mut self, buf: &mut [u8]) -> Result<usize, Error> { |
| 205 | loop { | 205 | loop { |
| 206 | let state = T::state(); | 206 | let state = T::state(); |
| 207 | let mut rx_reader = unsafe { state.rx_buf.reader() }; | 207 | let mut rx_reader = unsafe { state.rx_buf.reader() }; |
| @@ -222,7 +222,7 @@ impl<'d, T: Instance> BufferedUartRx<'d, T> { | |||
| 222 | }); | 222 | }); |
| 223 | } | 223 | } |
| 224 | 224 | ||
| 225 | return Ok(()); | 225 | return Ok(n); |
| 226 | } | 226 | } |
| 227 | } | 227 | } |
| 228 | } | 228 | } |
| @@ -326,7 +326,7 @@ impl<'d, T: Instance> BufferedUartTx<'d, T> { | |||
| 326 | }) | 326 | }) |
| 327 | } | 327 | } |
| 328 | 328 | ||
| 329 | pub fn blocking_write(&mut self, buf: &[u8]) -> Result<(), Error> { | 329 | pub fn blocking_write(&mut self, buf: &[u8]) -> Result<usize, Error> { |
| 330 | loop { | 330 | loop { |
| 331 | let state = T::state(); | 331 | let state = T::state(); |
| 332 | let mut tx_writer = unsafe { state.tx_buf.writer() }; | 332 | let mut tx_writer = unsafe { state.tx_buf.writer() }; |
| @@ -342,7 +342,7 @@ impl<'d, T: Instance> BufferedUartTx<'d, T> { | |||
| 342 | // FIFO was empty we have to manually pend the interrupt to shovel | 342 | // FIFO was empty we have to manually pend the interrupt to shovel |
| 343 | // TX data from the buffer into the FIFO. | 343 | // TX data from the buffer into the FIFO. |
| 344 | unsafe { T::Interrupt::steal() }.pend(); | 344 | unsafe { T::Interrupt::steal() }.pend(); |
| 345 | return Ok(()); | 345 | return Ok(n); |
| 346 | } | 346 | } |
| 347 | } | 347 | } |
| 348 | } | 348 | } |
| @@ -533,6 +533,38 @@ impl<'d, T: Instance + 'd> embedded_io::asynch::Write for BufferedUartTx<'d, T> | |||
| 533 | } | 533 | } |
| 534 | } | 534 | } |
| 535 | 535 | ||
| 536 | impl<'d, T: Instance + 'd> embedded_io::blocking::Read for BufferedUart<'d, T> { | ||
| 537 | fn read(&mut self, buf: &mut [u8]) -> Result<usize, Self::Error> { | ||
| 538 | self.rx.blocking_read(buf) | ||
| 539 | } | ||
| 540 | } | ||
| 541 | |||
| 542 | impl<'d, T: Instance + 'd> embedded_io::blocking::Read for BufferedUartRx<'d, T> { | ||
| 543 | fn read(&mut self, buf: &mut [u8]) -> Result<usize, Self::Error> { | ||
| 544 | self.blocking_read(buf) | ||
| 545 | } | ||
| 546 | } | ||
| 547 | |||
| 548 | impl<'d, T: Instance + 'd> embedded_io::blocking::Write for BufferedUart<'d, T> { | ||
| 549 | fn write(&mut self, buf: &[u8]) -> Result<usize, Self::Error> { | ||
| 550 | self.tx.blocking_write(buf) | ||
| 551 | } | ||
| 552 | |||
| 553 | fn flush(&mut self) -> Result<(), Self::Error> { | ||
| 554 | self.tx.blocking_flush() | ||
| 555 | } | ||
| 556 | } | ||
| 557 | |||
| 558 | impl<'d, T: Instance + 'd> embedded_io::blocking::Write for BufferedUartTx<'d, T> { | ||
| 559 | fn write(&mut self, buf: &[u8]) -> Result<usize, Self::Error> { | ||
| 560 | self.blocking_write(buf) | ||
| 561 | } | ||
| 562 | |||
| 563 | fn flush(&mut self) -> Result<(), Self::Error> { | ||
| 564 | self.blocking_flush() | ||
| 565 | } | ||
| 566 | } | ||
| 567 | |||
| 536 | mod eh02 { | 568 | mod eh02 { |
| 537 | use super::*; | 569 | use super::*; |
| 538 | 570 | ||
| @@ -566,8 +598,15 @@ mod eh02 { | |||
| 566 | impl<'d, T: Instance> embedded_hal_02::blocking::serial::Write<u8> for BufferedUartTx<'d, T> { | 598 | impl<'d, T: Instance> embedded_hal_02::blocking::serial::Write<u8> for BufferedUartTx<'d, T> { |
| 567 | type Error = Error; | 599 | type Error = Error; |
| 568 | 600 | ||
| 569 | fn bwrite_all(&mut self, buffer: &[u8]) -> Result<(), Self::Error> { | 601 | fn bwrite_all(&mut self, mut buffer: &[u8]) -> Result<(), Self::Error> { |
| 570 | self.blocking_write(buffer) | 602 | while !buffer.is_empty() { |
| 603 | match self.blocking_write(buffer) { | ||
| 604 | Ok(0) => panic!("zero-length write."), | ||
| 605 | Ok(n) => buffer = &buffer[n..], | ||
| 606 | Err(e) => return Err(e), | ||
| 607 | } | ||
| 608 | } | ||
| 609 | Ok(()) | ||
| 571 | } | 610 | } |
| 572 | 611 | ||
| 573 | fn bflush(&mut self) -> Result<(), Self::Error> { | 612 | fn bflush(&mut self) -> Result<(), Self::Error> { |
| @@ -586,8 +625,15 @@ mod eh02 { | |||
| 586 | impl<'d, T: Instance> embedded_hal_02::blocking::serial::Write<u8> for BufferedUart<'d, T> { | 625 | impl<'d, T: Instance> embedded_hal_02::blocking::serial::Write<u8> for BufferedUart<'d, T> { |
| 587 | type Error = Error; | 626 | type Error = Error; |
| 588 | 627 | ||
| 589 | fn bwrite_all(&mut self, buffer: &[u8]) -> Result<(), Self::Error> { | 628 | fn bwrite_all(&mut self, mut buffer: &[u8]) -> Result<(), Self::Error> { |
| 590 | self.blocking_write(buffer) | 629 | while !buffer.is_empty() { |
| 630 | match self.blocking_write(buffer) { | ||
| 631 | Ok(0) => panic!("zero-length write."), | ||
| 632 | Ok(n) => buffer = &buffer[n..], | ||
| 633 | Err(e) => return Err(e), | ||
| 634 | } | ||
| 635 | } | ||
| 636 | Ok(()) | ||
| 591 | } | 637 | } |
| 592 | 638 | ||
| 593 | fn bflush(&mut self) -> Result<(), Self::Error> { | 639 | fn bflush(&mut self) -> Result<(), Self::Error> { |
| @@ -620,7 +666,7 @@ mod eh1 { | |||
| 620 | 666 | ||
| 621 | impl<'d, T: Instance> embedded_hal_1::serial::Write for BufferedUartTx<'d, T> { | 667 | impl<'d, T: Instance> embedded_hal_1::serial::Write for BufferedUartTx<'d, T> { |
| 622 | fn write(&mut self, buffer: &[u8]) -> Result<(), Self::Error> { | 668 | fn write(&mut self, buffer: &[u8]) -> Result<(), Self::Error> { |
| 623 | self.blocking_write(buffer) | 669 | self.blocking_write(buffer).map(drop) |
| 624 | } | 670 | } |
| 625 | 671 | ||
| 626 | fn flush(&mut self) -> Result<(), Self::Error> { | 672 | fn flush(&mut self) -> Result<(), Self::Error> { |
| @@ -630,7 +676,7 @@ mod eh1 { | |||
| 630 | 676 | ||
| 631 | impl<'d, T: Instance> embedded_hal_nb::serial::Write for BufferedUartTx<'d, T> { | 677 | impl<'d, T: Instance> embedded_hal_nb::serial::Write for BufferedUartTx<'d, T> { |
| 632 | fn write(&mut self, char: u8) -> nb::Result<(), Self::Error> { | 678 | fn write(&mut self, char: u8) -> nb::Result<(), Self::Error> { |
| 633 | self.blocking_write(&[char]).map_err(nb::Error::Other) | 679 | self.blocking_write(&[char]).map(drop).map_err(nb::Error::Other) |
| 634 | } | 680 | } |
| 635 | 681 | ||
| 636 | fn flush(&mut self) -> nb::Result<(), Self::Error> { | 682 | fn flush(&mut self) -> nb::Result<(), Self::Error> { |
| @@ -646,7 +692,7 @@ mod eh1 { | |||
| 646 | 692 | ||
| 647 | impl<'d, T: Instance> embedded_hal_1::serial::Write for BufferedUart<'d, T> { | 693 | impl<'d, T: Instance> embedded_hal_1::serial::Write for BufferedUart<'d, T> { |
| 648 | fn write(&mut self, buffer: &[u8]) -> Result<(), Self::Error> { | 694 | fn write(&mut self, buffer: &[u8]) -> Result<(), Self::Error> { |
| 649 | self.blocking_write(buffer) | 695 | self.blocking_write(buffer).map(drop) |
| 650 | } | 696 | } |
| 651 | 697 | ||
| 652 | fn flush(&mut self) -> Result<(), Self::Error> { | 698 | fn flush(&mut self) -> Result<(), Self::Error> { |
| @@ -656,7 +702,7 @@ mod eh1 { | |||
| 656 | 702 | ||
| 657 | impl<'d, T: Instance> embedded_hal_nb::serial::Write for BufferedUart<'d, T> { | 703 | impl<'d, T: Instance> embedded_hal_nb::serial::Write for BufferedUart<'d, T> { |
| 658 | fn write(&mut self, char: u8) -> nb::Result<(), Self::Error> { | 704 | fn write(&mut self, char: u8) -> nb::Result<(), Self::Error> { |
| 659 | self.blocking_write(&[char]).map_err(nb::Error::Other) | 705 | self.blocking_write(&[char]).map(drop).map_err(nb::Error::Other) |
| 660 | } | 706 | } |
| 661 | 707 | ||
| 662 | fn flush(&mut self) -> nb::Result<(), Self::Error> { | 708 | fn flush(&mut self) -> nb::Result<(), Self::Error> { |
