mirror of
https://github.com/DCC-EX/CommandStation-EX.git
synced 2024-12-24 21:21:24 +01:00
ec1d674da7
Write one character or position command per loop entry so as not to hold up the loop. Add support for SH1106 OLED as 132x64 size option.
74 lines
2.4 KiB
C
74 lines
2.4 KiB
C
/*
|
|
* © 2020, Chris Harlow, 2021, Neil McKechnie. All rights reserved.
|
|
*
|
|
* This file is part of CommandStation-EX
|
|
*
|
|
* This is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* It is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with CommandStation. If not, see <https://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
// OLED Implementation of LCDDisplay class
|
|
// Note: this file is optionally included by LCD_Implementation.h
|
|
// It is NOT a .cpp file to prevent it being compiled and demanding libraries even when not needed.
|
|
|
|
#include "Wire.h"
|
|
#include "SSD1306/SSD1306AsciiWire.h"
|
|
SSD1306AsciiWire LCDDriver;
|
|
|
|
// DEVICE SPECIFIC LCDDisplay Implementation for OLED
|
|
|
|
LCDDisplay::LCDDisplay() {
|
|
// Scan for device on 0x3c and 0x3d.
|
|
Wire.begin();
|
|
for (byte address=0x3c; address<=0x3d; address++) {
|
|
Wire.beginTransmission(address);
|
|
byte error = Wire.endTransmission(true);
|
|
if (!error) {
|
|
// Device found
|
|
DIAG(F("\nOLED display found at 0x%x"), address);
|
|
interfake(OLED_DRIVER,0);
|
|
const DevType *devType;
|
|
if (lcdCols == 132)
|
|
devType = &SH1106_128x64; // Actually 132x64 but treated as 128x64
|
|
else if (lcdCols == 128 && lcdRows == 8)
|
|
devType = &Adafruit128x64;
|
|
else
|
|
devType = &Adafruit128x32;
|
|
LCDDriver.begin(devType, address);
|
|
lcdDisplay=this;
|
|
LCDDriver.setFont(System5x7); // Normal 1:1 pixel scale, 8 bits high
|
|
clear();
|
|
return;
|
|
}
|
|
}
|
|
DIAG(F("\nOLED display not found\n"));
|
|
}
|
|
|
|
void LCDDisplay::interfake(int p1, int p2, int p3) {lcdCols=p1; lcdRows=p2/8; (void)p3;}
|
|
|
|
void LCDDisplay::clearNative() {LCDDriver.clear();}
|
|
|
|
void LCDDisplay::setRowNative(byte row) {
|
|
// Positions text write to start of row 1..n and clears previous text
|
|
int y=row;
|
|
LCDDriver.setCursor(0, y);
|
|
//LCDDriver.clearToEOL();
|
|
}
|
|
|
|
void LCDDisplay::writeNative(char b) {
|
|
LCDDriver.write(b);
|
|
}
|
|
|
|
void LCDDisplay::displayNative() { }
|
|
|