From 6ae4e195d6992e5bf2a278c5717ce0160af8ee0f Mon Sep 17 00:00:00 2001
From: Thomas Hooge <thomas@hoogi.de>
Date: Tue, 21 Jan 2025 20:48:43 +0100
Subject: [PATCH] First template for sky view page

---
 lib/obp60task/PageSkyView.cpp | 155 ++++++++++++++++++++++++++++++++++
 lib/obp60task/config.json     |  10 +++
 lib/obp60task/obp60task.cpp   |   2 +
 3 files changed, 167 insertions(+)
 create mode 100644 lib/obp60task/PageSkyView.cpp

diff --git a/lib/obp60task/PageSkyView.cpp b/lib/obp60task/PageSkyView.cpp
new file mode 100644
index 0000000..dbad2c7
--- /dev/null
+++ b/lib/obp60task/PageSkyView.cpp
@@ -0,0 +1,155 @@
+#ifdef BOARD_OBP60S3
+
+#include "Pagedata.h"
+#include "OBP60Extensions.h"
+
+/*
+ * SkyView / Satellites
+ */
+
+class PageSkyView : public Page
+{
+public:
+    PageSkyView(CommonData &common){
+        commonData = &common;
+        common.logger->logDebug(GwLog::LOG,"Show PageSkyView");
+    }
+
+    virtual int handleKey(int key){
+        // Code for keylock
+        if(key == 11){
+            commonData->keylock = !commonData->keylock;
+            return 0;                   // Commit the key
+        }
+        return key;
+    }
+
+    virtual void displayPage(PageData &pageData){
+        GwConfigHandler *config = commonData->config;
+        GwLog *logger = commonData->logger;
+
+        // Get config data
+        String flashLED = config->getString(config->flashLED);
+        String displaycolor = config->getString(config->displaycolor);
+        String backlightMode = config->getString(config->backlight);
+        
+        // Optical warning by limit violation (unused)
+        if(String(flashLED) == "Limit Violation"){
+            setBlinkingLED(false);
+            setFlashLED(false); 
+        }
+
+        // Logging boat values
+        LOG_DEBUG(GwLog::LOG,"Drawing at PageSkyView");
+
+        // Draw page
+        //***********************************************************
+
+        // Set display in partial refresh mode
+        getdisplay().setPartialWindow(0, 0, getdisplay().width(), getdisplay().height()); // Set partial update
+
+        // current position
+        getdisplay().setFont(&Ubuntu_Bold8pt7b);
+
+        GwApi::BoatValue *bv_lat = pageData.values[0];
+        String sv_lat = formatValue(bv_lat, *commonData).svalue;
+        //getdisplay().setCursor(300, 40);
+        //getdisplay().print(sv_lat);
+
+        GwApi::BoatValue *bv_lon = pageData.values[1];
+        String sv_lon = formatValue(bv_lon, *commonData).svalue;
+        //getdisplay().setCursor(300, 60);
+        //getdisplay().print(sv_lon);
+
+        GwApi::BoatValue *bv_hdop = pageData.values[2];
+        String sv_hdop = formatValue(bv_hdop, *commonData).svalue;
+        //getdisplay().setCursor(300, 80);
+        //getdisplay().print(sv_hdop);
+
+        // sky view
+        Point c = {130, 148};
+        uint16_t r = 125;
+        uint16_t r1 = r / 2;
+
+        getdisplay().fillCircle(c.x, c.y, r, commonData->bgcolor);
+        getdisplay().drawCircle(c.x, c.y, r + 1, commonData->fgcolor);
+        getdisplay().drawCircle(c.x, c.y, r + 2, commonData->fgcolor);
+        getdisplay().drawCircle(c.x, c.y, r1, commonData->fgcolor);
+
+        // separation lines
+        getdisplay().drawLine(c.x - r, c.y, c.x + r, c.y, commonData->fgcolor);
+        getdisplay().drawLine(c.x, c.y - r, c.x, c.y + r, commonData->fgcolor);
+        Point p = {c.x, c.y - r};
+        Point p1, p2;
+        p1 = rotatePoint(c, p, 45);
+        p2 = rotatePoint(c, p, 45 + 180);
+        getdisplay().drawLine(p1.x, p1.y, p2.x, p2.y,  commonData->fgcolor);
+        p1 = rotatePoint(c, p, -45);
+        p2 = rotatePoint(c, p, -45 + 180);
+        getdisplay().drawLine(p1.x, p1.y, p2.x, p2.y, commonData->fgcolor);
+
+        // directions 
+
+        int16_t  x1, y1;
+        uint16_t w, h;
+        getdisplay().setFont(&Ubuntu_Bold12pt7b);
+
+		getdisplay().getTextBounds("N", 0, 150, &x1, &y1, &w, &h);
+        getdisplay().setCursor(c.x - w / 2, c.y - r + h + 2);
+        getdisplay().print("N");
+
+		getdisplay().getTextBounds("S", 0, 150, &x1, &y1, &w, &h);
+        getdisplay().setCursor(c.x - w / 2, c.y + r - 2);
+        getdisplay().print("S");
+
+		getdisplay().getTextBounds("E", 0, 150, &x1, &y1, &w, &h);
+        getdisplay().setCursor(c.x + r - w - 2, c.y + h / 2);
+        getdisplay().print("E");
+        
+		getdisplay().getTextBounds("W", 0, 150, &x1, &y1, &w, &h);
+        getdisplay().setCursor(c.x - r + 2 , c.y + h / 2);
+        getdisplay().print("W");
+
+        // satellites
+
+
+        // Signal / Noise bars
+        getdisplay().setFont(&Ubuntu_Bold8pt7b);
+        getdisplay().setCursor(325, 34);
+        getdisplay().print("SNR");
+        getdisplay().drawRect(270, 20, 125, 257, commonData->fgcolor);
+        for (int i = 0; i < 12; i++) {
+            uint16_t y = 29 + (i + 1) * 20;
+            getdisplay().setCursor(276, y);
+            char buffer[3];
+            snprintf(buffer, 3, "%02d", i+1);
+            getdisplay().print(String(buffer));
+            getdisplay().drawRect(305, y-12, 85, 14, commonData->fgcolor);
+        }
+
+        // Update display
+        getdisplay().nextPage();    // Partial update (fast)
+
+    };
+};
+
+static Page* createPage(CommonData &common){
+    return new PageSkyView(common);
+}
+
+/**
+ * with the code below we make this page known to the PageTask
+ * we give it a type (name) that can be selected in the config
+ * we define which function is to be called
+ * and we provide the number of user parameters we expect
+ * this will be number of BoatValue pointers in pageData.values
+ */
+PageDescription registerPageSkyView(
+    "SkyView",              // Page name
+    createPage,             // Action
+    0,                      // Number of bus values depends on selection in Web configuration
+    {"LAT", "LON", "HDOP"}, // Bus values we need in the page
+    true                    // Show display header on/off
+);
+
+#endif
diff --git a/lib/obp60task/config.json b/lib/obp60task/config.json
index 49ac39d..76168e9 100644
--- a/lib/obp60task/config.json
+++ b/lib/obp60task/config.json
@@ -934,6 +934,7 @@
             "OneValue",
             "RollPitch",
             "RudderPosition",
