Browse Source

Closing #148 (#150)

* * Updated submodules

* Initial implementation of #148
* Refactoring

* Updated FlipC image

* Added USDT address

* Added some more fonts

* CLang format ran

* One more nice font
Alexander Kopachov 2 years ago
parent
commit
d13bcd7588

BIN
.flipcorg/banner.png


+ 16 - 0
features_config.h

@@ -27,4 +27,20 @@
 // If target firmware is not yet set, default it to Xtreme as I'm using it, and it is cool :)
 #ifndef TOTP_TARGET_FIRMWARE
 #define TOTP_TARGET_FIRMWARE TOTP_FIRMWARE_XTREME
+#endif
+
+// List of available font for TOTP code
+#define TOTP_FONT_MODENINE (1)
+#define TOTP_FONT_REDHATMONO (2)
+#define TOTP_FONT_BEDSTEAD (3)
+#define TOTP_FONT_ZECTOR (4)
+#define TOTP_FONT_712SERIF (5)
+#define TOTP_FONT_GRAPH35PIX (6)
+#define TOTP_FONT_KARMAFUTURE (7)
+
+// End of list
+
+// Active font for TOTP codes
+#ifndef TOTP_FONT
+#define TOTP_FONT TOTP_FONT_MODENINE
 #endif

+ 940 - 0
ui/fonts/712serif/712serif.c

@@ -0,0 +1,940 @@
+#include "712serif.h"
+
+/* GENERATED BY https://github.com/pavius/the-dot-factory */
+
+/* 
+**  Font data for 7:12 Serif 24pt
+*/
+
+/* Character bitmaps for 7:12 Serif 24pt */
+const uint8_t _712Serif_24ptBitmaps[] = {
+    /* @0 '-' (14 pixels wide) */
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0xFC,
+    0x0F,
+    0xFC,
+    0x0F,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+
+    /* @28 '0' (14 pixels wide) */
+    0xF0,
+    0x03,
+    0xF0,
+    0x03,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0xF0,
+    0x03,
+    0xF0,
+    0x03,
+
+    /* @56 '1' (14 pixels wide) */
+    0xC0,
+    0x00,
+    0xC0,
+    0x00,
+    0xFC,
+    0x00,
+    0xFC,
+    0x00,
+    0xC0,
+    0x00,
+    0xC0,
+    0x00,
+    0xC0,
+    0x00,
+    0xC0,
+    0x00,
+    0xC0,
+    0x00,
+    0xC0,
+    0x00,
+    0xC0,
+    0x00,
+    0xC0,
+    0x00,
+    0xFC,
+    0x0F,
+    0xFC,
+    0x0F,
+
+    /* @84 '2' (14 pixels wide) */
+    0xF0,
+    0x03,
+    0xF0,
+    0x03,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x00,
+    0x0C,
+    0x00,
+    0x0C,
+    0xC0,
+    0x03,
+    0xC0,
+    0x03,
+    0x30,
+    0x00,
+    0x30,
+    0x00,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0xFC,
+    0x0F,
+    0xFC,
+    0x0F,
+
+    /* @112 '3' (14 pixels wide) */
+    0xF0,
+    0x03,
+    0xF0,
+    0x03,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x00,
+    0x0C,
+    0x00,
+    0x0C,
+    0xC0,
+    0x03,
+    0xC0,
+    0x03,
+    0x00,
+    0x0C,
+    0x00,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0xF0,
+    0x03,
+    0xF0,
+    0x03,
+
+    /* @140 '4' (14 pixels wide) */
+    0x30,
+    0x03,
+    0x30,
+    0x03,
+    0x30,
+    0x03,
+    0x30,
+    0x03,
+    0x0C,
+    0x03,
+    0x0C,
+    0x03,
+    0x0C,
+    0x03,
+    0x0C,
+    0x03,
+    0xFC,
+    0x0F,
+    0xFC,
+    0x0F,
+    0x00,
+    0x03,
+    0x00,
+    0x03,
+    0xC0,
+    0x0F,
+    0xC0,
+    0x0F,
+
+    /* @168 '5' (14 pixels wide) */
+    0xFC,
+    0x0F,
+    0xFC,
+    0x0F,
+    0x0C,
+    0x00,
+    0x0C,
+    0x00,
+    0xFC,
+    0x03,
+    0xFC,
+    0x03,
+    0x00,
+    0x0C,
+    0x00,
+    0x0C,
+    0x00,
+    0x0C,
+    0x00,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0xF0,
+    0x03,
+    0xF0,
+    0x03,
+
+    /* @196 '6' (14 pixels wide) */
+    0xF0,
+    0x03,
+    0xF0,
+    0x03,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x00,
+    0x0C,
+    0x00,
+    0xFC,
+    0x03,
+    0xFC,
+    0x03,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0xF0,
+    0x03,
+    0xF0,
+    0x03,
+
+    /* @224 '7' (14 pixels wide) */
+    0xFC,
+    0x0F,
+    0xFC,
+    0x0F,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x00,
+    0x03,
+    0x00,
+    0x03,
+    0x00,
+    0x03,
+    0x00,
+    0x03,
+    0xC0,
+    0x00,
+    0xC0,
+    0x00,
+    0xC0,
+    0x00,
+    0xC0,
+    0x00,
+    0xC0,
+    0x00,
+    0xC0,
+    0x00,
+
+    /* @252 '8' (14 pixels wide) */
+    0xF0,
+    0x03,
+    0xF0,
+    0x03,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0xF0,
+    0x03,
+    0xF0,
+    0x03,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0xF0,
+    0x03,
+    0xF0,
+    0x03,
+
+    /* @280 '9' (14 pixels wide) */
+    0xF0,
+    0x03,
+    0xF0,
+    0x03,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0xF0,
+    0x0F,
+    0xF0,
+    0x0F,
+    0x00,
+    0x0C,
+    0x00,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0xF0,
+    0x03,
+    0xF0,
+    0x03,
+
+    /* @308 'B' (14 pixels wide) */
+    0xFF,
+    0x00,
+    0xFF,
+    0x00,
+    0x0C,
+    0x03,
+    0x0C,
+    0x03,
+    0x0C,
+    0x03,
+    0x0C,
+    0x03,
+    0xFC,
+    0x0F,
+    0xFC,
+    0x0F,
+    0x0C,
+    0x30,
+    0x0C,
+    0x30,
+    0x0C,
+    0x30,
+    0x0C,
+    0x30,
+    0xFF,
+    0x0F,
+    0xFF,
+    0x0F,
+
+    /* @336 'C' (14 pixels wide) */
+    0xF0,
+    0x33,
+    0xF0,
+    0x33,
+    0x0C,
+    0x3C,
+    0x0C,
+    0x3C,
+    0x03,
+    0x00,
+    0x03,
+    0x00,
+    0x03,
+    0x00,
+    0x03,
+    0x00,
+    0x03,
+    0x30,
+    0x03,
+    0x30,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0xF0,
+    0x03,
+    0xF0,
+    0x03,
+
+    /* @364 'D' (14 pixels wide) */
+    0xFF,
+    0x03,
+    0xFF,
+    0x03,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x30,
+    0x0C,
+    0x30,
+    0x0C,
+    0x30,
+    0x0C,
+    0x30,
+    0x0C,
+    0x30,
+    0x0C,
+    0x30,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0xFF,
+    0x03,
+    0xFF,
+    0x03,
+
+    /* @392 'F' (14 pixels wide) */
+    0xFF,
+    0x3F,
+    0xFF,
+    0x3F,
+    0x0C,
+    0x30,
+    0x0C,
+    0x30,
+    0x0C,
+    0x03,
+    0x0C,
+    0x03,
+    0xFC,
+    0x03,
+    0xFC,
+    0x03,
+    0x0C,
+    0x03,
+    0x0C,
+    0x03,
+    0x0C,
+    0x00,
+    0x0C,
+    0x00,
+    0x3F,
+    0x00,
+    0x3F,
+    0x00,
+
+    /* @420 'G' (14 pixels wide) */
+    0xF0,
+    0x33,
+    0xF0,
+    0x33,
+    0x0C,
+    0x3C,
+    0x0C,
+    0x3C,
+    0x03,
+    0x00,
+    0x03,
+    0x00,
+    0x03,
+    0x3F,
+    0x03,
+    0x3F,
+    0x03,
+    0x30,
+    0x03,
+    0x30,
+    0x0C,
+    0x3C,
+    0x0C,
+    0x3C,
+    0xF0,
+    0x33,
+    0xF0,
+    0x33,
+
+    /* @448 'H' (14 pixels wide) */
+    0x3F,
+    0x3F,
+    0x3F,
+    0x3F,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0xFC,
+    0x0F,
+    0xFC,
+    0x0F,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x3F,
+    0x3F,
+    0x3F,
+    0x3F,
+
+    /* @476 'J' (14 pixels wide) */
+    0x00,
+    0x3F,
+    0x00,
+    0x3F,
+    0x00,
+    0x0C,
+    0x00,
+    0x0C,
+    0x00,
+    0x0C,
+    0x00,
+    0x0C,
+    0x00,
+    0x0C,
+    0x00,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0xF0,
+    0x03,
+    0xF0,
+    0x03,
+
+    /* @504 'K' (14 pixels wide) */
+    0x3F,
+    0x3F,
+    0x3F,
+    0x3F,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x03,
+    0x0C,
+    0x03,
+    0xFC,
+    0x00,
+    0xFC,
+    0x00,
+    0x0C,
+    0x03,
+    0x0C,
+    0x03,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x3F,
+    0x3F,
+    0x3F,
+    0x3F,
+
+    /* @532 'M' (14 pixels wide) */
+    0x0F,
+    0x3C,
+    0x0F,
+    0x3C,
+    0x3C,
+    0x0F,
+    0x3C,
+    0x0F,
+    0xCC,
+    0x0C,
+    0xCC,
+    0x0C,
+    0xCC,
+    0x0C,
+    0xCC,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x3F,
+    0x3F,
+    0x3F,
+    0x3F,
+
+    /* @560 'N' (14 pixels wide) */
+    0x0F,
+    0x3F,
+    0x0F,
+    0x3F,
+    0x3C,
+    0x0C,
+    0x3C,
+    0x0C,
+    0xCC,
+    0x0C,
+    0xCC,
+    0x0C,
+    0xCC,
+    0x0C,
+    0xCC,
+    0x0C,
+    0xCC,
+    0x0C,
+    0xCC,
+    0x0C,
+    0x0C,
+    0x0F,
+    0x0C,
+    0x0F,
+    0x3F,
+    0x0C,
+    0x3F,
+    0x0C,
+
+    /* @588 'P' (14 pixels wide) */
+    0xFF,
+    0x0F,
+    0xFF,
+    0x0F,
+    0x0C,
+    0x30,
+    0x0C,
+    0x30,
+    0x0C,
+    0x30,
+    0x0C,
+    0x30,
+    0x3C,
+    0x30,
+    0x3C,
+    0x30,
+    0xCC,
+    0x0F,
+    0xCC,
+    0x0F,
+    0x0C,
+    0x00,
+    0x0C,
+    0x00,
+    0x3F,
+    0x00,
+    0x3F,
+    0x00,
+
+    /* @616 'Q' (14 pixels wide) */
+    0xF0,
+    0x03,
+    0xF0,
+    0x03,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x03,
+    0x30,
+    0x03,
+    0x30,
+    0xF3,
+    0x30,
+    0xF3,
+    0x30,
+    0x03,
+    0x33,
+    0x03,
+    0x33,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0xF0,
+    0x33,
+    0xF0,
+    0x33,
+
+    /* @644 'R' (14 pixels wide) */
+    0xFF,
+    0x0F,
+    0xFF,
+    0x0F,
+    0x0C,
+    0x30,
+    0x0C,
+    0x30,
+    0x0C,
+    0x30,
+    0x0C,
+    0x30,
+    0xFC,
+    0x0F,
+    0xFC,
+    0x0F,
+    0x0C,
+    0x03,
+    0x0C,
+    0x03,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x3F,
+    0x3F,
+    0x3F,
+    0x3F,
+
+    /* @672 'T' (14 pixels wide) */
+    0xFF,
+    0x3F,
+    0xFF,
+    0x3F,
+    0xC3,
+    0x30,
+    0xC3,
+    0x30,
+    0xC0,
+    0x00,
+    0xC0,
+    0x00,
+    0xC0,
+    0x00,
+    0xC0,
+    0x00,
+    0xC0,
+    0x00,
+    0xC0,
+    0x00,
+    0xC0,
+    0x00,
+    0xC0,
+    0x00,
+    0xF0,
+    0x03,
+    0xF0,
+    0x03,
+
+    /* @700 'V' (14 pixels wide) */
+    0x3F,
+    0x3F,
+    0x3F,
+    0x3F,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x30,
+    0x03,
+    0x30,
+    0x03,
+    0x30,
+    0x03,
+    0x30,
+    0x03,
+    0xC0,
+    0x00,
+    0xC0,
+    0x00,
+
+    /* @728 'W' (14 pixels wide) */
+    0x3F,
+    0x3F,
+    0x3F,
+    0x3F,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0xCC,
+    0x0C,
+    0xCC,
+    0x0C,
+    0xCC,
+    0x0C,
+    0xCC,
+    0x0C,
+    0x30,
+    0x03,
+    0x30,
+    0x03,
+    0x30,
+    0x03,
+    0x30,
+    0x03,
+
+    /* @756 'X' (14 pixels wide) */
+    0x3F,
+    0x3F,
+    0x3F,
+    0x3F,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x30,
+    0x03,
+    0x30,
+    0x03,
+    0xC0,
+    0x00,
+    0xC0,
+    0x00,
+    0x30,
+    0x03,
+    0x30,
+    0x03,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x3F,
+    0x3F,
+    0x3F,
+    0x3F,
+
+    /* @784 'Y' (14 pixels wide) */
+    0x3F,
+    0x3F,
+    0x3F,
+    0x3F,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x0C,
+    0x30,
+    0x03,
+    0x30,
+    0x03,
+    0xC0,
+    0x00,
+    0xC0,
+    0x00,
+    0xC0,
+    0x00,
+    0xC0,
+    0x00,
+    0xC0,
+    0x00,
+    0xC0,
+    0x00,
+    0xF0,
+    0x03,
+    0xF0,
+    0x03,
+};
+
+/* Character descriptors for 7:12 Serif 24pt */
+/* { [Char width in bits], [Offset into _712Serif_24ptCharBitmaps in bytes] } */
+const FONT_CHAR_INFO _712Serif_24ptDescriptors[] = {
+    {14, 0}, /* - */
+    {0, 0}, /* . */
+    {0, 0}, /* / */
+    {14, 28}, /* 0 */
+    {14, 56}, /* 1 */
+    {14, 84}, /* 2 */
+    {14, 112}, /* 3 */
+    {14, 140}, /* 4 */
+    {14, 168}, /* 5 */
+    {14, 196}, /* 6 */
+    {14, 224}, /* 7 */
+    {14, 252}, /* 8 */
+    {14, 280}, /* 9 */
+    {0, 0}, /* : */
+    {0, 0}, /* ; */
+    {0, 0}, /* < */
+    {0, 0}, /* = */
+    {0, 0}, /* > */
+    {0, 0}, /* ? */
+    {0, 0}, /* @ */
+    {0, 0}, /* A */
+    {14, 308}, /* B */
+    {14, 336}, /* C */
+    {14, 364}, /* D */
+    {0, 0}, /* E */
+    {14, 392}, /* F */
+    {14, 420}, /* G */
+    {14, 448}, /* H */
+    {0, 0}, /* I */
+    {14, 476}, /* J */
+    {14, 504}, /* K */
+    {0, 0}, /* L */
+    {14, 532}, /* M */
+    {14, 560}, /* N */
+    {0, 0}, /* O */
+    {14, 588}, /* P */
+    {14, 616}, /* Q */
+    {14, 644}, /* R */
+    {0, 0}, /* S */
+    {14, 672}, /* T */
+    {0, 0}, /* U */
+    {14, 700}, /* V */
+    {14, 728}, /* W */
+    {14, 756}, /* X */
+    {14, 784}, /* Y */
+};
+
+/* Font information for 7:12 Serif 24pt */
+const FONT_INFO _712Serif_24ptFontInfo = {
+    14, /*  Character height */
+    '-', /*  Start character */
+    'Y', /*  End character */
+    2, /*  Width, in pixels, of space character */
+    _712Serif_24ptDescriptors, /*  Character descriptor array */
+    _712Serif_24ptBitmaps, /*  Character bitmap array */
+};

+ 8 - 0
ui/fonts/712serif/712serif.h

@@ -0,0 +1,8 @@
+#pragma once
+
+/* GENERATED BY https://github.com/pavius/the-dot-factory */
+
+#include "../font_info.h"
+
+/* Font data for 7:12 Serif 24pt */
+extern const FONT_INFO _712Serif_24ptFontInfo;

+ 27 - 0
ui/fonts/active_font.h

@@ -0,0 +1,27 @@
+#pragma once
+
+#include "../../features_config.h"
+#include "font_info.h"
+
+#if TOTP_FONT == TOTP_FONT_MODENINE
+#include "mode_nine/mode_nine.h"
+#define TOTP_CODE_FONT_INFO modeNine_15ptFontInfo
+#elif TOTP_FONT == TOTP_FONT_REDHATMONO
+#include "redhat_mono/redhat_mono.h"
+#define TOTP_CODE_FONT_INFO redHatMono_16ptFontInfo
+#elif TOTP_FONT == TOTP_FONT_BEDSTEAD
+#include "bedstead/bedstead.h"
+#define TOTP_CODE_FONT_INFO bedstead_17ptFontInfo
+#elif TOTP_FONT == TOTP_FONT_ZECTOR
+#include "zector/zector.h"
+#define TOTP_CODE_FONT_INFO zector_18ptFontInfo
+#elif TOTP_FONT == TOTP_FONT_712SERIF
+#include "712serif/712serif.h"
+#define TOTP_CODE_FONT_INFO _712Serif_24ptFontInfo
+#elif TOTP_FONT == TOTP_FONT_GRAPH35PIX
+#include "graph35pix/graph35pix.h"
+#define TOTP_CODE_FONT_INFO graph35pix_12ptFontInfo
+#elif TOTP_FONT == TOTP_FONT_KARMAFUTURE
+#include "karma_future/karma_future.h"
+#define TOTP_CODE_FONT_INFO karmaFuture_14ptFontInfo
+#endif

