first commit

This commit is contained in:
Jérôme Delacotte
2025-03-06 11:15:32 +01:00
commit 7b30d6e298
5276 changed files with 2108927 additions and 0 deletions

View File

@@ -0,0 +1,213 @@
// GxEPD2_SD_WriteBitmap: utility for Display Library for SPI e-paper panels from Dalian Good Display and boards from Waveshare.
//
// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/
//
// Author: Jean-Marc Zingg
//
// Version: see library.properties
//
// Library: https://github.com/ZinggJM/GxEPD2
#include <GxEPD2_BW.h>
#include <GxEPD2_3C.h>
#include <Fonts/FreeMonoBold9pt7b.h>
#include "bitmaps/Bitmaps200x200.h" // 1.54" b/w
//#include "bitmaps/Bitmaps128x250.h" // 2.13" b/w
//#include "bitmaps/Bitmaps128x296.h" // 2.9" b/w
//#include "bitmaps/Bitmaps176x264.h" // 2.7" b/w
//#include "bitmaps/Bitmaps400x300.h" // 4.2" b/w
//#include "bitmaps/Bitmaps640x384.h" // 7.5" b/w
// 3-color
//#include "bitmaps/Bitmaps3c200x200.h" // 1.54" b/w/r
//#include "bitmaps/Bitmaps3c104x212.h" // 2.13" b/w/r
//#include "bitmaps/Bitmaps3c128x296.h" // 2.9" b/w/r
//#include "bitmaps/Bitmaps3c176x264.h" // 2.7" b/w/r
//#include "bitmaps/Bitmaps3c400x300.h" // 4.2" b/w/r
// include SdFat for FAT32 support with long filenames; available through Library Manager
#include <SdFat.h>
#if defined(SdFat_h)
SdFat SD;
#define FileClass SdFile
#define position curPosition
#define seek seekSet
#else
#include <SD.h>
#define FileClass File
#undef SdFat_h
#endif
void setup()
{
Serial.begin(115200);
Serial.print("Initializing SD card...");
if (!SD.begin(SS))
{
Serial.println("initialization failed!");
while (1) yield();
}
Serial.println("initialization done.");
writeBitmaps();
}
void loop()
{
}
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 writeBitmaps()
{
#ifdef _GxBitmaps200x200_H_
writeBitmap("logo.bmp", logo200x200, 200, 200);
writeBitmap("logo200x200.bmp", logo200x200, 200, 200);
writeBitmap("first200x200.bmp", first200x200, 200, 200);
writeBitmap("second200x200.bmp", second200x200, 200, 200);
writeBitmap("third200x200.bmp", third200x200, 200, 200);
writeBitmap("fourth200x200.bmp", fourth200x200, 200, 200);
writeBitmap("fifth200x200.bmp", fifth200x200, 200, 200);
writeBitmap("sixth200x200.bmp", sixth200x200, 200, 200);
writeBitmap("senventh200x200.bmp", senventh200x200, 200, 200);
writeBitmap("eighth200x200.bmp", eighth200x200, 200, 200);
#endif
#ifdef _GxBitmaps128x250_H_
writeBitmap("Bitmap128x250_1.bmp", Bitmap128x250_1, 128, 250);
writeBitmap("logo128x250.bmp", logo128x250, 128, 250);
writeBitmap("first128x250.bmp", first128x250, 128, 250);
writeBitmap("second128x250.bmp", second128x250, 128, 250);
writeBitmap("third128x250.bmp", third128x250, 128, 250);
#endif
#ifdef _GxBitmaps128x296_H_
writeBitmap("Bitmap128x296_1.bmp", Bitmap128x296_1, 128, 296);
writeBitmap("logo128x296.bmp", logo128x296, 128, 296);
writeBitmap("first128x296.bmp", first128x296, 128, 296);
writeBitmap("second128x296.bmp", second128x296, 128, 296);
writeBitmap("third128x296.bmp", third128x296, 128, 296);
#endif
#ifdef _GxBitmaps176x264_H_
writeBitmap("Bitmap176x264_1.bmp", Bitmap176x264_1, 176, 264);
writeBitmap("Bitmap176x264_2.bmp", Bitmap176x264_2, 176, 264);
#endif
#ifdef _GxBitmaps400x300_H_
writeBitmap("Bitmap400x300_1.bmp", Bitmap400x300_1, 400, 300);
writeBitmap("Bitmap400x300_2.bmp", Bitmap400x300_2, 400, 300);
#endif
#ifdef _GxBitmaps640x384_H_
writeBitmap("Bitmap640x384_1.bmp", Bitmap640x384_1, 640, 384);
writeBitmap("Bitmap640x384_2.bmp", Bitmap640x384_2, 640, 384);
#endif
// 3-color
#ifdef _GxBitmaps3c200x200_H_
writeBitmap("Bitmap3c200x200_black.bmp", Bitmap3c200x200_black, 200, 200);
writeBitmap("Bitmap3c200x200_red.bmp", Bitmap3c200x200_red, 200, 200);
writeBitmap("WS_Bitmap3c200x200_black.bmp", WS_Bitmap3c200x200_black, 200, 200);
writeBitmap("WS_Bitmap3c200x200_red.bmp", WS_Bitmap3c200x200_red, 200, 200);
#endif
#ifdef _GxBitmaps3c104x212_H_
writeBitmap("Bitmap3c104x212_1_black.bmp", Bitmap3c104x212_1_black, 104, 212);
writeBitmap("Bitmap3c104x212_1_red.bmp", Bitmap3c104x212_1_red, 104, 212);
writeBitmap("Bitmap3c104x212_2_black.bmp", Bitmap3c104x212_2_black, 104, 212);
writeBitmap("Bitmap3c104x212_2_red.bmp", Bitmap3c104x212_2_red, 104, 212);
writeBitmap("WS_Bitmap3c104x212_black.bmp", WS_Bitmap3c104x212_black, 104, 212);
writeBitmap("WS_Bitmap3c104x212_red.bmp", WS_Bitmap3c104x212_red, 104, 212);
#endif
#ifdef _GxBitmaps3c128x296_H_
writeBitmap("Bitmap3c128x296_1_black.bmp", Bitmap3c128x296_1_black, 128, 296);
writeBitmap("Bitmap3c128x296_1_red.bmp", Bitmap3c128x296_1_red, 128, 296);
writeBitmap("Bitmap3c128x296_2_black.bmp", Bitmap3c128x296_2_black, 128, 296);
writeBitmap("Bitmap3c128x296_2_red.bmp", Bitmap3c128x296_2_red, 128, 296);
writeBitmap("WS_Bitmap3c128x296_black.bmp", WS_Bitmap3c128x296_black, 128, 296);
writeBitmap("WS_Bitmap3c128x296_red.bmp", WS_Bitmap3c128x296_red, 128, 296);
#endif
#ifdef _GxBitmaps3c176x264_H_
writeBitmap("Bitmap3c176x264_black.bmp", Bitmap3c176x264_black, 176, 264);
writeBitmap("Bitmap3c176x264_red.bmp", Bitmap3c176x264_red, 176, 264);
#endif
#ifdef _GxBitmaps3c400x300_H_
writeBitmap("Bitmap3c400x300_1_black.bmp", Bitmap3c400x300_1_black, 400, 300);
writeBitmap("Bitmap3c400x300_1_red.bmp", Bitmap3c400x300_1_red, 400, 300);
writeBitmap("Bitmap3c400x300_2_black.bmp", Bitmap3c400x300_2_black, 400, 300);
writeBitmap("Bitmap3c400x300_2_red.bmp", Bitmap3c400x300_2_red, 400, 300);
writeBitmap("WS_Bitmap3c400x300_black.bmp", WS_Bitmap3c400x300_black, 400, 300);
writeBitmap("WS_Bitmap3c400x300_red.bmp", WS_Bitmap3c400x300_red, 400, 300);
#endif
}
void writeBitmap(const char filename[], const uint8_t bitmap[], int16_t w, int16_t h, uint16_t depth)
{
FileClass 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;
#if defined(SdFat_h)
if (bitmapFile.open(filename, FILE_WRITE))
#else
bitmapFile = SD.open(filename, FILE_WRITE);
if (bitmapFile)
#endif
{
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
//Serial.print("first position "); Serial.println(bitmapFile.position());
uint32_t j = 0;
for (uint32_t i = bitmapFile.position(); i < imageOffset; i++)
{
//bitmapFile.write(uint8_t(0)); // remaining header bytes
bitmapFile.write(filldata[j++]); // remaining header bytes
}
//Serial.print("start position "); Serial.println(bitmapFile.position());
uint32_t rowidx = 0;
for (uint16_t row = 0; row < h; row++) // for each line
{
uint32_t colidx;
for (colidx = 0; colidx < rowSizeCode; colidx++)
{
#if defined(__AVR) || defined(ESP8266) || defined(ESP32)
uint8_t data = pgm_read_byte(&bitmap[rowidx + colidx]);
#else
uint8_t data = bitmap[rowidx + colidx];
#endif
bitmapFile.write(data);
}
rowidx += rowSizeCode;
while (colidx++ < rowSizeBMP) bitmapFile.write(uint8_t (0)); // padding
//Serial.println(bitmapFile.position());
}
bitmapFile.close();
Serial.println("done");
}
else Serial.print("open file for write failed!");
}
void write16(FileClass& f, uint16_t v)
{
f.write(uint8_t(v));
f.write(uint8_t(v >> 8));
}
void write32(FileClass& 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));
}