aboutsummaryrefslogtreecommitdiff
path: root/macros/src
diff options
context:
space:
mode:
authorGravatar Emil Fresk <emil.fresk@gmail.com> 2021-10-31 10:09:40 +0100
committerGravatar Emil Fresk <emil.fresk@gmail.com> 2021-11-09 10:20:43 +0100
commit0dcb0c4e497b23bf68b7ac0d3d918ab3d3c209be (patch)
treefa4dd3f228dd643d0a989aaae512bf33bc90c291 /macros/src
parentae034aec14bf44e83e2720c81b98031d38992133 (diff)
downloadrtic-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.rs15
-rw-r--r--macros/src/codegen/module.rs30
-rw-r--r--macros/src/codegen/software_tasks.rs2
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,)*]);
));
}