+ 1056 - 0
ui/fonts/bedstead/bedstead.c

@@ -0,0 +1,1056 @@
+#include "bedstead.h"
+
+/* GENERATED BY https://github.com/pavius/the-dot-factory */
+
+/* 
+**  Font data for Bedstead 17pt
+*/
+
+/* Character bitmaps for Bedstead 17pt */
+const uint8_t bedstead_17ptBitmaps[] = {
+    /* @0 '-' (13 pixels wide) */
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0xF8,
+    0x07,
+    0xF8,
+    0x07,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+
+    /* @32 '0' (13 pixels wide) */
+    0xE0,
+    0x00,
+    0xF0,
+    0x01,
+    0xF8,
+    0x03,
+    0xBC,
+    0x07,
+    0x1E,
+    0x0F,
+    0x0F,
+    0x1E,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x0F,
+    0x1E,
+    0x1E,
+    0x0F,
+    0xBC,
+    0x07,
+    0xF8,
+    0x03,
+    0xF0,
+    0x01,
+    0xE0,
+    0x00,
+
+    /* @64 '1' (13 pixels wide) */
+    0xE0,
+    0x00,
+    0xE0,
+    0x00,
+    0xF8,
+    0x00,
+    0xF8,
+    0x00,
+    0xE0,
+    0x00,
+    0xE0,
+    0x00,
+    0xE0,
+    0x00,
+    0xE0,
+    0x00,
+    0xE0,
+    0x00,
+    0xE0,
+    0x00,
+    0xE0,
+    0x00,
+    0xE0,
+    0x00,
+    0xE0,
+    0x00,
+    0xE0,
+    0x00,
+    0xF8,
+    0x03,
+    0xF8,
+    0x03,
+
+    /* @96 '2' (13 pixels wide) */
+    0xF0,
+    0x07,
+    0xFC,
+    0x0F,
+    0x1E,
+    0x1E,
+    0x1E,
+    0x1C,
+    0x0E,
+    0x1C,
+    0x00,
+    0x1C,
+    0x00,
+    0x1E,
+    0xC0,
+    0x0F,
+    0xE0,
+    0x07,
+    0xF0,
+    0x00,
+    0x7C,
+    0x00,
+    0x3E,
+    0x00,
+    0x1E,
+    0x00,
+    0x0E,
+    0x00,
+    0xFE,
+    0x1F,
+    0xFE,
+    0x1F,
+
+    /* @128 '3' (13 pixels wide) */
+    0xFE,
+    0x1F,
+    0xFE,
+    0x1F,
+    0x00,
+    0x1C,
+    0x00,
+    0x1E,
+    0x00,
+    0x0F,
+    0x00,
+    0x0F,
+    0x00,
+    0x07,
+    0xE0,
+    0x07,
+    0xE0,
+    0x0F,
+    0x00,
+    0x1E,
+    0x00,
+    0x1C,
+    0x0E,
+    0x1C,
+    0x1E,
+    0x1C,
+    0x3E,
+    0x0E,
+    0xFC,
+    0x0F,
+    0xF8,
+    0x07,
+
+    /* @160 '4' (13 pixels wide) */
+    0x80,
+    0x03,
+    0x80,
+    0x03,
+    0xE0,
+    0x03,
+    0xF0,
+    0x03,
+    0xF8,
+    0x03,
+    0xBC,
+    0x03,
+    0x9E,
+    0x03,
+    0x8F,
+    0x03,
+    0x87,
+    0x03,
+    0xFF,
+    0x0F,
+    0xFF,
+    0x0F,
+    0x80,
+    0x03,
+    0x80,
+    0x03,
+    0x80,
+    0x03,
+    0x80,
+    0x03,
+    0x80,
+    0x03,
+
+    /* @192 '5' (13 pixels wide) */
+    0xFF,
+    0x1F,
+    0xFF,
+    0x1F,
+    0x07,
+    0x00,
+    0x07,
+    0x00,
+    0xFF,
+    0x07,
+    0xFF,
+    0x0F,
+    0x00,
+    0x1E,
+    0x00,
+    0x1C,
+    0x00,
+    0x1C,
+    0x00,
+    0x1C,
+    0x00,
+    0x1C,
+    0x07,
+    0x1C,
+    0x0F,
+    0x1E,
+    0xFE,
+    0x0F,
+    0xFC,
+    0x07,
+    0xFC,
+    0x07,
+
+    /* @224 '6' (13 pixels wide) */
+    0xE0,
+    0x07,
+    0xF0,
+    0x07,
+    0x78,
+    0x00,
+    0x3C,
+    0x00,
+    0x1E,
+    0x00,
+    0x0F,
+    0x00,
+    0x07,
+    0x00,
+    0xFF,
+    0x07,
+    0xFF,
+    0x0F,
+    0x07,
+    0x1E,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x0F,
+    0x1E,
+    0x1E,
+    0x0F,
+    0xFE,
+    0x0F,
+    0xFC,
+    0x07,
+
+    /* @256 '7' (13 pixels wide) */
+    0xFE,
+    0x1F,
+    0xFE,
+    0x1F,
+    0x00,
+    0x1C,
+    0x00,
+    0x1E,
+    0x00,
+    0x0F,
+    0x80,
+    0x07,
+    0xC0,
+    0x03,
+    0xE0,
+    0x01,
+    0xF0,
+    0x00,
+    0x78,
+    0x00,
+    0x38,
+    0x00,
+    0x38,
+    0x00,
+    0x38,
+    0x00,
+    0x38,
+    0x00,
+    0x38,
+    0x00,
+    0x38,
+    0x00,
+
+    /* @288 '8' (13 pixels wide) */
+    0xFC,
+    0x07,
+    0xFE,
+    0x0F,
+    0x0F,
+    0x1E,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x0F,
+    0x1E,
+    0xFE,
+    0x0F,
+    0xFE,
+    0x0F,
+    0x0F,
+    0x1E,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x0F,
+    0x1E,
+    0x1E,
+    0x0F,
+    0xFE,
+    0x0F,
+    0xFC,
+    0x07,
+
+    /* @320 '9' (13 pixels wide) */
+    0xFC,
+    0x07,
+    0xFE,
+    0x0F,
+    0x0F,
+    0x1E,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x0F,
+    0x1C,
+    0xFE,
+    0x1F,
+    0xFC,
+    0x1F,
+    0x00,
+    0x1C,
+    0x00,
+    0x1E,
+    0x00,
+    0x0F,
+    0x80,
+    0x07,
+    0xC0,
+    0x03,
+    0xFC,
+    0x01,
+    0xFC,
+    0x00,
+
+    /* @352 'B' (13 pixels wide) */
+    0xFF,
+    0x07,
+    0xFF,
+    0x0F,
+    0x07,
+    0x1E,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x07,
+    0x1E,
+    0xFF,
+    0x0F,
+    0xFF,
+    0x0F,
+    0x07,
+    0x1E,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x07,
+    0x1E,
+    0x07,
+    0x0F,
+    0xFF,
+    0x0F,
+    0xFF,
+    0x07,
+
+    /* @384 'C' (13 pixels wide) */
+    0xFC,
+    0x01,
+    0xFE,
+    0x07,
+    0x0F,
+    0x0F,
+    0x07,
+    0x0F,
+    0x07,
+    0x0E,
+    0x07,
+    0x00,
+    0x07,
+    0x00,
+    0x07,
+    0x00,
+    0x07,
+    0x00,
+    0x07,
+    0x00,
+    0x07,
+    0x00,
+    0x07,
+    0x00,
+    0x07,
+    0x0F,
+    0x8F,
+    0x0F,
+    0xFE,
+    0x07,
+    0xFC,
+    0x03,
+
+    /* @416 'D' (13 pixels wide) */
+    0xFF,
+    0x07,
+    0xFF,
+    0x0F,
+    0x07,
+    0x1E,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x07,
+    0x1E,
+    0x07,
+    0x0F,
+    0xFF,
+    0x0F,
+    0xFF,
+    0x07,
+
+    /* @448 'F' (13 pixels wide) */
+    0xFF,
+    0x0F,
+    0xFF,
+    0x0F,
+    0x07,
+    0x00,
+    0x07,
+    0x00,
+    0x07,
+    0x00,
+    0x07,
+    0x00,
+    0x07,
+    0x00,
+    0xFF,
+    0x03,
+    0xFF,
+    0x03,
+    0x07,
+    0x00,
+    0x07,
+    0x00,
+    0x07,
+    0x00,
+    0x07,
+    0x00,
+    0x07,
+    0x00,
+    0x07,
+    0x00,
+    0x07,
+    0x00,
+
+    /* @480 'G' (13 pixels wide) */
+    0xFC,
+    0x07,
+    0xFE,
+    0x0F,
+    0x0F,
+    0x1F,
+    0x0F,
+    0x1E,
+    0x07,
+    0x1C,
+    0x07,
+    0x00,
+    0x07,
+    0x00,
+    0x07,
+    0x00,
+    0x07,
+    0x00,
+    0x87,
+    0x1F,
+    0x87,
+    0x1F,
+    0x07,
+    0x1C,
+    0x0F,
+    0x1C,
+    0xFE,
+    0x1F,
+    0xFC,
+    0x1F,
+    0xFC,
+    0x1F,
+
+    /* @512 'H' (13 pixels wide) */
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0xFF,
+    0x1F,
+    0xFF,
+    0x1F,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+
+    /* @544 'J' (13 pixels wide) */
+    0x00,
+    0x1C,
+    0x00,
+    0x1C,
+    0x00,
+    0x1C,
+    0x00,
+    0x1C,
+    0x00,
+    0x1C,
+    0x00,
+    0x1C,
+    0x00,
+    0x1C,
+    0x00,
+    0x1C,
+    0x00,
+    0x1C,
+    0x00,
+    0x1C,
+    0x00,
+    0x1C,
+    0x0E,
+    0x1C,
+    0x1E,
+    0x1C,
+    0x3E,
+    0x1E,
+    0xFC,
+    0x0F,
+    0xF8,
+    0x07,
+
+    /* @576 'K' (13 pixels wide) */
+    0x07,
+    0x0E,
+    0x07,
+    0x0F,
+    0x87,
+    0x07,
+    0xC7,
+    0x03,
+    0xE7,
+    0x01,
+    0xF7,
+    0x00,
+    0x7F,
+    0x00,
+    0x3F,
+    0x00,
+    0x3F,
+    0x00,
+    0x7F,
+    0x00,
+    0xF7,
+    0x00,
+    0xE7,
+    0x01,
+    0xC7,
+    0x03,
+    0x87,
+    0x07,
+    0x07,
+    0x0F,
+    0x07,
+    0x0E,
+
+    /* @608 'M' (13 pixels wide) */
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0xBF,
+    0x1F,
+    0xFF,
+    0x1F,
+    0xFF,
+    0x1F,
+    0xE7,
+    0x1C,
+    0xE7,
+    0x1C,
+    0xE7,
+    0x1C,
+    0xE7,
+    0x1C,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+
+    /* @640 'N' (13 pixels wide) */
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x3F,
+    0x1C,
+    0x7F,
+    0x1C,
+    0xFF,
+    0x1C,
+    0xE7,
+    0x1F,
+    0xC7,
+    0x1F,
+    0x87,
+    0x1F,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+
+    /* @672 'P' (13 pixels wide) */
+    0xFF,
+    0x07,
+    0xFF,
+    0x0F,
+    0x07,
+    0x1E,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x07,
+    0x1E,
+    0xFF,
+    0x0F,
+    0xFF,
+    0x07,
+    0x07,
+    0x00,
+    0x07,
+    0x00,
+    0x07,
+    0x00,
+    0x07,
+    0x00,
+    0x07,
+    0x00,
+    0x07,
+    0x00,
+    0x07,
+    0x00,
+
+    /* @704 'Q' (13 pixels wide) */
+    0xFC,
+    0x07,
+    0xFE,
+    0x0F,
+    0x0F,
+    0x1E,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0xE7,
+    0x1C,
+    0xE7,
+    0x1F,
+    0xC7,
+    0x0F,
+    0x8F,
+    0x07,
+    0xDE,
+    0x0F,
+    0xFE,
+    0x1F,
+    0xFC,
+    0x1C,
+
+    /* @736 'R' (13 pixels wide) */
+    0xFF,
+    0x07,
+    0xFF,
+    0x0F,
+    0x07,
+    0x1E,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x07,
+    0x1E,
+    0xFF,
+    0x0F,
+    0xFF,
+    0x07,
+    0xE7,
+    0x00,
+    0xE7,
+    0x01,
+    0xC7,
+    0x03,
+    0x87,
+    0x07,
+    0x07,
+    0x0F,
+    0x07,
+    0x1E,
+    0x07,
+    0x1C,
+
+    /* @768 'T' (13 pixels wide) */
+    0xFF,
+    0x1F,
+    0xFF,
+    0x1F,
+    0xE0,
+    0x00,
+    0xE0,
+    0x00,
+    0xE0,
+    0x00,
+    0xE0,
+    0x00,
+    0xE0,
+    0x00,
+    0xE0,
+    0x00,
+    0xE0,
+    0x00,
+    0xE0,
+    0x00,
+    0xE0,
+    0x00,
+    0xE0,
+    0x00,
+    0xE0,
+    0x00,
+    0xE0,
+    0x00,
+    0xE0,
+    0x00,
+    0xE0,
+    0x00,
+
+    /* @800 'V' (13 pixels wide) */
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x1F,
+    0x1F,
+    0xBC,
+    0x07,
+    0xB8,
+    0x03,
+    0xB8,
+    0x03,
+    0xF8,
+    0x07,
+    0xF0,
+    0x03,
+    0xE0,
+    0x01,
+    0xE0,
+    0x00,
+    0xE0,
+    0x00,
+    0xE0,
+    0x00,
+
+    /* @832 'W' (13 pixels wide) */
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0xE7,
+    0x1C,
+    0xE7,
+    0x1C,
+    0xE7,
+    0x1C,
+    0xE7,
+    0x1C,
+    0xE7,
+    0x1C,
+    0xFF,
+    0x1F,
+    0xFE,
+    0x0F,
+    0xFE,
+    0x0F,
+    0xBC,
+    0x07,
+
+    /* @864 'X' (13 pixels wide) */
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x0F,
+    0x1E,
+    0x1E,
+    0x0F,
+    0xBC,
+    0x07,
+    0xF8,
+    0x03,
+    0xF0,
+    0x01,
+    0xF0,
+    0x01,
+    0xF8,
+    0x03,
+    0xBC,
+    0x07,
+    0x1E,
+    0x0F,
+    0x0F,
+    0x1E,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+
+    /* @896 'Y' (13 pixels wide) */
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x0F,
+    0x1E,
+    0x1E,
+    0x0F,
+    0xBC,
+    0x07,
+    0xF8,
+    0x03,
+    0xF0,
+    0x01,
+    0xE0,
+    0x00,
+    0xE0,
+    0x00,
+    0xE0,
+    0x00,
+    0xE0,
+    0x00,
+    0xE0,
+    0x00,
+    0xE0,
+    0x00,
+    0xE0,
+    0x00,
+    0xE0,
+    0x00,
+};
+
+/* Character descriptors for Bedstead 17pt */
+/* { [Char width in bits], [Offset into bedstead_17ptCharBitmaps in bytes] } */
+const FONT_CHAR_INFO bedstead_17ptDescriptors[] = {
+    {13, 0}, /* - */
+    {0, 0}, /* . */
+    {0, 0}, /* / */
+    {13, 32}, /* 0 */
+    {13, 64}, /* 1 */
+    {13, 96}, /* 2 */
+    {13, 128}, /* 3 */
+    {13, 160}, /* 4 */
+    {13, 192}, /* 5 */
+    {13, 224}, /* 6 */
+    {13, 256}, /* 7 */
+    {13, 288}, /* 8 */
+    {13, 320}, /* 9 */
+    {0, 0}, /* : */
+    {0, 0}, /* ; */
+    {0, 0}, /* < */
+    {0, 0}, /* = */
+    {0, 0}, /* > */
+    {0, 0}, /* ? */
+    {0, 0}, /* @ */
+    {0, 0}, /* A */
+    {13, 352}, /* B */
+    {13, 384}, /* C */
+    {13, 416}, /* D */
+    {0, 0}, /* E */
+    {13, 448}, /* F */
+    {13, 480}, /* G */
+    {13, 512}, /* H */
+    {0, 0}, /* I */
+    {13, 544}, /* J */
+    {13, 576}, /* K */
+    {0, 0}, /* L */
+    {13, 608}, /* M */
+    {13, 640}, /* N */
+    {0, 0}, /* O */
+    {13, 672}, /* P */
+    {13, 704}, /* Q */
+    {13, 736}, /* R */
+    {0, 0}, /* S */
+    {13, 768}, /* T */
+    {0, 0}, /* U */
+    {13, 800}, /* V */
+    {13, 832}, /* W */
+    {13, 864}, /* X */
+    {13, 896}, /* Y */
+};
+
+/* Font information for Bedstead 17pt */
+const FONT_INFO bedstead_17ptFontInfo = {
+    16, /*  Character height */
+    '-', /*  Start character */
+    'Y', /*  End character */
+    2, /*  Width, in pixels, of space character */
+    bedstead_17ptDescriptors, /*  Character descriptor array */
+    bedstead_17ptBitmaps, /*  Character bitmap array */
+};

+ 8 - 0
ui/fonts/bedstead/bedstead.h

@@ -0,0 +1,8 @@
+#pragma once
+
+/* GENERATED BY https://github.com/pavius/the-dot-factory */
+
+#include "../font_info.h"
+
+/* Font data for Bedstead 17pt */
+extern const FONT_INFO bedstead_17ptFontInfo;

+ 0 - 0
ui/fonts/font-info.h → ui/fonts/font_info.h


+ 940 - 0
ui/fonts/graph35pix/graph35pix.c

