use crate::{PollResult, led::LED}; use gd32vf103xx_hal::prelude::_embedded_hal_timer_CountDown; use gd32vf103xx_hal::{ eclic::{self, EclicExt}, pac::{self, Interrupt}, time::Hertz, timer, }; enum State { WaitForTimer, ToggleLED, } pub struct Task { timer: timer::Timer, frequency: Hertz, led: LED, state: State, } impl Task { pub fn new(mut timer: 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(timer::Event::Update); Self { timer, frequency, led, state: State::ToggleLED } } pub fn poll(&mut self) -> PollResult { match self.state { State::WaitForTimer => { if let Ok(_) = self.timer.wait() { self.state = State::ToggleLED; PollResult::Ok } else { PollResult::WouldBlock } }, State::ToggleLED => { self.led.toggle(); self.timer.start(self.frequency); self.state = State::WaitForTimer; PollResult::WouldBlock } } } }