From d1c620a85839b2f104f99ae5a7cb74adf3d99081 Mon Sep 17 00:00:00 2001 From: norbert-walter Date: Fri, 4 Jul 2025 14:11:22 +0200 Subject: [PATCH] Fix for compass page --- lib/obp60task/PageCompass.cpp | 311 ++++++++++++++++---------------- lib/obp60task/config_obp40.json | 10 + lib/obp60task/obp60task.cpp | 2 + 3 files changed, 167 insertions(+), 156 deletions(-) diff --git a/lib/obp60task/PageCompass.cpp b/lib/obp60task/PageCompass.cpp index 003577c..691cf8f 100644 --- a/lib/obp60task/PageCompass.cpp +++ b/lib/obp60task/PageCompass.cpp @@ -19,8 +19,8 @@ const int ShowDBS = 5; const int Compass_X0 = 200; // center point of compass band const int Compass_Y0 = 220; // position of compass lines -const int Compass_LineLength = 22; // length of compass lines -const float Compass_LineDelta = 8.0; // compass band: 1deg = 5 Pixels, 10deg = 50 Pixels +const int Compass_LineLength = 22; // length of compass lines +const float Compass_LineDelta = 8.0;// compass band: 1deg = 5 Pixels, 10deg = 50 Pixels class PageCompass : public Page { @@ -64,180 +64,179 @@ class PageCompass : public Page virtual void displayPage(PageData &pageData){ GwConfigHandler *config = commonData->config; GwLog *logger = commonData->logger; + + // Old values for hold function + static String OldDataText[HowManyValues] = {"", "", "","", "", ""}; + static String OldDataUnits[HowManyValues] = {"", "", "","", "", ""}; - - // Old values for hold function - static String OldDataText[HowManyValues] = {"", "", "","", "", ""}; - static String OldDataUnits[HowManyValues] = {"", "", "","", "", ""}; - - // Get config data - String lengthformat = config->getString(config->lengthFormat); - // bool simulation = config->getBool(config->useSimuData); - bool holdvalues = config->getBool(config->holdvalues); - String flashLED = config->getString(config->flashLED); - String backlightMode = config->getString(config->backlight); - - GwApi::BoatValue *bvalue; - String DataName[HowManyValues]; - double DataValue[HowManyValues]; - bool DataValid[HowManyValues]; - String DataText[HowManyValues]; - String DataUnits[HowManyValues]; - String DataFormat[HowManyValues]; - FormatedData TheFormattedData; - - for (int i = 0; i < HowManyValues; i++){ - bvalue = pageData.values[i]; - TheFormattedData = formatValue(bvalue, *commonData); - DataName[i] = xdrDelete(bvalue->getName()); - DataName[i] = DataName[i].substring(0, 6); // String length limit for value name - DataUnits[i] = formatValue(bvalue, *commonData).unit; - DataText[i] = TheFormattedData.svalue; // Formatted value as string including unit conversion and switching decimal places - DataValue[i] = TheFormattedData.value; // Value as double in SI unit - DataValid[i] = bvalue->valid; - DataFormat[i] = bvalue->getFormat(); // Unit of value - LOG_DEBUG(GwLog::LOG,"Drawing at PageCompass: %d %s %f %s %s", i, DataName[i], DataValue[i], DataFormat[i], DataText[i] ); - } + // Get config data + String lengthformat = config->getString(config->lengthFormat); + // bool simulation = config->getBool(config->useSimuData); + bool holdvalues = config->getBool(config->holdvalues); + String flashLED = config->getString(config->flashLED); + String backlightMode = config->getString(config->backlight); + + GwApi::BoatValue *bvalue; + String DataName[HowManyValues]; + double DataValue[HowManyValues]; + bool DataValid[HowManyValues]; + String DataText[HowManyValues]; + String DataUnits[HowManyValues]; + String DataFormat[HowManyValues]; + FormatedData TheFormattedData; - // Optical warning by limit violation (unused) - if(String(flashLED) == "Limit Violation"){ - setBlinkingLED(false); - setFlashLED(false); - } - - if (bvalue == NULL) return; - - //*********************************************************** - - // Set display in partial refresh mode - getdisplay().setPartialWindow(0, 0, getdisplay().width(), getdisplay().height()); // Set partial update - getdisplay().setTextColor(commonData->fgcolor); + for (int i = 0; i < HowManyValues; i++){ + bvalue = pageData.values[i]; + TheFormattedData = formatValue(bvalue, *commonData); + DataName[i] = xdrDelete(bvalue->getName()); + DataName[i] = DataName[i].substring(0, 6); // String length limit for value name + DataUnits[i] = formatValue(bvalue, *commonData).unit; + DataText[i] = TheFormattedData.svalue; // Formatted value as string including unit conversion and switching decimal places + DataValue[i] = TheFormattedData.value; // Value as double in SI unit + DataValid[i] = bvalue->valid; + DataFormat[i] = bvalue->getFormat(); // Unit of value + LOG_DEBUG(GwLog::LOG,"Drawing at PageCompass: %d %s %f %s %s", i, DataName[i], DataValue[i], DataFormat[i], DataText[i] ); + } - // Horizontal line 3 pix top & bottom - // print Data on top half - getdisplay().fillRect(0, 23, 400, 3, commonData->fgcolor); - getdisplay().setFont(&Ubuntu_Bold20pt7b); - getdisplay().setCursor(10, 70); - getdisplay().print(DataName[WhichDataDisplay]); // Page name - // Show unit - getdisplay().setFont(&Ubuntu_Bold12pt7b); - getdisplay().setCursor(10, 120); - getdisplay().print(DataUnits[WhichDataDisplay]); - getdisplay().setCursor(200, 120); - getdisplay().setFont(&DSEG7Classic_BoldItalic42pt7b); + // Optical warning by limit violation (unused) + if(String(flashLED) == "Limit Violation"){ + setBlinkingLED(false); + setFlashLED(false); + } + + if (bvalue == NULL) return; + + //*********************************************************** + + // Set display in partial refresh mode + getdisplay().setPartialWindow(0, 0, getdisplay().width(), getdisplay().height()); // Set partial update + getdisplay().setTextColor(commonData->fgcolor); + + // Horizontal line 2 pix top & bottom + // Print data on top half + getdisplay().fillRect(0, 130, 400, 2, commonData->fgcolor); + getdisplay().setFont(&Ubuntu_Bold20pt7b); + getdisplay().setCursor(10, 70); + getdisplay().print(DataName[WhichDataDisplay]); // Page name + // Show unit + getdisplay().setFont(&Ubuntu_Bold12pt7b); + getdisplay().setCursor(10, 120); + getdisplay().print(DataUnits[WhichDataDisplay]); + getdisplay().setCursor(190, 120); + getdisplay().setFont(&DSEG7Classic_BoldItalic42pt7b); - if(holdvalues == false){ - getdisplay().print(DataText[WhichDataDisplay]); // Real value as formated string + if(holdvalues == false){ + getdisplay().print(DataText[WhichDataDisplay]); // Real value as formated string } else{ - getdisplay().print(OldDataText[WhichDataDisplay]); // Old value as formated string + getdisplay().print(OldDataText[WhichDataDisplay]); // Old value as formated string } if(DataValid[WhichDataDisplay] == true){ - OldDataText[WhichDataDisplay] = DataText[WhichDataDisplay]; // Save the old value - OldDataUnits[WhichDataDisplay] = DataUnits[WhichDataDisplay]; // Save the old unit - } - // now draw compass band - // get the data - double TheAngle = DataValue[WhichDataCompass]; - static double AvgAngle = 0; - AvgAngle = ( AvgAngle * AverageValues + TheAngle ) / (AverageValues + 1 ); + OldDataText[WhichDataDisplay] = DataText[WhichDataDisplay]; // Save the old value + OldDataUnits[WhichDataDisplay] = DataUnits[WhichDataDisplay]; // Save the old unit + } - int TheTrend = round( ( TheAngle - AvgAngle) * 180.0 / M_PI ); - - static const int bsize = 30; - char buffer[bsize+1]; - buffer[0]=0; - - getdisplay().setFont(&Ubuntu_Bold16pt7b); - getdisplay().setCursor(10, Compass_Y0-60); - getdisplay().print(DataName[WhichDataCompass]); // Page name + // Now draw compass band + // Get the data + double TheAngle = DataValue[WhichDataCompass]; + static double AvgAngle = 0; + AvgAngle = ( AvgAngle * AverageValues + TheAngle ) / (AverageValues + 1 ); + + int TheTrend = round( ( TheAngle - AvgAngle) * 180.0 / M_PI ); + + static const int bsize = 30; + char buffer[bsize+1]; + buffer[0]=0; + + getdisplay().setFont(&Ubuntu_Bold16pt7b); + getdisplay().setCursor(10, Compass_Y0-60); + getdisplay().print(DataName[WhichDataCompass]); // Page name - // draw compass base line and pointer - getdisplay().fillRect(0, Compass_Y0, 400, 3, commonData->fgcolor); - getdisplay().fillTriangle(Compass_X0,Compass_Y0-40,Compass_X0-10,Compass_Y0-80,Compass_X0+10,Compass_Y0-80,commonData->fgcolor); -// draw trendlines - for ( int i = 1; i < abs(TheTrend) / 2; i++){ - int x1; - if ( TheTrend < 0 ) - x1 = Compass_X0 + 20 * i; - else - x1 = Compass_X0 - 20 * ( i + 1 ); + // Draw compass base line and pointer + getdisplay().fillRect(0, Compass_Y0, 400, 3, commonData->fgcolor); + getdisplay().fillTriangle(Compass_X0,Compass_Y0-40,Compass_X0-10,Compass_Y0-80,Compass_X0+10,Compass_Y0-80,commonData->fgcolor); + // Draw trendlines + for ( int i = 1; i < abs(TheTrend) / 2; i++){ + int x1; + if ( TheTrend < 0 ) + x1 = Compass_X0 + 20 * i; + else + x1 = Compass_X0 - 20 * ( i + 1 ); - getdisplay().fillRect(x1, Compass_Y0 -60, 10, 6, commonData->fgcolor); - } -// central line + satellite lines - double NextSector = round(TheAngle / ( M_PI / 9 )) * ( M_PI / 9 ); // get the next 20degree value - double Offset = - ( NextSector - TheAngle); // offest of the center line compared to TheAngle in Radian - - int Delta_X = int ( Offset * 180.0 / M_PI * Compass_LineDelta ); - for ( int i = 0; i <=4; i++ ) - { - int x0; - x0 = Compass_X0 + Delta_X + 2 * i * 5 * Compass_LineDelta; - getdisplay().fillRect(x0-1, Compass_Y0 - 2 * Compass_LineLength,3, 2 * Compass_LineLength, commonData->fgcolor); - x0 = Compass_X0 + Delta_X + ( 2 * i + 1 ) * 5 * Compass_LineDelta; - getdisplay().fillRect(x0-1, Compass_Y0 - Compass_LineLength,3, Compass_LineLength, commonData->fgcolor); + getdisplay().fillRect(x1, Compass_Y0 -55, 10, 6, commonData->fgcolor); + } + // Central line + satellite lines + double NextSector = round(TheAngle / ( M_PI / 9 )) * ( M_PI / 9 ); // Get the next 20degree value + double Offset = - ( NextSector - TheAngle); // Offest of the center line compared to TheAngle in Radian + + int Delta_X = int ( Offset * 180.0 / M_PI * Compass_LineDelta ); + for ( int i = 0; i <=4; i++ ){ + int x0; + x0 = Compass_X0 + Delta_X + 2 * i * 5 * Compass_LineDelta; + getdisplay().fillRect(x0-2, Compass_Y0 - 2 * Compass_LineLength, 5, 2 * Compass_LineLength, commonData->fgcolor); + x0 = Compass_X0 + Delta_X + ( 2 * i + 1 ) * 5 * Compass_LineDelta; + getdisplay().fillRect(x0-1, Compass_Y0 - Compass_LineLength, 3, Compass_LineLength, commonData->fgcolor); - x0 = Compass_X0 + Delta_X - 2 * i * 5 * Compass_LineDelta; - getdisplay().fillRect(x0-1, Compass_Y0 - 2 * Compass_LineLength,3, 2 * Compass_LineLength, commonData->fgcolor); - x0 = Compass_X0 + Delta_X - ( 2 * i + 1 ) * 5 * Compass_LineDelta; - getdisplay().fillRect(x0-1, Compass_Y0 - Compass_LineLength,3, Compass_LineLength, commonData->fgcolor); - } + x0 = Compass_X0 + Delta_X - 2 * i * 5 * Compass_LineDelta; + getdisplay().fillRect(x0-2, Compass_Y0 - 2 * Compass_LineLength, 5, 2 * Compass_LineLength, commonData->fgcolor); + x0 = Compass_X0 + Delta_X - ( 2 * i + 1 ) * 5 * Compass_LineDelta; + getdisplay().fillRect(x0-1, Compass_Y0 - Compass_LineLength, 3, Compass_LineLength, commonData->fgcolor); + } - getdisplay().fillRect(0, Compass_Y0, 400, 3, commonData->fgcolor); - // add the numbers to the compass band - int x0; - float AngleToDisplay = NextSector * 180.0 / M_PI; + getdisplay().fillRect(0, Compass_Y0, 400, 3, commonData->fgcolor); + // Add the numbers to the compass band + int x0; + float AngleToDisplay = NextSector * 180.0 / M_PI; - x0 = Compass_X0 + Delta_X; - getdisplay().setFont(&DSEG7Classic_BoldItalic16pt7b); + x0 = Compass_X0 + Delta_X; + getdisplay().setFont(&DSEG7Classic_BoldItalic16pt7b); - do { - getdisplay().setCursor(x0 - 40, Compass_Y0 + 40); - snprintf(buffer,bsize,"%03.0f", AngleToDisplay); - getdisplay().print(buffer); - AngleToDisplay += 20; - if ( AngleToDisplay >= 360.0 ) - AngleToDisplay -= 360.0; - x0 -= 4 * 5 * Compass_LineDelta; - } while ( x0 >= 0 - 60 ); - - AngleToDisplay = NextSector * 180.0 / M_PI - 20; + do { + getdisplay().setCursor(x0 - 40, Compass_Y0 + 40); + snprintf(buffer,bsize,"%03.0f", AngleToDisplay); + getdisplay().print(buffer); + AngleToDisplay += 20; + if ( AngleToDisplay >= 360.0 ) + AngleToDisplay -= 360.0; + x0 -= 4 * 5 * Compass_LineDelta; + } while ( x0 >= 0 - 60 ); + + AngleToDisplay = NextSector * 180.0 / M_PI - 20; + if ( AngleToDisplay < 0 ) + AngleToDisplay += 360.0; + + x0 = Compass_X0 + Delta_X + 4 * 5 * Compass_LineDelta; + do { + getdisplay().setCursor(x0 - 40, Compass_Y0 + 40); + snprintf(buffer,bsize,"%03.0f", AngleToDisplay); + // Quick and dirty way to prevent wrapping text in next line + if ( ( x0 - 40 ) > 380 ) + buffer[0] = 0; + else if ( ( x0 - 40 ) > 355 ) + buffer[1] = 0; + else if ( ( x0 - 40 ) > 325 ) + buffer[2] = 0; + + getdisplay().print(buffer); + + AngleToDisplay -= 20; if ( AngleToDisplay < 0 ) AngleToDisplay += 360.0; - - x0 = Compass_X0 + Delta_X + 4 * 5 * Compass_LineDelta; - do { - getdisplay().setCursor(x0 - 40, Compass_Y0 + 40); - snprintf(buffer,bsize,"%03.0f", AngleToDisplay); - // quick and dirty way to prevent wrapping text in next line - if ( ( x0 - 40 ) > 380 ) - buffer[0] = 0; - else if ( ( x0 - 40 ) > 355 ) - buffer[1] = 0; - else if ( ( x0 - 40 ) > 325 ) - buffer[2] = 0; - - getdisplay().print(buffer); - - AngleToDisplay -= 20; - if ( AngleToDisplay < 0 ) - AngleToDisplay += 360.0; - x0 += 4 * 5 * Compass_LineDelta; - } while (x0 < ( 400 - 20 -40 ) ); - - // static int x_test = 320; - // x_test += 2; + x0 += 4 * 5 * Compass_LineDelta; + } while (x0 < ( 400 - 20 -40 ) ); - // snprintf(buffer,bsize,"%03d", x_test); - // getdisplay().setCursor(x_test, Compass_Y0 - 60); - // getdisplay().print(buffer); - // if ( x_test > 390) - // x_test = 320; + // static int x_test = 320; + // x_test += 2; - // Update display - getdisplay().nextPage(); // Partial update (fast) + // snprintf(buffer,bsize,"%03d", x_test); + // getdisplay().setCursor(x_test, Compass_Y0 - 60); + // getdisplay().print(buffer); + // if ( x_test > 390) + // x_test = 320; + + // Update display + getdisplay().nextPage(); // Partial update (fast) }; diff --git a/lib/obp60task/config_obp40.json b/lib/obp60task/config_obp40.json index a03b359..1817e64 100644 --- a/lib/obp60task/config_obp40.json +++ b/lib/obp60task/config_obp40.json @@ -1187,6 +1187,7 @@ "Battery", "Battery2", "Clock", + "Compass", "DST810", "Fluid", "FourValues", @@ -1466,6 +1467,7 @@ "Battery", "Battery2", "Clock", + "Compass", "DST810", "Fluid", "FourValues", @@ -1742,6 +1744,7 @@ "Battery", "Battery2", "Clock", + "Compass", "DST810", "Fluid", "FourValues", @@ -2015,6 +2018,7 @@ "Battery", "Battery2", "Clock", + "Compass", "DST810", "Fluid", "FourValues", @@ -2285,6 +2289,7 @@ "Battery", "Battery2", "Clock", + "Compass", "DST810", "Fluid", "FourValues", @@ -2552,6 +2557,7 @@ "Battery", "Battery2", "Clock", + "Compass", "DST810", "Fluid", "FourValues", @@ -2816,6 +2822,7 @@ "Battery", "Battery2", "Clock", + "Compass", "DST810", "Fluid", "FourValues", @@ -3077,6 +3084,7 @@ "Battery", "Battery2", "Clock", + "Compass", "DST810", "Fluid", "FourValues", @@ -3335,6 +3343,7 @@ "Battery", "Battery2", "Clock", + "Compass", "DST810", "Fluid", "FourValues", @@ -3590,6 +3599,7 @@ "Battery", "Battery2", "Clock", + "Compass", "DST810", "Fluid", "FourValues", diff --git a/lib/obp60task/obp60task.cpp b/lib/obp60task/obp60task.cpp index fb3ef6f..7d25ab6 100644 --- a/lib/obp60task/obp60task.cpp +++ b/lib/obp60task/obp60task.cpp @@ -285,6 +285,8 @@ void registerAllPages(PageList &list){ list.add(®isterPageDST810); extern PageDescription registerPageClock; list.add(®isterPageClock); + extern PageDescription registerPageCompass; + list.add(®isterPageCompass); extern PageDescription registerPageWhite; list.add(®isterPageWhite); extern PageDescription registerPageBME280;