diff --git a/.cargo/config b/.cargo/config new file mode 100644 index 00000000..a14129b9 --- /dev/null +++ b/.cargo/config @@ -0,0 +1,2 @@ +[unstable] +namespaced-features = true diff --git a/Cargo.toml b/Cargo.toml index 4feeb262..80ae9374 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,6 +2,7 @@ [workspace] members = [ "embassy", + "embassy-traits", "embassy-nrf", "embassy-stm32f4", "embassy-nrf-examples", diff --git a/README.md b/README.md index 0f1cb1be..3cf1b61f 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ Embassy is a project to make async/await a first-class option for embedded devel `embassy` provides a set of traits and types specifically designed for `async` usage. - `embassy::io`: `AsyncBufRead`, `AsyncWrite`. Traits for byte-stream IO, essentially `no_std` compatible versions of `futures::io`. -- `embassy::flash`: Flash device trait. +- `embassy::traits::flash`: Flash device trait. - `embassy::time`: `Clock` and `Alarm` traits. Std-like `Duration` and `Instant`. - More traits for SPI, I2C, UART async HAL coming soon. diff --git a/embassy-nrf-examples/src/bin/gpiote_port.rs b/embassy-nrf-examples/src/bin/gpiote_port.rs index 0f1637fa..ccb5bb97 100644 --- a/embassy-nrf-examples/src/bin/gpiote_port.rs +++ b/embassy-nrf-examples/src/bin/gpiote_port.rs @@ -12,7 +12,7 @@ use defmt::panic; use nrf52840_hal::gpio; use embassy::executor::{task, Executor}; -use embassy::gpio::{WaitForHigh, WaitForLow}; +use embassy::traits::gpio::{WaitForHigh, WaitForLow}; use embassy::util::Forever; use embassy_nrf::gpiote::{Gpiote, GpiotePin}; use embassy_nrf::interrupt; diff --git a/embassy-nrf-examples/src/bin/qspi.rs b/embassy-nrf-examples/src/bin/qspi.rs index 790dedc9..587ed7dd 100644 --- a/embassy-nrf-examples/src/bin/qspi.rs +++ b/embassy-nrf-examples/src/bin/qspi.rs @@ -12,7 +12,7 @@ use futures::pin_mut; use nrf52840_hal::gpio; use embassy::executor::{task, Executor}; -use embassy::flash::Flash; +use embassy::traits::flash::Flash; use embassy::util::Forever; use embassy_nrf::{interrupt, qspi}; diff --git a/embassy-nrf-examples/src/bin/uart.rs b/embassy-nrf-examples/src/bin/uart.rs index 50cdfd1e..41f9e127 100644 --- a/embassy-nrf-examples/src/bin/uart.rs +++ b/embassy-nrf-examples/src/bin/uart.rs @@ -10,7 +10,7 @@ use cortex_m_rt::entry; use defmt::panic; use embassy::executor::{task, Executor}; use embassy::time::{Duration, Timer}; -use embassy::uart::Uart; +use embassy::traits::uart::Uart; use embassy::util::Forever; use embassy_nrf::{interrupt, pac, rtc, uarte}; use futures::future::{select, Either}; diff --git a/embassy-nrf/src/gpiote.rs b/embassy-nrf/src/gpiote.rs index 78bb2aeb..7cc64910 100644 --- a/embassy-nrf/src/gpiote.rs +++ b/embassy-nrf/src/gpiote.rs @@ -4,7 +4,7 @@ use core::ops::Deref; use core::pin::Pin; use core::ptr; use core::task::{Context, Poll}; -use embassy::gpio::{WaitForHigh, WaitForLow}; +use embassy::traits::gpio::{WaitForHigh, WaitForLow}; use embassy::interrupt::InterruptExt; use embassy::util::Signal; diff --git a/embassy-nrf/src/qspi.rs b/embassy-nrf/src/qspi.rs index bee6abfa..cb7f5a5b 100644 --- a/embassy-nrf/src/qspi.rs +++ b/embassy-nrf/src/qspi.rs @@ -23,7 +23,7 @@ use crate::util::peripheral::{PeripheralMutex, PeripheralState}; // - activate/deactivate // - set gpio in high drive -use embassy::flash::{Error, Flash}; +use embassy::traits::flash::{Error, Flash}; use embassy::util::{DropBomb, WakerRegistration}; use futures::future::poll_fn; diff --git a/embassy-nrf/src/uarte.rs b/embassy-nrf/src/uarte.rs index 9d5ff81a..0cc9790b 100644 --- a/embassy-nrf/src/uarte.rs +++ b/embassy-nrf/src/uarte.rs @@ -207,7 +207,7 @@ where } } -impl embassy::uart::Uart for Uarte { +impl embassy::traits::uart::Uart for Uarte { type ReceiveFuture<'a> = ReceiveFuture<'a, T>; type SendFuture<'a> = SendFuture<'a, T>; @@ -287,7 +287,7 @@ impl<'a, T> Future for SendFuture<'a, T> where T: Instance, { - type Output = Result<(), embassy::uart::Error>; + type Output = Result<(), embassy::traits::uart::Error>; fn poll(self: core::pin::Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { let Self { uarte, buf } = unsafe { self.get_unchecked_mut() }; @@ -355,7 +355,7 @@ impl<'a, T> Future for ReceiveFuture<'a, T> where T: Instance, { - type Output = Result<(), embassy::uart::Error>; + type Output = Result<(), embassy::traits::uart::Error>; fn poll(self: core::pin::Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { let Self { uarte, buf } = unsafe { self.get_unchecked_mut() }; diff --git a/embassy-stm32f4-examples/src/bin/exti.rs b/embassy-stm32f4-examples/src/bin/exti.rs index d8de3381..6b3568d6 100644 --- a/embassy-stm32f4-examples/src/bin/exti.rs +++ b/embassy-stm32f4-examples/src/bin/exti.rs @@ -9,7 +9,7 @@ use example_common::{panic, *}; use cortex_m_rt::entry; use embassy::executor::{task, Executor}; -use embassy::gpio::*; +use embassy::traits::gpio::*; use embassy::util::Forever; use embassy_stm32f4::exti; use embassy_stm32f4::interrupt; diff --git a/embassy-stm32f4-examples/src/bin/serial.rs b/embassy-stm32f4-examples/src/bin/serial.rs index 2cd1c8c3..72fd1a2f 100644 --- a/embassy-stm32f4-examples/src/bin/serial.rs +++ b/embassy-stm32f4-examples/src/bin/serial.rs @@ -10,7 +10,7 @@ use example_common::{panic, *}; use cortex_m::singleton; use cortex_m_rt::entry; use embassy::executor::{task, Executor}; -use embassy::uart::Uart; +use embassy::traits::uart::Uart; use embassy::util::Forever; use embassy_stm32f4::interrupt; use embassy_stm32f4::serial; diff --git a/embassy-stm32f4/src/exti.rs b/embassy-stm32f4/src/exti.rs index 6a1e1300..7ec2197e 100644 --- a/embassy-stm32f4/src/exti.rs +++ b/embassy-stm32f4/src/exti.rs @@ -2,8 +2,8 @@ use core::future::Future; use core::mem; use core::pin::Pin; -use embassy::gpio::{WaitForFallingEdge, WaitForRisingEdge}; use embassy::interrupt::Interrupt; +use embassy::traits::gpio::{WaitForFallingEdge, WaitForRisingEdge}; use embassy::util::InterruptFuture; use crate::hal::gpio; diff --git a/embassy-stm32f4/src/serial.rs b/embassy-stm32f4/src/serial.rs index 8f594ca1..8a90e9fa 100644 --- a/embassy-stm32f4/src/serial.rs +++ b/embassy-stm32f4/src/serial.rs @@ -9,7 +9,7 @@ use core::ptr; use core::sync::atomic::{self, Ordering}; use embassy::interrupt::InterruptExt; -use embassy::uart::{Error, Uart}; +use embassy::traits::uart::{Error, Uart}; use embassy::util::Signal; use crate::hal::dma::config::DmaConfig; diff --git a/embassy-traits/Cargo.toml b/embassy-traits/Cargo.toml new file mode 100644 index 00000000..09db74ab --- /dev/null +++ b/embassy-traits/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "embassy-traits" +version = "0.1.0" +authors = ["Dario Nieuwenhuis "] +edition = "2018" + +[dependencies] +defmt = { version = "0.2.0", optional = true } + +[features] +std = [] + +defmt-trace = [] +defmt-debug = [] +defmt-info = [] +defmt-warn = [] +defmt-error = [] \ No newline at end of file diff --git a/embassy/src/flash.rs b/embassy-traits/src/flash.rs similarity index 100% rename from embassy/src/flash.rs rename to embassy-traits/src/flash.rs diff --git a/embassy/src/gpio.rs b/embassy-traits/src/gpio.rs similarity index 100% rename from embassy/src/gpio.rs rename to embassy-traits/src/gpio.rs diff --git a/embassy-traits/src/lib.rs b/embassy-traits/src/lib.rs new file mode 100644 index 00000000..55af46cf --- /dev/null +++ b/embassy-traits/src/lib.rs @@ -0,0 +1,10 @@ +#![cfg_attr(not(feature = "std"), no_std)] +#![feature(generic_associated_types)] +#![feature(const_fn)] +#![feature(const_fn_fn_ptr_basics)] +#![feature(const_option)] +#![allow(incomplete_features)] + +pub mod flash; +pub mod gpio; +pub mod uart; diff --git a/embassy/src/uart.rs b/embassy-traits/src/uart.rs similarity index 100% rename from embassy/src/uart.rs rename to embassy-traits/src/uart.rs diff --git a/embassy/Cargo.toml b/embassy/Cargo.toml index 1c977d84..116ab224 100644 --- a/embassy/Cargo.toml +++ b/embassy/Cargo.toml @@ -5,12 +5,13 @@ authors = ["Dario Nieuwenhuis "] edition = "2018" [features] -std = ["futures/std"] -defmt-trace = [] -defmt-debug = [] -defmt-info = [] -defmt-warn = [] -defmt-error = [] +std = ["futures/std", "embassy-traits/std"] +defmt = ["embassy-traits/defmt", "dep:defmt"] +defmt-trace = ["embassy-traits/defmt-trace"] +defmt-debug = ["embassy-traits/defmt-debug"] +defmt-info = ["embassy-traits/defmt-info"] +defmt-warn = ["embassy-traits/defmt-warn"] +defmt-error = ["embassy-traits/defmt-error"] [dependencies] defmt = { version = "0.2.0", optional = true } @@ -20,4 +21,5 @@ cortex-m = "0.7.1" futures = { version = "0.3.5", default-features = false } pin-project = { version = "1.0.2", default-features = false } embassy-macros = { version = "0.1.0", path = "../embassy-macros"} +embassy-traits = { version = "0.1.0", path = "../embassy-traits"} diff --git a/embassy/src/lib.rs b/embassy/src/lib.rs index 0844df37..f32a7a79 100644 --- a/embassy/src/lib.rs +++ b/embassy/src/lib.rs @@ -9,10 +9,9 @@ pub(crate) mod fmt; pub mod executor; -pub mod flash; -pub mod gpio; pub mod interrupt; pub mod io; pub mod time; -pub mod uart; pub mod util; + +pub use embassy_traits as traits;