Rename variables sectorbuf and verbose to avoid clashes in rbutil. Cleanup exports...
[Rockbox.git] / apps / plugins / starfield.c
blob130e077cc796d09b4205106b3420c6a230002761
1 /***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * Copyright (C) 2005 Kevin Ferrare
10 * All files in this archive are subject to the GNU General Public License.
11 * See the file COPYING in the source tree root for full license agreement.
13 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
14 * KIND, either express or implied.
16 ****************************************************************************/
18 #include "plugin.h"
19 #include "helper.h"
21 #ifdef HAVE_LCD_BITMAP /* and also not for the Player */
23 PLUGIN_HEADER
25 /******************************* Globals ***********************************/
27 static const struct plugin_api* rb; /* global api struct pointer */
29 /* Key assignement */
30 #if (CONFIG_KEYPAD == IPOD_4G_PAD) || \
31 (CONFIG_KEYPAD == IPOD_3G_PAD) || \
32 (CONFIG_KEYPAD == IPOD_1G2G_PAD)
33 #define STARFIELD_QUIT BUTTON_MENU
34 #define STARFIELD_INCREASE_ZMOVE BUTTON_SCROLL_FWD
35 #define STARFIELD_DECREASE_ZMOVE BUTTON_SCROLL_BACK
36 #define STARFIELD_INCREASE_NB_STARS BUTTON_RIGHT
37 #define STARFIELD_DECREASE_NB_STARS BUTTON_LEFT
38 #define STARFIELD_TOGGLE_COLOR BUTTON_PLAY
39 #elif (CONFIG_KEYPAD == IAUDIO_X5M5_PAD)
40 #define STARFIELD_QUIT BUTTON_POWER
41 #define STARFIELD_INCREASE_ZMOVE BUTTON_UP
42 #define STARFIELD_DECREASE_ZMOVE BUTTON_DOWN
43 #define STARFIELD_INCREASE_NB_STARS BUTTON_RIGHT
44 #define STARFIELD_DECREASE_NB_STARS BUTTON_LEFT
45 #define STARFIELD_TOGGLE_COLOR BUTTON_PLAY
46 #elif (CONFIG_KEYPAD == IRIVER_H10_PAD)
47 #define STARFIELD_QUIT BUTTON_POWER
48 #define STARFIELD_INCREASE_ZMOVE BUTTON_SCROLL_UP
49 #define STARFIELD_DECREASE_ZMOVE BUTTON_SCROLL_DOWN
50 #define STARFIELD_INCREASE_NB_STARS BUTTON_RIGHT
51 #define STARFIELD_DECREASE_NB_STARS BUTTON_LEFT
52 #define STARFIELD_TOGGLE_COLOR BUTTON_PLAY
53 #elif (CONFIG_KEYPAD == GIGABEAT_PAD)
54 #define STARFIELD_QUIT BUTTON_POWER
55 #define STARFIELD_INCREASE_ZMOVE BUTTON_UP
56 #define STARFIELD_DECREASE_ZMOVE BUTTON_DOWN
57 #define STARFIELD_INCREASE_NB_STARS BUTTON_RIGHT
58 #define STARFIELD_DECREASE_NB_STARS BUTTON_LEFT
59 #define STARFIELD_TOGGLE_COLOR BUTTON_SELECT
60 #elif (CONFIG_KEYPAD == SANSA_E200_PAD) || \
61 (CONFIG_KEYPAD == SANSA_C200_PAD)
62 #define STARFIELD_QUIT BUTTON_POWER
63 #define STARFIELD_INCREASE_ZMOVE BUTTON_UP
64 #define STARFIELD_DECREASE_ZMOVE BUTTON_DOWN
65 #define STARFIELD_INCREASE_NB_STARS BUTTON_RIGHT
66 #define STARFIELD_DECREASE_NB_STARS BUTTON_LEFT
67 #define STARFIELD_TOGGLE_COLOR BUTTON_SELECT
68 #elif (CONFIG_KEYPAD == GIGABEAT_S_PAD)
69 #define STARFIELD_QUIT BUTTON_BACK
70 #define STARFIELD_INCREASE_ZMOVE BUTTON_UP
71 #define STARFIELD_DECREASE_ZMOVE BUTTON_DOWN
72 #define STARFIELD_INCREASE_NB_STARS BUTTON_RIGHT
73 #define STARFIELD_DECREASE_NB_STARS BUTTON_LEFT
74 #define STARFIELD_TOGGLE_COLOR BUTTON_SELECT
75 #elif (CONFIG_KEYPAD == MROBE100_PAD)
76 #define STARFIELD_QUIT BUTTON_POWER
77 #define STARFIELD_INCREASE_ZMOVE BUTTON_UP
78 #define STARFIELD_DECREASE_ZMOVE BUTTON_DOWN
79 #define STARFIELD_INCREASE_NB_STARS BUTTON_RIGHT
80 #define STARFIELD_DECREASE_NB_STARS BUTTON_LEFT
81 #define STARFIELD_TOGGLE_COLOR BUTTON_SELECT
82 #elif CONFIG_KEYPAD == IAUDIO_M3_PAD
83 #define STARFIELD_QUIT BUTTON_RC_REC
84 #define STARFIELD_INCREASE_ZMOVE BUTTON_RC_VOL_UP
85 #define STARFIELD_DECREASE_ZMOVE BUTTON_RC_VOL_DOWN
86 #define STARFIELD_INCREASE_NB_STARS BUTTON_RC_FF
87 #define STARFIELD_DECREASE_NB_STARS BUTTON_RC_REW
88 #define STARFIELD_TOGGLE_COLOR BUTTON_RC_MODE
89 #elif (CONFIG_KEYPAD == COWOND2_PAD)
90 #define STARFIELD_QUIT BUTTON_POWER
91 #endif
93 #ifdef HAVE_TOUCHPAD
94 #ifndef STARFIELD_QUIT
95 #define STARFIELD_QUIT BUTTON_TOPLEFT
96 #endif
97 #ifndef STARFIELD_INCREASE_ZMOVE
98 #define STARFIELD_INCREASE_ZMOVE BUTTON_TOPMIDDLE
99 #endif
100 #ifndef STARFIELD_DECREASE_ZMOVE
101 #define STARFIELD_DECREASE_ZMOVE BUTTON_BOTTOMMIDDLE
102 #endif
103 #ifndef STARFIELD_INCREASE_NB_STARS
104 #define STARFIELD_INCREASE_NB_STARS BUTTON_MIDRIGHT
105 #endif
106 #ifndef STARFIELD_DECREASE_NB_STARS
107 #define STARFIELD_DECREASE_NB_STARS BUTTON_MIDLEFT
108 #endif
109 #ifndef STARFIELD_TOGGLE_COLOR
110 #define STARFIELD_TOGGLE_COLOR BUTTON_CENTER
111 #endif
112 #endif
114 #ifndef STARFIELD_QUIT
115 #define STARFIELD_QUIT BUTTON_OFF
116 #endif
117 #ifndef STARFIELD_INCREASE_ZMOVE
118 #define STARFIELD_INCREASE_ZMOVE BUTTON_UP
119 #endif
120 #ifndef STARFIELD_DECREASE_ZMOVE
121 #define STARFIELD_DECREASE_ZMOVE BUTTON_DOWN
122 #endif
123 #ifndef STARFIELD_INCREASE_NB_STARS
124 #define STARFIELD_INCREASE_NB_STARS BUTTON_RIGHT
125 #endif
126 #ifndef STARFIELD_DECREASE_NB_STARS
127 #define STARFIELD_DECREASE_NB_STARS BUTTON_LEFT
128 #endif
130 #ifndef STARFIELD_TOGGLE_COLOR
131 #ifdef BUTTON_SELECT
132 #define STARFIELD_TOGGLE_COLOR BUTTON_SELECT
133 #else
134 #define STARFIELD_TOGGLE_COLOR BUTTON_PLAY
135 #endif
136 #endif
137 #if (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD)
138 #define STARFIELD_RC_QUIT BUTTON_RC_STOP
139 #endif
142 #define LCD_CENTER_X (LCD_WIDTH/2)
143 #define LCD_CENTER_Y (LCD_HEIGHT/2)
144 #define Z_MAX_DIST 100
147 #define MAX_STARS (LCD_WIDTH*LCD_HEIGHT*20)/100
148 #define INIT_STARS 200
149 #define STARFIELD_INCREASE_STEP 50
150 #define INIT_SPACE_SPEED 1
151 #define STAR_MAX_VELOCITY 2
153 * max 3d coord in the 2d screen :
154 * example with x
155 * x2d=x3d/z+LCD_CENTER_X (+LCD_CENTER_X to center ...)
156 * so
157 * max_x2d=max_x3d/max_z+LCD_CENTER_X
158 * max_x3d=(max_x2d-LCD_CENTER_X)*max_z
159 * with
160 * max_x2d = LCD_WIDTH
161 * max_z = Z_MAX_DIST
162 * we have now
163 * max_x3d=(LCD_WIDTH-LCD_CENTER_X)*Z_MAX_DIST
164 * max_x3d=LCD_CENTER_X*Z_MAX_DIST
167 #define MAX_INIT_STAR_X LCD_CENTER_X*Z_MAX_DIST
168 #define MAX_INIT_STAR_Y LCD_CENTER_Y*Z_MAX_DIST
170 #define MSG_DISP_TIME 30
172 static const struct plugin_api* rb; /* global api struct pointer */
175 * Each star's stuffs
177 struct star
179 int x,y,z;
180 int velocity;
181 #ifdef HAVE_LCD_COLOR
182 int color;
183 #endif
186 static inline void star_init(struct star * star, int z_move, bool color)
188 star->velocity=rb->rand() % STAR_MAX_VELOCITY+1;
189 /* choose x between -MAX_INIT_STAR_X and MAX_INIT_STAR_X */
190 star->x=rb->rand() % (2*MAX_INIT_STAR_X)-MAX_INIT_STAR_X;
191 star->y=rb->rand() % (2*MAX_INIT_STAR_Y)-MAX_INIT_STAR_Y;
192 #ifdef HAVE_LCD_COLOR
193 if(color)
194 star->color=LCD_RGBPACK(rb->rand()%128+128,rb->rand()%128+128,
195 rb->rand()%128+128);
196 else
197 star->color=LCD_WHITE;
198 #else
199 (void)color;
200 #endif
201 if(z_move>=0)
202 star->z=Z_MAX_DIST;
203 else
204 star->z=rb->rand() %Z_MAX_DIST/2+1;
207 static inline void star_move(struct star * star, int z_move, bool color)
209 star->z -= z_move*star->velocity;
210 if (star->z <= 0 || star->z > Z_MAX_DIST)
211 star_init(star, z_move, color);
214 static inline void star_draw(struct star * star, int z_move, bool color)
216 int x_draw, y_draw;
218 * 3d -> 2d : projection on the screen : x2d=x3d/z (thales theorem)
219 * we put the star in the center of the screen
221 x_draw = star->x / star->z + LCD_CENTER_X;
222 if (x_draw < 1 || x_draw >= LCD_WIDTH)
224 star_init(star, z_move, color);
225 return;
227 y_draw = star->y / star->z + LCD_CENTER_Y;
228 if (y_draw < 1 || y_draw >= LCD_HEIGHT)
230 star_init(star, z_move, color);
231 return;
234 #ifdef HAVE_LCD_COLOR
235 rb->lcd_set_foreground(star->color);
236 #endif
238 rb->lcd_drawpixel(x_draw, y_draw);
239 if(star->z<5*Z_MAX_DIST/6)
241 rb->lcd_drawpixel(x_draw, y_draw - 1);
242 rb->lcd_drawpixel(x_draw - 1, y_draw);
243 if(star->z<Z_MAX_DIST/2)
245 rb->lcd_drawpixel(x_draw + 1, y_draw);
246 rb->lcd_drawpixel(x_draw, y_draw + 1);
252 * Whole starfield operations
254 struct starfield
256 struct star tab[MAX_STARS];
257 int nb_stars;
258 int z_move;
259 bool color;
262 static inline void starfield_init(struct starfield * starfield)
264 starfield->nb_stars=0;
265 starfield->z_move=INIT_SPACE_SPEED;
266 starfield->color=false;
269 static inline void starfield_add_stars(struct starfield * starfield,
270 int nb_to_add)
272 int i, old_nb_stars;
273 old_nb_stars=starfield->nb_stars;
274 starfield->nb_stars+=nb_to_add;
276 if(starfield->nb_stars > MAX_STARS)
277 starfield->nb_stars=MAX_STARS;
279 for( i=old_nb_stars ; i < starfield->nb_stars ; ++i )
281 star_init( &(starfield->tab[i]), starfield->z_move, starfield->color );
285 static inline void starfield_del_stars(struct starfield * starfield,
286 int nb_to_add)
288 starfield->nb_stars-=nb_to_add;
289 if(starfield->nb_stars<0)
290 starfield->nb_stars=0;
293 static inline void starfield_move_and_draw(struct starfield * starfield)
295 int i;
296 for(i=0;i<starfield->nb_stars;++i)
298 star_move(&(starfield->tab[i]), starfield->z_move, starfield->color);
299 star_draw(&(starfield->tab[i]), starfield->z_move, starfield->color);
303 static struct starfield starfield;
305 int plugin_main(void)
307 char str_buffer[40];
308 int button, avg_peak, t_disp=0;
309 int font_h, font_w;
310 bool pulse=true;
311 rb->lcd_getstringsize("A", &font_w, &font_h);
312 starfield_init(&starfield);
313 starfield_add_stars(&starfield, INIT_STARS);
315 #if LCD_DEPTH > 1
316 rb->lcd_set_backdrop(NULL);
317 #endif
318 #ifdef HAVE_LCD_COLOR
319 rb->lcd_set_background(LCD_BLACK);
320 rb->lcd_set_foreground(LCD_WHITE);
321 #endif
323 while (true)
325 rb->sleep(1);
326 rb->lcd_clear_display();
328 #if ((CONFIG_CODEC == SWCODEC) || !defined(SIMULATOR) && \
329 ((CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)))
331 /* This will make the stars pulse to the music */
332 if(pulse==true){
334 /* Get the peaks. ( Borrowed from vu_meter ) */
335 #if (CONFIG_CODEC == SWCODEC)
336 int left_peak, right_peak;
337 rb->pcm_calculate_peaks(&left_peak, &right_peak);
338 #else
339 int left_peak = rb->mas_codec_readreg(0xC);
340 int right_peak = rb->mas_codec_readreg(0xD);
341 #endif
342 /* Devide peak data by 4098 to bring the max
343 value down from ~32k to 8 */
344 left_peak = left_peak/0x1000;
345 right_peak = right_peak/0x1000;
347 /* Make sure they dont stop */
348 if(left_peak<0x1)
349 left_peak = 0x1;
350 if(right_peak<0x1)
351 right_peak = 0x1;
353 /* And make sure they dont go over 8 */
354 if(left_peak>0x8)
355 left_peak = 0x8;
356 if(right_peak>0x8)
357 right_peak = 0x8;
359 /* We need the average of both chanels */
360 avg_peak = ( left_peak + right_peak )/2;
362 /* Set the speed to the peak meter */
363 starfield.z_move = avg_peak;
365 } /* if pulse */
366 #else
367 (void) avg_peak;
368 #endif
369 starfield_move_and_draw(&starfield);
371 #ifdef HAVE_LCD_COLOR
372 rb->lcd_set_foreground(LCD_WHITE);
373 #endif
375 /* if a parameter is updated (by the user), we must print it */
376 if (t_disp > 0)
378 --t_disp;
379 rb->snprintf(str_buffer, sizeof(str_buffer),
380 "star:%d speed:%d",
381 starfield.nb_stars,
382 starfield.z_move);
383 #ifdef HAVE_LCD_COLOR
384 rb->lcd_set_foreground(LCD_WHITE);
385 #endif
386 rb->lcd_putsxy(0, LCD_HEIGHT-font_h, str_buffer);
388 rb->lcd_update();
390 button = rb->button_get(false);
391 switch(button)
393 case (STARFIELD_INCREASE_ZMOVE):
394 case (STARFIELD_INCREASE_ZMOVE | BUTTON_REPEAT):
395 ++(starfield.z_move);
396 pulse=false;
397 t_disp=MSG_DISP_TIME;
398 break;
399 case (STARFIELD_DECREASE_ZMOVE):
400 case (STARFIELD_DECREASE_ZMOVE | BUTTON_REPEAT):
401 --(starfield.z_move);
402 pulse=false;
403 t_disp=MSG_DISP_TIME;
404 break;
405 case(STARFIELD_INCREASE_NB_STARS):
406 case(STARFIELD_INCREASE_NB_STARS | BUTTON_REPEAT):
407 starfield_add_stars(&starfield, STARFIELD_INCREASE_STEP);
408 t_disp=MSG_DISP_TIME;
409 break;
410 case(STARFIELD_DECREASE_NB_STARS):
411 case(STARFIELD_DECREASE_NB_STARS | BUTTON_REPEAT):
412 starfield_del_stars(&starfield, STARFIELD_INCREASE_STEP);
413 t_disp=MSG_DISP_TIME;
414 break;
415 #ifdef HAVE_LCD_COLOR
416 case(STARFIELD_TOGGLE_COLOR):
417 starfield.color=!starfield.color;
418 break;
419 #endif
420 #ifdef STARFIELD_RC_QUIT
421 case STARFIELD_RC_QUIT:
422 #endif
423 case(STARFIELD_QUIT):
424 case(SYS_USB_CONNECTED):
425 /* Turn on backlight timeout (revert to settings) */
426 backlight_use_settings(rb); /* backlight control in lib/helper.c*/
427 return PLUGIN_OK;
428 break;
433 /*************************** Plugin entry point ****************************/
435 enum plugin_status plugin_start(const struct plugin_api* api, const void* parameter)
437 int ret;
439 rb = api; /* copy to global api pointer */
440 (void)parameter;
441 /* Turn off backlight timeout */
442 backlight_force_on(rb); /* backlight control in lib/helper.c */
444 ret = plugin_main();
446 return ret;
449 #endif /* #ifdef HAVE_LCD_BITMAP */