Fix warning about missing newline at the EOF
[maemo-rb.git] / apps / plugins / bounce.c
blob5bd81b7fed9755c87b57a9e9ad096cd291787c2b
1 /***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
10 * Copyright (C) 2002 Daniel Stenberg
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
20 **************************************************************************/
21 #include "plugin.h"
22 #include "time.h"
23 #include "lib/fixedpoint.h"
27 #define SS_TITLE "Bouncer"
29 #define YSPEED 2
30 #define XSPEED 3
31 #define YADD -4
33 /* variable button definitions */
34 #if CONFIG_KEYPAD == RECORDER_PAD
35 #define BOUNCE_LEFT BUTTON_LEFT
36 #define BOUNCE_RIGHT BUTTON_RIGHT
37 #define BOUNCE_UP BUTTON_UP
38 #define BOUNCE_DOWN BUTTON_DOWN
39 #define BOUNCE_QUIT (BUTTON_OFF | BUTTON_REL)
40 #define BOUNCE_MODE (BUTTON_ON | BUTTON_REL)
42 #elif CONFIG_KEYPAD == ARCHOS_AV300_PAD
43 #define BOUNCE_LEFT BUTTON_LEFT
44 #define BOUNCE_RIGHT BUTTON_RIGHT
45 #define BOUNCE_UP BUTTON_UP
46 #define BOUNCE_DOWN BUTTON_DOWN
47 #define BOUNCE_QUIT (BUTTON_OFF | BUTTON_REL)
48 #define BOUNCE_MODE (BUTTON_ON | BUTTON_REL)
50 #elif CONFIG_KEYPAD == ONDIO_PAD
51 #define BOUNCE_LEFT BUTTON_LEFT
52 #define BOUNCE_RIGHT BUTTON_RIGHT
53 #define BOUNCE_UP BUTTON_UP
54 #define BOUNCE_DOWN BUTTON_DOWN
55 #define BOUNCE_QUIT (BUTTON_OFF | BUTTON_REL)
56 #define BOUNCE_MODE (BUTTON_MENU | BUTTON_REL)
58 #elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
59 (CONFIG_KEYPAD == IRIVER_H300_PAD)
60 #define BOUNCE_LEFT BUTTON_LEFT
61 #define BOUNCE_RIGHT BUTTON_RIGHT
62 #define BOUNCE_UP BUTTON_UP
63 #define BOUNCE_DOWN BUTTON_DOWN
64 #define BOUNCE_QUIT (BUTTON_OFF | BUTTON_REL)
65 #define BOUNCE_MODE (BUTTON_SELECT | BUTTON_REL)
67 #define BOUNCE_RC_QUIT (BUTTON_RC_STOP | BUTTON_REL)
69 #elif (CONFIG_KEYPAD == IPOD_4G_PAD) || \
70 (CONFIG_KEYPAD == IPOD_3G_PAD) || \
71 (CONFIG_KEYPAD == IPOD_1G2G_PAD)
72 #define BOUNCE_LEFT BUTTON_LEFT
73 #define BOUNCE_RIGHT BUTTON_RIGHT
74 #define BOUNCE_UP BUTTON_SCROLL_BACK
75 #define BOUNCE_DOWN BUTTON_SCROLL_FWD
76 #define BOUNCE_QUIT (BUTTON_MENU | BUTTON_REL)
77 #define BOUNCE_MODE (BUTTON_SELECT | BUTTON_REL)
79 #elif (CONFIG_KEYPAD == IAUDIO_X5M5_PAD)
80 #define BOUNCE_LEFT BUTTON_LEFT
81 #define BOUNCE_RIGHT BUTTON_RIGHT
82 #define BOUNCE_UP BUTTON_UP
83 #define BOUNCE_DOWN BUTTON_DOWN
84 #define BOUNCE_QUIT BUTTON_POWER
85 #define BOUNCE_MODE BUTTON_PLAY
87 #elif (CONFIG_KEYPAD == GIGABEAT_PAD)
88 #define BOUNCE_LEFT BUTTON_LEFT
89 #define BOUNCE_RIGHT BUTTON_RIGHT
90 #define BOUNCE_UP BUTTON_UP
91 #define BOUNCE_DOWN BUTTON_DOWN
92 #define BOUNCE_QUIT BUTTON_POWER
93 #define BOUNCE_MODE BUTTON_A
95 #elif (CONFIG_KEYPAD == SANSA_E200_PAD)
96 #define BOUNCE_LEFT BUTTON_LEFT
97 #define BOUNCE_RIGHT BUTTON_RIGHT
98 #define BOUNCE_UP BUTTON_SCROLL_BACK
99 #define BOUNCE_DOWN BUTTON_SCROLL_FWD
100 #define BOUNCE_QUIT BUTTON_POWER
101 #define BOUNCE_MODE BUTTON_SELECT
103 #elif (CONFIG_KEYPAD == SANSA_FUZE_PAD)
104 #define BOUNCE_LEFT BUTTON_LEFT
105 #define BOUNCE_RIGHT BUTTON_RIGHT
106 #define BOUNCE_UP BUTTON_SCROLL_BACK
107 #define BOUNCE_DOWN BUTTON_SCROLL_FWD
108 #define BOUNCE_QUIT (BUTTON_HOME|BUTTON_REPEAT)
109 #define BOUNCE_MODE BUTTON_SELECT
111 #elif CONFIG_KEYPAD == SANSA_C200_PAD || \
112 CONFIG_KEYPAD == SANSA_CLIP_PAD || \
113 CONFIG_KEYPAD == SANSA_M200_PAD || \
114 CONFIG_KEYPAD == SANSA_CONNECT_PAD
115 #define BOUNCE_LEFT BUTTON_LEFT
116 #define BOUNCE_RIGHT BUTTON_RIGHT
117 #define BOUNCE_UP BUTTON_UP
118 #define BOUNCE_DOWN BUTTON_DOWN
119 #define BOUNCE_QUIT BUTTON_POWER
120 #define BOUNCE_MODE BUTTON_SELECT
122 #elif (CONFIG_KEYPAD == IRIVER_H10_PAD)
123 #define BOUNCE_LEFT BUTTON_LEFT
124 #define BOUNCE_RIGHT BUTTON_RIGHT
125 #define BOUNCE_UP BUTTON_SCROLL_UP
126 #define BOUNCE_DOWN BUTTON_SCROLL_DOWN
127 #define BOUNCE_QUIT BUTTON_POWER
128 #define BOUNCE_MODE BUTTON_PLAY
130 #elif (CONFIG_KEYPAD == GIGABEAT_S_PAD) \
131 || (CONFIG_KEYPAD == SAMSUNG_YPR0_PAD)
132 #define BOUNCE_LEFT BUTTON_LEFT
133 #define BOUNCE_RIGHT BUTTON_RIGHT
134 #define BOUNCE_UP BUTTON_UP
135 #define BOUNCE_DOWN BUTTON_DOWN
136 #define BOUNCE_QUIT BUTTON_BACK
137 #define BOUNCE_MODE BUTTON_MENU
139 #elif (CONFIG_KEYPAD == MROBE100_PAD)
140 #define BOUNCE_LEFT BUTTON_LEFT
141 #define BOUNCE_RIGHT BUTTON_RIGHT
142 #define BOUNCE_UP BUTTON_UP
143 #define BOUNCE_DOWN BUTTON_DOWN
144 #define BOUNCE_QUIT BUTTON_POWER
145 #define BOUNCE_MODE BUTTON_DISPLAY
147 #elif CONFIG_KEYPAD == IAUDIO_M3_PAD
148 #define BOUNCE_LEFT BUTTON_RC_REW
149 #define BOUNCE_RIGHT BUTTON_RC_FF
150 #define BOUNCE_UP BUTTON_RC_VOL_UP
151 #define BOUNCE_DOWN BUTTON_RC_VOL_DOWN
152 #define BOUNCE_QUIT BUTTON_RC_REC
153 #define BOUNCE_MODE BUTTON_RC_MODE
155 #elif (CONFIG_KEYPAD == COWON_D2_PAD)
156 #define BOUNCE_QUIT BUTTON_POWER
157 #define BOUNCE_MODE BUTTON_MENU
159 #elif CONFIG_KEYPAD == CREATIVEZVM_PAD
160 #define BOUNCE_LEFT BUTTON_LEFT
161 #define BOUNCE_RIGHT BUTTON_RIGHT
162 #define BOUNCE_UP BUTTON_UP
163 #define BOUNCE_DOWN BUTTON_DOWN
164 #define BOUNCE_QUIT BUTTON_BACK
165 #define BOUNCE_MODE BUTTON_MENU
167 #elif CONFIG_KEYPAD == PHILIPS_HDD1630_PAD
168 #define BOUNCE_LEFT BUTTON_LEFT
169 #define BOUNCE_RIGHT BUTTON_RIGHT
170 #define BOUNCE_UP BUTTON_UP
171 #define BOUNCE_DOWN BUTTON_DOWN
172 #define BOUNCE_QUIT BUTTON_POWER
173 #define BOUNCE_MODE BUTTON_MENU
175 #elif CONFIG_KEYPAD == PHILIPS_HDD6330_PAD
176 #define BOUNCE_LEFT BUTTON_PREV
177 #define BOUNCE_RIGHT BUTTON_NEXT
178 #define BOUNCE_UP BUTTON_UP
179 #define BOUNCE_DOWN BUTTON_DOWN
180 #define BOUNCE_QUIT BUTTON_POWER
181 #define BOUNCE_MODE BUTTON_MENU
183 #elif CONFIG_KEYPAD == PHILIPS_SA9200_PAD
184 #define BOUNCE_LEFT BUTTON_PREV
185 #define BOUNCE_RIGHT BUTTON_NEXT
186 #define BOUNCE_UP BUTTON_UP
187 #define BOUNCE_DOWN BUTTON_DOWN
188 #define BOUNCE_QUIT BUTTON_POWER
189 #define BOUNCE_MODE BUTTON_MENU
191 #elif (CONFIG_KEYPAD == ONDAVX747_PAD)
192 #define BOUNCE_QUIT BUTTON_POWER
193 #define BOUNCE_MODE BUTTON_MENU
195 #elif (CONFIG_KEYPAD == ONDAVX777_PAD)
196 #define BOUNCE_QUIT BUTTON_POWER
198 #elif CONFIG_KEYPAD == MROBE500_PAD
199 #define BOUNCE_QUIT BUTTON_POWER
201 #elif CONFIG_KEYPAD == SAMSUNG_YH_PAD
202 #define BOUNCE_LEFT BUTTON_LEFT
203 #define BOUNCE_RIGHT BUTTON_RIGHT
204 #define BOUNCE_UP BUTTON_UP
205 #define BOUNCE_DOWN BUTTON_DOWN
206 #define BOUNCE_QUIT BUTTON_FFWD
207 #define BOUNCE_MODE BUTTON_PLAY
209 #elif CONFIG_KEYPAD == PBELL_VIBE500_PAD
210 #define BOUNCE_LEFT BUTTON_PREV
211 #define BOUNCE_RIGHT BUTTON_NEXT
212 #define BOUNCE_UP BUTTON_UP
213 #define BOUNCE_DOWN BUTTON_DOWN
214 #define BOUNCE_QUIT BUTTON_REC
215 #define BOUNCE_MODE BUTTON_MENU
217 #elif CONFIG_KEYPAD == MPIO_HD200_PAD
218 #define BOUNCE_LEFT BUTTON_VOL_DOWN
219 #define BOUNCE_RIGHT BUTTON_VOL_UP
220 #define BOUNCE_UP BUTTON_REW
221 #define BOUNCE_DOWN BUTTON_FF
222 #define BOUNCE_QUIT (BUTTON_REC | BUTTON_PLAY)
223 #define BOUNCE_MODE BUTTON_FUNC
225 #elif CONFIG_KEYPAD == MPIO_HD300_PAD
226 #define BOUNCE_LEFT BUTTON_REW
227 #define BOUNCE_RIGHT BUTTON_FF
228 #define BOUNCE_UP BUTTON_UP
229 #define BOUNCE_DOWN BUTTON_DOWN
230 #define BOUNCE_QUIT (BUTTON_REC | BUTTON_REPEAT)
231 #define BOUNCE_MODE BUTTON_MENU
233 #elif CONFIG_KEYPAD == SANSA_FUZEPLUS_PAD
234 #define BOUNCE_LEFT BUTTON_LEFT
235 #define BOUNCE_RIGHT BUTTON_RIGHT
236 #define BOUNCE_UP BUTTON_UP
237 #define BOUNCE_DOWN BUTTON_DOWN
238 #define BOUNCE_QUIT BUTTON_POWER
239 #define BOUNCE_MODE BUTTON_PLAYPAUSE
241 #else
242 #error No keymap defined!
243 #endif
245 #ifdef HAVE_TOUCHSCREEN
246 #ifndef BOUNCE_LEFT
247 #define BOUNCE_LEFT BUTTON_MIDLEFT
248 #endif
249 #ifndef BOUNCE_RIGHT
250 #define BOUNCE_RIGHT BUTTON_MIDRIGHT
251 #endif
252 #ifndef BOUNCE_UP
253 #define BOUNCE_UP BUTTON_TOPMIDDLE
254 #endif
255 #ifndef BOUNCE_DOWN
256 #define BOUNCE_DOWN BUTTON_BOTTOMMIDDLE
257 #endif
258 #ifndef BOUNCE_QUIT
259 #define BOUNCE_QUIT BUTTON_TOPLEFT
260 #endif
261 #ifndef BOUNCE_MODE
262 #define BOUNCE_MODE BUTTON_CENTER
263 #endif
264 #endif
266 #define LETTER_WIDTH 11
267 #define LETTER_HEIGHT 16
269 const unsigned char char_gen_12x16[][22] =
271 { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
272 { 0x00,0x00,0x00,0x7c,0xff,0xff,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x33,0x00,0x00,0x00,0x00,0x00 },
273 { 0x00,0x00,0x3c,0x3c,0x00,0x00,0x3c,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
274 { 0x00,0x10,0x90,0xf0,0x7e,0x1e,0x90,0xf0,0x7e,0x1e,0x10,0x02,0x1e,0x1f,0x03,0x02,0x1e,0x1f,0x03,0x02,0x00,0x00 },
275 { 0x00,0x78,0xfc,0xcc,0xff,0xff,0xcc,0xcc,0x88,0x00,0x00,0x00,0x04,0x0c,0x0c,0x3f,0x3f,0x0c,0x0f,0x07,0x00,0x00 },
276 { 0x00,0x38,0x38,0x38,0x00,0x80,0xc0,0xe0,0x70,0x38,0x1c,0x30,0x38,0x1c,0x0e,0x07,0x03,0x01,0x38,0x38,0x38,0x00 },
277 { 0x00,0x00,0xb8,0xfc,0xc6,0xe2,0x3e,0x1c,0x00,0x00,0x00,0x00,0x1f,0x3f,0x31,0x21,0x37,0x1e,0x1c,0x36,0x22,0x00 },
278 { 0x00,0x00,0x00,0x27,0x3f,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
279 { 0x00,0x00,0xf0,0xfc,0xfe,0x07,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x03,0x0f,0x1f,0x38,0x20,0x20,0x00,0x00,0x00 },
280 { 0x00,0x00,0x01,0x01,0x07,0xfe,0xfc,0xf0,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x38,0x1f,0x0f,0x03,0x00,0x00,0x00 },
281 { 0x00,0x98,0xb8,0xe0,0xf8,0xf8,0xe0,0xb8,0x98,0x00,0x00,0x00,0x0c,0x0e,0x03,0x0f,0x0f,0x03,0x0e,0x0c,0x00,0x00 },
282 { 0x00,0x80,0x80,0x80,0xf0,0xf0,0x80,0x80,0x80,0x00,0x00,0x00,0x01,0x01,0x01,0x0f,0x0f,0x01,0x01,0x01,0x00,0x00 },
283 { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0xf8,0x78,0x00,0x00,0x00,0x00,0x00 },
284 { 0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00 },
285 { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x38,0x38,0x00,0x00,0x00,0x00,0x00 },
286 { 0x00,0x00,0x00,0x00,0x80,0xc0,0xe0,0x70,0x38,0x1c,0x0e,0x18,0x1c,0x0e,0x07,0x03,0x01,0x00,0x00,0x00,0x00,0x00 },
287 { 0xf8,0xfe,0x06,0x03,0x83,0xc3,0x63,0x33,0x1e,0xfe,0xf8,0x07,0x1f,0x1e,0x33,0x31,0x30,0x30,0x30,0x18,0x1f,0x07 },
288 { 0x00,0x00,0x0c,0x0c,0x0e,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x3f,0x3f,0x30,0x30,0x30,0x00 },
289 { 0x1c,0x1e,0x07,0x03,0x03,0x83,0xc3,0xe3,0x77,0x3e,0x1c,0x30,0x38,0x3c,0x3e,0x37,0x33,0x31,0x30,0x30,0x30,0x30 },
290 { 0x0c,0x0e,0x07,0xc3,0xc3,0xc3,0xc3,0xc3,0xe7,0x7e,0x3c,0x0c,0x1c,0x38,0x30,0x30,0x30,0x30,0x30,0x39,0x1f,0x0e },
291 { 0xc0,0xe0,0x70,0x38,0x1c,0x0e,0x07,0xff,0xff,0x00,0x00,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x3f,0x3f,0x03,0x03 },
292 { 0x3f,0x7f,0x63,0x63,0x63,0x63,0x63,0x63,0xe3,0xc3,0x83,0x0c,0x1c,0x38,0x30,0x30,0x30,0x30,0x30,0x38,0x1f,0x0f },
293 { 0xc0,0xf0,0xf8,0xdc,0xce,0xc7,0xc3,0xc3,0xc3,0x80,0x00,0x0f,0x1f,0x39,0x30,0x30,0x30,0x30,0x30,0x39,0x1f,0x0f },
294 { 0x03,0x03,0x03,0x03,0x03,0x03,0xc3,0xf3,0x3f,0x0f,0x03,0x00,0x00,0x00,0x30,0x3c,0x0f,0x03,0x00,0x00,0x00,0x00 },
295 { 0x00,0xbc,0xfe,0xe7,0xc3,0xc3,0xc3,0xe7,0xfe,0xbc,0x00,0x0f,0x1f,0x39,0x30,0x30,0x30,0x30,0x30,0x39,0x1f,0x0f },
296 { 0x3c,0x7e,0xe7,0xc3,0xc3,0xc3,0xc3,0xc3,0xe7,0xfe,0xfc,0x00,0x00,0x30,0x30,0x30,0x38,0x1c,0x0e,0x07,0x03,0x00 },
297 { 0x00,0x00,0x00,0x70,0x70,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x1c,0x1c,0x00,0x00,0x00,0x00,0x00 },
298 { 0x00,0x00,0x00,0x70,0x70,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0xfc,0x7c,0x00,0x00,0x00,0x00,0x00 },
299 { 0x00,0xc0,0xe0,0xf0,0x38,0x1c,0x0e,0x07,0x03,0x00,0x00,0x00,0x00,0x01,0x03,0x07,0x0e,0x1c,0x38,0x30,0x00,0x00 },
300 { 0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x00 },
301 { 0x00,0x03,0x07,0x0e,0x1c,0x38,0xf0,0xe0,0xc0,0x00,0x00,0x00,0x30,0x38,0x1c,0x0e,0x07,0x03,0x01,0x00,0x00,0x00 },
302 { 0x1c,0x1e,0x07,0x03,0x83,0xc3,0xe3,0x77,0x3e,0x1c,0x00,0x00,0x00,0x00,0x00,0x37,0x37,0x00,0x00,0x00,0x00,0x00 },
303 { 0xf8,0xfe,0x07,0xf3,0xfb,0x1b,0xfb,0xfb,0x07,0xfe,0xf8,0x0f,0x1f,0x18,0x33,0x37,0x36,0x37,0x37,0x36,0x03,0x01 },
304 { 0x00,0x00,0xe0,0xfc,0x1f,0x1f,0xfc,0xe0,0x00,0x00,0x00,0x38,0x3f,0x07,0x06,0x06,0x06,0x06,0x07,0x3f,0x38,0x00 },
305 { 0xff,0xff,0xc3,0xc3,0xc3,0xc3,0xe7,0xfe,0xbc,0x00,0x00,0x3f,0x3f,0x30,0x30,0x30,0x30,0x30,0x39,0x1f,0x0f,0x00 },
306 { 0xf0,0xfc,0x0e,0x07,0x03,0x03,0x03,0x07,0x0e,0x0c,0x00,0x03,0x0f,0x1c,0x38,0x30,0x30,0x30,0x38,0x1c,0x0c,0x00 },
307 { 0xff,0xff,0x03,0x03,0x03,0x03,0x07,0x0e,0xfc,0xf0,0x00,0x3f,0x3f,0x30,0x30,0x30,0x30,0x38,0x1c,0x0f,0x03,0x00 },
308 { 0xff,0xff,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0x03,0x03,0x00,0x3f,0x3f,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x00 },
309 { 0xff,0xff,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0x03,0x03,0x00,0x3f,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
310 { 0xf0,0xfc,0x0e,0x07,0x03,0xc3,0xc3,0xc3,0xc7,0xc6,0x00,0x03,0x0f,0x1c,0x38,0x30,0x30,0x30,0x30,0x3f,0x3f,0x00 },
311 { 0xff,0xff,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xff,0xff,0x00,0x3f,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x3f,0x00 },
312 { 0x00,0x00,0x03,0x03,0xff,0xff,0x03,0x03,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x3f,0x3f,0x30,0x30,0x00,0x00,0x00 },
313 { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x0e,0x1e,0x38,0x30,0x30,0x30,0x30,0x38,0x1f,0x07,0x00 },
314 { 0xff,0xff,0xc0,0xe0,0xf0,0x38,0x1c,0x0e,0x07,0x03,0x00,0x3f,0x3f,0x00,0x01,0x03,0x07,0x0e,0x1c,0x38,0x30,0x00 },
315 { 0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x3f,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x00 },
316 { 0xff,0xff,0x1e,0x78,0xe0,0xe0,0x78,0x1e,0xff,0xff,0x00,0x3f,0x3f,0x00,0x00,0x01,0x01,0x00,0x00,0x3f,0x3f,0x00 },
317 { 0xff,0xff,0x0e,0x38,0xf0,0xc0,0x00,0x00,0xff,0xff,0x00,0x3f,0x3f,0x00,0x00,0x00,0x03,0x07,0x1c,0x3f,0x3f,0x00 },
318 { 0xf0,0xfc,0x0e,0x07,0x03,0x03,0x07,0x0e,0xfc,0xf0,0x00,0x03,0x0f,0x1c,0x38,0x30,0x30,0x38,0x1c,0x0f,0x03,0x00 },
319 { 0xff,0xff,0x83,0x83,0x83,0x83,0x83,0xc7,0xfe,0x7c,0x00,0x3f,0x3f,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x00 },
320 { 0xf0,0xfc,0x0e,0x07,0x03,0x03,0x07,0x0e,0xfc,0xf0,0x00,0x03,0x0f,0x1c,0x38,0x30,0x36,0x3e,0x1c,0x3f,0x33,0x00 },
321 { 0xff,0xff,0x83,0x83,0x83,0x83,0x83,0xc7,0xfe,0x7c,0x00,0x3f,0x3f,0x01,0x01,0x03,0x07,0x0f,0x1d,0x38,0x30,0x00 },
322 { 0x3c,0x7e,0xe7,0xc3,0xc3,0xc3,0xc3,0xc7,0x8e,0x0c,0x00,0x0c,0x1c,0x38,0x30,0x30,0x30,0x30,0x39,0x1f,0x0f,0x00 },
323 { 0x00,0x03,0x03,0x03,0xff,0xff,0x03,0x03,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x3f,0x00,0x00,0x00,0x00,0x00 },
324 { 0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x07,0x1f,0x38,0x30,0x30,0x30,0x30,0x38,0x1f,0x07,0x00 },
325 { 0x07,0x3f,0xf8,0xc0,0x00,0x00,0xc0,0xf8,0x3f,0x07,0x00,0x00,0x00,0x01,0x0f,0x3e,0x3e,0x0f,0x01,0x00,0x00,0x00 },
326 { 0xff,0xff,0x00,0x00,0x80,0x80,0x00,0x00,0xff,0xff,0x00,0x3f,0x3f,0x1c,0x06,0x03,0x03,0x06,0x1c,0x3f,0x3f,0x00 },
327 { 0x03,0x0f,0x1c,0x30,0xe0,0xe0,0x30,0x1c,0x0f,0x03,0x00,0x30,0x3c,0x0e,0x03,0x01,0x01,0x03,0x0e,0x3c,0x30,0x00 },
328 { 0x03,0x0f,0x3c,0xf0,0xc0,0xc0,0xf0,0x3c,0x0f,0x03,0x00,0x00,0x00,0x00,0x00,0x3f,0x3f,0x00,0x00,0x00,0x00,0x00 },
329 { 0x03,0x03,0x03,0x03,0xc3,0xe3,0x33,0x1f,0x0f,0x03,0x00,0x30,0x3c,0x3e,0x33,0x31,0x30,0x30,0x30,0x30,0x30,0x00 },
330 { 0x00,0x00,0xff,0xff,0x03,0x03,0x03,0x03,0x00,0x00,0x00,0x00,0x00,0x3f,0x3f,0x30,0x30,0x30,0x30,0x00,0x00,0x00 },
331 { 0x0e,0x1c,0x38,0x70,0xe0,0xc0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x07,0x0e,0x1c,0x18 },
332 { 0x00,0x00,0x03,0x03,0x03,0x03,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x30,0x3f,0x3f,0x00,0x00,0x00 },
333 { 0x60,0x70,0x38,0x1c,0x0e,0x07,0x0e,0x1c,0x38,0x70,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
334 { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0 },
335 { 0x00,0x00,0x00,0x00,0x3e,0x7e,0x4e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
336 { 0x00,0x40,0x60,0x60,0x60,0x60,0x60,0x60,0xe0,0xc0,0x00,0x1c,0x3e,0x33,0x33,0x33,0x33,0x33,0x33,0x3f,0x3f,0x00 },
337 { 0xff,0xff,0xc0,0x60,0x60,0x60,0x60,0xe0,0xc0,0x80,0x00,0x3f,0x3f,0x30,0x30,0x30,0x30,0x30,0x38,0x1f,0x0f,0x00 },
338 { 0x80,0xc0,0xe0,0x60,0x60,0x60,0x60,0x60,0xc0,0x80,0x00,0x0f,0x1f,0x38,0x30,0x30,0x30,0x30,0x30,0x18,0x08,0x00 },
339 { 0x80,0xc0,0xe0,0x60,0x60,0x60,0xe0,0xc0,0xff,0xff,0x00,0x0f,0x1f,0x38,0x30,0x30,0x30,0x30,0x30,0x3f,0x3f,0x00 },
340 { 0x80,0xc0,0xe0,0x60,0x60,0x60,0x60,0x60,0xc0,0x80,0x00,0x0f,0x1f,0x3b,0x33,0x33,0x33,0x33,0x33,0x13,0x01,0x00 },
341 { 0xc0,0xc0,0xfc,0xfe,0xc7,0xc3,0xc3,0x03,0x00,0x00,0x00,0x00,0x00,0x3f,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
342 { 0x80,0xc0,0xe0,0x60,0x60,0x60,0x60,0x60,0xe0,0xe0,0x00,0x03,0xc7,0xce,0xcc,0xcc,0xcc,0xcc,0xe6,0x7f,0x3f,0x00 },
343 { 0xff,0xff,0xc0,0x60,0x60,0x60,0xe0,0xc0,0x80,0x00,0x00,0x3f,0x3f,0x00,0x00,0x00,0x00,0x00,0x3f,0x3f,0x00,0x00 },
344 { 0x00,0x00,0x00,0x60,0xec,0xec,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x3f,0x3f,0x30,0x30,0x00,0x00,0x00 },
345 { 0x00,0x00,0x00,0x00,0x00,0x60,0xec,0xec,0x00,0x00,0x00,0x00,0x00,0x60,0xe0,0xc0,0xc0,0xff,0x7f,0x00,0x00,0x00 },
346 { 0x00,0xff,0xff,0x00,0x80,0xc0,0xe0,0x60,0x00,0x00,0x00,0x00,0x3f,0x3f,0x03,0x07,0x0f,0x1c,0x38,0x30,0x00,0x00 },
347 { 0x00,0x00,0x00,0x03,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x3f,0x3f,0x30,0x30,0x00,0x00,0x00 },
348 { 0xe0,0xc0,0xe0,0xe0,0xc0,0xc0,0xe0,0xe0,0xc0,0x80,0x00,0x3f,0x3f,0x00,0x00,0x3f,0x3f,0x00,0x00,0x3f,0x3f,0x00 },
349 { 0x00,0xe0,0xe0,0x60,0x60,0x60,0x60,0xe0,0xc0,0x80,0x00,0x00,0x3f,0x3f,0x00,0x00,0x00,0x00,0x00,0x3f,0x3f,0x00 },
350 { 0x80,0xc0,0xe0,0x60,0x60,0x60,0x60,0xe0,0xc0,0x80,0x00,0x0f,0x1f,0x38,0x30,0x30,0x30,0x30,0x38,0x1f,0x0f,0x00 },
351 { 0xe0,0xe0,0x60,0x60,0x60,0x60,0x60,0xe0,0xc0,0x80,0x00,0xff,0xff,0x0c,0x18,0x18,0x18,0x18,0x1c,0x0f,0x07,0x00 },
352 { 0x80,0xc0,0xe0,0x60,0x60,0x60,0x60,0x60,0xe0,0xe0,0x00,0x07,0x0f,0x1c,0x18,0x18,0x18,0x18,0x0c,0xff,0xff,0x00 },
353 { 0x00,0xe0,0xe0,0xc0,0x60,0x60,0x60,0x60,0xe0,0xc0,0x00,0x00,0x3f,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
354 { 0xc0,0xe0,0x60,0x60,0x60,0x60,0x60,0x40,0x00,0x00,0x00,0x11,0x33,0x33,0x33,0x33,0x33,0x3f,0x1e,0x00,0x00,0x00 },
355 { 0x60,0x60,0xfe,0xfe,0x60,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x3f,0x30,0x30,0x30,0x30,0x00,0x00,0x00 },
356 { 0xe0,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xe0,0x00,0x0f,0x1f,0x38,0x30,0x30,0x30,0x30,0x18,0x3f,0x3f,0x00 },
357 { 0x60,0xe0,0x80,0x00,0x00,0x00,0x00,0x80,0xe0,0x60,0x00,0x00,0x01,0x07,0x1e,0x38,0x38,0x1e,0x07,0x01,0x00,0x00 },
358 { 0xe0,0xe0,0x00,0x00,0xe0,0xe0,0x00,0x00,0xe0,0xe0,0x00,0x07,0x1f,0x38,0x1c,0x0f,0x0f,0x1c,0x38,0x1f,0x07,0x00 },
359 { 0x60,0xe0,0xc0,0x80,0x00,0x80,0xc0,0xe0,0x60,0x00,0x00,0x30,0x38,0x1d,0x0f,0x07,0x0f,0x1d,0x38,0x30,0x00,0x00 },
360 { 0x00,0x60,0xe0,0x80,0x00,0x00,0x80,0xe0,0x60,0x00,0x00,0x00,0x00,0x81,0xe7,0x7e,0x1e,0x07,0x01,0x00,0x00,0x00 },
361 { 0x60,0x60,0x60,0x60,0x60,0xe0,0xe0,0x60,0x20,0x00,0x00,0x30,0x38,0x3c,0x36,0x33,0x31,0x30,0x30,0x30,0x00,0x00 },
362 { 0x00,0x80,0xc0,0xfc,0x7e,0x07,0x03,0x03,0x03,0x00,0x00,0x00,0x00,0x01,0x1f,0x3f,0x70,0x60,0x60,0x60,0x00,0x00 },
363 { 0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x3f,0x00,0x00,0x00,0x00,0x00 },
364 { 0x00,0x03,0x03,0x03,0x07,0x7e,0xfc,0xc0,0x80,0x00,0x00,0x00,0x60,0x60,0x60,0x70,0x3f,0x1f,0x01,0x00,0x00,0x00 },
365 { 0x10,0x18,0x0c,0x04,0x0c,0x18,0x10,0x18,0x0c,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
366 { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x00 }
369 static signed char speed[]={
370 1,2,3,3,3,2,1,0,-1,-2,-2,-2,-1,0,0,1,
373 #if LCD_WIDTH > LCD_HEIGHT /* landscape LCD */
375 #define TABLE_SIZE LCD_HEIGHT
376 #define RADIUS_MINUTE (3*LCD_HEIGHT/8)
377 #define RADIUS_HOUR (LCD_HEIGHT/4)
379 #else /* portrait (or square) LCD */
381 #define TABLE_SIZE LCD_WIDTH
382 #define RADIUS_MINUTE (3*LCD_WIDTH/8)
383 #define RADIUS_HOUR (LCD_WIDTH/4)
385 #endif /* LCD orientation */
387 #define RADIUS_X ((LCD_WIDTH-LETTER_WIDTH)/2)
388 #define RADIUS_Y ((LCD_HEIGHT-LETTER_HEIGHT)/2)
390 #define PHASE_STEP (0xffffffff/TABLE_SIZE)
391 #define PHASE_FRAC (0xffffffff%TABLE_SIZE)
392 #define DIV_X (0x7ffffffe/RADIUS_X+1)
393 #define DIV_Y (0x7ffffffe/RADIUS_Y+1)
395 static int xtable[TABLE_SIZE];
396 static int ytable[TABLE_SIZE];
398 static void init_tables(void)
400 int i;
401 int pfrac;
402 unsigned long phase;
403 long sin;
405 phase = pfrac = 0;
407 for (i = 0; i < TABLE_SIZE; i++) {
408 sin = fp_sincos(phase, NULL);
409 xtable[i] = RADIUS_X + sin / DIV_X;
410 ytable[i] = RADIUS_Y + sin / DIV_Y;
412 phase += PHASE_STEP;
413 pfrac += PHASE_FRAC;
414 if (pfrac >= TABLE_SIZE) {
415 pfrac -= TABLE_SIZE;
416 phase++;
421 enum {
422 NUM_XSANKE,
423 NUM_YSANKE,
424 NUM_XADD,
425 NUM_YADD,
426 NUM_XDIST,
427 NUM_YDIST,
429 NUM_LAST
432 struct counter {
433 char *what;
434 int num;
437 struct counter values[]={
438 {"xsanke", 1},
439 {"ysanke", 1},
440 {"xadd", 1},
441 {"yadd", 2},
442 {"xdist", -4},
443 {"ydist", -6},
446 #if CONFIG_RTC
448 #define CLOCK_STEP (0xffffffff/60)
449 #define CLOCK_FRAC (0xffffffff%60)
451 #define DIV_MY (0x7ffffffe/RADIUS_MINUTE+1)
452 #define DIV_HY (0x7ffffffe/RADIUS_HOUR+1)
454 #if LCD_WIDTH == 112 && LCD_HEIGHT == 64 /* Archos LCD: non-square pixels */
455 #define DIV_MX (0x7ffffffe/(5*RADIUS_MINUTE/4)+1)
456 #define DIV_HX (0x7ffffffe/(5*RADIUS_HOUR/4)+1)
457 #else /* Square pixels */
458 #define DIV_MX DIV_MY
459 #define DIV_HX DIV_HY
460 #endif
462 static int xminute[60], yminute[60];
463 static int xhour[60], yhour[60];
465 static void init_clock(void)
467 int i;
468 int pfrac;
469 unsigned long phase;
470 long sin, cos;
472 phase = pfrac = 0;
474 for (i = 0; i < 60; i++) {
475 sin = fp_sincos(phase, &cos);
476 xminute[i] = LCD_WIDTH/2 + sin / DIV_MX;
477 yminute[i] = LCD_HEIGHT/2 - cos / DIV_MY;
478 xhour[i] = LCD_WIDTH/2 + sin / DIV_HX;
479 yhour[i] = LCD_HEIGHT/2 - cos / DIV_HY;
481 phase += CLOCK_STEP;
482 pfrac += CLOCK_FRAC;
483 if (pfrac >= 60) {
484 pfrac -= 60;
485 phase++;
490 static void addclock(void)
492 int i;
493 int hour;
494 int minute;
496 struct tm* current_time = rb->get_time();
497 hour = current_time->tm_hour;
498 minute = current_time->tm_min;
500 rb->lcd_drawline(LCD_WIDTH/2, LCD_HEIGHT/2,
501 xminute[minute], yminute[minute]);
503 hour = (hour % 12) * 5 + minute / 12;
505 rb->lcd_drawline(LCD_WIDTH/2, LCD_HEIGHT/2, xhour[hour], yhour[hour]);
507 /* draw a circle */
508 for(i = 1; i < 60; i += 3)
509 rb->lcd_drawline(xminute[i], yminute[i],
510 xminute[(i+1)%60], yminute[(i+1)%60]);
512 #endif /* CONFIG_RTC */
514 #if LCD_DEPTH > 1
515 static const unsigned face_colors[] =
517 #ifdef HAVE_LCD_COLOR
518 LCD_BLACK, LCD_RGBPACK(0, 0, 255), LCD_RGBPACK(255, 0, 0)
519 #else
520 LCD_BLACK, LCD_LIGHTGRAY, LCD_DARKGRAY
521 #endif
523 #endif
525 static int scrollit(void)
527 int b;
528 unsigned int y=100;
529 unsigned int yy;
530 int x = LCD_WIDTH;
531 int xx;
532 unsigned int i;
533 unsigned int textpos=0;
535 char* rock="Rockbox! Pure pleasure. Pure fun. Oooh. What fun! ;-) ";
536 unsigned int rocklen = rb->strlen(rock);
537 int letter;
538 #if LCD_DEPTH > 1
539 unsigned prev_color;
540 #endif
542 rb->lcd_clear_display();
543 while(1)
545 b = rb->button_get_w_tmo(HZ/10);
546 switch(b)
548 #ifdef BOUNCE_RC_QUIT
549 case BOUNCE_RC_QUIT :
550 #endif
551 case BOUNCE_QUIT :
552 return 0;
553 case BOUNCE_MODE :
554 return 1;
555 default:
556 if ( rb->default_event_handler(b) == SYS_USB_CONNECTED )
557 return -1;
559 rb->lcd_clear_display();
560 #if CONFIG_RTC
561 addclock();
562 #endif
564 #if LCD_DEPTH > 1
565 prev_color = rb->lcd_get_foreground();
566 #endif
568 for(i=0, yy=y, xx=x; xx < LCD_WIDTH; i++) {
569 letter = rock[(i+textpos) % rocklen ];
570 #if LCD_DEPTH > 1
571 rb->lcd_set_foreground(face_colors[letter % 3]);
572 #endif
573 rb->lcd_mono_bitmap(char_gen_12x16[letter-0x20],
574 xx, ytable[yy % TABLE_SIZE],
575 LETTER_WIDTH, LETTER_HEIGHT);
576 yy += YADD;
577 xx += LETTER_WIDTH;
579 #if LCD_DEPTH > 1
580 rb->lcd_set_foreground(prev_color);
581 #endif
582 rb->lcd_update();
584 x-= XSPEED;
586 if(x < -LETTER_WIDTH) {
587 x += LETTER_WIDTH;
588 y += YADD;
589 textpos++;
592 y+=YSPEED;
596 static int loopit(void)
598 int b;
599 unsigned int y=100;
600 unsigned int x=100;
601 unsigned int yy,xx;
602 unsigned int i;
603 unsigned int ysanke=0;
604 unsigned int xsanke=0;
606 char* rock="ROCKbox";
607 unsigned int rocklen = rb->strlen(rock);
609 int show=0;
610 int timeout=0;
612 rb->lcd_clear_display();
613 while(1)
615 b = rb->button_get_w_tmo(HZ/10);
616 if ( b == BOUNCE_QUIT )
617 return 0;
619 if ( b == BOUNCE_MODE )
620 return 1;
622 if ( rb->default_event_handler(b) == SYS_USB_CONNECTED )
623 return -1;
625 if ( b != BUTTON_NONE )
626 timeout=20;
628 y+= speed[ysanke&15] + values[NUM_YADD].num;
629 x+= speed[xsanke&15] + values[NUM_XADD].num;
631 rb->lcd_clear_display();
632 #if CONFIG_RTC
633 addclock();
634 #endif
635 if(timeout) {
636 switch(b) {
637 case BOUNCE_LEFT:
638 case BOUNCE_LEFT|BUTTON_REPEAT:
639 values[show].num--;
640 break;
641 case BOUNCE_RIGHT:
642 case BOUNCE_RIGHT|BUTTON_REPEAT:
643 values[show].num++;
644 break;
645 case BOUNCE_UP:
646 case BOUNCE_UP|BUTTON_REPEAT:
647 if(++show == NUM_LAST)
648 show=0;
649 break;
650 case BOUNCE_DOWN:
651 case BOUNCE_DOWN|BUTTON_REPEAT:
652 if(--show < 0)
653 show=NUM_LAST-1;
654 break;
656 rb->lcd_putsxyf(0, LCD_HEIGHT - 8, "%s: %d",
657 values[show].what, values[show].num);
658 timeout--;
660 for(i=0, yy=y, xx=x;
661 i<rocklen;
662 i++, yy+=values[NUM_YDIST].num, xx+=values[NUM_XDIST].num)
663 rb->lcd_mono_bitmap(char_gen_12x16[rock[i]-0x20],
664 xtable[xx % TABLE_SIZE],
665 ytable[yy % TABLE_SIZE],
666 LETTER_WIDTH, LETTER_HEIGHT);
667 rb->lcd_update();
669 ysanke+= values[NUM_YSANKE].num;
670 xsanke+= values[NUM_XSANKE].num;
675 enum plugin_status plugin_start(const void* parameter)
677 int w, h;
678 char *off = "[Off] to stop";
680 (void)(parameter);
682 rb->lcd_setfont(FONT_SYSFIXED);
683 rb->lcd_clear_display();
685 /* Get horizontel centering for text */
686 rb->lcd_getstringsize((unsigned char *)SS_TITLE, &w, &h);
687 rb->lcd_putsxy((LCD_WIDTH/2) - w / 2, (LCD_HEIGHT/2) - h / 2,
688 (unsigned char *)SS_TITLE);
690 /* Get horizontel centering for text */
691 rb->lcd_getstringsize((unsigned char *)off, &w, &h);
692 rb->lcd_putsxy((LCD_WIDTH/2) - w / 2, LCD_HEIGHT - 2 * h,
693 (unsigned char *)off);
695 rb->lcd_update();
696 rb->sleep(HZ);
697 rb->lcd_set_drawmode(DRMODE_FG);
698 init_tables();
699 #if CONFIG_RTC
700 init_clock();
701 #endif
703 do {
704 h = loopit();
705 if (h > 0)
706 h = scrollit();
707 } while(h > 0);
709 rb->lcd_set_drawmode(DRMODE_SOLID);
710 rb->lcd_setfont(FONT_UI);
712 return (h == 0) ? PLUGIN_OK : PLUGIN_USB_CONNECTED;