1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
10 * Copyright (C) 2002 Daniel Stenberg
12 * All files in this archive are subject to the GNU General Public License.
13 * See the file COPYING in the source tree root for full license agreement.
15 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
16 * KIND, either express or implied.
18 **************************************************************************/
21 #include "fixedpoint.h"
25 #define SS_TITLE "Bouncer"
31 /* variable button definitions */
32 #if CONFIG_KEYPAD == RECORDER_PAD
33 #define BOUNCE_LEFT BUTTON_LEFT
34 #define BOUNCE_RIGHT BUTTON_RIGHT
35 #define BOUNCE_UP BUTTON_UP
36 #define BOUNCE_DOWN BUTTON_DOWN
37 #define BOUNCE_QUIT (BUTTON_OFF | BUTTON_REL)
38 #define BOUNCE_MODE (BUTTON_ON | BUTTON_REL)
40 #elif CONFIG_KEYPAD == ARCHOS_AV300_PAD
41 #define BOUNCE_LEFT BUTTON_LEFT
42 #define BOUNCE_RIGHT BUTTON_RIGHT
43 #define BOUNCE_UP BUTTON_UP
44 #define BOUNCE_DOWN BUTTON_DOWN
45 #define BOUNCE_QUIT (BUTTON_OFF | BUTTON_REL)
46 #define BOUNCE_MODE (BUTTON_ON | BUTTON_REL)
48 #elif CONFIG_KEYPAD == ONDIO_PAD
49 #define BOUNCE_LEFT BUTTON_LEFT
50 #define BOUNCE_RIGHT BUTTON_RIGHT
51 #define BOUNCE_UP BUTTON_UP
52 #define BOUNCE_DOWN BUTTON_DOWN
53 #define BOUNCE_QUIT (BUTTON_OFF | BUTTON_REL)
54 #define BOUNCE_MODE (BUTTON_MENU | BUTTON_REL)
56 #elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
57 (CONFIG_KEYPAD == IRIVER_H300_PAD)
58 #define BOUNCE_LEFT BUTTON_LEFT
59 #define BOUNCE_RIGHT BUTTON_RIGHT
60 #define BOUNCE_UP BUTTON_UP
61 #define BOUNCE_DOWN BUTTON_DOWN
62 #define BOUNCE_QUIT (BUTTON_OFF | BUTTON_REL)
63 #define BOUNCE_MODE (BUTTON_SELECT | BUTTON_REL)
65 #define BOUNCE_RC_QUIT (BUTTON_RC_STOP | BUTTON_REL)
67 #elif (CONFIG_KEYPAD == IPOD_4G_PAD) || \
68 (CONFIG_KEYPAD == IPOD_3G_PAD) || \
69 (CONFIG_KEYPAD == IPOD_1G2G_PAD)
70 #define BOUNCE_LEFT BUTTON_LEFT
71 #define BOUNCE_RIGHT BUTTON_RIGHT
72 #define BOUNCE_UP BUTTON_SCROLL_BACK
73 #define BOUNCE_DOWN BUTTON_SCROLL_FWD
74 #define BOUNCE_QUIT (BUTTON_MENU | BUTTON_REL)
75 #define BOUNCE_MODE (BUTTON_SELECT | BUTTON_REL)
77 #elif (CONFIG_KEYPAD == IAUDIO_X5M5_PAD)
78 #define BOUNCE_LEFT BUTTON_LEFT
79 #define BOUNCE_RIGHT BUTTON_RIGHT
80 #define BOUNCE_UP BUTTON_UP
81 #define BOUNCE_DOWN BUTTON_DOWN
82 #define BOUNCE_QUIT BUTTON_POWER
83 #define BOUNCE_MODE BUTTON_PLAY
85 #elif (CONFIG_KEYPAD == GIGABEAT_PAD)
86 #define BOUNCE_LEFT BUTTON_LEFT
87 #define BOUNCE_RIGHT BUTTON_RIGHT
88 #define BOUNCE_UP BUTTON_UP
89 #define BOUNCE_DOWN BUTTON_DOWN
90 #define BOUNCE_QUIT BUTTON_POWER
91 #define BOUNCE_MODE BUTTON_A
93 #elif CONFIG_KEYPAD == SANSA_E200_PAD
94 #define BOUNCE_LEFT BUTTON_LEFT
95 #define BOUNCE_RIGHT BUTTON_RIGHT
96 #define BOUNCE_UP BUTTON_SCROLL_BACK
97 #define BOUNCE_DOWN BUTTON_SCROLL_FWD
98 #define BOUNCE_QUIT BUTTON_POWER
99 #define BOUNCE_MODE BUTTON_SELECT
101 #elif CONFIG_KEYPAD == SANSA_C200_PAD
102 #define BOUNCE_LEFT BUTTON_LEFT
103 #define BOUNCE_RIGHT BUTTON_RIGHT
104 #define BOUNCE_UP BUTTON_UP
105 #define BOUNCE_DOWN BUTTON_DOWN
106 #define BOUNCE_QUIT BUTTON_POWER
107 #define BOUNCE_MODE BUTTON_SELECT
109 #elif (CONFIG_KEYPAD == IRIVER_H10_PAD)
110 #define BOUNCE_LEFT BUTTON_LEFT
111 #define BOUNCE_RIGHT BUTTON_RIGHT
112 #define BOUNCE_UP BUTTON_SCROLL_UP
113 #define BOUNCE_DOWN BUTTON_SCROLL_DOWN
114 #define BOUNCE_QUIT BUTTON_POWER
115 #define BOUNCE_MODE BUTTON_PLAY
117 #elif (CONFIG_KEYPAD == GIGABEAT_S_PAD)
118 #define BOUNCE_LEFT BUTTON_LEFT
119 #define BOUNCE_RIGHT BUTTON_RIGHT
120 #define BOUNCE_UP BUTTON_UP
121 #define BOUNCE_DOWN BUTTON_DOWN
122 #define BOUNCE_QUIT BUTTON_BACK
123 #define BOUNCE_MODE BUTTON_MENU
125 #elif (CONFIG_KEYPAD == MROBE100_PAD)
126 #define BOUNCE_LEFT BUTTON_LEFT
127 #define BOUNCE_RIGHT BUTTON_RIGHT
128 #define BOUNCE_UP BUTTON_UP
129 #define BOUNCE_DOWN BUTTON_DOWN
130 #define BOUNCE_QUIT BUTTON_POWER
131 #define BOUNCE_MODE BUTTON_DISPLAY
133 #elif CONFIG_KEYPAD == IAUDIO_M3_PAD
134 #define BOUNCE_LEFT BUTTON_RC_REW
135 #define BOUNCE_RIGHT BUTTON_RC_FF
136 #define BOUNCE_UP BUTTON_RC_VOL_UP
137 #define BOUNCE_DOWN BUTTON_RC_VOL_DOWN
138 #define BOUNCE_QUIT BUTTON_RC_REC
139 #define BOUNCE_MODE BUTTON_RC_MODE
141 #elif (CONFIG_KEYPAD == COWOND2_PAD)
142 #define BOUNCE_LEFT BUTTON_LEFT
143 #define BOUNCE_RIGHT BUTTON_RIGHT
144 #define BOUNCE_UP BUTTON_UP
145 #define BOUNCE_DOWN BUTTON_DOWN
146 #define BOUNCE_QUIT BUTTON_POWER
147 #define BOUNCE_MODE BUTTON_MENU
150 #error No keymap defined!
153 static struct plugin_api
* rb
;
155 #define LETTER_WIDTH 11
156 #define LETTER_HEIGHT 16
158 const unsigned char char_gen_12x16
[][22] =
160 { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
161 { 0x00,0x00,0x00,0x7c,0xff,0xff,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x33,0x00,0x00,0x00,0x00,0x00 },
162 { 0x00,0x00,0x3c,0x3c,0x00,0x00,0x3c,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
163 { 0x00,0x10,0x90,0xf0,0x7e,0x1e,0x90,0xf0,0x7e,0x1e,0x10,0x02,0x1e,0x1f,0x03,0x02,0x1e,0x1f,0x03,0x02,0x00,0x00 },
164 { 0x00,0x78,0xfc,0xcc,0xff,0xff,0xcc,0xcc,0x88,0x00,0x00,0x00,0x04,0x0c,0x0c,0x3f,0x3f,0x0c,0x0f,0x07,0x00,0x00 },
165 { 0x00,0x38,0x38,0x38,0x00,0x80,0xc0,0xe0,0x70,0x38,0x1c,0x30,0x38,0x1c,0x0e,0x07,0x03,0x01,0x38,0x38,0x38,0x00 },
166 { 0x00,0x00,0xb8,0xfc,0xc6,0xe2,0x3e,0x1c,0x00,0x00,0x00,0x00,0x1f,0x3f,0x31,0x21,0x37,0x1e,0x1c,0x36,0x22,0x00 },
167 { 0x00,0x00,0x00,0x27,0x3f,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
168 { 0x00,0x00,0xf0,0xfc,0xfe,0x07,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x03,0x0f,0x1f,0x38,0x20,0x20,0x00,0x00,0x00 },
169 { 0x00,0x00,0x01,0x01,0x07,0xfe,0xfc,0xf0,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x38,0x1f,0x0f,0x03,0x00,0x00,0x00 },
170 { 0x00,0x98,0xb8,0xe0,0xf8,0xf8,0xe0,0xb8,0x98,0x00,0x00,0x00,0x0c,0x0e,0x03,0x0f,0x0f,0x03,0x0e,0x0c,0x00,0x00 },
171 { 0x00,0x80,0x80,0x80,0xf0,0xf0,0x80,0x80,0x80,0x00,0x00,0x00,0x01,0x01,0x01,0x0f,0x0f,0x01,0x01,0x01,0x00,0x00 },
172 { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0xf8,0x78,0x00,0x00,0x00,0x00,0x00 },
173 { 0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00 },
174 { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x38,0x38,0x00,0x00,0x00,0x00,0x00 },
175 { 0x00,0x00,0x00,0x00,0x80,0xc0,0xe0,0x70,0x38,0x1c,0x0e,0x18,0x1c,0x0e,0x07,0x03,0x01,0x00,0x00,0x00,0x00,0x00 },
176 { 0xf8,0xfe,0x06,0x03,0x83,0xc3,0x63,0x33,0x1e,0xfe,0xf8,0x07,0x1f,0x1e,0x33,0x31,0x30,0x30,0x30,0x18,0x1f,0x07 },
177 { 0x00,0x00,0x0c,0x0c,0x0e,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x3f,0x3f,0x30,0x30,0x30,0x00 },
178 { 0x1c,0x1e,0x07,0x03,0x03,0x83,0xc3,0xe3,0x77,0x3e,0x1c,0x30,0x38,0x3c,0x3e,0x37,0x33,0x31,0x30,0x30,0x30,0x30 },
179 { 0x0c,0x0e,0x07,0xc3,0xc3,0xc3,0xc3,0xc3,0xe7,0x7e,0x3c,0x0c,0x1c,0x38,0x30,0x30,0x30,0x30,0x30,0x39,0x1f,0x0e },
180 { 0xc0,0xe0,0x70,0x38,0x1c,0x0e,0x07,0xff,0xff,0x00,0x00,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x3f,0x3f,0x03,0x03 },
181 { 0x3f,0x7f,0x63,0x63,0x63,0x63,0x63,0x63,0xe3,0xc3,0x83,0x0c,0x1c,0x38,0x30,0x30,0x30,0x30,0x30,0x38,0x1f,0x0f },
182 { 0xc0,0xf0,0xf8,0xdc,0xce,0xc7,0xc3,0xc3,0xc3,0x80,0x00,0x0f,0x1f,0x39,0x30,0x30,0x30,0x30,0x30,0x39,0x1f,0x0f },
183 { 0x03,0x03,0x03,0x03,0x03,0x03,0xc3,0xf3,0x3f,0x0f,0x03,0x00,0x00,0x00,0x30,0x3c,0x0f,0x03,0x00,0x00,0x00,0x00 },
184 { 0x00,0xbc,0xfe,0xe7,0xc3,0xc3,0xc3,0xe7,0xfe,0xbc,0x00,0x0f,0x1f,0x39,0x30,0x30,0x30,0x30,0x30,0x39,0x1f,0x0f },
185 { 0x3c,0x7e,0xe7,0xc3,0xc3,0xc3,0xc3,0xc3,0xe7,0xfe,0xfc,0x00,0x00,0x30,0x30,0x30,0x38,0x1c,0x0e,0x07,0x03,0x00 },
186 { 0x00,0x00,0x00,0x70,0x70,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x1c,0x1c,0x00,0x00,0x00,0x00,0x00 },
187 { 0x00,0x00,0x00,0x70,0x70,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0xfc,0x7c,0x00,0x00,0x00,0x00,0x00 },
188 { 0x00,0xc0,0xe0,0xf0,0x38,0x1c,0x0e,0x07,0x03,0x00,0x00,0x00,0x00,0x01,0x03,0x07,0x0e,0x1c,0x38,0x30,0x00,0x00 },
189 { 0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x00 },
190 { 0x00,0x03,0x07,0x0e,0x1c,0x38,0xf0,0xe0,0xc0,0x00,0x00,0x00,0x30,0x38,0x1c,0x0e,0x07,0x03,0x01,0x00,0x00,0x00 },
191 { 0x1c,0x1e,0x07,0x03,0x83,0xc3,0xe3,0x77,0x3e,0x1c,0x00,0x00,0x00,0x00,0x00,0x37,0x37,0x00,0x00,0x00,0x00,0x00 },
192 { 0xf8,0xfe,0x07,0xf3,0xfb,0x1b,0xfb,0xfb,0x07,0xfe,0xf8,0x0f,0x1f,0x18,0x33,0x37,0x36,0x37,0x37,0x36,0x03,0x01 },
193 { 0x00,0x00,0xe0,0xfc,0x1f,0x1f,0xfc,0xe0,0x00,0x00,0x00,0x38,0x3f,0x07,0x06,0x06,0x06,0x06,0x07,0x3f,0x38,0x00 },
194 { 0xff,0xff,0xc3,0xc3,0xc3,0xc3,0xe7,0xfe,0xbc,0x00,0x00,0x3f,0x3f,0x30,0x30,0x30,0x30,0x30,0x39,0x1f,0x0f,0x00 },
195 { 0xf0,0xfc,0x0e,0x07,0x03,0x03,0x03,0x07,0x0e,0x0c,0x00,0x03,0x0f,0x1c,0x38,0x30,0x30,0x30,0x38,0x1c,0x0c,0x00 },
196 { 0xff,0xff,0x03,0x03,0x03,0x03,0x07,0x0e,0xfc,0xf0,0x00,0x3f,0x3f,0x30,0x30,0x30,0x30,0x38,0x1c,0x0f,0x03,0x00 },
197 { 0xff,0xff,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0x03,0x03,0x00,0x3f,0x3f,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x00 },
198 { 0xff,0xff,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0x03,0x03,0x00,0x3f,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
199 { 0xf0,0xfc,0x0e,0x07,0x03,0xc3,0xc3,0xc3,0xc7,0xc6,0x00,0x03,0x0f,0x1c,0x38,0x30,0x30,0x30,0x30,0x3f,0x3f,0x00 },
200 { 0xff,0xff,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xff,0xff,0x00,0x3f,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x3f,0x00 },
201 { 0x00,0x00,0x03,0x03,0xff,0xff,0x03,0x03,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x3f,0x3f,0x30,0x30,0x00,0x00,0x00 },
202 { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x0e,0x1e,0x38,0x30,0x30,0x30,0x30,0x38,0x1f,0x07,0x00 },
203 { 0xff,0xff,0xc0,0xe0,0xf0,0x38,0x1c,0x0e,0x07,0x03,0x00,0x3f,0x3f,0x00,0x01,0x03,0x07,0x0e,0x1c,0x38,0x30,0x00 },
204 { 0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x3f,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x00 },
205 { 0xff,0xff,0x1e,0x78,0xe0,0xe0,0x78,0x1e,0xff,0xff,0x00,0x3f,0x3f,0x00,0x00,0x01,0x01,0x00,0x00,0x3f,0x3f,0x00 },
206 { 0xff,0xff,0x0e,0x38,0xf0,0xc0,0x00,0x00,0xff,0xff,0x00,0x3f,0x3f,0x00,0x00,0x00,0x03,0x07,0x1c,0x3f,0x3f,0x00 },
207 { 0xf0,0xfc,0x0e,0x07,0x03,0x03,0x07,0x0e,0xfc,0xf0,0x00,0x03,0x0f,0x1c,0x38,0x30,0x30,0x38,0x1c,0x0f,0x03,0x00 },
208 { 0xff,0xff,0x83,0x83,0x83,0x83,0x83,0xc7,0xfe,0x7c,0x00,0x3f,0x3f,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x00 },
209 { 0xf0,0xfc,0x0e,0x07,0x03,0x03,0x07,0x0e,0xfc,0xf0,0x00,0x03,0x0f,0x1c,0x38,0x30,0x36,0x3e,0x1c,0x3f,0x33,0x00 },
210 { 0xff,0xff,0x83,0x83,0x83,0x83,0x83,0xc7,0xfe,0x7c,0x00,0x3f,0x3f,0x01,0x01,0x03,0x07,0x0f,0x1d,0x38,0x30,0x00 },
211 { 0x3c,0x7e,0xe7,0xc3,0xc3,0xc3,0xc3,0xc7,0x8e,0x0c,0x00,0x0c,0x1c,0x38,0x30,0x30,0x30,0x30,0x39,0x1f,0x0f,0x00 },
212 { 0x00,0x03,0x03,0x03,0xff,0xff,0x03,0x03,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x3f,0x00,0x00,0x00,0x00,0x00 },
213 { 0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x07,0x1f,0x38,0x30,0x30,0x30,0x30,0x38,0x1f,0x07,0x00 },
214 { 0x07,0x3f,0xf8,0xc0,0x00,0x00,0xc0,0xf8,0x3f,0x07,0x00,0x00,0x00,0x01,0x0f,0x3e,0x3e,0x0f,0x01,0x00,0x00,0x00 },
215 { 0xff,0xff,0x00,0x00,0x80,0x80,0x00,0x00,0xff,0xff,0x00,0x3f,0x3f,0x1c,0x06,0x03,0x03,0x06,0x1c,0x3f,0x3f,0x00 },
216 { 0x03,0x0f,0x1c,0x30,0xe0,0xe0,0x30,0x1c,0x0f,0x03,0x00,0x30,0x3c,0x0e,0x03,0x01,0x01,0x03,0x0e,0x3c,0x30,0x00 },
217 { 0x03,0x0f,0x3c,0xf0,0xc0,0xc0,0xf0,0x3c,0x0f,0x03,0x00,0x00,0x00,0x00,0x00,0x3f,0x3f,0x00,0x00,0x00,0x00,0x00 },
218 { 0x03,0x03,0x03,0x03,0xc3,0xe3,0x33,0x1f,0x0f,0x03,0x00,0x30,0x3c,0x3e,0x33,0x31,0x30,0x30,0x30,0x30,0x30,0x00 },
219 { 0x00,0x00,0xff,0xff,0x03,0x03,0x03,0x03,0x00,0x00,0x00,0x00,0x00,0x3f,0x3f,0x30,0x30,0x30,0x30,0x00,0x00,0x00 },
220 { 0x0e,0x1c,0x38,0x70,0xe0,0xc0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x07,0x0e,0x1c,0x18 },
221 { 0x00,0x00,0x03,0x03,0x03,0x03,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x30,0x3f,0x3f,0x00,0x00,0x00 },
222 { 0x60,0x70,0x38,0x1c,0x0e,0x07,0x0e,0x1c,0x38,0x70,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
223 { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0 },
224 { 0x00,0x00,0x00,0x00,0x3e,0x7e,0x4e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
225 { 0x00,0x40,0x60,0x60,0x60,0x60,0x60,0x60,0xe0,0xc0,0x00,0x1c,0x3e,0x33,0x33,0x33,0x33,0x33,0x33,0x3f,0x3f,0x00 },
226 { 0xff,0xff,0xc0,0x60,0x60,0x60,0x60,0xe0,0xc0,0x80,0x00,0x3f,0x3f,0x30,0x30,0x30,0x30,0x30,0x38,0x1f,0x0f,0x00 },
227 { 0x80,0xc0,0xe0,0x60,0x60,0x60,0x60,0x60,0xc0,0x80,0x00,0x0f,0x1f,0x38,0x30,0x30,0x30,0x30,0x30,0x18,0x08,0x00 },
228 { 0x80,0xc0,0xe0,0x60,0x60,0x60,0xe0,0xc0,0xff,0xff,0x00,0x0f,0x1f,0x38,0x30,0x30,0x30,0x30,0x30,0x3f,0x3f,0x00 },
229 { 0x80,0xc0,0xe0,0x60,0x60,0x60,0x60,0x60,0xc0,0x80,0x00,0x0f,0x1f,0x3b,0x33,0x33,0x33,0x33,0x33,0x13,0x01,0x00 },
230 { 0xc0,0xc0,0xfc,0xfe,0xc7,0xc3,0xc3,0x03,0x00,0x00,0x00,0x00,0x00,0x3f,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
231 { 0x80,0xc0,0xe0,0x60,0x60,0x60,0x60,0x60,0xe0,0xe0,0x00,0x03,0xc7,0xce,0xcc,0xcc,0xcc,0xcc,0xe6,0x7f,0x3f,0x00 },
232 { 0xff,0xff,0xc0,0x60,0x60,0x60,0xe0,0xc0,0x80,0x00,0x00,0x3f,0x3f,0x00,0x00,0x00,0x00,0x00,0x3f,0x3f,0x00,0x00 },
233 { 0x00,0x00,0x00,0x60,0xec,0xec,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x3f,0x3f,0x30,0x30,0x00,0x00,0x00 },
234 { 0x00,0x00,0x00,0x00,0x00,0x60,0xec,0xec,0x00,0x00,0x00,0x00,0x00,0x60,0xe0,0xc0,0xc0,0xff,0x7f,0x00,0x00,0x00 },
235 { 0x00,0xff,0xff,0x00,0x80,0xc0,0xe0,0x60,0x00,0x00,0x00,0x00,0x3f,0x3f,0x03,0x07,0x0f,0x1c,0x38,0x30,0x00,0x00 },
236 { 0x00,0x00,0x00,0x03,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x3f,0x3f,0x30,0x30,0x00,0x00,0x00 },
237 { 0xe0,0xc0,0xe0,0xe0,0xc0,0xc0,0xe0,0xe0,0xc0,0x80,0x00,0x3f,0x3f,0x00,0x00,0x3f,0x3f,0x00,0x00,0x3f,0x3f,0x00 },
238 { 0x00,0xe0,0xe0,0x60,0x60,0x60,0x60,0xe0,0xc0,0x80,0x00,0x00,0x3f,0x3f,0x00,0x00,0x00,0x00,0x00,0x3f,0x3f,0x00 },
239 { 0x80,0xc0,0xe0,0x60,0x60,0x60,0x60,0xe0,0xc0,0x80,0x00,0x0f,0x1f,0x38,0x30,0x30,0x30,0x30,0x38,0x1f,0x0f,0x00 },
240 { 0xe0,0xe0,0x60,0x60,0x60,0x60,0x60,0xe0,0xc0,0x80,0x00,0xff,0xff,0x0c,0x18,0x18,0x18,0x18,0x1c,0x0f,0x07,0x00 },
241 { 0x80,0xc0,0xe0,0x60,0x60,0x60,0x60,0x60,0xe0,0xe0,0x00,0x07,0x0f,0x1c,0x18,0x18,0x18,0x18,0x0c,0xff,0xff,0x00 },
242 { 0x00,0xe0,0xe0,0xc0,0x60,0x60,0x60,0x60,0xe0,0xc0,0x00,0x00,0x3f,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
243 { 0xc0,0xe0,0x60,0x60,0x60,0x60,0x60,0x40,0x00,0x00,0x00,0x11,0x33,0x33,0x33,0x33,0x33,0x3f,0x1e,0x00,0x00,0x00 },
244 { 0x60,0x60,0xfe,0xfe,0x60,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x3f,0x30,0x30,0x30,0x30,0x00,0x00,0x00 },
245 { 0xe0,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xe0,0x00,0x0f,0x1f,0x38,0x30,0x30,0x30,0x30,0x18,0x3f,0x3f,0x00 },
246 { 0x60,0xe0,0x80,0x00,0x00,0x00,0x00,0x80,0xe0,0x60,0x00,0x00,0x01,0x07,0x1e,0x38,0x38,0x1e,0x07,0x01,0x00,0x00 },
247 { 0xe0,0xe0,0x00,0x00,0xe0,0xe0,0x00,0x00,0xe0,0xe0,0x00,0x07,0x1f,0x38,0x1c,0x0f,0x0f,0x1c,0x38,0x1f,0x07,0x00 },
248 { 0x60,0xe0,0xc0,0x80,0x00,0x80,0xc0,0xe0,0x60,0x00,0x00,0x30,0x38,0x1d,0x0f,0x07,0x0f,0x1d,0x38,0x30,0x00,0x00 },
249 { 0x00,0x60,0xe0,0x80,0x00,0x00,0x80,0xe0,0x60,0x00,0x00,0x00,0x00,0x81,0xe7,0x7e,0x1e,0x07,0x01,0x00,0x00,0x00 },
250 { 0x60,0x60,0x60,0x60,0x60,0xe0,0xe0,0x60,0x20,0x00,0x00,0x30,0x38,0x3c,0x36,0x33,0x31,0x30,0x30,0x30,0x00,0x00 },
251 { 0x00,0x80,0xc0,0xfc,0x7e,0x07,0x03,0x03,0x03,0x00,0x00,0x00,0x00,0x01,0x1f,0x3f,0x70,0x60,0x60,0x60,0x00,0x00 },
252 { 0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x3f,0x00,0x00,0x00,0x00,0x00 },
253 { 0x00,0x03,0x03,0x03,0x07,0x7e,0xfc,0xc0,0x80,0x00,0x00,0x00,0x60,0x60,0x60,0x70,0x3f,0x1f,0x01,0x00,0x00,0x00 },
254 { 0x10,0x18,0x0c,0x04,0x0c,0x18,0x10,0x18,0x0c,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
255 { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x00 }
258 static signed char speed
[]={
259 1,2,3,3,3,2,1,0,-1,-2,-2,-2,-1,0,0,1,
262 #if LCD_WIDTH > LCD_HEIGHT /* landscape LCD */
264 #define TABLE_SIZE LCD_HEIGHT
265 #define RADIUS_MINUTE (3*LCD_HEIGHT/8)
266 #define RADIUS_HOUR (LCD_HEIGHT/4)
268 #else /* portrait (or square) LCD */
270 #define TABLE_SIZE LCD_WIDTH
271 #define RADIUS_MINUTE (3*LCD_WIDTH/8)
272 #define RADIUS_HOUR (LCD_WIDTH/4)
274 #endif /* LCD orientation */
276 #define RADIUS_X ((LCD_WIDTH-LETTER_WIDTH)/2)
277 #define RADIUS_Y ((LCD_HEIGHT-LETTER_HEIGHT)/2)
279 #define PHASE_STEP (0xffffffff/TABLE_SIZE)
280 #define PHASE_FRAC (0xffffffff%TABLE_SIZE)
281 #define DIV_X (0x7ffffffe/RADIUS_X+1)
282 #define DIV_Y (0x7ffffffe/RADIUS_Y+1)
284 static int xtable
[TABLE_SIZE
];
285 static int ytable
[TABLE_SIZE
];
287 static void init_tables(void)
296 for (i
= 0; i
< TABLE_SIZE
; i
++) {
297 sin
= fsincos(phase
, NULL
);
298 xtable
[i
] = RADIUS_X
+ sin
/ DIV_X
;
299 ytable
[i
] = RADIUS_Y
+ sin
/ DIV_Y
;
303 if (pfrac
>= TABLE_SIZE
) {
326 struct counter values
[]={
337 #define CLOCK_STEP (0xffffffff/60)
338 #define CLOCK_FRAC (0xffffffff%60)
340 #define DIV_MY (0x7ffffffe/RADIUS_MINUTE+1)
341 #define DIV_HY (0x7ffffffe/RADIUS_HOUR+1)
343 #if LCD_WIDTH == 112 && LCD_HEIGHT == 64 /* Archos LCD: non-square pixels */
344 #define DIV_MX (0x7ffffffe/(5*RADIUS_MINUTE/4)+1)
345 #define DIV_HX (0x7ffffffe/(5*RADIUS_HOUR/4)+1)
346 #else /* Square pixels */
347 #define DIV_MX DIV_MY
348 #define DIV_HX DIV_HY
351 static int xminute
[60], yminute
[60];
352 static int xhour
[60], yhour
[60];
354 static void init_clock(void)
363 for (i
= 0; i
< 60; i
++) {
364 sin
= fsincos(phase
, &cos
);
365 xminute
[i
] = LCD_WIDTH
/2 + sin
/ DIV_MX
;
366 yminute
[i
] = LCD_HEIGHT
/2 - cos
/ DIV_MY
;
367 xhour
[i
] = LCD_WIDTH
/2 + sin
/ DIV_HX
;
368 yhour
[i
] = LCD_HEIGHT
/2 - cos
/ DIV_HY
;
379 static void addclock(void)
385 struct tm
* current_time
= rb
->get_time();
386 hour
= current_time
->tm_hour
;
387 minute
= current_time
->tm_min
;
389 rb
->lcd_drawline(LCD_WIDTH
/2, LCD_HEIGHT
/2,
390 xminute
[minute
], yminute
[minute
]);
392 hour
= (hour
% 12) * 5 + minute
/ 12;
394 rb
->lcd_drawline(LCD_WIDTH
/2, LCD_HEIGHT
/2, xhour
[hour
], yhour
[hour
]);
397 for(i
= 1; i
< 60; i
+= 3)
398 rb
->lcd_drawline(xminute
[i
], yminute
[i
],
399 xminute
[(i
+1)%60], yminute
[(i
+1)%60]);
401 #endif /* CONFIG_RTC */
404 static const unsigned face_colors
[] =
406 #ifdef HAVE_LCD_COLOR
407 LCD_BLACK
, LCD_RGBPACK(0, 0, 255), LCD_RGBPACK(255, 0, 0)
409 LCD_BLACK
, LCD_LIGHTGRAY
, LCD_DARKGRAY
414 static int scrollit(void)
422 unsigned int textpos
=0;
424 char* rock
="Rockbox! Pure pleasure. Pure fun. Oooh. What fun! ;-) ";
425 unsigned int rocklen
= rb
->strlen(rock
);
428 rb
->lcd_clear_display();
431 b
= rb
->button_get_w_tmo(HZ
/10);
434 #ifdef BOUNCE_RC_QUIT
435 case BOUNCE_RC_QUIT
:
442 if ( rb
->default_event_handler(b
) == SYS_USB_CONNECTED
)
445 rb
->lcd_clear_display();
450 for(i
=0, yy
=y
, xx
=x
; xx
< LCD_WIDTH
; i
++) {
451 letter
= rock
[(i
+textpos
) % rocklen
];
453 rb
->lcd_set_foreground(face_colors
[letter
% 3]);
455 rb
->lcd_mono_bitmap(char_gen_12x16
[letter
-0x20],
456 xx
, ytable
[yy
% TABLE_SIZE
],
457 LETTER_WIDTH
, LETTER_HEIGHT
);
462 rb
->lcd_set_foreground(LCD_BLACK
);
468 if(x
< -LETTER_WIDTH
) {
478 static int loopit(void)
485 unsigned int ysanke
=0;
486 unsigned int xsanke
=0;
488 char* rock
="ROCKbox";
489 unsigned int rocklen
= rb
->strlen(rock
);
495 rb
->lcd_clear_display();
498 b
= rb
->button_get_w_tmo(HZ
/10);
499 if ( b
== BOUNCE_QUIT
)
502 if ( b
== BOUNCE_MODE
)
505 if ( rb
->default_event_handler(b
) == SYS_USB_CONNECTED
)
508 if ( b
!= BUTTON_NONE
)
511 y
+= speed
[ysanke
&15] + values
[NUM_YADD
].num
;
512 x
+= speed
[xsanke
&15] + values
[NUM_XADD
].num
;
514 rb
->lcd_clear_display();
521 case BOUNCE_LEFT
|BUTTON_REPEAT
:
525 case BOUNCE_RIGHT
|BUTTON_REPEAT
:
529 case BOUNCE_UP
|BUTTON_REPEAT
:
530 if(++show
== NUM_LAST
)
534 case BOUNCE_DOWN
|BUTTON_REPEAT
:
539 rb
->snprintf(buffer
, 30, "%s: %d",
540 values
[show
].what
, values
[show
].num
);
541 rb
->lcd_putsxy(0, LCD_HEIGHT
- 8, (unsigned char *)buffer
);
546 i
++, yy
+=values
[NUM_YDIST
].num
, xx
+=values
[NUM_XDIST
].num
)
547 rb
->lcd_mono_bitmap(char_gen_12x16
[rock
[i
]-0x20],
548 xtable
[xx
% TABLE_SIZE
],
549 ytable
[yy
% TABLE_SIZE
],
550 LETTER_WIDTH
, LETTER_HEIGHT
);
553 ysanke
+= values
[NUM_YSANKE
].num
;
554 xsanke
+= values
[NUM_XSANKE
].num
;
559 enum plugin_status
plugin_start(struct plugin_api
* api
, void* parameter
)
562 char *off
= "[Off] to stop";
567 rb
->lcd_setfont(FONT_SYSFIXED
);
568 rb
->lcd_clear_display();
570 /* Get horizontel centering for text */
571 rb
->lcd_getstringsize((unsigned char *)SS_TITLE
, &w
, &h
);
572 rb
->lcd_putsxy((LCD_WIDTH
/2) - w
/ 2, (LCD_HEIGHT
/2) - h
/ 2,
573 (unsigned char *)SS_TITLE
);
575 /* Get horizontel centering for text */
576 rb
->lcd_getstringsize((unsigned char *)off
, &w
, &h
);
577 rb
->lcd_putsxy((LCD_WIDTH
/2) - w
/ 2, LCD_HEIGHT
- 2 * h
,
578 (unsigned char *)off
);
582 rb
->lcd_set_drawmode(DRMODE_FG
);
594 rb
->lcd_set_drawmode(DRMODE_SOLID
);
595 rb
->lcd_setfont(FONT_UI
);
597 return (h
== 0) ? PLUGIN_OK
: PLUGIN_USB_CONNECTED
;