/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
71 by Tim Marston
added time set mode, made text renderer's buffer auto reset/output
42
// does buffer need rendering?
43
static bool _need_render;
44
60 by edam
remove TextRenderer singleton and save space
45
46
// cache a glyph
47
void cache_glyph( char c )
59 by edam
removed ulibc, fixed button, added text rendering
48
{
49
	static char fonts[][ 66 * 8 ] PROGMEM = {
50
		{ // INVD-A
51
			0x00, 0x7c, 0x7e, 0x12, 0x12, 0x12, 0x7e, 0x7c, // A
52
			0x00, 0x7e, 0x7e, 0x4a, 0x4a, 0x4a, 0x7e, 0x34, // B
53
			0x00, 0x3c, 0x7e, 0x42, 0x42, 0x42, 0x66, 0x24, // C
54
			0x00, 0x7e, 0x7e, 0x42, 0x42, 0x66, 0x3c, 0x18, // D
55
			0x00, 0x7e, 0x7e, 0x4a, 0x4a, 0x4a, 0x42, 0x00, // E
56
			0x00, 0x7e, 0x7e, 0x0a, 0x0a, 0x0a, 0x02, 0x00, // F
57
			0x00, 0x3c, 0x7e, 0x42, 0x52, 0x52, 0x76, 0x34, // G
58
			0x00, 0x7e, 0x7e, 0x08, 0x08, 0x08, 0x7e, 0x7e, // H
59
			0x00, 0x42, 0x42, 0x7e, 0x7e, 0x42, 0x42, 0x00, // I
60
			0x00, 0x30, 0x70, 0x40, 0x40, 0x40, 0x7e, 0x3e, // J
61
			0x00, 0x7e, 0x7e, 0x08, 0x1c, 0x36, 0x62, 0x40, // K
62
			0x00, 0x7e, 0x7e, 0x40, 0x40, 0x40, 0x40, 0x00, // L
63
			0x00, 0x7e, 0x7e, 0x0c, 0x18, 0x0c, 0x7e, 0x7e, // M
64
			0x00, 0x7e, 0x7e, 0x0c, 0x18, 0x30, 0x7e, 0x7e, // N
65
			0x00, 0x3c, 0x7e, 0x42, 0x42, 0x42, 0x7e, 0x3c, // O
66
			0x00, 0x7e, 0x7e, 0x12, 0x12, 0x12, 0x1e, 0x0c, // P
67
			0x00, 0x3c, 0x7e, 0x52, 0x52, 0x62, 0x7e, 0x3c, // Q
68
			0x00, 0x7e, 0x7e, 0x12, 0x12, 0x32, 0x7e, 0x4c, // R
69
			0x00, 0x24, 0x6e, 0x4a, 0x4a, 0x4a, 0x7a, 0x30, // S
70
			0x00, 0x02, 0x02, 0x7e, 0x7e, 0x02, 0x02, 0x00, // T
71
			0x00, 0x3e, 0x7e, 0x40, 0x40, 0x40, 0x7e, 0x3e, // U
72
			0x00, 0x1e, 0x3e, 0x60, 0x40, 0x60, 0x3e, 0x1e, // V
73
			0x00, 0x3e, 0x7e, 0x60, 0x30, 0x60, 0x7e, 0x3e, // W
74
			0x00, 0x42, 0x66, 0x3c, 0x18, 0x3c, 0x66, 0x42, // X
75
			0x02, 0x06, 0x0c, 0x78, 0x78, 0x0c, 0x06, 0x02, // Y
76
			0x00, 0x42, 0x62, 0x72, 0x5a, 0x4e, 0x46, 0x42, // Z
77
			0x00, 0x20, 0x74, 0x54, 0x54, 0x7c, 0x78, 0x00, // a
78
			0x00, 0x00, 0x7e, 0x7e, 0x48, 0x48, 0x78, 0x30, // b
79
			0x00, 0x00, 0x38, 0x7c, 0x44, 0x44, 0x00, 0x00, // c
80
			0x00, 0x30, 0x78, 0x48, 0x48, 0x7e, 0x7e, 0x00, // d
81
			0x00, 0x38, 0x7c, 0x54, 0x54, 0x5c, 0x08, 0x00, // e
82
			0x00, 0x00, 0x7c, 0x7e, 0x0a, 0x02, 0x00, 0x00, // f
83
			0x00, 0x18, 0xbc, 0xa4, 0xa4, 0xfc, 0x7c, 0x00, // g
84
			0x00, 0x7e, 0x7e, 0x08, 0x08, 0x78, 0x70, 0x00, // h
85
			0x00, 0x00, 0x48, 0x7a, 0x7a, 0x40, 0x00, 0x00, // i
86
			0x00, 0x00, 0x40, 0xc0, 0x80, 0xfa, 0x7a, 0x00, // j
87
			0x00, 0x00, 0x7e, 0x7e, 0x10, 0x3c, 0x64, 0x40, // k
88
			0x00, 0x00, 0x00, 0x3e, 0x7e, 0x40, 0x40, 0x00, // l
89
			0x7c, 0x7c, 0x04, 0x78, 0x7c, 0x04, 0x7c, 0x78, // m
90
			0x00, 0x7c, 0x7c, 0x04, 0x04, 0x7c, 0x78, 0x00, // n
91
			0x00, 0x38, 0x7c, 0x44, 0x44, 0x7c, 0x38, 0x00, // o
92
			0x00, 0xfc, 0xfc, 0x24, 0x24, 0x3c, 0x18, 0x00, // p
93
			0x00, 0x18, 0x3c, 0x24, 0x24, 0xfc, 0xfc, 0x80, // q
94
			0x00, 0x00, 0x78, 0x7c, 0x04, 0x04, 0x00, 0x00, // r
95
			0x00, 0x48, 0x5c, 0x54, 0x54, 0x74, 0x20, 0x00, // s
96
			0x00, 0x04, 0x3e, 0x7e, 0x44, 0x44, 0x00, 0x00, // t
97
			0x00, 0x3c, 0x7c, 0x40, 0x40, 0x7c, 0x3c, 0x00, // u
98
			0x00, 0x0c, 0x3c, 0x70, 0x60, 0x3c, 0x0c, 0x00, // v
99
			0x3c, 0x7c, 0x40, 0x30, 0x40, 0x7c, 0x3c, 0x00, // w
100
			0x00, 0x44, 0x6c, 0x38, 0x38, 0x6c, 0x44, 0x00, // x
101
			0x00, 0x1c, 0xbc, 0xa0, 0xa0, 0xfc, 0x7c, 0x00, // y
102
			0x00, 0x44, 0x64, 0x74, 0x5c, 0x4c, 0x44, 0x00, // z
103
			0x00, 0x3c, 0x7e, 0x52, 0x4a, 0x46, 0x7e, 0x3c, // 0
104
			0x00, 0x00, 0x44, 0x44, 0x7e, 0x7e, 0x40, 0x40, // 1
105
			0x00, 0x64, 0x76, 0x52, 0x52, 0x52, 0x5e, 0x4c, // 2
106
			0x00, 0x24, 0x66, 0x42, 0x4a, 0x4a, 0x7e, 0x34, // 3
107
			0x00, 0x30, 0x28, 0x24, 0x7e, 0x7e, 0x20, 0x20, // 4
108
			0x00, 0x2e, 0x6e, 0x4a, 0x4a, 0x4a, 0x7a, 0x32, // 5
109
			0x00, 0x3c, 0x7e, 0x4a, 0x4a, 0x4a, 0x7a, 0x30, // 6
110
			0x00, 0x02, 0x02, 0x62, 0x72, 0x1a, 0x0e, 0x06, // 7
111
			0x00, 0x34, 0x7e, 0x4a, 0x4a, 0x4a, 0x7e, 0x34, // 8
112
			0x00, 0x0c, 0x5e, 0x52, 0x52, 0x52, 0x7e, 0x3c, // 9
113
			0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, // -
114
			0x00, 0x00, 0x00, 0x6c, 0x6c, 0x00, 0x00, 0x00, // :
115
			0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, // .
116
			0x00, 0x00, 0x00, 0x80, 0xe0, 0x60, 0x00, 0x00, // ,
117
		}, { // INVD-D
118
			0x00, 0x7f, 0x7f, 0x09, 0x09, 0x09, 0x7f, 0x7f, // A
119
			0x00, 0x7f, 0x7f, 0x49, 0x49, 0x49, 0x7f, 0x77, // B
120
			0x00, 0x7f, 0x7f, 0x41, 0x41, 0x41, 0x77, 0x77, // C
121
			0x00, 0x7f, 0x7f, 0x41, 0x41, 0x41, 0x7f, 0x3e, // D
122
			0x00, 0x7f, 0x7f, 0x49, 0x49, 0x49, 0x63, 0x63, // E
123
			0x00, 0x7f, 0x7f, 0x09, 0x09, 0x09, 0x03, 0x03, // F
124
			0x00, 0x7f, 0x7f, 0x41, 0x49, 0x49, 0x7b, 0x7b, // G
125
			0x00, 0x7f, 0x7f, 0x08, 0x08, 0x08, 0x7f, 0x7f, // H
126
			0x00, 0x41, 0x41, 0x7f, 0x7f, 0x41, 0x41, 0x00, // I
127
			0x00, 0x60, 0x60, 0x40, 0x40, 0x40, 0x7f, 0x7f, // J
128
			0x00, 0x7f, 0x7f, 0x08, 0x08, 0x08, 0x7f, 0x77, // K
129
			0x00, 0x7f, 0x7f, 0x40, 0x40, 0x40, 0x60, 0x60, // L
130
			0x00, 0x7f, 0x7f, 0x02, 0x04, 0x02, 0x7f, 0x7f, // M
131
			0x00, 0x7f, 0x7f, 0x06, 0x0c, 0x18, 0x7f, 0x7f, // N
132
			0x00, 0x7f, 0x7f, 0x41, 0x41, 0x41, 0x7f, 0x7f, // O
133
			0x00, 0x7f, 0x7f, 0x09, 0x09, 0x09, 0x0f, 0x0f, // P
134
			0x00, 0x7f, 0x7f, 0x41, 0x51, 0x21, 0x7f, 0x7f, // Q
135
			0x00, 0x7f, 0x7f, 0x09, 0x09, 0x09, 0x7f, 0x77, // R
136
			0x00, 0x6f, 0x6f, 0x49, 0x49, 0x49, 0x7b, 0x7b, // S
137
			0x00, 0x01, 0x01, 0x7f, 0x7f, 0x01, 0x01, 0x00, // T
138
			0x00, 0x7f, 0x7f, 0x40, 0x40, 0x40, 0x7f, 0x7f, // U
139
			0x00, 0x1f, 0x3f, 0x60, 0x40, 0x60, 0x3f, 0x1f, // V
140
			0x00, 0x7f, 0x7f, 0x20, 0x10, 0x20, 0x7f, 0x7f, // W
141
			0x00, 0x77, 0x7f, 0x08, 0x08, 0x08, 0x7f, 0x77, // X
142
			0x00, 0x6f, 0x6f, 0x48, 0x48, 0x48, 0x7f, 0x7f, // Y
143
			0x00, 0x63, 0x73, 0x59, 0x4d, 0x47, 0x63, 0x61, // Z
144
			0x00, 0x74, 0x74, 0x54, 0x54, 0x7c, 0x7c, 0x00, // a
145
			0x00, 0x7f, 0x7f, 0x44, 0x44, 0x7c, 0x7c, 0x00, // b
146
			0x00, 0x7c, 0x7c, 0x44, 0x44, 0x6c, 0x6c, 0x00, // c
147
			0x00, 0x7c, 0x7c, 0x44, 0x44, 0x7f, 0x7f, 0x00, // d
148
			0x00, 0x7c, 0x7c, 0x54, 0x54, 0x5c, 0x5c, 0x00, // e
149
			0x00, 0x00, 0x04, 0x7f, 0x7f, 0x05, 0x05, 0x01, // f
150
			0x00, 0xbc, 0xbc, 0xa4, 0xa4, 0xfc, 0xfc, 0x00, // g
151
			0x00, 0x7f, 0x7f, 0x04, 0x04, 0x7c, 0x7c, 0x00, // h
152
			0x00, 0x44, 0x44, 0x7d, 0x7d, 0x40, 0x40, 0x00, // i
153
			0x00, 0x80, 0x80, 0xfd, 0xfd, 0x00, 0x00, 0x00, // j
154
			0x00, 0x7f, 0x7f, 0x10, 0x10, 0x7c, 0x6c, 0x00, // k
155
			0x00, 0x00, 0x00, 0x7f, 0x7f, 0x40, 0x40, 0x00, // l
156
			0x00, 0x7c, 0x7c, 0x04, 0x7c, 0x04, 0x7c, 0x7c, // m
157
			0x00, 0x7c, 0x7c, 0x04, 0x04, 0x7c, 0x7c, 0x00, // n
158
			0x00, 0x7c, 0x7c, 0x44, 0x44, 0x7c, 0x7c, 0x00, // o
159
			0x00, 0xfc, 0xfc, 0x24, 0x24, 0x3c, 0x3c, 0x00, // p
160
			0x00, 0x3c, 0x3c, 0x24, 0x24, 0xfc, 0xfc, 0x00, // q
161
			0x00, 0x7c, 0x7c, 0x04, 0x04, 0x0c, 0x0c, 0x00, // r
162
			0x00, 0x5c, 0x5c, 0x54, 0x54, 0x74, 0x74, 0x00, // s
163
			0x00, 0x00, 0x04, 0x7f, 0x7f, 0x44, 0x44, 0x00, // t
164
			0x00, 0x7c, 0x7c, 0x40, 0x40, 0x7c, 0x7c, 0x00, // u
165
			0x00, 0x1c, 0x3c, 0x60, 0x60, 0x3c, 0x1c, 0x00, // v
166
			0x00, 0x7c, 0x7c, 0x40, 0x7c, 0x40, 0x7c, 0x7c, // w
167
			0x00, 0x6c, 0x7c, 0x10, 0x10, 0x7c, 0x6c, 0x00, // x
168
			0x00, 0xbc, 0xbc, 0xa0, 0xa0, 0xfc, 0xfc, 0x00, // y
169
			0x00, 0x64, 0x74, 0x54, 0x54, 0x5c, 0x4c, 0x00, // z
170
			0x00, 0x7f, 0x7f, 0x51, 0x49, 0x45, 0x7f, 0x7f, // 0
171
			0x00, 0x41, 0x41, 0x7f, 0x7f, 0x40, 0x40, 0x00, // 1
172
			0x00, 0x7b, 0x7b, 0x49, 0x49, 0x49, 0x4f, 0x4f, // 2
173
			0x00, 0x63, 0x63, 0x49, 0x49, 0x49, 0x7f, 0x7f, // 3
174
			0x00, 0x1f, 0x1f, 0x10, 0x10, 0x7f, 0x7f, 0x10, // 4
175
			0x00, 0x6f, 0x6f, 0x49, 0x49, 0x49, 0x79, 0x79, // 5
176
			0x00, 0x7f, 0x7f, 0x49, 0x49, 0x49, 0x7b, 0x7b, // 6
177
			0x00, 0x03, 0x03, 0x71, 0x79, 0x0d, 0x07, 0x03, // 7
178
			0x00, 0x7f, 0x7f, 0x49, 0x49, 0x49, 0x7f, 0x7f, // 8
179
			0x00, 0x6f, 0x6f, 0x49, 0x49, 0x49, 0x7f, 0x7f, // 9
180
			0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, // -
181
			0x00, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, // :
182
			0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, // .
183
			0x00, 0x00, 0x80, 0xe0, 0x60, 0x00, 0x00, 0x00, // ,
184
		}, { // INVD-G
185
			0x7c, 0x7e, 0x22, 0x7e, 0x7e, 0x7e, 0x7c, 0x00, // A
186
			0x7c, 0x7e, 0x7e, 0x7e, 0x4a, 0x7e, 0x34, 0x00, // B
187
			0x3c, 0x7e, 0x7e, 0x7e, 0x42, 0x76, 0x34, 0x00, // C
188
			0x7c, 0x7e, 0x7e, 0x7e, 0x42, 0x7e, 0x3c, 0x00, // D
189
			0x3c, 0x7e, 0x7e, 0x7e, 0x4a, 0x4a, 0x00, 0x00, // E
190
			0x7c, 0x7e, 0x7e, 0x7e, 0x12, 0x12, 0x00, 0x00, // F
191
			0x3c, 0x7e, 0x7e, 0x7e, 0x52, 0x76, 0x34, 0x00, // G
192
			0x7e, 0x7e, 0x7e, 0x7e, 0x08, 0x7e, 0x7e, 0x00, // H
193
			0x00, 0x42, 0x7e, 0x7e, 0x7e, 0x7e, 0x42, 0x00, // I
194
			0x30, 0x70, 0x42, 0x7e, 0x7e, 0x7e, 0x3e, 0x00, // J
195
			0x7e, 0x7e, 0x7e, 0x7e, 0x08, 0x76, 0x62, 0x00, // K
196
			0x00, 0x3e, 0x7e, 0x7e, 0x7e, 0x40, 0x40, 0x00, // L
197
			0x7e, 0x7e, 0x7e, 0x7c, 0x08, 0x7c, 0x7e, 0x00, // M
198
			0x7e, 0x7e, 0x7e, 0x7c, 0x08, 0x7e, 0x7e, 0x00, // N
199
			0x3c, 0x7e, 0x7e, 0x7e, 0x42, 0x7e, 0x3c, 0x00, // O
200
			0x7c, 0x7e, 0x7e, 0x7e, 0x12, 0x1e, 0x0c, 0x00, // P
201
			0x3c, 0x7e, 0x7e, 0x7e, 0x42, 0xfe, 0xbc, 0x00, // Q
202
			0x7c, 0x7e, 0x7e, 0x7e, 0x12, 0x7e, 0x6c, 0x00, // R
203
			0x24, 0x6e, 0x5e, 0x7e, 0x7a, 0x76, 0x24, 0x00, // S
204
			0x00, 0x02, 0x7e, 0x7e, 0x7e, 0x7e, 0x02, 0x00, // T
205
			0x3e, 0x7e, 0x7e, 0x7e, 0x40, 0x7e, 0x3e, 0x00, // U
206
			0x1e, 0x3e, 0x7e, 0x7e, 0x40, 0x3e, 0x1e, 0x00, // V
207
			0x3e, 0x7e, 0x7e, 0x7e, 0x20, 0x7e, 0x3e, 0x00, // W
208
			0x42, 0x66, 0x3e, 0x7e, 0x7c, 0x66, 0x42, 0x00, // X
209
			0x06, 0x0e, 0x7e, 0x7e, 0x70, 0x0e, 0x06, 0x00, // Y
210
			0x62, 0x72, 0x7a, 0x7e, 0x5e, 0x4e, 0x46, 0x00, // Z
211
			0x38, 0x7c, 0x44, 0x3c, 0x7c, 0x7c, 0x78, 0x00, // a
212
			0x3f, 0x7f, 0x7f, 0x7f, 0x44, 0x7c, 0x38, 0x00, // b
213
			0x38, 0x7c, 0x7c, 0x7c, 0x44, 0x6c, 0x28, 0x00, // c
214
			0x38, 0x7c, 0x44, 0x3f, 0x7f, 0x7f, 0x7f, 0x00, // d
215
			0x38, 0x7c, 0x7c, 0x7c, 0x54, 0x5c, 0x28, 0x00, // e
216
			0x88, 0xfe, 0xff, 0xff, 0x7f, 0x09, 0x0a, 0x00, // f
217
			0x58, 0xbc, 0xa4, 0xfc, 0xfc, 0xfc, 0x78, 0x00, // g
218
			0x7f, 0x7f, 0x7f, 0x7f, 0x04, 0x7c, 0x78, 0x00, // h
219
			0x00, 0x00, 0x7a, 0x7f, 0x7f, 0x7a, 0x00, 0x00, // i
220
			0x00, 0x80, 0xfa, 0xff, 0xff, 0x7a, 0x00, 0x00, // j
221
			0x7f, 0x7f, 0x7f, 0x7f, 0x24, 0x7c, 0x58, 0x00, // k
222
			0x00, 0x00, 0x3f, 0x7f, 0x7f, 0x7f, 0x40, 0x00, // l
223
			0x78, 0x7c, 0x7c, 0x04, 0x7c, 0x04, 0x7c, 0x78, // m
224
			0x7c, 0x7c, 0x7c, 0x78, 0x04, 0x7c, 0x78, 0x00, // n
225
			0x38, 0x7c, 0x7c, 0x7c, 0x44, 0x7c, 0x38, 0x00, // o
226
			0xfc, 0xfc, 0xfc, 0xf8, 0x44, 0x7c, 0x38, 0x00, // p
227
			0x38, 0x7c, 0x44, 0xfc, 0xfc, 0xfc, 0xf8, 0x00, // q
228
			0x7c, 0x7c, 0x7c, 0x7c, 0x04, 0x0c, 0x08, 0x00, // r
229
			0x28, 0x5c, 0x5c, 0x7c, 0x74, 0x74, 0x28, 0x00, // s
230
			0x04, 0x3e, 0x7e, 0x7e, 0x7e, 0x44, 0x24, 0x00, // t
231
			0x3c, 0x7c, 0x40, 0x3c, 0x7c, 0x7c, 0x7c, 0x00, // u
232
			0x1c, 0x3c, 0x7c, 0x7c, 0x60, 0x3c, 0x1c, 0x00, // v
233
			0x3c, 0x7c, 0x7c, 0x40, 0x7c, 0x40, 0x7c, 0x3c, // w
234
			0x44, 0x6c, 0x3c, 0x7c, 0x78, 0x6c, 0x44, 0x00, // x
235
			0x9c, 0xbc, 0xfc, 0xfc, 0x60, 0x3c, 0x1c, 0x00, // y
236
			0x64, 0x74, 0x3c, 0x7c, 0x5c, 0x4c, 0x24, 0x00, // z
237
			0x3c, 0x7e, 0x42, 0x7e, 0x7e, 0x7e, 0x3c, 0x00, // 0
238
			0x00, 0x42, 0x7e, 0x7e, 0x7e, 0x7e, 0x40, 0x00, // 1
239
			0x64, 0x72, 0x7a, 0x7e, 0x5e, 0x4e, 0x44, 0x00, // 2
240
			0x24, 0x66, 0x4a, 0x7e, 0x7e, 0x7e, 0x34, 0x00, // 3
241
			0x0e, 0x1e, 0x10, 0x7e, 0x7e, 0x7e, 0x7e, 0x00, // 4
242
			0x2e, 0x6e, 0x4e, 0x7a, 0x7a, 0x7a, 0x32, 0x00, // 5
243
			0x3c, 0x7e, 0x7e, 0x7e, 0x4a, 0x7a, 0x34, 0x00, // 6
244
			0x02, 0x62, 0x7a, 0x7e, 0x7e, 0x1e, 0x06, 0x00, // 7
245
			0x34, 0x7e, 0x4e, 0x7e, 0x7a, 0x7e, 0x34, 0x00, // 8
246
			0x2c, 0x5e, 0x52, 0x7e, 0x7e, 0x7e, 0x3c, 0x00, // 9
247
			0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, // -
248
			0x00, 0x00, 0x28, 0x7c, 0x7c, 0x28, 0x00, 0x00, // :
249
			0x00, 0x00, 0x30, 0x78, 0x78, 0x30, 0x00, 0x00, // .
250
			0x00, 0x00, 0x10, 0xb8, 0xf8, 0x70, 0x00, 0x00, // ,
251
		}, { // INVD-B
252
			0x00, 0x78, 0x7f, 0x09, 0x09, 0x0f, 0x78, 0x00, // A
253
			0x00, 0x7f, 0x79, 0x49, 0x49, 0x4f, 0x78, 0x00, // B
254
			0x00, 0x7f, 0x79, 0x41, 0x41, 0x41, 0x63, 0x00, // C
255
			0x00, 0x7f, 0x79, 0x41, 0x41, 0x41, 0x7f, 0x00, // D
256
			0x00, 0x00, 0x7f, 0x79, 0x49, 0x49, 0x41, 0x00, // E
257
			0x00, 0x00, 0x7f, 0x79, 0x09, 0x09, 0x01, 0x00, // F
258
			0x00, 0x7f, 0x79, 0x41, 0x41, 0x49, 0x7b, 0x00, // G
259
			0x00, 0x7f, 0x78, 0x08, 0x08, 0x08, 0x7f, 0x00, // H
260
			0x00, 0x00, 0x00, 0x7f, 0x78, 0x00, 0x00, 0x00, // I
261
			0x00, 0x60, 0x40, 0x40, 0x40, 0x7f, 0x78, 0x00, // J
262
			0x00, 0x7f, 0x78, 0x08, 0x08, 0x0f, 0x78, 0x00, // K
263
			0x00, 0x00, 0x7f, 0x78, 0x40, 0x40, 0x40, 0x00, // L
264
			0x00, 0x7f, 0x79, 0x01, 0x7f, 0x01, 0x7f, 0x00, // M
265
			0x00, 0x7f, 0x79, 0x01, 0x01, 0x01, 0x7f, 0x00, // N
266
			0x00, 0x7f, 0x41, 0x41, 0x41, 0x43, 0x7f, 0x00, // O
267
			0x00, 0x7f, 0x79, 0x09, 0x09, 0x09, 0x0f, 0x00, // P
268
			0x00, 0x7f, 0x41, 0x41, 0x61, 0x61, 0x7f, 0x00, // Q
269
			0x00, 0x7f, 0x79, 0x09, 0x09, 0x0f, 0x78, 0x00, // R
270
			0x00, 0x6f, 0x49, 0x49, 0x49, 0x79, 0x7b, 0x00, // S
271
			0x00, 0x01, 0x01, 0x7f, 0x79, 0x01, 0x01, 0x00, // T
272
			0x00, 0x7f, 0x78, 0x40, 0x40, 0x40, 0x7f, 0x00, // U
273
			0x00, 0x0f, 0x7f, 0x40, 0x40, 0x78, 0x0f, 0x00, // V
274
			0x00, 0x7f, 0x78, 0x40, 0x7f, 0x40, 0x7f, 0x00, // W
275
			0x00, 0x77, 0x78, 0x08, 0x08, 0x08, 0x77, 0x00, // X
276
			0x00, 0x0f, 0x08, 0x78, 0x78, 0x08, 0x0f, 0x00, // Y
277
			0x00, 0x7b, 0x79, 0x49, 0x49, 0x49, 0x6f, 0x00, // Z
278
			0x00, 0x74, 0x74, 0x54, 0x54, 0x7c, 0x00, 0x00, // a
279
			0x00, 0x7f, 0x74, 0x44, 0x44, 0x7c, 0x00, 0x00, // b
280
			0x00, 0x7c, 0x74, 0x44, 0x44, 0x6c, 0x00, 0x00, // c
281
			0x00, 0x7c, 0x74, 0x44, 0x44, 0x7f, 0x00, 0x00, // d
282
			0x00, 0x7c, 0x74, 0x54, 0x54, 0x5c, 0x00, 0x00, // e
283
			0x00, 0x00, 0x04, 0x7f, 0x75, 0x01, 0x00, 0x00, // f
284
			0x00, 0xbc, 0xb4, 0xa4, 0xa4, 0xfc, 0x00, 0x00, // g
285
			0x00, 0x7f, 0x74, 0x04, 0x04, 0x7c, 0x00, 0x00, // h
286
			0x00, 0x00, 0x00, 0x7d, 0x71, 0x00, 0x00, 0x00, // i
287
			0x00, 0x00, 0x80, 0xbd, 0xf1, 0x00, 0x00, 0x00, // j
288
			0x00, 0x7f, 0x70, 0x10, 0x1c, 0x70, 0x00, 0x00, // k
289
			0x00, 0x00, 0x00, 0x7f, 0x78, 0x00, 0x00, 0x00, // l
290
			0x00, 0x7c, 0x74, 0x04, 0x7c, 0x04, 0x7c, 0x00, // m
291
			0x00, 0x7c, 0x74, 0x04, 0x04, 0x7c, 0x00, 0x00, // n
292
			0x00, 0x7c, 0x74, 0x44, 0x44, 0x7c, 0x00, 0x00, // o
293
			0x00, 0xfc, 0x34, 0x24, 0x24, 0x3c, 0x00, 0x00, // p
294
			0x00, 0x3c, 0x34, 0x24, 0x24, 0xfc, 0x00, 0x00, // q
295
			0x00, 0x00, 0x7c, 0x74, 0x04, 0x04, 0x00, 0x00, // r
296
			0x00, 0x5c, 0x54, 0x54, 0x74, 0x74, 0x00, 0x00, // s
297
			0x00, 0x00, 0x04, 0x7f, 0x74, 0x00, 0x00, 0x00, // t
298
			0x00, 0x7c, 0x70, 0x40, 0x40, 0x7c, 0x00, 0x00, // u
299
			0x00, 0x1c, 0x7c, 0x40, 0x70, 0x1c, 0x00, 0x00, // v
300
			0x00, 0x7c, 0x70, 0x40, 0x7c, 0x40, 0x7c, 0x00, // w
301
			0x00, 0x6c, 0x70, 0x10, 0x10, 0x6c, 0x00, 0x00, // x
302
			0x00, 0xbc, 0xb0, 0xa0, 0xa0, 0xfc, 0x00, 0x00, // y
303
			0x00, 0x74, 0x74, 0x54, 0x54, 0x5c, 0x00, 0x00, // z
304
			0x00, 0x7f, 0x41, 0x41, 0x41, 0x79, 0x7f, 0x00, // 0
305
			0x00, 0x00, 0x00, 0x78, 0x7f, 0x00, 0x00, 0x00, // 1
306
			0x00, 0x7b, 0x79, 0x49, 0x49, 0x49, 0x4f, 0x00, // 2
307
			0x00, 0x63, 0x49, 0x49, 0x49, 0x7f, 0x78, 0x00, // 3
308
			0x00, 0x1f, 0x11, 0x11, 0x71, 0x7f, 0x10, 0x00, // 4
309
			0x00, 0x6f, 0x49, 0x49, 0x49, 0x79, 0x79, 0x00, // 5
310
			0x00, 0x7f, 0x49, 0x49, 0x49, 0x79, 0x7b, 0x00, // 6
311
			0x00, 0x01, 0x01, 0x01, 0x79, 0x7f, 0x00, 0x00, // 7
312
			0x00, 0x78, 0x4f, 0x49, 0x49, 0x7f, 0x78, 0x00, // 8
313
			0x00, 0x1f, 0x11, 0x11, 0x11, 0x71, 0x7f, 0x00, // 9
314
			0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, // -
315
			0x00, 0x00, 0x00, 0x6c, 0x6c, 0x00, 0x00, 0x00, // :
316
			0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, // .
317
			0x00, 0x00, 0x00, 0x60, 0xe0, 0x00, 0x00, 0x00, // ,
318
		}
319
	};
320
60 by edam
remove TextRenderer singleton and save space
321
	// nothing to do?
322
	if( c == _glyph_cache_char )
323
		return;
324
	_glyph_cache_char = c;
325
326
	// find glyph data position
59 by edam
removed ulibc, fixed button, added text rendering
327
	int pos;
328
	if( c >= 'A' && c <= 'Z' )
329
		pos = c - 'A';
330
	else if( c >= 'a' && c <= 'z' )
331
		pos = c - 'a' + 26;
332
	else if( c >= '0' && c <= '9' )
333
		pos = c - '0' + 52;
334
	else if( c == '-' )
335
		pos = 62;
336
	else if( c == ':' )
337
		pos = 63;
338
	else if( c == '.' )
339
		pos = 64;
340
	else if( c == ',' )
341
		pos = 65;
342
	else
343
		pos = -1;
344
60 by edam
remove TextRenderer singleton and save space
345
	// space? or copy glyph from progmem?
59 by edam
removed ulibc, fixed button, added text rendering
346
	if( pos == -1 )
60 by edam
remove TextRenderer singleton and save space
347
		memset( _glyph_cache, 0, 8 );
348
	else
349
		memcpy_P( _glyph_cache, &( fonts[ _font ][ pos * 8 ] ), 8 );
350
}
351
352
62 by edam
moved some stuf round, created a re-usable pool of message buffers, genericised "modes" for messages
353
int TextRenderer::get_width( int message_len )
60 by edam
remove TextRenderer singleton and save space
354
{
62 by edam
moved some stuf round, created a re-usable pool of message buffers, genericised "modes" for messages
355
	return message_len * 8 * TEXT_SCALE;
60 by edam
remove TextRenderer singleton and save space
356
}
357
358
62 by edam
moved some stuf round, created a re-usable pool of message buffers, genericised "modes" for messages
359
void TextRenderer::render( const char *message, int message_len, int x,
360
						   bool y_flip, int y_shift )
