application: Blink heart icon to indicate liveness.
authorTilman Sauerbeck <tilman@code-monkey.de>
Tue, 31 Dec 2019 09:51:45 +0000 (10:51 +0100)
committerTilman Sauerbeck <tilman@code-monkey.de>
Mon, 6 Jan 2020 09:45:34 +0000 (10:45 +0100)
src/application/main.rs

index dbd748c8e28013e25f5c62afdd8f24d68251ba86..74f199906853468fd5c6ac22fd41f25bc333480d 100644 (file)
@@ -47,6 +47,32 @@ extern {
     static mut cdc_tx_buf: Buffer;
 }
 
+struct Timer {
+    state: u32,
+    delay_ms: u32,
+    last_update_ticks: u32,
+}
+
+impl Timer {
+    pub fn new(delay_ms: u32) -> Timer {
+        Timer {
+            state: 0,
+            delay_ms: delay_ms,
+            last_update_ticks: systick::now(),
+        }
+    }
+
+    pub fn update<F>(&mut self, func: F)
+        where F: FnOnce(u32) -> u32
+    {
+        if systick::has_timeout_ms(self.last_update_ticks, self.delay_ms) {
+            self.state = func(self.state);
+
+            self.last_update_ticks = systick::now();
+        }
+    }
+}
+
 #[no_mangle]
 pub unsafe extern "C" fn _start() -> ! {
     clock::configure();
@@ -102,12 +128,24 @@ pub unsafe extern "C" fn _start() -> ! {
 
     let mut gps = gps::Gps::new();
 
+    let mut heart_icon_timer = Timer::new(1000);
+
     loop {
         let mut tap = gps::TimeAndPos::new();
 
         while gps.update(&mut tap) {
         }
 
+        heart_icon_timer.update(|state| {
+            if state == 1 {
+                display.hide_icon(display::Icon::Heart);
+                0
+            } else {
+                display.show_icon(display::Icon::Heart);
+                1
+            }
+        });
+
         if (gpio::get(gpio::GPIOA) & (1 << 12)) == 0 {
             nvic::system_reset();
         }