aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2021-04-14 17:04:24 +0200
committerGitHub <[email protected]>2021-04-14 17:04:24 +0200
commitb34b74de9de38e4bee9a4c8d95246bf9d138f86f (patch)
tree26497da833890a0affadaec117e41422508890f7
parente11d4b1e0eb0148e2097ab6de67c6be7726a6580 (diff)
parent37b3d8b22c3d9504fbd342e09198e885277c4c4a (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.rs24
-rw-r--r--embassy-macros/src/chip/rp.rs17
-rw-r--r--embassy-macros/src/chip/stm32.rs14
-rw-r--r--embassy-macros/src/lib.rs55
-rw-r--r--embassy-macros/src/path.rs41
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 @@
1use crate::path::ModulePrefix;
1use darling::FromMeta; 2use darling::FromMeta;
2use proc_macro2::TokenStream; 3use proc_macro2::TokenStream;
3use quote::{format_ident, quote}; 4use 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)]
34pub struct Args { 35pub 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
41pub fn generate(args: Args) -> TokenStream { 44pub 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 @@
1use crate::path::ModulePrefix;
1use darling::FromMeta; 2use darling::FromMeta;
2use proc_macro2::TokenStream; 3use proc_macro2::TokenStream;
3use quote::quote; 4use quote::quote;
4 5
5#[derive(Debug, FromMeta)] 6#[derive(Debug, FromMeta, Default)]
6pub struct Args {} 7pub struct Args {
8 #[darling(default)]
9 pub embassy_prefix: ModulePrefix,
10}
7 11
8pub fn generate(_args: Args) -> TokenStream { 12pub 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 @@
1use crate::path::ModulePrefix;
1use darling::FromMeta; 2use darling::FromMeta;
2use proc_macro2::TokenStream; 3use proc_macro2::TokenStream;
3use quote::{format_ident, quote}; 4use quote::{format_ident, quote};
4use syn::spanned::Spanned; 5use syn::spanned::Spanned;
5 6
6#[derive(Debug, FromMeta)] 7#[derive(Debug, FromMeta, Default)]
7pub struct Args { 8pub 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
18pub fn generate(args: Args) -> TokenStream { 21pub 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};
7use quote::{format_ident, quote}; 7use quote::{format_ident, quote};
8use syn::spanned::Spanned; 8use syn::spanned::Spanned;
9 9
10mod path;
11
12use path::ModulePrefix;
13
10#[derive(Debug, FromMeta)] 14#[derive(Debug, FromMeta)]
11struct MacroArgs { 15struct 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(&macro_args) { 29 let macro_args = match TaskArgs::from_list(&macro_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"]
204mod chip; 213mod chip;
205 214
215#[cfg(feature = "std")]
216mod 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]
208pub fn main(args: TokenStream, item: TokenStream) -> TokenStream { 226pub 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(&macro_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]
286pub fn main(_: TokenStream, item: TokenStream) -> TokenStream { 306pub 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(&macro_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 @@
1use darling::{FromMeta, Result};
2use proc_macro2::Span;
3use syn::{LitStr, Path};
4
5#[derive(Debug)]
6pub struct ModulePrefix {
7 literal: LitStr,
8}
9
10impl 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
31impl FromMeta for ModulePrefix {
32 fn from_string(value: &str) -> Result<Self> {
33 Ok(ModulePrefix::new(value))
34 }
35}
36
37impl Default for ModulePrefix {
38 fn default() -> ModulePrefix {
39 ModulePrefix::new("::")
40 }
41}