changeset 737:5071d554aaa5

NEW: Add mini compass with marker declination indication Contribution from mikeller
author heinrichsweikamp
date Mon, 06 Mar 2023 16:03:00 +0100
parents 8a2337c7af52
children 30717de00f3a
files Discovery/Inc/t7.h Discovery/Src/gfx_engine.c Discovery/Src/t7.c Discovery/Src/tMenuEditCustom.c
diffstat 4 files changed, 99 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/Discovery/Inc/t7.h	Fri Mar 03 10:41:44 2023 +0100
+++ b/Discovery/Inc/t7.h	Mon Mar 06 16:03:00 2023 +0100
@@ -52,6 +52,7 @@
 #ifdef ENABLE_PSCR_MODE
 		LCC_SimPpo2,
 #endif
+        LLC_Compass,
 		LLC_END
 
 } customview_llc_t;
--- a/Discovery/Src/gfx_engine.c	Fri Mar 03 10:41:44 2023 +0100
+++ b/Discovery/Src/gfx_engine.c	Mon Mar 06 16:03:00 2023 +0100
@@ -2084,7 +2084,7 @@
 			else
 			/* Font style changes */
 			if(*pText == '\a')
-				settings.invert = 1;
+				settings.invert = settings.invert ? 0 : 1;
 			else
 			if((*pText == '\016') && !minimal)
 			{
--- a/Discovery/Src/t7.c	Fri Mar 03 10:41:44 2023 +0100
+++ b/Discovery/Src/t7.c	Mon Mar 06 16:03:00 2023 +0100
@@ -27,6 +27,8 @@
 //////////////////////////////////////////////////////////////////////////////
 
 /* Includes ------------------------------------------------------------------*/
+#include <stdlib.h>
+
 #include "t7.h"
 #include "t3.h"
 #include "settings.h"
@@ -2898,8 +2900,91 @@
         snprintf(text,TEXTSIZE,"%d\016\016\017", stateUsed->lifeData.bottle_bar[stateUsed->lifeData.actualGas.GasIdInSettings]);
         break;
 #endif
+    case LLC_Compass:
+        headerText[2] = TXT_2BYTE;
+        headerText[3] = TXT2BYTE_Compass;
+        tinyHeaderFont = 1;
+
+        uint16_t heading;
+        if(settingsGetPointer()->compassInertia) {
+            heading = (uint16_t)compass_getCompensated();
+        } else {
+            heading = (uint16_t)stateUsed->lifeData.compass_heading;
+        }
+
+        uint16_t userSetHeading = stateUsed->diveSettings.compassHeading;
+        if (!userSetHeading) {
+            snprintf(text, TEXTSIZE, "\020\002\034%u    ", heading);
+        } else {
+            snprintf(text, TEXTSIZE, "\020\002\034\016\016%u    ", heading);
+
+            int16_t declinationFromForwardMark = ((userSetHeading - heading + 180 + 360) % 360) - 180;
+            int16_t declinationFromNearestMark = ((declinationFromForwardMark + 90 + 180) % 180) - 90;
+
+            uint16_t colour;
+            if (abs(declinationFromForwardMark) <= 90) {
+                colour = CLUT_CompassUserHeadingTick;
+            } else {
+                colour = CLUT_CompassUserBackHeadingTick;
+            }
+
+            char direction[] = "\001  \004 \004  ";
+            if (abs(declinationFromNearestMark) <= 10) {
+                direction[2] = '>';
+                direction[6] = '<';
+
+                if (abs(declinationFromForwardMark) <= 10) {
+                    direction[4] = 'X';
+                } else {
+                    direction[4] = 'O';
+                }
+
+                if (abs(declinationFromNearestMark) <= 3) {
+                    direction[3] = '\a';
+                    direction[5] = '\a';
+                }
+            } else {
+                if (declinationFromForwardMark < -90) {
+                    direction[7] = 'O';
+                } else if (declinationFromForwardMark < 0) {
+                    direction[1] = 'X';
+                } else if (declinationFromForwardMark <= 90) {
+                    direction[7] = 'X';
+                } else {
+                    direction[1] = 'O';
+                }
+
+                if (declinationFromNearestMark >= 0) {
+                    direction[6] = '>';
+                }
+                if (declinationFromNearestMark > 30) {
+                    direction[4] = '>';
+                }
+                if (declinationFromNearestMark > 60 || declinationFromForwardMark == 90) {
+                    direction[2] = '>';
+                }
+                if (declinationFromNearestMark < 0) {
+                    direction[2] = '<';
+                }
+                if (declinationFromNearestMark < -30) {
+                    direction[4] = '<';
+                }
+                if (declinationFromNearestMark < -60 || declinationFromForwardMark == -90) {
+                    direction[6] = '<';
+                }
+            }
+
+            GFX_write_string_color(&FontT48, &t7l3, direction, 1, colour);
+        }
+
+        break;
     }
-    headerText[3] = 0;
+
+    if (headerText[2] != TXT_2BYTE) {
+        headerText[3] = 0;
+    } else {
+        headerText[4] = 0;
+    }
 
     if(tinyHeaderFont)
         GFX_write_string(&FontT24,&t7l3,headerText,0);
--- a/Discovery/Src/tMenuEditCustom.c	Fri Mar 03 10:41:44 2023 +0100
+++ b/Discovery/Src/tMenuEditCustom.c	Mon Mar 06 16:03:00 2023 +0100
@@ -175,6 +175,11 @@
     	text[4] = TXT_SimPpo2;
     	    	break;
 #endif
+    case LLC_Compass:
+        text[4] = TXT_2BYTE;
+        text[5] = TXT2BYTE_Compass;
+
+        break;
     /* none */
     case LLC_Empty:
         text[4] = '-';
@@ -183,7 +188,12 @@
     	 text[4] = 'X';
     break;
     }
-    text[5] = 0;
+    if (text[4] != TXT_2BYTE) {
+        text[5] = 0;
+    } else {
+        text[6] = 0;
+    }
+
     write_label_var(  30, 700, ME_Y_LINE6, &FontT48, text);
 
     write_buttonTextline(TXT2BYTE_ButtonBack,TXT2BYTE_ButtonEnter,TXT2BYTE_ButtonNext);