aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2023-03-04 05:59:16 +0100
committerDario Nieuwenhuis <[email protected]>2023-03-04 15:12:49 +0100
commit916f94b36663cbb638654b34acd53e30beb5c7b6 (patch)
tree7d8c4d6f597bfc65070c4f169419914b83d21047
parentccc224c81ff1a56296576f4a249fe91a37c03fd8 (diff)
nrf/buffered_uarte: make available on stable.
-rw-r--r--embassy-nrf/src/buffered_uarte.rs159
-rw-r--r--embassy-nrf/src/lib.rs1
-rw-r--r--examples/nrf52840/src/bin/buffered_uart.rs2
3 files changed, 117 insertions, 45 deletions
diff --git a/embassy-nrf/src/buffered_uarte.rs b/embassy-nrf/src/buffered_uarte.rs
index 79f9a1f78..07f292c4a 100644
--- a/embassy-nrf/src/buffered_uarte.rs
+++ b/embassy-nrf/src/buffered_uarte.rs
@@ -46,6 +46,14 @@ mod sealed {
46 } 46 }
47} 47}
48 48
49/// UART error.
50#[derive(Debug, Clone, Copy, PartialEq, Eq)]
51#[cfg_attr(feature = "defmt", derive(defmt::Format))]
52#[non_exhaustive]
53pub enum Error {
54 // No errors for now
55}
56
49pub(crate) use sealed::State; 57pub(crate) use sealed::State;
50 58
51impl State { 59impl State {
@@ -380,7 +388,7 @@ impl<'d, U: UarteInstance, T: TimerInstance> BufferedUarte<'d, U, T> {
380 (BufferedUarteRx { inner: self }, BufferedUarteTx { inner: self }) 388 (BufferedUarteRx { inner: self }, BufferedUarteTx { inner: self })
381 } 389 }
382 390
383 async fn inner_read(&self, buf: &mut [u8]) -> Result<usize, core::convert::Infallible> { 391 async fn inner_read(&self, buf: &mut [u8]) -> Result<usize, Error> {
384 let data = self.inner_fill_buf().await?; 392 let data = self.inner_fill_buf().await?;
385 let n = data.len().min(buf.len()); 393 let n = data.len().min(buf.len());
386 buf[..n].copy_from_slice(&data[..n]); 394 buf[..n].copy_from_slice(&data[..n]);
@@ -388,7 +396,7 @@ impl<'d, U: UarteInstance, T: TimerInstance> BufferedUarte<'d, U, T> {
388 Ok(n) 396 Ok(n)
389 } 397 }
390 398
391 async fn inner_write<'a>(&'a self, buf: &'a [u8]) -> Result<usize, core::convert::Infallible> { 399 async fn inner_write<'a>(&'a self, buf: &'a [u8]) -> Result<usize, Error> {
392 poll_fn(move |cx| { 400 poll_fn(move |cx| {
393 //trace!("poll_write: {:?}", buf.len()); 401 //trace!("poll_write: {:?}", buf.len());
394 let s = U::buffered_state(); 402 let s = U::buffered_state();
@@ -415,7 +423,7 @@ impl<'d, U: UarteInstance, T: TimerInstance> BufferedUarte<'d, U, T> {
415 .await 423 .await
416 } 424 }
417 425
418 async fn inner_flush<'a>(&'a self) -> Result<(), core::convert::Infallible> { 426 async fn inner_flush<'a>(&'a self) -> Result<(), Error> {
419 poll_fn(move |cx| { 427 poll_fn(move |cx| {
420 //trace!("poll_flush"); 428 //trace!("poll_flush");
421 let s = U::buffered_state(); 429 let s = U::buffered_state();
@@ -430,7 +438,7 @@ impl<'d, U: UarteInstance, T: TimerInstance> BufferedUarte<'d, U, T> {
430 .await 438 .await
431 } 439 }
432 440
433 async fn inner_fill_buf<'a>(&'a self) -> Result<&'a [u8], core::convert::Infallible> { 441 async fn inner_fill_buf<'a>(&'a self) -> Result<&'a [u8], Error> {
434 poll_fn(move |cx| { 442 poll_fn(move |cx| {
435 compiler_fence(Ordering::SeqCst); 443 compiler_fence(Ordering::SeqCst);
436 //trace!("poll_read"); 444 //trace!("poll_read");
@@ -492,6 +500,31 @@ impl<'d, U: UarteInstance, T: TimerInstance> BufferedUarte<'d, U, T> {
492 rx.pop_done(amt); 500 rx.pop_done(amt);
493 U::regs().intenset.write(|w| w.rxstarted().set()); 501 U::regs().intenset.write(|w| w.rxstarted().set());
494 } 502 }
503
504 /// Pull some bytes from this source into the specified buffer, returning how many bytes were read.
505 pub async fn read(&mut self, buf: &mut [u8]) -> Result<usize, Error> {
506 self.inner_read(buf).await
507 }
508
509 /// Return the contents of the internal buffer, filling it with more data from the inner reader if it is empty.
510 pub async fn fill_buf(&mut self) -> Result<&[u8], Error> {
511 self.inner_fill_buf().await
512 }
513
514 /// Tell this buffer that `amt` bytes have been consumed from the buffer, so they should no longer be returned in calls to `fill_buf`.
515 pub fn consume(&mut self, amt: usize) {
516 self.inner_consume(amt)
517 }
518
519 /// Write a buffer into this writer, returning how many bytes were written.
520 pub async fn write(&mut self, buf: &[u8]) -> Result<usize, Error> {
521 self.inner_write(buf).await
522 }
523
524 /// Flush this output stream, ensuring that all intermediately buffered contents reach their destination.
525 pub async fn flush(&mut self) -> Result<(), Error> {
526 self.inner_flush().await
527 }
495} 528}
496 529
497/// Reader part of the buffered UARTE driver. 530/// Reader part of the buffered UARTE driver.
@@ -499,72 +532,112 @@ pub struct BufferedUarteTx<'u, 'd, U: UarteInstance, T: TimerInstance> {
499 inner: &'u BufferedUarte<'d, U, T>, 532 inner: &'u BufferedUarte<'d, U, T>,
500} 533}
501 534
535impl<'u, 'd, U: UarteInstance, T: TimerInstance> BufferedUarteTx<'u, 'd, U, T> {
536 /// Write a buffer into this writer, returning how many bytes were written.
537 pub async fn write(&mut self, buf: &[u8]) -> Result<usize, Error> {
538 self.inner.inner_write(buf).await
539 }
540
541 /// Flush this output stream, ensuring that all intermediately buffered contents reach their destination.
542 pub async fn flush(&mut self) -> Result<(), Error> {
543 self.inner.inner_flush().await
544 }
545}
546
502/// Writer part of the buffered UARTE driver. 547/// Writer part of the buffered UARTE driver.
503pub struct BufferedUarteRx<'u, 'd, U: UarteInstance, T: TimerInstance> { 548pub struct BufferedUarteRx<'u, 'd, U: UarteInstance, T: TimerInstance> {
504 inner: &'u BufferedUarte<'d, U, T>, 549 inner: &'u BufferedUarte<'d, U, T>,
505} 550}
506 551
507impl<'d, U: UarteInstance, T: TimerInstance> embedded_io::Io for BufferedUarte<'d, U, T> { 552impl<'u, 'd, U: UarteInstance, T: TimerInstance> BufferedUarteRx<'u, 'd, U, T> {
508 type Error = core::convert::Infallible; 553 /// Pull some bytes from this source into the specified buffer, returning how many bytes were read.
509} 554 pub async fn read(&mut self, buf: &mut [u8]) -> Result<usize, Error> {
555 self.inner.inner_read(buf).await
556 }
510 557
511impl<'u, 'd, U: UarteInstance, T: TimerInstance> embedded_io::Io for BufferedUarteRx<'u, 'd, U, T> { 558 /// Return the contents of the internal buffer, filling it with more data from the inner reader if it is empty.
512 type Error = core::convert::Infallible; 559 pub async fn fill_buf(&mut self) -> Result<&[u8], Error> {
513} 560 self.inner.inner_fill_buf().await
561 }
514 562
515impl<'u, 'd, U: UarteInstance, T: TimerInstance> embedded_io::Io for BufferedUarteTx<'u, 'd, U, T> { 563 /// Tell this buffer that `amt` bytes have been consumed from the buffer, so they should no longer be returned in calls to `fill_buf`.
516 type Error = core::convert::Infallible; 564 pub fn consume(&mut self, amt: usize) {
565 self.inner.inner_consume(amt)
566 }
517} 567}
518 568
519impl<'d, U: UarteInstance, T: TimerInstance> embedded_io::asynch::Read for BufferedUarte<'d, U, T> { 569#[cfg(feature = "nightly")]
520 async fn read(&mut self, buf: &mut [u8]) -> Result<usize, Self::Error> { 570mod _embedded_io {
521 self.inner_read(buf).await 571 use super::*;
572
573 impl embedded_io::Error for Error {
574 fn kind(&self) -> embedded_io::ErrorKind {
575 match *self {}
576 }
522 } 577 }
523}
524 578
525impl<'u, 'd: 'u, U: UarteInstance, T: TimerInstance> embedded_io::asynch::Read for BufferedUarteRx<'u, 'd, U, T> { 579 impl<'d, U: UarteInstance, T: TimerInstance> embedded_io::Io for BufferedUarte<'d, U, T> {
526 async fn read(&mut self, buf: &mut [u8]) -> Result<usize, Self::Error> { 580 type Error = Error;
527 self.inner.inner_read(buf).await
528 } 581 }
529}
530 582
531impl<'d, U: UarteInstance, T: TimerInstance> embedded_io::asynch::BufRead for BufferedUarte<'d, U, T> { 583 impl<'u, 'd, U: UarteInstance, T: TimerInstance> embedded_io::Io for BufferedUarteRx<'u, 'd, U, T> {
532 async fn fill_buf(&mut self) -> Result<&[u8], Self::Error> { 584 type Error = Error;
533 self.inner_fill_buf().await
534 } 585 }
535 586
536 fn consume(&mut self, amt: usize) { 587 impl<'u, 'd, U: UarteInstance, T: TimerInstance> embedded_io::Io for BufferedUarteTx<'u, 'd, U, T> {
537 self.inner_consume(amt) 588 type Error = Error;
538 } 589 }
539}
540 590
541impl<'u, 'd: 'u, U: UarteInstance, T: TimerInstance> embedded_io::asynch::BufRead for BufferedUarteRx<'u, 'd, U, T> { 591 impl<'d, U: UarteInstance, T: TimerInstance> embedded_io::asynch::Read for BufferedUarte<'d, U, T> {
542 async fn fill_buf(&mut self) -> Result<&[u8], Self::Error> { 592 async fn read(&mut self, buf: &mut [u8]) -> Result<usize, Self::Error> {
543 self.inner.inner_fill_buf().await 593 self.inner_read(buf).await
594 }
544 } 595 }
545 596
546 fn consume(&mut self, amt: usize) { 597 impl<'u, 'd: 'u, U: UarteInstance, T: TimerInstance> embedded_io::asynch::Read for BufferedUarteRx<'u, 'd, U, T> {
547 self.inner.inner_consume(amt) 598 async fn read(&mut self, buf: &mut [u8]) -> Result<usize, Self::Error> {
599 self.inner.inner_read(buf).await
600 }
548 } 601 }
549}
550 602
551impl<'d, U: UarteInstance, T: TimerInstance> embedded_io::asynch::Write for BufferedUarte<'d, U, T> { 603 impl<'d, U: UarteInstance, T: TimerInstance> embedded_io::asynch::BufRead for BufferedUarte<'d, U, T> {
552 async fn write(&mut self, buf: &[u8]) -> Result<usize, Self::Error> { 604 async fn fill_buf(&mut self) -> Result<&[u8], Self::Error> {
553 self.inner_write(buf).await 605 self.inner_fill_buf().await
606 }
607
608 fn consume(&mut self, amt: usize) {
609 self.inner_consume(amt)
610 }
554 } 611 }
555 612
556 async fn flush(&mut self) -> Result<(), Self::Error> { 613 impl<'u, 'd: 'u, U: UarteInstance, T: TimerInstance> embedded_io::asynch::BufRead for BufferedUarteRx<'u, 'd, U, T> {
557 self.inner_flush().await 614 async fn fill_buf(&mut self) -> Result<&[u8], Self::Error> {
615 self.inner.inner_fill_buf().await
616 }
617
618 fn consume(&mut self, amt: usize) {
619 self.inner.inner_consume(amt)
620 }
558 } 621 }
559}
560 622
561impl<'u, 'd: 'u, U: UarteInstance, T: TimerInstance> embedded_io::asynch::Write for BufferedUarteTx<'u, 'd, U, T> { 623 impl<'d, U: UarteInstance, T: TimerInstance> embedded_io::asynch::Write for BufferedUarte<'d, U, T> {
562 async fn write(&mut self, buf: &[u8]) -> Result<usize, Self::Error> { 624 async fn write(&mut self, buf: &[u8]) -> Result<usize, Self::Error> {
563 self.inner.inner_write(buf).await 625 self.inner_write(buf).await
626 }
627
628 async fn flush(&mut self) -> Result<(), Self::Error> {
629 self.inner_flush().await
630 }
564 } 631 }
565 632
566 async fn flush(&mut self) -> Result<(), Self::Error> { 633 impl<'u, 'd: 'u, U: UarteInstance, T: TimerInstance> embedded_io::asynch::Write for BufferedUarteTx<'u, 'd, U, T> {
567 self.inner.inner_flush().await 634 async fn write(&mut self, buf: &[u8]) -> Result<usize, Self::Error> {
635 self.inner.inner_write(buf).await
636 }
637
638 async fn flush(&mut self) -> Result<(), Self::Error> {
639 self.inner.inner_flush().await
640 }
568 } 641 }
569} 642}
570 643
diff --git a/embassy-nrf/src/lib.rs b/embassy-nrf/src/lib.rs
index a9683df44..6b7dc7791 100644
--- a/embassy-nrf/src/lib.rs
+++ b/embassy-nrf/src/lib.rs
@@ -37,7 +37,6 @@ pub(crate) mod util;
37#[cfg(feature = "_time-driver")] 37#[cfg(feature = "_time-driver")]
38mod time_driver; 38mod time_driver;
39 39
40#[cfg(feature = "nightly")]
41pub mod buffered_uarte; 40pub mod buffered_uarte;
42pub mod gpio; 41pub mod gpio;
43#[cfg(feature = "gpiote")] 42#[cfg(feature = "gpiote")]
diff --git a/examples/nrf52840/src/bin/buffered_uart.rs b/examples/nrf52840/src/bin/buffered_uart.rs
index 584e6b2bc..5b934b7d6 100644
--- a/examples/nrf52840/src/bin/buffered_uart.rs
+++ b/examples/nrf52840/src/bin/buffered_uart.rs
@@ -6,7 +6,7 @@ use defmt::*;
6use embassy_executor::Spawner; 6use embassy_executor::Spawner;
7use embassy_nrf::buffered_uarte::BufferedUarte; 7use embassy_nrf::buffered_uarte::BufferedUarte;
8use embassy_nrf::{interrupt, uarte}; 8use embassy_nrf::{interrupt, uarte};
9use embedded_io::asynch::{BufRead, Write}; 9use embedded_io::asynch::Write;
10use {defmt_rtt as _, panic_probe as _}; 10use {defmt_rtt as _, panic_probe as _};
11 11
12#[embassy_executor::main] 12#[embassy_executor::main]