From 340eb6eb0d3fb47f5d968c323c92943662457fda Mon Sep 17 00:00:00 2001 From: Brian Cully Date: Sat, 6 Aug 2022 13:06:59 -0400 Subject: =?UTF-8?q?Put=20blink=20in=20separate=20=E2=80=98Task=E2=80=99=20?= =?UTF-8?q?struct.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/blink.rs | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 src/blink.rs (limited to 'src/blink.rs') diff --git a/src/blink.rs b/src/blink.rs new file mode 100644 index 0000000..7c992d7 --- /dev/null +++ b/src/blink.rs @@ -0,0 +1,54 @@ +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 + } + } + } +} -- cgit v1.2.3