aboutsummaryrefslogtreecommitdiff
path: root/rtic-macros/src/codegen/software_tasks.rs
diff options
context:
space:
mode:
authorGravatar Henrik Tjäder <henrik@tjaders.com> 2023-02-04 16:47:17 +0100
committerGravatar Henrik Tjäder <henrik@tjaders.com> 2023-03-01 00:35:13 +0100
commit9e445b3583c15c7701f3167eaa8dfe4afd541691 (patch)
tree167565d51598f42c0454d60b34e1170589ae1056 /rtic-macros/src/codegen/software_tasks.rs
parent4124fbdd61ff823c6217a2a16ebb4d813146116c (diff)
downloadrtic-9e445b3583c15c7701f3167eaa8dfe4afd541691.tar.gz
rtic-9e445b3583c15c7701f3167eaa8dfe4afd541691.tar.zst
rtic-9e445b3583c15c7701f3167eaa8dfe4afd541691.zip
Move rtic macros to repo root, tune xtask
Diffstat (limited to 'rtic-macros/src/codegen/software_tasks.rs')
-rw-r--r--rtic-macros/src/codegen/software_tasks.rs64
1 files changed, 64 insertions, 0 deletions
diff --git a/rtic-macros/src/codegen/software_tasks.rs b/rtic-macros/src/codegen/software_tasks.rs
new file mode 100644
index 00000000..34fc851a
--- /dev/null
+++ b/rtic-macros/src/codegen/software_tasks.rs
@@ -0,0 +1,64 @@
+use crate::syntax::{ast::App, Context};
+use crate::{
+ analyze::Analysis,
+ codegen::{local_resources_struct, module, shared_resources_struct},
+};
+use proc_macro2::TokenStream as TokenStream2;
+use quote::quote;
+
+pub fn codegen(app: &App, analysis: &Analysis) -> TokenStream2 {
+ let mut mod_app = vec![];
+ let mut root = vec![];
+ let mut user_tasks = vec![];
+
+ // Any task
+ for (name, task) in app.software_tasks.iter() {
+ if !task.args.local_resources.is_empty() {
+ let (item, constructor) =
+ local_resources_struct::codegen(Context::SoftwareTask(name), app);
+
+ root.push(item);
+
+ mod_app.push(constructor);
+ }
+
+ if !task.args.shared_resources.is_empty() {
+ let (item, constructor) =
+ shared_resources_struct::codegen(Context::SoftwareTask(name), app);
+
+ root.push(item);
+
+ mod_app.push(constructor);
+ }
+
+ if !&task.is_extern {
+ let context = &task.context;
+ let attrs = &task.attrs;
+ let cfgs = &task.cfgs;
+ let stmts = &task.stmts;
+ let inputs = &task.inputs;
+
+ user_tasks.push(quote!(
+ #(#attrs)*
+ #(#cfgs)*
+ #[allow(non_snake_case)]
+ async fn #name<'a>(#context: #name::Context<'a> #(,#inputs)*) {
+ use rtic::Mutex as _;
+ use rtic::mutex::prelude::*;
+
+ #(#stmts)*
+ }
+ ));
+ }
+
+ root.push(module::codegen(Context::SoftwareTask(name), app, analysis));
+ }
+
+ quote!(
+ #(#mod_app)*
+
+ #(#root)*
+
+ #(#user_tasks)*
+ )
+}