v.0.1.0 fonts as vectors

This commit is contained in:
tiijay
2025-11-07 14:19:01 +01:00
parent f0614c9a4a
commit b3d9b6bb6c
12 changed files with 426 additions and 447 deletions

View File

@@ -1,6 +1,9 @@
{ {
"files.associations": { "files.associations": {
"ostream": "cpp", "ostream": "cpp",
"font_5x7,cpp": "cpp" "font_5x7,cpp": "cpp",
"map": "cpp",
"format": "cpp",
"system_error": "cpp"
} }
} }

View File

@@ -1,16 +1,14 @@
#include "font_16x16.h" #include "font_16x16.h"
// Function to get font data for a character // Function to get font data for a character
const uint16_t *getFontChar_16x16(char c) const std::vector<uint16_t> &getFontChar_16x16(char c)
{ {
for (int i = 0; i < sizeof(font_chars_16x16) - 1; i++) auto it = font_16x16.find(c);
if (it != font_16x16.end())
{ {
if (font_chars_16x16[i] == c) return it->second;
{
return font_16x16[i];
}
} }
return font_16x16[0]; // Return space if not found (index of ' ') return font_16x16.at(' '); // Fallback to space
} }
const uint8_t fontHeight_16x16() const uint8_t fontHeight_16x16()

View File

