implement oscillating screensaver

this implementation avoids the display content jumping the full
screensaver offset from right to left when the modulo operator
wraps. this change makes the display content walk from right to
left as it did walk from left to right.
This commit is contained in:
Bernhard Kirchen 2024-02-10 17:07:31 +01:00
parent 21ec72f4c0
commit 6036d8efea

View File

@ -103,27 +103,23 @@ void DisplayGraphicClass::printText(const char* text, const uint8_t line)
if (!_isLarge) { if (!_isLarge) {
dispX = (line == 0) ? 5 : 0; dispX = (line == 0) ? 5 : 0;
} else { } else {
switch (line) { if (line == 0 && _diagram_mode == DiagramMode_t::Small) {
case 0:
if (_diagram_mode == DiagramMode_t::Small) {
// Center between left border and diagram // Center between left border and diagram
dispX = (CHART_POSX - _display->getStrWidth(text)) / 2; dispX = (CHART_POSX - _display->getStrWidth(text)) / 2;
} else { } else {
// Center on screen // Center on screen
dispX = (_display->getDisplayWidth() - _display->getStrWidth(text)) / 2; dispX = (_display->getDisplayWidth() - _display->getStrWidth(text)) / 2;
} }
break;
case 3:
// Center on screen
dispX = (_display->getDisplayWidth() - _display->getStrWidth(text)) / 2;
break;
default:
dispX = 5;
break;
}
} }
dispX += enableScreensaver ? (_mExtra % 7) : 0; if (enableScreensaver) {
unsigned maxOffset = (_isLarge?8:6);
unsigned period = 2 * maxOffset;
unsigned step = _mExtra % period;
int offset = (step <= maxOffset)?step:(period - step);
offset -= (_isLarge?5:0); // oscillate around center on large screens
dispX += offset;
}
_display->drawStr(dispX, _lineOffsets[line], text); _display->drawStr(dispX, _lineOffsets[line], text);
} }