Skip to content

Commit 922acab

Browse files
authored
Display driver fixes for non-functioning displays (#974)
* Added debug mode to display addon & drivers * Fixed hang issue in debug mode * Removed debug mode options. Added new buffer copying method for 132x64 SH1106 displays. * Removed remaining debug mode references. Added extra SH1106 check. * Fix issue where drawPixel x position goes beyond the bounds of the display area. * Added refresh check when custom button layouts are in use. * Added Rock Band/Guitar Hero layouts. * Fixed issue with missing setPower functionality on new screen driver. * Implemented button layout API functionality to Display configuration, removing the need for hard-coded layout selections. Added 6GAWD layouts (stick & all button)
1 parent 3336200 commit 922acab

File tree

15 files changed

+454
-103
lines changed

15 files changed

+454
-103
lines changed

Diff for: headers/buttonlayouts.h

+83
Original file line numberDiff line numberDiff line change
@@ -392,6 +392,22 @@
392392
{GP_ELEMENT_DIR_BUTTON, { 18, 32, 52, 36, 1, 1, GAMEPAD_MASK_UP, GP_SHAPE_SQUARE, 0, 0, 0}},\
393393
}
394394

395+
#define BUTTON_GROUP_BANDHERO_FRET_A {\
396+
{GP_ELEMENT_BTN_BUTTON, { 5, 26, 14, 36, 1, 1, GAMEPAD_MASK_B2, GP_SHAPE_SQUARE, 0, 0, 0}},\
397+
{GP_ELEMENT_BTN_BUTTON, { 18, 26, 27, 36, 1, 1, GAMEPAD_MASK_B1, GP_SHAPE_SQUARE, 0, 0, 0}},\
398+
{GP_ELEMENT_BTN_BUTTON, { 31, 26, 40, 36, 1, 1, GAMEPAD_MASK_B4, GP_SHAPE_SQUARE, 0, 0, 0}},\
399+
{GP_ELEMENT_BTN_BUTTON, { 44, 26, 53, 36, 1, 1, GAMEPAD_MASK_B3, GP_SHAPE_SQUARE, 0, 0, 0}},\
400+
{GP_ELEMENT_BTN_BUTTON, { 57, 26, 66, 36, 1, 1, GAMEPAD_MASK_L2, GP_SHAPE_SQUARE, 0, 0, 0}},\
401+
}
402+
403+
#define BUTTON_GROUP_BANDHERO_STRUM_A {\
404+
{GP_ELEMENT_DIR_BUTTON, { 21, 27, 45, 30, 1, 1, GAMEPAD_MASK_DOWN, GP_SHAPE_SQUARE, 0, 0, 0}},\
405+
{GP_ELEMENT_DIR_BUTTON, { 21, 32, 45, 35, 1, 1, GAMEPAD_MASK_UP, GP_SHAPE_SQUARE, 0, 0, 0}},\
406+
{GP_ELEMENT_LEVER, { 54, 16, 5, 5, 1, 0, 0, 0}},\
407+
{GP_ELEMENT_BTN_BUTTON, { 14, 44, 4, 4, 1, 1, GAMEPAD_MASK_S1, GP_SHAPE_ELLIPSE}},\
408+
{GP_ELEMENT_BTN_BUTTON, { 6, 50, 4, 4, 1, 1, GAMEPAD_MASK_S2, GP_SHAPE_ELLIPSE}},\
409+
}
410+
395411
#define BUTTON_GROUP_DANCEPAD_DDR_RIGHT {\
396412
{GP_ELEMENT_BTN_BUTTON, { 69, 29, 84, 44, 1, 1, GAMEPAD_MASK_B3, GP_SHAPE_SQUARE}},\
397413
{GP_ELEMENT_BTN_BUTTON, { 86, 46, 101, 61, 1, 1, GAMEPAD_MASK_B1, GP_SHAPE_SQUARE}},\
@@ -461,4 +477,71 @@
461477
{GP_ELEMENT_DIR_BUTTON, { 75, 32, 109, 36, 1, 1, GAMEPAD_MASK_UP, GP_SHAPE_SQUARE, 0, 0, 0}},\
462478
}
463479

