aboutsummaryrefslogtreecommitdiffstats
path: root/src/blink.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/blink.rs')
-rw-r--r--src/blink.rs54
1 files changed, 54 insertions, 0 deletions
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<pac::TIMER6>,
+ frequency: Hertz,
+ led: LED,
+ state: State,
+}
+
+impl Task {
+ pub fn new(mut timer: timer::Timer<pac::TIMER6>, 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
+ }
+ }
+ }
+}