From cf9ae1e767c17d84cfb75a1d4ad74a807da3102e Mon Sep 17 00:00:00 2001 From: norbert-walter Date: Sun, 10 Apr 2022 19:00:13 +0200 Subject: [PATCH] Backup --- lib/obp60task/PageClock.cpp | 1 + lib/obp60task/PageRollPitch.cpp | 292 ++++++++++++++++++++++++++++++++ lib/obp60task/config.json | 20 +-- lib/obp60task/obp60task.cpp | 2 + 4 files changed, 305 insertions(+), 10 deletions(-) create mode 100644 lib/obp60task/PageRollPitch.cpp diff --git a/lib/obp60task/PageClock.cpp b/lib/obp60task/PageClock.cpp index 4fad454..c6f120d 100644 --- a/lib/obp60task/PageClock.cpp +++ b/lib/obp60task/PageClock.cpp @@ -265,6 +265,7 @@ public: if(hour > 12) hour = hour - 12.0; minute = (hour - int(hour)) * 3600.0 / 60.0; LOG_DEBUG(GwLog::DEBUG,"... PageClock, value1: %f hour: %f minute:%f", value1, hour, minute); + // Draw hour pointer float startwidth = 8; // Start width of pointer if(valid1 == true || holdvalues == true || simulation == true){ diff --git a/lib/obp60task/PageRollPitch.cpp b/lib/obp60task/PageRollPitch.cpp new file mode 100644 index 0000000..cfd9660 --- /dev/null +++ b/lib/obp60task/PageRollPitch.cpp @@ -0,0 +1,292 @@ +#ifdef BOARD_NODEMCU32S_OBP60 + +#include "Pagedata.h" +#include "OBP60Extensions.h" + +class PageRollPitch : public Page +{ +bool keylock = false; // Keylock + +public: + PageRollPitch(CommonData &common){ + common.logger->logDebug(GwLog::LOG,"Show PageRollPitch"); + } + + // Key functions + virtual int handleKey(int key){ + // Keylock function + if(key == 11){ // Code for keylock + keylock = !keylock; // Toggle keylock + return 0; // Commit the key + } + return key; + } + + virtual void displayPage(CommonData &commonData, PageData &pageData) + { + GwConfigHandler *config = commonData.config; + GwLog *logger=commonData.logger; + + static String svalue1old = ""; + static String unit1old = ""; + static String svalue2old = ""; + static String unit2old = ""; + + double value1 = 0; + double value2 = 0; + + // Get config data + String lengthformat = config->getString(config->lengthFormat); + bool simulation = config->getBool(config->useSimuData); + String displaycolor = config->getString(config->displaycolor); + bool holdvalues = config->getBool(config->holdvalues); + String flashLED = config->getString(config->flashLED); + String backlightMode = config->getString(config->backlight); + String stimezone = config->getString(config->timeZone); + double timezone = stimezone.toDouble(); + + // Get boat values for GPS time + GwApi::BoatValue *bvalue1 = pageData.values[0]; // First element in list (only one value by PageOneValue) + String name1 = bvalue1->getName().c_str(); // Value name + name1 = name1.substring(0, 6); // String length limit for value name + if(simulation == false){ + value1 = bvalue1->value; // Value as double in SI unit + } + else{ + value1 = 38160; // Simulation data for time value 11:36 in seconds + } // Other simulation data see OBP60Formater.cpp + bool valid1 = bvalue1->valid; // Valid information + String svalue1 = formatValue(bvalue1, commonData).svalue; // Formatted value as string including unit conversion and switching decimal places + String unit1 = formatValue(bvalue1, commonData).unit; // Unit of value + if(valid1 == true){ + svalue1old = svalue1; // Save old value + unit1old = unit1; // Save old unit + } + + // Get boat values for GPS date + GwApi::BoatValue *bvalue2 = pageData.values[1]; // First element in list (only one value by PageOneValue) + String name2 = bvalue2->getName().c_str(); // Value name + name2 = name2.substring(0, 6); // String length limit for value name + value2 = bvalue2->value; // Value as double in SI unit + bool valid2 = bvalue2->valid; // Valid information + String svalue2 = formatValue(bvalue2, commonData).svalue; // Formatted value as string including unit conversion and switching decimal places + String unit2 = formatValue(bvalue2, commonData).unit; // Unit of value + if(valid2 == true){ + svalue2old = svalue2; // Save old value + unit2old = unit2; // Save old unit + } + + // Optical warning by limit violation (unused) + if(String(flashLED) == "Limit Violation"){ + setBlinkingLED(false); + setPortPin(OBP_FLASH_LED, false); + } + + // Logging boat values + if (bvalue1 == NULL) return; + LOG_DEBUG(GwLog::LOG,"Drawing at PageRollPitch, %s:%f, %s:%f", name1, value1, name2, value2); + + // Draw page + //*********************************************************** + + // Set background color and text color + int textcolor = GxEPD_BLACK; + int pixelcolor = GxEPD_BLACK; + int bgcolor = GxEPD_WHITE; + if(displaycolor == "Normal"){ + textcolor = GxEPD_BLACK; + pixelcolor = GxEPD_BLACK; + bgcolor = GxEPD_WHITE; + } + else{ + textcolor = GxEPD_WHITE; + pixelcolor = GxEPD_WHITE; + bgcolor = GxEPD_BLACK; + } + // Clear display by call in obp60task.cpp in main loop + + // Horizintal separator left + display.fillRect(0, 149, 60, 3, pixelcolor); + + // Show values GPS time + display.setTextColor(textcolor); + if(holdvalues == false){ + display.setFont(&Ubuntu_Bold8pt7b); + display.setCursor(10, 250); + display.print(svalue1); // Value + display.setFont(&Ubuntu_Bold12pt7b); + display.setCursor(10, 220); + display.print("Roll"); // Name + } + else{ + display.setFont(&Ubuntu_Bold8pt7b); + display.setCursor(10, 250); + display.print(svalue1old); // Value + display.setFont(&Ubuntu_Bold12pt7b); + display.setCursor(10, 220); + display.print("ROLL"); // Name + } + + // Horizintal separator right + display.fillRect(340, 149, 80, 3, pixelcolor); + + // Show values sunset + String sunset = "---"; + if(valid1 == true && valid2 == true){ + sunset = String(commonData.sundata.sunsetHour) + ":" + String(commonData.sundata.sunsetMinute + 100).substring(1); + } + + display.setTextColor(textcolor); + display.setFont(&Ubuntu_Bold8pt7b); + display.setCursor(335, 250); + display.print(sunset); // Value + display.setFont(&Ubuntu_Bold12pt7b); + display.setCursor(335, 220); + display.print("Pitch"); // Name + +//******************************************************************************************* + + // Draw clock + int rInstrument = 100; // Radius of instrument + float pi = 3.141592; + + display.fillCircle(200, 150, rInstrument + 10, pixelcolor); // Outer circle + display.fillCircle(200, 150, rInstrument + 7, bgcolor); // Outer circle + + for(int i=0; i<360; i=i+10) + { + // Only scaling +/- 60 degrees + if((i >= 0 && i <= 60) || (i >= 300 && i <= 360)){ + // Scaling values + float x = 200 + (rInstrument+25)*sin(i/180.0*pi); // x-coordinate dots + float y = 150 - (rInstrument+25)*cos(i/180.0*pi); // y-coordinate cots + const char *ii = ""; + switch (i) + { + case 0: ii="0"; break; + case 20 : ii="20"; break; + case 40 : ii="40"; break; + case 60 : ii="60"; break; + case 300 : ii="60"; break; + case 320 : ii="40"; break; + case 340 : ii="20"; break; + default: break; + } + + // Print text centered on position x, y + int16_t x1, y1; // Return values of getTextBounds + uint16_t w, h; // Return values of getTextBounds + display.getTextBounds(ii, int(x), int(y), &x1, &y1, &w, &h); // Calc width of new string + display.setCursor(x-w/2, y+h/2); + if(i % 20 == 0){ + display.setFont(&Ubuntu_Bold8pt7b); + display.print(ii); + } + + // Draw sub scale with dots + float x1c = 200 + rInstrument*sin(i/180.0*pi); + float y1c = 150 - rInstrument*cos(i/180.0*pi); + display.fillCircle((int)x1c, (int)y1c, 2, pixelcolor); + float sinx=sin(i/180.0*pi); + float cosx=cos(i/180.0*pi); + + // Draw sub scale with lines (two triangles) + if(i % 20 == 0){ + float dx=2; // Line thickness = 2*dx+1 + float xx1 = -dx; + float xx2 = +dx; + float yy1 = -(rInstrument-10); + float yy2 = -(rInstrument+10); + display.fillTriangle(200+(int)(cosx*xx1-sinx*yy1),150+(int)(sinx*xx1+cosx*yy1), + 200+(int)(cosx*xx2-sinx*yy1),150+(int)(sinx*xx2+cosx*yy1), + 200+(int)(cosx*xx1-sinx*yy2),150+(int)(sinx*xx1+cosx*yy2),pixelcolor); + display.fillTriangle(200+(int)(cosx*xx2-sinx*yy1),150+(int)(sinx*xx2+cosx*yy1), + 200+(int)(cosx*xx1-sinx*yy2),150+(int)(sinx*xx1+cosx*yy2), + 200+(int)(cosx*xx2-sinx*yy2),150+(int)(sinx*xx2+cosx*yy2),pixelcolor); + } + } + } + + // RollPitch values + double hour = 0; + double minute = 0; + value1 = value1 + int(timezone*3600); + if (value1 > 86400) {value1 = value1 - 86400;} + if (value1 < 0) {value1 = value1 + 86400;} + hour = (value1 / 3600.0); + if(hour > 12) hour = hour - 12.0; + minute = (hour - int(hour)) * 3600.0 / 60.0; + LOG_DEBUG(GwLog::DEBUG,"... PageRollPitch, value1: %f hour: %f minute:%f", value1, hour, minute); + + // Draw roll pointer + int startwidth = 4; // Start width of pointer + if(valid1 == true || holdvalues == true || simulation == true){ + float sinx=sin(minute * 6.0 * pi / 180); // Minute + float cosx=cos(minute * 6.0 * pi / 180); + // Normal pointer + // Pointer as triangle with center base 2*width + float xx1 = -startwidth; + float xx2 = startwidth; + float yy1 = -startwidth; + float yy2 = -(rInstrument - 15); + display.fillTriangle(200+(int)(cosx*xx1-sinx*yy1),150+(int)(sinx*xx1+cosx*yy1), + 200+(int)(cosx*xx2-sinx*yy1),150+(int)(sinx*xx2+cosx*yy1), + 200+(int)(cosx*0-sinx*yy2),150+(int)(sinx*0+cosx*yy2),pixelcolor); + // Inverted pointer + // Pointer as triangle with center base 2*width + float endwidth = 2; // End width of pointer + float ix1 = endwidth; + float ix2 = -endwidth; + float iy1 = -(rInstrument - 15); + float iy2 = -endwidth; + display.fillTriangle(200+(int)(cosx*ix1-sinx*iy1),150+(int)(sinx*ix1+cosx*iy1), + 200+(int)(cosx*ix2-sinx*iy1),150+(int)(sinx*ix2+cosx*iy1), + 200+(int)(cosx*0-sinx*iy2),150+(int)(sinx*0+cosx*iy2),pixelcolor); + } + + // Center circle + display.fillCircle(200, 150, startwidth + 6, bgcolor); + display.fillCircle(200, 150, startwidth + 4, pixelcolor); + +//******************************************************************************************* + // Key Layout + display.setTextColor(textcolor); + display.setFont(&Ubuntu_Bold8pt7b); + if(keylock == false){ + display.setCursor(130, 290); + display.print("[ <<<< " + String(commonData.data.actpage) + "/" + String(commonData.data.maxpage) + " >>>> ]"); + if(String(backlightMode) == "Control by Key"){ // Key for illumination + display.setCursor(343, 290); + display.print("[ILUM]"); + } + } + else{ + display.setCursor(130, 290); + display.print(" [ Keylock active ]"); + } + + // Update display + display.updateWindow(0, 0, GxEPD_WIDTH, GxEPD_HEIGHT, true); // Partial update (fast) + + }; +}; + +static Page *createPage(CommonData &common){ + return new PageRollPitch(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 (0 here) + * and will will provide the names of the fixed values we need + */ +PageDescription registerPageRollPitch( + "RollPitch", // Page name + createPage, // Action + 0, // Number of bus values depends on selection in Web configuration + {"GPST", "GPSD"}, // Bus values we need in the page + true // Show display header on/off +); + +#endif \ No newline at end of file diff --git a/lib/obp60task/config.json b/lib/obp60task/config.json index b501302..bcec793 100644 --- a/lib/obp60task/config.json +++ b/lib/obp60task/config.json @@ -684,7 +684,7 @@ "type": "list", "default": "Voltage", "description": "Type of page for page 1", - "list":["OneValue","TwoValues","ThreeValues","FourValues","FourValues2","ApparentWind","WindRose","Voltage","DST810","Clock","WhitePage","BME280","RudderPosition","KeelPosition","Battery","Battery2"], + "list":["OneValue","TwoValues","ThreeValues","FourValues","FourValues2","ApparentWind","WindRose","Voltage","DST810","Clock","WhitePage","BME280","RudderPosition","KeelPosition","Battery","Battery2","RollPitch"], "category": "OBP60 Page 1", "capabilities": { "obp60":"true" @@ -744,7 +744,7 @@ "type": "list", "default": "ApparentWind", "description": "Type of page for page 2", - "list":["OneValue","TwoValues","ThreeValues","FourValues","FourValues2","ApparentWind","WindRose","Voltage","DST810","Clock","WhitePage","BME280","RudderPosition","KeelPosition","Battery","Battery2"], + "list":["OneValue","TwoValues","ThreeValues","FourValues","FourValues2","ApparentWind","WindRose","Voltage","DST810","Clock","WhitePage","BME280","RudderPosition","KeelPosition","Battery","Battery2","RollPitch"], "category": "OBP60 Page 2", "capabilities": { "obp60":"true" @@ -805,7 +805,7 @@ "type": "list", "default": "OneValue", "description": "Type of page for page 3", - "list":["OneValue","TwoValues","ThreeValues","FourValues","FourValues2","ApparentWind","WindRose","Voltage","DST810","Clock","WhitePage","BME280","RudderPosition","KeelPosition","Battery","Battery2"], + "list":["OneValue","TwoValues","ThreeValues","FourValues","FourValues2","ApparentWind","WindRose","Voltage","DST810","Clock","WhitePage","BME280","RudderPosition","KeelPosition","Battery","Battery2","RollPitch"], "category": "OBP60 Page 3", "capabilities": { "obp60":"true" @@ -866,7 +866,7 @@ "type": "list", "default": "OneValue", "description": "Type of page for page 4", - "list":["OneValue","TwoValues","ThreeValues","FourValues","FourValues2","ApparentWind","WindRose","Voltage","DST810","Clock","WhitePage","BME280","RudderPosition","KeelPosition","Battery","Battery2"], + "list":["OneValue","TwoValues","ThreeValues","FourValues","FourValues2","ApparentWind","WindRose","Voltage","DST810","Clock","WhitePage","BME280","RudderPosition","KeelPosition","Battery","Battery2","RollPitch"], "category": "OBP60 Page 4", "capabilities": { "obp60":"true" @@ -927,7 +927,7 @@ "type": "list", "default": "OneValue", "description": "Type of page for page 5", - "list":["OneValue","TwoValues","ThreeValues","FourValues","FourValues2","ApparentWind","WindRose","Voltage","DST810","Clock","WhitePage","BME280","RudderPosition","KeelPosition","Battery","Battery2"], + "list":["OneValue","TwoValues","ThreeValues","FourValues","FourValues2","ApparentWind","WindRose","Voltage","DST810","Clock","WhitePage","BME280","RudderPosition","KeelPosition","Battery","Battery2","RollPitch"], "category": "OBP60 Page 5", "capabilities": { "obp60":"true" @@ -988,7 +988,7 @@ "type": "list", "default": "OneValue", "description": "Type of page for page 6", - "list":["OneValue","TwoValues","ThreeValues","FourValues","FourValues2","ApparentWind","WindRose","Voltage","DST810","Clock","WhitePage","BME280","RudderPosition","KeelPosition","Battery","Battery2"], + "list":["OneValue","TwoValues","ThreeValues","FourValues","FourValues2","ApparentWind","WindRose","Voltage","DST810","Clock","WhitePage","BME280","RudderPosition","KeelPosition","Battery","Battery2","RollPitch"], "category": "OBP60 Page 6", "capabilities": { "obp60":"true" @@ -1049,7 +1049,7 @@ "type": "list", "default": "OneValue", "description": "Type of page for page 7", - "list":["OneValue","TwoValues","ThreeValues","FourValues","FourValues2","ApparentWind","WindRose","Voltage","DST810","Clock","WhitePage","BME280","RudderPosition","KeelPosition","Battery","Battery2"], + "list":["OneValue","TwoValues","ThreeValues","FourValues","FourValues2","ApparentWind","WindRose","Voltage","DST810","Clock","WhitePage","BME280","RudderPosition","KeelPosition","Battery","Battery2","RollPitch"], "category": "OBP60 Page 7", "capabilities": { "obp60":"true" @@ -1110,7 +1110,7 @@ "type": "list", "default": "OneValue", "description": "Type of page for page 8", - "list":["OneValue","TwoValues","ThreeValues","FourValues","FourValues2","ApparentWind","WindRose","Voltage","DST810","Clock","WhitePage","BME280","RudderPosition","KeelPosition","Battery","Battery2"], + "list":["OneValue","TwoValues","ThreeValues","FourValues","FourValues2","ApparentWind","WindRose","Voltage","DST810","Clock","WhitePage","BME280","RudderPosition","KeelPosition","Battery","Battery2","RollPitch"], "category": "OBP60 Page 8", "capabilities": { "obp60":"true" @@ -1171,7 +1171,7 @@ "type": "list", "default": "OneValue", "description": "Type of page for page 9", - "list":["OneValue","TwoValues","ThreeValues","FourValues","FourValues2","ApparentWind","WindRose","Voltage","DST810","Clock","WhitePage","BME280","RudderPosition","KeelPosition","Battery","Battery2"], + "list":["OneValue","TwoValues","ThreeValues","FourValues","FourValues2","ApparentWind","WindRose","Voltage","DST810","Clock","WhitePage","BME280","RudderPosition","KeelPosition","Battery","Battery2","RollPitch"], "category": "OBP60 Page 9", "capabilities": { "obp60":"true" @@ -1232,7 +1232,7 @@ "type": "list", "default": "OneValue", "description": "Type of page for page 10", - "list":["OneValue","TwoValues","ThreeValues","FourValues","FourValues2","ApparentWind","WindRose","Voltage","DST810","Clock","WhitePage","BME280","RudderPosition","KeelPosition","Battery","Battery2"], + "list":["OneValue","TwoValues","ThreeValues","FourValues","FourValues2","ApparentWind","WindRose","Voltage","DST810","Clock","WhitePage","BME280","RudderPosition","KeelPosition","Battery","Battery2","RollPitch"], "category": "OBP60 Page 10", "capabilities": { "obp60":"true" diff --git a/lib/obp60task/obp60task.cpp b/lib/obp60task/obp60task.cpp index aaff823..07af3ee 100644 --- a/lib/obp60task/obp60task.cpp +++ b/lib/obp60task/obp60task.cpp @@ -210,6 +210,8 @@ void registerAllPages(PageList &list){ list.add(®isterPageBattery); extern PageDescription registerPageBattery2; list.add(®isterPageBattery2); + extern PageDescription registerPageRollPitch; + list.add(®isterPageRollPitch); } // OBP60 Task