basic version of saving current screen buffer #18

pull/1/head
Thomas Ballmann 4 years ago
parent a78e8fbcd0
commit 40508b7ccf

@ -15,6 +15,12 @@
GxEPD2_BW<GxEPD2_750, GxEPD2_750::HEIGHT> display(GxEPD2_750(/*CS=*/5, /*DC=*/17, /*RST=*/16, /*BUSY=*/4));
void printScreen();
void writeBitmap(const char filename[], const uint8_t bitmap[], int16_t w, int16_t h, uint16_t depth = 1);
uint8_t filldata[] = {0x0, 0x23, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xFF, 0xFF, 0x0};
void write16(File &f, uint16_t v);
void write32(File &f, uint32_t v);
void setupDisplay()
{
Serial.println("setupDisplay");
@ -45,6 +51,10 @@ void displayWriteFramebuffer(uint8_t bitmap[])
void displayFlush()
{
display.nextPage();
unsigned long startMills = millis();
writeBitmap("/screen.bmp", display.getBuffer(), 640, 384);
Serial.println(millis() - startMills);
}
void printSplash()
@ -69,3 +79,91 @@ void printSplash()
display.print(Hello);
} while (display.nextPage());
}
void printScreen()
{
}
void writeBitmap(const char filename[], const uint8_t bitmap[], int16_t w, int16_t h, uint16_t depth)
{
File bitmapFile;
uint32_t rowSizeCode = (w + 8 - depth) * depth / 8;
// BMP rows are padded (if needed) to 4-byte boundary
uint32_t rowSizeBMP = (w * depth / 8 + 3) & ~3;
Serial.print("writeBitmap(\"");
Serial.print(filename);
Serial.println("\")");
//Serial.print("rowSizeCode ");
//Serial.println(rowSizeCode);
//Serial.print("rowSizeBMP ");
//Serial.println(rowSizeBMP);
uint32_t headerSize = 40;
uint32_t imageOffset = 62;
uint32_t fileSize = imageOffset + h * rowSizeBMP;
String tmpFile = filename;
tmpFile += ".tmp";
bitmapFile = SPIFFS.open(tmpFile, FILE_WRITE);
if (bitmapFile)
{
bitmapFile.seek(0);
write16(bitmapFile, 0x4D42); // BMP signature
write32(bitmapFile, fileSize); // fileSize
write32(bitmapFile, 0); // creator bytes
write32(bitmapFile, imageOffset); // image offset
write32(bitmapFile, headerSize); // Header size
write32(bitmapFile, w); // image width
write32(bitmapFile, h); // image height
write16(bitmapFile, 1); // # planes
write16(bitmapFile, depth); // // bits per pixel
write32(bitmapFile, 0); // format uncompressed
uint32_t j = 0;
for (uint32_t i = bitmapFile.position(); i < imageOffset; i++)
{
bitmapFile.write(filldata[j++]); // remaining header bytes
}
uint32_t rowidx = 0;
for (uint16_t row = 0; row < h; row++) // for each line
{
uint32_t colidx;
for (colidx = 0; colidx < rowSizeCode; colidx++)
{
uint8_t data = pgm_read_byte(&bitmap[rowidx + colidx]);
bitmapFile.write(data);
}
rowidx += rowSizeCode;
while (colidx++ < rowSizeBMP)
{
bitmapFile.write(uint8_t(0)); // padding
}
}
bitmapFile.close();
SPIFFS.remove(filename);
SPIFFS.rename(tmpFile, filename);
Serial.println("done");
}
else
{
Serial.print("open file for write failed!");
}
}
void write16(File &f, uint16_t v)
{
f.write(uint8_t(v));
f.write(uint8_t(v >> 8));
}
void write32(File &f, uint32_t v)
{
f.write(uint8_t(v));
f.write(uint8_t(v >> 8));
f.write(uint8_t(v >> 16));
f.write(uint8_t(v >> 24));
}

@ -35,7 +35,7 @@ void loopFaceWeather()
render_current();
render_forecast();
display.nextPage();
displayFlush();
}
void render_current()
@ -176,7 +176,6 @@ bool downloadWeatherData()
void readWeatherData()
{
SPIFFS.begin();
File file;
DeserializationError error;
@ -212,6 +211,4 @@ void readWeatherData()
// TODO get values
file.close();
SPIFFS.end();
}
Loading…
Cancel
Save