480+
#define BUTTON_GROUP_BANDHERO_FRET_B {\
481+
{GP_ELEMENT_BTN_BUTTON, {113, 26, 122, 36, 1, 1, GAMEPAD_MASK_B2, GP_SHAPE_SQUARE, 0, 0, 0}},\
482+
{GP_ELEMENT_BTN_BUTTON, {100, 26, 109, 36, 1, 1, GAMEPAD_MASK_B1, GP_SHAPE_SQUARE, 0, 0, 0}},\
483+
{GP_ELEMENT_BTN_BUTTON, { 87, 26, 96, 36, 1, 1, GAMEPAD_MASK_B4, GP_SHAPE_SQUARE, 0, 0, 0}},\
484+
{GP_ELEMENT_BTN_BUTTON, { 74, 26, 83, 36, 1, 1, GAMEPAD_MASK_B3, GP_SHAPE_SQUARE, 0, 0, 0}},\
485+
{GP_ELEMENT_BTN_BUTTON, { 61, 26, 70, 36, 1, 1, GAMEPAD_MASK_L2, GP_SHAPE_SQUARE, 0, 0, 0}},\
486+
}
487+
488+
#define BUTTON_GROUP_BANDHERO_STRUM_B {\
489+
{GP_ELEMENT_DIR_BUTTON, { 75, 26, 109, 30, 1, 1, GAMEPAD_MASK_DOWN, GP_SHAPE_SQUARE, 0, 0, 0}},\
490+
{GP_ELEMENT_DIR_BUTTON, { 75, 32, 109, 36, 1, 1, GAMEPAD_MASK_UP, GP_SHAPE_SQUARE, 0, 0, 0}},\
491+
{GP_ELEMENT_LEVER, { 72, 16, 5, 5, 1, 0, 0, 0}},\
492+
{GP_ELEMENT_BTN_BUTTON, {113, 44, 4, 4, 1, 1, GAMEPAD_MASK_S1, GP_SHAPE_ELLIPSE}},\
493+
{GP_ELEMENT_BTN_BUTTON, {120, 50, 4, 4, 1, 1, GAMEPAD_MASK_S2, GP_SHAPE_ELLIPSE}},\
494+
}
495+
496+
#define BUTTON_GROUP_6GAWD_A {\
497+
{GP_ELEMENT_LEVER, { 22, 30, 10, 10, 1, 0, 0}}\
498+
}
499+
500+
#define BUTTON_GROUP_6GAWD_B {\
501+
{GP_ELEMENT_BTN_BUTTON, {69, 25, 6, 6, 1, 1, GAMEPAD_MASK_B3, GP_SHAPE_ELLIPSE}},\
502+
{GP_ELEMENT_BTN_BUTTON, {81, 16, 6, 6, 1, 1, GAMEPAD_MASK_B4, GP_SHAPE_ELLIPSE}},\
503+
{GP_ELEMENT_BTN_BUTTON, {95, 16, 6, 6, 1, 1, GAMEPAD_MASK_R1, GP_SHAPE_ELLIPSE}},\
504+
{GP_ELEMENT_BTN_BUTTON, {109,24, 7, 7, 1, 1, GAMEPAD_MASK_L1, GP_SHAPE_ELLIPSE}},\
505+
{GP_ELEMENT_BTN_BUTTON, {69, 43, 6, 6, 1, 1, GAMEPAD_MASK_B1, GP_SHAPE_ELLIPSE}},\
506+
{GP_ELEMENT_BTN_BUTTON, {81, 34, 6, 6, 1, 1, GAMEPAD_MASK_B2, GP_SHAPE_ELLIPSE}},\
507+
{GP_ELEMENT_BTN_BUTTON, {95, 34, 6, 6, 1, 1, GAMEPAD_MASK_R2, GP_SHAPE_ELLIPSE}},\
508+
{GP_ELEMENT_BTN_BUTTON, {58, 53, 7, 7, 1, 1, GAMEPAD_MASK_L2, GP_SHAPE_ELLIPSE}}\
509+
}
510+
511+
#define BUTTON_GROUP_6GAWD_ALLBUTTON_A {\
512+
{GP_ELEMENT_DIR_BUTTON, {22, 28, 6, 6, 1, 1, GAMEPAD_MASK_LEFT, GP_SHAPE_ELLIPSE}},\
513+
{GP_ELEMENT_DIR_BUTTON, {40, 28, 6, 6, 1, 1, GAMEPAD_MASK_DOWN, GP_SHAPE_ELLIPSE}},\
514+
{GP_ELEMENT_DIR_BUTTON, {56, 32, 6, 6, 1, 1, GAMEPAD_MASK_RIGHT, GP_SHAPE_ELLIPSE}},\
515+
{GP_ELEMENT_DIR_BUTTON, {58, 53, 7, 7, 1, 1, GAMEPAD_MASK_UP, GP_SHAPE_ELLIPSE}}\
516+
}
517+
518+
#define BUTTON_GROUP_6GAWD_ALLBUTTON_B {\
519+
{GP_ELEMENT_BTN_BUTTON, {69, 25, 6, 6, 1, 1, GAMEPAD_MASK_B3, GP_SHAPE_ELLIPSE}},\
520+
{GP_ELEMENT_BTN_BUTTON, {81, 16, 6, 6, 1, 1, GAMEPAD_MASK_B4, GP_SHAPE_ELLIPSE}},\
521+
{GP_ELEMENT_BTN_BUTTON, {95, 16, 6, 6, 1, 1, GAMEPAD_MASK_R1, GP_SHAPE_ELLIPSE}},\
522+
{GP_ELEMENT_BTN_BUTTON, {109,24, 7, 7, 1, 1, GAMEPAD_MASK_L1, GP_SHAPE_ELLIPSE}},\
523+
{GP_ELEMENT_BTN_BUTTON, {69, 43, 6, 6, 1, 1, GAMEPAD_MASK_B1, GP_SHAPE_ELLIPSE}},\
524+
{GP_ELEMENT_BTN_BUTTON, {81, 34, 6, 6, 1, 1, GAMEPAD_MASK_B2, GP_SHAPE_ELLIPSE}},\
525+
{GP_ELEMENT_BTN_BUTTON, {95, 34, 6, 6, 1, 1, GAMEPAD_MASK_R2, GP_SHAPE_ELLIPSE}},\
526+
{GP_ELEMENT_BTN_BUTTON, {80, 53, 7, 7, 1, 1, GAMEPAD_MASK_L2, GP_SHAPE_ELLIPSE}}\
527+
}
528+
529+
#define BUTTON_GROUP_6GAWD_ALLBUTTONPLUS_A {\
530+
{GP_ELEMENT_BTN_BUTTON, {12, 32, 6, 6, 1, 1, GAMEPAD_MASK_L2, GP_SHAPE_ELLIPSE}},\
531+
{GP_ELEMENT_DIR_BUTTON, {26, 28, 6, 6, 1, 1, GAMEPAD_MASK_LEFT, GP_SHAPE_ELLIPSE}},\
532+
{GP_ELEMENT_DIR_BUTTON, {40, 28, 6, 6, 1, 1, GAMEPAD_MASK_DOWN, GP_SHAPE_ELLIPSE}},\
533+
{GP_ELEMENT_DIR_BUTTON, {54, 33, 6, 6, 1, 1, GAMEPAD_MASK_RIGHT, GP_SHAPE_ELLIPSE}},\
534+
{GP_ELEMENT_DIR_BUTTON, {58, 53, 7, 7, 1, 1, GAMEPAD_MASK_UP, GP_SHAPE_ELLIPSE}},\
535+
}
536+
537+
#define BUTTON_GROUP_6GAWD_ALLBUTTONPLUS_B {\
538+
{GP_ELEMENT_BTN_BUTTON, {69, 25, 6, 6, 1, 1, GAMEPAD_MASK_B3, GP_SHAPE_ELLIPSE}},\
539+
{GP_ELEMENT_BTN_BUTTON, {81, 16, 6, 6, 1, 1, GAMEPAD_MASK_B4, GP_SHAPE_ELLIPSE}},\
540+
{GP_ELEMENT_BTN_BUTTON, {95, 16, 6, 6, 1, 1, GAMEPAD_MASK_R1, GP_SHAPE_ELLIPSE}},\
541+
{GP_ELEMENT_BTN_BUTTON, {109,24, 7, 7, 1, 1, GAMEPAD_MASK_L1, GP_SHAPE_ELLIPSE}},\
542+
{GP_ELEMENT_BTN_BUTTON, {69, 43, 6, 6, 1, 1, GAMEPAD_MASK_B1, GP_SHAPE_ELLIPSE}},\
543+
{GP_ELEMENT_BTN_BUTTON, {81, 34, 6, 6, 1, 1, GAMEPAD_MASK_B2, GP_SHAPE_ELLIPSE}},\
544+
{GP_ELEMENT_BTN_BUTTON, {95, 34, 6, 6, 1, 1, GAMEPAD_MASK_R2, GP_SHAPE_ELLIPSE}}\
545+
}
546+
464547
#endif