@@ -0,0 +1,940 @@
+#include "graph35pix.h"
+
+/* GENERATED BY https://github.com/pavius/the-dot-factory */
+
+/* 
+**  Font data for Graph 35+ pix 12pt
+*/
+
+/* Character bitmaps for Graph 35+ pix 12pt */
+const uint8_t graph35pix_12ptBitmaps[] = {
+    /* @0 '-' (10 pixels wide) */
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0xFF,
+    0x03,
+    0xFF,
+    0x03,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+
+    /* @28 '0' (10 pixels wide) */
+    0xFC,
+    0x00,
+    0xFC,
+    0x00,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0xC3,
+    0x03,
+    0xC3,
+    0x03,
+    0x33,
+    0x03,
+    0x33,
+    0x03,
+    0x0F,
+    0x03,
+    0x0F,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0xFC,
+    0x00,
+    0xFC,
+    0x00,
+
+    /* @56 '1' (10 pixels wide) */
+    0x30,
+    0x00,
+    0x30,
+    0x00,
+    0x3C,
+    0x00,
+    0x3C,
+    0x00,
+    0x30,
+    0x00,
+    0x30,
+    0x00,
+    0x30,
+    0x00,
+    0x30,
+    0x00,
+    0x30,
+    0x00,
+    0x30,
+    0x00,
+    0x30,
+    0x00,
+    0x30,
+    0x00,
+    0xFC,
+    0x00,
+    0xFC,
+    0x00,
+
+    /* @84 '2' (10 pixels wide) */
+    0xFC,
+    0x00,
+    0xFC,
+    0x00,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x00,
+    0x03,
+    0x00,
+    0x03,
+    0xC0,
+    0x00,
+    0xC0,
+    0x00,
+    0x30,
+    0x00,
+    0x30,
+    0x00,
+    0x0C,
+    0x00,
+    0x0C,
+    0x00,
+    0xFF,
+    0x03,
+    0xFF,
+    0x03,
+
+    /* @112 '3' (10 pixels wide) */
+    0xFF,
+    0x03,
+    0xFF,
+    0x03,
+    0xC0,
+    0x00,
+    0xC0,
+    0x00,
+    0x30,
+    0x00,
+    0x30,
+    0x00,
+    0xC0,
+    0x00,
+    0xC0,
+    0x00,
+    0x00,
+    0x03,
+    0x00,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0xFC,
+    0x00,
+    0xFC,
+    0x00,
+
+    /* @140 '4' (10 pixels wide) */
+    0xC0,
+    0x00,
+    0xC0,
+    0x00,
+    0xF0,
+    0x00,
+    0xF0,
+    0x00,
+    0xCC,
+    0x00,
+    0xCC,
+    0x00,
+    0xC3,
+    0x00,
+    0xC3,
+    0x00,
+    0xFF,
+    0x03,
+    0xFF,
+    0x03,
+    0xC0,
+    0x00,
+    0xC0,
+    0x00,
+    0xC0,
+    0x00,
+    0xC0,
+    0x00,
+
+    /* @168 '5' (10 pixels wide) */
+    0xFF,
+    0x03,
+    0xFF,
+    0x03,
+    0x03,
+    0x00,
+    0x03,
+    0x00,
+    0xFF,
+    0x00,
+    0xFF,
+    0x00,
+    0x00,
+    0x03,
+    0x00,
+    0x03,
+    0x00,
+    0x03,
+    0x00,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0xFC,
+    0x00,
+    0xFC,
+    0x00,
+
+    /* @196 '6' (10 pixels wide) */
+    0xF0,
+    0x00,
+    0xF0,
+    0x00,
+    0x0C,
+    0x00,
+    0x0C,
+    0x00,
+    0x03,
+    0x00,
+    0x03,
+    0x00,
+    0xFF,
+    0x00,
+    0xFF,
+    0x00,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0xFC,
+    0x00,
+    0xFC,
+    0x00,
+
+    /* @224 '7' (10 pixels wide) */
+    0xFF,
+    0x03,
+    0xFF,
+    0x03,
+    0x00,
+    0x03,
+    0x00,
+    0x03,
+    0xC0,
+    0x00,
+    0xC0,
+    0x00,
+    0x30,
+    0x00,
+    0x30,
+    0x00,
+    0x30,
+    0x00,
+    0x30,
+    0x00,
+    0x30,
+    0x00,
+    0x30,
+    0x00,
+    0x30,
+    0x00,
+    0x30,
+    0x00,
+
+    /* @252 '8' (10 pixels wide) */
+    0xFC,
+    0x00,
+    0xFC,
+    0x00,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0xFC,
+    0x00,
+    0xFC,
+    0x00,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0xFC,
+    0x00,
+    0xFC,
+    0x00,
+
+    /* @280 '9' (10 pixels wide) */
+    0xFC,
+    0x00,
+    0xFC,
+    0x00,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0xFC,
+    0x03,
+    0xFC,
+    0x03,
+    0x00,
+    0x03,
+    0x00,
+    0x03,
+    0xC0,
+    0x00,
+    0xC0,
+    0x00,
+    0x3C,
+    0x00,
+    0x3C,
+    0x00,
+
+    /* @308 'B' (10 pixels wide) */
+    0xFF,
+    0x00,
+    0xFF,
+    0x00,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0xFF,
+    0x00,
+    0xFF,
+    0x00,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0xFF,
+    0x00,
+    0xFF,
+    0x00,
+
+    /* @336 'C' (10 pixels wide) */
+    0xFC,
+    0x00,
+    0xFC,
+    0x00,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x00,
+    0x03,
+    0x00,
+    0x03,
+    0x00,
+    0x03,
+    0x00,
+    0x03,
+    0x00,
+    0x03,
+    0x00,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0xFC,
+    0x00,
+    0xFC,
+    0x00,
+
+    /* @364 'D' (10 pixels wide) */
+    0x3F,
+    0x00,
+    0x3F,
+    0x00,
+    0xC3,
+    0x00,
+    0xC3,
+    0x00,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0xC3,
+    0x00,
+    0xC3,
+    0x00,
+    0x3F,
+    0x00,
+    0x3F,
+    0x00,
+
+    /* @392 'F' (10 pixels wide) */
+    0xFF,
+    0x03,
+    0xFF,
+    0x03,
+    0x03,
+    0x00,
+    0x03,
+    0x00,
+    0x03,
+    0x00,
+    0x03,
+    0x00,
+    0xFF,
+    0x00,
+    0xFF,
+    0x00,
+    0x03,
+    0x00,
+    0x03,
+    0x00,
+    0x03,
+    0x00,
+    0x03,
+    0x00,
+    0x03,
+    0x00,
+    0x03,
+    0x00,
+
+    /* @420 'G' (10 pixels wide) */
+    0xFC,
+    0x00,
+    0xFC,
+    0x00,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x00,
+    0x03,
+    0x00,
+    0xF3,
+    0x03,
+    0xF3,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0xFC,
+    0x03,
+    0xFC,
+    0x03,
+
+    /* @448 'H' (10 pixels wide) */
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0xFF,
+    0x03,
+    0xFF,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+
+    /* @476 'J' (10 pixels wide) */
+    0xF0,
+    0x03,
+    0xF0,
+    0x03,
+    0xC0,
+    0x00,
+    0xC0,
+    0x00,
+    0xC0,
+    0x00,
+    0xC0,
+    0x00,
+    0xC0,
+    0x00,
+    0xC0,
+    0x00,
+    0xC0,
+    0x00,
+    0xC0,
+    0x00,
+    0xC3,
+    0x00,
+    0xC3,
+    0x00,
+    0x3C,
+    0x00,
+    0x3C,
+    0x00,
+
+    /* @504 'K' (10 pixels wide) */
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0xC3,
+    0x00,
+    0xC3,
+    0x00,
+    0x33,
+    0x00,
+    0x33,
+    0x00,
+    0x0F,
+    0x00,
+    0x0F,
+    0x00,
+    0x33,
+    0x00,
+    0x33,
+    0x00,
+    0xC3,
+    0x00,
+    0xC3,
+    0x00,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+
+    /* @532 'M' (10 pixels wide) */
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0xCF,
+    0x03,
+    0xCF,
+    0x03,
+    0x33,
+    0x03,
+    0x33,
+    0x03,
+    0x33,
+    0x03,
+    0x33,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+
+    /* @560 'N' (10 pixels wide) */
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x0F,
+    0x03,
+    0x0F,
+    0x03,
+    0x0F,
+    0x03,
+    0x0F,
+    0x03,
+    0x33,
+    0x03,
+    0x33,
+    0x03,
+    0xC3,
+    0x03,
+    0xC3,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+
+    /* @588 'P' (10 pixels wide) */
+    0xFF,
+    0x00,
+    0xFF,
+    0x00,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0xFF,
+    0x00,
+    0xFF,
+    0x00,
+    0x03,
+    0x00,
+    0x03,
+    0x00,
+    0x03,
+    0x00,
+    0x03,
+    0x00,
+    0x03,
+    0x00,
+    0x03,
+    0x00,
+
+    /* @616 'Q' (10 pixels wide) */
+    0xFC,
+    0x00,
+    0xFC,
+    0x00,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x33,
+    0x03,
+    0x33,
+    0x03,
+    0xC3,
+    0x00,
+    0xC3,
+    0x00,
+    0x3C,
+    0x03,
+    0x3C,
+    0x03,
+
+    /* @644 'R' (10 pixels wide) */
+    0xFF,
+    0x00,
+    0xFF,
+    0x00,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0xFF,
+    0x00,
+    0xFF,
+    0x00,
+    0x33,
+    0x00,
+    0x33,
+    0x00,
+    0xC3,
+    0x00,
+    0xC3,
+    0x00,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+
+    /* @672 'T' (10 pixels wide) */
+    0xFF,
+    0x03,
+    0xFF,
+    0x03,
+    0x30,
+    0x00,
+    0x30,
+    0x00,
+    0x30,
+    0x00,
+    0x30,
+    0x00,
+    0x30,
+    0x00,
+    0x30,
+    0x00,
+    0x30,
+    0x00,
+    0x30,
+    0x00,
+    0x30,
+    0x00,
+    0x30,
+    0x00,
+    0x30,
+    0x00,
+    0x30,
+    0x00,
+
+    /* @700 'V' (10 pixels wide) */
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0xCC,
+    0x00,
+    0xCC,
+    0x00,
+    0x30,
+    0x00,
+    0x30,
+    0x00,
+
+    /* @728 'W' (10 pixels wide) */
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x33,
+    0x03,
+    0x33,
+    0x03,
+    0x33,
+    0x03,
+    0x33,
+    0x03,
+    0x33,
+    0x03,
+    0x33,
+    0x03,
+    0xCC,
+    0x00,
+    0xCC,
+    0x00,
+
+    /* @756 'X' (10 pixels wide) */
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0xCC,
+    0x00,
+    0xCC,
+    0x00,
+    0x30,
+    0x00,
+    0x30,
+    0x00,
+    0xCC,
+    0x00,
+    0xCC,
+    0x00,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+
+    /* @784 'Y' (10 pixels wide) */
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0x03,
+    0xCC,
+    0x00,
+    0xCC,
+    0x00,
+    0x30,
+    0x00,
+    0x30,
+    0x00,
+    0x30,
+    0x00,
+    0x30,
+    0x00,
+    0x30,
+    0x00,
+    0x30,
+    0x00,
+};
+
+/* Character descriptors for Graph 35+ pix 12pt */
+/* { [Char width in bits], [Offset into graph35pix_12ptCharBitmaps in bytes] } */
+const FONT_CHAR_INFO graph35pix_12ptDescriptors[] = {
+    {10, 0}, /* - */
+    {0, 0}, /* . */
+    {0, 0}, /* / */
+    {10, 28}, /* 0 */
+    {10, 56}, /* 1 */
+    {10, 84}, /* 2 */
+    {10, 112}, /* 3 */
+    {10, 140}, /* 4 */
+    {10, 168}, /* 5 */
+    {10, 196}, /* 6 */
+    {10, 224}, /* 7 */
+    {10, 252}, /* 8 */
+    {10, 280}, /* 9 */
+    {0, 0}, /* : */
+    {0, 0}, /* ; */
+    {0, 0}, /* < */
+    {0, 0}, /* = */
+    {0, 0}, /* > */
+    {0, 0}, /* ? */
+    {0, 0}, /* @ */
+    {0, 0}, /* A */
+    {10, 308}, /* B */
+    {10, 336}, /* C */
+    {10, 364}, /* D */
+    {0, 0}, /* E */
+    {10, 392}, /* F */
+    {10, 420}, /* G */
+    {10, 448}, /* H */
+    {0, 0}, /* I */
+    {10, 476}, /* J */
+    {10, 504}, /* K */
+    {0, 0}, /* L */
+    {10, 532}, /* M */
+    {10, 560}, /* N */
+    {0, 0}, /* O */
+    {10, 588}, /* P */
+    {10, 616}, /* Q */
+    {10, 644}, /* R */
+    {0, 0}, /* S */
+    {10, 672}, /* T */
+    {0, 0}, /* U */
+    {10, 700}, /* V */
+    {10, 728}, /* W */
+    {10, 756}, /* X */
+    {10, 784}, /* Y */
+};
+
+/* Font information for Graph 35+ pix 12pt */
+const FONT_INFO graph35pix_12ptFontInfo = {
+    14, /*  Character height */
+    '-', /*  Start character */
+    'Y', /*  End character */
+    2, /*  Width, in pixels, of space character */
+    graph35pix_12ptDescriptors, /*  Character descriptor array */
+    graph35pix_12ptBitmaps, /*  Character bitmap array */
+};

+ 8 - 0
ui/fonts/graph35pix/graph35pix.h

@@ -0,0 +1,8 @@
+#pragma once
+
+/* GENERATED BY https://github.com/pavius/the-dot-factory */
+
+#include "../font_info.h"
+
+/* Font data for Graph 35+ pix 12pt */
+extern const FONT_INFO graph35pix_12ptFontInfo;

+ 1172 - 0
ui/fonts/karma_future/karma_future.c