@@ -1,203 +1,120 @@
#ifndef FONT_16X16_H #ifndef FONT_16X16_H
#define FONT_16X16_H #define FONT_16X16_H
#include <Arduino.h> #include <map>
#include <vector>
const uint16_t font_16x16[][16] = { #include <cstdint>
// Space (index 0)
{0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}, // ' '
// Exclamation mark (index 1)
{0x0006, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x0006, 0x0000, 0x000F, 0x000F, 0x0000, 0x0000}, // '!'
// Double quote (index 2)
{0x0363, 0x0363, 0x0363, 0x0363, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}, // '"'
// Hash (index 3)
{0x0318, 0x0318, 0x0318, 0x0FFF, 0x0FFF, 0x0318, 0x0318, 0x0318, 0x0318, 0x0FFF, 0x0FFF, 0x0318, 0x0318, 0x0318, 0x0000, 0x0000}, // '#'
// Dollar (index 4)
{0x0078, 0x00FE, 0x01CF, 0x01C7, 0x01C0, 0x00F8, 0x007C, 0x000F, 0x0007, 0x01C7, 0x01CF, 0x00FE, 0x0078, 0x0010, 0x0000, 0x0000}, // '$'
// Percent (index 5)
{0x0E0E, 0x1B0E, 0x1B1C, 0x0E38, 0x0070, 0x00E0, 0x01C0, 0x0380, 0x070E, 0x0E1B, 0x1C1B, 0x380E, 0x0000, 0x0000, 0x0000, 0x0000}, // '%'
// Ampersand (index 6)
{0x07C0, 0x0EE0, 0x1C70, 0x1C70, 0x0EE0, 0x07C0, 0x0FC7, 0x1CE7, 0x387E, 0x383C, 0x387E, 0x1CFF, 0x0FE7, 0x07C0, 0x0000, 0x0000}, // '&'
// Single quote (index 7)
{0x0003, 0x0003, 0x0003, 0x0003, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}, // '''
// Left parenthesis (index 8)
{0x0007, 0x000E, 0x001C, 0x001C, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x001C, 0x001C, 0x000E, 0x0007, 0x0000, 0x0000}, // '('
// Right parenthesis (index 9)
{0x0038, 0x001C, 0x000E, 0x000E, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x000E, 0x000E, 0x001C, 0x0038, 0x0000, 0x0000}, // ')'
// Asterisk (index 10)
{0x0030, 0x01B3, 0x00FC, 0x0078, 0x00FC, 0x01B3, 0x0030, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}, // '*'
// Plus (index 11)
{0x0000, 0x0000, 0x0060, 0x0060, 0x0060, 0x0060, 0x03FF, 0x03FF, 0x0060, 0x0060, 0x0060, 0x0060, 0x0000, 0x0000, 0x0000, 0x0000}, // '+'
// Comma (index 12)
{0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0007, 0x0007, 0x0003, 0x0006, 0x0000, 0x0000}, // ','
// Minus (index 13)
{0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03FF, 0x03FF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}, // '-'
// Period (index 14)
{0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0003, 0x0003, 0x0000, 0x0000, 0x0000, 0x0000}, // '.'
// Slash (index 15)
{0x0003, 0x0007, 0x000E, 0x001C, 0x0038, 0x0070, 0x00E0, 0x01C0, 0x0380, 0x0700, 0x0E00, 0x0C00, 0x0000, 0x0000, 0x0000, 0x0000}, // '/'
// Numbers 0-9 (index 16-25)
{0x01F8, 0x03FC, 0x070E, 0x0606, 0x0E07, 0x0E07, 0x0E07, 0x0E07, 0x0E07, 0x0E07, 0x0606, 0x070E, 0x03FC, 0x01F8, 0x0000, 0x0000}, // '0'
{0x000C, 0x001C, 0x003C, 0x007C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x007F, 0x007F, 0x0000, 0x0000}, // '1'
{0x00FC, 0x01FE, 0x0387, 0x0303, 0x0003, 0x0007, 0x000E, 0x001C, 0x0038, 0x0070, 0x00E0, 0x01C0, 0x03FF, 0x03FF, 0x0000, 0x0000}, // '2'
{0x00FC, 0x01FE, 0x0387, 0x0303, 0x0003, 0x0007, 0x007E, 0x007E, 0x0007, 0x0003, 0x0303, 0x0387, 0x01FE, 0x00FC, 0x0000, 0x0000}, // '3'
{0x000E, 0x001E, 0x003E, 0x006E, 0x00CE, 0x018E, 0x030E, 0x060E, 0x07FF, 0x07FF, 0x000E, 0x000E, 0x000E, 0x000E, 0x0000, 0x0000}, // '4'
{0x03FF, 0x03FF, 0x0300, 0x0300, 0x0300, 0x03FC, 0x03FE, 0x0007, 0x0003, 0x0003, 0x0303, 0x0387, 0x01FE, 0x00FC, 0x0000, 0x0000}, // '5'
{0x00FC, 0x01FE, 0x0387, 0x0303, 0x0300, 0x037C, 0x03FE, 0x0387, 0x0303, 0x0303, 0x0303, 0x0387, 0x01FE, 0x00FC, 0x0000, 0x0000}, // '6'
{0x03FF, 0x03FF, 0x0003, 0x0007, 0x000E, 0x001C, 0x0038, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0000, 0x0000}, // '7'
{0x00FC, 0x01FE, 0x0387, 0x0303, 0x0303, 0x0387, 0x01FE, 0x00FC, 0x01FE, 0x0387, 0x0303, 0x0303, 0x0387, 0x01FE, 0x00FC, 0x0000}, // '8'
{0x00FC, 0x01FE, 0x0387, 0x0303, 0x0303, 0x0387, 0x01FF, 0x00FF, 0x0003, 0x0003, 0x0303, 0x0387, 0x01FE, 0x00FC, 0x0000, 0x0000}, // '9'
// Colon (index 26)
{0x0000, 0x0000, 0x0000, 0x0003, 0x0003, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0003, 0x0003, 0x0000, 0x0000, 0x0000, 0x0000}, // ':'
// Semicolon (index 27)
{0x0000, 0x0000, 0x0000, 0x0006, 0x0006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, 0x0006, 0x0003, 0x0006, 0x0000, 0x0000}, // ';'
// Less than (index 28)
{0x0003, 0x000F, 0x003C, 0x00F0, 0x03C0, 0x0700, 0x03C0, 0x00F0, 0x003C, 0x000F, 0x0003, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}, // '<'
// Equal (index 29)
{0x0000, 0x0000, 0x0000, 0x0000, 0x03FF, 0x03FF, 0x0000, 0x0000, 0x03FF, 0x03FF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}, // '='
// Greater than (index 30)
{0x0600, 0x0780, 0x01E0, 0x0078, 0x001E, 0x0007, 0x001E, 0x0078, 0x01E0, 0x0780, 0x0600, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}, // '>'
// Question mark (index 31)
{0x007C, 0x00FE, 0x01C7, 0x0183, 0x0003, 0x0007, 0x000E, 0x001C, 0x0018, 0x0000, 0x0018, 0x0018, 0x0000, 0x0000, 0x0000, 0x0000}, // '?'
// At symbol (index 32)
{0x01F8, 0x03FC, 0x070E, 0x0606, 0x0E3F, 0x0E7F, 0x0E67, 0x0E67, 0x0E67, 0x0E7F, 0x0E3E, 0x0600, 0x070E, 0x03FC, 0x01F8, 0x0000}, // '@'
// Uppercase A-Z (index 33-58)
{0x0070, 0x00F8, 0x00F8, 0x01DC, 0x01DC, 0x038E, 0x038E, 0x038E, 0x03FE, 0x07FF, 0x0707, 0x0707, 0x0707, 0x0707, 0x0000, 0x0000}, // 'A'
{0x07F8, 0x07FC, 0x070E, 0x070E, 0x070E, 0x071C, 0x07F8, 0x07FC, 0x070E, 0x0707, 0x0707, 0x0707, 0x070E, 0x07FE, 0x07FC, 0x0000}, // 'B'
{0x01FC, 0x03FE, 0x0787, 0x0703, 0x0E00, 0x0E00, 0x0E00, 0x0E00, 0x0E00, 0x0E00, 0x0703, 0x0787, 0x03FE, 0x01FC, 0x0000, 0x0000}, // 'C'
{0x0FF0, 0x0FFC, 0x0E1E, 0x0E0E, 0x0E07, 0x0E07, 0x0E07, 0x0E07, 0x0E07, 0x0E07, 0x0E0E, 0x0E1E, 0x0FFC, 0x0FF0, 0x0000, 0x0000}, // 'D'
{0x07FF, 0x07FF, 0x0700, 0x0700, 0x0700, 0x0700, 0x07FC, 0x07FC, 0x0700, 0x0700, 0x0700, 0x0700, 0x07FF, 0x07FF, 0x0000, 0x0000}, // 'E'
{0x07FF, 0x07FF, 0x0700, 0x0700, 0x0700, 0x0700, 0x07FC, 0x07FC, 0x0700, 0x0700, 0x0700, 0x0700, 0x0700, 0x0700, 0x0000, 0x0000}, // 'F'
{0x01FC, 0x03FE, 0x0787, 0x0703, 0x0E00, 0x0E00, 0x0E3F, 0x0E3F, 0x0E07, 0x0E07, 0x0707, 0x0787, 0x03FF, 0x01FF, 0x0000, 0x0000}, // 'G'
{0x0E07, 0x0E07, 0x0E07, 0x0E07, 0x0E07, 0x0E07, 0x0FFF, 0x0FFF, 0x0E07, 0x0E07, 0x0E07, 0x0E07, 0x0E07, 0x0E07, 0x0000, 0x0000}, // 'H'
{0x007F, 0x007F, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x007F, 0x007F, 0x0000, 0x0000}, // 'I'
{0x007F, 0x007F, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x071C, 0x071C, 0x0738, 0x03F8, 0x01F0, 0x0000, 0x0000}, // 'J'
{0x0E0E, 0x0E1C, 0x0E38, 0x0E70, 0x0EE0, 0x0FC0, 0x0FC0, 0x0FE0, 0x0EF0, 0x0E78, 0x0E3C, 0x0E1C, 0x0E0E, 0x0E07, 0x0000, 0x0000}, // 'K'
{0x0700, 0x0700, 0x0700, 0x0700, 0x0700, 0x0700, 0x0700, 0x0700, 0x0700, 0x0700, 0x0700, 0x0700, 0x07FF, 0x07FF, 0x0000, 0x0000}, // 'L'
{0x1C07, 0x1E0F, 0x1E0F, 0x1F1F, 0x1F1F, 0x1DB7, 0x1DB7, 0x1DB7, 0x1CE7, 0x1CE7, 0x1CE7, 0x1C07, 0x1C07, 0x1C07, 0x0000, 0x0000}, // 'M'
{0x0E07, 0x0F07, 0x0F07, 0x0F87, 0x0FC7, 0x0EE7, 0x0E77, 0x0E77, 0x0E3F, 0x0E1F, 0x0E1F, 0x0E0F, 0x0E07, 0x0E07, 0x0000, 0x0000}, // 'N'
{0x01F8, 0x03FC, 0x078E, 0x0706, 0x0E07, 0x0E07, 0x0E07, 0x0E07, 0x0E07, 0x0E07, 0x0706, 0x078E, 0x03FC, 0x01F8, 0x0000, 0x0000}, // 'O'
{0x07F8, 0x07FC, 0x070E, 0x0707, 0x0707, 0x0707, 0x070E, 0x07FC, 0x07F8, 0x0700, 0x0700, 0x0700, 0x0700, 0x0700, 0x0000, 0x0000}, // 'P'
{0x01F8, 0x03FC, 0x078E, 0x0706, 0x0E07, 0x0E07, 0x0E07, 0x0E07, 0x0E07, 0x0E67, 0x077E, 0x07BE, 0x03FC, 0x01F7, 0x0000, 0x0000}, // 'Q'
{0x0FF0, 0x0FF8, 0x0E1C, 0x0E0E, 0x0E0E, 0x0E0E, 0x0E1C, 0x0FF8, 0x0FF0, 0x0E78, 0x0E3C, 0x0E1E, 0x0E0E, 0x0E07, 0x0000, 0x0000}, // 'R'
{0x01FC, 0x03FE, 0x0787, 0x0703, 0x0700, 0x0780, 0x03FC, 0x00FE, 0x0007, 0x0003, 0x0703, 0x0787, 0x03FE, 0x01FC, 0x0000, 0x0000}, // 'S'
{0x07FF, 0x07FF, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0000, 0x0000}, // 'T'
{0x0E07, 0x0E07, 0x0E07, 0x0E07, 0x0E07, 0x0E07, 0x0E07, 0x0E07, 0x0E07, 0x0E07, 0x0E07, 0x070E, 0x07FE, 0x01F8, 0x0000, 0x0000}, // 'U'
{0x0E07, 0x0E07, 0x070E, 0x070E, 0x070E, 0x039C, 0x039C, 0x039C, 0x01F8, 0x01F8, 0x01F8, 0x00F0, 0x00F0, 0x00F0, 0x0000, 0x0000}, // 'V'
{0x0E0E, 0x0E0E, 0x0E0E, 0x0E0E, 0x0E0E, 0x0E0E, 0x06B6, 0x06B6, 0x06B6, 0x07F7, 0x07F7, 0x07F7, 0x03E3, 0x03E3, 0x0000, 0x0000}, // 'W'
{0x0E07, 0x070E, 0x070E, 0x039C, 0x01F8, 0x01F8, 0x00F0, 0x00F0, 0x01F8, 0x01F8, 0x039C, 0x070E, 0x070E, 0x0E07, 0x0000, 0x0000}, // 'X'
{0x0E07, 0x070E, 0x070E, 0x039C, 0x039C, 0x01F8, 0x01F8, 0x00F0, 0x00F0, 0x00F0, 0x00F0, 0x00F0, 0x00F0, 0x00F0, 0x0000, 0x0000}, // 'Y'
{0x07FF, 0x07FF, 0x000E, 0x001C, 0x0038, 0x0070, 0x00E0, 0x01C0, 0x0380, 0x0700, 0x0E00, 0x0E00, 0x07FF, 0x07FF, 0x0000, 0x0000}, // 'Z'
// Left bracket (index 59)
{0x003F, 0x003F, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x003F, 0x003F, 0x0000}, // '['
// Backslash (index 60)
{0x3000, 0x3800, 0x1C00, 0x0E00, 0x0700, 0x0380, 0x01C0, 0x00E0, 0x0070, 0x0038, 0x001C, 0x000E, 0x0007, 0x0003, 0x0000, 0x0000}, // '\\'
// Right bracket (index 61)
{0x003F, 0x003F, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x003F, 0x003F, 0x0000}, // ']'
// Caret (index 62)
{0x0030, 0x0078, 0x00FC, 0x01CE, 0x0387, 0x0303, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}, // '^'
// Underscore (index 63)
{0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF}, // '_'
// Backtick (index 64)
{0x000C, 0x0006, 0x0003, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}, // '`'
// Lowercase a-z (index 65-90)
{0x0000, 0x0000, 0x0000, 0x007C, 0x00FE, 0x01C7, 0x0007, 0x007F, 0x00FF, 0x01C7, 0x0387, 0x0387, 0x01FF, 0x00F7, 0x0000, 0x0000}, // 'a'
{0x0380, 0x0380, 0x0380, 0x03BC, 0x03FE, 0x03CF, 0x0387, 0x0387, 0x0387, 0x0387, 0x0387, 0x03CF, 0x03FE, 0x03BC, 0x0000, 0x0000}, // 'b'
{0x0000, 0x0000, 0x0000, 0x007C, 0x00FE, 0x01C7, 0x0383, 0x0380, 0x0380, 0x0380, 0x0383, 0x01C7, 0x00FE, 0x007C, 0x0000, 0x0000}, // 'c'
{0x0007, 0x0007, 0x0007, 0x0077, 0x00FF, 0x01CF, 0x0387, 0x0387, 0x0387, 0x0387, 0x0387, 0x01CF, 0x00FF, 0x0077, 0x0000, 0x0000}, // 'd'
{0x0000, 0x0000, 0x0000, 0x007C, 0x00FE, 0x01C7, 0x0383, 0x03FF, 0x03FF, 0x0380, 0x0381, 0x01C3, 0x00FF, 0x007C, 0x0000, 0x0000}, // 'e'
{0x001F, 0x003F, 0x0078, 0x0070, 0x01FE, 0x01FE, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0000, 0x0000}, // 'f'
{0x0000, 0x0000, 0x0000, 0x0077, 0x00FF, 0x01CF, 0x0387, 0x0387, 0x0387, 0x0387, 0x01CF, 0x00FF, 0x0077, 0x0007, 0x01FE, 0x01FC}, // 'g'
{0x0380, 0x0380, 0x0380, 0x03BC, 0x03FE, 0x03CF, 0x0387, 0x0387, 0x0387, 0x0387, 0x0387, 0x0387, 0x0387, 0x0387, 0x0000, 0x0000}, // 'h'
{0x000C, 0x000C, 0x0000, 0x003C, 0x003C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x003F, 0x003F, 0x0000, 0x0000}, // 'i'
{0x0003, 0x0003, 0x0000, 0x000F, 0x000F, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0E3, 0x0E3, 0x007E, 0x003C}, // 'j'
{0x0700, 0x0700, 0x0700, 0x070E, 0x071C, 0x0738, 0x0770, 0x07E0, 0x07E0, 0x0770, 0x0738, 0x071C, 0x070E, 0x0707, 0x0000, 0x0000}, // 'k'
{0x003C, 0x003C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x003F, 0x003F, 0x0000, 0x0000}, // 'l'
{0x0000, 0x0000, 0x0000, 0x0EE7, 0x0FFF, 0x0F3B, 0x0E3B, 0x0E3B, 0x0E3B, 0x0E3B, 0x0E3B, 0x0E3B, 0x0E3B, 0x0E3B, 0x0000, 0x0000}, // 'm'
{0x0000, 0x0000, 0x0000, 0x03BC, 0x03FE, 0x03CF, 0x0387, 0x0387, 0x0387, 0x0387, 0x0387, 0x0387, 0x0387, 0x0387, 0x0000, 0x0000}, // 'n'
{0x0000, 0x0000, 0x0000, 0x007C, 0x00FE, 0x01C7, 0x0383, 0x0383, 0x0383, 0x0383, 0x0383, 0x01C7, 0x00FE, 0x007C, 0x0000, 0x0000}, // 'o'
{0x0000, 0x0000, 0x0000, 0x03BC, 0x03FE, 0x03CF, 0x0387, 0x0387, 0x0387, 0x0387, 0x03CF, 0x03FE, 0x03BC, 0x0380, 0x0380, 0x0380}, // 'p'
{0x0000, 0x0000, 0x0000, 0x0077, 0x00FF, 0x01CF, 0x0387, 0x0387, 0x0387, 0x0387, 0x01CF, 0x00FF, 0x0077, 0x0007, 0x0007, 0x0007}, // 'q'
{0x0000, 0x0000, 0x0000, 0x03BC, 0x03FE, 0x03CF, 0x0387, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0000, 0x0000}, // 'r'
{0x0000, 0x0000, 0x0000, 0x00FC, 0x01FE, 0x0387, 0x0380, 0x01F8, 0x00FE, 0x0007, 0x0007, 0x0387, 0x03FE, 0x01FC, 0x0000, 0x0000}, // 's'
{0x0038, 0x0038, 0x0038, 0x00FF, 0x00FF, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x001F, 0x000F, 0x0000, 0x0000}, // 't'
{0x0000, 0x0000, 0x0000, 0x0387, 0x0387, 0x0387, 0x0387, 0x0387, 0x0387, 0x0387, 0x0387, 0x01CF, 0x01FF, 0x0077, 0x0000, 0x0000}, // 'u'
{0x0000, 0x0000, 0x0000, 0x0707, 0x0707, 0x038E, 0x038E, 0x038E, 0x01DC, 0x01DC, 0x00F8, 0x00F8, 0x0070, 0x0070, 0x0000, 0x0000}, // 'v'
{0x0000, 0x0000, 0x0000, 0x0E0E, 0x0E0E, 0x0E0E, 0x06B6, 0x06B6, 0x06B6, 0x07F7, 0x07F7, 0x07F7, 0x03E3, 0x03E3, 0x0000, 0x0000}, // 'w'
{0x0000, 0x0000, 0x0000, 0x0707, 0x038E, 0x01DC, 0x00F8, 0x0070, 0x0070, 0x00F8, 0x01DC, 0x038E, 0x0707, 0x0707, 0x0000, 0x0000}, // 'x'
{0x0000, 0x0000, 0x0000, 0x0707, 0x0707, 0x038E, 0x038E, 0x01DC, 0x01DC, 0x00F8, 0x00F8, 0x0070, 0x0070, 0x00E0, 0x01C0, 0x0000}, // 'y'
{0x0000, 0x0000, 0x0000, 0x03FF, 0x03FF, 0x000E, 0x001C, 0x0038, 0x0070, 0x00E0, 0x01C0, 0x0380, 0x03FF, 0x03FF, 0x0000, 0x0000}, // 'z'
// Left brace (index 91)
{0x000F, 0x001E, 0x001C, 0x001C, 0x001C, 0x001C, 0x0038, 0x0070, 0x0038, 0x001C, 0x001C, 0x001C, 0x001C, 0x001E, 0x000F, 0x0000}, // '{'
// Vertical bar (index 92)
{0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0000}, // '|'
// Right brace (index 93)
{0x0078, 0x003C, 0x001C, 0x001C, 0x001C, 0x001C, 0x000E, 0x0007, 0x000E, 0x001C, 0x001C, 0x001C, 0x001C, 0x003C, 0x0078, 0x0000}, // '}'
// Tilde (index 94)
{0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x01C7, 0x03EF, 0x077E, 0x0738, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}, // '~'
// Degree symbol (index 95)
{0x000E, 0x001F, 0x001F, 0x001F, 0x000E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}, // '°'
// Umlaut characters (index 96-101)
{0x018C, 0x018C, 0x0000, 0x00F8, 0x01FC, 0x038E, 0x038E, 0x038E, 0x03FE, 0x07FF, 0x0707, 0x0707, 0x0707, 0x0707, 0x0000, 0x0000}, // 'Ä'
{0x0318, 0x0318, 0x0000, 0x01F8, 0x03FC, 0x078E, 0x0706, 0x0E07, 0x0E07, 0x0E07, 0x0E07, 0x0706, 0x078E, 0x03FC, 0x01F8, 0x0000}, // 'Ö'
{0x0318, 0x0318, 0x0000, 0x0E07, 0x0E07, 0x0E07, 0x0E07, 0x0E07, 0x0E07, 0x0E07, 0x0E07, 0x0E07, 0x070E, 0x07FE, 0x01F8, 0x0000}, // 'Ü'
{0x00C6, 0x00C6, 0x0000, 0x007C, 0x00FE, 0x01C7, 0x0007, 0x007F, 0x00FF, 0x01C7, 0x0387, 0x0387, 0x01FF, 0x00F7, 0x0000, 0x0000}, // 'ä'
{0x00C6, 0x00C6, 0x0000, 0x007C, 0x00FE, 0x01C7, 0x0383, 0x0383, 0x0383, 0x0383, 0x0383, 0x01C7, 0x00FE, 0x007C, 0x0000, 0x0000}, // 'ö'
{0x00C6, 0x00C6, 0x0000, 0x0387, 0x0387, 0x0387, 0x0387, 0x0387, 0x0387, 0x0387, 0x0387, 0x01CF, 0x01FF, 0x0077, 0x0000, 0x0000}, // 'ü'
// Eszett (index 102)
{0x007C, 0x00FE, 0x01C7, 0x01C7, 0x01C7, 0x01CE, 0x01FC, 0x01FE, 0x01CF, 0x01C7, 0x01C7, 0x01CF, 0x01FE, 0x01BC, 0x0180, 0x0180}, // 'ß'
// Bullet (index 103)
{0x0000, 0x0000, 0x0000, 0x0000, 0x003C, 0x007E, 0x00FF, 0x00FF, 0x00FF, 0x00FF, 0x007E, 0x003C, 0x0000, 0x0000, 0x0000, 0x0000}, // '•'
// Euro symbol (index 104)
{0x01F8, 0x07FC, 0x0F0E, 0x1C07, 0x1FC0, 0x1FC0, 0x3800, 0x1FC0, 0x1FC0, 0x3800, 0x1FC0, 0x1FC0, 0x1C07, 0x0F0E, 0x07FC, 0x01F8}, // '€'
const std::map<uint8_t, std::vector<uint16_t>> font_16x16 = {
{' ', {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}},
{'!', {0x0006, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x0006, 0x0000, 0x000F, 0x000F, 0x0000, 0x0000}},
{'"', {0x0363, 0x0363, 0x0363, 0x0363, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}},
{'#', {0x0318, 0x0318, 0x0318, 0x0FFF, 0x0FFF, 0x0318, 0x0318, 0x0318, 0x0318, 0x0FFF, 0x0FFF, 0x0318, 0x0318, 0x0318, 0x0000, 0x0000}},
{'$', {0x0078, 0x00FE, 0x01CF, 0x01C7, 0x01C0, 0x00F8, 0x007C, 0x000F, 0x0007, 0x01C7, 0x01CF, 0x00FE, 0x0078, 0x0010, 0x0000, 0x0000}},
{'%', {0x0E0E, 0x1B0E, 0x1B1C, 0x0E38, 0x0070, 0x00E0, 0x01C0, 0x0380, 0x070E, 0x0E1B, 0x1C1B, 0x380E, 0x0000, 0x0000, 0x0000, 0x0000}},
{'&', {0x07C0, 0x0EE0, 0x1C70, 0x1C70, 0x0EE0, 0x07C0, 0x0FC7, 0x1CE7, 0x387E, 0x383C, 0x387E, 0x1CFF, 0x0FE7, 0x07C0, 0x0000, 0x0000}},
{'\'', {0x0003, 0x0003, 0x0003, 0x0003, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}},
{'(', {0x0007, 0x000E, 0x001C, 0x001C, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x001C, 0x001C, 0x000E, 0x0007, 0x0000, 0x0000}},
{')', {0x0038, 0x001C, 0x000E, 0x000E, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x000E, 0x000E, 0x001C, 0x0038, 0x0000, 0x0000}},
{'*', {0x0030, 0x01B3, 0x00FC, 0x0078, 0x00FC, 0x01B3, 0x0030, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}},
{'+', {0x0000, 0x0000, 0x0060, 0x0060, 0x0060, 0x0060, 0x03FF, 0x03FF, 0x0060, 0x0060, 0x0060, 0x0060, 0x0000, 0x0000, 0x0000, 0x0000}},
{',', {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0007, 0x0007, 0x0003, 0x0006, 0x0000, 0x0000}},
{'-', {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03FF, 0x03FF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}},
{'.', {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0003, 0x0003, 0x0000, 0x0000, 0x0000, 0x0000}},
{'/', {0x0003, 0x0007, 0x000E, 0x001C, 0x0038, 0x0070, 0x00E0, 0x01C0, 0x0380, 0x0700, 0x0E00, 0x0C00, 0x0000, 0x0000, 0x0000, 0x0000}},
{'0', {0x01F8, 0x03FC, 0x070E, 0x0606, 0x0E07, 0x0E07, 0x0E07, 0x0E07, 0x0E07, 0x0E07, 0x0606, 0x070E, 0x03FC, 0x01F8, 0x0000, 0x0000}},
{'1', {0x000C, 0x001C, 0x003C, 0x007C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x007F, 0x007F, 0x0000, 0x0000}},
{'2', {0x00FC, 0x01FE, 0x0387, 0x0303, 0x0003, 0x0007, 0x000E, 0x001C, 0x0038, 0x0070, 0x00E0, 0x01C0, 0x03FF, 0x03FF, 0x0000, 0x0000}},
{'3', {0x00FC, 0x01FE, 0x0387, 0x0303, 0x0003, 0x0007, 0x007E, 0x007E, 0x0007, 0x0003, 0x0303, 0x0387, 0x01FE, 0x00FC, 0x0000, 0x0000}},
{'4', {0x000E, 0x001E, 0x003E, 0x006E, 0x00CE, 0x018E, 0x030E, 0x060E, 0x07FF, 0x07FF, 0x000E, 0x000E, 0x000E, 0x000E, 0x0000, 0x0000}},
{'5', {0x03FF, 0x03FF, 0x0300, 0x0300, 0x0300, 0x03FC, 0x03FE, 0x0007, 0x0003, 0x0003, 0x0303, 0x0387, 0x01FE, 0x00FC, 0x0000, 0x0000}},
{'6', {0x00FC, 0x01FE, 0x0387, 0x0303, 0x0300, 0x037C, 0x03FE, 0x0387, 0x0303, 0x0303, 0x0303, 0x0387, 0x01FE, 0x00FC, 0x0000, 0x0000}},
{'7', {0x03FF, 0x03FF, 0x0003, 0x0007, 0x000E, 0x001C, 0x0038, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0000, 0x0000}},
{'8', {0x00FC, 0x01FE, 0x0387, 0x0303, 0x0303, 0x0387, 0x01FE, 0x00FC, 0x01FE, 0x0387, 0x0303, 0x0303, 0x0387, 0x01FE, 0x00FC, 0x0000}},
{'9', {0x00FC, 0x01FE, 0x0387, 0x0303, 0x0303, 0x0387, 0x01FF, 0x00FF, 0x0003, 0x0003, 0x0303, 0x0387, 0x01FE, 0x00FC, 0x0000, 0x0000}},
{':', {0x0000, 0x0000, 0x0000, 0x0003, 0x0003, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0003, 0x0003, 0x0000, 0x0000, 0x0000, 0x0000}},
{';', {0x0000, 0x0000, 0x0000, 0x0006, 0x0006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, 0x0006, 0x0003, 0x0006, 0x0000, 0x0000}},
{'<', {0x0003, 0x000F, 0x003C, 0x00F0, 0x03C0, 0x0700, 0x03C0, 0x00F0, 0x003C, 0x000F, 0x0003, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}},
{'=', {0x0000, 0x0000, 0x0000, 0x0000, 0x03FF, 0x03FF, 0x0000, 0x0000, 0x03FF, 0x03FF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}},
{'>', {0x0600, 0x0780, 0x01E0, 0x0078, 0x001E, 0x0007, 0x001E, 0x0078, 0x01E0, 0x0780, 0x0600, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}},
{'?', {0x007C, 0x00FE, 0x01C7, 0x0183, 0x0003, 0x0007, 0x000E, 0x001C, 0x0018, 0x0000, 0x0018, 0x0018, 0x0000, 0x0000, 0x0000, 0x0000}},
{'@', {0x01F8, 0x03FC, 0x070E, 0x0606, 0x0E3F, 0x0E7F, 0x0E67, 0x0E67, 0x0E67, 0x0E7F, 0x0E3E, 0x0600, 0x070E, 0x03FC, 0x01F8, 0x0000}},
{'A', {0x0070, 0x00F8, 0x00F8, 0x01DC, 0x01DC, 0x038E, 0x038E, 0x038E, 0x03FE, 0x07FF, 0x0707, 0x0707, 0x0707, 0x0707, 0x0000, 0x0000}},
{'B', {0x07F8, 0x07FC, 0x070E, 0x070E, 0x070E, 0x071C, 0x07F8, 0x07FC, 0x070E, 0x0707, 0x0707, 0x0707, 0x070E, 0x07FE, 0x07FC, 0x0000}},
{'C', {0x01FC, 0x03FE, 0x0787, 0x0703, 0x0E00, 0x0E00, 0x0E00, 0x0E00, 0x0E00, 0x0E00, 0x0703, 0x0787, 0x03FE, 0x01FC, 0x0000, 0x0000}},
{'D', {0x0FF0, 0x0FFC, 0x0E1E, 0x0E0E, 0x0E07, 0x0E07, 0x0E07, 0x0E07, 0x0E07, 0x0E07, 0x0E0E, 0x0E1E, 0x0FFC, 0x0FF0, 0x0000, 0x0000}},
{'E', {0x07FF, 0x07FF, 0x0700, 0x0700, 0x0700, 0x0700, 0x07FC, 0x07FC, 0x0700, 0x0700, 0x0700, 0x0700, 0x07FF, 0x07FF, 0x0000, 0x0000}},
{'F', {0x07FF, 0x07FF, 0x0700, 0x0700, 0x0700, 0x0700, 0x07FC, 0x07FC, 0x0700, 0x0700, 0x0700, 0x0700, 0x0700, 0x0700, 0x0000, 0x0000}},
{'G', {0x01FC, 0x03FE, 0x0787, 0x0703, 0x0E00, 0x0E00, 0x0E3F, 0x0E3F, 0x0E07, 0x0E07, 0x0707, 0x0787, 0x03FF, 0x01FF, 0x0000, 0x0000}},
{'H', {0x0E07, 0x0E07, 0x0E07, 0x0E07, 0x0E07, 0x0E07, 0x0FFF, 0x0FFF, 0x0E07, 0x0E07, 0x0E07, 0x0E07, 0x0E07, 0x0E07, 0x0000, 0x0000}},
{'I', {0x007F, 0x007F, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x007F, 0x007F, 0x0000, 0x0000}},
{'J', {0x007F, 0x007F, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x001C, 0x071C, 0x071C, 0x0738, 0x03F8, 0x01F0, 0x0000, 0x0000}},
{'K', {0x0E0E, 0x0E1C, 0x0E38, 0x0E70, 0x0EE0, 0x0FC0, 0x0FC0, 0x0FE0, 0x0EF0, 0x0E78, 0x0E3C, 0x0E1C, 0x0E0E, 0x0E07, 0x0000, 0x0000}},
{'L', {0x0700, 0x0700, 0x0700, 0x0700, 0x0700, 0x0700, 0x0700, 0x0700, 0x0700, 0x0700, 0x0700, 0x0700, 0x07FF, 0x07FF, 0x0000, 0x0000}},
{'M', {0x1C07, 0x1E0F, 0x1E0F, 0x1F1F, 0x1F1F, 0x1DB7, 0x1DB7, 0x1CE7, 0x1CE7, 0x1CE7, 0x1C07, 0x1C07, 0x1C07, 0x1C07, 0x0000, 0x0000}},
{'N', {0x0E07, 0x0F07, 0x0F07, 0x0F87, 0x0FC7, 0x0EE7, 0x0E77, 0x0E77, 0x0E3F, 0x0E1F, 0x0E1F, 0x0E0F, 0x0E07, 0x0E07, 0x0000, 0x0000}},
{'O', {0x01F8, 0x03FC, 0x078E, 0x0706, 0x0E07, 0x0E07, 0x0E07, 0x0E07, 0x0E07, 0x0E07, 0x0706, 0x078E, 0x03FC, 0x01F8, 0x0000, 0x0000}},
{'P', {0x07F8, 0x07FC, 0x070E, 0x0707, 0x0707, 0x0707, 0x070E, 0x07FC, 0x07F8, 0x0700, 0x0700, 0x0700, 0x0700, 0x0700, 0x0000, 0x0000}},
{'Q', {0x01F8, 0x03FC, 0x078E, 0x0706, 0x0E07, 0x0E07, 0x0E07, 0x0E07, 0x0E07, 0x0E67, 0x077E, 0x07BE, 0x03FC, 0x01F7, 0x0000, 0x0000}},
{'R', {0x0FF0, 0x0FF8, 0x0E1C, 0x0E0E, 0x0E0E, 0x0E0E, 0x0E1C, 0x0FF8, 0x0FF0, 0x0E78, 0x0E3C, 0x0E1E, 0x0E0E, 0x0E07, 0x0000, 0x0000}},
{'S', {0x01FC, 0x03FE, 0x0787, 0x0703, 0x0700, 0x0780, 0x03FC, 0x00FE, 0x0007, 0x0003, 0x0703, 0x0787, 0x03FE, 0x01FC, 0x0000, 0x0000}},
{'T', {0x07FF, 0x07FF, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0000, 0x0000}},
{'U', {0x0E07, 0x0E07, 0x0E07, 0x0E07, 0x0E07, 0x0E07, 0x0E07, 0x0E07, 0x0E07, 0x0E07, 0x0E07, 0x070E, 0x07FE, 0x01F8, 0x0000, 0x0000}},
{'V', {0x0E07, 0x0E07, 0x070E, 0x070E, 0x070E, 0x039C, 0x039C, 0x039C, 0x01F8, 0x01F8, 0x01F8, 0x00F0, 0x00F0, 0x00F0, 0x0000, 0x0000}},
{'W', {0x0E0E, 0x0E0E, 0x0E0E, 0x0E0E, 0x0E0E, 0x0E0E, 0x06B6, 0x06B6, 0x06B6, 0x07F7, 0x07F7, 0x07F7, 0x03E3, 0x03E3, 0x0000, 0x0000}},
{'X', {0x0E07, 0x070E, 0x070E, 0x039C, 0x01F8, 0x01F8, 0x00F0, 0x00F0, 0x01F8, 0x01F8, 0x039C, 0x070E, 0x070E, 0x0E07, 0x0000, 0x0000}},
{'Y', {0x0E07, 0x070E, 0x070E, 0x039C, 0x039C, 0x01F8, 0x01F8, 0x00F0, 0x00F0, 0x00F0, 0x00F0, 0x00F0, 0x00F0, 0x00F0, 0x0000, 0x0000}},
{'Z', {0x07FF, 0x07FF, 0x000E, 0x001C, 0x0038, 0x0070, 0x00E0, 0x01C0, 0x0380, 0x0700, 0x0E00, 0x0E00, 0x07FF, 0x07FF, 0x0000, 0x0000}},
{'[', {0x003F, 0x003F, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x003F, 0x003F, 0x0000}},
{'\\', {0x3000, 0x3800, 0x1C00, 0x0E00, 0x0700, 0x0380, 0x01C0, 0x00E0, 0x0070, 0x0038, 0x001C, 0x000E, 0x0007, 0x0003, 0x0000, 0x0000}},
{']', {0x003F, 0x003F, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x003F, 0x003F, 0x0000}},
{'^', {0x0030, 0x0078, 0x00FC, 0x01CE, 0x0387, 0x0303, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}},
{'_', {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF}},
{'`', {0x000C, 0x0006, 0x0003, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}},
{'a', {0x0000, 0x0000, 0x0000, 0x007C, 0x00FE, 0x01C7, 0x0007, 0x007F, 0x00FF, 0x01C7, 0x0387, 0x0387, 0x01FF, 0x00F7, 0x0000, 0x0000}},
{'b', {0x0380, 0x0380, 0x0380, 0x03BC, 0x03FE, 0x03CF, 0x0387, 0x0387, 0x0387, 0x0387, 0x0387, 0x03CF, 0x03FE, 0x03BC, 0x0000, 0x0000}},
{'c', {0x0000, 0x0000, 0x0000, 0x007C, 0x00FE, 0x01C7, 0x0383, 0x0380, 0x0380, 0x0380, 0x0383, 0x01C7, 0x00FE, 0x007C, 0x0000, 0x0000}},
{'d', {0x0007, 0x0007, 0x0007, 0x0077, 0x00FF, 0x01CF, 0x0387, 0x0387, 0x0387, 0x0387, 0x0387, 0x01CF, 0x00FF, 0x0077, 0x0000, 0x0000}},
{'e', {0x0000, 0x0000, 0x0000, 0x007C, 0x00FE, 0x01C7, 0x0383, 0x03FF, 0x03FF, 0x0380, 0x0381, 0x01C3, 0x00FF, 0x007C, 0x0000, 0x0000}},
{'f', {0x001F, 0x003F, 0x0078, 0x0070, 0x01FE, 0x01FE, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0000, 0x0000}},
{'g', {0x0000, 0x0000, 0x0000, 0x0077, 0x00FF, 0x01CF, 0x0387, 0x0387, 0x0387, 0x0387, 0x01CF, 0x00FF, 0x0077, 0x0007, 0x01FE, 0x01FC}},
{'h', {0x0380, 0x0380, 0x0380, 0x03BC, 0x03FE, 0x03CF, 0x0387, 0x0387, 0x0387, 0x0387, 0x0387, 0x0387, 0x0387, 0x0387, 0x0000, 0x0000}},
{'i', {0x000C, 0x000C, 0x0000, 0x003C, 0x003C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x003F, 0x003F, 0x0000, 0x0000}},
{'j', {0x0003, 0x0003, 0x0000, 0x000F, 0x000F, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0E03, 0x0E03, 0x007E, 0x003C}},
{'k', {0x0700, 0x0700, 0x0700, 0x070E, 0x071C, 0x0738, 0x0770, 0x07E0, 0x07E0, 0x0770, 0x0738, 0x071C, 0x070E, 0x0707, 0x0000, 0x0000}},
{'l', {0x003C, 0x003C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x003F, 0x003F, 0x0000, 0x0000}},
{'m', {0x0000, 0x0000, 0x0000, 0x0EE7, 0x0FFF, 0x0F3B, 0x0E3B, 0x0E3B, 0x0E3B, 0x0E3B, 0x0E3B, 0x0E3B, 0x0E3B, 0x0E3B, 0x0000, 0x0000}},
{'n', {0x0000, 0x0000, 0x0000, 0x03BC, 0x03FE, 0x03CF, 0x0387, 0x0387, 0x0387, 0x0387, 0x0387, 0x0387, 0x0387, 0x0387, 0x0000, 0x0000}},
{'o', {0x0000, 0x0000, 0x0000, 0x007C, 0x00FE, 0x01C7, 0x0383, 0x0383, 0x0383, 0x0383, 0x0383, 0x01C7, 0x00FE, 0x007C, 0x0000, 0x0000}},
{'p', {0x0000, 0x0000, 0x0000, 0x03BC, 0x03FE, 0x03CF, 0x0387, 0x0387, 0x0387, 0x0387, 0x03CF, 0x03FE, 0x03BC, 0x0380, 0x0380, 0x0380}},
{'q', {0x0000, 0x0000, 0x0000, 0x0077, 0x00FF, 0x01CF, 0x0387, 0x0387, 0x0387, 0x0387, 0x01CF, 0x00FF, 0x0077, 0x0007, 0x0007, 0x0007}},
{'r', {0x0000, 0x0000, 0x0000, 0x03BC, 0x03FE, 0x03CF, 0x0387, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0000, 0x0000}},
{'s', {0x0000, 0x0000, 0x0000, 0x00FC, 0x01FE, 0x0387, 0x0380, 0x01F8, 0x00FE, 0x0007, 0x0007, 0x0387, 0x03FE, 0x01FC, 0x0000, 0x0000}},
{'t', {0x0038, 0x0038, 0x0038, 0x00FF, 0x00FF, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x001F, 0x000F, 0x0000, 0x0000}},
{'u', {0x0000, 0x0000, 0x0000, 0x0387, 0x0387, 0x0387, 0x0387, 0x0387, 0x0387, 0x0387, 0x0387, 0x01CF, 0x01FF, 0x0077, 0x0000, 0x0000}},
{'v', {0x0000, 0x0000, 0x0000, 0x0707, 0x0707, 0x038E, 0x038E, 0x038E, 0x01DC, 0x01DC, 0x00F8, 0x00F8, 0x0070, 0x0070, 0x0000, 0x0000}},
{'w', {0x0000, 0x0000, 0x0000, 0x0E0E, 0x0E0E, 0x0E0E, 0x06B6, 0x06B6, 0x06B6, 0x07F7, 0x07F7, 0x07F7, 0x03E3, 0x03E3, 0x0000, 0x0000}},
{'x', {0x0000, 0x0000, 0x0000, 0x0707, 0x038E, 0x01DC, 0x00F8, 0x0070, 0x0070, 0x00F8, 0x01DC, 0x038E, 0x0707, 0x0707, 0x0000, 0x0000}},
{'y', {0x0000, 0x0000, 0x0000, 0x0707, 0x0707, 0x038E, 0x038E, 0x01DC, 0x01DC, 0x00F8, 0x00F8, 0x0070, 0x0070, 0x00E0, 0x01C0, 0x0000}},
{'z', {0x0000, 0x0000, 0x0000, 0x03FF, 0x03FF, 0x000E, 0x001C, 0x0038, 0x0070, 0x00E0, 0x01C0, 0x0380, 0x03FF, 0x03FF, 0x0000, 0x0000}},
{'{', {0x000F, 0x001E, 0x001C, 0x001C, 0x001C, 0x001C, 0x0038, 0x0070, 0x0038, 0x001C, 0x001C, 0x001C, 0x001C, 0x001E, 0x000F, 0x0000}},
{'|', {0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0000}},
{'}', {0x0078, 0x003C, 0x001C, 0x001C, 0x001C, 0x001C, 0x000E, 0x0007, 0x000E, 0x001C, 0x001C, 0x001C, 0x001C, 0x003C, 0x0078, 0x0000}},
{'~', {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x01C7, 0x03EF, 0x077E, 0x0738, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}},
// {'°', {0x000E, 0x001F, 0x001F, 0x001F, 0x000E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}},
// {'Ä', {0x018C, 0x018C, 0x0000, 0x00F8, 0x01FC, 0x038E, 0x038E, 0x038E, 0x03FE, 0x07FF, 0x0707, 0x0707, 0x0707, 0x0707, 0x0000, 0x0000}},
// {'Ö', {0x0318, 0x0318, 0x0000, 0x01F8, 0x03FC, 0x078E, 0x0706, 0x0E07, 0x0E07, 0x0E07, 0x0E07, 0x0706, 0x078E, 0x03FC, 0x01F8, 0x0000}},
// {'Ü', {0x0318, 0x0318, 0x0000, 0x0E07, 0x0E07, 0x0E07, 0x0E07, 0x0E07, 0x0E07, 0x0E07, 0x0E07, 0x0E07, 0x070E, 0x07FE, 0x01F8, 0x0000}},
// {'ä', {0x00C6, 0x00C6, 0x0000, 0x007C, 0x00FE, 0x01C7, 0x0007, 0x007F, 0x00FF, 0x01C7, 0x0387, 0x0387, 0x01FF, 0x00F7, 0x0000, 0x0000}},
// {'ö', {0x00C6, 0x00C6, 0x0000, 0x007C, 0x00FE, 0x01C7, 0x0383, 0x0383, 0x0383, 0x0383, 0x0383, 0x01C7, 0x00FE, 0x007C, 0x0000, 0x0000}},
// {'ü', {0x00C6, 0x00C6, 0x0000, 0x0387, 0x0387, 0x0387, 0x0387, 0x0387, 0x0387, 0x0387, 0x0387, 0x01CF, 0x01FF, 0x0077, 0x0000, 0x0000}},
// {'ß', {0x007C, 0x00FE, 0x01C7, 0x01C7, 0x01C7, 0x01CE, 0x01FC, 0x01FE, 0x01CF, 0x01C7, 0x01C7, 0x01CF, 0x01FE, 0x01BC, 0x0180, 0x0180}},
// {'•', {0x0000, 0x0000, 0x0000, 0x0000, 0x003C, 0x007E, 0x00FF, 0x00FF, 0x00FF, 0x00FF, 0x007E, 0x003C, 0x0000, 0x0000, 0x0000, 0x0000}},
// {'€', {0x01F8, 0x07FC, 0x0F0E, 0x1C07, 0x1FC0, 0x1FC0, 0x3800, 0x1FC0, 0x1FC0, 0x3800, 0x1FC0, 0x1FC0, 0x1C07, 0x0F0E, 0x07FC, 0x01F8}}
}; };
// Character mapping
const char font_chars_16x16[] = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~°ÄÖÜäßäöü•€";
// Declarations only // Declarations only
const uint16_t *getFontChar_16x16(char c); const std::vector<uint16_t> &getFontChar_16x16(char c);
const uint8_t fontHeight_16x16(); const uint8_t fontHeight_16x16();
#endif #endif

