diff options
author | 2021-10-31 10:09:40 +0100 | |
---|---|---|
committer | 2021-11-09 10:20:43 +0100 | |
commit | 0dcb0c4e497b23bf68b7ac0d3d918ab3d3c209be (patch) | |
tree | fa4dd3f228dd643d0a989aaae512bf33bc90c291 /macros/src | |
parent | ae034aec14bf44e83e2720c81b98031d38992133 (diff) | |
download | rtic-0dcb0c4e497b23bf68b7ac0d3d918ab3d3c209be.tar.gz rtic-0dcb0c4e497b23bf68b7ac0d3d918ab3d3c209be.tar.zst rtic-0dcb0c4e497b23bf68b7ac0d3d918ab3d3c209be.zip |
New monotonic trait working
Diffstat (limited to 'macros/src')
-rw-r--r-- | macros/src/codegen.rs | 15 | ||||
-rw-r--r-- | macros/src/codegen/module.rs | 30 | ||||
-rw-r--r-- | macros/src/codegen/software_tasks.rs | 2 |
3 files changed, 16 insertions, 31 deletions
diff --git a/macros/src/codegen.rs b/macros/src/codegen.rs index f07326ba..422de5f3 100644 --- a/macros/src/codegen.rs +++ b/macros/src/codegen.rs @@ -108,10 +108,6 @@ pub fn app(app: &App, analysis: &Analysis, extra: &Extra) -> TokenStream2 { let name = &monotonic.ident; let name_str = &name.to_string(); let ident = util::monotonic_ident(&name_str); - let panic_str = &format!( - "Use of monotonic '{}' before it was passed to the runtime", - name_str - ); let doc = &format!( "This module holds the static implementation for `{}::now()`", name_str @@ -131,18 +127,13 @@ pub fn app(app: &App, analysis: &Analysis, extra: &Extra) -> TokenStream2 { pub mod #name { /// Read the current time from this monotonic - pub fn now() -> rtic::time::Instant<super::super::#name> { + pub fn now() -> <super::super::#name as rtic::Monotonic>::Instant { rtic::export::interrupt::free(|_| { use rtic::Monotonic as _; - use rtic::time::Clock as _; if let Some(m) = unsafe{ &mut *super::super::#ident.get_mut() } { - if let Ok(v) = m.try_now() { - v - } else { - unreachable!("Your monotonic is not infallible!") - } + m.now() } else { - panic!(#panic_str); + <super::super::#name as rtic::Monotonic>::zero() } }) } diff --git a/macros/src/codegen/module.rs b/macros/src/codegen/module.rs index c59a814c..996af641 100644 --- a/macros/src/codegen/module.rs +++ b/macros/src/codegen/module.rs @@ -266,7 +266,6 @@ pub fn codegen( let tq = util::tq_ident(&monotonic.ident.to_string()); let t = util::schedule_t_ident(); let m = &monotonic.ident; - let mono_type = &monotonic.ident; let m_ident = util::monotonic_ident(&monotonic_name); let m_isr = &monotonic.args.binds; let enum_ = util::interrupt_ident(); @@ -349,15 +348,17 @@ pub fn codegen( } #[inline] - pub fn reschedule_after<D>(self, duration: D) -> Result<Self, ()> - where D: rtic::time::duration::Duration + rtic::time::fixed_point::FixedPoint, - D::T: Into<<#mono_type as rtic::time::Clock>::T>, - { + pub fn reschedule_after( + self, + duration: <#m as rtic::Monotonic>::Duration + ) -> Result<Self, ()> { self.reschedule_at(monotonics::#m::now() + duration) } - pub fn reschedule_at(self, instant: rtic::time::Instant<#mono_type>) -> Result<Self, ()> - { + pub fn reschedule_at( + self, + instant: <#m as rtic::Monotonic>::Instant + ) -> Result<Self, ()> { rtic::export::interrupt::free(|_| unsafe { let marker = #tq_marker.get().read(); #tq_marker.get_mut().write(marker.wrapping_add(1)); @@ -375,19 +376,12 @@ pub fn codegen( /// This will use the time `Instant::new(0)` as baseline if called in `#[init]`, /// so if you use a non-resetable timer use `spawn_at` when in `#[init]` #[allow(non_snake_case)] - pub fn #internal_spawn_after_ident<D>( - duration: D + pub fn #internal_spawn_after_ident( + duration: <#m as rtic::Monotonic>::Duration #(,#args)* ) -> Result<#name::#m::SpawnHandle, #ty> - where D: rtic::time::duration::Duration + rtic::time::fixed_point::FixedPoint, - D::T: Into<<#mono_type as rtic::time::Clock>::T>, { - - let instant = if rtic::export::interrupt::free(|_| unsafe { (&*#m_ident.get()).is_none() }) { - rtic::time::Instant::new(0) - } else { - monotonics::#m::now() - }; + let instant = monotonics::#m::now(); #internal_spawn_at_ident(instant + duration #(,#untupled)*) } @@ -396,7 +390,7 @@ pub fn codegen( /// Spawns the task at a fixed time instant #[allow(non_snake_case)] pub fn #internal_spawn_at_ident( - instant: rtic::time::Instant<#mono_type> + instant: <#m as rtic::Monotonic>::Instant #(,#args)* ) -> Result<#name::#m::SpawnHandle, #ty> { unsafe { diff --git a/macros/src/codegen/software_tasks.rs b/macros/src/codegen/software_tasks.rs index 1669a3fb..2008b6c9 100644 --- a/macros/src/codegen/software_tasks.rs +++ b/macros/src/codegen/software_tasks.rs @@ -73,7 +73,7 @@ pub fn codegen( #[allow(non_upper_case_globals)] #[doc(hidden)] static #instants: - rtic::RacyCell<[core::mem::MaybeUninit<rtic::time::Instant<#mono_type>>; #cap_lit]> = + rtic::RacyCell<[core::mem::MaybeUninit<<#mono_type as rtic::Monotonic>::Instant>; #cap_lit]> = rtic::RacyCell::new([#(#elems,)*]); )); } |