@@ -0,0 +1,1172 @@
+#include "karma_future.h"
+
+/* GENERATED BY https://github.com/pavius/the-dot-factory */
+
+/* 
+**  Font data for Karma Future 14pt
+*/
+
+/* Character bitmaps for Karma Future 14pt */
+const uint8_t karmaFuture_14ptBitmaps[] = {
+    /* @0 '-' (12 pixels wide) */
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0xFE,
+    0x03,
+    0x02,
+    0x02,
+    0x02,
+    0x02,
+    0xFE,
+    0x03,
+    0xFC,
+    0x03,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+
+    /* @36 '0' (12 pixels wide) */
+    0xF8,
+    0x01,
+    0x0E,
+    0x03,
+    0x02,
+    0x06,
+    0xF3,
+    0x06,
+    0xF9,
+    0x0C,
+    0x79,
+    0x0C,
+    0x39,
+    0x0D,
+    0x99,
+    0x0C,
+    0xC9,
+    0x0C,
+    0xE9,
+    0x0C,
+    0xF1,
+    0x0C,
+    0xF1,
+    0x0C,
+    0xF1,
+    0x0C,
+    0xF3,
+    0x0E,
+    0x02,
+    0x0E,
+    0x0E,
+    0x07,
+    0xFC,
+    0x07,
+    0xF8,
+    0x01,
+
+    /* @72 '1' (12 pixels wide) */
+    0x70,
+    0x00,
+    0xD8,
+    0x00,
+    0xCE,
+    0x00,
+    0xC2,
+    0x00,
+    0xC2,
+    0x00,
+    0xDE,
+    0x00,
+    0xDC,
+    0x00,
+    0xDC,
+    0x00,
+    0xD0,
+    0x00,
+    0xD0,
+    0x00,
+    0xD0,
+    0x00,
+    0xD0,
+    0x00,
+    0xD0,
+    0x00,
+    0xDE,
+    0x03,
+    0x02,
+    0x02,
+    0x02,
+    0x02,
+    0xFE,
+    0x03,
+    0xFC,
+    0x03,
+
+    /* @108 '2' (12 pixels wide) */
+    0xFC,
+    0x03,
+    0x06,
+    0x03,
+    0x03,
+    0x06,
+    0xF1,
+    0x04,
+    0xF9,
+    0x0C,
+    0xF9,
+    0x0C,
+    0x7F,
+    0x0E,
+    0x3E,
+    0x0F,
+    0x1E,
+    0x0F,
+    0x90,
+    0x07,
+    0xC8,
+    0x03,
+    0xE4,
+    0x01,
+    0xE6,
+    0x00,
+    0xF3,
+    0x07,
+    0x01,
+    0x0C,
+    0x01,
+    0x0C,
+    0xFF,
+    0x0F,
+    0xFE,
+    0x0F,
+
+    /* @144 '3' (12 pixels wide) */
+    0xFC,
+    0x03,
+    0x06,
+    0x03,
+    0x03,
+    0x06,
+    0xF1,
+    0x04,
+    0xF9,
+    0x0C,
+    0xFF,
+    0x0C,
+    0xFE,
+    0x0C,
+    0x0E,
+    0x0E,
+    0x08,
+    0x0F,
+    0xF8,
+    0x0E,
+    0xF8,
+    0x04,
+    0xFF,
+    0x0C,
+    0xF9,
+    0x0C,
+    0xF1,
+    0x0C,
+    0x03,
+    0x0E,
+    0x06,
+    0x0F,
+    0xFC,
+    0x07,
+    0xFC,
+    0x03,
+
+    /* @180 '4' (12 pixels wide) */
+    0xE0,
+    0x03,
+    0x30,
+    0x03,
+    0x10,
+    0x03,
+    0x08,
+    0x03,
+    0x4C,
+    0x03,
+    0x64,
+    0x03,
+    0x72,
+    0x03,
+    0x73,
+    0x03,
+    0x79,
+    0x03,
+    0x01,
+    0x04,
+    0x01,
+    0x0C,
+    0x7F,
+    0x0F,
+    0x7E,
+    0x0F,
+    0x7E,
+    0x0F,
+    0x40,
+    0x03,
+    0x40,
+    0x03,
+    0xC0,
+    0x03,
+    0x80,
+    0x03,
+
+    /* @216 '5' (12 pixels wide) */
+    0xFF,
+    0x07,
+    0x01,
+    0x0C,
+    0x01,
+    0x0C,
+    0xF9,
+    0x0F,
+    0xF9,
+    0x0F,
+    0xF9,
+    0x0F,
+    0x01,
+    0x03,
+    0x03,
+    0x06,
+    0xFE,
+    0x04,
+    0xFE,
+    0x0C,
+    0xFC,
+    0x0C,
+    0xFF,
+    0x0C,
+    0xF9,
+    0x0C,
+    0xF1,
+    0x0C,
+    0x03,
+    0x0E,
+    0x06,
+    0x0F,
+    0xFC,
+    0x07,
+    0xF8,
+    0x03,
+
+    /* @252 '6' (12 pixels wide) */
+    0xF0,
+    0x03,
+    0x10,
+    0x03,
+    0x08,
+    0x03,
+    0xCC,
+    0x03,
+    0xE6,
+    0x03,
+    0xF2,
+    0x03,
+    0xF2,
+    0x00,
+    0x01,
+    0x03,
+    0x01,
+    0x06,
+    0xF1,
+    0x04,
+    0xF9,
+    0x0C,
+    0xF9,
+    0x0C,
+    0xF9,
+    0x0C,
+    0xF1,
+    0x0C,
+    0x03,
+    0x0E,
+    0x06,
+    0x0F,
+    0xFC,
+    0x07,
+    0xF8,
+    0x03,
+
+    /* @288 '7' (12 pixels wide) */
+    0xFF,
+    0x07,
+    0x01,
+    0x0C,
+    0x01,
+    0x0C,
+    0xFF,
+    0x0E,
+    0xFE,
+    0x0E,
+    0x7E,
+    0x0F,
+    0x40,
+    0x07,
+    0x60,
+    0x07,
+    0x20,
+    0x03,
+    0x30,
+    0x03,
+    0x90,
+    0x01,
+    0x90,
+    0x01,
+    0xD0,
+    0x00,
+    0xC8,
+    0x00,
+    0xE8,
+    0x00,
+    0xE8,
+    0x00,
+    0x78,
+    0x00,
+    0x78,
+    0x00,
+
+    /* @324 '8' (12 pixels wide) */
+    0xF8,
+    0x01,
+    0x0C,
+    0x01,
+    0x06,
+    0x03,
+    0x72,
+    0x06,
+    0xF2,
+    0x06,
+    0xF2,
+    0x06,
+    0x72,
+    0x06,
+    0x06,
+    0x07,
+    0x02,
+    0x06,
+    0xF1,
+    0x04,
+    0xF9,
+    0x0C,
+    0xF9,
+    0x0C,
+    0xF9,
+    0x0C,
+    0xF1,
+    0x0C,
+    0x03,
+    0x0E,
+    0x06,
+    0x0F,
+    0xFC,
+    0x07,
+    0xF8,
+    0x03,
+
+    /* @360 '9' (12 pixels wide) */
+    0xFC,
+    0x03,
+    0x06,
+    0x03,
+    0x03,
+    0x06,
+    0xF1,
+    0x04,
+    0xF9,
+    0x0C,
+    0xF9,
+    0x0C,
+    0xF1,
+    0x0C,
+    0x03,
+    0x0C,
+    0x06,
+    0x0C,
+    0xFE,
+    0x0E,
+    0x7C,
+    0x0E,
+    0x38,
+    0x0F,
+    0x30,
+    0x07,
+    0x1C,
+    0x07,
+    0x84,
+    0x03,
+    0xC4,
+    0x01,
+    0xFC,
+    0x00,
+    0xF8,
+    0x00,
+
+    /* @396 'B' (12 pixels wide) */
+    0xFE,
+    0x01,
+    0x02,
+    0x03,
+    0x02,
+    0x02,
+    0x72,
+    0x06,
+    0xF2,
+    0x06,
+    0xF2,
+    0x06,
+    0x72,
+    0x06,
+    0x02,
+    0x06,
+    0x02,
+    0x06,
+    0xF2,
+    0x0C,
+    0xF2,
+    0x0D,
+    0xF2,
+    0x0D,
+    0xF2,
+    0x0D,
+    0xF2,
+    0x0C,
+    0x02,
+    0x0E,
+    0x02,
+    0x0E,
+    0xFE,
+    0x07,
+    0xFC,
+    0x03,
+
+    /* @432 'C' (12 pixels wide) */
+    0xF0,
+    0x03,
+    0x18,
+    0x02,
+    0x0C,
+    0x06,
+    0xE4,
+    0x0C,
+    0xE6,
+    0x0D,
+    0xF2,
+    0x0F,
+    0x72,
+    0x0F,
+    0x32,
+    0x0F,
+    0x12,
+    0x00,
+    0x12,
+    0x00,
+    0x12,
+    0x00,
+    0x32,
+    0x07,
+    0xA6,
+    0x0D,
+    0xE4,
+    0x0C,
+    0x08,
+    0x0E,
+    0x18,
+    0x0E,
+    0xF0,
+    0x07,
+    0xF0,
+    0x03,
+
+    /* @468 'D' (12 pixels wide) */
+    0xFE,
+    0x01,
+    0x02,
+    0x03,
+    0x02,
+    0x02,
+    0x72,
+    0x06,
+    0xF2,
+    0x06,
+    0xF2,
+    0x0D,
+    0xF2,
+    0x0D,
+    0xF2,
+    0x0D,
+    0xF2,
+    0x0D,
+    0xF2,
+    0x0D,
+    0xF2,
+    0x0D,
+    0xF2,
+    0x0E,
+    0xF2,
+    0x0E,
+    0x72,
+    0x0E,
+    0x02,
+    0x06,
+    0x02,
+    0x07,
+    0xFE,
+    0x03,
+    0xFC,
+    0x01,
+
+    /* @504 'F' (12 pixels wide) */
+    0xFE,
+    0x07,
+    0x02,
+    0x0C,
+    0x02,
+    0x0C,
+    0xF2,
+    0x0F,
+    0xF2,
+    0x0F,
+    0xF2,
+    0x0F,
+    0x12,
+    0x00,
+    0xF2,
+    0x03,
+    0x02,
+    0x02,
+    0xF2,
+    0x03,
+    0xF2,
+    0x03,
+    0xF2,
+    0x03,
+    0x12,
+    0x00,
+    0x12,
+    0x00,
+    0x12,
+    0x00,
+    0x12,
+    0x00,
+    0x1E,
+    0x00,
+    0x1C,
+    0x00,
+
+    /* @540 'G' (12 pixels wide) */
+    0xF0,
+    0x07,
+    0x18,
+    0x06,
+    0x0C,
+    0x0C,
+    0xE4,
+    0x0D,
+    0xE6,
+    0x0F,
+    0xF2,
+    0x0F,
+    0xF2,
+    0x0F,
+    0x32,
+    0x04,
+    0x32,
+    0x0C,
+    0xF2,
+    0x0D,
+    0xF2,
+    0x0D,
+    0xE6,
+    0x0D,
+    0xE6,
+    0x0D,
+    0xE4,
+    0x0D,
+    0x08,
+    0x0C,
+    0x18,
+    0x0C,
+    0xF0,
+    0x0F,
+    0xF0,
+    0x0F,
+
+    /* @576 'H' (12 pixels wide) */
+    0x1E,
+    0x07,
+    0x12,
+    0x0D,
+    0x12,
+    0x0D,
+    0x12,
+    0x0D,
+    0x12,
+    0x0D,
+    0x12,
+    0x0D,
+    0x12,
+    0x0D,
+    0xF2,
+    0x0D,
+    0x02,
+    0x0C,
+    0xF2,
+    0x0D,
+    0xF2,
+    0x0D,
+    0xF2,
+    0x0D,
+    0x12,
+    0x0D,
+    0x12,
+    0x0D,
+    0x12,
+    0x0D,
+    0x12,
+    0x0D,
+    0x1E,
+    0x0F,
+    0x1C,
+    0x0F,
+
+    /* @612 'J' (12 pixels wide) */
+    0x80,
+    0x03,
+    0x80,
+    0x06,
+    0x80,
+    0x06,
+    0x80,
+    0x06,
+    0x80,
+    0x06,
+    0x80,
+    0x06,
+    0x80,
+    0x06,
+    0x80,
+    0x06,
+    0x80,
+    0x06,
+    0x80,
+    0x06,
+    0x8E,
+    0x06,
+    0x8A,
+    0x06,
+    0xDA,
+    0x06,
+    0x72,
+    0x06,
+    0x02,
+    0x06,
+    0x06,
+    0x03,
+    0xFC,
+    0x03,
+    0xF8,
+    0x01,
+
+    /* @648 'K' (12 pixels wide) */
+    0x1E,
+    0x07,
+    0x92,
+    0x0D,
+    0xD2,
+    0x0C,
+    0x72,
+    0x0E,
+    0x32,
+    0x0E,
+    0x12,
+    0x0F,
+    0x92,
+    0x07,
+    0xC2,
+    0x03,
+    0xC2,
+    0x01,
+    0x92,
+    0x01,
+    0x12,
+    0x01,
+    0x32,
+    0x02,
+    0x32,
+    0x02,
+    0x72,
+    0x06,
+    0xD2,
+    0x0C,
+    0x92,
+    0x0D,
+    0x9E,
+    0x0F,
+    0x1C,
+    0x0F,
+
+    /* @684 'M' (12 pixels wide) */
+    0x1E,
+    0x07,
+    0x92,
+    0x0D,
+    0xA2,
+    0x0C,
+    0xE2,
+    0x0C,
+    0x62,
+    0x0C,
+    0x62,
+    0x0C,
+    0x12,
+    0x0D,
+    0x12,
+    0x0D,
+    0x92,
+    0x0D,
+    0x92,
+    0x0D,
+    0xF2,
+    0x0D,
+    0xF2,
+    0x0D,
+    0xF2,
+    0x0D,
+    0x12,
+    0x0D,
+    0x12,
+    0x0D,
+    0x12,
+    0x0D,
+    0x1E,
+    0x0F,
+    0x1C,
+    0x0F,
+
+    /* @720 'N' (12 pixels wide) */
+    0x1E,
+    0x07,
+    0x12,
+    0x0D,
+    0x22,
+    0x0D,
+    0x62,
+    0x0D,
+    0x62,
+    0x0D,
+    0xD2,
+    0x0D,
+    0xD2,
+    0x0D,
+    0x92,
+    0x0D,
+    0x92,
+    0x0D,
+    0x32,
+    0x0D,
+    0x32,
+    0x0D,
+    0x72,
+    0x0C,
+    0x52,
+    0x0C,
+    0xD2,
+    0x0C,
+    0x92,
+    0x0C,
+    0x92,
+    0x0D,
+    0x1E,
+    0x0F,
+    0x1C,
+    0x0F,
+
+    /* @756 'P' (12 pixels wide) */
+    0xFE,
+    0x03,
+    0x02,
+    0x02,
+    0x02,
+    0x06,
+    0xF2,
+    0x0C,
+    0xF2,
+    0x0D,
+    0xF2,
+    0x0D,
+    0xF2,
+    0x0D,
+    0xF2,
+    0x0C,
+    0x02,
+    0x0E,
+    0x02,
+    0x0E,
+    0xF2,
+    0x0F,
+    0xF2,
+    0x07,
+    0xF2,
+    0x03,
+    0x12,
+    0x00,
+    0x12,
+    0x00,
+    0x12,
+    0x00,
+    0x1E,
+    0x00,
+    0x1C,
+    0x00,
+
+    /* @792 'Q' (12 pixels wide) */
+    0xF0,
+    0x01,
+    0x18,
+    0x03,
+    0x0C,
+    0x02,
+    0x64,
+    0x06,
+    0xE6,
+    0x06,
+    0xF2,
+    0x0D,
+    0xF2,
+    0x0D,
+    0xF2,
+    0x0D,
+    0xF2,
+    0x0D,
+    0xF2,
+    0x0D,
+    0x32,
+    0x0D,
+    0x26,
+    0x0E,
+    0x26,
+    0x0E,
+    0x64,
+    0x0E,
+    0x08,
+    0x0C,
+    0x18,
+    0x0D,
+    0xF0,
+    0x0F,
+    0xF0,
+    0x0F,
+
+    /* @828 'R' (12 pixels wide) */
+    0xFE,
+    0x03,
+    0x02,
+    0x02,
+    0x02,
+    0x06,
+    0xF2,
+    0x0C,
+    0xF2,
+    0x0D,
+    0xF2,
+    0x0D,
+    0xF2,
+    0x0D,
+    0xF2,
+    0x0C,
+    0x02,
+    0x0E,
+    0x02,
+    0x0E,
+    0x12,
+    0x0F,
+    0x32,
+    0x06,
+    0x32,
+    0x06,
+    0x72,
+    0x06,
+    0xD2,
+    0x0C,
+    0x92,
+    0x0D,
+    0x9E,
+    0x0F,
+    0x1C,
+    0x0F,
+
+    /* @864 'T' (12 pixels wide) */
+    0xFE,
+    0x03,
+    0x02,
+    0x02,
+    0x02,
+    0x02,
+    0xDE,
+    0x03,
+    0xDC,
+    0x03,
+    0xDC,
+    0x03,
+    0xD0,
+    0x00,
+    0xD0,
+    0x00,
+    0xD0,
+    0x00,
+    0xD0,
+    0x00,
+    0xD0,
+    0x00,
+    0xD0,
+    0x00,
+    0xD0,
+    0x00,
+    0xD0,
+    0x00,
+    0xD0,
+    0x00,
+    0xD0,
+    0x00,
+    0xF0,
+    0x00,
+    0xF0,
+    0x00,
+
+    /* @900 'V' (12 pixels wide) */
+    0x1E,
+    0x07,
+    0x12,
+    0x0D,
+    0x12,
+    0x0D,
+    0x92,
+    0x0D,
+    0xA6,
+    0x0E,
+    0xA4,
+    0x0E,
+    0xA4,
+    0x0E,
+    0xE4,
+    0x06,
+    0x6C,
+    0x06,
+    0x68,
+    0x06,
+    0x68,
+    0x02,
+    0x18,
+    0x03,
+    0x10,
+    0x03,
+    0x10,
+    0x01,
+    0x90,
+    0x01,
+    0x90,
+    0x01,
+    0xE0,
+    0x01,
+    0xE0,
+    0x01,
+
+    /* @936 'W' (12 pixels wide) */
+    0x1E,
+    0x07,
+    0x12,
+    0x0D,
+    0x12,
+    0x0D,
+    0x12,
+    0x0D,
+    0x12,
+    0x0D,
+    0x12,
+    0x0D,
+    0x12,
+    0x0D,
+    0x12,
+    0x0D,
+    0xF2,
+    0x0D,
+    0x92,
+    0x0D,
+    0x12,
+    0x0D,
+    0x62,
+    0x0C,
+    0x62,
+    0x0C,
+    0xE2,
+    0x0C,
+    0xE2,
+    0x0C,
+    0xB2,
+    0x0D,
+    0x3E,
+    0x0F,
+    0x1C,
+    0x0F,
+
+    /* @972 'X' (12 pixels wide) */
+    0x1E,
+    0x07,
+    0x12,
+    0x0D,
+    0xB2,
+    0x0D,
+    0xA6,
+    0x0E,
+    0xE4,
+    0x0E,
+    0x6C,
+    0x0E,
+    0x18,
+    0x07,
+    0x98,
+    0x07,
+    0x90,
+    0x03,
+    0x10,
+    0x01,
+    0x68,
+    0x02,
+    0xE4,
+    0x02,
+    0xE4,
+    0x06,
+    0xE6,
+    0x06,
+    0xB2,
+    0x0D,
+    0x32,
+    0x0D,
+    0x1E,
+    0x0F,
+    0x1C,
+    0x0E,
+
+    /* @1008 'Y' (12 pixels wide) */
+    0x1E,
+    0x07,
+    0x12,
+    0x0D,
+    0xB2,
+    0x0D,
+    0xA6,
+    0x0E,
+    0xE4,
+    0x0E,
+    0x6C,
+    0x0E,
+    0x68,
+    0x06,
+    0x18,
+    0x07,
+    0x18,
+    0x03,
+    0x90,
+    0x03,
+    0x90,
+    0x01,
+    0x90,
+    0x01,
+    0xA0,
+    0x01,
+    0xA0,
+    0x01,
+    0xA0,
+    0x01,
+    0xE0,
+    0x01,
+    0xE0,
+    0x01,
+    0xE0,
+    0x01,
+};
+
+/* Character descriptors for Karma Future 14pt */
+/* { [Char width in bits], [Offset into karmaFuture_14ptCharBitmaps in bytes] } */
+const FONT_CHAR_INFO karmaFuture_14ptDescriptors[] = {
+    {12, 0}, /* - */
+    {0, 0}, /* . */
+    {0, 0}, /* / */
+    {12, 36}, /* 0 */
+    {12, 72}, /* 1 */
+    {12, 108}, /* 2 */
+    {12, 144}, /* 3 */
+    {12, 180}, /* 4 */
+    {12, 216}, /* 5 */
+    {12, 252}, /* 6 */
+    {12, 288}, /* 7 */
+    {12, 324}, /* 8 */
+    {12, 360}, /* 9 */
+    {0, 0}, /* : */
+    {0, 0}, /* ; */
+    {0, 0}, /* < */
+    {0, 0}, /* = */
+    {0, 0}, /* > */
+    {0, 0}, /* ? */
+    {0, 0}, /* @ */
+    {0, 0}, /* A */
+    {12, 396}, /* B */
+    {12, 432}, /* C */
+    {12, 468}, /* D */
+    {0, 0}, /* E */
+    {12, 504}, /* F */
+    {12, 540}, /* G */
+    {12, 576}, /* H */
+    {0, 0}, /* I */
+    {12, 612}, /* J */
+    {12, 648}, /* K */
+    {0, 0}, /* L */
+    {12, 684}, /* M */
+    {12, 720}, /* N */
+    {0, 0}, /* O */
+    {12, 756}, /* P */
+    {12, 792}, /* Q */
+    {12, 828}, /* R */
+    {0, 0}, /* S */
+    {12, 864}, /* T */
+    {0, 0}, /* U */
+    {12, 900}, /* V */
+    {12, 936}, /* W */
+    {12, 972}, /* X */
+    {12, 1008}, /* Y */
+};
+
+/* Font information for Karma Future 14pt */
+const FONT_INFO karmaFuture_14ptFontInfo = {
+    18, /*  Character height */
+    '-', /*  Start character */
+    'Y', /*  End character */
+    2, /*  Width, in pixels, of space character */
+    karmaFuture_14ptDescriptors, /*  Character descriptor array */
+    karmaFuture_14ptBitmaps, /*  Character bitmap array */
+};

