From 08740b3ca708e1919cf97b145f6bffb685d2a437 Mon Sep 17 00:00:00 2001 From: Silentium <12755340+silentium83@users.noreply.github.com> Date: Fri, 10 May 2019 20:29:01 +0200 Subject: [PATCH] tidy up code, variable width font, support more characters --- src/font.h | 523 ++++++++++++++++++++++++++------------------------- src/main.cpp | 98 +++++++--- 2 files changed, 334 insertions(+), 287 deletions(-) diff --git a/src/font.h b/src/font.h index 7674be6..42f1aa8 100644 --- a/src/font.h +++ b/src/font.h @@ -1,263 +1,272 @@ #ifndef FONT_H #define FONT_H -const uint8_t font_5x7_col[256][5] PROGMEM = { - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x7F, 0x00, 0x00, 0x00, 0x00 }, // (1 col left) - { 0x7F, 0x7F, 0x00, 0x00, 0x00 }, // (2 col left) - { 0x7F, 0x7F, 0x7F, 0x00, 0x00 }, // (3 col left) - { 0x7F, 0x7F, 0x7F, 0x7F, 0x00 }, // (4 col left) - { 0x7F, 0x7F, 0x7F, 0x7F, 0x7F }, // (solid fill) - { 0x00, 0x7F, 0x7F, 0x7F, 0x7F }, // (4 col right) - { 0x00, 0x00, 0x7F, 0x7F, 0x7F }, // (3 col right) - { 0x00, 0x00, 0x00, 0x7F, 0x7F }, // (2 col right) - { 0x00, 0x00, 0x00, 0x00, 0x7F }, // (1 col right) - { 0x03, 0x07, 0x7E, 0x20, 0x1C }, // (music note) - { 0x60, 0x66, 0x09, 0x09, 0x09 }, // (deg c) - { 0x60, 0x6F, 0x0A, 0x0A, 0x08 }, // (deg f) - { 0x10, 0x18, 0x1C, 0x18, 0x10 }, // (triangle down) - { 0x00, 0x3E, 0x1C, 0x08, 0x00 }, // (triangle right) - { 0x00, 0x08, 0x1C, 0x3E, 0x00 }, // (triangle left) - { 0x04, 0x0C, 0x1C, 0x0C, 0x04 }, // (triangle up) - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // (space) - { 0x00, 0x7D, 0x00, 0x00, 0x00 }, // (!) - { 0x00, 0x70, 0x00, 0x70, 0x00 }, // (") - { 0x14, 0x7F, 0x14, 0x7F, 0x14 }, // (#) - { 0x12, 0x2A, 0x7F, 0x2A, 0x24 }, // ($) - { 0x62, 0x64, 0x08, 0x13, 0x23 }, // (%) - { 0x36, 0x49, 0x35, 0x02, 0x05 }, // (&) - { 0x00, 0x50, 0x60, 0x00, 0x00 }, // (') - { 0x00, 0x1C, 0x22, 0x41, 0x00 }, // (() - { 0x00, 0x41, 0x22, 0x1C, 0x00 }, // ()) - { 0x44, 0x28, 0x7C, 0x28, 0x44 }, // (*) - { 0x08, 0x08, 0x7F, 0x08, 0x08 }, // (+) - { 0x05, 0x06, 0x00, 0x00, 0x00 }, // (,) - { 0x08, 0x08, 0x08, 0x00, 0x00 }, // (-) - { 0x00, 0x03, 0x03, 0x00, 0x00 }, // (.) - { 0x02, 0x04, 0x08, 0x10, 0x20 }, // (/) - { 0x3E, 0x45, 0x49, 0x51, 0x3E }, // (0) - { 0x00, 0x21, 0x7F, 0x01, 0x00 }, // (1) - { 0x21, 0x43, 0x45, 0x49, 0x31 }, // (2) - { 0x42, 0x41, 0x51, 0x69, 0x46 }, // (3) - { 0x0C, 0x14, 0x24, 0x7F, 0x04 }, // (4) - { 0x72, 0x51, 0x51, 0x51, 0x4E }, // (5) - { 0x1E, 0x29, 0x49, 0x49, 0x06 }, // (6) - { 0x43, 0x44, 0x48, 0x50, 0x60 }, // (7) - { 0x36, 0x49, 0x49, 0x49, 0x36 }, // (8) - { 0x30, 0x49, 0x49, 0x4A, 0x3C }, // (9) - { 0x00, 0x36, 0x36, 0x00, 0x00 }, // (:) - { 0x00, 0x35, 0x36, 0x00, 0x00 }, // (;) - { 0x08, 0x14, 0x22, 0x41, 0x00 }, // (<) - { 0x14, 0x14, 0x14, 0x14, 0x14 }, // (=) - { 0x41, 0x22, 0x14, 0x08, 0x00 }, // (>) - { 0x20, 0x40, 0x45, 0x48, 0x30 }, // (?) - { 0x3E, 0x41, 0x4D, 0x51, 0x36 }, // (@) - { 0x3F, 0x48, 0x48, 0x48, 0x3F }, // (A) - { 0x7F, 0x49, 0x49, 0x49, 0x36 }, // (B) - { 0x3E, 0x41, 0x41, 0x41, 0x22 }, // (C) - { 0x7F, 0x41, 0x41, 0x41, 0x3E }, // (D) - { 0x7F, 0x49, 0x49, 0x49, 0x41 }, // (E) - { 0x7F, 0x48, 0x48, 0x48, 0x40 }, // (F) - { 0x3E, 0x41, 0x49, 0x49, 0x2E }, // (G) - { 0x7F, 0x08, 0x08, 0x08, 0x7F }, // (H) - { 0x00, 0x41, 0x7F, 0x41, 0x00 }, // (I) - { 0x02, 0x01, 0x41, 0x7E, 0x40 }, // (J) - { 0x7F, 0x08, 0x14, 0x22, 0x41 }, // (K) - { 0x7F, 0x01, 0x01, 0x01, 0x01 }, // (L) - { 0x7F, 0x20, 0x18, 0x20, 0x7F }, // (M) - { 0x7F, 0x10, 0x08, 0x04, 0x7F }, // (N) - { 0x3E, 0x41, 0x41, 0x41, 0x3E }, // (O) - { 0x7F, 0x48, 0x48, 0x48, 0x30 }, // (P) - { 0x3E, 0x41, 0x45, 0x42, 0x3D }, // (Q) - { 0x7F, 0x48, 0x4C, 0x4A, 0x31 }, // (R) - { 0x31, 0x49, 0x49, 0x49, 0x46 }, // (S) - { 0x40, 0x40, 0x7F, 0x40, 0x40 }, // (T) - { 0x7E, 0x01, 0x01, 0x01, 0x7E }, // (U) - { 0x7C, 0x02, 0x01, 0x02, 0x7C }, // (V) - { 0x7E, 0x01, 0x06, 0x01, 0x7E }, // (W) - { 0x63, 0x14, 0x08, 0x14, 0x63 }, // (X) - { 0x70, 0x08, 0x07, 0x08, 0x70 }, // (Y) - { 0x43, 0x45, 0x49, 0x51, 0x61 }, // (Z) - { 0x00, 0x7F, 0x41, 0x41, 0x00 }, // ([) - { 0x20, 0x10, 0x08, 0x04, 0x02 }, // (\) - { 0x00, 0x41, 0x41, 0x7F, 0x00 }, // (]) - { 0x10, 0x20, 0x40, 0x20, 0x10 }, // (^) - { 0x01, 0x01, 0x01, 0x01, 0x01 }, // (_) - { 0x00, 0x40, 0x20, 0x10, 0x00 }, // (`) - { 0x02, 0x15, 0x15, 0x15, 0x0F }, // (a) - { 0x7F, 0x09, 0x11, 0x11, 0x0E }, // (b) - { 0x0E, 0x11, 0x11, 0x11, 0x02 }, // (c) - { 0x0E, 0x11, 0x11, 0x09, 0x7F }, // (d) - { 0x0E, 0x15, 0x15, 0x15, 0x0C }, // (e) - { 0x08, 0x3F, 0x48, 0x40, 0x20 }, // (f) - { 0x18, 0x25, 0x25, 0x25, 0x3E }, // (g) - { 0x7F, 0x08, 0x10, 0x10, 0x0F }, // (h) - { 0x00, 0x11, 0x5F, 0x01, 0x00 }, // (i) - { 0x02, 0x01, 0x11, 0x5E, 0x00 }, // (j) - { 0x7F, 0x04, 0x0A, 0x11, 0x00 }, // (k) - { 0x00, 0x41, 0x7F, 0x01, 0x00 }, // (l) - { 0x1F, 0x10, 0x0C, 0x10, 0x0F }, // (m) - { 0x1F, 0x08, 0x10, 0x10, 0x0F }, // (n) - { 0x0E, 0x11, 0x11, 0x11, 0x0E }, // (o) - { 0x1F, 0x14, 0x14, 0x14, 0x08 }, // (p) - { 0x08, 0x14, 0x14, 0x14, 0x0F }, // (q) - { 0x1F, 0x08, 0x10, 0x10, 0x08 }, // (r) - { 0x09, 0x15, 0x15, 0x15, 0x02 }, // (s) - { 0x10, 0x7E, 0x11, 0x01, 0x02 }, // (t) - { 0x1E, 0x01, 0x01, 0x02, 0x1F }, // (u) - { 0x1C, 0x02, 0x01, 0x02, 0x1C }, // (v) - { 0x1E, 0x01, 0x02, 0x01, 0x1E }, // (w) - { 0x11, 0x0A, 0x04, 0x0A, 0x11 }, // (x) - { 0x18, 0x05, 0x05, 0x05, 0x1E }, // (y) - { 0x11, 0x13, 0x15, 0x19, 0x11 }, // (z) - { 0x08, 0x36, 0x41, 0x00, 0x00 }, // ({) - { 0x00, 0x00, 0x7F, 0x00, 0x00 }, // (|) - { 0x00, 0x00, 0x41, 0x36, 0x08 }, // (}) - { 0x08, 0x10, 0x08, 0x04, 0x08 }, // (~) - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x08, 0x08, 0x2A, 0x1C, 0x08 }, // (arrow right) - { 0x08, 0x1C, 0x2A, 0x08, 0x08 }, // (arrow left) - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x14, 0x3E, 0x55, 0x41, 0x22 }, // (€) - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x1F, 0x64, 0x24, 0x64, 0x1F }, // (Ä) - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x1E, 0x61, 0x21, 0x61, 0x1E }, // (Ö) - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x3E, 0x41, 0x01, 0x41, 0x3E }, // (Ü) - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x3F, 0x40, 0x40, 0x49, 0x36 }, // (ß) - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x02, 0x55, 0x15, 0x55, 0x0F }, // (ä) - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x0E, 0x51, 0x11, 0x51, 0x0E }, // (ö) - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x1E, 0x41, 0x01, 0x42, 0x1F }, // (ü) - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x00, 0x00, 0x00, 0x00, 0x00 }, // - { 0x18, 0x45, 0x05, 0x45, 0x1E }, // (ÿ) +#include + +#include + +struct LCDChar { + uint8_t width; + uint8_t columns[7]; +}; + +const LCDChar font_var_width[256] PROGMEM = { + { 0, {} }, // 00 NUL + { 0, {} }, // 01 SOH + { 0, {} }, // 02 STX + { 0, {} }, // 03 ETX + { 0, {} }, // 04 EOT + { 0, {} }, // 05 ENQ + { 0, {} }, // 06 ACK + { 0, {} }, // 07 BEL + { 0, {} }, // 08 BS + { 0, {} }, // 09 HT + { 0, {} }, // 0A LF + { 0, {} }, // 0B VT + { 0, {} }, // 0C FF + { 0, {} }, // 0D CR + { 0, {} }, // 0E SO + { 0, {} }, // 0F SI + { 0, {} }, // 10 DLE + { 0, {} }, // 11 DC1 + { 0, {} }, // 12 DC2 + { 0, {} }, // 13 DC3 + { 0, {} }, // 14 DC4 + { 0, {} }, // 15 NAK + { 0, {} }, // 16 SYN + { 0, {} }, // 17 ETB + { 0, {} }, // 18 CAN + { 0, {} }, // 19 EM + { 0, {} }, // 1A SUB + { 0, {} }, // 1B ESC + { 0, {} }, // 1C FS + { 0, {} }, // 1D GS + { 0, {} }, // 1E RS + { 0, {} }, // 1F US + { 1, { 0x00 } }, // 20 SP + { 1, { 0x7D } }, // 21 ! + { 3, { 0x70, 0x00, 0x70 } }, // 22 " + { 5, { 0x14, 0x7F, 0x14, 0x7F, 0x14 } }, // 23 # + { 5, { 0x12, 0x2A, 0x7F, 0x2A, 0x24 } }, // 24 $ + { 5, { 0x62, 0x64, 0x08, 0x13, 0x23 } }, // 25 % + { 5, { 0x36, 0x49, 0x35, 0x02, 0x05 } }, // 26 & + { 2, { 0x50, 0x60 } }, // 27 ' + { 3, { 0x1C, 0x22, 0x41 } }, // 28 ( + { 3, { 0x41, 0x22, 0x1C } }, // 29 ) + { 5, { 0x44, 0x28, 0x7C, 0x28, 0x44 } }, // 2A * + { 5, { 0x08, 0x08, 0x7F, 0x08, 0x08 } }, // 2B + + { 2, { 0x05, 0x06 } }, // 2C , + { 3, { 0x08, 0x08, 0x08 } }, // 2D - + { 2, { 0x03, 0x03 } }, // 2E . + { 5, { 0x02, 0x04, 0x08, 0x10, 0x20 } }, // 2F / + { 5, { 0x3E, 0x45, 0x49, 0x51, 0x3E } }, // 30 0 + { 3, { 0x21, 0x7F, 0x01 } }, // 31 1 + { 5, { 0x21, 0x43, 0x45, 0x49, 0x31 } }, // 32 2 + { 5, { 0x42, 0x41, 0x51, 0x69, 0x46 } }, // 33 3 + { 5, { 0x0C, 0x14, 0x24, 0x7F, 0x04 } }, // 34 4 + { 5, { 0x72, 0x51, 0x51, 0x51, 0x4E } }, // 35 5 + { 5, { 0x1E, 0x29, 0x49, 0x49, 0x06 } }, // 36 6 + { 5, { 0x43, 0x44, 0x48, 0x50, 0x60 } }, // 37 7 + { 5, { 0x36, 0x49, 0x49, 0x49, 0x36 } }, // 38 8 + { 5, { 0x30, 0x49, 0x49, 0x4A, 0x3C } }, // 39 9 + { 2, { 0x36, 0x36 } }, // 3A : + { 2, { 0x35, 0x36 } }, // 3B ; + { 4, { 0x08, 0x14, 0x22, 0x41 } }, // 3C < + { 5, { 0x14, 0x14, 0x14, 0x14, 0x14 } }, // 3D = + { 4, { 0x41, 0x22, 0x14, 0x08 } }, // 3E > + { 5, { 0x20, 0x40, 0x45, 0x48, 0x30 } }, // 3F ? + { 5, { 0x3E, 0x41, 0x4D, 0x51, 0x36 } }, // 40 @ + { 5, { 0x3F, 0x48, 0x48, 0x48, 0x3F } }, // 41 A + { 5, { 0x7F, 0x49, 0x49, 0x49, 0x36 } }, // 42 B + { 5, { 0x3E, 0x41, 0x41, 0x41, 0x22 } }, // 43 C + { 5, { 0x7F, 0x41, 0x41, 0x41, 0x3E } }, // 44 D + { 5, { 0x7F, 0x49, 0x49, 0x49, 0x41 } }, // 45 E + { 5, { 0x7F, 0x48, 0x48, 0x48, 0x40 } }, // 46 F + { 5, { 0x3E, 0x41, 0x49, 0x49, 0x2E } }, // 47 G + { 5, { 0x7F, 0x08, 0x08, 0x08, 0x7F } }, // 48 H + { 3, { 0x41, 0x7F, 0x41 } }, // 49 I + { 5, { 0x02, 0x01, 0x41, 0x7E, 0x40 } }, // 4A J + { 5, { 0x7F, 0x08, 0x14, 0x22, 0x41 } }, // 4B K + { 5, { 0x7F, 0x01, 0x01, 0x01, 0x01 } }, // 4C L + { 5, { 0x7F, 0x20, 0x18, 0x20, 0x7F } }, // 4D M + { 5, { 0x7F, 0x10, 0x08, 0x04, 0x7F } }, // 4E N + { 5, { 0x3E, 0x41, 0x41, 0x41, 0x3E } }, // 4F O + { 5, { 0x7F, 0x48, 0x48, 0x48, 0x30 } }, // 50 P + { 5, { 0x3E, 0x41, 0x45, 0x42, 0x3D } }, // 51 Q + { 5, { 0x7F, 0x48, 0x4C, 0x4A, 0x31 } }, // 52 R + { 5, { 0x31, 0x49, 0x49, 0x49, 0x46 } }, // 53 S + { 5, { 0x40, 0x40, 0x7F, 0x40, 0x40 } }, // 54 T + { 5, { 0x7E, 0x01, 0x01, 0x01, 0x7E } }, // 55 U + { 5, { 0x7C, 0x02, 0x01, 0x02, 0x7C } }, // 56 V + { 5, { 0x7E, 0x01, 0x06, 0x01, 0x7E } }, // 57 W + { 5, { 0x63, 0x14, 0x08, 0x14, 0x63 } }, // 58 X + { 5, { 0x70, 0x08, 0x07, 0x08, 0x70 } }, // 59 Y + { 5, { 0x43, 0x45, 0x49, 0x51, 0x61 } }, // 5A Z + { 3, { 0x7F, 0x41, 0x41 } }, // 5B [ + { 5, { 0x20, 0x10, 0x08, 0x04, 0x02 } }, /* 5C \ */ + { 3, { 0x41, 0x41, 0x7F } }, // 5D ] + { 5, { 0x10, 0x20, 0x40, 0x20, 0x10 } }, // 5E ^ + { 5, { 0x01, 0x01, 0x01, 0x01, 0x01 } }, // 5F _ + { 3, { 0x40, 0x20, 0x10 } }, // 60 ` + { 5, { 0x02, 0x15, 0x15, 0x15, 0x0F } }, // 61 a + { 5, { 0x7F, 0x09, 0x11, 0x11, 0x0E } }, // 62 b + { 5, { 0x0E, 0x11, 0x11, 0x11, 0x02 } }, // 63 c + { 5, { 0x0E, 0x11, 0x11, 0x09, 0x7F } }, // 64 d + { 5, { 0x0E, 0x15, 0x15, 0x15, 0x0C } }, // 65 e + { 5, { 0x08, 0x3F, 0x48, 0x40, 0x20 } }, // 66 f + { 5, { 0x18, 0x25, 0x25, 0x25, 0x3E } }, // 67 g + { 5, { 0x7F, 0x08, 0x10, 0x10, 0x0F } }, // 68 h + { 3, { 0x11, 0x5F, 0x01 } }, // 69 i + { 4, { 0x02, 0x01, 0x11, 0x5E } }, // 6A j + { 4, { 0x7F, 0x04, 0x0A, 0x11 } }, // 6B k + { 3, { 0x41, 0x7F, 0x01 } }, // 6C l + { 5, { 0x1F, 0x10, 0x0C, 0x10, 0x0F } }, // 6D m + { 5, { 0x1F, 0x08, 0x10, 0x10, 0x0F } }, // 6E n + { 5, { 0x0E, 0x11, 0x11, 0x11, 0x0E } }, // 6F o + { 5, { 0x1F, 0x14, 0x14, 0x14, 0x08 } }, // 70 p + { 5, { 0x08, 0x14, 0x14, 0x14, 0x0F } }, // 71 q + { 5, { 0x1F, 0x08, 0x10, 0x10, 0x08 } }, // 72 r + { 5, { 0x09, 0x15, 0x15, 0x15, 0x02 } }, // 73 s + { 5, { 0x10, 0x7E, 0x11, 0x01, 0x02 } }, // 74 t + { 5, { 0x1E, 0x01, 0x01, 0x02, 0x1F } }, // 75 u + { 5, { 0x1C, 0x02, 0x01, 0x02, 0x1C } }, // 76 v + { 5, { 0x1E, 0x01, 0x02, 0x01, 0x1E } }, // 77 w + { 5, { 0x11, 0x0A, 0x04, 0x0A, 0x11 } }, // 78 x + { 5, { 0x18, 0x05, 0x05, 0x05, 0x1E } }, // 79 y + { 5, { 0x11, 0x13, 0x15, 0x19, 0x11 } }, // 7A z + { 3, { 0x08, 0x36, 0x41 } }, // 7B { + { 1, { 0x7F } }, // 7C | + { 3, { 0x41, 0x36, 0x08 } }, // 7D } + { 5, { 0x08, 0x10, 0x08, 0x04, 0x08 } }, // 7E ~ + { 0, {} }, // 7F DEL + { 0, {} }, // 80 PAD + { 0, {} }, // 81 HOP + { 0, {} }, // 82 BPH + { 0, {} }, // 83 NBH + { 0, {} }, // 84 IND + { 0, {} }, // 85 NEL + { 0, {} }, // 86 SSA + { 0, {} }, // 87 ESA + { 0, {} }, // 88 HTS + { 0, {} }, // 89 HTJ + { 0, {} }, // 8A VTS + { 0, {} }, // 8B PLD + { 0, {} }, // 8C PLU + { 0, {} }, // 8D RI + { 0, {} }, // 8E SS2 + { 0, {} }, // 8F SS3 + { 0, {} }, // 90 DCS + { 0, {} }, // 91 PU1 + { 0, {} }, // 92 PU2 + { 0, {} }, // 93 STS + { 0, {} }, // 94 CCH + { 0, {} }, // 95 MW + { 0, {} }, // 96 SPA + { 0, {} }, // 97 EPA + { 0, {} }, // 98 SOS + { 0, {} }, // 99 SGCI + { 0, {} }, // 9A SCI + { 0, {} }, // 9B CSI + { 0, {} }, // 9C ST + { 0, {} }, // 9D OSC + { 0, {} }, // 9E PM + { 0, {} }, // 9F APC + { 1, { 0x00 } }, // A0 NBSP + { 1, { 0x5F } }, // A1 ¡ + { 0, {} }, // A2 ¢ + { 5, { 0x09, 0x3F, 0x69, 0x69, 0x21 } }, // A3 £ + { 5, { 0x14, 0x3E, 0x55, 0x41, 0x22 } }, // A4 € + { 5, { 0x74, 0x0C, 0x07, 0x0C, 0x74 } }, // A5 ¥ + { 0, {} }, // A6 Š + { 4, { 0x29, 0x55, 0x55, 0x4A} }, // A7 § + { 0, {} }, // A8 š + { 7, { 0x3E, 0x41, 0x5D, 0x55, 0x55, 0x41, 0x3E } }, // A9 © + { 0, {} }, // AA ª + { 5, { 0x04, 0x0A, 0x00, 0x04, 0x0A } }, // AB « + { 4, { 0x08, 0x08, 0x08, 0x06 } }, // AC ¬ + { 0, {} }, // AD SHY + { 7, { 0x3E, 0x41, 0x5D, 0x59, 0x55, 0x41, 0x3E } }, // AE ® + { 3, { 0x02, 0x02, 0x02 } }, // AF ¯ + { 3, { 0x20, 0x50, 0x20 } }, // B0 ° + { 3, { 0x12, 0x3A, 0x12 } }, // B1 ± + { 3, { 0x48, 0x58, 0x28 } }, // B2 ² + { 3, { 0x48, 0x68, 0x30 } }, // B3 ³ + { 0, {} }, // B4 Ž + { 4, { 0x0F, 0x02, 0x02, 0x0E } }, // B5 µ + { 5, { 0x30, 0x78, 0x7F, 0x40, 0x7F } }, // B6 ¶ + { 1, { 0x08 } }, // B7 · + { 0, {} }, // B8 ž + { 3, { 0x28, 0x78, 0x08 } }, // B9 ¹ + { 0, {} }, // BA º + { 5, { 0x0A, 0x04, 0x00, 0x0A, 0x04 } }, // BB » + { 6, { 0x3E, 0x41, 0x41, 0x7F, 0x49, 0x49 } }, // BC Œ + { 5, { 0x0E, 0x11, 0x11, 0x0E, 0x15, 0x0C } }, // BD œ + { 0, {} }, // BE Ÿ + { 5, { 0x06, 0x09, 0x51, 0x01, 0x02 } }, // BF ¿ + { 0, {} }, // C0 À + { 0, {} }, // C1 Á + { 0, {} }, // C2  + { 0, {} }, // C3 à + { 5, { 0x1F, 0x64, 0x24, 0x64, 0x1F } }, // C4 Ä + { 0, {} }, // C5 Å + { 6, { 0x3F, 0x48, 0x48, 0x7F, 0x49, 0x49 } }, // C6 Æ + { 0, {} }, // C7 Ç + { 0, {} }, // C8 È + { 0, {} }, // C9 É + { 0, {} }, // CA Ê + { 0, {} }, // CB Ë + { 0, {} }, // CC Ì + { 0, {} }, // CD Í + { 0, {} }, // CE Î + { 0, {} }, // CF Ï + { 5, { 0x08, 0x7F, 0x49, 0x41, 0x3E } }, // D0 Ð + { 0, {} }, // D1 Ñ + { 0, {} }, // D2 Ò + { 0, {} }, // D3 Ó + { 0, {} }, // D4 Ô + { 0, {} }, // D5 Õ + { 5, { 0x1E, 0x61, 0x21, 0x61, 0x1E } }, // D6 Ö + { 5, { 0x0A, 0x04, 0x0A } }, // D7 × + { 0, {} }, // D8 Ø + { 0, {} }, // D9 Ù + { 0, {} }, // DA Ú + { 0, {} }, // DB Û + { 5, { 0x3E, 0x41, 0x01, 0x41, 0x3E } }, // DC Ü + { 0, {} }, // DD Ý + { 4, { 0x7F, 0x28, 0x28, 0x10 } }, // DE Þ + { 4, { 0x3F, 0x40, 0x49, 0x36 } }, // DF ß + { 0, {} }, // E0 à + { 0, {} }, // E1 á + { 0, {} }, // E2 â + { 0, {} }, // E3 ã + { 5, { 0x02, 0x55, 0x15, 0x55, 0x0F } }, // E4 ä + { 0, {} }, // E5 å + { 7, { 0x02, 0x15, 0x15, 0x0E, 0x15, 0x15, 0x0C } }, // E6 æ + { 0, {} }, // E7 ç + { 0, {} }, // E8 è + { 0, {} }, // E9 é + { 0, {} }, // EA ê + { 0, {} }, // EB ë + { 0, {} }, // EC ì + { 0, {} }, // ED í + { 0, {} }, // EE î + { 0, {} }, // EF ï + { 0, {} }, // F0 ð + { 0, {} }, // F1 ñ + { 0, {} }, // F2 ò + { 0, {} }, // F3 ó + { 0, {} }, // F4 ô + { 0, {} }, // F5 õ + { 5, { 0x0E, 0x51, 0x11, 0x51, 0x0E } }, // F6 ö + { 5, { 0x08, 0x08, 0x2A, 0x08, 0x08 } }, // F7 ÷ + { 0, {} }, // F8 ø + { 0, {} }, // F9 ù + { 0, {} }, // FA ú + { 0, {} }, // FB û + { 5, { 0x1E, 0x41, 0x01, 0x42, 0x1F } }, // FC ü + { 0, {} }, // FD ý + { 4, { 0x7F, 0x14, 0x14, 0x08 } }, // FE þ + { 5, { 0x18, 0x45, 0x05, 0x45, 0x1E } }, // FF ÿ }; #endif diff --git a/src/main.cpp b/src/main.cpp index 23d9303..7a60b1c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,78 +1,116 @@ +#include "font.h" + #include #include #include -#include "font.h" +#include +#include -const int WIDTH = 120; -const int LINES = 7; -const int LINE_PINS[7] = { 2, 3, 4, 5, 6, 7, 8 }; +int pixel_width(String const & text); +void shiftout(uint8_t const bit); +int write_letter_at(int col, uint8_t const letter); +void letters(int pos); +void receive_serial(); + +int const WIDTH = 120; +int const LINES = 7; +int const CHAR_GAP = 1; +int const LINE_PINS[7] = { 2, 3, 4, 5, 6, 7, 8 }; uint8_t buffer[120]; String message = "9600N1 ISO8859-15 https://github.com/silentium83/zielanzeige/tree/develop"; String newMessage; +int messageLength = pixel_width(message); int ticks = 0; -int runde = 120; +int turn = 120; + +int pixel_width(String const & text) { + int width = 0; + for (unsigned int i = 0; i < text.length(); ++i) { + uint8_t const charWidth = pgm_read_byte(&font_var_width[(uint8_t)(text[i])].width); + if (charWidth) { + if (width < INT_MAX - CHAR_GAP - charWidth) { + width += charWidth + CHAR_GAP; + } else { + return INT_MAX; + } + } + } + width -= CHAR_GAP; + if (width < 0) { + width = 0; + } + return width; +} // Shift register needs to use raw AVR // B1 is clock // B2 is data -void shiftout(uint8_t bit) { +void shiftout(uint8_t const bit) { PORTB = bit << 2; PORTB |= 0x02; PORTB = 0; } -void write_letter_at(int startcol, uint8_t letter) { - for (int_fast8_t x = 0; x < 5; x++) { - int col = startcol + x; +int write_letter_at(int col, uint8_t const letter) { + uint8_t charWidth = pgm_read_byte(&font_var_width[letter].width); + for (int_fast8_t x = 0; x < charWidth; ++x) { if (col >= 0 && col < WIDTH) { - buffer[col] = pgm_read_byte(&font_5x7_col[letter][x]); + buffer[col] = pgm_read_byte(&font_var_width[letter].columns[x]); + } else if (col >= WIDTH) { + return col; } + ++col; } + col += CHAR_GAP; + return col; } -void letters(int round) { - for (int i = 0; i < WIDTH; i++) { +void letters(int pos) { + for (int i = 0; i < WIDTH; ++i) { buffer[i] = 0; } - int pos = 0; - for (unsigned int c = 0; c < message.length(); c++) { - write_letter_at(round + pos, message[c]); - pos += 6; + for (unsigned int c = 0; c < message.length() && pos < WIDTH; ++c) { + pos = write_letter_at(pos, message[c]); } } void receive_serial() { while (Serial.available() > 0) { - char receivedChar = Serial.read(); + char const receivedChar = Serial.read(); switch (receivedChar) { case '\b': // backspace if (newMessage.length() > 0) { newMessage.remove(newMessage.length() - 1); + Serial.write("\b "); } break; case '\n': // newline - case '\r': // carriage return if (newMessage.length() > 0) { if (message != newMessage) { message = newMessage; + messageLength = pixel_width(message); ticks = 0; - runde = 120; + turn = 120; } newMessage = ""; } + Serial.print(message); + break; + case '\r': // carriage return break; default: newMessage += receivedChar; break; } + Serial.write(receivedChar); } } void setup() { - for (uint_fast8_t i = 2; i <= 10; i++) { + for (uint_fast8_t i = 2; i <= 10; ++i) { pinMode(i, OUTPUT); } pinMode(13, OUTPUT); @@ -81,9 +119,9 @@ void setup() { } void loop() { - for (uint_fast8_t y = 0; y < LINES; y++) { - for (uint_fast8_t x = 0; x < WIDTH; x++) { - uint8_t bit = (buffer[x] & (1 << y)) ? 1 : 0; + for (uint_fast8_t y = 0; y < LINES; ++y) { + for (uint_fast8_t x = 0; x < WIDTH; ++x) { + uint8_t const bit = (buffer[x] & (1 << y)) ? 1 : 0; shiftout(bit); } @@ -94,19 +132,19 @@ void loop() { digitalWrite(LINE_PINS[y], 0); } - ticks++; + ++ticks; if (ticks == 8) { ticks = 0; - if ((6 * (int)message.length()) > 120) { - runde--; + if (messageLength > 120) { + --turn; - letters(runde); + letters(turn); - if (runde == -(6 * (int)message.length())) { - runde = 120; + if (turn == -messageLength) { + turn = 120; } } else { - int padding = (120 - (6 * (int)message.length())) / 2; + int const padding = (120 - messageLength) / 2; letters(padding); }