/elec/propeller-clock

To get this branch, use:
bzr branch http://bzr.ed.am/elec/propeller-clock
59 by edam
removed ulibc, fixed button, added text rendering
1
/*
2
 * text_renderer.cc
3
 *
4
 * Copyright (C) 2011 Tim Marston <tim@ed.am> and Dan Marston.
5
 *
6
 * This file is part of propeller-clock (hereafter referred to as "this
7
 * program"). See http://ed.am/dev/software/arduino/propeller-clock for more
8
 * information.
9
 *
10
 * This program is free software: you can redistribute it and/or modify
11
 * it under the terms of the GNU Lesser General Public License as published
12
 * by the Free Software Foundation, either version 3 of the License, or
13
 * (at your option) any later version.
14
 *
15
 * This program is distributed in the hope that it will be useful,
16
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18
 * GNU Lesser General Public License for more details.
19
 *
20
 * You should have received a copy of the GNU Lesser General Public License
21
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
22
 */
23
#include "text_renderer.h"
24
#include "config.h"
25
#include "Arduino.h"
26
#include <avr/pgmspace.h>
65 by Tim Marston
removed most OOP/inheritance crap, saved loads of space!
27
#include "common.h"
59 by edam
removed ulibc, fixed button, added text rendering
28
29
60 by edam
remove TextRenderer singleton and save space
30
// cached glyph
31
static char _glyph_cache[ 8 ];
32
33
// the character the current cached glyph is for
34
static char _glyph_cache_char;
35
36
// selected font
37
static int _font = 0;
38
62 by edam
moved some stuf round, created a re-usable pool of message buffers, genericised "modes" for messages
39
// output buffer
40
static unsigned char _output_buffer;
60 by edam
remove TextRenderer singleton and save space
41
42
43
// cache a glyph
44
void cache_glyph( char c )
59 by edam
removed ulibc, fixed button, added text rendering
45
{
46
	static char fonts[][ 66 * 8 ] PROGMEM = {
47
		{ // INVD-A
48
			0x00, 0x7c, 0x7e, 0x12, 0x12, 0x12, 0x7e, 0x7c, // A
49
			0x00, 0x7e, 0x7e, 0x4a, 0x4a, 0x4a, 0x7e, 0x34, // B
50
			0x00, 0x3c, 0x7e, 0x42, 0x42, 0x42, 0x66, 0x24, // C
51
			0x00, 0x7e, 0x7e, 0x42, 0x42, 0x66, 0x3c, 0x18, // D
52
			0x00, 0x7e, 0x7e, 0x4a, 0x4a, 0x4a, 0x42, 0x00, // E
53
			0x00, 0x7e, 0x7e, 0x0a, 0x0a, 0x0a, 0x02, 0x00, // F
54
			0x00, 0x3c, 0x7e, 0x42, 0x52, 0x52, 0x76, 0x34, // G
55
			0x00, 0x7e, 0x7e, 0x08, 0x08, 0x08, 0x7e, 0x7e, // H
56
			0x00, 0x42, 0x42, 0x7e, 0x7e, 0x42, 0x42, 0x00, // I
57
			0x00, 0x30, 0x70, 0x40, 0x40, 0x40, 0x7e, 0x3e, // J
58
			0x00, 0x7e, 0x7e, 0x08, 0x1c, 0x36, 0x62, 0x40, // K
59
			0x00, 0x7e, 0x7e, 0x40, 0x40, 0x40, 0x40, 0x00, // L
60
			0x00, 0x7e, 0x7e, 0x0c, 0x18, 0x0c, 0x7e, 0x7e, // M
61
			0x00, 0x7e, 0x7e, 0x0c, 0x18, 0x30, 0x7e, 0x7e, // N
62
			0x00, 0x3c, 0x7e, 0x42, 0x42, 0x42, 0x7e, 0x3c, // O
63
			0x00, 0x7e, 0x7e, 0x12, 0x12, 0x12, 0x1e, 0x0c, // P
64
			0x00, 0x3c, 0x7e, 0x52, 0x52, 0x62, 0x7e, 0x3c, // Q
65
			0x00, 0x7e, 0x7e, 0x12, 0x12, 0x32, 0x7e, 0x4c, // R
66
			0x00, 0x24, 0x6e, 0x4a, 0x4a, 0x4a, 0x7a, 0x30, // S
67
			0x00, 0x02, 0x02, 0x7e, 0x7e, 0x02, 0x02, 0x00, // T
68
			0x00, 0x3e, 0x7e, 0x40, 0x40, 0x40, 0x7e, 0x3e, // U
69
			0x00, 0x1e, 0x3e, 0x60, 0x40, 0x60, 0x3e, 0x1e, // V
70
			0x00, 0x3e, 0x7e, 0x60, 0x30, 0x60, 0x7e, 0x3e, // W
71
			0x00, 0x42, 0x66, 0x3c, 0x18, 0x3c, 0x66, 0x42, // X
72
			0x02, 0x06, 0x0c, 0x78, 0x78, 0x0c, 0x06, 0x02, // Y
73
			0x00, 0x42, 0x62, 0x72, 0x5a, 0x4e, 0x46, 0x42, // Z
74
			0x00, 0x20, 0x74, 0x54, 0x54, 0x7c, 0x78, 0x00, // a
75
			0x00, 0x00, 0x7e, 0x7e, 0x48, 0x48, 0x78, 0x30, // b
76
			0x00, 0x00, 0x38, 0x7c, 0x44, 0x44, 0x00, 0x00, // c
77
			0x00, 0x30, 0x78, 0x48, 0x48, 0x7e, 0x7e, 0x00, // d
78
			0x00, 0x38, 0x7c, 0x54, 0x54, 0x5c, 0x08, 0x00, // e
79
			0x00, 0x00, 0x7c, 0x7e, 0x0a, 0x02, 0x00, 0x00, // f
80
			0x00, 0x18, 0xbc, 0xa4, 0xa4, 0xfc, 0x7c, 0x00, // g
81
			0x00, 0x7e, 0x7e, 0x08, 0x08, 0x78, 0x70, 0x00, // h
82
			0x00, 0x00, 0x48, 0x7a, 0x7a, 0x40, 0x00, 0x00, // i
83
			0x00, 0x00, 0x40, 0xc0, 0x80, 0xfa, 0x7a, 0x00, // j
84
			0x00, 0x00, 0x7e, 0x7e, 0x10, 0x3c, 0x64, 0x40, // k
85
			0x00, 0x00, 0x00, 0x3e, 0x7e, 0x40, 0x40, 0x00, // l
86
			0x7c, 0x7c, 0x04, 0x78, 0x7c, 0x04, 0x7c, 0x78, // m
87
			0x00, 0x7c, 0x7c, 0x04, 0x04, 0x7c, 0x78, 0x00, // n
88
			0x00, 0x38, 0x7c, 0x44, 0x44, 0x7c, 0x38, 0x00, // o
89
			0x00, 0xfc, 0xfc, 0x24, 0x24, 0x3c, 0x18, 0x00, // p
90
			0x00, 0x18, 0x3c, 0x24, 0x24, 0xfc, 0xfc, 0x80, // q
91
			0x00, 0x00, 0x78, 0x7c, 0x04, 0x04, 0x00, 0x00, // r
92
			0x00, 0x48, 0x5c, 0x54, 0x54, 0x74, 0x20, 0x00, // s
93
			0x00, 0x04, 0x3e, 0x7e, 0x44, 0x44, 0x00, 0x00, // t
94
			0x00, 0x3c, 0x7c, 0x40, 0x40, 0x7c, 0x3c, 0x00, // u
95
			0x00, 0x0c, 0x3c, 0x70, 0x60, 0x3c, 0x0c, 0x00, // v
96
			0x3c, 0x7c, 0x40, 0x30, 0x40, 0x7c, 0x3c, 0x00, // w
97
			0x00, 0x44, 0x6c, 0x38, 0x38, 0x6c, 0x44, 0x00, // x
98
			0x00, 0x1c, 0xbc, 0xa0, 0xa0, 0xfc, 0x7c, 0x00, // y
99
			0x00, 0x44, 0x64, 0x74, 0x5c, 0x4c, 0x44, 0x00, // z
100
			0x00, 0x3c, 0x7e, 0x52, 0x4a, 0x46, 0x7e, 0x3c, // 0
101
			0x00, 0x00, 0x44, 0x44, 0x7e, 0x7e, 0x40, 0x40, // 1
102
			0x00, 0x64, 0x76, 0x52, 0x52, 0x52, 0x5e, 0x4c, // 2
103
			0x00, 0x24, 0x66, 0x42, 0x4a, 0x4a, 0x7e, 0x34, // 3
104
			0x00, 0x30, 0x28, 0x24, 0x7e, 0x7e, 0x20, 0x20, // 4
105
			0x00, 0x2e, 0x6e, 0x4a, 0x4a, 0x4a, 0x7a, 0x32, // 5
106
			0x00, 0x3c, 0x7e, 0x4a, 0x4a, 0x4a, 0x7a, 0x30, // 6
107
			0x00, 0x02, 0x02, 0x62, 0x72, 0x1a, 0x0e, 0x06, // 7
108
			0x00, 0x34, 0x7e, 0x4a, 0x4a, 0x4a, 0x7e, 0x34, // 8
109
			0x00, 0x0c, 0x5e, 0x52, 0x52, 0x52, 0x7e, 0x3c, // 9
110
			0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, // -
111
			0x00, 0x00, 0x00, 0x6c, 0x6c, 0x00, 0x00, 0x00, // :
112
			0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, // .
113
			0x00, 0x00, 0x00, 0x80, 0xe0, 0x60, 0x00, 0x00, // ,
114
		}, { // INVD-D
115
			0x00, 0x7f, 0x7f, 0x09, 0x09, 0x09, 0x7f, 0x7f, // A
116
			0x00, 0x7f, 0x7f, 0x49, 0x49, 0x49, 0x7f, 0x77, // B
117
			0x00, 0x7f, 0x7f, 0x41, 0x41, 0x41, 0x77, 0x77, // C
118
			0x00, 0x7f, 0x7f, 0x41, 0x41, 0x41, 0x7f, 0x3e, // D
119
			0x00, 0x7f, 0x7f, 0x49, 0x49, 0x49, 0x63, 0x63, // E
120
			0x00, 0x7f, 0x7f, 0x09, 0x09, 0x09, 0x03, 0x03, // F
121
			0x00, 0x7f, 0x7f, 0x41, 0x49, 0x49, 0x7b, 0x7b, // G
122
			0x00, 0x7f, 0x7f, 0x08, 0x08, 0x08, 0x7f, 0x7f, // H
123
			0x00, 0x41, 0x41, 0x7f, 0x7f, 0x41, 0x41, 0x00, // I
124
			0x00, 0x60, 0x60, 0x40, 0x40, 0x40, 0x7f, 0x7f, // J
125
			0x00, 0x7f, 0x7f, 0x08, 0x08, 0x08, 0x7f, 0x77, // K
126
			0x00, 0x7f, 0x7f, 0x40, 0x40, 0x40, 0x60, 0x60, // L
127
			0x00, 0x7f, 0x7f, 0x02, 0x04, 0x02, 0x7f, 0x7f, // M
128
			0x00, 0x7f, 0x7f, 0x06, 0x0c, 0x18, 0x7f, 0x7f, // N
129
			0x00, 0x7f, 0x7f, 0x41, 0x41, 0x41, 0x7f, 0x7f, // O
130
			0x00, 0x7f, 0x7f, 0x09, 0x09, 0x09, 0x0f, 0x0f, // P
131
			0x00, 0x7f, 0x7f, 0x41, 0x51, 0x21, 0x7f, 0x7f, // Q
132
			0x00, 0x7f, 0x7f, 0x09, 0x09, 0x09, 0x7f, 0x77, // R
133
			0x00, 0x6f, 0x6f, 0x49, 0x49, 0x49, 0x7b, 0x7b, // S
134
			0x00, 0x01, 0x01, 0x7f, 0x7f, 0x01, 0x01, 0x00, // T
135
			0x00, 0x7f, 0x7f, 0x40, 0x40, 0x40, 0x7f, 0x7f, // U
136
			0x00, 0x1f, 0x3f, 0x60, 0x40, 0x60, 0x3f, 0x1f, // V
137
			0x00, 0x7f, 0x7f, 0x20, 0x10, 0x20, 0x7f, 0x7f, // W
138
			0x00, 0x77, 0x7f, 0x08, 0x08, 0x08, 0x7f, 0x77, // X
139
			0x00, 0x6f, 0x6f, 0x48, 0x48, 0x48, 0x7f, 0x7f, // Y
140
			0x00, 0x63, 0x73, 0x59, 0x4d, 0x47, 0x63, 0x61, // Z
141
			0x00, 0x74, 0x74, 0x54, 0x54, 0x7c, 0x7c, 0x00, // a
142
			0x00, 0x7f, 0x7f, 0x44, 0x44, 0x7c, 0x7c, 0x00, // b
143
			0x00, 0x7c, 0x7c, 0x44, 0x44, 0x6c, 0x6c, 0x00, // c
144
			0x00, 0x7c, 0x7c, 0x44, 0x44, 0x7f, 0x7f, 0x00, // d
145
			0x00, 0x7c, 0x7c, 0x54, 0x54, 0x5c, 0x5c, 0x00, // e
146
			0x00, 0x00, 0x04, 0x7f, 0x7f, 0x05, 0x05, 0x01, // f
147
			0x00, 0xbc, 0xbc, 0xa4, 0xa4, 0xfc, 0xfc, 0x00, // g
148
			0x00, 0x7f, 0x7f, 0x04, 0x04, 0x7c, 0x7c, 0x00, // h
149
			0x00, 0x44, 0x44, 0x7d, 0x7d, 0x40, 0x40, 0x00, // i
150
			0x00, 0x80, 0x80, 0xfd, 0xfd, 0x00, 0x00, 0x00, // j
151
			0x00, 0x7f, 0x7f, 0x10, 0x10, 0x7c, 0x6c, 0x00, // k
152
			0x00, 0x00, 0x00, 0x7f, 0x7f, 0x40, 0x40, 0x00, // l
153
			0x00, 0x7c, 0x7c, 0x04, 0x7c, 0x04, 0x7c, 0x7c, // m
154
			0x00, 0x7c, 0x7c, 0x04, 0x04, 0x7c, 0x7c, 0x00, // n
155
			0x00, 0x7c, 0x7c, 0x44, 0x44, 0x7c, 0x7c, 0x00, // o
156
			0x00, 0xfc, 0xfc, 0x24, 0x24, 0x3c, 0x3c, 0x00, // p
157
			0x00, 0x3c, 0x3c, 0x24, 0x24, 0xfc, 0xfc, 0x00, // q
158
			0x00, 0x7c, 0x7c, 0x04, 0x04, 0x0c, 0x0c, 0x00, // r
159
			0x00, 0x5c, 0x5c, 0x54, 0x54, 0x74, 0x74, 0x00, // s
160
			0x00, 0x00, 0x04, 0x7f, 0x7f, 0x44, 0x44, 0x00, // t
161
			0x00, 0x7c, 0x7c, 0x40, 0x40, 0x7c, 0x7c, 0x00, // u
162
			0x00, 0x1c, 0x3c, 0x60, 0x60, 0x3c, 0x1c, 0x00, // v
163
			0x00, 0x7c, 0x7c, 0x40, 0x7c, 0x40, 0x7c, 0x7c, // w
164
			0x00, 0x6c, 0x7c, 0x10, 0x10, 0x7c, 0x6c, 0x00, // x
165
			0x00, 0xbc, 0xbc, 0xa0, 0xa0, 0xfc, 0xfc, 0x00, // y
166
			0x00, 0x64, 0x74, 0x54, 0x54, 0x5c, 0x4c, 0x00, // z
167
			0x00, 0x7f, 0x7f, 0x51, 0x49, 0x45, 0x7f, 0x7f, // 0
168
			0x00, 0x41, 0x41, 0x7f, 0x7f, 0x40, 0x40, 0x00, // 1
169
			0x00, 0x7b, 0x7b, 0x49, 0x49, 0x49, 0x4f, 0x4f, // 2
170
			0x00, 0x63, 0x63, 0x49, 0x49, 0x49, 0x7f, 0x7f, // 3
171
			0x00, 0x1f, 0x1f, 0x10, 0x10, 0x7f, 0x7f, 0x10, // 4
172
			0x00, 0x6f, 0x6f, 0x49, 0x49, 0x49, 0x79, 0x79, // 5
173
			0x00, 0x7f, 0x7f, 0x49, 0x49, 0x49, 0x7b, 0x7b, // 6
174
			0x00, 0x03, 0x03, 0x71, 0x79, 0x0d, 0x07, 0x03, // 7
175
			0x00, 0x7f, 0x7f, 0x49, 0x49, 0x49, 0x7f, 0x7f, // 8
176
			0x00, 0x6f, 0x6f, 0x49, 0x49, 0x49, 0x7f, 0x7f, // 9
177
			0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, // -
178
			0x00, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, // :
179
			0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, // .
180
			0x00, 0x00, 0x80, 0xe0, 0x60, 0x00, 0x00, 0x00, // ,
181
		}, { // INVD-G
182
			0x7c, 0x7e, 0x22, 0x7e, 0x7e, 0x7e, 0x7c, 0x00, // A
183
			0x7c, 0x7e, 0x7e, 0x7e, 0x4a, 0x7e, 0x34, 0x00, // B
184
			0x3c, 0x7e, 0x7e, 0x7e, 0x42, 0x76, 0x34, 0x00, // C
185
			0x7c, 0x7e, 0x7e, 0x7e, 0x42, 0x7e, 0x3c, 0x00, // D
186
			0x3c, 0x7e, 0x7e, 0x7e, 0x4a, 0x4a, 0x00, 0x00, // E
187
			0x7c, 0x7e, 0x7e, 0x7e, 0x12, 0x12, 0x00, 0x00, // F
188
			0x3c, 0x7e, 0x7e, 0x7e, 0x52, 0x76, 0x34, 0x00, // G
189
			0x7e, 0x7e, 0x7e, 0x7e, 0x08, 0x7e, 0x7e, 0x00, // H
190
			0x00, 0x42, 0x7e, 0x7e, 0x7e, 0x7e, 0x42, 0x00, // I
191
			0x30, 0x70, 0x42, 0x7e, 0x7e, 0x7e, 0x3e, 0x00, // J
192
			0x7e, 0x7e, 0x7e, 0x7e, 0x08, 0x76, 0x62, 0x00, // K
193
			0x00, 0x3e, 0x7e, 0x7e, 0x7e, 0x40, 0x40, 0x00, // L
194
			0x7e, 0x7e, 0x7e, 0x7c, 0x08, 0x7c, 0x7e, 0x00, // M
195
			0x7e, 0x7e, 0x7e, 0x7c, 0x08, 0x7e, 0x7e, 0x00, // N
196
			0x3c, 0x7e, 0x7e, 0x7e, 0x42, 0x7e, 0x3c, 0x00, // O
197
			0x7c, 0x7e, 0x7e, 0x7e, 0x12, 0x1e, 0x0c, 0x00, // P
198
			0x3c, 0x7e, 0x7e, 0x7e, 0x42, 0xfe, 0xbc, 0x00, // Q
199
			0x7c, 0x7e, 0x7e, 0x7e, 0x12, 0x7e, 0x6c, 0x00, // R
200
			0x24, 0x6e, 0x5e, 0x7e, 0x7a, 0x76, 0x24, 0x00, // S
201
			0x00, 0x02, 0x7e, 0x7e, 0x7e, 0x7e, 0x02, 0x00, // T
202
			0x3e, 0x7e, 0x7e, 0x7e, 0x40, 0x7e, 0x3e, 0x00, // U
203
			0x1e, 0x3e, 0x7e, 0x7e, 0x40, 0x3e, 0x1e, 0x00, // V
204
			0x3e, 0x7e, 0x7e, 0x7e, 0x20, 0x7e, 0x3e, 0x00, // W
205
			0x42, 0x66, 0x3e, 0x7e, 0x7c, 0x66, 0x42, 0x00, // X
206
			0x06, 0x0e, 0x7e, 0x7e, 0x70, 0x0e, 0x06, 0x00, // Y
207
			0x62, 0x72, 0x7a, 0x7e, 0x5e, 0x4e, 0x46, 0x00, // Z
208
			0x38, 0x7c, 0x44, 0x3c, 0x7c, 0x7c, 0x78, 0x00, // a
209
			0x3f, 0x7f, 0x7f, 0x7f, 0x44, 0x7c, 0x38, 0x00, // b
210
			0x38, 0x7c, 0x7c, 0x7c, 0x44, 0x6c, 0x28, 0x00, // c
211
			0x38, 0x7c, 0x44, 0x3f, 0x7f, 0x7f, 0x7f, 0x00, // d
212
			0x38, 0x7c, 0x7c, 0x7c, 0x54, 0x5c, 0x28, 0x00, // e
213
			0x88, 0xfe, 0xff, 0xff, 0x7f, 0x09, 0x0a, 0x00, // f
214
			0x58, 0xbc, 0xa4, 0xfc, 0xfc, 0xfc, 0x78, 0x00, // g
215
			0x7f, 0x7f, 0x7f, 0x7f, 0x04, 0x7c, 0x78, 0x00, // h
216
			0x00, 0x00, 0x7a, 0x7f, 0x7f, 0x7a, 0x00, 0x00, // i
217
			0x00, 0x80, 0xfa, 0xff, 0xff, 0x7a, 0x00, 0x00, // j
218
			0x7f, 0x7f, 0x7f, 0x7f, 0x24, 0x7c, 0x58, 0x00, // k
219
			0x00, 0x00, 0x3f, 0x7f, 0x7f, 0x7f, 0x40, 0x00, // l
220
			0x78, 0x7c, 0x7c, 0x04, 0x7c, 0x04, 0x7c, 0x78, // m
221
			0x7c, 0x7c, 0x7c, 0x78, 0x04, 0x7c, 0x78, 0x00, // n
222
			0x38, 0x7c, 0x7c, 0x7c, 0x44, 0x7c, 0x38, 0x00, // o
223
			0xfc, 0xfc, 0xfc, 0xf8, 0x44, 0x7c, 0x38, 0x00, // p
224
			0x38, 0x7c, 0x44, 0xfc, 0xfc, 0xfc, 0xf8, 0x00, // q
225
			0x7c, 0x7c, 0x7c, 0x7c, 0x04, 0x0c, 0x08, 0x00, // r
226
			0x28, 0x5c, 0x5c, 0x7c, 0x74, 0x74, 0x28, 0x00, // s
227
			0x04, 0x3e, 0x7e, 0x7e, 0x7e, 0x44, 0x24, 0x00, // t
228
			0x3c, 0x7c, 0x40, 0x3c, 0x7c, 0x7c, 0x7c, 0x00, // u
229
			0x1c, 0x3c, 0x7c, 0x7c, 0x60, 0x3c, 0x1c, 0x00, // v
230
			0x3c, 0x7c, 0x7c, 0x40, 0x7c, 0x40, 0x7c, 0x3c, // w
231
			0x44, 0x6c, 0x3c, 0x7c, 0x78, 0x6c, 0x44, 0x00, // x
232
			0x9c, 0xbc, 0xfc, 0xfc, 0x60, 0x3c, 0x1c, 0x00, // y
233
			0x64, 0x74, 0x3c, 0x7c, 0x5c, 0x4c, 0x24, 0x00, // z
234
			0x3c, 0x7e, 0x42, 0x7e, 0x7e, 0x7e, 0x3c, 0x00, // 0
235
			0x00, 0x42, 0x7e, 0x7e, 0x7e, 0x7e, 0x40, 0x00, // 1
236
			0x64, 0x72, 0x7a, 0x7e, 0x5e, 0x4e, 0x44, 0x00, // 2
237
			0x24, 0x66, 0x4a, 0x7e, 0x7e, 0x7e, 0x34, 0x00, // 3
238
			0x0e, 0x1e, 0x10, 0x7e, 0x7e, 0x7e, 0x7e, 0x00, // 4
239
			0x2e, 0x6e, 0x4e, 0x7a, 0x7a, 0x7a, 0x32, 0x00, // 5
240
			0x3c, 0x7e, 0x7e, 0x7e, 0x4a, 0x7a, 0x34, 0x00, // 6
241
			0x02, 0x62, 0x7a, 0x7e, 0x7e, 0x1e, 0x06, 0x00, // 7
242
			0x34, 0x7e, 0x4e, 0x7e, 0x7a, 0x7e, 0x34, 0x00, // 8
243
			0x2c, 0x5e, 0x52, 0x7e, 0x7e, 0x7e, 0x3c, 0x00, // 9
244
			0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, // -
245
			0x00, 0x00, 0x28, 0x7c, 0x7c, 0x28, 0x00, 0x00, // :
246
			0x00, 0x00, 0x30, 0x78, 0x78, 0x30, 0x00, 0x00, // .
247
			0x00, 0x00, 0x10, 0xb8, 0xf8, 0x70, 0x00, 0x00, // ,
248
		}, { // INVD-B
249
			0x00, 0x78, 0x7f, 0x09, 0x09, 0x0f, 0x78, 0x00, // A
250
			0x00, 0x7f, 0x79, 0x49, 0x49, 0x4f, 0x78, 0x00, // B
251
			0x00, 0x7f, 0x79, 0x41, 0x41, 0x41, 0x63, 0x00, // C
252
			0x00, 0x7f, 0x79, 0x41, 0x41, 0x41, 0x7f, 0x00, // D
253
			0x00, 0x00, 0x7f, 0x79, 0x49, 0x49, 0x41, 0x00, // E
254
			0x00, 0x00, 0x7f, 0x79, 0x09, 0x09, 0x01, 0x00, // F
255
			0x00, 0x7f, 0x79, 0x41, 0x41, 0x49, 0x7b, 0x00, // G
256
			0x00, 0x7f, 0x78, 0x08, 0x08, 0x08, 0x7f, 0x00, // H
257
			0x00, 0x00, 0x00, 0x7f, 0x78, 0x00, 0x00, 0x00, // I
258
			0x00, 0x60, 0x40, 0x40, 0x40, 0x7f, 0x78, 0x00, // J
259
			0x00, 0x7f, 0x78, 0x08, 0x08, 0x0f, 0x78, 0x00, // K
260
			0x00, 0x00, 0x7f, 0x78, 0x40, 0x40, 0x40, 0x00, // L
261
			0x00, 0x7f, 0x79, 0x01, 0x7f, 0x01, 0x7f, 0x00, // M
262
			0x00, 0x7f, 0x79, 0x01, 0x01, 0x01, 0x7f, 0x00, // N
263
			0x00, 0x7f, 0x41, 0x41, 0x41, 0x43, 0x7f, 0x00, // O
264
			0x00, 0x7f, 0x79, 0x09, 0x09, 0x09, 0x0f, 0x00, // P
265
			0x00, 0x7f, 0x41, 0x41, 0x61, 0x61, 0x7f, 0x00, // Q
266
			0x00, 0x7f, 0x79, 0x09, 0x09, 0x0f, 0x78, 0x00, // R
267
			0x00, 0x6f, 0x49, 0x49, 0x49, 0x79, 0x7b, 0x00, // S
268
			0x00, 0x01, 0x01, 0x7f, 0x79, 0x01, 0x01, 0x00, // T
269
			0x00, 0x7f, 0x78, 0x40, 0x40, 0x40, 0x7f, 0x00, // U
270
			0x00, 0x0f, 0x7f, 0x40, 0x40, 0x78, 0x0f, 0x00, // V
271
			0x00, 0x7f, 0x78, 0x40, 0x7f, 0x40, 0x7f, 0x00, // W
272
			0x00, 0x77, 0x78, 0x08, 0x08, 0x08, 0x77, 0x00, // X
273
			0x00, 0x0f, 0x08, 0x78, 0x78, 0x08, 0x0f, 0x00, // Y
274
			0x00, 0x7b, 0x79, 0x49, 0x49, 0x49, 0x6f, 0x00, // Z
275
			0x00, 0x74, 0x74, 0x54, 0x54, 0x7c, 0x00, 0x00, // a
276
			0x00, 0x7f, 0x74, 0x44, 0x44, 0x7c, 0x00, 0x00, // b
277
			0x00, 0x7c, 0x74, 0x44, 0x44, 0x6c, 0x00, 0x00, // c
278
			0x00, 0x7c, 0x74, 0x44, 0x44, 0x7f, 0x00, 0x00, // d
279
			0x00, 0x7c, 0x74, 0x54, 0x54, 0x5c, 0x00, 0x00, // e
280
			0x00, 0x00, 0x04, 0x7f, 0x75, 0x01, 0x00, 0x00, // f
281
			0x00, 0xbc, 0xb4, 0xa4, 0xa4, 0xfc, 0x00, 0x00, // g
282
			0x00, 0x7f, 0x74, 0x04, 0x04, 0x7c, 0x00, 0x00, // h
283
			0x00, 0x00, 0x00, 0x7d, 0x71, 0x00, 0x00, 0x00, // i
284
			0x00, 0x00, 0x80, 0xbd, 0xf1, 0x00, 0x00, 0x00, // j
285
			0x00, 0x7f, 0x70, 0x10, 0x1c, 0x70, 0x00, 0x00, // k
286
			0x00, 0x00, 0x00, 0x7f, 0x78, 0x00, 0x00, 0x00, // l
287
			0x00, 0x7c, 0x74, 0x04, 0x7c, 0x04, 0x7c, 0x00, // m
288
			0x00, 0x7c, 0x74, 0x04, 0x04, 0x7c, 0x00, 0x00, // n
289
			0x00, 0x7c, 0x74, 0x44, 0x44, 0x7c, 0x00, 0x00, // o
290
			0x00, 0xfc, 0x34, 0x24, 0x24, 0x3c, 0x00, 0x00, // p
291
			0x00, 0x3c, 0x34, 0x24, 0x24, 0xfc, 0x00, 0x00, // q
292
			0x00, 0x00, 0x7c, 0x74, 0x04, 0x04, 0x00, 0x00, // r
293
			0x00, 0x5c, 0x54, 0x54, 0x74, 0x74, 0x00, 0x00, // s
294
			0x00, 0x00, 0x04, 0x7f, 0x74, 0x00, 0x00, 0x00, // t
295
			0x00, 0x7c, 0x70, 0x40, 0x40, 0x7c, 0x00, 0x00, // u
296
			0x00, 0x1c, 0x7c, 0x40, 0x70, 0x1c, 0x00, 0x00, // v
297
			0x00, 0x7c, 0x70, 0x40, 0x7c, 0x40, 0x7c, 0x00, // w
298
			0x00, 0x6c, 0x70, 0x10, 0x10, 0x6c, 0x00, 0x00, // x
299
			0x00, 0xbc, 0xb0, 0xa0, 0xa0, 0xfc, 0x00, 0x00, // y
300
			0x00, 0x74, 0x74, 0x54, 0x54, 0x5c, 0x00, 0x00, // z
301
			0x00, 0x7f, 0x41, 0x41, 0x41, 0x79, 0x7f, 0x00, // 0
302
			0x00, 0x00, 0x00, 0x78, 0x7f, 0x00, 0x00, 0x00, // 1
303
			0x00, 0x7b, 0x79, 0x49, 0x49, 0x49, 0x4f, 0x00, // 2
304
			0x00, 0x63, 0x49, 0x49, 0x49, 0x7f, 0x78, 0x00, // 3
305
			0x00, 0x1f, 0x11, 0x11, 0x71, 0x7f, 0x10, 0x00, // 4
306
			0x00, 0x6f, 0x49, 0x49, 0x49, 0x79, 0x79, 0x00, // 5
307
			0x00, 0x7f, 0x49, 0x49, 0x49, 0x79, 0x7b, 0x00, // 6
308
			0x00, 0x01, 0x01, 0x01, 0x79, 0x7f, 0x00, 0x00, // 7
309
			0x00, 0x78, 0x4f, 0x49, 0x49, 0x7f, 0x78, 0x00, // 8
310
			0x00, 0x1f, 0x11, 0x11, 0x11, 0x71, 0x7f, 0x00, // 9
311
			0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, // -
312
			0x00, 0x00, 0x00, 0x6c, 0x6c, 0x00, 0x00, 0x00, // :
313
			0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, // .
314
			0x00, 0x00, 0x00, 0x60, 0xe0, 0x00, 0x00, 0x00, // ,
315
		}
316
	};
317
60 by edam
remove TextRenderer singleton and save space
318
	// nothing to do?
319
	if( c == _glyph_cache_char )
320
		return;
321
	_glyph_cache_char = c;
322
323
	// find glyph data position
59 by edam
removed ulibc, fixed button, added text rendering
324
	int pos;
325
	if( c >= 'A' && c <= 'Z' )
326
		pos = c - 'A';
327
	else if( c >= 'a' && c <= 'z' )
328
		pos = c - 'a' + 26;
329
	else if( c >= '0' && c <= '9' )
330
		pos = c - '0' + 52;
331
	else if( c == '-' )
332
		pos = 62;
333
	else if( c == ':' )
334
		pos = 63;
335
	else if( c == '.' )
336
		pos = 64;
337
	else if( c == ',' )
338
		pos = 65;
339
	else
340
		pos = -1;
341
60 by edam
remove TextRenderer singleton and save space
342
	// space? or copy glyph from progmem?
59 by edam
removed ulibc, fixed button, added text rendering
343
	if( pos == -1 )
60 by edam
remove TextRenderer singleton and save space
344
		memset( _glyph_cache, 0, 8 );
345
	else
346
		memcpy_P( _glyph_cache, &( fonts[ _font ][ pos * 8 ] ), 8 );
347
}
348
349
62 by edam
moved some stuf round, created a re-usable pool of message buffers, genericised "modes" for messages
350
int TextRenderer::get_width( int message_len )
60 by edam
remove TextRenderer singleton and save space
351
{
62 by edam
moved some stuf round, created a re-usable pool of message buffers, genericised "modes" for messages
352
	return message_len * 8 * TEXT_SCALE;
60 by edam
remove TextRenderer singleton and save space
353
}
354
355
62 by edam
moved some stuf round, created a re-usable pool of message buffers, genericised "modes" for messages
356
void TextRenderer::render( const char *message, int message_len, int x,
357
						   bool y_flip, int y_shift )