+ 8 - 0
ui/fonts/karma_future/karma_future.h

@@ -0,0 +1,8 @@
+#pragma once
+
+/* GENERATED BY https://github.com/pavius/the-dot-factory */
+
+#include "../font_info.h"
+
+/* Font data for Karma Future 14pt */
+extern const FONT_INFO karmaFuture_14ptFontInfo;

+ 1 - 1
ui/fonts/mode-nine/mode-nine.c → ui/fonts/mode_nine/mode_nine.c

@@ -1,4 +1,4 @@
-#include "mode-nine.h"
+#include "mode_nine.h"
 #include <stdint.h>
 
 /* GENERATED BY https://github.com/pavius/the-dot-factory */

+ 1 - 1
ui/fonts/mode-nine/mode-nine.h → ui/fonts/mode_nine/mode_nine.h

@@ -2,7 +2,7 @@
 
 /* GENERATED BY https://github.com/pavius/the-dot-factory */
 
-#include "../font-info.h"
+#include "../font_info.h"
 
 /* Font data for ModeNine 15pt */
 extern const FONT_INFO modeNine_15ptFontInfo;

+ 1057 - 0
ui/fonts/redhat_mono/redhat_mono.c

@@ -0,0 +1,1057 @@
+#include "redhat_mono.h"
+#include <stdint.h>
+
+/* GENERATED BY https://github.com/pavius/the-dot-factory */
+
+/* 
+**  Font data for Red Hat Mono 16pt
+*/
+
+/* Character bitmaps for Red Hat Mono 16pt */
+const uint8_t redHatMono_16ptBitmaps[] = {
+    /* @0 '-' (12 pixels wide) */
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0xF8,
+    0x03,
+    0xF8,
+    0x03,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+
+    /* @32 '0' (12 pixels wide) */
+    0xF0,
+    0x00,
+    0xF8,
+    0x03,
+    0x1C,
+    0x07,
+    0x0E,
+    0x07,
+    0x8E,
+    0x07,
+    0x86,
+    0x0E,
+    0xC6,
+    0x0C,
+    0x66,
+    0x0C,
+    0x66,
+    0x0C,
+    0x36,
+    0x0E,
+    0x36,
+    0x0E,
+    0x1E,
+    0x06,
+    0x1C,
+    0x07,
+    0xF8,
+    0x03,
+    0xF0,
+    0x01,
+    0x00,
+    0x00,
+
+    /* @64 '1' (12 pixels wide) */
+    0x40,
+    0x00,
+    0x78,
+    0x00,
+    0x7E,
+    0x00,
+    0x66,
+    0x00,
+    0x60,
+    0x00,
+    0x60,
+    0x00,
+    0x60,
+    0x00,
+    0x60,
+    0x00,
+    0x60,
+    0x00,
+    0x60,
+    0x00,
+    0x60,
+    0x00,
+    0x60,
+    0x00,
+    0x60,
+    0x00,
+    0xFE,
+    0x07,
+    0xFE,
+    0x07,
+    0x00,
+    0x00,
+
+    /* @96 '2' (12 pixels wide) */
+    0xF0,
+    0x01,
+    0xFC,
+    0x03,
+    0x0E,
+    0x07,
+    0x04,
+    0x06,
+    0x00,
+    0x06,
+    0x00,
+    0x07,
+    0x00,
+    0x03,
+    0x80,
+    0x03,
+    0xC0,
+    0x01,
+    0xE0,
+    0x00,
+    0x70,
+    0x00,
+    0x38,
+    0x00,
+    0x1C,
+    0x00,
+    0xFE,
+    0x07,
+    0xFE,
+    0x07,
+    0x00,
+    0x00,
+
+    /* @128 '3' (12 pixels wide) */
+    0xF0,
+    0x00,
+    0xFC,
+    0x03,
+    0x0E,
+    0x07,
+    0x04,
+    0x06,
+    0x00,
+    0x06,
+    0x00,
+    0x06,
+    0x80,
+    0x03,
+    0xE0,
+    0x00,
+    0xE0,
+    0x03,
+    0x00,
+    0x06,
+    0x00,
+    0x06,
+    0x00,
+    0x0E,
+    0x06,
+    0x07,
+    0xFE,
+    0x07,
+    0xF8,
+    0x01,
+    0x00,
+    0x00,
+
+    /* @160 '4' (12 pixels wide) */
+    0x00,
+    0x03,
+    0x80,
+    0x03,
+    0xC0,
+    0x03,
+    0xE0,
+    0x03,
+    0x70,
+    0x03,
+    0x30,
+    0x03,
+    0x18,
+    0x03,
+    0x0C,
+    0x03,
+    0x0E,
+    0x03,
+    0xFF,
+    0x0F,
+    0xFF,
+    0x0F,
+    0x00,
+    0x03,
+    0x00,
+    0x03,
+    0x00,
+    0x03,
+    0x00,
+    0x03,
+    0x00,
+    0x00,
+
+    /* @192 '5' (12 pixels wide) */
+    0xFC,
+    0x07,
+    0xFC,
+    0x07,
+    0x0C,
+    0x00,
+    0x0C,
+    0x00,
+    0x0C,
+    0x00,
+    0x0C,
+    0x00,
+    0xFC,
+    0x01,
+    0xFE,
+    0x07,
+    0x00,
+    0x07,
+    0x00,
+    0x06,
+    0x00,
+    0x06,
+    0x00,
+    0x06,
+    0x06,
+    0x07,
+    0xFE,
+    0x03,
+    0xF8,
+    0x01,
+    0x00,
+    0x00,
+
+    /* @224 '6' (12 pixels wide) */
+    0xE0,
+    0x03,
+    0xF8,
+    0x07,
+    0x3C,
+    0x06,
+    0x0C,
+    0x00,
+    0x0E,
+    0x00,
+    0x06,
+    0x00,
+    0xE6,
+    0x03,
+    0xFE,
+    0x07,
+    0x0E,
+    0x0E,
+    0x06,
+    0x0C,
+    0x06,
+    0x0C,
+    0x0E,
+    0x0E,
+    0x1C,
+    0x06,
+    0xF8,
+    0x07,
+    0xF0,
+    0x03,
+    0x00,
+    0x00,
+
+    /* @256 '7' (12 pixels wide) */
+    0xFE,
+    0x0F,
+    0xFE,
+    0x0F,
+    0x00,
+    0x0E,
+    0x00,
+    0x06,
+    0x00,
+    0x07,
+    0x00,
+    0x03,
+    0x80,
+    0x01,
+    0xC0,
+    0x01,
+    0xC0,
+    0x00,
+    0xE0,
+    0x00,
+    0x60,
+    0x00,
+    0x70,
+    0x00,
+    0x30,
+    0x00,
+    0x38,
+    0x00,
+    0x1C,
+    0x00,
+    0x00,
+    0x00,
+
+    /* @288 '8' (12 pixels wide) */
+    0xF0,
+    0x01,
+    0xFC,
+    0x03,
+    0x1C,
+    0x07,
+    0x0E,
+    0x06,
+    0x0E,
+    0x06,
+    0x0C,
+    0x06,
+    0xBC,
+    0x03,
+    0xF0,
+    0x01,
+    0x1C,
+    0x07,
+    0x0E,
+    0x06,
+    0x06,
+    0x0E,
+    0x06,
+    0x0E,
+    0x0E,
+    0x06,
+    0xFC,
+    0x07,
+    0xF8,
+    0x03,
+    0x00,
+    0x00,
+
+    /* @320 '9' (12 pixels wide) */
+    0xF8,
+    0x01,
+    0xFC,
+    0x03,
+    0x0C,
+    0x07,
+    0x0E,
+    0x0E,
+    0x06,
+    0x0C,
+    0x06,
+    0x0C,
+    0x0E,
+    0x0E,
+    0xFC,
+    0x0F,
+    0xF8,
+    0x0C,
+    0x00,
+    0x0C,
+    0x00,
+    0x0E,
+    0x00,
+    0x06,
+    0x8C,
+    0x07,
+    0xFC,
+    0x03,
+    0xF8,
+    0x00,
+    0x00,
+    0x00,
+
+    /* @352 'B' (12 pixels wide) */
+    0xFC,
+    0x00,
+    0xFC,
+    0x03,
+    0x8C,
+    0x07,
+    0x0C,
+    0x06,
+    0x0C,
+    0x06,
+    0x0C,
+    0x07,
+    0xFC,
+    0x03,
+    0xFC,
+    0x01,
+    0x8C,
+    0x07,
+    0x0C,
+    0x06,
+    0x0C,
+    0x0E,
+    0x0C,
+    0x0E,
+    0x0C,
+    0x07,
+    0xFC,
+    0x07,
+    0xFC,
+    0x01,
+    0x00,
+    0x00,
+
+    /* @384 'C' (12 pixels wide) */
+    0xF0,
+    0x01,
+    0xF8,
+    0x03,
+    0xBC,
+    0x07,
+    0x0C,
+    0x06,
+    0x0E,
+    0x0E,
+    0x0E,
+    0x00,
+    0x06,
+    0x00,
+    0x06,
+    0x00,
+    0x06,
+    0x00,
+    0x06,
+    0x00,
+    0x0E,
+    0x0E,
+    0x0E,
+    0x0E,
+    0x1C,
+    0x07,
+    0xF8,
+    0x03,
+    0xF0,
+    0x01,
+    0x00,
+    0x00,
+
+    /* @416 'D' (12 pixels wide) */
+    0x7E,
+    0x00,
+    0xFE,
+    0x01,
+    0xCE,
+    0x03,
+    0x0E,
+    0x07,
+    0x0E,
+    0x06,
+    0x0E,
+    0x0E,
+    0x0E,
+    0x0E,
+    0x0E,
+    0x0E,
+    0x0C,
+    0x0E,
+    0x0C,
+    0x0E,
+    0x0C,
+    0x06,
+    0x0C,
+    0x07,
+    0x8C,
+    0x07,
+    0xFC,
+    0x03,
+    0xFC,
+    0x00,
+    0x00,
+    0x00,
+
+    /* @448 'F' (12 pixels wide) */
+    0xFC,
+    0x0F,
+    0xFC,
+    0x0F,
+    0x0C,
+    0x00,
+    0x0C,
+    0x00,
+    0x0C,
+    0x00,
+    0x0C,
+    0x00,
+    0x0C,
+    0x00,
+    0xFC,
+    0x01,
+    0xFC,
+    0x01,
+    0x0C,
+    0x00,
+    0x0C,
+    0x00,
+    0x0C,
+    0x00,
+    0x0C,
+    0x00,
+    0x0C,
+    0x00,
+    0x0C,
+    0x00,
+    0x00,
+    0x00,
+
+    /* @480 'G' (12 pixels wide) */
+    0xF0,
+    0x01,
+    0xF8,
+    0x03,
+    0xBC,
+    0x07,
+    0x0C,
+    0x06,
+    0x0E,
+    0x0E,
+    0x06,
+    0x00,
+    0x06,
+    0x00,
+    0x86,
+    0x0F,
+    0x86,
+    0x0F,
+    0x06,
+    0x0C,
+    0x0E,
+    0x0E,
+    0x0E,
+    0x06,
+    0x1C,
+    0x07,
+    0xF8,
+    0x03,
+    0xF0,
+    0x01,
+    0x00,
+    0x00,
+
+    /* @512 'H' (12 pixels wide) */
+    0x0E,
+    0x06,
+    0x0E,
+    0x06,
+    0x0E,
+    0x06,
+    0x0E,
+    0x06,
+    0x0E,
+    0x06,
+    0x0E,
+    0x06,
+    0x0E,
+    0x06,
+    0xFE,
+    0x07,
+    0xFE,
+    0x07,
+    0x0E,
+    0x06,
+    0x0E,
+    0x06,
+    0x0E,
+    0x06,
+    0x0E,
+    0x06,
+    0x0E,
+    0x06,
+    0x0E,
+    0x06,
+    0x00,
+    0x00,
+
+    /* @544 'J' (12 pixels wide) */
+    0x00,
+    0x06,
+    0x00,
+    0x06,
+    0x00,
+    0x06,
+    0x00,
+    0x06,
+    0x00,
+    0x06,
+    0x00,
+    0x06,
+    0x00,
+    0x06,
+    0x00,
+    0x06,
+    0x00,
+    0x06,
+    0x00,
+    0x06,
+    0x04,
+    0x06,
+    0x07,
+    0x07,
+    0x8E,
+    0x07,
+    0xFC,
+    0x03,
+    0xF8,
+    0x01,
+    0x00,
+    0x00,
+
+    /* @576 'K' (12 pixels wide) */
+    0x0E,
+    0x0E,
+    0x0E,
+    0x07,
+    0x0E,
+    0x03,
+    0x8E,
+    0x01,
+    0xCE,
+    0x01,
+    0xEE,
+    0x00,
+    0x7E,
+    0x00,
+    0x3E,
+    0x00,
+    0x7E,
+    0x00,
+    0xEE,
+    0x00,
+    0xCE,
+    0x01,
+    0x8E,
+    0x03,
+    0x8E,
+    0x03,
+    0x0E,
+    0x07,
+    0x0E,
+    0x0E,
+    0x00,
+    0x00,
+
+    /* @608 'M' (12 pixels wide) */
+    0x0E,
+    0x0E,
+    0x0E,
+    0x0F,
+    0x1E,
+    0x0F,
+    0x9E,
+    0x0F,
+    0xB6,
+    0x0F,
+    0xB6,
+    0x0F,
+    0xF6,
+    0x0E,
+    0xE6,
+    0x0E,
+    0x66,
+    0x0E,
+    0x46,
+    0x0E,
+    0x26,
+    0x0E,
+    0x06,
+    0x0E,
+    0x06,
+    0x0E,
+    0x06,
+    0x0E,
+    0x06,
+    0x0E,
+    0x00,
+    0x00,
+
+    /* @640 'N' (12 pixels wide) */
+    0x0E,
+    0x06,
+    0x0E,
+    0x06,
+    0x1E,
+    0x06,
+    0x3E,
+    0x06,
+    0x3E,
+    0x06,
+    0x76,
+    0x06,
+    0x66,
+    0x06,
+    0xE6,
+    0x06,
+    0xC6,
+    0x06,
+    0xC6,
+    0x07,
+    0x86,
+    0x07,
+    0x86,
+    0x07,
+    0x06,
+    0x07,
+    0x06,
+    0x07,
+    0x06,
+    0x06,
+    0x00,
+    0x00,
+
+    /* @672 'P' (12 pixels wide) */
+    0xFC,
+    0x00,
+    0xFC,
+    0x03,
+    0x8C,
+    0x07,
+    0x0C,
+    0x0E,
+    0x0C,
+    0x0E,
+    0x0C,
+    0x0E,
+    0x0C,
+    0x06,
+    0xFC,
+    0x07,
+    0xFC,
+    0x03,
+    0x0C,
+    0x00,
+    0x0C,
+    0x00,
+    0x0C,
+    0x00,
+    0x0C,
+    0x00,
+    0x0C,
+    0x00,
+    0x0C,
+    0x00,
+    0x00,
+    0x00,
+
+    /* @704 'Q' (12 pixels wide) */
+    0xF0,
+    0x00,
+    0xF8,
+    0x03,
+    0x9C,
+    0x07,
+    0x0E,
+    0x07,
+    0x0E,
+    0x0E,
+    0x06,
+    0x0E,
+    0x06,
+    0x0E,
+    0x06,
+    0x0E,
+    0x06,
+    0x0E,
+    0x06,
+    0x0E,
+    0xEE,
+    0x0E,
+    0xCE,
+    0x07,
+    0x9C,
+    0x07,
+    0xFC,
+    0x07,
+    0xF0,
+    0x07,
+    0x00,
+    0x0A,
+
+    /* @736 'R' (12 pixels wide) */
+    0xFC,
+    0x00,
+    0xFC,
+    0x03,
+    0x8C,
+    0x07,
+    0x0C,
+    0x06,
+    0x0C,
+    0x0E,
+    0x0C,
+    0x0E,
+    0x0C,
+    0x07,
+    0xFC,
+    0x07,
+    0xFC,
+    0x01,
+    0x8C,
+    0x01,
+    0x8C,
+    0x03,
+    0x0C,
+    0x03,
+    0x0C,
+    0x07,
+    0x0C,
+    0x06,
+    0x0C,
+    0x0E,
+    0x00,
+    0x00,
+
+    /* @768 'T' (12 pixels wide) */
+    0xFF,
+    0x0F,
+    0xFF,
+    0x0F,
+    0xE0,
+    0x00,
+    0xE0,
+    0x00,
+    0xE0,
+    0x00,
+    0xE0,
+    0x00,
+    0xE0,
+    0x00,
+    0xE0,
+    0x00,
+    0xE0,
+    0x00,
+    0xE0,
+    0x00,
+    0xE0,
+    0x00,
+    0xE0,
+    0x00,
+    0xE0,
+    0x00,
+    0xE0,
+    0x00,
+    0xE0,
+    0x00,
+    0x00,
+    0x00,
+
+    /* @800 'V' (12 pixels wide) */
+    0x07,
+    0x0C,
+    0x06,
+    0x0C,
+    0x06,
+    0x0E,
+    0x0E,
+    0x06,
+    0x0C,
+    0x06,
+    0x0C,
+    0x07,
+    0x1C,
+    0x03,
+    0x1C,
+    0x03,
+    0x98,
+    0x03,
+    0x98,
+    0x03,
+    0xB8,
+    0x01,
+    0xB0,
+    0x01,
+    0xF0,
+    0x01,
+    0xF0,
+    0x00,
+    0xE0,
+    0x00,
+    0x00,
+    0x00,
+
+    /* @832 'W' (12 pixels wide) */
+    0x67,
+    0x0C,
+    0xE6,
+    0x0C,
+    0xE6,
+    0x0C,
+    0xE6,
+    0x0C,
+    0xE6,
+    0x0C,
+    0xF6,
+    0x0C,
+    0xB6,
+    0x0E,
+    0xB6,
+    0x07,
+    0xB6,
+    0x07,
+    0x96,
+    0x07,
+    0x9C,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x07,
+    0x1C,
+    0x07,
+    0x0C,
+    0x07,
+    0x00,
+    0x00,
+
+    /* @864 'X' (12 pixels wide) */
+    0x0E,
+    0x0E,
+    0x0E,
+    0x06,
+    0x1C,
+    0x07,
+    0x98,
+    0x03,
+    0xB8,
+    0x01,
+    0xF0,
+    0x01,
+    0xF0,
+    0x00,
+    0xE0,
+    0x00,
+    0xF0,
+    0x00,
+    0xF0,
+    0x01,
+    0xB8,
+    0x03,
+    0x9C,
+    0x03,
+    0x0C,
+    0x07,
+    0x0E,
+    0x06,
+    0x07,
+    0x0E,
+    0x00,
+    0x00,
+
+    /* @896 'Y' (12 pixels wide) */
+    0x07,
+    0x0C,
+    0x0E,
+    0x0E,
+    0x0E,
+    0x06,
+    0x1C,
+    0x07,
+    0x18,
+    0x03,
+    0xB8,
+    0x03,
+    0xF0,
+    0x01,
+    0xF0,
+    0x00,
+    0xE0,
+    0x00,
+    0xE0,
+    0x00,
+    0xE0,
+    0x00,
+    0xE0,
+    0x00,
+    0xE0,
+    0x00,
+    0xE0,
+    0x00,
+    0xE0,
+    0x00,
+    0x00,
+    0x00,
+};
+
+/* Character descriptors for Red Hat Mono 16pt */
+/* { [Char width in bits], [Offset into redHatMono_16ptCharBitmaps in bytes] } */
+const FONT_CHAR_INFO redHatMono_16ptDescriptors[] = {
+    {12, 0}, /* - */
+    {0, 0}, /* . */
+    {0, 0}, /* / */
+    {12, 32}, /* 0 */
+    {12, 64}, /* 1 */
+    {12, 96}, /* 2 */
+    {12, 128}, /* 3 */
+    {12, 160}, /* 4 */
+    {12, 192}, /* 5 */
+    {12, 224}, /* 6 */
+    {12, 256}, /* 7 */
+    {12, 288}, /* 8 */
+    {12, 320}, /* 9 */
+    {0, 0}, /* : */
+    {0, 0}, /* ; */
+    {0, 0}, /* < */
+    {0, 0}, /* = */
+    {0, 0}, /* > */
+    {0, 0}, /* ? */
+    {0, 0}, /* @ */
+    {0, 0}, /* A */
+    {12, 352}, /* B */
+    {12, 384}, /* C */
+    {12, 416}, /* D */
+    {0, 0}, /* E */
+    {12, 448}, /* F */
+    {12, 480}, /* G */
+    {12, 512}, /* H */
+    {0, 0}, /* I */
+    {12, 544}, /* J */
+    {12, 576}, /* K */
+    {0, 0}, /* L */
+    {12, 608}, /* M */
+    {12, 640}, /* N */
+    {0, 0}, /* O */
+    {12, 672}, /* P */
+    {12, 704}, /* Q */
+    {12, 736}, /* R */
+    {0, 0}, /* S */
+    {12, 768}, /* T */
+    {0, 0}, /* U */
+    {12, 800}, /* V */
+    {12, 832}, /* W */
+    {12, 864}, /* X */
+    {12, 896}, /* Y */
+};
+
+/* Font information for Red Hat Mono 16pt */
+const FONT_INFO redHatMono_16ptFontInfo = {
+    16, /*  Character height */
+    '-', /*  Start character */
+    'Y', /*  End character */
+    2, /*  Width, in pixels, of space character */
+    redHatMono_16ptDescriptors, /*  Character descriptor array */
+    redHatMono_16ptBitmaps, /*  Character bitmap array */
+};

