application: Blink heart icon to indicate liveness.
[gps-watch.git] / src / application / main.rs
index edb234eae4fafe355e3541c1dbdfb9cb80c52ddc..74f199906853468fd5c6ac22fd41f25bc333480d 100644 (file)
@@ -39,6 +39,7 @@ use common::i2c;
 use common::uart;
 use common::usb_serial;
 use common::display;
+use common::gps;
 
 extern {
     fn enable_interrupts();
@@ -46,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();
@@ -99,11 +126,25 @@ pub unsafe extern "C" fn _start() -> ! {
 
     nvic::enable_irq(12); // UART0
 
+    let mut gps = gps::Gps::new();
+
+    let mut heart_icon_timer = Timer::new(1000);
+
     loop {
-        systick::delay_ms(1000);
+        let mut tap = gps::TimeAndPos::new();
+
+        while gps.update(&mut tap) {
+        }
 
-        cdc_tx_buf.write(b".\n");
-        cdc_tx_buf.flush();
+        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();