New makefile solution: A single invocation of 'make' to build the entire tree. Fully...
[kugel-rb.git] / apps / plugins / starfield.c
blob536213686ab55218dff685c3a68b9083688c3b94
1 /***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * Copyright (C) 2005 Kevin Ferrare
10 * This program is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU General Public License
12 * as published by the Free Software Foundation; either version 2
13 * of the License, or (at your option) any later version.
15 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
16 * KIND, either express or implied.
18 ****************************************************************************/
20 #include "plugin.h"
21 #include "lib/helper.h"
23 #ifdef HAVE_LCD_BITMAP /* and also not for the Player */
25 PLUGIN_HEADER
27 /******************************* Globals ***********************************/
29 static const struct plugin_api* rb; /* global api struct pointer */
31 /* Key assignement */
32 #if (CONFIG_KEYPAD == IPOD_4G_PAD) || \
33 (CONFIG_KEYPAD == IPOD_3G_PAD) || \
34 (CONFIG_KEYPAD == IPOD_1G2G_PAD)
35 #define STARFIELD_QUIT BUTTON_MENU
36 #define STARFIELD_INCREASE_ZMOVE BUTTON_SCROLL_FWD
37 #define STARFIELD_DECREASE_ZMOVE BUTTON_SCROLL_BACK
38 #define STARFIELD_INCREASE_NB_STARS BUTTON_RIGHT
39 #define STARFIELD_DECREASE_NB_STARS BUTTON_LEFT
40 #define STARFIELD_TOGGLE_COLOR BUTTON_PLAY
41 #elif (CONFIG_KEYPAD == IAUDIO_X5M5_PAD)
42 #define STARFIELD_QUIT BUTTON_POWER
43 #define STARFIELD_INCREASE_ZMOVE BUTTON_UP
44 #define STARFIELD_DECREASE_ZMOVE BUTTON_DOWN
45 #define STARFIELD_INCREASE_NB_STARS BUTTON_RIGHT
46 #define STARFIELD_DECREASE_NB_STARS BUTTON_LEFT
47 #define STARFIELD_TOGGLE_COLOR BUTTON_PLAY
48 #elif (CONFIG_KEYPAD == IRIVER_H10_PAD)
49 #define STARFIELD_QUIT BUTTON_POWER
50 #define STARFIELD_INCREASE_ZMOVE BUTTON_SCROLL_UP
51 #define STARFIELD_DECREASE_ZMOVE BUTTON_SCROLL_DOWN
52 #define STARFIELD_INCREASE_NB_STARS BUTTON_RIGHT
53 #define STARFIELD_DECREASE_NB_STARS BUTTON_LEFT
54 #define STARFIELD_TOGGLE_COLOR BUTTON_PLAY
55 #elif (CONFIG_KEYPAD == GIGABEAT_PAD)
56 #define STARFIELD_QUIT BUTTON_POWER
57 #define STARFIELD_INCREASE_ZMOVE BUTTON_UP
58 #define STARFIELD_DECREASE_ZMOVE BUTTON_DOWN
59 #define STARFIELD_INCREASE_NB_STARS BUTTON_RIGHT
60 #define STARFIELD_DECREASE_NB_STARS BUTTON_LEFT
61 #define STARFIELD_TOGGLE_COLOR BUTTON_SELECT
62 #elif (CONFIG_KEYPAD == SANSA_E200_PAD) || \
63 (CONFIG_KEYPAD == SANSA_C200_PAD)
64 #define STARFIELD_QUIT BUTTON_POWER
65 #define STARFIELD_INCREASE_ZMOVE BUTTON_UP
66 #define STARFIELD_DECREASE_ZMOVE BUTTON_DOWN
67 #define STARFIELD_INCREASE_NB_STARS BUTTON_RIGHT
68 #define STARFIELD_DECREASE_NB_STARS BUTTON_LEFT
69 #define STARFIELD_TOGGLE_COLOR BUTTON_SELECT
70 #elif (CONFIG_KEYPAD == GIGABEAT_S_PAD)
71 #define STARFIELD_QUIT BUTTON_BACK
72 #define STARFIELD_INCREASE_ZMOVE BUTTON_UP
73 #define STARFIELD_DECREASE_ZMOVE BUTTON_DOWN
74 #define STARFIELD_INCREASE_NB_STARS BUTTON_RIGHT
75 #define STARFIELD_DECREASE_NB_STARS BUTTON_LEFT
76 #define STARFIELD_TOGGLE_COLOR BUTTON_SELECT
77 #elif (CONFIG_KEYPAD == MROBE100_PAD)
78 #define STARFIELD_QUIT BUTTON_POWER
79 #define STARFIELD_INCREASE_ZMOVE BUTTON_UP
80 #define STARFIELD_DECREASE_ZMOVE BUTTON_DOWN
81 #define STARFIELD_INCREASE_NB_STARS BUTTON_RIGHT
82 #define STARFIELD_DECREASE_NB_STARS BUTTON_LEFT
83 #define STARFIELD_TOGGLE_COLOR BUTTON_SELECT
84 #elif CONFIG_KEYPAD == IAUDIO_M3_PAD
85 #define STARFIELD_QUIT BUTTON_RC_REC
86 #define STARFIELD_INCREASE_ZMOVE BUTTON_RC_VOL_UP
87 #define STARFIELD_DECREASE_ZMOVE BUTTON_RC_VOL_DOWN
88 #define STARFIELD_INCREASE_NB_STARS BUTTON_RC_FF
89 #define STARFIELD_DECREASE_NB_STARS BUTTON_RC_REW
90 #define STARFIELD_TOGGLE_COLOR BUTTON_RC_MODE
91 #elif CONFIG_KEYPAD == IAUDIO67_PAD
92 #define STARFIELD_QUIT BUTTON_POWER
93 #define STARFIELD_INCREASE_ZMOVE BUTTON_STOP
94 #define STARFIELD_DECREASE_ZMOVE BUTTON_PLAY
95 #define STARFIELD_INCREASE_NB_STARS BUTTON_LEFT
96 #define STARFIELD_DECREASE_NB_STARS BUTTON_RIGHT
97 #define STARFIELD_TOGGLE_COLOR BUTTON_MENU
98 #elif (CONFIG_KEYPAD == COWOND2_PAD)
99 #define STARFIELD_QUIT BUTTON_POWER
100 #endif
102 #ifdef HAVE_TOUCHSCREEN
103 #ifndef STARFIELD_QUIT
104 #define STARFIELD_QUIT BUTTON_TOPLEFT
105 #endif
106 #ifndef STARFIELD_INCREASE_ZMOVE
107 #define STARFIELD_INCREASE_ZMOVE BUTTON_TOPMIDDLE
108 #endif
109 #ifndef STARFIELD_DECREASE_ZMOVE
110 #define STARFIELD_DECREASE_ZMOVE BUTTON_BOTTOMMIDDLE
111 #endif
112 #ifndef STARFIELD_INCREASE_NB_STARS
113 #define STARFIELD_INCREASE_NB_STARS BUTTON_MIDRIGHT
114 #endif
115 #ifndef STARFIELD_DECREASE_NB_STARS
116 #define STARFIELD_DECREASE_NB_STARS BUTTON_MIDLEFT
117 #endif
118 #ifndef STARFIELD_TOGGLE_COLOR
119 #define STARFIELD_TOGGLE_COLOR BUTTON_CENTER
120 #endif
121 #endif
123 #ifndef STARFIELD_QUIT
124 #define STARFIELD_QUIT BUTTON_OFF
125 #endif
126 #ifndef STARFIELD_INCREASE_ZMOVE
127 #define STARFIELD_INCREASE_ZMOVE BUTTON_UP
128 #endif
129 #ifndef STARFIELD_DECREASE_ZMOVE
130 #define STARFIELD_DECREASE_ZMOVE BUTTON_DOWN
131 #endif
132 #ifndef STARFIELD_INCREASE_NB_STARS
133 #define STARFIELD_INCREASE_NB_STARS BUTTON_RIGHT
134 #endif
135 #ifndef STARFIELD_DECREASE_NB_STARS
136 #define STARFIELD_DECREASE_NB_STARS BUTTON_LEFT
137 #endif
139 #ifndef STARFIELD_TOGGLE_COLOR
140 #ifdef BUTTON_SELECT
141 #define STARFIELD_TOGGLE_COLOR BUTTON_SELECT
142 #else
143 #define STARFIELD_TOGGLE_COLOR BUTTON_PLAY
144 #endif
145 #endif
146 #if (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD)
147 #define STARFIELD_RC_QUIT BUTTON_RC_STOP
148 #endif
151 #define LCD_CENTER_X (LCD_WIDTH/2)
152 #define LCD_CENTER_Y (LCD_HEIGHT/2)
153 #define Z_MAX_DIST 100
156 #define MAX_STARS (LCD_WIDTH*LCD_HEIGHT*20)/100
157 #define INIT_STARS 200
158 #define STARFIELD_INCREASE_STEP 50
159 #define INIT_SPACE_SPEED 1
160 #define STAR_MAX_VELOCITY 2
162 * max 3d coord in the 2d screen :
163 * example with x
164 * x2d=x3d/z+LCD_CENTER_X (+LCD_CENTER_X to center ...)
165 * so
166 * max_x2d=max_x3d/max_z+LCD_CENTER_X
167 * max_x3d=(max_x2d-LCD_CENTER_X)*max_z
168 * with
169 * max_x2d = LCD_WIDTH
170 * max_z = Z_MAX_DIST
171 * we have now
172 * max_x3d=(LCD_WIDTH-LCD_CENTER_X)*Z_MAX_DIST
173 * max_x3d=LCD_CENTER_X*Z_MAX_DIST
176 #define MAX_INIT_STAR_X LCD_CENTER_X*Z_MAX_DIST
177 #define MAX_INIT_STAR_Y LCD_CENTER_Y*Z_MAX_DIST
179 #define MSG_DISP_TIME 30
181 static const struct plugin_api* rb; /* global api struct pointer */
184 * Each star's stuffs
186 struct star
188 int x,y,z;
189 int velocity;
190 #ifdef HAVE_LCD_COLOR
191 int color;
192 #endif
195 static inline void star_init(struct star * star, int z_move, bool color)
197 star->velocity=rb->rand() % STAR_MAX_VELOCITY+1;
198 /* choose x between -MAX_INIT_STAR_X and MAX_INIT_STAR_X */
199 star->x=rb->rand() % (2*MAX_INIT_STAR_X)-MAX_INIT_STAR_X;
200 star->y=rb->rand() % (2*MAX_INIT_STAR_Y)-MAX_INIT_STAR_Y;
201 #ifdef HAVE_LCD_COLOR
202 if(color)
203 star->color=LCD_RGBPACK(rb->rand()%128+128,rb->rand()%128+128,
204 rb->rand()%128+128);
205 else
206 star->color=LCD_WHITE;
207 #else
208 (void)color;
209 #endif
210 if(z_move>=0)
211 star->z=Z_MAX_DIST;
212 else
213 star->z=rb->rand() %Z_MAX_DIST/2+1;
216 static inline void star_move(struct star * star, int z_move, bool color)
218 star->z -= z_move*star->velocity;
219 if (star->z <= 0 || star->z > Z_MAX_DIST)
220 star_init(star, z_move, color);
223 static inline void star_draw(struct star * star, int z_move, bool color)
225 int x_draw, y_draw;
227 * 3d -> 2d : projection on the screen : x2d=x3d/z (thales theorem)
228 * we put the star in the center of the screen
230 x_draw = star->x / star->z + LCD_CENTER_X;
231 if (x_draw < 1 || x_draw >= LCD_WIDTH)
233 star_init(star, z_move, color);
234 return;
236 y_draw = star->y / star->z + LCD_CENTER_Y;
237 if (y_draw < 1 || y_draw >= LCD_HEIGHT)
239 star_init(star, z_move, color);
240 return;
243 #ifdef HAVE_LCD_COLOR
244 rb->lcd_set_foreground(star->color);
245 #endif
247 rb->lcd_drawpixel(x_draw, y_draw);
248 if(star->z<5*Z_MAX_DIST/6)
250 rb->lcd_drawpixel(x_draw, y_draw - 1);
251 rb->lcd_drawpixel(x_draw - 1, y_draw);
252 if(star->z<Z_MAX_DIST/2)
254 rb->lcd_drawpixel(x_draw + 1, y_draw);
255 rb->lcd_drawpixel(x_draw, y_draw + 1);
261 * Whole starfield operations
263 struct starfield
265 struct star tab[MAX_STARS];
266 int nb_stars;
267 int z_move;
268 bool color;
271 static inline void starfield_init(struct starfield * starfield)
273 starfield->nb_stars=0;
274 starfield->z_move=INIT_SPACE_SPEED;
275 starfield->color=false;
278 static inline void starfield_add_stars(struct starfield * starfield,
279 int nb_to_add)
281 int i, old_nb_stars;
282 old_nb_stars=starfield->nb_stars;
283 starfield->nb_stars+=nb_to_add;
285 if(starfield->nb_stars > MAX_STARS)
286 starfield->nb_stars=MAX_STARS;
288 for( i=old_nb_stars ; i < starfield->nb_stars ; ++i )
290 star_init( &(starfield->tab[i]), starfield->z_move, starfield->color );
294 static inline void starfield_del_stars(struct starfield * starfield,
295 int nb_to_add)
297 starfield->nb_stars-=nb_to_add;
298 if(starfield->nb_stars<0)
299 starfield->nb_stars=0;
302 static inline void starfield_move_and_draw(struct starfield * starfield)
304 int i;
305 for(i=0;i<starfield->nb_stars;++i)
307 star_move(&(starfield->tab[i]), starfield->z_move, starfield->color);
308 star_draw(&(starfield->tab[i]), starfield->z_move, starfield->color);
312 static struct starfield starfield;
314 int plugin_main(void)
316 char str_buffer[40];
317 int button, avg_peak, t_disp=0;
318 int font_h, font_w;
319 bool pulse=true;
320 rb->lcd_getstringsize("A", &font_w, &font_h);
321 starfield_init(&starfield);
322 starfield_add_stars(&starfield, INIT_STARS);
324 #if LCD_DEPTH > 1
325 rb->lcd_set_backdrop(NULL);
326 #endif
327 #ifdef HAVE_LCD_COLOR
328 rb->lcd_set_background(LCD_BLACK);
329 rb->lcd_set_foreground(LCD_WHITE);
330 #endif
332 while (true)
334 rb->sleep(1);
335 rb->lcd_clear_display();
337 #if ((CONFIG_CODEC == SWCODEC) || !defined(SIMULATOR) && \
338 ((CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)))
340 /* This will make the stars pulse to the music */
341 if(pulse==true){
343 /* Get the peaks. ( Borrowed from vu_meter ) */
344 #if (CONFIG_CODEC == SWCODEC)
345 int left_peak, right_peak;
346 rb->pcm_calculate_peaks(&left_peak, &right_peak);
347 #else
348 int left_peak = rb->mas_codec_readreg(0xC);
349 int right_peak = rb->mas_codec_readreg(0xD);
350 #endif
351 /* Devide peak data by 4098 to bring the max
352 value down from ~32k to 8 */
353 left_peak = left_peak/0x1000;
354 right_peak = right_peak/0x1000;
356 /* Make sure they dont stop */
357 if(left_peak<0x1)
358 left_peak = 0x1;
359 if(right_peak<0x1)
360 right_peak = 0x1;
362 /* And make sure they dont go over 8 */
363 if(left_peak>0x8)
364 left_peak = 0x8;
365 if(right_peak>0x8)
366 right_peak = 0x8;
368 /* We need the average of both chanels */
369 avg_peak = ( left_peak + right_peak )/2;
371 /* Set the speed to the peak meter */
372 starfield.z_move = avg_peak;
374 } /* if pulse */
375 #else
376 (void) avg_peak;
377 #endif
378 starfield_move_and_draw(&starfield);
380 #ifdef HAVE_LCD_COLOR
381 rb->lcd_set_foreground(LCD_WHITE);
382 #endif
384 /* if a parameter is updated (by the user), we must print it */
385 if (t_disp > 0)
387 --t_disp;
388 rb->snprintf(str_buffer, sizeof(str_buffer),
389 "star:%d speed:%d",
390 starfield.nb_stars,
391 starfield.z_move);
392 #ifdef HAVE_LCD_COLOR
393 rb->lcd_set_foreground(LCD_WHITE);
394 #endif
395 rb->lcd_putsxy(0, LCD_HEIGHT-font_h, str_buffer);
397 rb->lcd_update();
399 button = rb->button_get(false);
400 switch(button)
402 case (STARFIELD_INCREASE_ZMOVE):
403 case (STARFIELD_INCREASE_ZMOVE | BUTTON_REPEAT):
404 ++(starfield.z_move);
405 pulse=false;
406 t_disp=MSG_DISP_TIME;
407 break;
408 case (STARFIELD_DECREASE_ZMOVE):
409 case (STARFIELD_DECREASE_ZMOVE | BUTTON_REPEAT):
410 --(starfield.z_move);
411 pulse=false;
412 t_disp=MSG_DISP_TIME;
413 break;
414 case(STARFIELD_INCREASE_NB_STARS):
415 case(STARFIELD_INCREASE_NB_STARS | BUTTON_REPEAT):
416 starfield_add_stars(&starfield, STARFIELD_INCREASE_STEP);
417 t_disp=MSG_DISP_TIME;
418 break;
419 case(STARFIELD_DECREASE_NB_STARS):
420 case(STARFIELD_DECREASE_NB_STARS | BUTTON_REPEAT):
421 starfield_del_stars(&starfield, STARFIELD_INCREASE_STEP);
422 t_disp=MSG_DISP_TIME;
423 break;
424 #ifdef HAVE_LCD_COLOR
425 case(STARFIELD_TOGGLE_COLOR):
426 starfield.color=!starfield.color;
427 break;
428 #endif
429 #ifdef STARFIELD_RC_QUIT
430 case STARFIELD_RC_QUIT:
431 #endif
432 case(STARFIELD_QUIT):
433 case(SYS_USB_CONNECTED):
434 /* Turn on backlight timeout (revert to settings) */
435 backlight_use_settings(rb); /* backlight control in lib/helper.c*/
436 return PLUGIN_OK;
437 break;
442 /*************************** Plugin entry point ****************************/
444 enum plugin_status plugin_start(const struct plugin_api* api, const void* parameter)
446 int ret;
448 rb = api; /* copy to global api pointer */
449 (void)parameter;
450 /* Turn off backlight timeout */
451 backlight_force_on(rb); /* backlight control in lib/helper.c */
453 ret = plugin_main();
455 return ret;
458 #endif /* #ifdef HAVE_LCD_BITMAP */