Diff for: headers/display/ui/screens/ButtonLayoutScreen.h

+3
Original file line numberDiff line numberDiff line change
@@ -176,11 +176,14 @@ class ButtonLayoutScreen : public GPScreen {
176176
uint8_t prevLayoutLeft = 0;
177177
uint8_t prevLayoutRight = 0;
178178
uint8_t prevProfileNumber = 0;
179+
ButtonLayoutParamsLeft prevLeftOptions;
180+
ButtonLayoutParamsRight prevRightOptions;
179181

180182
bool macroEnabled;
181183

182184
uint16_t map(uint16_t x, uint16_t in_min, uint16_t in_max, uint16_t out_min, uint16_t out_max);
183185
void processInputHistory();
186+
bool compareCustomLayouts();
184187
bool pressedUp();
185188
bool pressedDown();
186189
bool pressedLeft();

Diff for: headers/interfaces/i2c/ssd1306/tiny_ssd1306.h

+11
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ class GPGFX_TinySSD1306 : public GPGFX_DisplayBase {
3030
void drawSprite(uint8_t* spriteData, uint16_t width, uint16_t height, uint16_t pitch, uint16_t x, uint16_t y, uint8_t priority);
3131

3232
void drawBuffer(uint8_t *pBuffer);
33+
34+
bool isSH1106(int detectedDisplay);
3335
private:
3436
typedef enum {
3537
SET_LOW_COLUMN = 0x00,
@@ -60,6 +62,13 @@ class GPGFX_TinySSD1306 : public GPGFX_DisplayBase {
6062
SET_VCOM_DETECT = 0xDB,
6163
} CommandOps;
6264

65+
typedef enum {
66+
SCREEN_128x64_MAIN = 3,
67+
SCREEN_128x64_ALT0 = 6,
68+
SCREEN_128x64_ALT1 = 7,
69+
SCREEN_132x64 = 8,
70+
} ScreenAlternatives;
71+
6372
bool _isPowered = false;
6473

6574
static const uint16_t MAX_SCREEN_WIDTH = 128;
@@ -73,6 +82,8 @@ class GPGFX_TinySSD1306 : public GPGFX_DisplayBase {
7382

7483
uint8_t frameBuffer[MAX_SCREEN_SIZE];
7584
uint8_t framePage = 0;
85+
86+
uint8_t screenType;
7687
};
7788

7889
#endif

Diff for: headers/layoutmanager.h

+10
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,11 @@ class LayoutManager {
109109
LayoutList drawBM7KeyA();
110110
LayoutList drawGitadoraFretA();
111111
LayoutList drawGitadoraStrumA();
112+
LayoutList drawBandHeroFretA();
113+
LayoutList drawBandHeroStrumA();
114+
LayoutList draw6GAWDLeft();
115+
LayoutList draw6GAWDAllButtonLeft();
116+
LayoutList draw6GAWDAllButtonPlusLeft();
112117
LayoutList drawDancepadDDRRight();
113118
LayoutList drawDancepadPIURight();
114119
LayoutList drawPopnB();
@@ -118,6 +123,11 @@ class LayoutManager {
118123
LayoutList drawBM7KeyB();
119124
LayoutList drawGitadoraFretB();
120125
LayoutList drawGitadoraStrumB();
126+
LayoutList drawBandHeroFretB();
127+
LayoutList drawBandHeroStrumB();
128+
LayoutList draw6GAWDRight();
129+
LayoutList draw6GAWDAllButtonRight();
130+
LayoutList draw6GAWDAllButtonPlusRight();
121131
private:
122132
LayoutManager(){}
123133

Diff for: lib/OneBitDisplay/OneBitDisplay.h

+1
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ uint8_t mode; // data/command mode for 9-bit SPI
4747
uint8_t iDCPin, iMOSIPin, iCLKPin, iCSPin;
4848
uint8_t iLEDPin; // backlight
4949
uint8_t bBitBang;
50+
uint8_t registerValue;
5051
} OBDISP;
5152

5253
typedef char * (*SIMPLECALLBACK)(int iMenuItem);

Diff for: proto/enums.proto

+10
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,11 @@ enum ButtonLayout
3434
BUTTON_LAYOUT_GITADORA_FRET_A = 25;
3535
BUTTON_LAYOUT_GITADORA_STRUM_A = 26;
3636
BUTTON_LAYOUT_BOARD_DEFINED_A = 27;
37+
BUTTON_LAYOUT_BANDHERO_FRET_A = 28;
38+
BUTTON_LAYOUT_BANDHERO_STRUM_A = 29;
39+
BUTTON_LAYOUT_6GAWD_A = 30;
40+
BUTTON_LAYOUT_6GAWD_ALLBUTTON_A = 31;
41+
BUTTON_LAYOUT_6GAWD_ALLBUTTONPLUS_A = 32;
3742
}
3843

3944
enum ButtonLayoutRight
@@ -72,6 +77,11 @@ enum ButtonLayoutRight
7277
BUTTON_LAYOUT_GITADORA_FRET_B = 29;
7378
BUTTON_LAYOUT_GITADORA_STRUM_B = 30;
7479
BUTTON_LAYOUT_BOARD_DEFINED_B = 31;
80+
BUTTON_LAYOUT_BANDHERO_FRET_B = 32;
81+
BUTTON_LAYOUT_BANDHERO_STRUM_B = 33;
82+
BUTTON_LAYOUT_6GAWD_B = 34;
83+
BUTTON_LAYOUT_6GAWD_ALLBUTTON_B = 35;
84+
BUTTON_LAYOUT_6GAWD_ALLBUTTONPLUS_B = 36;
7585
}
7686

7787
enum SplashMode

Diff for: src/addons/display.cpp

+1-3
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ bool DisplayAddon::available() {
2222
}
2323

2424
void DisplayAddon::setup() {
25-
//stdio_init_all();
2625
const DisplayOptions& options = Storage::getInstance().getDisplayOptions();
2726
PeripheralI2C* i2c = PeripheralManager::getInstance().getI2C(options.i2cBlock);
2827

@@ -111,8 +110,7 @@ bool DisplayAddon::updateDisplayScreen() {
111110
prevDisplayMode = currDisplayMode;
112111
return true;
113112
}
114-
115-
return false;
113+
return true;
116114
}
117115

118116
bool DisplayAddon::isDisplayPowerOff()

Diff for: src/display/ui/screens/ButtonLayoutScreen.cpp

+14-1
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ void ButtonLayoutScreen::init() {
3636
prevProfileNumber = -1;
3737
prevLayoutLeft = Storage::getInstance().getDisplayOptions().buttonLayout;
3838
prevLayoutRight = Storage::getInstance().getDisplayOptions().buttonLayoutRight;
39+
prevLeftOptions = Storage::getInstance().getDisplayOptions().buttonLayoutCustomOptions.paramsLeft;
40+
prevRightOptions = Storage::getInstance().getDisplayOptions().buttonLayoutCustomOptions.paramsRight;
3941

4042
// we cannot look at macro options enabled, pull the pins
4143

@@ -76,7 +78,7 @@ int8_t ButtonLayoutScreen::update() {
7678
uint8_t layoutLeft = Storage::getInstance().getDisplayOptions().buttonLayout;
7779
uint8_t layoutRight = Storage::getInstance().getDisplayOptions().buttonLayoutRight;
7880
bool inputHistoryEnabled = Storage::getInstance().getAddonOptions().inputHistoryOptions.enabled;
79-
if ((prevLayoutLeft != layoutLeft) || (prevLayoutRight != layoutRight) || (isInputHistoryEnabled != inputHistoryEnabled)) {
81+
if ((prevLayoutLeft != layoutLeft) || (prevLayoutRight != layoutRight) || (isInputHistoryEnabled != inputHistoryEnabled) || compareCustomLayouts()) {
8082
shutdown();
8183
init();
8284
}
@@ -362,6 +364,17 @@ void ButtonLayoutScreen::processInputHistory() {
362364
footer = historyString;
363365
}
364366

367+
bool ButtonLayoutScreen::compareCustomLayouts()
368+
{
369+
ButtonLayoutParamsLeft leftOptions = Storage::getInstance().getDisplayOptions().buttonLayoutCustomOptions.paramsLeft;
370+
ButtonLayoutParamsRight rightOptions = Storage::getInstance().getDisplayOptions().buttonLayoutCustomOptions.paramsRight;
371+
372+
bool leftChanged = ((leftOptions.layout != prevLeftOptions.layout) || (leftOptions.common.startX != prevLeftOptions.common.startX) || (leftOptions.common.startY != prevLeftOptions.common.startY) || (leftOptions.common.buttonPadding != prevLeftOptions.common.buttonPadding) || (leftOptions.common.buttonRadius != prevLeftOptions.common.buttonRadius));
373+
bool rightChanged = ((rightOptions.layout != prevRightOptions.layout) || (rightOptions.common.startX != prevRightOptions.common.startX) || (rightOptions.common.startY != prevRightOptions.common.startY) || (rightOptions.common.buttonPadding != prevRightOptions.common.buttonPadding) || (rightOptions.common.buttonRadius != prevRightOptions.common.buttonRadius));
374+
375+
return (leftChanged || rightChanged);
376+
}
377+
365378
bool ButtonLayoutScreen::pressedUp()
366379
{
367380
switch (getGamepad()->getOptions().dpadMode)

Diff for: src/interfaces/i2c/ssd1306/tiny_ssd1306.cpp

+85-13
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,13 @@ void GPGFX_TinySSD1306::init(GPGFX_DisplayTypeOptions options) {
1010
_options.inverted = options.inverted;
1111
_options.font = options.font;
1212

13+
_options.i2c->readRegister(_options.address, 0x00, &this->screenType, 1);
14+
this->screenType &= 0x0F;
15+
16+
if (isSH1106(this->screenType)) {
17+
this->screenType = SCREEN_132x64;
18+
}
19+
1320
uint8_t commands[] = {
1421
0x00,
1522
CommandOps::DISPLAY_OFF,
@@ -59,8 +66,48 @@ void GPGFX_TinySSD1306::init(GPGFX_DisplayTypeOptions options) {
5966
drawBuffer(NULL);
6067
}
6168

69+
bool GPGFX_TinySSD1306::isSH1106(int detectedDisplay) {
70+
71+
this->setPower(false);
72+
73+
const uint8_t RANDOM_DATA[] = { 0xbf, 0x88, 0x13, 0x41, 0x00 };
74+
uint8_t buffer[4];
75+
uint8_t i = 0;
76+
for (; i < sizeof(RANDOM_DATA); ++i) {
77+
buffer[0] = 0x80; // one command
78+
buffer[1] = 0xE0; // read-modify-write
79+
buffer[2] = 0xC0; // one data
80+
if (_options.i2c->write(_options.address, buffer, 3, false) == 0) {
81+
break;
82+
}
83+
84+
// Read two bytes back, the first byte is a dummy read and the second byte is the byte was actually want.
85+
if (_options.i2c->read(_options.address, buffer, 2, false) == 0) {
86+
break;
87+
}
88+
89+
// Check whether the byte we read is the byte we previously wrote.
90+
if (i > 0 && buffer[1] != RANDOM_DATA[i - 1]) {
91+
break;
92+
}
93+
94+
// Write the current byte, we will attempt to read it in the next loop iteration.
95+
buffer[0] = 0xc0; // one data
96+
buffer[1] = RANDOM_DATA[i]; // data byte
97+
buffer[2] = 0x80; // one command
98+
buffer[3] = 0xEE; // end read-modify-write
99+
if (_options.i2c->write(_options.address, buffer, 4, false) == 0) {
100+
break;
101+
}
102+
}
103+
104+
this->setPower(true);
105+
return i == sizeof(RANDOM_DATA);
106+
}
107+
62108
void GPGFX_TinySSD1306::setPower(bool isPowered) {
63109
_isPowered = isPowered;
110+
sendCommand(_isPowered ? CommandOps::DISPLAY_ON : CommandOps::DISPLAY_OFF);
64111
}
65112

66113
void GPGFX_TinySSD1306::clear() {
@@ -72,7 +119,13 @@ void GPGFX_TinySSD1306::drawPixel(uint8_t x, uint8_t y, uint32_t color) {
72119

73120
if ((x<MAX_SCREEN_WIDTH) and (y<MAX_SCREEN_HEIGHT))
74121
{
75-
row=((y/8)*128)+x;
122+
if (this->screenType == ScreenAlternatives::SCREEN_132x64) {
123+
x+=2;
124+
}
125+
126+
if (x>=MAX_SCREEN_WIDTH) return;
127+
128+
row=((y/8)*MAX_SCREEN_WIDTH)+x;
76129
bitIndex=y % 8;
77130

78131
if (color == 1) {
@@ -317,18 +370,37 @@ void GPGFX_TinySSD1306::drawBuffer(uint8_t* pBuffer) {
317370

318371
int result = -1;
319372

320-
sendCommand(CommandOps::PAGE_ADDRESS);
321-
sendCommand(0x00);
322-
sendCommand(0x07);
323-
sendCommand(CommandOps::COLUMN_ADDRESS);
324-
sendCommand(0x00);
325-
sendCommand(0x7F);
326-
if (pBuffer == NULL) {
327-
memcpy(&buffer[1],frameBuffer,bufferSize);
328-
} else {
329-
memcpy(&buffer[1],pBuffer,bufferSize);
330-
}
331-
result = _options.i2c->write(_options.address, buffer, sizeof(buffer), false);
373+
if (this->screenType == ScreenAlternatives::SCREEN_132x64) {
374+
uint16_t x = 0;
375+
uint16_t y = 0;
376+
for (y = 0; y < (MAX_SCREEN_HEIGHT/8); y++) {
377+
sendCommand(0xB0 + y);
378+
sendCommand(x & 0x0F);
379+
sendCommand(0x10 | (x >> 4));
380+
381+
if (pBuffer == NULL) {
382+
memcpy(&buffer[1],&frameBuffer[y*MAX_SCREEN_WIDTH],MAX_SCREEN_WIDTH);
383+
} else {
384+
memcpy(&buffer[1],&pBuffer[y*MAX_SCREEN_WIDTH],MAX_SCREEN_WIDTH);
385+
}
386+
387+
result = _options.i2c->write(_options.address, buffer, MAX_SCREEN_WIDTH+3, false);
388+
}
389+
} else {
390+
sendCommand(CommandOps::PAGE_ADDRESS);
391+
sendCommand(0x00);
392+
sendCommand(0x07);
393+
sendCommand(CommandOps::COLUMN_ADDRESS);
394+
sendCommand(0x00);
395+
sendCommand(0x7F);
396+
397+
if (pBuffer == NULL) {
398+
memcpy(&buffer[1],frameBuffer,bufferSize);
399+
} else {
400+
memcpy(&buffer[1],pBuffer,bufferSize);
401+
}
402+
result = _options.i2c->write(_options.address, buffer, sizeof(buffer), false);
403+
}
332404

333405
if (framePage < MAX_SCREEN_HEIGHT/8) {
334406
framePage++;

0 commit comments

Comments
 (0)