View File

@@ -1,16 +1,14 @@
#include "font_5x7.h" #include "font_5x7.h"
// Function to get font data for a character // Function to get font data for a character
const uint8_t *getFontChar_5x7(char c) const std::vector<uint8_t> &getFontChar_5x7(char c)
{ {
for (int i = 0; i < sizeof(font_chars_5x7) - 1; i++) auto it = font_5x7.find(c);
if (it != font_5x7.end())
{ {
if (font_chars_5x7[i] == c) return it->second;
{
return font_5x7[i];
}
} }
return font_5x7[52]; // Return space if not found (index of ' ') return font_5x7.at(' '); // Fallback to space
} }
const uint8_t fontHeight_5x7() const uint8_t fontHeight_5x7()

View File

@@ -1,124 +1,122 @@
#ifndef FONT_5X7_H #ifndef FONT_5X7_H
#define FONT_5X7_H #define FONT_5X7_H
#include <Arduino.h> #include <map>
#include <vector>
#include <cstdint>
// 5x7 Font mit optimierten Zeichenbreiten using namespace std;
const uint8_t font_5x7[][7] = {
const std::map<uint8_t, std::vector<uint8_t>> font_5x7 = {
// Uppercase letters (A-Z) // Uppercase letters (A-Z)
{0x0E, 0x11, 0x11, 0x1F, 0x11, 0x11, 0x11}, // 'A' Width: 5 {'A', {0x0E, 0x11, 0x11, 0x1F, 0x11, 0x11, 0x11}},
{0x1E, 0x11, 0x11, 0x1E, 0x11, 0x11, 0x1E}, // 'B' Width: 5 {'B', {0x1E, 0x11, 0x11, 0x1E, 0x11, 0x11, 0x1E}},
{0x0E, 0x11, 0x10, 0x10, 0x10, 0x11, 0x0E}, // 'C' Width: 5 {'C', {0x0E, 0x11, 0x10, 0x10, 0x10, 0x11, 0x0E}},
{0x1E, 0x11, 0x11, 0x11, 0x11, 0x11, 0x1E}, // 'D' Width: 5 {'D', {0x1E, 0x11, 0x11, 0x11, 0x11, 0x11, 0x1E}},
{0x1F, 0x10, 0x10, 0x1E, 0x10, 0x10, 0x1F}, // 'E' Width: 5 {'E', {0x1F, 0x10, 0x10, 0x1E, 0x10, 0x10, 0x1F}},
{0x1F, 0x10, 0x10, 0x1E, 0x10, 0x10, 0x10}, // 'F' Width: 5 {'F', {0x1F, 0x10, 0x10, 0x1E, 0x10, 0x10, 0x10}},
{0x0E, 0x11, 0x10, 0x13, 0x11, 0x11, 0x0F}, // 'G' Width: 5 {'G', {0x0E, 0x11, 0x10, 0x13, 0x11, 0x11, 0x0F}},
{0x11, 0x11, 0x11, 0x1F, 0x11, 0x11, 0x11}, // 'H' Width: 5 {'H', {0x11, 0x11, 0x11, 0x1F, 0x11, 0x11, 0x11}},
{0x07, 0x02, 0x02, 0x02, 0x02, 0x02, 0x07}, // 'I' Width: 3 {'I', {0x07, 0x02, 0x02, 0x02, 0x02, 0x02, 0x07}},
{0x07, 0x02, 0x02, 0x02, 0x02, 0x12, 0x0C}, // 'J' Width: 4 {'J', {0x07, 0x02, 0x02, 0x02, 0x02, 0x12, 0x0C}},
{0x11, 0x12, 0x14, 0x18, 0x14, 0x12, 0x11}, // 'K' Width: 5 {'K', {0x11, 0x12, 0x14, 0x18, 0x14, 0x12, 0x11}},
{0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x1F}, // 'L' Width: 5 {'L', {0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x1F}},
{0x11, 0x1B, 0x15, 0x15, 0x11, 0x11, 0x11}, // 'M' Width: 5 {'M', {0x11, 0x1B, 0x15, 0x15, 0x11, 0x11, 0x11}},
{0x11, 0x19, 0x19, 0x15, 0x13, 0x13, 0x11}, // 'N' Width: 5 {'N', {0x11, 0x19, 0x19, 0x15, 0x13, 0x13, 0x11}},
{0x0E, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0E}, // 'O' Width: 5 {'O', {0x0E, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0E}},
{0x1E, 0x11, 0x11, 0x1E, 0x10, 0x10, 0x10}, // 'P' Width: 5 {'P', {0x1E, 0x11, 0x11, 0x1E, 0x10, 0x10, 0x10}},
{0x0E, 0x11, 0x11, 0x11, 0x15, 0x12, 0x0D}, // 'Q' Width: 5 {'Q', {0x0E, 0x11, 0x11, 0x11, 0x15, 0x12, 0x0D}},
{0x1E, 0x11, 0x11, 0x1E, 0x14, 0x12, 0x11}, // 'R' Width: 5 {'R', {0x1E, 0x11, 0x11, 0x1E, 0x14, 0x12, 0x11}},
{0x0F, 0x10, 0x10, 0x0E, 0x01, 0x01, 0x1E}, // 'S' Width: 5 {'S', {0x0F, 0x10, 0x10, 0x0E, 0x01, 0x01, 0x1E}},
{0x1F, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04}, // 'T' Width: 5 {'T', {0x1F, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04}},
{0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0E}, // 'U' Width: 5 {'U', {0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0E}},
{0x11, 0x11, 0x11, 0x11, 0x11, 0x0A, 0x04}, // 'V' Width: 5 {'V', {0x11, 0x11, 0x11, 0x11, 0x11, 0x0A, 0x04}},
{0x11, 0x11, 0x11, 0x15, 0x15, 0x15, 0x0A}, // 'W' Width: 5 {'W', {0x11, 0x11, 0x11, 0x15, 0x15, 0x15, 0x0A}},
{0x11, 0x11, 0x0A, 0x04, 0x0A, 0x11, 0x11}, // 'X' Width: 5 {'X', {0x11, 0x11, 0x0A, 0x04, 0x0A, 0x11, 0x11}},
{0x11, 0x11, 0x0A, 0x04, 0x04, 0x04, 0x04}, // 'Y' Width: 5 {'Y', {0x11, 0x11, 0x0A, 0x04, 0x04, 0x04, 0x04}},
{0x1F, 0x01, 0x02, 0x04, 0x08, 0x10, 0x1F}, // 'Z' Width: 5 {'Z', {0x1F, 0x01, 0x02, 0x04, 0x08, 0x10, 0x1F}},
// Lowercase letters (a-z) // Lowercase letters (a-z)
{0x00, 0x00, 0x0E, 0x01, 0x0F, 0x11, 0x0F}, // 'a' Width: 4 {'a', {0x00, 0x00, 0x0E, 0x01, 0x0F, 0x11, 0x0F}},
{0x10, 0x10, 0x16, 0x19, 0x11, 0x11, 0x1E}, // 'b' Width: 5 {'b', {0x10, 0x10, 0x16, 0x19, 0x11, 0x11, 0x1E}},
{0x00, 0x00, 0x0E, 0x11, 0x10, 0x11, 0x0E}, // 'c' Width: 4 {'c', {0x00, 0x00, 0x0E, 0x11, 0x10, 0x11, 0x0E}},
{0x01, 0x01, 0x0D, 0x13, 0x11, 0x11, 0x0F}, // 'd' Width: 5 {'d', {0x01, 0x01, 0x0D, 0x13, 0x11, 0x11, 0x0F}},
{0x00, 0x00, 0x0E, 0x11, 0x1F, 0x10, 0x0E}, // 'e' Width: 4 {'e', {0x00, 0x00, 0x0E, 0x11, 0x1F, 0x10, 0x0E}},
{0x06, 0x09, 0x08, 0x1C, 0x08, 0x08, 0x08}, // 'f' Width: 4 {'f', {0x06, 0x09, 0x08, 0x1C, 0x08, 0x08, 0x08}},
{0x00, 0x0F, 0x11, 0x11, 0x0F, 0x01, 0x0E}, // 'g' Width: 5 {'g', {0x00, 0x0F, 0x11, 0x11, 0x0F, 0x01, 0x0E}},
{0x10, 0x10, 0x16, 0x19, 0x11, 0x11, 0x11}, // 'h' Width: 5 {'h', {0x10, 0x10, 0x16, 0x19, 0x11, 0x11, 0x11}},
{0x00, 0x02, 0x00, 0x06, 0x02, 0x02, 0x07}, // 'i' Width: 2 {'i', {0x00, 0x02, 0x00, 0x06, 0x02, 0x02, 0x07}},
{0x00, 0x02, 0x00, 0x06, 0x02, 0x12, 0x0C}, // 'j' Width: 3 {'j', {0x00, 0x02, 0x00, 0x06, 0x02, 0x12, 0x0C}},
{0x10, 0x10, 0x12, 0x14, 0x18, 0x14, 0x12}, // 'k' Width: 4 {'k', {0x10, 0x10, 0x12, 0x14, 0x18, 0x14, 0x12}},
{0x06, 0x02, 0x02, 0x02, 0x02, 0x02, 0x07}, // 'l' Width: 3 {'l', {0x06, 0x02, 0x02, 0x02, 0x02, 0x02, 0x07}},
{0x00, 0x00, 0x1A, 0x15, 0x15, 0x15, 0x15}, // 'm' Width: 5 {'m', {0x00, 0x00, 0x1A, 0x15, 0x15, 0x15, 0x15}},
{0x00, 0x00, 0x16, 0x19, 0x11, 0x11, 0x11}, // 'n' Width: 5 {'n', {0x00, 0x00, 0x16, 0x19, 0x11, 0x11, 0x11}},
{0x00, 0x00, 0x0E, 0x11, 0x11, 0x11, 0x0E}, // 'o' Width: 4 {'o', {0x00, 0x00, 0x0E, 0x11, 0x11, 0x11, 0x0E}},
{0x00, 0x00, 0x1E, 0x11, 0x1E, 0x10, 0x10}, // 'p' Width: 5 {'p', {0x00, 0x00, 0x1E, 0x11, 0x1E, 0x10, 0x10}},
{0x00, 0x00, 0x0D, 0x13, 0x0F, 0x01, 0x01}, // 'q' Width: 5 {'q', {0x00, 0x00, 0x0D, 0x13, 0x0F, 0x01, 0x01}},
{0x00, 0x00, 0x16, 0x19, 0x10, 0x10, 0x10}, // 'r' Width: 5 {'r', {0x00, 0x00, 0x16, 0x19, 0x10, 0x10, 0x10}},
{0x00, 0x00, 0x0E, 0x10, 0x0E, 0x01, 0x1E}, // 's' Width: 4 {'s', {0x00, 0x00, 0x0E, 0x10, 0x0E, 0x01, 0x1E}},
{0x08, 0x08, 0x1C, 0x08, 0x08, 0x09, 0x06}, // 't' Width: 4 {'t', {0x08, 0x08, 0x1C, 0x08, 0x08, 0x09, 0x06}},
{0x00, 0x00, 0x11, 0x11, 0x11, 0x13, 0x0D}, // 'u' Width: 5 {'u', {0x00, 0x00, 0x11, 0x11, 0x11, 0x13, 0x0D}},
{0x00, 0x00, 0x11, 0x11, 0x11, 0x0A, 0x04}, // 'v' Width: 5 {'v', {0x00, 0x00, 0x11, 0x11, 0x11, 0x0A, 0x04}},
{0x00, 0x00, 0x11, 0x11, 0x15, 0x15, 0x0A}, // 'w' Width: 5 {'w', {0x00, 0x00, 0x11, 0x11, 0x15, 0x15, 0x0A}},
{0x00, 0x00, 0x11, 0x0A, 0x04, 0x0A, 0x11}, // 'x' Width: 5 {'x', {0x00, 0x00, 0x11, 0x0A, 0x04, 0x0A, 0x11}},
{0x00, 0x00, 0x11, 0x11, 0x0F, 0x01, 0x0E}, // 'y' Width: 5 {'y', {0x00, 0x00, 0x11, 0x11, 0x0F, 0x01, 0x0E}},
{0x00, 0x00, 0x1F, 0x02, 0x04, 0x08, 0x1F}, // 'z' Width: 5 {'z', {0x00, 0x00, 0x1F, 0x02, 0x04, 0x08, 0x1F}},
// Numbers (0-9) // Numbers (0-9)
{0x0E, 0x11, 0x13, 0x15, 0x19, 0x11, 0x0E}, // '0' Width: 5 {'0', {0x0E, 0x11, 0x13, 0x15, 0x19, 0x11, 0x0E}},
{0x02, 0x06, 0x02, 0x02, 0x02, 0x02, 0x07}, // '1' Width: 3 {'1', {0x02, 0x06, 0x02, 0x02, 0x02, 0x02, 0x07}},
{0x0E, 0x11, 0x01, 0x02, 0x04, 0x08, 0x1F}, // '2' Width: 5 {'2', {0x0E, 0x11, 0x01, 0x02, 0x04, 0x08, 0x1F}},
{0x1F, 0x02, 0x04, 0x02, 0x01, 0x11, 0x0E}, // '3' Width: 5 {'3', {0x1F, 0x02, 0x04, 0x02, 0x01, 0x11, 0x0E}},
{0x02, 0x06, 0x0A, 0x12, 0x1F, 0x02, 0x02}, // '4' Width: 5 {'4', {0x02, 0x06, 0x0A, 0x12, 0x1F, 0x02, 0x02}},
{0x1F, 0x10, 0x1E, 0x01, 0x01, 0x11, 0x0E}, // '5' Width: 5 {'5', {0x1F, 0x10, 0x1E, 0x01, 0x01, 0x11, 0x0E}},
{0x06, 0x08, 0x10, 0x1E, 0x11, 0x11, 0x0E}, // '6' Width: 5 {'6', {0x06, 0x08, 0x10, 0x1E, 0x11, 0x11, 0x0E}},
{0x1F, 0x01, 0x02, 0x04, 0x08, 0x08, 0x08}, // '7' Width: 5 {'7', {0x1F, 0x01, 0x02, 0x04, 0x08, 0x08, 0x08}},
{0x0E, 0x11, 0x11, 0x0E, 0x11, 0x11, 0x0E}, // '8' Width: 5 {'8', {0x0E, 0x11, 0x11, 0x0E, 0x11, 0x11, 0x0E}},
{0x0E, 0x11, 0x11, 0x0F, 0x01, 0x02, 0x0C}, // '9' Width: 5 {'9', {0x0E, 0x11, 0x11, 0x0F, 0x01, 0x02, 0x0C}},
// Punctuation and symbols // Punctuation and symbols
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // ' ' Width: 2 {' ', {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
{0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01}, // '!' Width: 1 {'!', {0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01}},
{0x0E, 0x11, 0x02, 0x04, 0x04, 0x00, 0x04}, // '?' Width: 5 {'?', {0x0E, 0x11, 0x02, 0x04, 0x04, 0x00, 0x04}},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}, // '.' Width: 1 {'.', {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02}, // ',' Width: 1 {',', {0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02}},
{0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00}, // ':' Width: 1 {':', {0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00}},
{0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x02}, // ';' Width: 1 {';', {0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x02}},
{0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00}, // "'" Width: 1 {'\'', {0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00}},
{0x05, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00}, // '"' Width: 3 {'"', {0x05, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00}},
{0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00}, // '-' Width: 5 {'-', {0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00}},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F}, // '_' Width: 5 {'_', {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F}},
{0x00, 0x04, 0x04, 0x1F, 0x04, 0x04, 0x00}, // '+' Width: 5 {'+', {0x00, 0x04, 0x04, 0x1F, 0x04, 0x04, 0x00}},
{0x00, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x00}, // '=' Width: 5 {'=', {0x00, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x00}},
{0x00, 0x0A, 0x04, 0x1F, 0x04, 0x0A, 0x00}, // '*' Width: 5 {'*', {0x00, 0x0A, 0x04, 0x1F, 0x04, 0x0A, 0x00}},
{0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x00}, // '/' Width: 5 {'/', {0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x00}},
{0x00, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00}, // '\\' Width: 5 {'\\', {0x00, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00}},
{0x01, 0x02, 0x04, 0x04, 0x04, 0x02, 0x01}, // '(' Width: 3 {'(', {0x01, 0x02, 0x04, 0x04, 0x04, 0x02, 0x01}},
{0x04, 0x02, 0x01, 0x01, 0x01, 0x02, 0x04}, // ')' Width: 3 {')', {0x04, 0x02, 0x01, 0x01, 0x01, 0x02, 0x04}},
{0x07, 0x04, 0x04, 0x04, 0x04, 0x04, 0x07}, // '[' Width: 3 {'[', {0x07, 0x04, 0x04, 0x04, 0x04, 0x04, 0x07}},
{0x07, 0x01, 0x01, 0x01, 0x01, 0x01, 0x07}, // ']' Width: 3 {']', {0x07, 0x01, 0x01, 0x01, 0x01, 0x01, 0x07}},
{0x03, 0x02, 0x02, 0x04, 0x02, 0x02, 0x03}, // '{' Width: 3 {'{', {0x03, 0x02, 0x02, 0x04, 0x02, 0x02, 0x03}},
{0x06, 0x02, 0x02, 0x01, 0x02, 0x02, 0x06}, // '}' Width: 3 {'}', {0x06, 0x02, 0x02, 0x01, 0x02, 0x02, 0x06}},
{0x00, 0x01, 0x02, 0x04, 0x02, 0x01, 0x00}, // '<' Width: 4 {'<', {0x00, 0x01, 0x02, 0x04, 0x02, 0x01, 0x00}},
{0x00, 0x04, 0x02, 0x01, 0x02, 0x04, 0x00}, // '>' Width: 4 {'>', {0x00, 0x04, 0x02, 0x01, 0x02, 0x04, 0x00}},
{0x0E, 0x11, 0x17, 0x15, 0x17, 0x10, 0x0E}, // '@' Width: 5 {'@', {0x0E, 0x11, 0x17, 0x15, 0x17, 0x10, 0x0E}},
{0x0A, 0x0A, 0x1F, 0x0A, 0x1F, 0x0A, 0x0A}, // '#' Width: 5 {'#', {0x0A, 0x0A, 0x1F, 0x0A, 0x1F, 0x0A, 0x0A}},
{0x04, 0x0F, 0x14, 0x0E, 0x05, 0x1E, 0x04}, // '$' Width: 5 {'$', {0x04, 0x0F, 0x14, 0x0E, 0x05, 0x1E, 0x04}},
{0x18, 0x19, 0x02, 0x04, 0x08, 0x13, 0x03}, // '%' Width: 5 {'%', {0x18, 0x19, 0x02, 0x04, 0x08, 0x13, 0x03}},
{0x0C, 0x12, 0x14, 0x08, 0x15, 0x12, 0x0D}, // '&' Width: 5 {'&', {0x0C, 0x12, 0x14, 0x08, 0x15, 0x12, 0x0D}},
{0x04, 0x0A, 0x11, 0x00, 0x00, 0x00, 0x00}, // '^' Width: 5
{0x00, 0x00, 0x00, 0x0D, 0x12, 0x00, 0x00}, // '~' Width: 5
// Special characters // Special characters
{0x07, 0x05, 0x07, 0x00, 0x00, 0x00, 0x00}, // '°' Width: 3 // {'°', {0x07, 0x05, 0x07, 0x00, 0x00, 0x00, 0x00}},
{0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, // '|' Width: 1 {'|', {0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}},
{0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00}, // '`' Width: 2 {'`', {0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00}},
{0x0F, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D}, // '¶' Width: 5 // {'¶', {0x0F, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D}},
{0x00, 0x00, 0x02, 0x07, 0x02, 0x00, 0x00} // '•' Width: 3 // {'•', {0x00, 0x00, 0x02, 0x07, 0x02, 0x00, 0x00}}
}; };
// Character mapping
const char font_chars_5x7[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 !?.,:;'\"-_+=*/\\()[]{}<>@#$%&^~°|`¶•";
// Declarations only // Declarations only
const uint8_t *getFontChar_5x7(char c); const vector<uint8_t> &getFontChar_5x7(char c);
const uint8_t fontHeight_5x7(); const uint8_t fontHeight_5x7();
#endif #endif

View File

@@ -1,16 +1,14 @@
#include "font_8x8.h" #include "font_8x8.h"
// Function to get font data for a character // Function to get font data for a character
const uint8_t *getFontChar_8x8(char c) const std::vector<uint8_t> &getFontChar_8x8(char c)
{ {
for (int i = 0; i < sizeof(font_chars_8x8) - 1; i++) auto it = font_8x8.find(c);
if (it != font_8x8.end())
{ {
if (font_chars_8x8[i] == c) return it->second;
{
return font_8x8[i];
}
} }
return font_8x8[0]; // Return space if not found (index of ' ') return font_8x8.at(' '); // Fallback to space
} }
const uint8_t fontHeight_8x8() const uint8_t fontHeight_8x8()

View File

@@ -1,117 +1,117 @@
#ifndef FONT_8X8_H #ifndef FONT_8X8_H
#define FONT_8X8_H #define FONT_8X8_H
#include <Arduino.h> #include <map>
#include <vector>
#include <cstdint>
const uint8_t font_8x8[][8] = { const std::map<uint8_t, std::vector<uint8_t>> font_8x8 = {
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // ' ' (Space) {' ', {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
{0x03, 0x03, 0x03, 0x03, 0x00, 0x00, 0x03, 0x00}, // '!' {'!', {0x03, 0x03, 0x03, 0x03, 0x00, 0x00, 0x03, 0x00}},
{0x1B, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // '"' {'"', {0x1B, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
{0x36, 0x36, 0x7F, 0x36, 0x7F, 0x36, 0x36, 0x00}, // '#' {'#', {0x36, 0x36, 0x7F, 0x36, 0x7F, 0x36, 0x36, 0x00}},
{0x0C, 0x1F, 0x30, 0x1E, 0x03, 0x3E, 0x0C, 0x00}, // '$' {'$', {0x0C, 0x1F, 0x30, 0x1E, 0x03, 0x3E, 0x0C, 0x00}},
{0x31, 0x33, 0x06, 0x0C, 0x18, 0x33, 0x23, 0x00}, // '%' {'%', {0x31, 0x33, 0x06, 0x0C, 0x18, 0x33, 0x23, 0x00}},
{0x3C, 0x66, 0x3C, 0x38, 0x67, 0x66, 0x3F, 0x00}, // '&' {'&', {0x3C, 0x66, 0x3C, 0x38, 0x67, 0x66, 0x3F, 0x00}},
{0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // "'" {'\'', {0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
{0x03, 0x06, 0x0C, 0x0C, 0x0C, 0x06, 0x03, 0x00}, // '(' {'(', {0x03, 0x06, 0x0C, 0x0C, 0x0C, 0x06, 0x03, 0x00}},
{0x0C, 0x06, 0x03, 0x03, 0x03, 0x06, 0x0C, 0x00}, // ')' {')', {0x0C, 0x06, 0x03, 0x03, 0x03, 0x06, 0x0C, 0x00}},
{0x00, 0x66, 0x3C, 0xFF, 0x3C, 0x66, 0x00, 0x00}, // '*' {'*', {0x00, 0x66, 0x3C, 0xFF, 0x3C, 0x66, 0x00, 0x00}},
{0x00, 0x0C, 0x0C, 0x3F, 0x0C, 0x0C, 0x00, 0x00}, // '+' {'+', {0x00, 0x0C, 0x0C, 0x3F, 0x0C, 0x0C, 0x00, 0x00}},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x06}, // ',' {',', {0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x06}},
{0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00}, // '-' {'-', {0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00}},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00}, // '.' {'.', {0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00}},
{0x00, 0x03, 0x06, 0x0C, 0x18, 0x30, 0x00, 0x00}, // '/' {'/', {0x00, 0x03, 0x06, 0x0C, 0x18, 0x30, 0x00, 0x00}},
{0x1E, 0x33, 0x37, 0x3B, 0x33, 0x33, 0x1E, 0x00}, // '0' {'0', {0x1E, 0x33, 0x37, 0x3B, 0x33, 0x33, 0x1E, 0x00}},
{0x0C, 0x1C, 0x0C, 0x0C, 0x0C, 0x0C, 0x3F, 0x00}, // '1' {'1', {0x0C, 0x1C, 0x0C, 0x0C, 0x0C, 0x0C, 0x3F, 0x00}},
{0x1E, 0x33, 0x03, 0x06, 0x0C, 0x18, 0x3F, 0x00}, // '2' {'2', {0x1E, 0x33, 0x03, 0x06, 0x0C, 0x18, 0x3F, 0x00}},
{0x1E, 0x33, 0x03, 0x0E, 0x03, 0x33, 0x1E, 0x00}, // '3' {'3', {0x1E, 0x33, 0x03, 0x0E, 0x03, 0x33, 0x1E, 0x00}},
{0x06, 0x0E, 0x1E, 0x36, 0x3F, 0x06, 0x06, 0x00}, // '4' {'4', {0x06, 0x0E, 0x1E, 0x36, 0x3F, 0x06, 0x06, 0x00}},
{0x3F, 0x30, 0x3E, 0x03, 0x03, 0x33, 0x1E, 0x00}, // '5' {'5', {0x3F, 0x30, 0x3E, 0x03, 0x03, 0x33, 0x1E, 0x00}},
{0x1E, 0x33, 0x30, 0x3E, 0x33, 0x33, 0x1E, 0x00}, // '6' {'6', {0x1E, 0x33, 0x30, 0x3E, 0x33, 0x33, 0x1E, 0x00}},
{0x3F, 0x03, 0x06, 0x0C, 0x0C, 0x0C, 0x0C, 0x00}, // '7' {'7', {0x3F, 0x03, 0x06, 0x0C, 0x0C, 0x0C, 0x0C, 0x00}},
{0x1E, 0x33, 0x33, 0x1E, 0x33, 0x33, 0x1E, 0x00}, // '8' {'8', {0x1E, 0x33, 0x33, 0x1E, 0x33, 0x33, 0x1E, 0x00}},
{0x1E, 0x33, 0x33, 0x1F, 0x03, 0x33, 0x1E, 0x00}, // '9' {'9', {0x1E, 0x33, 0x33, 0x1F, 0x03, 0x33, 0x1E, 0x00}},
{0x00, 0x03, 0x03, 0x00, 0x00, 0x03, 0x03, 0x00}, // ':' {':', {0x00, 0x03, 0x03, 0x00, 0x00, 0x03, 0x03, 0x00}},
{0x00, 0x03, 0x03, 0x00, 0x00, 0x03, 0x03, 0x06}, // ';' {';', {0x00, 0x03, 0x03, 0x00, 0x00, 0x03, 0x03, 0x06}},
{0x00, 0x03, 0x06, 0x0C, 0x06, 0x03, 0x00, 0x00}, // '<' {'<', {0x00, 0x03, 0x06, 0x0C, 0x06, 0x03, 0x00, 0x00}},
{0x00, 0x00, 0x3F, 0x00, 0x3F, 0x00, 0x00, 0x00}, // '=' {'=', {0x00, 0x00, 0x3F, 0x00, 0x3F, 0x00, 0x00, 0x00}},
{0x00, 0x0C, 0x06, 0x03, 0x06, 0x0C, 0x00, 0x00}, // '>' {'>', {0x00, 0x0C, 0x06, 0x03, 0x06, 0x0C, 0x00, 0x00}},
{0x1E, 0x33, 0x06, 0x0C, 0x0C, 0x00, 0x0C, 0x00}, // '?' {'?', {0x1E, 0x33, 0x06, 0x0C, 0x0C, 0x00, 0x0C, 0x00}},
{0x3C, 0x42, 0x99, 0xA5, 0xA5, 0x9E, 0x40, 0x3C}, // '@' {'@', {0x3C, 0x42, 0x99, 0xA5, 0xA5, 0x9E, 0x40, 0x3C}},
{0x0C, 0x1E, 0x33, 0x33, 0x3F, 0x33, 0x33, 0x00}, // 'A' {'A', {0x0C, 0x1E, 0x33, 0x33, 0x3F, 0x33, 0x33, 0x00}},
{0x3E, 0x33, 0x33, 0x3E, 0x33, 0x33, 0x3E, 0x00}, // 'B' {'B', {0x3E, 0x33, 0x33, 0x3E, 0x33, 0x33, 0x3E, 0x00}},
{0x1E, 0x33, 0x30, 0x30, 0x30, 0x33, 0x1E, 0x00}, // 'C' {'C', {0x1E, 0x33, 0x30, 0x30, 0x30, 0x33, 0x1E, 0x00}},
{0x3C, 0x36, 0x33, 0x33, 0x33, 0x36, 0x3C, 0x00}, // 'D' {'D', {0x3C, 0x36, 0x33, 0x33, 0x33, 0x36, 0x3C, 0x00}},
{0x3F, 0x30, 0x30, 0x3C, 0x30, 0x30, 0x3F, 0x00}, // 'E' {'E', {0x3F, 0x30, 0x30, 0x3C, 0x30, 0x30, 0x3F, 0x00}},
{0x3F, 0x30, 0x30, 0x3C, 0x30, 0x30, 0x30, 0x00}, // 'F' {'F', {0x3F, 0x30, 0x30, 0x3C, 0x30, 0x30, 0x30, 0x00}},
{0x1E, 0x33, 0x30, 0x37, 0x33, 0x33, 0x1E, 0x00}, // 'G' {'G', {0x1E, 0x33, 0x30, 0x37, 0x33, 0x33, 0x1E, 0x00}},
{0x33, 0x33, 0x33, 0x3F, 0x33, 0x33, 0x33, 0x00}, // 'H' {'H', {0x33, 0x33, 0x33, 0x3F, 0x33, 0x33, 0x33, 0x00}},
{0x0F, 0x06, 0x06, 0x06, 0x06, 0x06, 0x0F, 0x00}, // 'I' {'I', {0x0F, 0x06, 0x06, 0x06, 0x06, 0x06, 0x0F, 0x00}},
{0x0F, 0x06, 0x06, 0x06, 0x06, 0x36, 0x1C, 0x00}, // 'J' {'J', {0x0F, 0x06, 0x06, 0x06, 0x06, 0x36, 0x1C, 0x00}},
{0x33, 0x36, 0x3C, 0x38, 0x3C, 0x36, 0x33, 0x00}, // 'K' {'K', {0x33, 0x36, 0x3C, 0x38, 0x3C, 0x36, 0x33, 0x00}},
{0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3F, 0x00}, // 'L' {'L', {0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3F, 0x00}},
{0x63, 0x77, 0x7F, 0x6B, 0x63, 0x63, 0x63, 0x00}, // 'M' {'M', {0x63, 0x77, 0x7F, 0x6B, 0x63, 0x63, 0x63, 0x00}},
{0x33, 0x3B, 0x3F, 0x3F, 0x37, 0x33, 0x33, 0x00}, // 'N' {'N', {0x33, 0x3B, 0x3F, 0x3F, 0x37, 0x33, 0x33, 0x00}},
{0x1E, 0x33, 0x33, 0x33, 0x33, 0x33, 0x1E, 0x00}, // 'O' {'O', {0x1E, 0x33, 0x33, 0x33, 0x33, 0x33, 0x1E, 0x00}},
{0x3E, 0x33, 0x33, 0x3E, 0x30, 0x30, 0x30, 0x00}, // 'P' {'P', {0x3E, 0x33, 0x33, 0x3E, 0x30, 0x30, 0x30, 0x00}},
{0x1E, 0x33, 0x33, 0x33, 0x33, 0x1E, 0x07, 0x00}, // 'Q' {'Q', {0x1E, 0x33, 0x33, 0x33, 0x33, 0x1E, 0x07, 0x00}},
{0x3E, 0x33, 0x33, 0x3E, 0x3C, 0x36, 0x33, 0x00}, // 'R' {'R', {0x3E, 0x33, 0x33, 0x3E, 0x3C, 0x36, 0x33, 0x00}},
{0x1E, 0x33, 0x30, 0x1E, 0x03, 0x33, 0x1E, 0x00}, // 'S' {'S', {0x1E, 0x33, 0x30, 0x1E, 0x03, 0x33, 0x1E, 0x00}},
{0x3F, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x00}, // 'T' {'T', {0x3F, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x00}},
{0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x1E, 0x00}, // 'U' {'U', {0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x1E, 0x00}},
{0x33, 0x33, 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x00}, // 'V' {'V', {0x33, 0x33, 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x00}},
{0x63, 0x63, 0x63, 0x6B, 0x7F, 0x77, 0x63, 0x00}, // 'W' {'W', {0x63, 0x63, 0x63, 0x6B, 0x7F, 0x77, 0x63, 0x00}},
{0x33, 0x33, 0x1E, 0x0C, 0x1E, 0x33, 0x33, 0x00}, // 'X' {'X', {0x33, 0x33, 0x1E, 0x0C, 0x1E, 0x33, 0x33, 0x00}},
{0x33, 0x33, 0x33, 0x1E, 0x0C, 0x0C, 0x0C, 0x00}, // 'Y' {'Y', {0x33, 0x33, 0x33, 0x1E, 0x0C, 0x0C, 0x0C, 0x00}},
{0x3F, 0x03, 0x06, 0x0C, 0x18, 0x30, 0x3F, 0x00}, // 'Z' {'Z', {0x3F, 0x03, 0x06, 0x0C, 0x18, 0x30, 0x3F, 0x00}},
{0x0F, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0F, 0x00}, // '[' {'[', {0x0F, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0F, 0x00}},
{0x00, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x00, 0x00}, // '\' {'\\', {0x00, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x00, 0x00}},
{0x0F, 0x03, 0x03, 0x03, 0x03, 0x03, 0x0F, 0x00}, // ']' {']', {0x0F, 0x03, 0x03, 0x03, 0x03, 0x03, 0x0F, 0x00}},
{0x0C, 0x1E, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00}, // '^' {'^', {0x0C, 0x1E, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00}},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F}, // '_' {'_', {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F}},
{0x06, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // '`' {'`', {0x06, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
{0x00, 0x00, 0x1E, 0x03, 0x1F, 0x33, 0x1F, 0x00}, // 'a' {'a', {0x00, 0x00, 0x1E, 0x03, 0x1F, 0x33, 0x1F, 0x00}},
{0x30, 0x30, 0x3E, 0x33, 0x33, 0x33, 0x3E, 0x00}, // 'b' {'b', {0x30, 0x30, 0x3E, 0x33, 0x33, 0x33, 0x3E, 0x00}},
{0x00, 0x00, 0x1E, 0x33, 0x30, 0x33, 0x1E, 0x00}, // 'c' {'c', {0x00, 0x00, 0x1E, 0x33, 0x30, 0x33, 0x1E, 0x00}},
{0x03, 0x03, 0x1F, 0x33, 0x33, 0x33, 0x1F, 0x00}, // 'd' {'d', {0x03, 0x03, 0x1F, 0x33, 0x33, 0x33, 0x1F, 0x00}},
{0x00, 0x00, 0x1E, 0x33, 0x3F, 0x30, 0x1E, 0x00}, // 'e' {'e', {0x00, 0x00, 0x1E, 0x33, 0x3F, 0x30, 0x1E, 0x00}},
{0x0E, 0x1B, 0x18, 0x3C, 0x18, 0x18, 0x18, 0x00}, // 'f' {'f', {0x0E, 0x1B, 0x18, 0x3C, 0x18, 0x18, 0x18, 0x00}},
{0x00, 0x00, 0x1F, 0x33, 0x33, 0x1F, 0x03, 0x3E}, // 'g' {'g', {0x00, 0x00, 0x1F, 0x33, 0x33, 0x1F, 0x03, 0x3E}},
{0x30, 0x30, 0x3E, 0x33, 0x33, 0x33, 0x33, 0x00}, // 'h' {'h', {0x30, 0x30, 0x3E, 0x33, 0x33, 0x33, 0x33, 0x00}},
{0x06, 0x00, 0x0E, 0x06, 0x06, 0x06, 0x0F, 0x00}, // 'i' {'i', {0x06, 0x00, 0x0E, 0x06, 0x06, 0x06, 0x0F, 0x00}},
{0x03, 0x00, 0x03, 0x03, 0x03, 0x03, 0x33, 0x1E}, // 'j' {'j', {0x03, 0x00, 0x03, 0x03, 0x03, 0x03, 0x33, 0x1E}},
{0x30, 0x30, 0x33, 0x36, 0x3C, 0x36, 0x33, 0x00}, // 'k' {'k', {0x30, 0x30, 0x33, 0x36, 0x3C, 0x36, 0x33, 0x00}},
{0x0E, 0x06, 0x06, 0x06, 0x06, 0x06, 0x0F, 0x00}, // 'l' {'l', {0x0E, 0x06, 0x06, 0x06, 0x06, 0x06, 0x0F, 0x00}},
{0x00, 0x00, 0x66, 0x7F, 0x7F, 0x6B, 0x63, 0x00}, // 'm' {'m', {0x00, 0x00, 0x66, 0x7F, 0x7F, 0x6B, 0x63, 0x00}},
{0x00, 0x00, 0x3E, 0x33, 0x33, 0x33, 0x33, 0x00}, // 'n' {'n', {0x00, 0x00, 0x3E, 0x33, 0x33, 0x33, 0x33, 0x00}},
{0x00, 0x00, 0x1E, 0x33, 0x33, 0x33, 0x1E, 0x00}, // 'o' {'o', {0x00, 0x00, 0x1E, 0x33, 0x33, 0x33, 0x1E, 0x00}},
{0x00, 0x00, 0x3E, 0x33, 0x33, 0x3E, 0x30, 0x30}, // 'p' {'p', {0x00, 0x00, 0x3E, 0x33, 0x33, 0x3E, 0x30, 0x30}},
{0x00, 0x00, 0x1F, 0x33, 0x33, 0x1F, 0x03, 0x03}, // 'q' {'q', {0x00, 0x00, 0x1F, 0x33, 0x33, 0x1F, 0x03, 0x03}},
{0x00, 0x00, 0x3E, 0x33, 0x30, 0x30, 0x30, 0x00}, // 'r' {'r', {0x00, 0x00, 0x3E, 0x33, 0x30, 0x30, 0x30, 0x00}},
{0x00, 0x00, 0x1F, 0x30, 0x1E, 0x03, 0x3E, 0x00}, // 's' {'s', {0x00, 0x00, 0x1F, 0x30, 0x1E, 0x03, 0x3E, 0x00}},
{0x0C, 0x0C, 0x1F, 0x0C, 0x0C, 0x0C, 0x07, 0x00}, // 't' {'t', {0x0C, 0x0C, 0x1F, 0x0C, 0x0C, 0x0C, 0x07, 0x00}},
{0x00, 0x00, 0x33, 0x33, 0x33, 0x33, 0x1F, 0x00}, // 'u' {'u', {0x00, 0x00, 0x33, 0x33, 0x33, 0x33, 0x1F, 0x00}},
{0x00, 0x00, 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x00}, // 'v' {'v', {0x00, 0x00, 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x00}},
{0x00, 0x00, 0x63, 0x6B, 0x7F, 0x3E, 0x36, 0x00}, // 'w' {'w', {0x00, 0x00, 0x63, 0x6B, 0x7F, 0x3E, 0x36, 0x00}},
{0x00, 0x00, 0x33, 0x1E, 0x0C, 0x1E, 0x33, 0x00}, // 'x' {'x', {0x00, 0x00, 0x33, 0x1E, 0x0C, 0x1E, 0x33, 0x00}},
{0x00, 0x00, 0x33, 0x33, 0x33, 0x1F, 0x06, 0x3C}, // 'y' {'y', {0x00, 0x00, 0x33, 0x33, 0x33, 0x1F, 0x06, 0x3C}},
{0x00, 0x00, 0x3F, 0x06, 0x0C, 0x18, 0x3F, 0x00}, // 'z' {'z', {0x00, 0x00, 0x3F, 0x06, 0x0C, 0x18, 0x3F, 0x00}},
{0x07, 0x0C, 0x0C, 0x38, 0x0C, 0x0C, 0x07, 0x00}, // '{' {'{', {0x07, 0x0C, 0x0C, 0x38, 0x0C, 0x0C, 0x07, 0x00}},
{0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00}, // '|' {'|', {0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00}},
{0x38, 0x0C, 0x0C, 0x07, 0x0C, 0x0C, 0x38, 0x00}, // '}' {'}', {0x38, 0x0C, 0x0C, 0x07, 0x0C, 0x0C, 0x38, 0x00}},
{0x00, 0x00, 0x00, 0x1B, 0x36, 0x00, 0x00, 0x00}, // '~' {'~', {0x00, 0x00, 0x00, 0x1B, 0x36, 0x00, 0x00, 0x00}},
{0x0E, 0x11, 0x11, 0x0E, 0x00, 0x00, 0x00, 0x00}, // '°' // {'°', {0x0E, 0x11, 0x11, 0x0E, 0x00, 0x00, 0x00, 0x00}},
{0x1F, 0x3D, 0x3D, 0x3D, 0x1D, 0x05, 0x05, 0x00}, // '¶' // {'¶', {0x1F, 0x3D, 0x3D, 0x3D, 0x1D, 0x05, 0x05, 0x00}},
{0x00, 0x00, 0x06, 0x0F, 0x0F, 0x06, 0x00, 0x00}, // '•' // {'•', {0x00, 0x00, 0x06, 0x0F, 0x0F, 0x06, 0x00, 0x00}},
{0x1C, 0x3E, 0x7F, 0x7F, 0x1C, 0x1C, 0x3E, 0x00}, // '♠' // {'♠', {0x1C, 0x3E, 0x7F, 0x7F, 0x1C, 0x1C, 0x3E, 0x00}},
{0x1C, 0x1C, 0x3E, 0x7F, 0x36, 0x1C, 0x3E, 0x00}, // '♣' // {'♣', {0x1C, 0x1C, 0x3E, 0x7F, 0x36, 0x1C, 0x3E, 0x00}},
{0x36, 0x7F, 0x7F, 0x7F, 0x3E, 0x1C, 0x08, 0x00}, // '♥' // {'♥', {0x36, 0x7F, 0x7F, 0x7F, 0x3E, 0x1C, 0x08, 0x00}},
{0x08, 0x1C, 0x3E, 0x7F, 0x3E, 0x1C, 0x08, 0x00}, // '♦' // {'♦', {0x08, 0x1C, 0x3E, 0x7F, 0x3E, 0x1C, 0x08, 0x00}}
}; };
// Character mapping
const char font_chars_8x8[] = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~°¶•♠♣♥♦";
// Declarations only // Declarations only
const uint8_t *getFontChar_8x8(char c); const std::vector<uint8_t> &getFontChar_8x8(char c);
const uint8_t fontHeight_8x8(); const uint8_t fontHeight_8x8();
#endif #endif

View File

@@ -1,4 +1,5 @@
#include "LedMatrix.h" #include "LedMatrix.h"
#include <fonts.hpp>
LedMatrix::LedMatrix(uint8_t h, uint8_t w) LedMatrix::LedMatrix(uint8_t h, uint8_t w)
: height(h), width(w), num_leds(h * w), leds(num_leds) : height(h), width(w), num_leds(h * w), leds(num_leds)
@@ -10,12 +11,22 @@ LedMatrix::~LedMatrix()
{ {
} }
// N entspricht Font-Height const uint8_t LedMatrix::getFontHeight()
template <size_t N> {
#ifdef USE_FONT_5x7
return 7;
#elifdef USE_FONT_8x8
return 8;
#elifdef USE_FONT_16x16
return 16;
#endif
}
uint8_t LedMatrix::charWidth(const uint8_t *charMatrix) uint8_t LedMatrix::charWidth(const uint8_t *charMatrix)
{ {
const uint16_t fHeight = getFontHeight();
uint16_t max_val = 0; uint16_t max_val = 0;
for (size_t i = 0; i < N; i++) for (size_t i = 0; i < fHeight; i++)
{ {
if (charMatrix[i] > max_val) if (charMatrix[i] > max_val)
max_val = charMatrix[i]; max_val = charMatrix[i];
@@ -47,9 +58,17 @@ void LedMatrix::drawPixel(int x, int y, CRGB color)
uint8_t LedMatrix::drawChar(int x, int y, char c, CRGB color) uint8_t LedMatrix::drawChar(int x, int y, char c, CRGB color)
{ {
const uint8_t *fontData = getFontChar_5x7(c); #ifdef USE_FONT_5x7
const u_int8_t char_width_pixel = charWidth<7>(fontData); const std::map<uint8_t, std::vector<uint8_t>> &font = font_5x7;
const u_int8_t font_height = fontHeight_5x7(); #elifdef USE_FONT_8x8
const std::map<uint8_t, std::vector<uint8_t>> &font = font_8x8;
#elifdef USE_FONT_16x16
const std::map<uint8_t, std::vector<uint8_t>> &font = font_16x16;
#endif
const vector<uint8_t> &fontData_ = getFontChar(c, font);
const uint8_t *fontData = fontData_.data();
const u_int8_t char_width_pixel = charWidth(fontData);
const u_int8_t font_height = getFontHeight();
const u_int8_t font_width = 5; const u_int8_t font_width = 5;
for (u_int8_t row = 0; row < font_height; row++) for (u_int8_t row = 0; row < font_height; row++)
@@ -89,22 +108,29 @@ void LedMatrix::drawText(int x, int y, const char *text, CRGB color)
} }
} }
uint8_t LedMatrix::getTextWidth(const char *text) const uint8_t LedMatrix::getTextWidth(const char *text)
{ {
uint8_t totalWidth = 0; uint8_t totalWidth = 0;
for (uint8_t i = 0; text[i] != '\0'; i++) for (uint8_t i = 0; text[i] != '\0'; i++)
{ {
const uint8_t *fontData = getFontChar_5x7(text[i]); #ifdef USE_FONT_5x7
totalWidth += charWidth<7>(fontData) + 1; // char width + spacing const std::map<uint8_t, std::vector<uint8_t>> &font = font_5x7;
#elifdef USE_FONT_8x8
const std::map<uint8_t, std::vector<uint8_t>> &font = font_8x8;
#elifdef USE_FONT_16x16
const std::map<uint8_t, std::vector<uint8_t>> &font = font_16x16;
#endif
const vector<uint8_t> &fontData_ = getFontChar(text[i], font);
const uint8_t *fontData = fontData_.data();
totalWidth += charWidth(fontData) + 1; // char width + spacing
} }
return totalWidth; return totalWidth;
} }
void LedMatrix::clearRow(uint8_t y) void LedMatrix::clearRow(uint8_t y)
{ {
const u_int8_t font_height = fontHeight_5x7(); const u_int8_t font_height = getFontHeight();
Serial.printf("clearRow: %dx%d@%d\n\r", font_height, width, y);
for (uint8_t line = y; line < (y + font_height); line++) for (uint8_t line = y; line < (y + font_height); line++)
{ {

View File

@@ -3,13 +3,21 @@
using namespace std; using namespace std;
#define USE_FONT_5x7
// #define USE_FONT_8x8
// #define USE_FONT_16x16
#include <Arduino.h> #include <Arduino.h>
#include <FastLED.h> #include <FastLED.h>
#include <vector> #include <vector>
#ifdef USE_FONT_5x7
#include <font_5x7.h> #include <font_5x7.h>
// #include <font_8x8.h> #elifdef USE_FONT_8x8
// #include <font_16x16.h> #include <font_8x8.h>
#elifdef USE_FONT_16x16
#include <font_16x16.h>
#endif
class LedMatrix : public CFastLED class LedMatrix : public CFastLED
{ {
@@ -21,14 +29,14 @@ private:
uint16_t num_leds; // default 64x64 = 4096 LEDs uint16_t num_leds; // default 64x64 = 4096 LEDs
vector<CRGB> leds; // Automatic memory management vector<CRGB> leds; // Automatic memory management
template <size_t N>
uint8_t charWidth(const uint8_t *charMatrix); uint8_t charWidth(const uint8_t *charMatrix);
// Text Scrolling // Text Scrolling
int8_t scrollPosition = 0; int8_t scrollPosition = 0;
unsigned long lastScrollTime = 0; unsigned long lastScrollTime = 0;
uint8_t getTextWidth(const char *text); const uint8_t getTextWidth(const char *text);
const uint8_t getFontHeight();
public: public:
LedMatrix(uint8_t h = 64, uint8_t w = 64); LedMatrix(uint8_t h = 64, uint8_t w = 64);

11
lib/Utils/src/fonts.cpp Normal file
View File

@@ -0,0 +1,11 @@
#include "fonts.hpp"
const std::vector<uint8_t> &getFontChar(char c, const std::map<uint8_t, std::vector<uint8_t>> &font)
{
auto it = font.find(c);
if (it != font.end())
{
return it->second;
}
return font.at(' '); // Fallback to space
}

10
lib/Utils/src/fonts.hpp Normal file
View File

@@ -0,0 +1,10 @@
#ifndef FONTS_HPP
#define FONTS_HPP
#include <vector>
#include <map>
#include <stdint.h>
const std::vector<uint8_t> &getFontChar(char c, const std::map<uint8_t, std::vector<uint8_t>> &font);
#endif

View File

@@ -8,9 +8,21 @@ LedMatrix matrix;
void printCharMatrixSimple(char c) void printCharMatrixSimple(char c)
{ {
const auto *fontData = getFontChar_5x7(c); matrix.drawText(58, 56, &c, CRGB::YellowGreen);
const u_int8_t char_width_pixel = 5; matrix.show();
#ifdef USE_FONT_5x7
const vector<uint8_t> &fontData_ = getFontChar_5x7(c);
const u_int8_t font_height = fontHeight_5x7(); const u_int8_t font_height = fontHeight_5x7();
#elifdef USE_FONT_8x8
const vector<uint8_t> &fontData_ = getFontChar_8x8(c);
const u_int8_t font_height = fontHeight_8x8();
#elifdef USE_FONT_16x16
const vector<uint16_t> &fontData_ = getFontChar_16x16(c);
const u_int8_t font_height = fontHeight_16x16();
#endif
const auto *fontData = fontData_.data();
const u_int8_t char_width_pixel = 5;
Serial.print("<"); Serial.print("<");
Serial.print(c); Serial.print(c);
@@ -82,7 +94,7 @@ void setup()
} }
setupMatrix(); setupMatrix();
// printCharMatrixSimple('A'); printCharMatrixSimple('@');
// number_to_bitarray_msb(0x11FF, 16, true); // number_to_bitarray_msb(0x11FF, 16, true);
// playWithBlinkLed(); // playWithBlinkLed();
@@ -90,6 +102,6 @@ void setup()
void loop() void loop()
{ {
matrix.drawHorizontalScrollText(41, "scrolling...", CRGB::Wheat); // matrix.drawHorizontalScrollText(41, "scrolling...", CRGB::Wheat);
delay(10); delay(10);
} }