aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2023-03-23 13:27:14 +0000
committerGitHub <[email protected]>2023-03-23 13:27:14 +0000
commit299689dfa2a5e160dbd6aa474772a9317a219084 (patch)
treec473fedcfb8537fafa01e31b526fb4ecd3c43677
parentaa77a06d58a02340b455888a113287d8cac05973 (diff)
parent88483b5abebc8b0e52197aade18ceec7fef2a0a6 (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.rs74
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
536impl<'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
542impl<'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
548impl<'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
558impl<'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
536mod eh02 { 568mod 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> {