+ 8 - 0
ui/fonts/redhat_mono/redhat_mono.h

@@ -0,0 +1,8 @@
+#pragma once
+
+/* GENERATED BY https://github.com/pavius/the-dot-factory */
+
+#include "../font_info.h"
+
+/* Font data for Redhat Mono 16pt */
+extern const FONT_INFO redHatMono_16ptFontInfo;

+ 1056 - 0
ui/fonts/zector/zector.c

@@ -0,0 +1,1056 @@
+#include "zector.h"
+
+/* GENERATED BY https://github.com/pavius/the-dot-factory */
+
+/* 
+**  Font data for Zector 18pt
+*/
+
+/* Character bitmaps for Zector 18pt */
+const uint8_t zector_18ptBitmaps[] = {
+    /* @0 '-' (9 pixels wide) */
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0xFF,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+
+    /* @32 '0' (9 pixels wide) */
+    0x3C,
+    0x00,
+    0xC2,
+    0x00,
+    0x83,
+    0x00,
+    0x85,
+    0x00,
+    0x85,
+    0x00,
+    0x89,
+    0x00,
+    0x89,
+    0x00,
+    0x91,
+    0x00,
+    0x91,
+    0x00,
+    0xA1,
+    0x00,
+    0xA1,
+    0x00,
+    0xC1,
+    0x00,
+    0xC1,
+    0x00,
+    0x81,
+    0x00,
+    0x42,
+    0x00,
+    0x3C,
+    0x00,
+
+    /* @64 '1' (9 pixels wide) */
+    0x10,
+    0x00,
+    0x18,
+    0x00,
+    0x18,
+    0x00,
+    0x14,
+    0x00,
+    0x14,
+    0x00,
+    0x12,
+    0x00,
+    0x12,
+    0x00,
+    0x11,
+    0x00,
+    0x10,
+    0x00,
+    0x10,
+    0x00,
+    0x10,
+    0x00,
+    0x10,
+    0x00,
+    0x10,
+    0x00,
+    0x10,
+    0x00,
+    0x10,
+    0x00,
+    0xFF,
+    0x00,
+
+    /* @96 '2' (9 pixels wide) */
+    0x3C,
+    0x00,
+    0x42,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x80,
+    0x00,
+    0x80,
+    0x00,
+    0x40,
+    0x00,
+    0x20,
+    0x00,
+    0x20,
+    0x00,
+    0x10,
+    0x00,
+    0x08,
+    0x00,
+    0x08,
+    0x00,
+    0x04,
+    0x00,
+    0x02,
+    0x00,
+    0x02,
+    0x00,
+    0xFF,
+    0x00,
+
+    /* @128 '3' (9 pixels wide) */
+    0xFF,
+    0x01,
+    0x80,
+    0x00,
+    0x80,
+    0x00,
+    0x40,
+    0x00,
+    0x40,
+    0x00,
+    0x20,
+    0x00,
+    0x20,
+    0x00,
+    0x10,
+    0x00,
+    0x60,
+    0x00,
+    0x80,
+    0x00,
+    0x80,
+    0x00,
+    0x00,
+    0x01,
+    0x01,
+    0x01,
+    0x81,
+    0x00,
+    0x42,
+    0x00,
+    0x3C,
+    0x00,
+
+    /* @160 '4' (9 pixels wide) */
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0xFF,
+    0x00,
+    0x80,
+    0x00,
+    0x80,
+    0x00,
+    0x80,
+    0x00,
+    0x80,
+    0x00,
+    0x80,
+    0x00,
+    0x80,
+    0x00,
+    0x80,
+    0x00,
+
+    /* @192 '5' (9 pixels wide) */
+    0xFF,
+    0x00,
+    0x01,
+    0x00,
+    0x01,
+    0x00,
+    0x01,
+    0x00,
+    0x01,
+    0x00,
+    0x01,
+    0x00,
+    0x01,
+    0x00,
+    0x01,
+    0x00,
+    0x3F,
+    0x00,
+    0x40,
+    0x00,
+    0x80,
+    0x00,
+    0x80,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0xC2,
+    0x00,
+    0x3C,
+    0x00,
+
+    /* @224 '6' (9 pixels wide) */
+    0x3C,
+    0x00,
+    0x42,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x01,
+    0x00,
+    0x01,
+    0x00,
+    0x01,
+    0x00,
+    0x01,
+    0x00,
+    0x3D,
+    0x00,
+    0x43,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0xC2,
+    0x00,
+    0x3C,
+    0x00,
+
+    /* @256 '7' (9 pixels wide) */
+    0xFF,
+    0x01,
+    0x80,
+    0x00,
+    0x80,
+    0x00,
+    0x40,
+    0x00,
+    0x40,
+    0x00,
+    0x20,
+    0x00,
+    0x20,
+    0x00,
+    0x10,
+    0x00,
+    0x10,
+    0x00,
+    0x08,
+    0x00,
+    0x08,
+    0x00,
+    0x04,
+    0x00,
+    0x04,
+    0x00,
+    0x02,
+    0x00,
+    0x02,
+    0x00,
+    0x01,
+    0x00,
+
+    /* @288 '8' (9 pixels wide) */
+    0x3C,
+    0x00,
+    0xC2,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x42,
+    0x00,
+    0x3C,
+    0x00,
+    0x42,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x42,
+    0x00,
+    0x3C,
+    0x00,
+
+    /* @320 '9' (9 pixels wide) */
+    0x3C,
+    0x00,
+    0x42,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0xC2,
+    0x00,
+    0xBC,
+    0x00,
+    0x80,
+    0x00,
+    0x80,
+    0x00,
+    0x80,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x42,
+    0x00,
+    0x3C,
+    0x00,
+
+    /* @352 'B' (9 pixels wide) */
+    0x3F,
+    0x00,
+    0xC1,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x41,
+    0x00,
+    0x3F,
+    0x00,
+    0x41,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x41,
+    0x00,
+    0x3F,
+    0x00,
+
+    /* @384 'C' (9 pixels wide) */
+    0x3C,
+    0x00,
+    0x42,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x01,
+    0x00,
+    0x01,
+    0x00,
+    0x01,
+    0x00,
+    0x01,
+    0x00,
+    0x01,
+    0x00,
+    0x01,
+    0x00,
+    0x01,
+    0x00,
+    0x01,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x42,
+    0x00,
+    0x3C,
+    0x00,
+
+    /* @416 'D' (9 pixels wide) */
+    0x3F,
+    0x00,
+    0x41,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x41,
+    0x00,
+    0x3F,
+    0x00,
+
+    /* @448 'F' (9 pixels wide) */
+    0xFF,
+    0x00,
+    0x01,
+    0x00,
+    0x01,
+    0x00,
+    0x01,
+    0x00,
+    0x01,
+    0x00,
+    0x01,
+    0x00,
+    0x01,
+    0x00,
+    0x01,
+    0x00,
+    0xFF,
+    0x00,
+    0x01,
+    0x00,
+    0x01,
+    0x00,
+    0x01,
+    0x00,
+    0x01,
+    0x00,
+    0x01,
+    0x00,
+    0x01,
+    0x00,
+    0x01,
+    0x00,
+
+    /* @480 'G' (9 pixels wide) */
+    0x3C,
+    0x00,
+    0xC2,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x01,
+    0x00,
+    0x01,
+    0x00,
+    0x01,
+    0x00,
+    0xF1,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x42,
+    0x00,
+    0x3C,
+    0x00,
+
+    /* @512 'H' (9 pixels wide) */
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0xFF,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+
+    /* @544 'J' (9 pixels wide) */
+    0x80,
+    0x00,
+    0x80,
+    0x00,
+    0x80,
+    0x00,
+    0x80,
+    0x00,
+    0x80,
+    0x00,
+    0x80,
+    0x00,
+    0x80,
+    0x00,
+    0x80,
+    0x00,
+    0x80,
+    0x00,
+    0x80,
+    0x00,
+    0x80,
+    0x00,
+    0x80,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x42,
+    0x00,
+    0x3C,
+    0x00,
+
+    /* @576 'K' (9 pixels wide) */
+    0x81,
+    0x00,
+    0xC1,
+    0x00,
+    0x61,
+    0x00,
+    0x21,
+    0x00,
+    0x11,
+    0x00,
+    0x09,
+    0x00,
+    0x05,
+    0x00,
+    0x03,
+    0x00,
+    0x01,
+    0x00,
+    0x03,
+    0x00,
+    0x05,
+    0x00,
+    0x09,
+    0x00,
+    0x11,
+    0x00,
+    0x21,
+    0x00,
+    0x41,
+    0x00,
+    0x81,
+    0x00,
+
+    /* @608 'M' (9 pixels wide) */
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x83,
+    0x00,
+    0xC3,
+    0x00,
+    0xC5,
+    0x00,
+    0xA5,
+    0x00,
+    0xA9,
+    0x00,
+    0x91,
+    0x00,
+    0x91,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+
+    /* @640 'N' (9 pixels wide) */
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x83,
+    0x00,
+    0x83,
+    0x00,
+    0x85,
+    0x00,
+    0x85,
+    0x00,
+    0x89,
+    0x00,
+    0x89,
+    0x00,
+    0x91,
+    0x00,
+    0xA1,
+    0x00,
+    0xA1,
+    0x00,
+    0xC1,
+    0x00,
+    0xC1,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+
+    /* @672 'P' (9 pixels wide) */
+    0x3F,
+    0x00,
+    0x41,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x41,
+    0x00,
+    0x3F,
+    0x00,
+    0x01,
+    0x00,
+    0x01,
+    0x00,
+    0x01,
+    0x00,
+    0x01,
+    0x00,
+    0x01,
+    0x00,
+    0x01,
+    0x00,
+    0x01,
+    0x00,
+
+    /* @704 'Q' (9 pixels wide) */
+    0x3C,
+    0x00,
+    0x42,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x91,
+    0x00,
+    0xA1,
+    0x00,
+    0xC2,
+    0x00,
+    0xBC,
+    0x00,
+
+    /* @736 'R' (9 pixels wide) */
+    0x3F,
+    0x00,
+    0x41,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x41,
+    0x00,
+    0x3F,
+    0x00,
+    0x03,
+    0x00,
+    0x05,
+    0x00,
+    0x09,
+    0x00,
+    0x11,
+    0x00,
+    0x21,
+    0x00,
+    0x41,
+    0x00,
+    0x81,
+    0x00,
+
+    /* @768 'T' (9 pixels wide) */
+    0xFF,
+    0x00,
+    0x10,
+    0x00,
+    0x10,
+    0x00,
+    0x10,
+    0x00,
+    0x10,
+    0x00,
+    0x10,
+    0x00,
+    0x10,
+    0x00,
+    0x10,
+    0x00,
+    0x10,
+    0x00,
+    0x10,
+    0x00,
+    0x10,
+    0x00,
+    0x10,
+    0x00,
+    0x10,
+    0x00,
+    0x10,
+    0x00,
+    0x10,
+    0x00,
+    0x10,
+    0x00,
+
+    /* @800 'V' (9 pixels wide) */
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x82,
+    0x00,
+    0x42,
+    0x00,
+    0x44,
+    0x00,
+    0x24,
+    0x00,
+    0x28,
+    0x00,
+    0x18,
+    0x00,
+    0x10,
+    0x00,
+
+    /* @832 'W' (9 pixels wide) */
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+    0x91,
+    0x00,
+    0x91,
+    0x00,
+    0x99,
+    0x00,
+    0xA9,
+    0x00,
+    0xA5,
+    0x00,
+    0xC5,
+    0x00,
+    0x83,
+    0x00,
+    0x81,
+    0x00,
+    0x81,
+    0x00,
+
+    /* @864 'X' (9 pixels wide) */
+    0x81,
+    0x00,
+    0x82,
+    0x00,
+    0x82,
+    0x00,
+    0x44,
+    0x00,
+    0x44,
+    0x00,
+    0x28,
+    0x00,
+    0x28,
+    0x00,
+    0x10,
+    0x00,
+    0x10,
+    0x00,
+    0x28,
+    0x00,
+    0x28,
+    0x00,
+    0x44,
+    0x00,
+    0x44,
+    0x00,
+    0x82,
+    0x00,
+    0x82,
+    0x00,
+    0x81,
+    0x00,
+
+    /* @896 'Y' (9 pixels wide) */
+    0x81,
+    0x00,
+    0x82,
+    0x00,
+    0x82,
+    0x00,
+    0x44,
+    0x00,
+    0x44,
+    0x00,
+    0x28,
+    0x00,
+    0x28,
+    0x00,
+    0x10,
+    0x00,
+    0x10,
+    0x00,
+    0x10,
+    0x00,
+    0x10,
+    0x00,
+    0x10,
+    0x00,
+    0x10,
+    0x00,
+    0x10,
+    0x00,
+    0x10,
+    0x00,
+    0x10,
+    0x00,
+};
+
+/* Character descriptors for Zector 18pt */
+/* { [Char width in bits], [Offset into zector_18ptCharBitmaps in bytes] } */
+const FONT_CHAR_INFO zector_18ptDescriptors[] = {
+    {9, 0}, /* - */
+    {0, 0}, /* . */
+    {0, 0}, /* / */
+    {9, 32}, /* 0 */
+    {9, 64}, /* 1 */
+    {9, 96}, /* 2 */
+    {9, 128}, /* 3 */
+    {9, 160}, /* 4 */
+    {9, 192}, /* 5 */
+    {9, 224}, /* 6 */
+    {9, 256}, /* 7 */
+    {9, 288}, /* 8 */
+    {9, 320}, /* 9 */
+    {0, 0}, /* : */
+    {0, 0}, /* ; */
+    {0, 0}, /* < */
+    {0, 0}, /* = */
+    {0, 0}, /* > */
+    {0, 0}, /* ? */
+    {0, 0}, /* @ */
+    {0, 0}, /* A */
+    {9, 352}, /* B */
+    {9, 384}, /* C */
+    {9, 416}, /* D */
+    {0, 0}, /* E */
+    {9, 448}, /* F */
+    {9, 480}, /* G */
+    {9, 512}, /* H */
+    {0, 0}, /* I */
+    {9, 544}, /* J */
+    {9, 576}, /* K */
+    {0, 0}, /* L */
+    {9, 608}, /* M */
+    {9, 640}, /* N */
+    {0, 0}, /* O */
+    {9, 672}, /* P */
+    {9, 704}, /* Q */
+    {9, 736}, /* R */
+    {0, 0}, /* S */
+    {9, 768}, /* T */
+    {0, 0}, /* U */
+    {9, 800}, /* V */
+    {9, 832}, /* W */
+    {9, 864}, /* X */
+    {9, 896}, /* Y */
+};
+
+/* Font information for Zector 18pt */
+const FONT_INFO zector_18ptFontInfo = {
+    16, /*  Character height */
+    '-', /*  Start character */
+    'Y', /*  End character */
+    2, /*  Width, in pixels, of space character */
+    zector_18ptDescriptors, /*  Character descriptor array */
+    zector_18ptBitmaps, /*  Character bitmap array */
+};

