diff options
| author | Dario Nieuwenhuis <[email protected]> | 2021-04-14 17:04:24 +0200 |
|---|---|---|
| committer | GitHub <[email protected]> | 2021-04-14 17:04:24 +0200 |
| commit | b34b74de9de38e4bee9a4c8d95246bf9d138f86f (patch) | |
| tree | 26497da833890a0affadaec117e41422508890f7 | |
| parent | e11d4b1e0eb0148e2097ab6de67c6be7726a6580 (diff) | |
| parent | 37b3d8b22c3d9504fbd342e09198e885277c4c4a (diff) | |
Merge pull request #140 from lulf/reexport-macro-param
Add embassy_prefix attribute parameter to task and main macros
| -rw-r--r-- | embassy-macros/src/chip/nrf.rs | 24 | ||||
| -rw-r--r-- | embassy-macros/src/chip/rp.rs | 17 | ||||
| -rw-r--r-- | embassy-macros/src/chip/stm32.rs | 14 | ||||
| -rw-r--r-- | embassy-macros/src/lib.rs | 55 | ||||
| -rw-r--r-- | embassy-macros/src/path.rs | 41 |
5 files changed, 122 insertions, 29 deletions
diff --git a/embassy-macros/src/chip/nrf.rs b/embassy-macros/src/chip/nrf.rs index b2d1c322f..b7ea8d389 100644 --- a/embassy-macros/src/chip/nrf.rs +++ b/embassy-macros/src/chip/nrf.rs | |||
| @@ -1,3 +1,4 @@ | |||
| 1 | use crate::path::ModulePrefix; | ||
| 1 | use darling::FromMeta; | 2 | use darling::FromMeta; |
| 2 | use proc_macro2::TokenStream; | 3 | use proc_macro2::TokenStream; |
| 3 | use quote::{format_ident, quote}; | 4 | use quote::{format_ident, quote}; |
| @@ -30,32 +31,37 @@ impl Default for LfclkSource { | |||
| 30 | } | 31 | } |
| 31 | } | 32 | } |
| 32 | 33 | ||
| 33 | #[derive(Debug, FromMeta)] | 34 | #[derive(Debug, FromMeta, Default)] |
| 34 | pub struct Args { | 35 | pub struct Args { |
| 35 | #[darling(default)] | 36 | #[darling(default)] |
| 37 | pub embassy_prefix: ModulePrefix, | ||
| 38 | #[darling(default)] | ||
| 36 | pub hfclk_source: HfclkSource, | 39 | pub hfclk_source: HfclkSource, |
| 37 | #[darling(default)] | 40 | #[darling(default)] |
| 38 | pub lfclk_source: LfclkSource, | 41 | pub lfclk_source: LfclkSource, |
| 39 | } | 42 | } |
| 40 | 43 | ||
| 41 | pub fn generate(args: Args) -> TokenStream { | 44 | pub fn generate(args: &Args) -> TokenStream { |
| 42 | let hfclk_source = format_ident!("{}", format!("{:?}", args.hfclk_source)); | 45 | let hfclk_source = format_ident!("{}", format!("{:?}", args.hfclk_source)); |
| 43 | let lfclk_source = format_ident!("{}", format!("{:?}", args.lfclk_source)); | 46 | let lfclk_source = format_ident!("{}", format!("{:?}", args.lfclk_source)); |
| 44 | 47 | ||
| 48 | let embassy_path = args.embassy_prefix.append("embassy").path(); | ||
| 49 | let embassy_nrf_path = args.embassy_prefix.append("embassy_nrf").path(); | ||
| 50 | |||
| 45 | quote!( | 51 | quote!( |
| 46 | use embassy_nrf::{interrupt, peripherals, rtc}; | 52 | use #embassy_nrf_path::{interrupt, peripherals, rtc}; |
| 47 | 53 | ||
| 48 | let mut config = embassy_nrf::system::Config::default(); | 54 | let mut config = #embassy_nrf_path::system::Config::default(); |
| 49 | config.hfclk_source = embassy_nrf::system::HfclkSource::#hfclk_source; | 55 | config.hfclk_source = #embassy_nrf_path::system::HfclkSource::#hfclk_source; |
| 50 | config.lfclk_source = embassy_nrf::system::LfclkSource::#lfclk_source; | 56 | config.lfclk_source = #embassy_nrf_path::system::LfclkSource::#lfclk_source; |
| 51 | unsafe { embassy_nrf::system::configure(config) }; | 57 | unsafe { #embassy_nrf_path::system::configure(config) }; |
| 52 | 58 | ||
| 53 | let mut rtc = rtc::RTC::new(unsafe { <peripherals::RTC1 as embassy::util::Steal>::steal() }, interrupt::take!(RTC1)); | 59 | let mut rtc = rtc::RTC::new(unsafe { <peripherals::RTC1 as #embassy_path::util::Steal>::steal() }, interrupt::take!(RTC1)); |
| 54 | let rtc = unsafe { make_static(&mut rtc) }; | 60 | let rtc = unsafe { make_static(&mut rtc) }; |
| 55 | rtc.start(); | 61 | rtc.start(); |
| 56 | let mut alarm = rtc.alarm0(); | 62 | let mut alarm = rtc.alarm0(); |
| 57 | 63 | ||
| 58 | unsafe { embassy::time::set_clock(rtc) }; | 64 | unsafe { #embassy_path::time::set_clock(rtc) }; |
| 59 | 65 | ||
| 60 | let alarm = unsafe { make_static(&mut alarm) }; | 66 | let alarm = unsafe { make_static(&mut alarm) }; |
| 61 | executor.set_alarm(alarm); | 67 | executor.set_alarm(alarm); |
diff --git a/embassy-macros/src/chip/rp.rs b/embassy-macros/src/chip/rp.rs index 39a418ff0..6093dc9d3 100644 --- a/embassy-macros/src/chip/rp.rs +++ b/embassy-macros/src/chip/rp.rs | |||
| @@ -1,15 +1,20 @@ | |||
| 1 | use crate::path::ModulePrefix; | ||
| 1 | use darling::FromMeta; | 2 | use darling::FromMeta; |
| 2 | use proc_macro2::TokenStream; | 3 | use proc_macro2::TokenStream; |
| 3 | use quote::quote; | 4 | use quote::quote; |
| 4 | 5 | ||
| 5 | #[derive(Debug, FromMeta)] | 6 | #[derive(Debug, FromMeta, Default)] |
| 6 | pub struct Args {} | 7 | pub struct Args { |
| 8 | #[darling(default)] | ||
| 9 | pub embassy_prefix: ModulePrefix, | ||
| 10 | } | ||
| 7 | 11 | ||
| 8 | pub fn generate(_args: Args) -> TokenStream { | 12 | pub fn generate(args: &Args) -> TokenStream { |
| 13 | let embassy_rp_path = args.embassy_prefix.append("embassy_rp").path(); | ||
| 9 | quote!( | 14 | quote!( |
| 10 | use embassy_rp::{interrupt, peripherals}; | 15 | use #embassy_rp_path::{interrupt, peripherals}; |
| 11 | 16 | ||
| 12 | let mut config = embassy_rp::system::Config::default(); | 17 | let mut config = #embassy_rp_path::system::Config::default(); |
| 13 | unsafe { embassy_rp::system::configure(config) }; | 18 | unsafe { #embassy_rp_path::system::configure(config) }; |
| 14 | ) | 19 | ) |
| 15 | } | 20 | } |
diff --git a/embassy-macros/src/chip/stm32.rs b/embassy-macros/src/chip/stm32.rs index 2476a9623..486a9aa65 100644 --- a/embassy-macros/src/chip/stm32.rs +++ b/embassy-macros/src/chip/stm32.rs | |||
| @@ -1,11 +1,14 @@ | |||
| 1 | use crate::path::ModulePrefix; | ||
| 1 | use darling::FromMeta; | 2 | use darling::FromMeta; |
| 2 | use proc_macro2::TokenStream; | 3 | use proc_macro2::TokenStream; |
| 3 | use quote::{format_ident, quote}; | 4 | use quote::{format_ident, quote}; |
| 4 | use syn::spanned::Spanned; | 5 | use syn::spanned::Spanned; |
| 5 | 6 | ||
| 6 | #[derive(Debug, FromMeta)] | 7 | #[derive(Debug, FromMeta, Default)] |
| 7 | pub struct Args { | 8 | pub struct Args { |
| 8 | #[darling(default)] | 9 | #[darling(default)] |
| 10 | pub embassy_prefix: ModulePrefix, | ||
| 11 | #[darling(default)] | ||
| 9 | pub use_hse: Option<u32>, | 12 | pub use_hse: Option<u32>, |
| 10 | #[darling(default)] | 13 | #[darling(default)] |
| 11 | pub sysclk: Option<u32>, | 14 | pub sysclk: Option<u32>, |
| @@ -15,7 +18,10 @@ pub struct Args { | |||
| 15 | pub require_pll48clk: bool, | 18 | pub require_pll48clk: bool, |
| 16 | } | 19 | } |
| 17 | 20 | ||
| 18 | pub fn generate(args: Args) -> TokenStream { | 21 | pub fn generate(args: &Args) -> TokenStream { |
| 22 | let embassy_path = args.embassy_prefix.append("embassy").path(); | ||
| 23 | let embassy_stm32_path = args.embassy_prefix.append("embassy_stm32").path(); | ||
| 24 | |||
| 19 | let mut clock_cfg_args = quote! {}; | 25 | let mut clock_cfg_args = quote! {}; |
| 20 | if args.use_hse.is_some() { | 26 | if args.use_hse.is_some() { |
| 21 | let mhz = args.use_hse.unwrap(); | 27 | let mhz = args.use_hse.unwrap(); |
| @@ -37,7 +43,7 @@ pub fn generate(args: Args) -> TokenStream { | |||
| 37 | } | 43 | } |
| 38 | 44 | ||
| 39 | quote!( | 45 | quote!( |
| 40 | use embassy_stm32::{rtc, interrupt, Peripherals, pac, hal::rcc::RccExt, hal::time::U32Ext}; | 46 | use #embassy_stm32_path::{rtc, interrupt, Peripherals, pac, hal::rcc::RccExt, hal::time::U32Ext}; |
| 41 | 47 | ||
| 42 | let dp = pac::Peripherals::take().unwrap(); | 48 | let dp = pac::Peripherals::take().unwrap(); |
| 43 | let rcc = dp.RCC.constrain(); | 49 | let rcc = dp.RCC.constrain(); |
| @@ -50,7 +56,7 @@ pub fn generate(args: Args) -> TokenStream { | |||
| 50 | rtc.start(); | 56 | rtc.start(); |
| 51 | let mut alarm = rtc.alarm1(); | 57 | let mut alarm = rtc.alarm1(); |
| 52 | 58 | ||
| 53 | unsafe { embassy::time::set_clock(rtc) }; | 59 | unsafe { #embassy_path::time::set_clock(rtc) }; |
| 54 | 60 | ||
| 55 | let alarm = unsafe { make_static(&mut alarm) }; | 61 | let alarm = unsafe { make_static(&mut alarm) }; |
| 56 | executor.set_alarm(alarm); | 62 | executor.set_alarm(alarm); |
diff --git a/embassy-macros/src/lib.rs b/embassy-macros/src/lib.rs index 8f35cc9ef..402f0e08a 100644 --- a/embassy-macros/src/lib.rs +++ b/embassy-macros/src/lib.rs | |||
| @@ -7,12 +7,18 @@ use proc_macro::{Span, TokenStream}; | |||
| 7 | use quote::{format_ident, quote}; | 7 | use quote::{format_ident, quote}; |
| 8 | use syn::spanned::Spanned; | 8 | use syn::spanned::Spanned; |
| 9 | 9 | ||
| 10 | mod path; | ||
| 11 | |||
| 12 | use path::ModulePrefix; | ||
| 13 | |||
| 10 | #[derive(Debug, FromMeta)] | 14 | #[derive(Debug, FromMeta)] |
| 11 | struct MacroArgs { | 15 | struct TaskArgs { |
| 12 | #[darling(default)] | 16 | #[darling(default)] |
| 13 | pool_size: Option<usize>, | 17 | pool_size: Option<usize>, |
| 14 | #[darling(default)] | 18 | #[darling(default)] |
| 15 | send: bool, | 19 | send: bool, |
| 20 | #[darling(default)] | ||
| 21 | embassy_prefix: ModulePrefix, | ||
| 16 | } | 22 | } |
| 17 | 23 | ||
| 18 | #[proc_macro_attribute] | 24 | #[proc_macro_attribute] |
| @@ -20,13 +26,16 @@ pub fn task(args: TokenStream, item: TokenStream) -> TokenStream { | |||
| 20 | let macro_args = syn::parse_macro_input!(args as syn::AttributeArgs); | 26 | let macro_args = syn::parse_macro_input!(args as syn::AttributeArgs); |
| 21 | let mut task_fn = syn::parse_macro_input!(item as syn::ItemFn); | 27 | let mut task_fn = syn::parse_macro_input!(item as syn::ItemFn); |
| 22 | 28 | ||
| 23 | let macro_args = match MacroArgs::from_list(¯o_args) { | 29 | let macro_args = match TaskArgs::from_list(¯o_args) { |
| 24 | Ok(v) => v, | 30 | Ok(v) => v, |
| 25 | Err(e) => { | 31 | Err(e) => { |
| 26 | return TokenStream::from(e.write_errors()); | 32 | return TokenStream::from(e.write_errors()); |
| 27 | } | 33 | } |
| 28 | }; | 34 | }; |
| 29 | 35 | ||
| 36 | let embassy_prefix = macro_args.embassy_prefix.append("embassy"); | ||
| 37 | let embassy_path = embassy_prefix.path(); | ||
| 38 | |||
| 30 | let pool_size: usize = macro_args.pool_size.unwrap_or(1); | 39 | let pool_size: usize = macro_args.pool_size.unwrap_or(1); |
| 31 | 40 | ||
| 32 | let mut fail = false; | 41 | let mut fail = false; |
| @@ -99,8 +108,8 @@ pub fn task(args: TokenStream, item: TokenStream) -> TokenStream { | |||
| 99 | }; | 108 | }; |
| 100 | 109 | ||
| 101 | let result = quote! { | 110 | let result = quote! { |
| 102 | #visibility fn #name(#args) -> ::embassy::executor::SpawnToken<#impl_ty> { | 111 | #visibility fn #name(#args) -> #embassy_path::executor::SpawnToken<#impl_ty> { |
| 103 | use ::embassy::executor::raw::Task; | 112 | use #embassy_path::executor::raw::Task; |
| 104 | #task_fn | 113 | #task_fn |
| 105 | type F = #impl_ty; | 114 | type F = #impl_ty; |
| 106 | const NEW_TASK: Task<F> = Task::new(); | 115 | const NEW_TASK: Task<F> = Task::new(); |
| @@ -203,6 +212,15 @@ mod chip; | |||
| 203 | #[path = "chip/rp.rs"] | 212 | #[path = "chip/rp.rs"] |
| 204 | mod chip; | 213 | mod chip; |
| 205 | 214 | ||
| 215 | #[cfg(feature = "std")] | ||
| 216 | mod chip { | ||
| 217 | #[derive(Debug, darling::FromMeta, Default)] | ||
| 218 | pub struct Args { | ||
| 219 | #[darling(default)] | ||
| 220 | pub embassy_prefix: crate::path::ModulePrefix, | ||
| 221 | } | ||
| 222 | } | ||
| 223 | |||
| 206 | #[cfg(any(feature = "nrf", feature = "stm32", feature = "rp"))] | 224 | #[cfg(any(feature = "nrf", feature = "stm32", feature = "rp"))] |
| 207 | #[proc_macro_attribute] | 225 | #[proc_macro_attribute] |
| 208 | pub fn main(args: TokenStream, item: TokenStream) -> TokenStream { | 226 | pub fn main(args: TokenStream, item: TokenStream) -> TokenStream { |
| @@ -252,11 +270,13 @@ pub fn main(args: TokenStream, item: TokenStream) -> TokenStream { | |||
| 252 | return TokenStream::new(); | 270 | return TokenStream::new(); |
| 253 | } | 271 | } |
| 254 | 272 | ||
| 273 | let embassy_prefix_lit = macro_args.embassy_prefix.literal(); | ||
| 274 | let embassy_path = macro_args.embassy_prefix.append("embassy").path(); | ||
| 255 | let task_fn_body = task_fn.block.clone(); | 275 | let task_fn_body = task_fn.block.clone(); |
| 256 | let chip_setup = chip::generate(macro_args); | 276 | let chip_setup = chip::generate(¯o_args); |
| 257 | 277 | ||
| 258 | let result = quote! { | 278 | let result = quote! { |
| 259 | #[embassy::task] | 279 | #[#embassy_path::task(embassy_prefix = #embassy_prefix_lit)] |
| 260 | async fn __embassy_main(#args) { | 280 | async fn __embassy_main(#args) { |
| 261 | #task_fn_body | 281 | #task_fn_body |
| 262 | } | 282 | } |
| @@ -267,7 +287,7 @@ pub fn main(args: TokenStream, item: TokenStream) -> TokenStream { | |||
| 267 | ::core::mem::transmute(t) | 287 | ::core::mem::transmute(t) |
| 268 | } | 288 | } |
| 269 | 289 | ||
| 270 | let mut executor = ::embassy::executor::Executor::new(); | 290 | let mut executor = #embassy_path::executor::Executor::new(); |
| 271 | let executor = unsafe { make_static(&mut executor) }; | 291 | let executor = unsafe { make_static(&mut executor) }; |
| 272 | 292 | ||
| 273 | #chip_setup | 293 | #chip_setup |
| @@ -283,9 +303,20 @@ pub fn main(args: TokenStream, item: TokenStream) -> TokenStream { | |||
| 283 | 303 | ||
| 284 | #[cfg(feature = "std")] | 304 | #[cfg(feature = "std")] |
| 285 | #[proc_macro_attribute] | 305 | #[proc_macro_attribute] |
| 286 | pub fn main(_: TokenStream, item: TokenStream) -> TokenStream { | 306 | pub fn main(args: TokenStream, item: TokenStream) -> TokenStream { |
| 307 | let macro_args = syn::parse_macro_input!(args as syn::AttributeArgs); | ||
| 287 | let task_fn = syn::parse_macro_input!(item as syn::ItemFn); | 308 | let task_fn = syn::parse_macro_input!(item as syn::ItemFn); |
| 288 | 309 | ||
| 310 | let macro_args = match chip::Args::from_list(¯o_args) { | ||
| 311 | Ok(v) => v, | ||
| 312 | Err(e) => { | ||
| 313 | return TokenStream::from(e.write_errors()); | ||
| 314 | } | ||
| 315 | }; | ||
| 316 | |||
| 317 | let embassy_path = macro_args.embassy_prefix.append("embassy"); | ||
| 318 | let embassy_std_path = macro_args.embassy_prefix.append("embassy_std"); | ||
| 319 | |||
| 289 | let mut fail = false; | 320 | let mut fail = false; |
| 290 | if task_fn.sig.asyncness.is_none() { | 321 | if task_fn.sig.asyncness.is_none() { |
| 291 | task_fn | 322 | task_fn |
| @@ -324,8 +355,12 @@ pub fn main(_: TokenStream, item: TokenStream) -> TokenStream { | |||
| 324 | 355 | ||
| 325 | let task_fn_body = task_fn.block.clone(); | 356 | let task_fn_body = task_fn.block.clone(); |
| 326 | 357 | ||
| 358 | let embassy_path = embassy_path.path(); | ||
| 359 | let embassy_std_path = embassy_std_path.path(); | ||
| 360 | let embassy_prefix_lit = macro_args.embassy_prefix.literal(); | ||
| 361 | |||
| 327 | let result = quote! { | 362 | let result = quote! { |
| 328 | #[embassy::task] | 363 | #[#embassy_path::task(embassy_prefix = #embassy_prefix_lit)] |
| 329 | async fn __embassy_main(#args) { | 364 | async fn __embassy_main(#args) { |
| 330 | #task_fn_body | 365 | #task_fn_body |
| 331 | } | 366 | } |
| @@ -335,7 +370,7 @@ pub fn main(_: TokenStream, item: TokenStream) -> TokenStream { | |||
| 335 | ::core::mem::transmute(t) | 370 | ::core::mem::transmute(t) |
| 336 | } | 371 | } |
| 337 | 372 | ||
| 338 | let mut executor = ::embassy_std::Executor::new(); | 373 | let mut executor = #embassy_std_path::Executor::new(); |
| 339 | let executor = unsafe { make_static(&mut executor) }; | 374 | let executor = unsafe { make_static(&mut executor) }; |
| 340 | 375 | ||
| 341 | executor.run(|spawner| { | 376 | executor.run(|spawner| { |
diff --git a/embassy-macros/src/path.rs b/embassy-macros/src/path.rs new file mode 100644 index 000000000..00fca7bdb --- /dev/null +++ b/embassy-macros/src/path.rs | |||
| @@ -0,0 +1,41 @@ | |||
| 1 | use darling::{FromMeta, Result}; | ||
| 2 | use proc_macro2::Span; | ||
| 3 | use syn::{LitStr, Path}; | ||
| 4 | |||
| 5 | #[derive(Debug)] | ||
| 6 | pub struct ModulePrefix { | ||
| 7 | literal: LitStr, | ||
| 8 | } | ||
| 9 | |||
| 10 | impl ModulePrefix { | ||
| 11 | pub fn new(path: &str) -> Self { | ||
| 12 | let literal = LitStr::new(path, Span::call_site()); | ||
| 13 | Self { literal } | ||
| 14 | } | ||
| 15 | |||
| 16 | pub fn append(&self, component: &str) -> ModulePrefix { | ||
| 17 | let mut lit = self.literal().value(); | ||
| 18 | lit.push_str(component); | ||
| 19 | Self::new(lit.as_str()) | ||
| 20 | } | ||
| 21 | |||
| 22 | pub fn path(&self) -> Path { | ||
| 23 | self.literal.parse().unwrap() | ||
| 24 | } | ||
| 25 | |||
| 26 | pub fn literal(&self) -> &LitStr { | ||
| 27 | &self.literal | ||
| 28 | } | ||
| 29 | } | ||
| 30 | |||
| 31 | impl FromMeta for ModulePrefix { | ||
| 32 | fn from_string(value: &str) -> Result<Self> { | ||
| 33 | Ok(ModulePrefix::new(value)) | ||
| 34 | } | ||
| 35 | } | ||
| 36 | |||
| 37 | impl Default for ModulePrefix { | ||
| 38 | fn default() -> ModulePrefix { | ||
| 39 | ModulePrefix::new("::") | ||
| 40 | } | ||
| 41 | } | ||
