diff --git a/src/display.cpp b/src/display.cpp index 1da8bb9..1e37e45 100644 --- a/src/display.cpp +++ b/src/display.cpp @@ -15,6 +15,12 @@ GxEPD2_BW 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)); +} \ No newline at end of file diff --git a/src/faceWeather.cpp b/src/faceWeather.cpp index 23afcbf..5e89808 100644 --- a/src/faceWeather.cpp +++ b/src/faceWeather.cpp @@ -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(); } \ No newline at end of file