+ 8 - 0
ui/fonts/zector/zector.h

@@ -0,0 +1,8 @@
+#pragma once
+
+/* GENERATED BY https://github.com/pavius/the-dot-factory */
+
+#include "../font_info.h"
+
+/* Font information for Zector 18pt */
+extern const FONT_INFO zector_18ptFontInfo;

+ 1 - 1
ui/scenes/add_new_token/totp_input_text.c

@@ -29,7 +29,7 @@ void view_unlock_model(View* view) {
 
 static void commit_text_input_callback(void* context) {
     InputTextSceneState* text_input_state = (InputTextSceneState*)context;
-    if(text_input_state->callback != 0) {
+    if(text_input_state->callback != NULL) {
         InputTextSceneCallbackResult* result = malloc(sizeof(InputTextSceneCallbackResult));
         furi_check(result != NULL);
         result->user_input_length =

+ 75 - 61
ui/scenes/add_new_token/totp_scene_add_new_token.c

@@ -36,7 +36,7 @@ typedef struct {
     InputTextSceneContext* token_name_input_context;
     InputTextSceneContext* token_secret_input_context;
     InputTextSceneState* input_state;
-    uint32_t input_started_at;
+    bool text_input_mode;
     int16_t screen_y_offset;
     TokenHashAlgo algo;
     uint8_t digits_count_index;
@@ -56,7 +56,7 @@ static void on_token_name_user_comitted(InputTextSceneCallbackResult* result) {
     free(scene_state->token_name);
     scene_state->token_name = result->user_input;
     scene_state->token_name_length = result->user_input_length;
-    scene_state->input_started_at = 0;
+    scene_state->text_input_mode = false;
     free(result);
 }
 
@@ -65,7 +65,7 @@ static void on_token_secret_user_comitted(InputTextSceneCallbackResult* result)
     free(scene_state->token_secret);
     scene_state->token_secret = result->user_input;
     scene_state->token_secret_length = result->user_input_length;
-    scene_state->input_started_at = 0;
+    scene_state->text_input_mode = false;
     free(result);
 }
 
@@ -127,8 +127,8 @@ void totp_scene_add_new_token_activate(PluginState* plugin_state) {
 }
 
 void totp_scene_add_new_token_render(Canvas* const canvas, PluginState* plugin_state) {
-    SceneState* scene_state = (SceneState*)plugin_state->current_scene_state;
-    if(scene_state->input_started_at > 0) {
+    SceneState* scene_state = plugin_state->current_scene_state;
+    if(scene_state->text_input_mode) {
         totp_input_text_render(canvas, scene_state->input_state);
         return;
     }
@@ -200,63 +200,81 @@ bool totp_scene_add_new_token_handle_event(PluginEvent* const event, PluginState
         return true;
     }
 
-    SceneState* scene_state = (SceneState*)plugin_state->current_scene_state;
-    if(scene_state->input_started_at > 0 &&
-       furi_get_tick() - scene_state->input_started_at > 300) {
-        return totp_input_text_handle_event(event, scene_state->input_state);
-    }
+    SceneState* scene_state = plugin_state->current_scene_state;
 
     if(event->input.type == InputTypeLong && event->input.key == InputKeyBack) {
-        return false;
+        if(scene_state->text_input_mode) {
+            scene_state->text_input_mode = false;
+        } else {
+            return false;
+        }
     }
 
-    if(event->input.type != InputTypePress) {
-        return true;
+    if(scene_state->text_input_mode) {
+        if(event->input.type == InputTypeShort && event->input.key == InputKeyBack) {
+            PluginEvent long_back_cb_evt = {
+                .type = event->type, .input.key = InputKeyBack, .input.type = InputTypeLong};
+            return totp_input_text_handle_event(&long_back_cb_evt, scene_state->input_state);
+        }
+
+        return totp_input_text_handle_event(event, scene_state->input_state);
     }
 
-    switch(event->input.key) {
-    case InputKeyUp:
-        totp_roll_value_uint8_t(
-            &scene_state->selected_control,
-            -1,
-            TokenNameTextBox,
-            ConfirmButton,
-            RollOverflowBehaviorStop);
-        update_screen_y_offset(scene_state);
-        break;
-    case InputKeyDown:
-        totp_roll_value_uint8_t(
-            &scene_state->selected_control,
-            1,
-            TokenNameTextBox,
-            ConfirmButton,
-            RollOverflowBehaviorStop);
-        update_screen_y_offset(scene_state);
-        break;
-    case InputKeyRight:
-        if(scene_state->selected_control == TokenAlgoSelect) {
-            totp_roll_value_uint8_t(&scene_state->algo, 1, SHA1, STEAM, RollOverflowBehaviorRoll);
-        } else if(scene_state->selected_control == TokenLengthSelect) {
+    if(event->input.type == InputTypePress) {
+        switch(event->input.key) {
+        case InputKeyUp:
             totp_roll_value_uint8_t(
-                &scene_state->digits_count_index, 1, 0, 2, RollOverflowBehaviorRoll);
-        } else if(scene_state->selected_control == TokenDurationSelect) {
-            totp_roll_value_uint8_t(&scene_state->duration, 15, 15, 255, RollOverflowBehaviorStop);
-            update_duration_text(scene_state);
-        }
-        break;
-    case InputKeyLeft:
-        if(scene_state->selected_control == TokenAlgoSelect) {
-            totp_roll_value_uint8_t(&scene_state->algo, -1, SHA1, STEAM, RollOverflowBehaviorRoll);
-        } else if(scene_state->selected_control == TokenLengthSelect) {
-            totp_roll_value_uint8_t(
-                &scene_state->digits_count_index, -1, 0, 2, RollOverflowBehaviorRoll);
-        } else if(scene_state->selected_control == TokenDurationSelect) {
+                &scene_state->selected_control,
+                -1,
+                TokenNameTextBox,
+                ConfirmButton,
+                RollOverflowBehaviorStop);
+            update_screen_y_offset(scene_state);
+            break;
+        case InputKeyDown:
             totp_roll_value_uint8_t(
-                &scene_state->duration, -15, 15, 255, RollOverflowBehaviorStop);
-            update_duration_text(scene_state);
+                &scene_state->selected_control,
+                1,
+                TokenNameTextBox,
+                ConfirmButton,
+                RollOverflowBehaviorStop);
+            update_screen_y_offset(scene_state);
+            break;
+        case InputKeyRight:
+            if(scene_state->selected_control == TokenAlgoSelect) {
+                totp_roll_value_uint8_t(
+                    &scene_state->algo, 1, SHA1, STEAM, RollOverflowBehaviorRoll);
+            } else if(scene_state->selected_control == TokenLengthSelect) {
+                totp_roll_value_uint8_t(
+                    &scene_state->digits_count_index, 1, 0, 2, RollOverflowBehaviorRoll);
+            } else if(scene_state->selected_control == TokenDurationSelect) {
+                totp_roll_value_uint8_t(
+                    &scene_state->duration, 15, 15, 255, RollOverflowBehaviorStop);
+                update_duration_text(scene_state);
+            }
+            break;
+        case InputKeyLeft:
+            if(scene_state->selected_control == TokenAlgoSelect) {
+                totp_roll_value_uint8_t(
+                    &scene_state->algo, -1, SHA1, STEAM, RollOverflowBehaviorRoll);
+            } else if(scene_state->selected_control == TokenLengthSelect) {
+                totp_roll_value_uint8_t(
+                    &scene_state->digits_count_index, -1, 0, 2, RollOverflowBehaviorRoll);
+            } else if(scene_state->selected_control == TokenDurationSelect) {
+                totp_roll_value_uint8_t(
+                    &scene_state->duration, -15, 15, 255, RollOverflowBehaviorStop);
+                update_duration_text(scene_state);
+            }
+            break;
+        case InputKeyOk:
+            break;
+        case InputKeyBack:
+            totp_scene_director_activate_scene(plugin_state, TotpSceneGenerateToken);
+            break;
+        default:
+            break;
         }
-        break;
-    case InputKeyOk:
+    } else if(event->input.type == InputTypeRelease && event->input.key == InputKeyOk) {
         switch(scene_state->selected_control) {
         case TokenNameTextBox:
             if(scene_state->input_state != NULL) {
@@ -264,7 +282,8 @@ bool totp_scene_add_new_token_handle_event(PluginEvent* const event, PluginState
             }
             scene_state->input_state =
                 totp_input_text_activate(scene_state->token_name_input_context);
-            scene_state->input_started_at = furi_get_tick();
+
+            scene_state->text_input_mode = true;
             break;
         case TokenSecretTextBox:
             if(scene_state->input_state != NULL) {
@@ -272,7 +291,8 @@ bool totp_scene_add_new_token_handle_event(PluginEvent* const event, PluginState
             }
             scene_state->input_state =
                 totp_input_text_activate(scene_state->token_secret_input_context);
-            scene_state->input_started_at = furi_get_tick();
+
+            scene_state->text_input_mode = true;
             break;
         case TokenAlgoSelect:
             break;
@@ -313,12 +333,6 @@ bool totp_scene_add_new_token_handle_event(PluginEvent* const event, PluginState
         default:
             break;
         }
-        break;
-    case InputKeyBack:
-        totp_scene_director_activate_scene(plugin_state, TotpSceneGenerateToken);
-        break;
-    default:
-        break;
     }
 
     return true;

+ 101 - 100
ui/scenes/app_settings/totp_app_settings.c

@@ -60,17 +60,17 @@ void totp_scene_app_settings_activate(PluginState* plugin_state) {
 }
 
 static void two_digit_to_str(int8_t num, char* str) {
-    uint8_t index = 0;
+    char* s = str;
     if(num < 0) {
-        str[index++] = '-';
+        *(s++) = '-';
         num = -num;
     }
 
     uint8_t d1 = (num / 10) % 10;
     uint8_t d2 = num % 10;
-    str[index++] = CONVERT_DIGIT_TO_CHAR(d1);
-    str[index++] = CONVERT_DIGIT_TO_CHAR(d2);
-    str[index++] = '\0';
+    *(s++) = CONVERT_DIGIT_TO_CHAR(d1);
+    *(s++) = CONVERT_DIGIT_TO_CHAR(d2);
+    *(s++) = '\0';
 }
 
 void totp_scene_app_settings_render(Canvas* const canvas, const PluginState* plugin_state) {
@@ -183,116 +183,117 @@ bool totp_scene_app_settings_handle_event(
     }
 
     SceneState* scene_state = (SceneState*)plugin_state->current_scene_state;
-    if(event->input.type != InputTypePress && event->input.type != InputTypeRepeat) {
-        return true;
-    }
-
-    switch(event->input.key) {
-    case InputKeyUp:
-        totp_roll_value_uint8_t(
-            &scene_state->selected_control,
-            -1,
-            HoursInput,
-            ConfirmButton,
-            RollOverflowBehaviorStop);
-        if(scene_state->selected_control > Vibro) {
-            scene_state->y_offset = 128;
-        } else if(scene_state->selected_control > MinutesInput) {
-            scene_state->y_offset = 64;
-        } else {
-            scene_state->y_offset = 0;
-        }
-        break;
-    case InputKeyDown:
-        totp_roll_value_uint8_t(
-            &scene_state->selected_control, 1, HoursInput, ConfirmButton, RollOverflowBehaviorStop);
-        if(scene_state->selected_control > Vibro) {
-            scene_state->y_offset = 128;
-        } else if(scene_state->selected_control > MinutesInput) {
-            scene_state->y_offset = 64;
-        } else {
-            scene_state->y_offset = 0;
-        }
-        break;
-    case InputKeyRight:
-        if(scene_state->selected_control == HoursInput) {
-            totp_roll_value_int8_t(
-                &scene_state->tz_offset_hours, 1, -12, 12, RollOverflowBehaviorStop);
-        } else if(scene_state->selected_control == MinutesInput) {
+    if(event->input.type == InputTypePress || event->input.type == InputTypeRepeat) {
+        switch(event->input.key) {
+        case InputKeyUp:
             totp_roll_value_uint8_t(
-                &scene_state->tz_offset_minutes, 15, 0, 45, RollOverflowBehaviorRoll);
-        } else if(scene_state->selected_control == Sound) {
-            scene_state->notification_sound = !scene_state->notification_sound;
-        } else if(scene_state->selected_control == Vibro) {
-            scene_state->notification_vibro = !scene_state->notification_vibro;
-        } else if(scene_state->selected_control == BadUsb) {
-            scene_state->badusb_enabled = !scene_state->badusb_enabled;
-        }
+                &scene_state->selected_control,
+                -1,
+                HoursInput,
+                ConfirmButton,
+                RollOverflowBehaviorStop);
+            if(scene_state->selected_control > Vibro) {
+                scene_state->y_offset = 128;
+            } else if(scene_state->selected_control > MinutesInput) {
+                scene_state->y_offset = 64;
+            } else {
+                scene_state->y_offset = 0;
+            }
+            break;
+        case InputKeyDown:
+            totp_roll_value_uint8_t(
+                &scene_state->selected_control,
+                1,
+                HoursInput,
+                ConfirmButton,
+                RollOverflowBehaviorStop);
+            if(scene_state->selected_control > Vibro) {
+                scene_state->y_offset = 128;
+            } else if(scene_state->selected_control > MinutesInput) {
+                scene_state->y_offset = 64;
+            } else {
+                scene_state->y_offset = 0;
+            }
+            break;
+        case InputKeyRight:
+            if(scene_state->selected_control == HoursInput) {
+                totp_roll_value_int8_t(
+                    &scene_state->tz_offset_hours, 1, -12, 12, RollOverflowBehaviorStop);
+            } else if(scene_state->selected_control == MinutesInput) {
+                totp_roll_value_uint8_t(
+                    &scene_state->tz_offset_minutes, 15, 0, 45, RollOverflowBehaviorRoll);
+            } else if(scene_state->selected_control == Sound) {
+                scene_state->notification_sound = !scene_state->notification_sound;
+            } else if(scene_state->selected_control == Vibro) {
+                scene_state->notification_vibro = !scene_state->notification_vibro;
+            } else if(scene_state->selected_control == BadUsb) {
+                scene_state->badusb_enabled = !scene_state->badusb_enabled;
+            }
 #ifdef TOTP_BADBT_TYPE_ENABLED
-        else if(scene_state->selected_control == BadBt) {
-            scene_state->badbt_enabled = !scene_state->badbt_enabled;
-        }
+            else if(scene_state->selected_control == BadBt) {
+                scene_state->badbt_enabled = !scene_state->badbt_enabled;
+            }
 #endif
-        break;
-    case InputKeyLeft:
-        if(scene_state->selected_control == HoursInput) {
-            totp_roll_value_int8_t(
-                &scene_state->tz_offset_hours, -1, -12, 12, RollOverflowBehaviorStop);
-        } else if(scene_state->selected_control == MinutesInput) {
-            totp_roll_value_uint8_t(
-                &scene_state->tz_offset_minutes, -15, 0, 45, RollOverflowBehaviorRoll);
-        } else if(scene_state->selected_control == Sound) {
-            scene_state->notification_sound = !scene_state->notification_sound;
-        } else if(scene_state->selected_control == Vibro) {
-            scene_state->notification_vibro = !scene_state->notification_vibro;
-        } else if(scene_state->selected_control == BadUsb) {
-            scene_state->badusb_enabled = !scene_state->badusb_enabled;
-        }
+            break;
+        case InputKeyLeft:
+            if(scene_state->selected_control == HoursInput) {
+                totp_roll_value_int8_t(
+                    &scene_state->tz_offset_hours, -1, -12, 12, RollOverflowBehaviorStop);
+            } else if(scene_state->selected_control == MinutesInput) {
+                totp_roll_value_uint8_t(
+                    &scene_state->tz_offset_minutes, -15, 0, 45, RollOverflowBehaviorRoll);
+            } else if(scene_state->selected_control == Sound) {
+                scene_state->notification_sound = !scene_state->notification_sound;
+            } else if(scene_state->selected_control == Vibro) {
+                scene_state->notification_vibro = !scene_state->notification_vibro;
+            } else if(scene_state->selected_control == BadUsb) {
+                scene_state->badusb_enabled = !scene_state->badusb_enabled;
+            }
 #ifdef TOTP_BADBT_TYPE_ENABLED
-        else if(scene_state->selected_control == BadBt) {
-            scene_state->badbt_enabled = !scene_state->badbt_enabled;
-        }
+            else if(scene_state->selected_control == BadBt) {
+                scene_state->badbt_enabled = !scene_state->badbt_enabled;
+            }
 #endif
-        break;
-    case InputKeyOk:
-        if(scene_state->selected_control == ConfirmButton) {
-            plugin_state->timezone_offset = (float)scene_state->tz_offset_hours +
-                                            (float)scene_state->tz_offset_minutes / 60.0f;
+            break;
+        case InputKeyOk:
+            break;
+        case InputKeyBack: {
+            totp_scene_director_activate_scene(plugin_state, TotpSceneTokenMenu);
+            break;
+        }
+        default:
+            break;
+        }
+    } else if(
+        event->input.type == InputTypeRelease && event->input.key == InputKeyOk &&
+        scene_state->selected_control == ConfirmButton) {
+        plugin_state->timezone_offset =
+            (float)scene_state->tz_offset_hours + (float)scene_state->tz_offset_minutes / 60.0f;
 
-            plugin_state->notification_method =
-                (scene_state->notification_sound ? NotificationMethodSound :
-                                                   NotificationMethodNone) |
-                (scene_state->notification_vibro ? NotificationMethodVibro :
-                                                   NotificationMethodNone);
+        plugin_state->notification_method =
+            (scene_state->notification_sound ? NotificationMethodSound : NotificationMethodNone) |
+            (scene_state->notification_vibro ? NotificationMethodVibro : NotificationMethodNone);
 
-            plugin_state->automation_method =
-                scene_state->badusb_enabled ? AutomationMethodBadUsb : AutomationMethodNone;
+        plugin_state->automation_method = scene_state->badusb_enabled ? AutomationMethodBadUsb :
+                                                                        AutomationMethodNone;
 #ifdef TOTP_BADBT_TYPE_ENABLED
-            plugin_state->automation_method |= scene_state->badbt_enabled ? AutomationMethodBadBt :
-                                                                            AutomationMethodNone;
+        plugin_state->automation_method |= scene_state->badbt_enabled ? AutomationMethodBadBt :
+                                                                        AutomationMethodNone;
 #endif
 
-            if(!totp_config_file_update_user_settings(plugin_state)) {
-                totp_dialogs_config_updating_error(plugin_state);
-                return false;
-            }
+        if(!totp_config_file_update_user_settings(plugin_state)) {
+            totp_dialogs_config_updating_error(plugin_state);
+            return false;
+        }
 
 #ifdef TOTP_BADBT_TYPE_ENABLED
-            if(!scene_state->badbt_enabled && plugin_state->bt_type_code_worker_context != NULL) {
-                totp_bt_type_code_worker_free(plugin_state->bt_type_code_worker_context);
-                plugin_state->bt_type_code_worker_context = NULL;
-            }
+        if(!scene_state->badbt_enabled && plugin_state->bt_type_code_worker_context != NULL) {
+            totp_bt_type_code_worker_free(plugin_state->bt_type_code_worker_context);
+            plugin_state->bt_type_code_worker_context = NULL;
+        }
 #endif
 
-            totp_scene_director_activate_scene(plugin_state, TotpSceneTokenMenu);
-        }
-        break;
-    case InputKeyBack: {
         totp_scene_director_activate_scene(plugin_state, TotpSceneTokenMenu);
-        break;
-    }
-    default:
-        break;
     }
 
     return true;

+ 38 - 41
ui/scenes/authenticate/totp_scene_authenticate.c

@@ -83,38 +83,45 @@ bool totp_scene_authenticate_handle_event(
         return false;
     }
 
-    if(event->input.type != InputTypePress) {
-        return true;
-    }
-
-    SceneState* scene_state = (SceneState*)plugin_state->current_scene_state;
-
-    switch(event->input.key) {
-    case InputKeyUp:
-        if(scene_state->code_length < MAX_CODE_LENGTH) {
-            scene_state->code_input[scene_state->code_length] = PinCodeArrowUp;
-            scene_state->code_length++;
-        }
-        break;
-    case InputKeyDown:
-        if(scene_state->code_length < MAX_CODE_LENGTH) {
-            scene_state->code_input[scene_state->code_length] = PinCodeArrowDown;
-            scene_state->code_length++;
+    SceneState* scene_state = plugin_state->current_scene_state;
+    if(event->input.type == InputTypePress) {
+        switch(event->input.key) {
+        case InputKeyUp:
+            if(scene_state->code_length < MAX_CODE_LENGTH) {
+                scene_state->code_input[scene_state->code_length] = PinCodeArrowUp;
+                scene_state->code_length++;
+            }
+            break;
+        case InputKeyDown:
+            if(scene_state->code_length < MAX_CODE_LENGTH) {
+                scene_state->code_input[scene_state->code_length] = PinCodeArrowDown;
+                scene_state->code_length++;
+            }
+            break;
+        case InputKeyRight:
+            if(scene_state->code_length < MAX_CODE_LENGTH) {
+                scene_state->code_input[scene_state->code_length] = PinCodeArrowRight;
+                scene_state->code_length++;
+            }
+            break;
+        case InputKeyLeft:
+            if(scene_state->code_length < MAX_CODE_LENGTH) {
+                scene_state->code_input[scene_state->code_length] = PinCodeArrowLeft;
+                scene_state->code_length++;
+            }
+            break;
+        case InputKeyOk:
+            break;
+        case InputKeyBack:
+            if(scene_state->code_length > 0) {
+                scene_state->code_input[scene_state->code_length - 1] = 0;
+                scene_state->code_length--;
+            }
+            break;
+        default:
+            break;
         }
-        break;
-    case InputKeyRight:
-        if(scene_state->code_length < MAX_CODE_LENGTH) {
-            scene_state->code_input[scene_state->code_length] = PinCodeArrowRight;
-            scene_state->code_length++;
-        }
-        break;
-    case InputKeyLeft:
-        if(scene_state->code_length < MAX_CODE_LENGTH) {
-            scene_state->code_input[scene_state->code_length] = PinCodeArrowLeft;
-            scene_state->code_length++;
-        }
-        break;
-    case InputKeyOk: {
+    } else if(event->input.type == InputTypeRelease && event->input.key == InputKeyOk) {
         CryptoSeedIVResult seed_result = totp_crypto_seed_iv(
             plugin_state, &scene_state->code_input[0], scene_state->code_length);
 
@@ -145,16 +152,6 @@ bool totp_scene_authenticate_handle_event(
             dialog_message_show(plugin_state->dialogs_app, message);
             dialog_message_free(message);
         }
-        break;
-    }
-    case InputKeyBack:
-        if(scene_state->code_length > 0) {
-            scene_state->code_input[scene_state->code_length - 1] = 0;
-            scene_state->code_length--;
-        }
-        break;
-    default:
-        break;
     }
 
     return true;

+ 54 - 57
ui/scenes/generate_token/totp_scene_generate_token.c

@@ -16,7 +16,7 @@
 #ifdef TOTP_BADBT_TYPE_ENABLED
 #include "../../../workers/bt_type_code/bt_type_code.h"
 #endif
-#include "../../fonts/mode-nine/mode-nine.h"
+#include "../../fonts/active_font.h"
 
 #define PROGRESS_BAR_MARGIN (3)
 #define PROGRESS_BAR_HEIGHT (4)
@@ -142,19 +142,19 @@ static void draw_totp_code(Canvas* const canvas, const PluginState* const plugin
         totp_config_get_token_iterator_context(plugin_state);
     uint8_t code_length = totp_token_info_iterator_get_current_token(iterator_context)->digits;
     uint8_t offset_x = scene_state->ui_precalculated_dimensions.code_offset_x;
-    uint8_t char_width = modeNine_15ptFontInfo.charInfo[0].width;
+    uint8_t char_width = TOTP_CODE_FONT_INFO.charInfo[0].width;
     uint8_t offset_x_inc = scene_state->ui_precalculated_dimensions.code_offset_x_inc;
     for(uint8_t i = 0; i < code_length; i++) {
         char ch = scene_state->last_code[i];
-        if(ch >= modeNine_15ptFontInfo.startChar && ch <= modeNine_15ptFontInfo.endChar) {
-            uint8_t char_index = ch - modeNine_15ptFontInfo.startChar;
+        if(ch >= TOTP_CODE_FONT_INFO.startChar && ch <= TOTP_CODE_FONT_INFO.endChar) {
+            uint8_t char_index = ch - TOTP_CODE_FONT_INFO.startChar;
             canvas_draw_xbm(
                 canvas,
                 offset_x,
                 scene_state->ui_precalculated_dimensions.code_offset_y,
                 char_width,
-                modeNine_15ptFontInfo.height,
-                &modeNine_15ptFontInfo.data[modeNine_15ptFontInfo.charInfo[char_index].offset]);
+                TOTP_CODE_FONT_INFO.height,
+                &TOTP_CODE_FONT_INFO.data[TOTP_CODE_FONT_INFO.charInfo[char_index].offset]);
         }
 
         offset_x += offset_x_inc;
@@ -172,15 +172,15 @@ static void on_new_token_code_generated(bool time_left, void* context) {
     SceneState* scene_state = plugin_state->current_scene_state;
     const TokenInfo* current_token = totp_token_info_iterator_get_current_token(iterator_context);
 
-    uint8_t char_width = modeNine_15ptFontInfo.charInfo[0].width;
+    uint8_t char_width = TOTP_CODE_FONT_INFO.charInfo[0].width;
     scene_state->ui_precalculated_dimensions.code_total_length =
-        current_token->digits * (char_width + modeNine_15ptFontInfo.spacePixels);
+        current_token->digits * (char_width + TOTP_CODE_FONT_INFO.spacePixels);
     scene_state->ui_precalculated_dimensions.code_offset_x =
         (SCREEN_WIDTH - scene_state->ui_precalculated_dimensions.code_total_length) >> 1;
     scene_state->ui_precalculated_dimensions.code_offset_x_inc =
-        char_width + modeNine_15ptFontInfo.spacePixels;
+        char_width + TOTP_CODE_FONT_INFO.spacePixels;
     scene_state->ui_precalculated_dimensions.code_offset_y =
-        SCREEN_HEIGHT_CENTER - (modeNine_15ptFontInfo.height >> 1);
+        SCREEN_HEIGHT_CENTER - (TOTP_CODE_FONT_INFO.height >> 1);
 
     if(time_left) {
         notification_message(
@@ -381,54 +381,51 @@ bool totp_scene_generate_token_handle_event(
             return true;
         }
 #endif
-    }
-
-    if(event->input.type != InputTypePress && event->input.type != InputTypeRepeat) {
-        return true;
-    }
-
-    switch(event->input.key) {
-    case InputKeyUp:
-        break;
-    case InputKeyDown:
-        break;
-    case InputKeyRight: {
-        const TokenInfoIteratorContext* iterator_context =
-            totp_config_get_token_iterator_context(plugin_state);
-        size_t current_token_index =
-            totp_token_info_iterator_get_current_token_index(iterator_context);
-        totp_roll_value_size_t(
-            &current_token_index,
-            1,
-            0,
-            totp_token_info_iterator_get_total_count(iterator_context) - 1,
-            RollOverflowBehaviorRoll);
-
-        update_totp_params(plugin_state, current_token_index);
-        break;
-    }
-    case InputKeyLeft: {
-        const TokenInfoIteratorContext* iterator_context =
-            totp_config_get_token_iterator_context(plugin_state);
-        size_t current_token_index =
-            totp_token_info_iterator_get_current_token_index(iterator_context);
-        totp_roll_value_size_t(
-            &current_token_index,
-            -1,
-            0,
-            totp_token_info_iterator_get_total_count(iterator_context) - 1,
-            RollOverflowBehaviorRoll);
-
-        update_totp_params(plugin_state, current_token_index);
-        break;
-    }
-    case InputKeyOk:
+    } else if(event->input.type == InputTypePress || event->input.type == InputTypeRepeat) {
+        switch(event->input.key) {
+        case InputKeyUp:
+            break;
+        case InputKeyDown:
+            break;
+        case InputKeyRight: {
+            const TokenInfoIteratorContext* iterator_context =
+                totp_config_get_token_iterator_context(plugin_state);
+            size_t current_token_index =
+                totp_token_info_iterator_get_current_token_index(iterator_context);
+            totp_roll_value_size_t(
+                &current_token_index,
+                1,
+                0,
+                totp_token_info_iterator_get_total_count(iterator_context) - 1,
+                RollOverflowBehaviorRoll);
+
+            update_totp_params(plugin_state, current_token_index);
+            break;
+        }
+        case InputKeyLeft: {
+            const TokenInfoIteratorContext* iterator_context =
+                totp_config_get_token_iterator_context(plugin_state);
+            size_t current_token_index =
+                totp_token_info_iterator_get_current_token_index(iterator_context);
+            totp_roll_value_size_t(
+                &current_token_index,
+                -1,
+                0,
+                totp_token_info_iterator_get_total_count(iterator_context) - 1,
+                RollOverflowBehaviorRoll);
+
+            update_totp_params(plugin_state, current_token_index);
+            break;
+        }
+        case InputKeyOk:
+            break;
+        case InputKeyBack:
+            break;
+        default:
+            break;
+        }
+    } else if(event->input.type == InputTypeRelease && event->input.key == InputKeyOk) {
         totp_scene_director_activate_scene(plugin_state, TotpSceneTokenMenu);
-        break;
-    case InputKeyBack:
-        break;
-    default:
-        break;
     }
 
     return true;

+ 44 - 37
ui/scenes/token_menu/totp_scene_token_menu.c

@@ -82,38 +82,52 @@ bool totp_scene_token_menu_handle_event(const PluginEvent* const event, PluginSt
     }
 
     SceneState* scene_state = (SceneState*)plugin_state->current_scene_state;
-    if(event->input.type != InputTypePress) {
-        return true;
-    }
-
-    switch(event->input.key) {
-    case InputKeyUp: {
-        const TokenInfoIteratorContext* iterator_context =
-            totp_config_get_token_iterator_context(plugin_state);
-        totp_roll_value_uint8_t(
-            &scene_state->selected_control, -1, AddNewToken, AppSettings, RollOverflowBehaviorRoll);
-        if(scene_state->selected_control == DeleteToken &&
-           totp_token_info_iterator_get_total_count(iterator_context) == 0) {
-            scene_state->selected_control--;
+    if(event->input.type == InputTypePress) {
+        switch(event->input.key) {
+        case InputKeyUp: {
+            const TokenInfoIteratorContext* iterator_context =
+                totp_config_get_token_iterator_context(plugin_state);
+            totp_roll_value_uint8_t(
+                &scene_state->selected_control,
+                -1,
+                AddNewToken,
+                AppSettings,
+                RollOverflowBehaviorRoll);
+            if(scene_state->selected_control == DeleteToken &&
+               totp_token_info_iterator_get_total_count(iterator_context) == 0) {
+                scene_state->selected_control--;
+            }
+            break;
         }
-        break;
-    }
-    case InputKeyDown: {
-        const TokenInfoIteratorContext* iterator_context =
-            totp_config_get_token_iterator_context(plugin_state);
-        totp_roll_value_uint8_t(
-            &scene_state->selected_control, 1, AddNewToken, AppSettings, RollOverflowBehaviorRoll);
-        if(scene_state->selected_control == DeleteToken &&
-           totp_token_info_iterator_get_total_count(iterator_context) == 0) {
-            scene_state->selected_control++;
+        case InputKeyDown: {
+            const TokenInfoIteratorContext* iterator_context =
+                totp_config_get_token_iterator_context(plugin_state);
+            totp_roll_value_uint8_t(
+                &scene_state->selected_control,
+                1,
+                AddNewToken,
+                AppSettings,
+                RollOverflowBehaviorRoll);
+            if(scene_state->selected_control == DeleteToken &&
+               totp_token_info_iterator_get_total_count(iterator_context) == 0) {
+                scene_state->selected_control++;
+            }
+            break;
         }
-        break;
-    }
-    case InputKeyRight:
-        break;
-    case InputKeyLeft:
-        break;
-    case InputKeyOk:
+        case InputKeyRight:
+            break;
+        case InputKeyLeft:
+            break;
+        case InputKeyOk:
+            break;
+        case InputKeyBack: {
+            totp_scene_director_activate_scene(plugin_state, TotpSceneGenerateToken);
+            break;
+        }
+        default:
+            break;
+        }
+    } else if(event->input.type == InputTypeRelease && event->input.key == InputKeyOk) {
         switch(scene_state->selected_control) {
         case AddNewToken: {
             totp_scene_director_activate_scene(plugin_state, TotpSceneAddNewToken);
@@ -153,13 +167,6 @@ bool totp_scene_token_menu_handle_event(const PluginEvent* const event, PluginSt
         default:
             break;
         }
-        break;
-    case InputKeyBack: {
-        totp_scene_director_activate_scene(plugin_state, TotpSceneGenerateToken);
-        break;
-    }
-    default:
-        break;
     }
 
     return true;

+ 9 - 6
workers/generate_totp_code/generate_totp_code.c

@@ -25,18 +25,21 @@ static const char* STEAM_ALGO_ALPHABET = "23456789BCDFGHJKMNPQRTVWXY";
 
 static void
     int_token_to_str(uint64_t i_token_code, char* str, TokenDigitsCount len, TokenHashAlgo algo) {
-    str[len] = '\0';
+    char* last_char = str + len;
+    *last_char = '\0';
     if(i_token_code == OTP_ERROR) {
-        memset(&str[0], '-', len);
+        memset(str, '-', len);
     } else {
         if(algo == STEAM) {
-            for(uint8_t i = 0; i < len; i++) {
-                str[i] = STEAM_ALGO_ALPHABET[i_token_code % 26];
+            char* s = str;
+            for(uint8_t i = 0; i < len; i++, s++) {
+                *s = STEAM_ALGO_ALPHABET[i_token_code % 26];
                 i_token_code = i_token_code / 26;
             }
         } else {
-            for(int8_t i = len - 1; i >= 0; i--) {
-                str[i] = CONVERT_DIGIT_TO_CHAR(i_token_code % 10);
+            char* s = --last_char;
+            for(int8_t i = len - 1; i >= 0; i--, s--) {
+                *s = CONVERT_DIGIT_TO_CHAR(i_token_code % 10);
                 i_token_code = i_token_code / 10;
             }
         }

+ 4 - 3
workers/type-code-common.c

@@ -47,11 +47,12 @@ void totp_type_code_worker_execute_automation(
     TokenAutomationFeature features) {
     furi_delay_ms(500);
     uint8_t i = 0;
+    char cb_char;
 
-    while(i < code_buffer_size && code_buffer[i] != 0) {
-        uint8_t char_index = CONVERT_CHAR_TO_DIGIT(code_buffer[i]);
+    while(i < code_buffer_size && (cb_char = code_buffer[i]) != 0) {
+        uint8_t char_index = CONVERT_CHAR_TO_DIGIT(cb_char);
         if(char_index > 9) {
-            char_index = code_buffer[i] - 0x41 + 10;
+            char_index = cb_char - 0x41 + 10;
         }
 
         if(char_index > 35) break;