386 lines
11 KiB
C
386 lines
11 KiB
C
#pragma once
|
|
|
|
#include <Arduino.h>
|
|
#include <pgmspace.h>
|
|
|
|
// 24x24 monochrome bitmaps, 1 bit per pixel, stored row-major (24 bits = 3 bytes per row, 24 rows = 72 bytes each)
|
|
// Pixels are MSB-first. A 0 bit = black, 1 bit = white (GxEPD2 convention for drawBitmap).
|
|
// For use with display.drawBitmap(x, y, data, 24, 24, GxEPD_BLACK)
|
|
|
|
// ── Thermometer ─────────────────────────────────────────────────────────────
|
|
static const unsigned char ICON_THERMOMETER[] PROGMEM = {
|
|
0xFF, 0xE7, 0xFF, // row 0
|
|
0xFF, 0xC3, 0xFF, // row 1
|
|
0xFF, 0xC3, 0xFF, // row 2
|
|
0xFF, 0xDB, 0xFF, // row 3
|
|
0xFF, 0xDB, 0xFF, // row 4
|
|
0xFF, 0xDB, 0xFF, // row 5
|
|
0xFF, 0xDB, 0xFF, // row 6
|
|
0xFF, 0xDB, 0xFF, // row 7
|
|
0xFF, 0xDB, 0xFF, // row 8
|
|
0xFF, 0xDB, 0xFF, // row 9
|
|
0xFF, 0xDB, 0xFF, // row 10
|
|
0xFF, 0xDB, 0xFF, // row 11
|
|
0xFF, 0xDB, 0xFF, // row 12
|
|
0xFF, 0xDB, 0xFF, // row 13
|
|
0xFF, 0xDB, 0xFF, // row 14
|
|
0xFE, 0x01, 0x7F, // row 15
|
|
0xFC, 0x00, 0x3F, // row 16
|
|
0xFC, 0x00, 0x3F, // row 17
|
|
0xFC, 0x00, 0x3F, // row 18
|
|
0xFC, 0x00, 0x3F, // row 19
|
|
0xFE, 0x01, 0x7F, // row 20
|
|
0xFF, 0x03, 0xFF, // row 21
|
|
0xFF, 0x03, 0xFF, // row 22
|
|
0xFF, 0xE7, 0xFF, // row 23
|
|
};
|
|
|
|
// ── Droplet / Humidity ───────────────────────────────────────────────────────
|
|
static const unsigned char ICON_DROPLET[] PROGMEM = {
|
|
0xFF, 0xFF, 0xFF, // row 0
|
|
0xFF, 0xE7, 0xFF, // row 1
|
|
0xFF, 0xC3, 0xFF, // row 2
|
|
0xFF, 0x81, 0xFF, // row 3
|
|
0xFF, 0x00, 0xFF, // row 4
|
|
0xFE, 0x00, 0x7F, // row 5
|
|
0xFE, 0x00, 0x7F, // row 6
|
|
0xFC, 0x00, 0x3F, // row 7
|
|
0xFC, 0x00, 0x3F, // row 8
|
|
0xFC, 0x00, 0x3F, // row 9
|
|
0xFC, 0x00, 0x3F, // row 10
|
|
0xFC, 0x00, 0x3F, // row 11
|
|
0xFC, 0x00, 0x3F, // row 12
|
|
0xFE, 0x00, 0x7F, // row 13
|
|
0xFE, 0x00, 0x7F, // row 14
|
|
0xFF, 0x00, 0xFF, // row 15
|
|
0xFF, 0x81, 0xFF, // row 16
|
|
0xFF, 0xC3, 0xFF, // row 17
|
|
0xFF, 0xFF, 0xFF, // row 18
|
|
0xFF, 0xFF, 0xFF, // row 19
|
|
0xFF, 0xFF, 0xFF, // row 20
|
|
0xFF, 0xFF, 0xFF, // row 21
|
|
0xFF, 0xFF, 0xFF, // row 22
|
|
0xFF, 0xFF, 0xFF, // row 23
|
|
};
|
|
|
|
// ── Wind ─────────────────────────────────────────────────────────────────────
|
|
static const unsigned char ICON_WIND[] PROGMEM = {
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xC0, 0x00, 0xFF,
|
|
0x9F, 0xFF, 0x7F,
|
|
0xFF, 0xFE, 0x7F,
|
|
0x80, 0x00, 0x7F,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0x80, 0x00, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
};
|
|
|
|
// ── Pressure / Barometer ─────────────────────────────────────────────────────
|
|
static const unsigned char ICON_PRESSURE[] PROGMEM = {
|
|
0xFF, 0xC3, 0xFF,
|
|
0xFE, 0x00, 0x7F,
|
|
0xFC, 0x00, 0x3F,
|
|
0xF8, 0x00, 0x1F,
|
|
0xF3, 0xFF, 0xCF,
|
|
0xE7, 0xFF, 0xE7,
|
|
0xEF, 0xFF, 0xF7,
|
|
0xEF, 0x03, 0xF7,
|
|
0xEF, 0xFD, 0xF7,
|
|
0xEF, 0xFD, 0xF7,
|
|
0xEF, 0xFF, 0xF7,
|
|
0xE7, 0xFF, 0xE7,
|
|
0xF3, 0xFF, 0xCF,
|
|
0xF8, 0x00, 0x1F,
|
|
0xFC, 0x00, 0x3F,
|
|
0xFE, 0x00, 0x7F,
|
|
0xFF, 0xC3, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
};
|
|
|
|
// ── Sun ──────────────────────────────────────────────────────────────────────
|
|
static const unsigned char ICON_SUN[] PROGMEM = {
|
|
0xFF, 0xE7, 0xFF,
|
|
0xFF, 0xE7, 0xFF,
|
|
0xFB, 0xE7, 0xDF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xCF, 0x00, 0xF3,
|
|
0xFE, 0x00, 0x7F,
|
|
0xFC, 0x00, 0x3F,
|
|
0x80, 0x00, 0x01,
|
|
0x80, 0x00, 0x01,
|
|
0xFC, 0x00, 0x3F,
|
|
0xFE, 0x00, 0x7F,
|
|
0xCF, 0x00, 0xF3,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFB, 0xE7, 0xDF,
|
|
0xFF, 0xE7, 0xFF,
|
|
0xFF, 0xE7, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
};
|
|
|
|
// ── Bolt / Lightning ─────────────────────────────────────────────────────────
|
|
static const unsigned char ICON_BOLT[] PROGMEM = {
|
|
0xFF, 0x87, 0xFF,
|
|
0xFF, 0x0F, 0xFF,
|
|
0xFE, 0x1F, 0xFF,
|
|
0xFC, 0x3F, 0xFF,
|
|
0xF8, 0x00, 0xFF,
|
|
0xF0, 0x01, 0xFF,
|
|
0xE0, 0x03, 0xFF,
|
|
0xC0, 0x07, 0xFF,
|
|
0xFF, 0x80, 0x1F,
|
|
0xFF, 0x00, 0x3F,
|
|
0xFE, 0x01, 0x7F,
|
|
0xFC, 0x03, 0xFF,
|
|
0xF8, 0x07, 0xFF,
|
|
0xF0, 0x0F, 0xFF,
|
|
0xFF, 0x1F, 0xFF,
|
|
0xFF, 0x3F, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
};
|
|
|
|
// ── Gauge / Speedometer ───────────────────────────────────────────────────────
|
|
static const unsigned char ICON_GAUGE[] PROGMEM = {
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xC3, 0xFF,
|
|
0xFE, 0x00, 0x7F,
|
|
0xF8, 0x00, 0x1F,
|
|
0xF3, 0xFF, 0xCF,
|
|
0xEF, 0xFF, 0xF7,
|
|
0xEF, 0x07, 0xF7,
|
|
0xEF, 0x03, 0xF7,
|
|
0xEF, 0x81, 0xF7,
|
|
0xEF, 0xC0, 0xF7,
|
|
0xEF, 0xFF, 0xF7,
|
|
0xF3, 0xFF, 0xCF,
|
|
0xF8, 0x00, 0x1F,
|
|
0xFE, 0x00, 0x7F,
|
|
0xFF, 0xC3, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
};
|
|
|
|
// ── WiFi ─────────────────────────────────────────────────────────────────────
|
|
static const unsigned char ICON_WIFI[] PROGMEM = {
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xC0, 0x00, 0x03,
|
|
0x3F, 0xFF, 0xFC,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0x00, 0xFF,
|
|
0xFC, 0x00, 0x3F,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xE7, 0xFF,
|
|
0xFF, 0x81, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xC3, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
};
|
|
|
|
// ── Battery ───────────────────────────────────────────────────────────────────
|
|
static const unsigned char ICON_BATTERY[] PROGMEM = {
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xC3, 0xFF,
|
|
0xFF, 0xC3, 0xFF,
|
|
0xE0, 0x00, 0x07,
|
|
0xDF, 0xFF, 0xFB,
|
|
0xDF, 0x00, 0xFB,
|
|
0xDF, 0x00, 0xFB,
|
|
0xDF, 0x00, 0xFB,
|
|
0xDF, 0xFF, 0xFB,
|
|
0xE0, 0x00, 0x07,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
};
|
|
|
|
// ── Check / Checkmark ────────────────────────────────────────────────────────
|
|
static const unsigned char ICON_CHECK[] PROGMEM = {
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xF9,
|
|
0xFF, 0xFF, 0xF3,
|
|
0xFF, 0xFF, 0xE7,
|
|
0xFF, 0xFF, 0xCF,
|
|
0xFF, 0xFF, 0x9F,
|
|
0xE7, 0xFF, 0x3F,
|
|
0xCF, 0xFE, 0x7F,
|
|
0x9F, 0xFC, 0xFF,
|
|
0x3F, 0xF9, 0xFF,
|
|
0x7F, 0xF3, 0xFF,
|
|
0xFF, 0xE7, 0xFF,
|
|
0xFF, 0xCF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
};
|
|
|
|
// ── Warning / Exclamation ─────────────────────────────────────────────────────
|
|
static const unsigned char ICON_WARNING[] PROGMEM = {
|
|
0xFF, 0xE7, 0xFF,
|
|
0xFF, 0xC3, 0xFF,
|
|
0xFF, 0x81, 0xFF,
|
|
0xFF, 0x81, 0xFF,
|
|
0xFF, 0x00, 0xFF,
|
|
0xFE, 0x18, 0x7F,
|
|
0xFE, 0x18, 0x7F,
|
|
0xFE, 0x18, 0x7F,
|
|
0xFC, 0x18, 0x3F,
|
|
0xFC, 0x18, 0x3F,
|
|
0xFC, 0x18, 0x3F,
|
|
0xFC, 0x00, 0x3F,
|
|
0xFC, 0x18, 0x3F,
|
|
0xFC, 0x18, 0x3F,
|
|
0xFE, 0x18, 0x7F,
|
|
0xFF, 0x00, 0xFF,
|
|
0xFF, 0x81, 0xFF,
|
|
0xFF, 0x81, 0xFF,
|
|
0xFF, 0xC3, 0xFF,
|
|
0xFF, 0xE7, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
};
|
|
|
|
// ── Clock ─────────────────────────────────────────────────────────────────────
|
|
static const unsigned char ICON_CLOCK[] PROGMEM = {
|
|
0xFF, 0xC3, 0xFF,
|
|
0xFE, 0x00, 0x7F,
|
|
0xFC, 0x00, 0x3F,
|
|
0xF8, 0x00, 0x1F,
|
|
0xF3, 0xFF, 0xCF,
|
|
0xE7, 0xE7, 0xE7,
|
|
0xEF, 0xE7, 0xF7,
|
|
0xEF, 0xE7, 0xF7,
|
|
0xEF, 0xE0, 0xF7,
|
|
0xEF, 0xE0, 0x07,
|
|
0xEF, 0xFF, 0xF7,
|
|
0xE7, 0xFF, 0xE7,
|
|
0xF3, 0xFF, 0xCF,
|
|
0xF8, 0x00, 0x1F,
|
|
0xFC, 0x00, 0x3F,
|
|
0xFE, 0x00, 0x7F,
|
|
0xFF, 0xC3, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
0xFF, 0xFF, 0xFF,
|
|
};
|
|
|
|
// ── Icon registry ─────────────────────────────────────────────────────────────
|
|
|
|
struct IconEntry {
|
|
const char* name;
|
|
const unsigned char* data;
|
|
};
|
|
|
|
static const IconEntry ICON_TABLE[] = {
|
|
{ "thermometer", ICON_THERMOMETER },
|
|
{ "droplet", ICON_DROPLET },
|
|
{ "wind", ICON_WIND },
|
|
{ "pressure", ICON_PRESSURE },
|
|
{ "sun", ICON_SUN },
|
|
{ "bolt", ICON_BOLT },
|
|
{ "gauge", ICON_GAUGE },
|
|
{ "wifi", ICON_WIFI },
|
|
{ "battery", ICON_BATTERY },
|
|
{ "check", ICON_CHECK },
|
|
{ "warning", ICON_WARNING },
|
|
{ "clock", ICON_CLOCK },
|
|
};
|
|
|
|
static const size_t ICON_TABLE_SIZE = sizeof(ICON_TABLE) / sizeof(ICON_TABLE[0]);
|
|
|
|
/**
|
|
* Look up an icon bitmap by name.
|
|
* Returns nullptr if the name is not found.
|
|
*/
|
|
inline const unsigned char* getIcon(const char* name) {
|
|
for (size_t i = 0; i < ICON_TABLE_SIZE; ++i) {
|
|
if (strcmp(name, ICON_TABLE[i].name) == 0) {
|
|
return ICON_TABLE[i].data;
|
|
}
|
|
}
|
|
return nullptr;
|
|
}
|
|
|
|
inline const unsigned char* getIcon(const String& name) {
|
|
return getIcon(name.c_str());
|
|
}
|