60 by edam
remove TextRenderer singleton and save space
361
{
62 by edam
moved some stuf round, created a re-usable pool of message buffers, genericised "modes" for messages
362
	char glyph_col = 0;
363
60 by edam
remove TextRenderer singleton and save space
364
	// handle negative x
62 by edam
moved some stuf round, created a re-usable pool of message buffers, genericised "modes" for messages
365
	if( x >= 0 )
366
	{
367
		// scale font
368
		x /= TEXT_SCALE;
369
370
		int pos = x / 8;
371
		if( pos < message_len )
372
		{
71 by Tim Marston
added time set mode, made text renderer's buffer auto reset/output
373
			// ensure correct glyph is cached and pull out column of data
62 by edam
moved some stuf round, created a re-usable pool of message buffers, genericised "modes" for messages
374
			cache_glyph( message[ pos ] );
375
			glyph_col = _glyph_cache[ x % 8 ];
376
		}
60 by edam
remove TextRenderer singleton and save space
377
	}
378
379
	// draw a column
62 by edam
moved some stuf round, created a re-usable pool of message buffers, genericised "modes" for messages
380
	if( y_flip )
63 by edam
widenned clock hands, tweaked scales, got top & bottom text modes working
381
		for( int a = 7; a >= 0; a-- ) {
382
			if( glyph_col & 1 )
383
				_output_buffer |= 1 << ( a + y_shift );
384
			glyph_col >>= 1;
385
		}
386
	else
62 by edam
moved some stuf round, created a re-usable pool of message buffers, genericised "modes" for messages
387
		for( int a = 0; a < 8; a++ ) {
388
			if( glyph_col & 1 )
389
				_output_buffer |= 1 << ( a + y_shift );
390
			glyph_col >>= 1;
391
		}
392
}
393
394
395
void TextRenderer::reset_buffer()
396
{
397
	_output_buffer = 0;
71 by Tim Marston
added time set mode, made text renderer's buffer auto reset/output
398
	_need_render = false;
399
}
400
401
402
void TextRenderer::buffer_in_use()
403
{
404
	_need_render = true;
62 by edam
moved some stuf round, created a re-usable pool of message buffers, genericised "modes" for messages
405
}
406
407
408
void TextRenderer::output_buffer()
409
{
71 by Tim Marston
added time set mode, made text renderer's buffer auto reset/output
410
	if( !_need_render ) return;
411
62 by edam
moved some stuf round, created a re-usable pool of message buffers, genericised "modes" for messages
412
	for( int a = 8; a >= 0; a-- ) {
65 by Tim Marston
removed most OOP/inheritance crap, saved loads of space!
413
		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
414
		_output_buffer >>= 1;
415
	}
416
	_output_buffer = 0;
59 by edam
removed ulibc, fixed button, added text rendering
417
}
63 by edam
widenned clock hands, tweaked scales, got top & bottom text modes working
418
419
71 by Tim Marston
added time set mode, made text renderer's buffer auto reset/output
420
int TextRenderer::get_font()
421
{
422
	return _font;
423
}
424
425
426
void TextRenderer::inc_font()
427
{
428
	if( ++_font >= 4 )
429
		_font = 0;
63 by edam
widenned clock hands, tweaked scales, got top & bottom text modes working
430
}