rtic_core/common_internal/rtic_traits.rs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
use proc_macro2::TokenStream as TokenStream2;
use quote::{format_ident, quote};
pub const HWT_TRAIT_TY: &str = "RticTask";
pub const SWT_TRAIT_TY: &str = "RticSwTask"; // FIXME: add a backend trait method to provide a list of additional traits that define task types instead of this wrong way of borrowing from sw pass implicitly !
pub const IDLE_TRAIT_TY: &str = "RticIdleTask";
pub const MUTEX_TY: &str = "RticMutex";
pub(crate) fn get_rtic_traits_mod() -> TokenStream2 {
let hw_task_trait = hw_task_trait();
let idle_trait = idle_task_trait();
let mutex_trait = mutex_trait();
quote! {
/// Module defining rtic traits
pub use rtic_traits::*;
pub mod rtic_traits {
#hw_task_trait
#idle_trait
#mutex_trait
}
}
}
fn hw_task_trait() -> TokenStream2 {
let hw_task = format_ident!("{HWT_TRAIT_TY}");
quote! {
/// Trait for a hardware task
pub trait #hw_task {
/// Associated type that can be used to make [Self::init] take arguments
type InitArgs: Sized;
/// Task local variables initialization routine
fn init(args: Self::InitArgs) -> Self;
/// Function to be bound to a HW Interrupt
fn exec(&mut self);
}
}
}
fn idle_task_trait() -> TokenStream2 {
let idle_task = format_ident!("{IDLE_TRAIT_TY}");
quote! {
/// Trait for an idle task
pub trait #idle_task {
/// Associated type that can be used to make [Self::init] take arguments
type InitArgs: Sized;
/// Task local variables initialization routine
fn init(args: Self::InitArgs) -> Self;
/// Function to be executing when no other task is running
fn exec(&mut self) -> !;
}
}
}
fn mutex_trait() -> TokenStream2 {
let mutex = format_ident!("{MUTEX_TY}");
quote! {
pub trait #mutex {
type ResourceType;
fn lock(&mut self, f: impl FnOnce(&mut Self::ResourceType));
}
}
}