application: Store pace in the model and show it in its own view.
authorTilman Sauerbeck <tilman@code-monkey.de>
Sun, 5 Jul 2020 16:37:42 +0000 (18:37 +0200)
committerTilman Sauerbeck <tilman@code-monkey.de>
Sun, 6 Sep 2020 17:57:23 +0000 (19:57 +0200)
src/application/main.rs
src/application/model.rs
src/application/views.rs

index 95a60dad6d266560a86e045b45f2175020346ebc..bdd1e4d14c6d9d664485ce999972cf10829938fd 100644 (file)
@@ -60,6 +60,7 @@ extern {
 enum View {
     Time,
     Distance,
+    Pace,
 }
 
 struct Timer {
@@ -91,14 +92,16 @@ impl Timer {
 fn next_view(view: View) -> View {
     match view {
         View::Time => View::Distance,
-        View::Distance => View::Time,
+        View::Distance => View::Pace,
+        View::Pace => View::Time,
     }
 }
 
 fn previous_view(view: View) -> View {
     match view {
-        View::Time => View::Distance,
+        View::Time => View::Pace,
         View::Distance => View::Time,
+        View::Pace => View::Distance,
     }
 }
 
@@ -252,6 +255,7 @@ pub unsafe extern "C" fn _start() -> ! {
 
     let mut time_view = views::TimeView::new();
     let mut distance_view = views::DistanceView::new();
+    let mut pace_view = views::PaceView::new();
 
     let mut model = model::Model::new();
 
@@ -264,6 +268,7 @@ pub unsafe extern "C" fn _start() -> ! {
                 logger.log(&prev_tap, &tap);
 
                 model.update(model::Field::Distance(logger.total_distance_cm));
+                model.update(model::Field::Pace(logger.pace_s));
             }
 
             model.update(model::Field::UnixTime(tap.unix_time));
@@ -314,6 +319,11 @@ pub unsafe extern "C" fn _start() -> ! {
                     display.draw(&screen);
                 }
             },
+            View::Pace => {
+                if pace_view.draw(&mut screen, &mut model) {
+                    display.draw(&screen);
+                }
+            },
         }
 
         heart_icon_timer.update(|state| {
@@ -358,6 +368,7 @@ pub unsafe extern "C" fn _start() -> ! {
             match view {
                 View::Time => time_view.invalidate(),
                 View::Distance => distance_view.invalidate(),
+                View::Pace => pace_view.invalidate(),
             }
         }
 
index a056af5b1fcf41f1a06b18a5eeab0e2fabc837f5..4dc30c0b5c2ba305ad5ffadec6df03db817deac0 100644 (file)
 pub enum Field {
     UnixTime(u32),
     Distance(u32),
+    Pace(u32)
 }
 
 pub struct Model {
     pub unix_time: u32,
     pub distance_cm: u32,
+    pub pace_s: u32,
 
     is_dirty: u32,
 }
@@ -38,6 +40,7 @@ impl Model {
         Model {
             unix_time: 0,
             distance_cm: 0,
+            pace_s: 0,
             is_dirty: 0,
         }
     }
@@ -47,6 +50,12 @@ impl Model {
             self.distance_cm = 0;
             self.is_dirty |= Model::dirty_mask(Field::Distance(0));
         }
+
+        if self.pace_s != 0 {
+            self.pace_s = 0;
+
+            self.is_dirty |= Model::dirty_mask(Field::Pace(0));
+        }
     }
 
     pub fn update(&mut self, data: Field) {
@@ -63,6 +72,12 @@ impl Model {
                     self.is_dirty |= Model::dirty_mask(data);
                 }
             },
+            Field::Pace(pace_s) => {
+                if self.pace_s != pace_s {
+                    self.pace_s = pace_s;
+                    self.is_dirty |= Model::dirty_mask(data);
+                }
+            },
         }
     }
 
@@ -82,6 +97,7 @@ impl Model {
         match data {
             Field::UnixTime(_) => 1,
             Field::Distance(_) => 2,
+            Field::Pace(_) => 4,
         }
     }
 }
index 1218532a6b4427e6c16506b3fe9e14eecd388d46..f29726f6c75b9af58e8b433ff2d38b38ab524d63 100644 (file)
@@ -95,3 +95,42 @@ impl DistanceView {
         true
     }
 }
+
+pub struct PaceView {
+    is_valid: bool,
+}
+
+impl PaceView {
+    pub fn new() -> PaceView {
+        PaceView {
+            is_valid: false,
+        }
+    }
+
+    pub fn invalidate(&mut self) {
+        self.is_valid = false;
+    }
+
+    pub fn draw(&mut self, screen: &mut screen::Screen,
+                model: &mut model::Model) -> bool {
+        if self.is_valid &&
+           !model.check_and_reset_is_dirty(model::Field::Pace(0)) {
+            return false;
+        }
+
+        let mut min_and_s = [b':'; 6];
+
+        common::fmt::fmt_u32_pad(&mut min_and_s[0..3], model.pace_s / 60,
+                                 3, b' ');
+
+        common::fmt::fmt_u32_pad(&mut min_and_s[4..6], model.pace_s % 60,
+                                 2, b'0');
+
+        screen.clear();
+        screen.draw_text(&min_and_s);
+
+        self.is_valid = true;
+
+        true
+    }
+}