aboutsummaryrefslogtreecommitdiff
path: root/macros/src/codegen.rs
diff options
context:
space:
mode:
authorGravatar Emil Fresk <emil.fresk@gmail.com> 2021-02-18 19:30:59 +0100
committerGravatar Emil Fresk <emil.fresk@gmail.com> 2021-02-18 19:30:59 +0100
commitebf2f058a4d2a1fcf118144b9893dc3038939bad (patch)
tree11c7b828cc380737de36e6ab77edbd63bf42a72e /macros/src/codegen.rs
parentb57ef0bf9d836ad031e4a4f7930162003128dc74 (diff)
downloadrtic-ebf2f058a4d2a1fcf118144b9893dc3038939bad.tar.gz
rtic-ebf2f058a4d2a1fcf118144b9893dc3038939bad.tar.zst
rtic-ebf2f058a4d2a1fcf118144b9893dc3038939bad.zip
Now with new monotonic trait and crate
Diffstat (limited to 'macros/src/codegen.rs')
-rw-r--r--macros/src/codegen.rs24
1 files changed, 23 insertions, 1 deletions
diff --git a/macros/src/codegen.rs b/macros/src/codegen.rs
index bb8aa4e7..bdfcd36d 100644
--- a/macros/src/codegen.rs
+++ b/macros/src/codegen.rs
@@ -104,13 +104,35 @@ pub fn app(app: &App, analysis: &Analysis, extra: &Extra) -> TokenStream2 {
));
}
+ let app_name = &app.name;
+ let app_path = quote! {crate::#app_name};
+
let monotonic_imports: Vec<_> = app
.monotonics
.iter()
.map(|(_, monotonic)| {
let name = &monotonic.ident;
let ty = &monotonic.ty;
- quote!(pub type #name = #ty;)
+ let mangled_name = util::mangle_monotonic_type(&name.to_string());
+ let ident = util::monotonic_ident(&name.to_string());
+ quote! {
+ #[doc(hidden)]
+ pub type #mangled_name = #ty;
+
+ pub mod #name {
+ pub fn now() -> rtic::time::Instant<#app_path::#mangled_name> {
+ rtic::export::interrupt::free(|_| {
+ use rtic::Monotonic as _;
+ use rtic::time::Clock as _;
+ if let Ok(v) = unsafe{ (&*#app_path::#ident.as_ptr()).try_now() } {
+ v
+ } else {
+ unreachable!("Your monotonic is not infallible!")
+ }
+ })
+ }
+ }
+ }
})
.collect();