diff options
| author | Dario Nieuwenhuis <[email protected]> | 2023-03-04 05:59:16 +0100 |
|---|---|---|
| committer | Dario Nieuwenhuis <[email protected]> | 2023-03-04 15:12:49 +0100 |
| commit | 916f94b36663cbb638654b34acd53e30beb5c7b6 (patch) | |
| tree | 7d8c4d6f597bfc65070c4f169419914b83d21047 | |
| parent | ccc224c81ff1a56296576f4a249fe91a37c03fd8 (diff) | |
nrf/buffered_uarte: make available on stable.
| -rw-r--r-- | embassy-nrf/src/buffered_uarte.rs | 159 | ||||
| -rw-r--r-- | embassy-nrf/src/lib.rs | 1 | ||||
| -rw-r--r-- | examples/nrf52840/src/bin/buffered_uart.rs | 2 |
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] | ||
| 53 | pub enum Error { | ||
| 54 | // No errors for now | ||
| 55 | } | ||
| 56 | |||
| 49 | pub(crate) use sealed::State; | 57 | pub(crate) use sealed::State; |
| 50 | 58 | ||
| 51 | impl State { | 59 | impl 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 | ||
| 535 | impl<'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. |
| 503 | pub struct BufferedUarteRx<'u, 'd, U: UarteInstance, T: TimerInstance> { | 548 | pub 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 | ||
| 507 | impl<'d, U: UarteInstance, T: TimerInstance> embedded_io::Io for BufferedUarte<'d, U, T> { | 552 | impl<'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 | ||
| 511 | impl<'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 | ||
| 515 | impl<'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 | ||
| 519 | impl<'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> { | 570 | mod _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 | ||
| 525 | impl<'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 | ||
| 531 | impl<'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 | ||
| 541 | impl<'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 | ||
| 551 | impl<'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 | ||
| 561 | impl<'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")] |
| 38 | mod time_driver; | 38 | mod time_driver; |
| 39 | 39 | ||
| 40 | #[cfg(feature = "nightly")] | ||
| 41 | pub mod buffered_uarte; | 40 | pub mod buffered_uarte; |
| 42 | pub mod gpio; | 41 | pub 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::*; | |||
| 6 | use embassy_executor::Spawner; | 6 | use embassy_executor::Spawner; |
| 7 | use embassy_nrf::buffered_uarte::BufferedUarte; | 7 | use embassy_nrf::buffered_uarte::BufferedUarte; |
| 8 | use embassy_nrf::{interrupt, uarte}; | 8 | use embassy_nrf::{interrupt, uarte}; |
| 9 | use embedded_io::asynch::{BufRead, Write}; | 9 | use embedded_io::asynch::Write; |
| 10 | use {defmt_rtt as _, panic_probe as _}; | 10 | use {defmt_rtt as _, panic_probe as _}; |
| 11 | 11 | ||
| 12 | #[embassy_executor::main] | 12 | #[embassy_executor::main] |
