1
0
mirror of https://github.com/DCC-EX/CommandStation-EX.git synced 2024-11-30 03:26:13 +01:00

Bugfix Scroll LCD without empty lines and consistent

This commit is contained in:
Harald Barth 2023-03-15 16:41:02 +01:00
parent 3d35e78533
commit 278347756a
4 changed files with 65 additions and 35 deletions

View File

@ -129,39 +129,76 @@ Display *Display::loop2(bool force) {
// No non-blank lines left, so draw a blank line // No non-blank lines left, so draw a blank line
buffer[0] = 0; buffer[0] = 0;
} }
_deviceDriver->setRowNative(slot); // Set position for display #if SCROLLMODE==2
charIndex = 0; if (buffer[0] == 0 && needScroll){ // surpresses empty line
bufferPointer = &buffer[0]; #else
if (false){
#endif
charIndex = MAX_CHARACTER_COLS;
slot--;
} else {
_deviceDriver->setRowNative(slot); // Set position for display
charIndex = 0;
bufferPointer = &buffer[0];
}
rowNext++;
} else { } else {
// Write next character, or a space to erase current position. // Write next character, or a space to erase current position.
char ch = *bufferPointer; char ch = *bufferPointer;
if (ch) { if (ch) {
_deviceDriver->writeNative(ch); _deviceDriver->writeNative(ch);
bufferPointer++; bufferPointer++;
} else { } else {
_deviceDriver->writeNative(' '); _deviceDriver->writeNative(' ');
} }
}
if (++charIndex >= MAX_CHARACTER_COLS) { if (++charIndex >= MAX_CHARACTER_COLS) {
// Screen slot completed, move to next slot on screen // Screen slot completed, move to next slot on screen
bufferPointer = 0; bufferPointer = 0;
slot++; slot++;
if (slot >= numCharacterRows) { if (slot >= numCharacterRows) {
// Last slot on screen written, reset ready for next screen update. // Last slot on screen written, reset ready for next screen update.
#if SCROLLMODE==2 || SCROLLMODE==1
if (!noMoreRowsToDisplay) {
needScroll = true;
}
if (needScroll) {
#if SCROLLMODE==2 #if SCROLLMODE==2
if (!noMoreRowsToDisplay) { // SCROLLMODE 2 rotates through rowFirst and we
// On next refresh, restart one row on from previous start. // (ab)use findNextBlankRow() to figure out
rowNext = rowFirst; // next valid row which can be start row.
findNextNonBlankRow(); rowNext = rowFirst + 1;
} noMoreRowsToDisplay = false;
findNextNonBlankRow();
if (rowNext == ROW_INITIAL)
rowNext = 0;
rowFirst = ROW_INITIAL;
#else
// SCROLLMODE 1 just alternates when the
// flag indicates that we have come to the end
if (noMoreRowsToDisplay)
rowNext = 0;
#endif #endif
noMoreRowsToDisplay = false; } else {
slot = 0; // SCROLLMODE 1 or 2 but not scroll active
rowFirst = ROW_INITIAL; rowNext = 0;
lastScrollTime = currentMillis; }
return NULL; #else
} // this is for SCROLLMODE 0 but what should it do?
rowNext = 0;
#endif
rowFirst = ROW_INITIAL;
noMoreRowsToDisplay = false;
slot = 0;
lastScrollTime = currentMillis;
return NULL;
} }
#if SCROLLMODE==2
if (needScroll)
noMoreRowsToDisplay = false;
#endif
} }
} while (force); } while (force);
@ -172,28 +209,19 @@ bool Display::findNextNonBlankRow() {
while (!noMoreRowsToDisplay) { while (!noMoreRowsToDisplay) {
if (rowNext == ROW_INITIAL) if (rowNext == ROW_INITIAL)
rowNext = 0; rowNext = 0;
else
rowNext = rowNext + 1;
#if SCROLLMODE == 1
if (rowNext >= MAX_CHARACTER_ROWS) { if (rowNext >= MAX_CHARACTER_ROWS) {
// Finished if we've looped back to start // Finished if we've looped back to start
rowNext = ROW_INITIAL; rowNext = ROW_INITIAL;
noMoreRowsToDisplay = true; noMoreRowsToDisplay = true;
return false; return false;
} }
#else
if (rowNext >= MAX_CHARACTER_ROWS)
rowNext = 0;
if (rowNext == rowFirst) {
// Finished if we're back to the first one shown
noMoreRowsToDisplay = true;
return false;
}
#endif
if (rowBuffer[rowNext][0] != 0) { if (rowBuffer[rowNext][0] != 0) {
//rowBuffer[rowNext][0] = '0' + rowNext; // usefull for debug
//rowBuffer[rowNext][1] = '0' + rowFirst; // usefull for debug
// Found non-blank row // Found non-blank row
return true; return true;
} }
rowNext = rowNext + 1;
} }
return false; return false;
} }

View File

@ -56,6 +56,7 @@ private:
char buffer[MAX_CHARACTER_COLS + 1]; char buffer[MAX_CHARACTER_COLS + 1];
char* bufferPointer = 0; char* bufferPointer = 0;
bool noMoreRowsToDisplay = false; bool noMoreRowsToDisplay = false;
bool needScroll = false;
uint16_t numCharacterRows; uint16_t numCharacterRows;
uint16_t numCharacterColumns = MAX_CHARACTER_COLS; uint16_t numCharacterColumns = MAX_CHARACTER_COLS;

View File

@ -1 +1 @@
#define GITHUB_SHA "devel-202303141949Z" #define GITHUB_SHA "devel-202303151539Z"

View File

@ -4,7 +4,8 @@
#include "StringFormatter.h" #include "StringFormatter.h"
#define VERSION "4.2.28" #define VERSION "4.2.29"
// 4.2.29 - Bugfix Scroll LCD without empty lines and consistent
// 4.2.28 - Reinstate use of timer11 in STM32 - remove HA mode. // 4.2.28 - Reinstate use of timer11 in STM32 - remove HA mode.
// - Update IO_DFPlayer to work with MP3-TF-16P rev3. // - Update IO_DFPlayer to work with MP3-TF-16P rev3.
// 4.2.27 - Bugfix LCD showed random characters in SCROLLMODE 2 // 4.2.27 - Bugfix LCD showed random characters in SCROLLMODE 2