60 by edam
remove TextRenderer singleton and save space
358
{
62 by edam
moved some stuf round, created a re-usable pool of message buffers, genericised "modes" for messages
359
	char glyph_col = 0;
360
60 by edam
remove TextRenderer singleton and save space
361
	// handle negative x
62 by edam
moved some stuf round, created a re-usable pool of message buffers, genericised "modes" for messages
362
	if( x >= 0 )
363
	{
364
		// scale font
365
		x /= TEXT_SCALE;
366
367
		int pos = x / 8;
368
		if( pos < message_len )
369
		{
370
			// ensure correct glyph is cached and pull out colun of data
371
			cache_glyph( message[ pos ] );
372
			glyph_col = _glyph_cache[ x % 8 ];
373
		}
60 by edam
remove TextRenderer singleton and save space
374
	}
375
376
	// draw a column
62 by edam
moved some stuf round, created a re-usable pool of message buffers, genericised "modes" for messages
377
	if( y_flip )
63 by edam
widenned clock hands, tweaked scales, got top & bottom text modes working
378
		for( int a = 7; a >= 0; a-- ) {
379
			if( glyph_col & 1 )
380
				_output_buffer |= 1 << ( a + y_shift );
381
			glyph_col >>= 1;
382
		}
383
	else
62 by edam
moved some stuf round, created a re-usable pool of message buffers, genericised "modes" for messages
384
		for( int a = 0; a < 8; a++ ) {
385
			if( glyph_col & 1 )
386
				_output_buffer |= 1 << ( a + y_shift );
387
			glyph_col >>= 1;
388
		}
389
}
390
391
392
void TextRenderer::reset_buffer()
393
{
394
	_output_buffer = 0;
395
}
396
397
398
void TextRenderer::output_buffer()
399
{
400
	for( int a = 8; a >= 0; a-- ) {
65 by Tim Marston
removed most OOP/inheritance crap, saved loads of space!
401
		led( a, ( _output_buffer & 1 )? true : false );
62 by edam
moved some stuf round, created a re-usable pool of message buffers, genericised "modes" for messages
402
		_output_buffer >>= 1;
403
	}
404
	_output_buffer = 0;
59 by edam
removed ulibc, fixed button, added text rendering
405
}
63 by edam
widenned clock hands, tweaked scales, got top & bottom text modes working
406
407
408
void TextRenderer::select_font( int font_num )
409
{
410
	_font = font_num;
411
}