2026-04-06 13:11:15 +02:00

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());
}