adafruit / Adafruit_SSD1306

Arduino library for SSD1306 monochrome 128x64 and 128x32 OLEDs
http://www.adafruit.com/category/63_98
Other
1.75k stars 964 forks source link

Display buffer returned by getBuffer() method #200

Closed alexpeissel closed 3 years ago

alexpeissel commented 3 years ago

Hi all!

Is there a canonical way of 'restoring' display contents from a dumped buffer?

My current attempt looks like the following, (from an STM32 board connected to an 128x32 OLED over I2C):

// Our duplicate buffer
static uint8_t displayBuffer[(SCREEN_WIDTH * SCREEN_HEIGHT + 7) / 8];

// ...draw bitmaps, images, etc and show with display.display();...

// Copy over the contents of the display buffer to the duplicate
memcpy(displayBuffer, display.getBuffer(), sizeof(displayBuffer));

// Write out the buffer
display.drawBitmap(0, 0, displayBuffer, 128, 32, WHITE);

I then get garbled output on the screen, but it seems to be consistent based on the display content at the time memcpy is called.

My first take on this would be if there should be some way to set the buffer directly, similar to this PR: here. Alternately, does something need to be done with the displayBuffer to play nicely with the drawBitmap method?

To close, I believe this is worthy of an issue as it would close/complement the getBuffer use-case.

Any pointers or suggestions would be great; thanks!

alexpeissel commented 3 years ago

This was solved for me by a friendly redditor, (thanks ferrybig!):

// Our duplicate buffer
static uint8_t displayBuffer[(SCREEN_WIDTH * SCREEN_HEIGHT + 7) / 8];

// ...draw bitmaps, images, etc and show with display.display();...

// Copy over the contents of the display buffer to the duplicate
memcpy(displayBuffer, display.getBuffer(), sizeof(displayBuffer));

// Copy back from the duplicate buffer
memcpy(display.getBuffer(), displayBuffer, sizeof(displayBuffer));

// Display it
display.display();

Closing the issue, hopefully someone else may find this useful.