use gd32vf103xx_hal::prelude::_embedded_hal_timer_CountDown; use core::convert::Infallible; use gd32vf103xx_hal::{ eclic::{self, EclicExt}, pac::{self, Interrupt}, time::Hertz, timer::{Event, Timer}, }; use nb; use crate::led::LED; enum State { WaitForTimer, ToggleLED, } pub struct Task { timer: Timer, frequency: Hertz, led: LED, state: State, } impl Task { pub fn new(mut timer: Timer, frequency: Hertz, led: LED) -> Self { pac::ECLIC::setup(Interrupt::TIMER6, eclic::TriggerType::RisingEdge, eclic::Level::L0, eclic::Priority::P3); unsafe { pac::ECLIC::unmask(Interrupt::TIMER6); } if !pac::ECLIC::is_enabled(Interrupt::TIMER6) { panic!("timer6 interrupt not enabled"); } timer.listen(Event::Update); Self { timer, frequency, led, state: State::ToggleLED } } pub fn poll(&mut self) -> nb::Result<(), Infallible> { match self.state { State::WaitForTimer => { if let Ok(_) = self.timer.wait() { self.state = State::ToggleLED; // self.timer.unlisten(Event::Update); Ok(()) } else { Err(nb::Error::WouldBlock) } }, State::ToggleLED => { self.led.toggle(); self.timer.start(self.frequency); self.state = State::WaitForTimer; // self.timer.listen(Event::Update); Err(nb::Error::WouldBlock) } } } }