+            "SkyView",
             "Solar",
             "ThreeValues",
             "TwoValues",
@@ -1194,6 +1195,7 @@
             "OneValue",
             "RollPitch",
             "RudderPosition",
+            "SkyView",
             "Solar",
             "ThreeValues",
             "TwoValues",
@@ -1452,6 +1454,7 @@
             "OneValue",
             "RollPitch",
             "RudderPosition",
+            "SkyView",
             "Solar",
             "ThreeValues",
             "TwoValues",
@@ -1706,6 +1709,7 @@
             "OneValue",
             "RollPitch",
             "RudderPosition",
+            "SkyView",
             "Solar",
             "ThreeValues",
             "TwoValues",
@@ -1957,6 +1961,7 @@
             "OneValue",
             "RollPitch",
             "RudderPosition",
+            "SkyView",
             "Solar",
             "ThreeValues",
             "TwoValues",
@@ -2205,6 +2210,7 @@
             "OneValue",
             "RollPitch",
             "RudderPosition",
+            "SkyView",
             "Solar",
             "ThreeValues",
             "TwoValues",
@@ -2450,6 +2456,7 @@
             "OneValue",
             "RollPitch",
             "RudderPosition",
+            "SkyView",
             "Solar",
             "ThreeValues",
             "TwoValues",
@@ -2692,6 +2699,7 @@
             "OneValue",
             "RollPitch",
             "RudderPosition",
+            "SkyView",
             "Solar",
             "ThreeValues",
             "TwoValues",
@@ -2931,6 +2939,7 @@
             "OneValue",
             "RollPitch",
             "RudderPosition",
+            "SkyView",
             "Solar",
             "ThreeValues",
             "TwoValues",
@@ -3167,6 +3176,7 @@
             "OneValue",
             "RollPitch",
             "RudderPosition",
+            "SkyView",
             "Solar",
             "ThreeValues",
             "TwoValues",
diff --git a/lib/obp60task/obp60task.cpp b/lib/obp60task/obp60task.cpp
index 46af73a..df357c8 100644
--- a/lib/obp60task/obp60task.cpp
+++ b/lib/obp60task/obp60task.cpp
@@ -249,6 +249,8 @@ void registerAllPages(PageList &list){
     list.add(&registerPageXTETrack);
     extern PageDescription registerPageFluid;
     list.add(&registerPageFluid);
+    extern PageDescription registerPageSkyView;
+    list.add(&registerPageSkyView);
 }
 
 // Undervoltage detection for shutdown display