Lamp-Da 0.1
A compact lantern project
Loading...
Searching...
No Matches
text_display.hpp
Go to the documentation of this file.
1
5#ifndef MODES_DRAW_TEXT_DISPLAY_HPP
6#define MODES_DRAW_TEXT_DISPLAY_HPP
7
8#include <functional>
9
10namespace lampda::modes::draw {
12namespace text {
13
15
16namespace __private {
17
18// fonts from:
19// http://www.piclist.com/techref/datafile/charset/extractor/charset_extractor.html
20
21struct IFont
22{
23 virtual const uint8_t* get_letter(const u_char letter) const = 0;
24
25 virtual uint8_t get_height() const = 0;
26 virtual uint8_t get_width() const = 0;
27
28 inline int8_t get_arrayLenght() const { return get_height() * get_width() / 8; };
29};
30
31struct SmallFont : public IFont
32{
33 static inline constexpr uint8_t font[96][6] = {
34 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, //
35 {0x10, 0xE3, 0x84, 0x10, 0x01, 0x00}, // !
36 {0x6D, 0xB4, 0x80, 0x00, 0x00, 0x00}, // "
37 {0x00, 0xA7, 0xCA, 0x29, 0xF2, 0x80}, // #
38 {0x20, 0xE4, 0x0C, 0x09, 0xC1, 0x00}, // $
39 {0x65, 0x90, 0x84, 0x21, 0x34, 0xC0}, // %
40 {0x21, 0x45, 0x08, 0x55, 0x23, 0x40}, // &
41 {0x30, 0xC2, 0x00, 0x00, 0x00, 0x00}, // '
42 {0x10, 0x82, 0x08, 0x20, 0x81, 0x00}, // (
43 {0x20, 0x41, 0x04, 0x10, 0x42, 0x00}, // )
44 {0x00, 0xA3, 0x9F, 0x38, 0xA0, 0x00}, // *
45 {0x00, 0x41, 0x1F, 0x10, 0x40, 0x00}, // +
46 {0x00, 0x00, 0x00, 0x00, 0xC3, 0x08}, // ,
47 {0x00, 0x00, 0x1F, 0x00, 0x00, 0x00}, // -
48 {0x00, 0x00, 0x00, 0x00, 0xC3, 0x00}, // .
49 {0x00, 0x10, 0x84, 0x21, 0x00, 0x00}, // /
50 {0x39, 0x14, 0xD5, 0x65, 0x13, 0x80}, // 0
51 {0x10, 0xC1, 0x04, 0x10, 0x43, 0x80}, // 1
52 {0x39, 0x10, 0x46, 0x21, 0x07, 0xC0}, // 2
53 {0x39, 0x10, 0x4E, 0x05, 0x13, 0x80}, // 3
54 {0x08, 0x62, 0x92, 0x7C, 0x20, 0x80}, // 4
55 {0x7D, 0x04, 0x1E, 0x05, 0x13, 0x80}, // 5
56 {0x18, 0x84, 0x1E, 0x45, 0x13, 0x80}, // 6
57 {0x7C, 0x10, 0x84, 0x20, 0x82, 0x00}, // 7
58 {0x39, 0x14, 0x4E, 0x45, 0x13, 0x80}, // 8
59 {0x39, 0x14, 0x4F, 0x04, 0x23, 0x00}, // 9
60 {0x00, 0x03, 0x0C, 0x00, 0xC3, 0x00}, // :
61 {0x00, 0x03, 0x0C, 0x00, 0xC3, 0x08}, // ;
62 {0x08, 0x42, 0x10, 0x20, 0x40, 0x80}, // <
63 {0x00, 0x07, 0xC0, 0x01, 0xF0, 0x00}, // =
64 {0x20, 0x40, 0x81, 0x08, 0x42, 0x00}, // >
65 {0x39, 0x10, 0x46, 0x10, 0x01, 0x00}, // ?
66 {0x39, 0x15, 0xD5, 0x5D, 0x03, 0x80}, // @
67 {0x39, 0x14, 0x51, 0x7D, 0x14, 0x40}, // A
68 {0x79, 0x14, 0x5E, 0x45, 0x17, 0x80}, // B
69 {0x39, 0x14, 0x10, 0x41, 0x13, 0x80}, // C
70 {0x79, 0x14, 0x51, 0x45, 0x17, 0x80}, // D
71 {0x7D, 0x04, 0x1E, 0x41, 0x07, 0xC0}, // E
72 {0x7D, 0x04, 0x1E, 0x41, 0x04, 0x00}, // F
73 {0x39, 0x14, 0x17, 0x45, 0x13, 0xC0}, // G
74 {0x45, 0x14, 0x5F, 0x45, 0x14, 0x40}, // H
75 {0x38, 0x41, 0x04, 0x10, 0x43, 0x80}, // I
76 {0x04, 0x10, 0x41, 0x45, 0x13, 0x80}, // J
77 {0x45, 0x25, 0x18, 0x51, 0x24, 0x40}, // K
78 {0x41, 0x04, 0x10, 0x41, 0x07, 0xC0}, // L
79 {0x45, 0xB5, 0x51, 0x45, 0x14, 0x40}, // M
80 {0x45, 0x95, 0x53, 0x45, 0x14, 0x40}, // N
81 {0x39, 0x14, 0x51, 0x45, 0x13, 0x80}, // O
82 {0x79, 0x14, 0x5E, 0x41, 0x04, 0x00}, // P
83 {0x39, 0x14, 0x51, 0x55, 0x23, 0x40}, // Q
84 {0x79, 0x14, 0x5E, 0x49, 0x14, 0x40}, // R
85 {0x39, 0x14, 0x0E, 0x05, 0x13, 0x80}, // S
86 {0x7C, 0x41, 0x04, 0x10, 0x41, 0x00}, // T
87 {0x45, 0x14, 0x51, 0x45, 0x13, 0x80}, // U
88 {0x45, 0x14, 0x51, 0x44, 0xA1, 0x00}, // V
89 {0x45, 0x15, 0x55, 0x55, 0x52, 0x80}, // W
90 {0x45, 0x12, 0x84, 0x29, 0x14, 0x40}, // X
91 {0x45, 0x14, 0x4A, 0x10, 0x41, 0x00}, // Y
92 {0x78, 0x21, 0x08, 0x41, 0x07, 0x80}, // Z
93 {0x38, 0x82, 0x08, 0x20, 0x83, 0x80}, // [
94 {0x01, 0x02, 0x04, 0x08, 0x10, 0x00}, // /
95 {0x38, 0x20, 0x82, 0x08, 0x23, 0x80}, // ]
96 {0x10, 0xA4, 0x40, 0x00, 0x00, 0x00}, // ^
97 {0x00, 0x00, 0x00, 0x00, 0x00, 0x3F}, // _
98 {0x30, 0xC1, 0x00, 0x00, 0x00, 0x00}, // `
99 {0x00, 0x03, 0x81, 0x3D, 0x13, 0xC0}, // a
100 {0x41, 0x07, 0x91, 0x45, 0x17, 0x80}, // b
101 {0x00, 0x03, 0x91, 0x41, 0x13, 0x80}, // c
102 {0x04, 0x13, 0xD1, 0x45, 0x13, 0xC0}, // d
103 {0x00, 0x03, 0x91, 0x79, 0x03, 0x80}, // e
104 {0x18, 0x82, 0x1E, 0x20, 0x82, 0x00}, // f
105 {0x00, 0x03, 0xD1, 0x44, 0xF0, 0x4E}, // g
106 {0x41, 0x07, 0x12, 0x49, 0x24, 0x80}, // h
107 {0x10, 0x01, 0x04, 0x10, 0x41, 0x80}, // i
108 {0x08, 0x01, 0x82, 0x08, 0x24, 0x8C}, // j
109 {0x41, 0x04, 0x94, 0x61, 0x44, 0x80}, // k
110 {0x10, 0x41, 0x04, 0x10, 0x41, 0x80}, // l
111 {0x00, 0x06, 0x95, 0x55, 0x14, 0x40}, // m
112 {0x00, 0x07, 0x12, 0x49, 0x24, 0x80}, // n
113 {0x00, 0x03, 0x91, 0x45, 0x13, 0x80}, // o
114 {0x00, 0x07, 0x91, 0x45, 0x17, 0x90}, // p
115 {0x00, 0x03, 0xD1, 0x45, 0x13, 0xC1}, // q
116 {0x00, 0x05, 0x89, 0x20, 0x87, 0x00}, // r
117 {0x00, 0x03, 0x90, 0x38, 0x13, 0x80}, // s
118 {0x00, 0x87, 0x88, 0x20, 0xA1, 0x00}, // t
119 {0x00, 0x04, 0x92, 0x49, 0x62, 0x80}, // u
120 {0x00, 0x04, 0x51, 0x44, 0xA1, 0x00}, // v
121 {0x00, 0x04, 0x51, 0x55, 0xF2, 0x80}, // w
122 {0x00, 0x04, 0x92, 0x31, 0x24, 0x80}, // x
123 {0x00, 0x04, 0x92, 0x48, 0xE1, 0x18}, // y
124 {0x00, 0x07, 0x82, 0x31, 0x07, 0x80}, // z
125 {0x18, 0x82, 0x18, 0x20, 0x81, 0x80}, // {
126 {0x10, 0x41, 0x00, 0x10, 0x41, 0x00}, // |
127 {0x30, 0x20, 0x83, 0x08, 0x23, 0x00}, // }
128 {0x29, 0x40, 0x00, 0x00, 0x00, 0x00}, // ~
129 {0x10, 0xE6, 0xD1, 0x45, 0xF0, 0x00} // 
130 };
131
132 const uint8_t* get_letter(const u_char letter) const override
133 {
134 if (letter >= 32 and letter < 128)
135 // array starts at ascii 32
136 return SmallFont::font[letter - 32];
137 return SmallFont::font[1]; // return the char corresponding to '!'
138 }
139
140 inline uint8_t get_height() const override { return 8; };
141 inline uint8_t get_width() const override { return 6; };
142};
143static const SmallFont smallFont;
144
145struct BigFont : public IFont
146{
147 static inline constexpr uint8_t font[96][24] = {
148 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
149 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, //
150 {0x06, 0x00, 0x60, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0x60,
151 0x06, 0x00, 0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x60, 0x00, 0x00, 0x00}, // !
152 {0x00, 0x00, 0x00, 0x19, 0x81, 0x98, 0x19, 0x81, 0x98, 0x00, 0x00, 0x00,
153 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // "
154 {0x00, 0x00, 0x66, 0x06, 0x60, 0x66, 0x3F, 0xF0, 0xCC, 0x0C, 0xC1, 0x98,
155 0x19, 0x87, 0xFC, 0x33, 0x03, 0x30, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00}, // #
156 {0x06, 0x00, 0x60, 0x1F, 0x83, 0xFC, 0x36, 0x03, 0x60, 0x3F, 0x81, 0xFC,
157 0x06, 0xC0, 0x6C, 0x3F, 0xC1, 0xF8, 0x06, 0x00, 0x60, 0x00, 0x00, 0x00}, // $
158 {0x00, 0x00, 0x00, 0x00, 0x13, 0x83, 0x38, 0x73, 0x8E, 0x01, 0xC0, 0x38,
159 0x07, 0x00, 0xE0, 0x1C, 0x03, 0x8E, 0x70, 0xE6, 0x0E, 0x00, 0x00, 0x00}, // %
160 {0x00, 0x00, 0x70, 0x0D, 0x81, 0x98, 0x19, 0x81, 0xB0, 0x0E, 0x01, 0xE0,
161 0x3E, 0x03, 0x36, 0x33, 0xC3, 0x18, 0x3B, 0xC1, 0xE6, 0x00, 0x00, 0x00}, // &
162 {0x0E, 0x00, 0xE0, 0x0E, 0x00, 0x60, 0x06, 0x00, 0xC0, 0x00, 0x00, 0x00,
163 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // '
164 {0x03, 0x80, 0x60, 0x0E, 0x00, 0xC0, 0x1C, 0x01, 0xC0, 0x1C, 0x01, 0xC0,
165 0x1C, 0x01, 0xC0, 0x0C, 0x00, 0xE0, 0x06, 0x00, 0x38, 0x00, 0x00, 0x00}, // (
166 {0x1C, 0x00, 0x60, 0x07, 0x00, 0x30, 0x03, 0x80, 0x38, 0x03, 0x80, 0x38,
167 0x03, 0x80, 0x38, 0x03, 0x00, 0x70, 0x06, 0x01, 0xC0, 0x00, 0x00, 0x00}, // )
168 {0x00, 0x00, 0x00, 0x00, 0x03, 0x6C, 0x36, 0xC1, 0xF8, 0x0F, 0x03, 0xFC,
169 0x0F, 0x01, 0xF8, 0x36, 0xC3, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // *
170 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x60, 0x06, 0x03, 0xFC,
171 0x3F, 0xC0, 0x60, 0x06, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // +
172 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
173 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x06, 0x00, 0xC0}, // ,
174 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFC,
175 0x3F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // -
176 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
177 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x00, 0x00, 0x00}, // .
178 {0x00, 0x00, 0x01, 0x00, 0x30, 0x07, 0x00, 0xE0, 0x1C, 0x03, 0x80, 0x70,
179 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00}, // /
180 {0x0F, 0x83, 0xFE, 0x30, 0x66, 0x07, 0x60, 0xF6, 0x1B, 0x63, 0x36, 0x63,
181 0x6C, 0x37, 0x83, 0x70, 0x33, 0x06, 0x3F, 0xE0, 0xF8, 0x00, 0x00, 0x00}, // 0
182 {0x03, 0x00, 0x70, 0x1F, 0x01, 0xF0, 0x03, 0x00, 0x30, 0x03, 0x00, 0x30,
183 0x03, 0x00, 0x30, 0x03, 0x00, 0x30, 0x1F, 0xE1, 0xFE, 0x00, 0x00, 0x00}, // 1
184 {0x1F, 0xC3, 0xFE, 0x70, 0x76, 0x03, 0x60, 0x70, 0x0E, 0x01, 0xC0, 0x38,
185 0x07, 0x00, 0xE0, 0x1C, 0x03, 0x80, 0x7F, 0xF7, 0xFF, 0x00, 0x00, 0x00}, // 2
186 {0x1F, 0xC3, 0xFE, 0x70, 0x76, 0x03, 0x00, 0x30, 0x07, 0x0F, 0xE0, 0xFC,
187 0x00, 0x60, 0x03, 0x60, 0x37, 0x07, 0x3F, 0xE1, 0xFC, 0x00, 0x00, 0x00}, // 3
188 {0x01, 0xC0, 0x3C, 0x07, 0xC0, 0xEC, 0x1C, 0xC3, 0x8C, 0x70, 0xC6, 0x0C,
189 0x7F, 0xF7, 0xFF, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0x00, 0x00}, // 4
190 {0x7F, 0xF7, 0xFF, 0x60, 0x06, 0x00, 0x60, 0x07, 0xFC, 0x3F, 0xE0, 0x07,
191 0x00, 0x30, 0x03, 0x60, 0x37, 0x07, 0x3F, 0xE1, 0xFC, 0x00, 0x00, 0x00}, // 5
192 {0x03, 0xC0, 0x7C, 0x0E, 0x01, 0xC0, 0x38, 0x03, 0x00, 0x7F, 0xC7, 0xFE,
193 0x70, 0x76, 0x03, 0x60, 0x37, 0x07, 0x3F, 0xE1, 0xFC, 0x00, 0x00, 0x00}, // 6
194 {0x7F, 0xF7, 0xFF, 0x00, 0x60, 0x06, 0x00, 0xC0, 0x0C, 0x01, 0x80, 0x18,
195 0x03, 0x00, 0x30, 0x06, 0x00, 0x60, 0x0C, 0x00, 0xC0, 0x00, 0x00, 0x00}, // 7
196 {0x0F, 0x81, 0xFC, 0x38, 0xE3, 0x06, 0x30, 0x63, 0x8E, 0x1F, 0xC3, 0xFE,
197 0x70, 0x76, 0x03, 0x60, 0x37, 0x07, 0x3F, 0xE1, 0xFC, 0x00, 0x00, 0x00}, // 8
198 {0x1F, 0xC3, 0xFE, 0x70, 0x76, 0x03, 0x60, 0x37, 0x07, 0x3F, 0xF1, 0xFF,
199 0x00, 0x60, 0x0E, 0x01, 0xC0, 0x38, 0x1F, 0x01, 0xE0, 0x00, 0x00, 0x00}, // 9
200 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0x00,
201 0x00, 0x00, 0x00, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00}, // :
202 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0x00,
203 0x00, 0x00, 0x00, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0x60, 0x06, 0x00, 0xC0}, // ;
204 {0x00, 0xC0, 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x03, 0x80,
205 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x38, 0x01, 0xC0, 0x0C, 0x00, 0x00, 0x00}, // <
206 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x3F, 0xE0, 0x00,
207 0x00, 0x03, 0xFE, 0x3F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // =
208 {0x30, 0x03, 0x80, 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x38, 0x01, 0xC0, 0x1C,
209 0x03, 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x03, 0x00, 0x00, 0x00, 0x00}, // >
210 {0x1F, 0x83, 0xFC, 0x70, 0xE6, 0x06, 0x60, 0xE0, 0x1C, 0x03, 0x80, 0x70,
211 0x06, 0x00, 0x60, 0x06, 0x00, 0x00, 0x06, 0x00, 0x60, 0x00, 0x00, 0x00}, // ?
212 {0x1F, 0xC3, 0xFE, 0x30, 0x66, 0x7B, 0x6F, 0xB6, 0xDB, 0x6D, 0xB6, 0xDB,
213 0x6D, 0xB6, 0xFE, 0x67, 0xC7, 0x00, 0x3F, 0xC0, 0xFC, 0x00, 0x00, 0x00}, // @
214 {0x06, 0x00, 0x60, 0x0F, 0x00, 0xF0, 0x0F, 0x01, 0x98, 0x19, 0x81, 0x98,
215 0x30, 0xC3, 0xFC, 0x3F, 0xC6, 0x06, 0x60, 0x66, 0x06, 0x00, 0x00, 0x00}, // A
216 {0x7F, 0x07, 0xF8, 0x61, 0xC6, 0x0C, 0x60, 0xC6, 0x1C, 0x7F, 0x87, 0xFC,
217 0x60, 0xE6, 0x06, 0x60, 0x66, 0x0E, 0x7F, 0xC7, 0xF8, 0x00, 0x00, 0x00}, // B
218 {0x0F, 0x81, 0xFC, 0x38, 0xE3, 0x06, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00,
219 0x60, 0x06, 0x00, 0x30, 0x63, 0x8E, 0x1F, 0xC0, 0xF8, 0x00, 0x00, 0x00}, // C
220 {0x7F, 0x07, 0xF8, 0x61, 0xC6, 0x0C, 0x60, 0x66, 0x06, 0x60, 0x66, 0x06,
221 0x60, 0x66, 0x06, 0x60, 0xC6, 0x1C, 0x7F, 0x87, 0xF0, 0x00, 0x00, 0x00}, // D
222 {0x7F, 0xE7, 0xFE, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x7F, 0x87, 0xF8,
223 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x7F, 0xE7, 0xFE, 0x00, 0x00, 0x00}, // E
224 {0x7F, 0xE7, 0xFE, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x7F, 0x87, 0xF8,
225 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x00, 0x00, 0x00}, // F
226 {0x0F, 0xC1, 0xFE, 0x38, 0x63, 0x00, 0x60, 0x06, 0x00, 0x63, 0xE6, 0x3E,
227 0x60, 0x66, 0x06, 0x30, 0x63, 0x86, 0x1F, 0xE0, 0xFE, 0x00, 0x00, 0x00}, // G
228 {0x60, 0x66, 0x06, 0x60, 0x66, 0x06, 0x60, 0x66, 0x06, 0x7F, 0xE7, 0xFE,
229 0x60, 0x66, 0x06, 0x60, 0x66, 0x06, 0x60, 0x66, 0x06, 0x00, 0x00, 0x00}, // H
230 {0x1F, 0x81, 0xF8, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60,
231 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x1F, 0x81, 0xF8, 0x00, 0x00, 0x00}, // I
232 {0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06,
233 0x00, 0x66, 0x06, 0x60, 0x67, 0x0C, 0x3F, 0xC1, 0xF8, 0x00, 0x00, 0x00}, // J
234 {0x60, 0x66, 0x0E, 0x61, 0xC6, 0x38, 0x67, 0x06, 0xE0, 0x7C, 0x07, 0xC0,
235 0x6E, 0x06, 0x70, 0x63, 0x86, 0x1C, 0x60, 0xE6, 0x06, 0x00, 0x00, 0x00}, // K
236 {0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00,
237 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x7F, 0xE7, 0xFE, 0x00, 0x00, 0x00}, // L
238 {0x60, 0x67, 0x0E, 0x70, 0xE7, 0x9E, 0x79, 0xE6, 0xF6, 0x6F, 0x66, 0x66,
239 0x66, 0x66, 0x06, 0x60, 0x66, 0x06, 0x60, 0x66, 0x06, 0x00, 0x00, 0x00}, // M
240 {0x60, 0x67, 0x06, 0x70, 0x67, 0x86, 0x6C, 0x66, 0xC6, 0x66, 0x66, 0x66,
241 0x63, 0x66, 0x36, 0x61, 0xE6, 0x0E, 0x60, 0xE6, 0x06, 0x00, 0x00, 0x00}, // N
242 {0x0F, 0x01, 0xF8, 0x39, 0xC3, 0x0C, 0x60, 0x66, 0x06, 0x60, 0x66, 0x06,
243 0x60, 0x66, 0x06, 0x30, 0xC3, 0x9C, 0x1F, 0x80, 0xF0, 0x00, 0x00, 0x00}, // O
244 {0x7F, 0x87, 0xFC, 0x60, 0xE6, 0x06, 0x60, 0x66, 0x06, 0x60, 0xE7, 0xFC,
245 0x7F, 0x86, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x00, 0x00, 0x00}, // P
246 {0x0F, 0x01, 0xF8, 0x39, 0xC3, 0x0C, 0x60, 0x66, 0x06, 0x60, 0x66, 0x06,
247 0x60, 0x66, 0x36, 0x33, 0xC3, 0x9C, 0x1F, 0xE0, 0xF6, 0x00, 0x00, 0x00}, // Q
248 {0x7F, 0x87, 0xFC, 0x60, 0xE6, 0x06, 0x60, 0x66, 0x06, 0x60, 0xE7, 0xFC,
249 0x7F, 0x86, 0x70, 0x63, 0x86, 0x1C, 0x60, 0xE6, 0x06, 0x00, 0x00, 0x00}, // R
250 {0x1F, 0x83, 0xFC, 0x70, 0xE6, 0x06, 0x60, 0x07, 0x00, 0x3F, 0x81, 0xFC,
251 0x00, 0xE0, 0x06, 0x60, 0x67, 0x0E, 0x3F, 0xC1, 0xF8, 0x00, 0x00, 0x00}, // S
252 {0x3F, 0xC3, 0xFC, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60,
253 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x00, 0x00, 0x00}, // T
254 {0x60, 0x66, 0x06, 0x60, 0x66, 0x06, 0x60, 0x66, 0x06, 0x60, 0x66, 0x06,
255 0x60, 0x66, 0x06, 0x60, 0x63, 0x0C, 0x3F, 0xC1, 0xF8, 0x00, 0x00, 0x00}, // U
256 {0x60, 0x66, 0x06, 0x60, 0x63, 0x0C, 0x30, 0xC3, 0x0C, 0x19, 0x81, 0x98,
257 0x19, 0x80, 0xF0, 0x0F, 0x00, 0xF0, 0x06, 0x00, 0x60, 0x00, 0x00, 0x00}, // V
258 {0x60, 0x66, 0x06, 0x60, 0x66, 0x06, 0x60, 0x66, 0x06, 0x60, 0x66, 0x66,
259 0x66, 0x66, 0xF6, 0x79, 0xE7, 0x0E, 0x70, 0xE6, 0x06, 0x00, 0x00, 0x00}, // W
260 {0x60, 0x66, 0x06, 0x30, 0xC3, 0x0C, 0x19, 0x80, 0xF0, 0x06, 0x00, 0x60,
261 0x0F, 0x01, 0x98, 0x30, 0xC3, 0x0C, 0x60, 0x66, 0x06, 0x00, 0x00, 0x00}, // X
262 {0x60, 0x66, 0x06, 0x30, 0xC3, 0x0C, 0x19, 0x81, 0x98, 0x0F, 0x00, 0xF0,
263 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x00, 0x00, 0x00}, // Y
264 {0x7F, 0xE7, 0xFE, 0x00, 0xC0, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, 0x60,
265 0x0C, 0x01, 0x80, 0x30, 0x03, 0x00, 0x7F, 0xE7, 0xFE, 0x00, 0x00, 0x00}, // Z
266 {0x1F, 0x81, 0xF8, 0x18, 0x01, 0x80, 0x18, 0x01, 0x80, 0x18, 0x01, 0x80,
267 0x18, 0x01, 0x80, 0x18, 0x01, 0x80, 0x1F, 0x81, 0xF8, 0x00, 0x00, 0x00}, // [
268 {0x00, 0x04, 0x00, 0x60, 0x07, 0x00, 0x38, 0x01, 0xC0, 0x0E, 0x00, 0x70,
269 0x03, 0x80, 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00}, // /
270 {0x1F, 0x81, 0xF8, 0x01, 0x80, 0x18, 0x01, 0x80, 0x18, 0x01, 0x80, 0x18,
271 0x01, 0x80, 0x18, 0x01, 0x80, 0x18, 0x1F, 0x81, 0xF8, 0x00, 0x00, 0x00}, // ]
272 {0x02, 0x00, 0x70, 0x0F, 0x81, 0xDC, 0x38, 0xE7, 0x07, 0x60, 0x30, 0x00,
273 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // ^
274 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
275 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xF7, 0xFF}, // _
276 {0x00, 0x00, 0x70, 0x07, 0x00, 0x70, 0x06, 0x00, 0x60, 0x03, 0x00, 0x00,
277 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // `
278 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x3F, 0xE0, 0x06,
279 0x1F, 0xE3, 0xFE, 0x60, 0x66, 0x06, 0x7F, 0xE3, 0xFE, 0x00, 0x00, 0x00}, // a
280 {0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0xF8, 0x7F, 0xC7, 0x0E,
281 0x60, 0x66, 0x06, 0x60, 0x66, 0x0E, 0x7F, 0xC7, 0xF8, 0x00, 0x00, 0x00}, // b
282 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x3F, 0xC7, 0x06,
283 0x60, 0x06, 0x00, 0x60, 0x07, 0x06, 0x3F, 0xC1, 0xF8, 0x00, 0x00, 0x00}, // c
284 {0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x61, 0xF6, 0x3F, 0xE7, 0x1E,
285 0x60, 0x66, 0x06, 0x60, 0x67, 0x06, 0x3F, 0xE1, 0xFE, 0x00, 0x00, 0x00}, // d
286 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x3F, 0xC7, 0x06,
287 0x7F, 0xE7, 0xFC, 0x60, 0x07, 0x00, 0x3F, 0xC1, 0xF8, 0x00, 0x00, 0x00}, // e
288 {0x07, 0x80, 0xF8, 0x1C, 0x01, 0x80, 0x18, 0x01, 0x80, 0x7F, 0x07, 0xF0,
289 0x18, 0x01, 0x80, 0x18, 0x01, 0x80, 0x18, 0x01, 0x80, 0x00, 0x00, 0x00}, // f
290 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFE, 0x3F, 0xE7, 0x06,
291 0x60, 0x67, 0x0E, 0x3F, 0xE1, 0xF6, 0x00, 0x60, 0x0E, 0x3F, 0xC3, 0xF8}, // g
292 {0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0xF0, 0x7F, 0x87, 0x1C,
293 0x60, 0xC6, 0x0C, 0x60, 0xC6, 0x0C, 0x60, 0xC6, 0x0C, 0x00, 0x00, 0x00}, // h
294 {0x00, 0x00, 0x00, 0x06, 0x00, 0x60, 0x00, 0x00, 0xE0, 0x0E, 0x00, 0x60,
295 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x1F, 0x81, 0xF8, 0x00, 0x00, 0x00}, // i
296 {0x00, 0x00, 0x00, 0x01, 0x80, 0x18, 0x00, 0x00, 0x38, 0x03, 0x80, 0x18,
297 0x01, 0x80, 0x18, 0x01, 0x80, 0x18, 0x01, 0x81, 0x98, 0x1F, 0x80, 0xF0}, // j
298 {0x30, 0x03, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0x18, 0x33, 0x83, 0x70,
299 0x3E, 0x03, 0xE0, 0x37, 0x03, 0x38, 0x31, 0xC3, 0x0C, 0x00, 0x00, 0x00}, // k
300 {0x0E, 0x00, 0xE0, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60,
301 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x1F, 0x81, 0xF8, 0x00, 0x00, 0x00}, // l
302 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x98, 0x7F, 0xC7, 0xFE,
303 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00}, // m
304 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF8, 0x3F, 0xC3, 0x0E,
305 0x30, 0x63, 0x06, 0x30, 0x63, 0x06, 0x30, 0x63, 0x06, 0x00, 0x00, 0x00}, // n
306 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x3F, 0xC7, 0x0E,
307 0x60, 0x66, 0x06, 0x60, 0x67, 0x0E, 0x3F, 0xC1, 0xF8, 0x00, 0x00, 0x00}, // o
308 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF8, 0x7F, 0xC6, 0x0E,
309 0x60, 0x66, 0x06, 0x70, 0xE7, 0xFC, 0x6F, 0x86, 0x00, 0x60, 0x06, 0x00}, // p
310 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFE, 0x3F, 0xE7, 0x06,
311 0x60, 0x66, 0x06, 0x70, 0xE3, 0xFE, 0x1F, 0x60, 0x06, 0x00, 0x60, 0x06}, // q
312 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x7C, 0x3F, 0xE3, 0x86,
313 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, 0x00, 0x00, 0x00}, // r
314 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x7F, 0x86, 0x00,
315 0x7F, 0x03, 0xF8, 0x01, 0x80, 0x18, 0x7F, 0x83, 0xF0, 0x00, 0x00, 0x00}, // s
316 {0x00, 0x01, 0x80, 0x18, 0x01, 0x80, 0x18, 0x07, 0xF0, 0x7F, 0x01, 0x80,
317 0x18, 0x01, 0x80, 0x18, 0x01, 0x80, 0x1F, 0x80, 0xF8, 0x00, 0x00, 0x00}, // t
318 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x60, 0x66, 0x06,
319 0x60, 0x66, 0x06, 0x60, 0x67, 0x0E, 0x3F, 0xE1, 0xF6, 0x00, 0x00, 0x00}, // u
320 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x60, 0x63, 0x0C,
321 0x30, 0xC1, 0x98, 0x19, 0x80, 0xF0, 0x0F, 0x00, 0x60, 0x00, 0x00, 0x00}, // v
322 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x66, 0x66, 0x66, 0x66,
323 0x66, 0x66, 0x66, 0x6F, 0x63, 0xFC, 0x39, 0xC1, 0x08, 0x00, 0x00, 0x00}, // w
324 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0C, 0x71, 0xC3, 0xB8,
325 0x1F, 0x00, 0xE0, 0x1F, 0x03, 0xB8, 0x71, 0xC6, 0x0C, 0x00, 0x00, 0x00}, // x
326 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0C, 0x30, 0xC1, 0x98,
327 0x19, 0x80, 0xF0, 0x0F, 0x00, 0x60, 0x06, 0x00, 0xC0, 0x0C, 0x01, 0x80}, // y
328 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x7F, 0x80, 0x30,
329 0x06, 0x00, 0xC0, 0x18, 0x03, 0x00, 0x7F, 0xC7, 0xFC, 0x00, 0x00, 0x00}, // z
330 {0x03, 0xC0, 0x7C, 0x0E, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x1C, 0x03, 0x80,
331 0x1C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0E, 0x00, 0x7C, 0x03, 0xC0, 0x00}, // {
332 {0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60,
333 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x00, 0x00, 0x00}, // |
334 {0x3C, 0x03, 0xE0, 0x07, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0x80, 0x1C,
335 0x03, 0x80, 0x30, 0x03, 0x00, 0x30, 0x07, 0x03, 0xE0, 0x3C, 0x00, 0x00}, // }
336 {0x00, 0x00, 0x00, 0x1C, 0x63, 0x6C, 0x63, 0x80, 0x00, 0x00, 0x00, 0x00,
337 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // ~
338 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0xF0, 0x19, 0x83, 0x0C,
339 0x60, 0x66, 0x06, 0x7F, 0xE7, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} // 
340 };
341
342 const uint8_t* get_letter(const u_char letter) const override
343 {
344 if (letter >= 32 and letter < 128)
345 // array starts at ascii 32
346 return BigFont::font[letter - 32];
347 return BigFont::font[1]; // return the char corresponding to '!'
348 }
349
350 inline uint8_t get_height() const override { return 16; };
351 inline uint8_t get_width() const override { return 12; };
352};
353static const BigFont bigFont;
354
356std::pair<const IFont&, float> font_from_scale(const float scale)
357{
358 static constexpr float minScale = 0.1;
359 static constexpr float switchScale = 0.5;
360
361 float trueScale = lmpd_constrain<float>(scale, 0.0f, 1.0f);
362 if (trueScale <= switchScale)
363 {
364 trueScale = lmpd_map(scale, 0.0, switchScale, minScale, 1.0);
365 return {smallFont, trueScale};
366 }
367 else
368 {
369 // map small font size to big font size
370 trueScale =
371 lmpd_map(scale, switchScale, 1.0, smallFont.get_height() / static_cast<float>(bigFont.get_height()), 1.0);
372 return {bigFont, trueScale};
373 }
374}
375
386std::pair<bool, uint8_t> display_letter(const char letter,
387 const int16_t startXIndex,
388 const int16_t startYIndex,
389 const IFont& font,
390 const float scale,
391 const uint32_t color,
392 LampTy& lamp)
393{
394 uint8_t xIndex = 0;
395 uint8_t yIndex = 0;
396
397 bool hasCutoffX = false; // letter was displayed out of screen, or cutout by
398 // the screen (above zero)
399 bool isDisplayedOut = true; // letter was displayed completly out of screen, under zero
400
401 const auto& letterArray = font.get_letter(letter);
402 const uint8_t arrayLen = font.get_arrayLenght();
403 for (uint8_t i = 0; i < arrayLen; i++)
404 {
405 uint8_t letterPart = letterArray[i];
406 // unpack the mask
407 for (uint8_t j = 0; j < 8; ++j)
408 {
409 const int16_t targetX = startXIndex + xIndex * scale;
410 const int16_t targetY = startYIndex + yIndex * scale;
411 const bool isCutoff = targetX > stripXCoordinates or targetY > stripXCoordinates;
412 if (not isCutoff)
413 {
414 const bool shouldSet = (letterPart & 0x80) != 0;
415 if (shouldSet)
416 {
417 if (targetX >= 0 and targetY >= 0)
418 {
419 isDisplayedOut = false;
420 lamp.setPixelColorXY(targetX, targetY, color);
421 }
422 }
423 }
424 else
425 {
426 isDisplayedOut = false;
427 }
428 // store the fact that a letter has been cutoff in the x axis
429 hasCutoffX = hasCutoffX or (targetX > stripXCoordinates);
430
431 // remove the first set bit
432 letterPart = letterPart << 1;
433
434 xIndex++;
435 if (xIndex > font.get_width() - 1)
436 {
437 xIndex = 0;
438 yIndex++;
439 }
440 }
441 }
442
443 if (hasCutoffX)
444 return {isDisplayedOut, 0};
445 return {isDisplayedOut, font.get_width()};
446}
447
448} // namespace __private
449
451{
452 static constexpr float fwidth = LampTy::maxWidthFloat;
453 static constexpr uint16_t width = LampTy::maxWidth;
454 static constexpr uint16_t nbLines = LampTy::maxHeight;
455
467 static bool display(LampTy& lamp,
468 const std::string& text,
469 const std::function<uint32_t(char)>& colorCallback,
470 const int16_t startXIndex = 0,
471 const int16_t startYIndex = 0,
472 float scale = 0.2,
473 const bool paddEnd = false)
474 {
475 const auto& [font, trueScale] = __private::font_from_scale(scale);
476
477 bool lastLetterDisappeared = true;
478 int16_t displayColumn = startXIndex;
479 for (const char& c: text)
480 {
481 const auto& [isLetterDisplayed, charSize] =
482 __private::display_letter(c, displayColumn, startYIndex, font, trueScale, colorCallback(c), lamp);
483 lastLetterDisappeared = isLetterDisplayed;
484 if (charSize == 0) // still some letters to display
485 break;
486 // offset the remaining chars
487 displayColumn += charSize;
488 }
489
490 // animation with padding does not stop until the last letter is gone
491 if (paddEnd)
492 return lastLetterDisappeared;
493
494 return true;
495 }
496};
497
498} // namespace text
499} // namespace lampda::modes::draw
500
501#endif
static T lmpd_map(float x, const float in_min, const float in_max, const float out_min, const float out_max)
Linearly interpolate a number between two numbers.
Definition: utils.h:80
Definition: text_display.hpp:451
static bool display(LampTy &lamp, const std::string &text, const std::function< uint32_t(char)> &colorCallback, const int16_t startXIndex=0, const int16_t startYIndex=0, float scale=0.2, const bool paddEnd=false)
Display a given text string to the led.
Definition: text_display.hpp:467
Definition: text_display.hpp:146
Definition: text_display.hpp:22
Main interface between the user and the hardware of the lamp.
Definition: lamp_type.hpp:114
static constexpr uint16_t maxHeight
(indexable) Height of "pixel space" w/ lamp taken as a LED matrix
Definition: lamp_type.hpp:387
static constexpr float maxWidthFloat
Width as a precise floating point number, equal to stripXCoordinates.
Definition: lamp_type.hpp:369
void LMBD_INLINE setPixelColorXY(uint16_t X, uint16_t Y, uint32_t color)
(indexable) Set the X,Y-th LED color
Definition: lamp_type.hpp:916
static constexpr uint16_t maxWidth
(indexable) Width of "pixel space" w/ lamp taken as a LED matrix
Definition: lamp_type.hpp:366
std::pair< const IFont &, float > font_from_scale(const float scale)
get a font from a [0; 1] scale
Definition: text_display.hpp:356
std::pair< bool, uint8_t > display_letter(const char letter, const int16_t startXIndex, const int16_t startYIndex, const IFont &font, const float scale, const uint32_t color, LampTy &lamp)
Display a single character.
Definition: text_display.hpp:386