From 93084c980a6597c0fb89e5158b2210860cfe065c Mon Sep 17 00:00:00 2001 From: Ulrich Meine Date: Mon, 31 Aug 2026 16:33:19 +0200 Subject: [PATCH] Enable small decimals on PageOneValue; fix issues on PageSixValues --- lib/obp60task/PageOneValue.cpp | 89 ++++++++++++++++++++------------- lib/obp60task/PageSixValues.cpp | 9 ++-- 2 files changed, 59 insertions(+), 39 deletions(-) diff --git a/lib/obp60task/PageOneValue.cpp b/lib/obp60task/PageOneValue.cpp index fe47a94..b8fd90e 100644 --- a/lib/obp60task/PageOneValue.cpp +++ b/lib/obp60task/PageOneValue.cpp @@ -31,8 +31,11 @@ private: bool useSimuData; bool holdValues; String flashLED; - String backlightMode; - String tempFormat; + bool smallDecimals; + + static constexpr int8_t LEFT = 0; + static constexpr int8_t CENTER = 1; + static constexpr int8_t RIGHT = 2; // Old values for hold function String sValue1Old = ""; @@ -40,38 +43,45 @@ private: // Data buffer pointer (owned by HstryBuffers) RingBuffer* dataHstryBuf = nullptr; - std::unique_ptr dataChart; // Chart object + std::unique_ptr dataChart = nullptr; // Chart object // display data value in display [FULL|HALF] void showData(GwApi::BoatValue* bValue1, DisplayMode mode) { - int nameXoff, nameYoff, unitXoff, unitYoff, value1Xoff, value1Yoff; - const GFXfont *nameFnt, *unitFnt, *valueFnt1, *valueFnt2, *valueFnt3; + int nameXoff, nameYoff, unitX, unitY, unitXoff, unitYoff, valueX, valueY, valueXoff, valueYoff; + const GFXfont *nameFnt, *unitFnt; + int valueFontSize1, valueFontSize2, valueFontSize3, DsegFontSize; if (mode == FULL) { // full size data display nameXoff = 0; nameYoff = 0; nameFnt = &Ubuntu_Bold32pt8b; + unitX = 380; + unitY = 100; unitXoff = 0; unitYoff = 0; unitFnt = &Ubuntu_Bold20pt8b; - value1Xoff = 0; - value1Yoff = 0; - valueFnt1 = &Ubuntu_Bold20pt8b; - valueFnt2 = &Ubuntu_Bold32pt8b; - valueFnt3 = &DSEG7Classic_BoldItalic60pt7b; + valueXoff = 0; + valueYoff = 0; + valueFontSize1 = 20; + valueFontSize2 = 30; + valueFontSize3 = 60; } else { // half size data and chart display nameXoff = -10; nameYoff = -34; nameFnt = &Ubuntu_Bold20pt8b; - unitXoff = -295; - unitYoff = 21; + unitX = 10; + unitY = 121; + // unitXoff = -295; + //unitXoff = -280; + //unitYoff = 21; unitFnt = &Ubuntu_Bold12pt8b; - valueFnt1 = &Ubuntu_Bold12pt8b; - value1Xoff = 111; - value1Yoff = -119; - valueFnt2 = &Ubuntu_Bold20pt8b; - valueFnt3 = &DSEG7Classic_BoldItalic42pt7b; + // value1Xoff = 111; + valueXoff = 0; + valueYoff = -119; + valueFontSize1 = 12; + valueFontSize2 = 20; + valueFontSize3 = 42; } String name1 = xdrDelete(bValue1->getName()); // Value name @@ -88,32 +98,38 @@ private: getdisplay().print(name1); // name // Show unit + String unitName; getdisplay().setFont(unitFnt); - getdisplay().setCursor(305 + unitXoff, 100 + unitYoff); - if (holdValues) { - getdisplay().print(unit1Old); // name + unitName = unit1Old; } else { - getdisplay().print(unit1); // name + unitName = unit1; } + if (mode == FULL) { + drawTextRalign(unitX, unitY, unitName); + } else { + getdisplay().setCursor(unitX, unitY); + getdisplay().print(unitName); + } // Switch font depending on value format and adjust position + valueX = 380 + valueXoff; if (bValue1->getFormat() == "formatLatitude" || bValue1->getFormat() == "formatLongitude") { - getdisplay().setFont(valueFnt1); - getdisplay().setCursor(20 + value1Xoff, 180 + value1Yoff); + valueY = 180 + valueYoff; + DsegFontSize = valueFontSize1; } else if (bValue1->getFormat() == "formatTime" || bValue1->getFormat() == "formatDate") { - getdisplay().setFont(valueFnt2); - getdisplay().setCursor(20 + value1Xoff, 200 + value1Yoff); + valueY = 200 + valueYoff; + DsegFontSize = valueFontSize2; } else { - getdisplay().setFont(valueFnt3); - getdisplay().setCursor(20 + value1Xoff, 240 + value1Yoff); + valueY = 240 + valueYoff; + DsegFontSize = valueFontSize3; } // Show bus data if (!holdValues || useSimuData) { - getdisplay().print(sValue1); // Real value as formated string + printBoatValue(sValue1, valueX, valueY, RIGHT, DsegFontSize, smallDecimals); } else { - getdisplay().print(sValue1Old); // Old value as formated string + printBoatValue(sValue1Old, valueX, valueY, RIGHT, DsegFontSize, smallDecimals); } if (valid1 == true) { @@ -131,14 +147,13 @@ public: width = getdisplay().width(); // Screen width height = getdisplay().height(); // Screen height + getdisplay().setTextWrap(false); // Get config data - // lengthformat = commonData->config->getString(commonData->config->lengthFormat); useSimuData = commonData->config->getBool(commonData->config->useSimuData); holdValues = commonData->config->getBool(commonData->config->holdvalues); flashLED = commonData->config->getString(commonData->config->flashLED); - backlightMode = commonData->config->getString(commonData->config->backlight); - tempFormat = commonData->config->getString(commonData->config->tempFormat); // [K|°C|°F] + smallDecimals = commonData->config->getBool(commonData->config->smallDecimals); } virtual void setupKeys() @@ -233,9 +248,9 @@ public: if (dataHstryBuf) { dataChart.reset(new Chart(*dataHstryBuf, *commonData, useSimuData)); - LOG_DEBUG(GwLog::DEBUG, "PageOneValue: Created chart objects for %s", bValName1); + LOG_DEBUG(GwLog::DEBUG, "PageOneValue: Created chart object for %s", bValName1); } else { - LOG_DEBUG(GwLog::DEBUG, "PageOneValue: No chart objects available for %s", bValName1); + LOG_DEBUG(GwLog::DEBUG, "PageOneValue: No chart object available for %s", bValName1); } } @@ -265,8 +280,10 @@ public: displaySetPartialWindow(0, 0, width, height); // Set partial update - if (!dataChart->isValid()) { - dataChart->init(); // try late initialization if chart object could not be properly initialized earlier due to missing boat data + if (dataChart) { // Check only if dataChart object exist^s at all + if (!dataChart->isValid()) { + dataChart->init(); // try late initialization if chart object could not be properly initialized earlier due to missing boat data + } } if (pageMode == VALUE || dataHstryBuf == nullptr) { diff --git a/lib/obp60task/PageSixValues.cpp b/lib/obp60task/PageSixValues.cpp index 99175f5..d8ad885 100644 --- a/lib/obp60task/PageSixValues.cpp +++ b/lib/obp60task/PageSixValues.cpp @@ -11,11 +11,11 @@ private: bool holdValues; String flashLED; String backlightMode; + bool smallDecimals; static constexpr int8_t LEFT = 0; static constexpr int8_t CENTER = 1; static constexpr int8_t RIGHT = 2; - bool smallDecimals; static constexpr int SixValues_x1 = 5; static constexpr int SixValues_DeltaX = 200; @@ -74,12 +74,13 @@ public: DataFormat[i] = bvalue->getFormat(); // Unit of value } +#ifdef BOARD_OBP60S3 // Optical warning by limit violation (unused) if (String(flashLED) == "Limit Violation") { setBlinkingLED(false); setFlashLED(false); } - +#endif if (bvalue == NULL) return PAGE_OK; @@ -88,6 +89,7 @@ public: // Set display in partial refresh mode displaySetPartialWindow(0, 0, getdisplay().width(), getdisplay().height()); // Set partial update + getdisplay().setTextWrap(false); getdisplay().setTextColor(commonData->fgcolor); for (int i = 0; i < (HowManyValues / 2); i++) { @@ -100,7 +102,8 @@ public: int ValueIndex = i * 2 + j; int x0 = SixValues_x1 + j * SixValues_DeltaX; int y0 = SixValues_y1 + i * SixValues_DeltaY; - LOG_DEBUG(GwLog::DEBUG, "Drawing at PageSixValue: %d %s %f %s %s", ValueIndex, DataName[ValueIndex], DataValue[ValueIndex], DataUnit[ValueIndex], DataFormat[ValueIndex]); + //LOG_DEBUG(GwLog::DEBUG, "Drawing at PageSixValue: %d %s %f %s %s", ValueIndex, DataName[ValueIndex], + // DataValue[ValueIndex], DataUnit[ValueIndex], DataFormat[ValueIndex]); // Show name getdisplay().setFont(&Ubuntu_Bold12pt8b);