1
0
mirror of https://github.com/DCC-EX/CommandStation-EX.git synced 2025-01-26 20:28:52 +01:00

Speed up OLED writes

Add new flushDisplay() to end any in-progress I2C transaction.  Previously, an redundant command was sent that ended the in-progress transaction but also sent another complete, but unnecessary, transaction.
This commit is contained in:
Neil McKechnie 2021-02-19 10:49:43 +00:00
parent 5e9fb046ab
commit 4685d2b24a
3 changed files with 14 additions and 3 deletions

View File

@ -121,7 +121,6 @@ size_t SSD1306Ascii::write(uint8_t ch) {
// Fixed width font. // Fixed width font.
base += nr*w*ch; base += nr*w*ch;
uint8_t scol = m_col; uint8_t scol = m_col;
uint8_t srow = m_row;
for (uint8_t r = 0; r < nr; r++) { for (uint8_t r = 0; r < nr; r++) {
if (r) { if (r) {
setCursor(scol, m_row + 1); setCursor(scol, m_row + 1);
@ -134,6 +133,6 @@ size_t SSD1306Ascii::write(uint8_t ch) {
ssd1306WriteRamBuf(0); ssd1306WriteRamBuf(0);
} }
} }
setRow(srow); flushDisplay();
return 1; return 1;
} }

View File

@ -224,7 +224,7 @@ class SSD1306Ascii : public Print {
* *
* @param[in] c The data byte. * @param[in] c The data byte.
* @note The byte may be buffered until a call to ssd1306WriteCmd * @note The byte may be buffered until a call to ssd1306WriteCmd
* or ssd1306WriteRam. * or ssd1306WriteRam or endWrite.
*/ */
void ssd1306WriteRamBuf(uint8_t c); void ssd1306WriteRamBuf(uint8_t c);
/** /**
@ -235,8 +235,11 @@ class SSD1306Ascii : public Print {
*/ */
size_t write(uint8_t c); size_t write(uint8_t c);
protected: protected:
virtual void writeDisplay(uint8_t b, uint8_t mode) = 0; virtual void writeDisplay(uint8_t b, uint8_t mode) = 0;
virtual void flushDisplay() = 0;
uint8_t m_col; // Cursor column. uint8_t m_col; // Cursor column.
uint8_t m_row; // Cursor RAM row. uint8_t m_row; // Cursor RAM row.
uint8_t m_displayWidth; // Display width. uint8_t m_displayWidth; // Display width.

View File

@ -90,6 +90,15 @@ class SSD1306AsciiWire : public SSD1306Ascii {
#endif // OPTIMIZE_I2C #endif // OPTIMIZE_I2C
} }
void flushDisplay() {
#if OPTIMIZE_I2C
if (m_nData) {
m_oledWire.endTransmission();
m_nData = 0;
}
#endif // OPTIMIZE_I2C
}
protected: protected:
uint8_t m_i2cAddr; uint8_t m_i2cAddr;
#if OPTIMIZE_I2C #if OPTIMIZE_I2C