From 2c1d1054e54bb3670a3b01df8e86840ec72f568b Mon Sep 17 00:00:00 2001
From: Luca Erbetta <luca.erbetta105@gmail.com>
Date: Fri, 29 Mar 2019 20:26:22 +0100
Subject: [PATCH] [ScreenManager] Display pn status

---
 src/boards/HeliTest/ScreenManager.cpp | 33 +++++++++++++++++++++++----
 src/boards/HeliTest/ScreenManager.h   |  8 +++++--
 2 files changed, 35 insertions(+), 6 deletions(-)

diff --git a/src/boards/HeliTest/ScreenManager.cpp b/src/boards/HeliTest/ScreenManager.cpp
index 641a6b4..5e46acb 100644
--- a/src/boards/HeliTest/ScreenManager.cpp
+++ b/src/boards/HeliTest/ScreenManager.cpp
@@ -45,9 +45,10 @@ static char buffer[256];
 namespace RogallinaBoard
 {
 
-ScreenManager::ScreenManager(SensorManager* sm)
+ScreenManager::ScreenManager(SensorManager* sm, HeliFMM* heli_fmm,
+                             PinObserverWrapper* pinobs)
     : display(DisplayManager::instance().getDisplay()), dc(display), dw(dc),
-      sm(sm)
+      sm(sm), heli_fmm(heli_fmm), pin_obs(pinobs)
 {
     D(printf("Screenmanager constructor\n"));
     clearScreen();
@@ -73,7 +74,9 @@ void ScreenManager::fetchData()
         sensorData      = sm->getSensorData();
         logging_sensors = sm->loggingSensors();
 
-        status_fmm = sHeliFMM->getStatus();
+        status_fmm = heli_fmm->getStatus();
+
+        pin_status = pin_obs->getPinStatus();
     }
 
     cpu_usage = sSystemDiagnostics->getCpuUsage();
@@ -155,6 +158,28 @@ void ScreenManager::drawRogallinaFMM()
     sprintf(buffer, "State: %-20s", state.c_str());
     writeLine(1, 0, "STATE MACHINE");
     writeLine(2, 0, buffer, fgcolor, bgcolor);
+
+    string pin_state;
+    if (pin_status.state == 1)
+    {
+        bgcolor   = green;
+        fgcolor = black;
+        pin_state = "CONNECTED   ";
+    }
+    else
+    {
+        bgcolor   = red;
+        fgcolor = white;
+        pin_state = "DISCONNECTED";
+    }
+
+    float last_change =
+        -(pin_status.last_state_change - miosix::getTick()) / 1000.0f;
+    sprintf(buffer, "PIN1: %s", pin_state.c_str());
+    writeLine(21, 0, buffer, fgcolor, bgcolor);
+    sprintf(buffer, "Num: %3d   (%-5.1fs ago)", pin_status.num_state_changes,
+            last_change);
+    writeLine(21, 115, buffer);
 }
 
 void ScreenManager::drawLoggerStatus()
@@ -326,7 +351,7 @@ void ScreenManager::drawSensorSamples()
 void ScreenManager::drawSystemStats()
 {
 #ifdef DEBUG
-    writeLine(21, 0, "DEBUG BUILD. DO NOT FLY.", white, red);
+    writeLine(22, 0, "DEBUG BUILD. DO NOT FLY.", white, red);
 #endif
     sprintf(buffer, "CpuUsage: %4.1f    Worst stack:%2d   %6d bytes", cpu_usage,
             min_stack.thread_id, min_stack.abs_free_stack);
diff --git a/src/boards/HeliTest/ScreenManager.h b/src/boards/HeliTest/ScreenManager.h
index b5a4990..df32ca2 100644
--- a/src/boards/HeliTest/ScreenManager.h
+++ b/src/boards/HeliTest/ScreenManager.h
@@ -30,6 +30,7 @@
 #include "config.h"
 #include "display/displayWrapper.h"
 #include "logger/Logger.h"
+#include "PinObserverWrapper.h"
 
 // class RogallinaFMM;
 // Type definitions
@@ -41,7 +42,7 @@ class ScreenManager
 {
 
 public:
-    ScreenManager(SensorManager* sm);
+    ScreenManager(SensorManager* sm, HeliFMM* heli_fmm, PinObserverWrapper* pinobs);
     ~ScreenManager();
 
     void update();
@@ -77,7 +78,8 @@ private:
     string logger_file   = "";
 
     SensorData sensorData;
-
+    PinStatus pin_status;
+    
     float cpu_usage;
     StackData min_stack;
 
@@ -90,6 +92,8 @@ private:
     Logger& logger = Logger::instance();
 
     SensorManager* sm;
+    HeliFMM* heli_fmm;
+    PinObserverWrapper* pin_obs;
 };
 }  // namespace RogallinaBoard
 #endif /* SRC_SCREENMANAGER_H */
-- 
GitLab