1#[doc = r"Enumeration of all the interrupts."]
2#[cfg_attr(feature = "defmt", derive(defmt::Format))]
3#[derive(Copy, Clone, Debug, PartialEq, Eq)]
4#[repr(u16)]
5pub enum Interrupt {
6 #[doc = "0 - TOUCH_DONE_INT"]
7 TOUCH_DONE_INT = 0,
8 #[doc = "1 - TOUCH_INACTIVE_INT"]
9 TOUCH_INACTIVE_INT = 1,
10 #[doc = "2 - TOUCH_ACTIVE_INT"]
11 TOUCH_ACTIVE_INT = 2,
12 #[doc = "3 - SARADC1_DONE_INT"]
13 SARADC1_DONE_INT = 3,
14 #[doc = "4 - SARADC2_DONE_INT"]
15 SARADC2_DONE_INT = 4,
16 #[doc = "5 - TSENS_DONE_INT"]
17 TSENS_DONE_INT = 5,
18 #[doc = "6 - RISCV_START_INT"]
19 RISCV_START_INT = 6,
20 #[doc = "7 - SW_INT"]
21 SW_INT = 7,
22 #[doc = "8 - SWD_INT"]
23 SWD_INT = 8,
24 #[doc = "9 - TOUCH_TIME_OUT_INT"]
25 TOUCH_TIME_OUT_INT = 9,
26 #[doc = "10 - TOUCH_APPROACH_LOOP_DONE_INT"]
27 TOUCH_APPROACH_LOOP_DONE_INT = 10,
28 #[doc = "11 - TOUCH_SCAN_DONE_INT"]
29 TOUCH_SCAN_DONE_INT = 11,
30}
31#[doc = r" TryFromInterruptError"]
32#[derive(Debug, Copy, Clone)]
33pub struct TryFromInterruptError(());
34impl Interrupt {
35 #[doc = r" Attempt to convert a given value into an `Interrupt`"]
36 #[inline]
37 pub fn try_from(value: u8) -> Result<Self, TryFromInterruptError> {
38 match value {
39 0 => Ok(Interrupt::TOUCH_DONE_INT),
40 1 => Ok(Interrupt::TOUCH_INACTIVE_INT),
41 2 => Ok(Interrupt::TOUCH_ACTIVE_INT),
42 3 => Ok(Interrupt::SARADC1_DONE_INT),
43 4 => Ok(Interrupt::SARADC2_DONE_INT),
44 5 => Ok(Interrupt::TSENS_DONE_INT),
45 6 => Ok(Interrupt::RISCV_START_INT),
46 7 => Ok(Interrupt::SW_INT),
47 8 => Ok(Interrupt::SWD_INT),
48 9 => Ok(Interrupt::TOUCH_TIME_OUT_INT),
49 10 => Ok(Interrupt::TOUCH_APPROACH_LOOP_DONE_INT),
50 11 => Ok(Interrupt::TOUCH_SCAN_DONE_INT),
51 _ => Err(TryFromInterruptError(())),
52 }
53 }
54}
55#[cfg(feature = "rt")]
56#[macro_export]
57#[doc = r" Assigns a handler to an interrupt"]
58#[doc = r""]
59#[doc = r" This macro takes two arguments: the name of an interrupt and the path to the"]
60#[doc = r" function that will be used as the handler of that interrupt. That function"]
61#[doc = r" must have signature `fn()`."]
62#[doc = r""]
63#[doc = r" Optionally, a third argument may be used to declare interrupt local data."]
64#[doc = r" The handler will have exclusive access to these *local* variables on each"]
65#[doc = r" invocation. If the third argument is used then the signature of the handler"]
66#[doc = r" function must be `fn(&mut $NAME::Locals)` where `$NAME` is the first argument"]
67#[doc = r" passed to the macro."]
68#[doc = r""]
69#[doc = r" # Example"]
70#[doc = r""]
71#[doc = r" ``` ignore"]
72#[doc = r" interrupt!(TIM2, periodic);"]
73#[doc = r""]
74#[doc = r" fn periodic() {"]
75#[doc = r#" print!(".");"#]
76#[doc = r" }"]
77#[doc = r""]
78#[doc = r" interrupt!(TIM3, tick, locals: {"]
79#[doc = r" tick: bool = false;"]
80#[doc = r" });"]
81#[doc = r""]
82#[doc = r" fn tick(locals: &mut TIM3::Locals) {"]
83#[doc = r" locals.tick = !locals.tick;"]
84#[doc = r""]
85#[doc = r" if locals.tick {"]
86#[doc = r#" println!("Tick");"#]
87#[doc = r" } else {"]
88#[doc = r#" println!("Tock");"#]
89#[doc = r" }"]
90#[doc = r" }"]
91#[doc = r" ```"]
92macro_rules ! interrupt { ($ NAME : ident , $ path : path , locals : { $ ($ lvar : ident : $ lty : ty = $ lval : expr ;) * }) => { # [allow (non_snake_case)] mod $ NAME { pub struct Locals { $ (pub $ lvar : $ lty ,) * } } # [allow (non_snake_case)] # [no_mangle] pub extern "C" fn $ NAME () { let _ = $ crate :: interrupt :: Interrupt :: $ NAME ; static mut LOCALS : self :: $ NAME :: Locals = self :: $ NAME :: Locals { $ ($ lvar : $ lval ,) * } ; let f : fn (& mut self :: $ NAME :: Locals) = $ path ; f (unsafe { & mut LOCALS }) ; } } ; ($ NAME : ident , $ path : path) => { # [allow (non_snake_case)] # [no_mangle] pub extern "C" fn $ NAME () { let _ = $ crate :: interrupt :: Interrupt :: $ NAME ; let f : fn () = $ path ; f () ; } } }