1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
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 ****************************************************************************/
21 #include "lib/helper.h"
22 #include "lib/pluginlib_exit.h"
24 /******************************* Globals ***********************************/
27 #if (CONFIG_KEYPAD == IPOD_4G_PAD) || \
28 (CONFIG_KEYPAD == IPOD_3G_PAD) || \
29 (CONFIG_KEYPAD == IPOD_1G2G_PAD)
30 #define STARFIELD_QUIT BUTTON_MENU
31 #define STARFIELD_INCREASE_ZMOVE BUTTON_SCROLL_FWD
32 #define STARFIELD_DECREASE_ZMOVE BUTTON_SCROLL_BACK
33 #define STARFIELD_INCREASE_NB_STARS BUTTON_RIGHT
34 #define STARFIELD_DECREASE_NB_STARS BUTTON_LEFT
35 #define STARFIELD_TOGGLE_COLOR BUTTON_PLAY
37 #elif (CONFIG_KEYPAD == IAUDIO_X5M5_PAD)
38 #define STARFIELD_QUIT BUTTON_POWER
39 #define STARFIELD_INCREASE_ZMOVE BUTTON_UP
40 #define STARFIELD_DECREASE_ZMOVE BUTTON_DOWN
41 #define STARFIELD_INCREASE_NB_STARS BUTTON_RIGHT
42 #define STARFIELD_DECREASE_NB_STARS BUTTON_LEFT
43 #define STARFIELD_TOGGLE_COLOR BUTTON_PLAY
45 #elif (CONFIG_KEYPAD == IRIVER_H10_PAD)
46 #define STARFIELD_QUIT BUTTON_POWER
47 #define STARFIELD_INCREASE_ZMOVE BUTTON_SCROLL_UP
48 #define STARFIELD_DECREASE_ZMOVE BUTTON_SCROLL_DOWN
49 #define STARFIELD_INCREASE_NB_STARS BUTTON_RIGHT
50 #define STARFIELD_DECREASE_NB_STARS BUTTON_LEFT
51 #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
61 #elif (CONFIG_KEYPAD == SANSA_E200_PAD) || \
62 (CONFIG_KEYPAD == SANSA_C200_PAD) || \
63 (CONFIG_KEYPAD == SANSA_CLIP_PAD) || \
64 (CONFIG_KEYPAD == SANSA_M200_PAD)
65 #define STARFIELD_QUIT BUTTON_POWER
66 #define STARFIELD_INCREASE_ZMOVE BUTTON_UP
67 #define STARFIELD_DECREASE_ZMOVE BUTTON_DOWN
68 #define STARFIELD_INCREASE_NB_STARS BUTTON_RIGHT
69 #define STARFIELD_DECREASE_NB_STARS BUTTON_LEFT
70 #define STARFIELD_TOGGLE_COLOR BUTTON_SELECT
72 #elif (CONFIG_KEYPAD == SANSA_FUZE_PAD)
73 #define STARFIELD_QUIT (BUTTON_HOME|BUTTON_REPEAT)
74 #define STARFIELD_INCREASE_ZMOVE BUTTON_UP
75 #define STARFIELD_DECREASE_ZMOVE BUTTON_DOWN
76 #define STARFIELD_INCREASE_NB_STARS BUTTON_RIGHT
77 #define STARFIELD_DECREASE_NB_STARS BUTTON_LEFT
78 #define STARFIELD_TOGGLE_COLOR BUTTON_SELECT
80 #elif (CONFIG_KEYPAD == GIGABEAT_S_PAD)
81 #define STARFIELD_QUIT BUTTON_BACK
82 #define STARFIELD_INCREASE_ZMOVE BUTTON_UP
83 #define STARFIELD_DECREASE_ZMOVE BUTTON_DOWN
84 #define STARFIELD_INCREASE_NB_STARS BUTTON_RIGHT
85 #define STARFIELD_DECREASE_NB_STARS BUTTON_LEFT
86 #define STARFIELD_TOGGLE_COLOR BUTTON_SELECT
88 #elif (CONFIG_KEYPAD == MROBE100_PAD)
89 #define STARFIELD_QUIT BUTTON_POWER
90 #define STARFIELD_INCREASE_ZMOVE BUTTON_UP
91 #define STARFIELD_DECREASE_ZMOVE BUTTON_DOWN
92 #define STARFIELD_INCREASE_NB_STARS BUTTON_RIGHT
93 #define STARFIELD_DECREASE_NB_STARS BUTTON_LEFT
94 #define STARFIELD_TOGGLE_COLOR BUTTON_SELECT
96 #elif CONFIG_KEYPAD == IAUDIO_M3_PAD
97 #define STARFIELD_QUIT BUTTON_RC_REC
98 #define STARFIELD_INCREASE_ZMOVE BUTTON_RC_VOL_UP
99 #define STARFIELD_DECREASE_ZMOVE BUTTON_RC_VOL_DOWN
100 #define STARFIELD_INCREASE_NB_STARS BUTTON_RC_FF
101 #define STARFIELD_DECREASE_NB_STARS BUTTON_RC_REW
102 #define STARFIELD_TOGGLE_COLOR BUTTON_RC_MODE
104 #elif CONFIG_KEYPAD == IAUDIO67_PAD
105 #define STARFIELD_QUIT BUTTON_POWER
106 #define STARFIELD_INCREASE_ZMOVE BUTTON_STOP
107 #define STARFIELD_DECREASE_ZMOVE BUTTON_PLAY
108 #define STARFIELD_INCREASE_NB_STARS BUTTON_LEFT
109 #define STARFIELD_DECREASE_NB_STARS BUTTON_RIGHT
110 #define STARFIELD_TOGGLE_COLOR BUTTON_MENU
112 #elif (CONFIG_KEYPAD == COWON_D2_PAD)
113 #define STARFIELD_QUIT BUTTON_POWER
115 #elif CONFIG_KEYPAD == CREATIVEZVM_PAD
116 #define STARFIELD_QUIT BUTTON_BACK
117 #define STARFIELD_INCREASE_ZMOVE BUTTON_UP
118 #define STARFIELD_DECREASE_ZMOVE BUTTON_DOWN
119 #define STARFIELD_INCREASE_NB_STARS BUTTON_RIGHT
120 #define STARFIELD_DECREASE_NB_STARS BUTTON_LEFT
121 #define STARFIELD_TOGGLE_COLOR BUTTON_SELECT
123 #elif CONFIG_KEYPAD == PHILIPS_HDD1630_PAD
124 #define STARFIELD_QUIT BUTTON_POWER
125 #define STARFIELD_INCREASE_ZMOVE BUTTON_UP
126 #define STARFIELD_DECREASE_ZMOVE BUTTON_DOWN
127 #define STARFIELD_INCREASE_NB_STARS BUTTON_RIGHT
128 #define STARFIELD_DECREASE_NB_STARS BUTTON_LEFT
129 #define STARFIELD_TOGGLE_COLOR BUTTON_SELECT
131 #elif CONFIG_KEYPAD == PHILIPS_SA9200_PAD
132 #define STARFIELD_QUIT BUTTON_POWER
133 #define STARFIELD_INCREASE_ZMOVE BUTTON_UP
134 #define STARFIELD_DECREASE_ZMOVE BUTTON_DOWN
135 #define STARFIELD_INCREASE_NB_STARS BUTTON_NEXT
136 #define STARFIELD_DECREASE_NB_STARS BUTTON_PREV
137 #define STARFIELD_TOGGLE_COLOR BUTTON_PLAY
139 #elif (CONFIG_KEYPAD == ONDAVX747_PAD) || (CONFIG_KEYPAD == ONDAVX777_PAD) || (CONFIG_KEYPAD == MROBE500_PAD)
140 #define STARFIELD_QUIT BUTTON_POWER
142 #elif CONFIG_KEYPAD == SAMSUNG_YH_PAD
143 #define STARFIELD_QUIT BUTTON_FFWD
144 #define STARFIELD_INCREASE_ZMOVE BUTTON_UP
145 #define STARFIELD_DECREASE_ZMOVE BUTTON_DOWN
146 #define STARFIELD_INCREASE_NB_STARS BUTTON_RIGHT
147 #define STARFIELD_DECREASE_NB_STARS BUTTON_LEFT
148 #define STARFIELD_TOGGLE_COLOR BUTTON_PLAY
150 #elif CONFIG_KEYPAD == PBELL_VIBE500_PAD
151 #define STARFIELD_QUIT BUTTON_REC
152 #define STARFIELD_INCREASE_ZMOVE BUTTON_UP
153 #define STARFIELD_DECREASE_ZMOVE BUTTON_DOWN
154 #define STARFIELD_INCREASE_NB_STARS BUTTON_NEXT
155 #define STARFIELD_DECREASE_NB_STARS BUTTON_PREV
156 #define STARFIELD_TOGGLE_COLOR BUTTON_PLAY
158 #elif CONFIG_KEYPAD == MPIO_HD200_PAD
159 #define STARFIELD_QUIT (BUTTON_REC|BUTTON_PLAY)
160 #define STARFIELD_INCREASE_ZMOVE BUTTON_VOL_UP
161 #define STARFIELD_DECREASE_ZMOVE BUTTON_VOL_DOWN
162 #define STARFIELD_INCREASE_NB_STARS BUTTON_FF
163 #define STARFIELD_DECREASE_NB_STARS BUTTON_REW
164 #define STARFIELD_TOGGLE_COLOR BUTTON_PLAY
168 #ifdef HAVE_TOUCHSCREEN
169 #ifndef STARFIELD_QUIT
170 #define STARFIELD_QUIT BUTTON_TOPLEFT
172 #ifndef STARFIELD_INCREASE_ZMOVE
173 #define STARFIELD_INCREASE_ZMOVE BUTTON_TOPMIDDLE
175 #ifndef STARFIELD_DECREASE_ZMOVE
176 #define STARFIELD_DECREASE_ZMOVE BUTTON_BOTTOMMIDDLE
178 #ifndef STARFIELD_INCREASE_NB_STARS
179 #define STARFIELD_INCREASE_NB_STARS BUTTON_MIDRIGHT
181 #ifndef STARFIELD_DECREASE_NB_STARS
182 #define STARFIELD_DECREASE_NB_STARS BUTTON_MIDLEFT
184 #ifndef STARFIELD_TOGGLE_COLOR
185 #define STARFIELD_TOGGLE_COLOR BUTTON_CENTER
189 #ifndef STARFIELD_QUIT
190 #define STARFIELD_QUIT BUTTON_OFF
192 #ifndef STARFIELD_INCREASE_ZMOVE
193 #define STARFIELD_INCREASE_ZMOVE BUTTON_UP
195 #ifndef STARFIELD_DECREASE_ZMOVE
196 #define STARFIELD_DECREASE_ZMOVE BUTTON_DOWN
198 #ifndef STARFIELD_INCREASE_NB_STARS
199 #define STARFIELD_INCREASE_NB_STARS BUTTON_RIGHT
201 #ifndef STARFIELD_DECREASE_NB_STARS
202 #define STARFIELD_DECREASE_NB_STARS BUTTON_LEFT
205 #ifndef STARFIELD_TOGGLE_COLOR
207 #define STARFIELD_TOGGLE_COLOR BUTTON_SELECT
209 #define STARFIELD_TOGGLE_COLOR BUTTON_PLAY
212 #if (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD)
213 #define STARFIELD_RC_QUIT BUTTON_RC_STOP
217 #define LCD_CENTER_X (LCD_WIDTH/2)
218 #define LCD_CENTER_Y (LCD_HEIGHT/2)
219 #define Z_MAX_DIST 100
222 #define MAX_STARS (LCD_WIDTH*LCD_HEIGHT*20)/100
223 #define INIT_STARS 200
224 #define STARFIELD_INCREASE_STEP 50
225 #define INIT_SPACE_SPEED 1
226 #define STAR_MAX_VELOCITY 2
228 * max 3d coord in the 2d screen :
230 * x2d=x3d/z+LCD_CENTER_X (+LCD_CENTER_X to center ...)
232 * max_x2d=max_x3d/max_z+LCD_CENTER_X
233 * max_x3d=(max_x2d-LCD_CENTER_X)*max_z
235 * max_x2d = LCD_WIDTH
238 * max_x3d=(LCD_WIDTH-LCD_CENTER_X)*Z_MAX_DIST
239 * max_x3d=LCD_CENTER_X*Z_MAX_DIST
242 #define MAX_INIT_STAR_X LCD_CENTER_X*Z_MAX_DIST
243 #define MAX_INIT_STAR_Y LCD_CENTER_Y*Z_MAX_DIST
245 #define MSG_DISP_TIME 30
254 #ifdef HAVE_LCD_COLOR
259 static inline void star_init(struct star
* star
, int z_move
, bool color
)
261 star
->velocity
=rb
->rand() % STAR_MAX_VELOCITY
+1;
262 /* choose x between -MAX_INIT_STAR_X and MAX_INIT_STAR_X */
263 star
->x
=rb
->rand() % (2*MAX_INIT_STAR_X
)-MAX_INIT_STAR_X
;
264 star
->y
=rb
->rand() % (2*MAX_INIT_STAR_Y
)-MAX_INIT_STAR_Y
;
265 #ifdef HAVE_LCD_COLOR
267 star
->color
=LCD_RGBPACK(rb
->rand()%128+128,rb
->rand()%128+128,
270 star
->color
=LCD_WHITE
;
277 star
->z
=rb
->rand() %Z_MAX_DIST
/2+1;
280 static inline void star_move(struct star
* star
, int z_move
, bool color
)
282 star
->z
-= z_move
*star
->velocity
;
283 if (star
->z
<= 0 || star
->z
> Z_MAX_DIST
)
284 star_init(star
, z_move
, color
);
287 static inline void star_draw(struct star
* star
, int z_move
, bool color
)
291 * 3d -> 2d : projection on the screen : x2d=x3d/z (thales theorem)
292 * we put the star in the center of the screen
294 x_draw
= star
->x
/ star
->z
+ LCD_CENTER_X
;
295 if (x_draw
< 1 || x_draw
>= LCD_WIDTH
)
297 star_init(star
, z_move
, color
);
300 y_draw
= star
->y
/ star
->z
+ LCD_CENTER_Y
;
301 if (y_draw
< 1 || y_draw
>= LCD_HEIGHT
)
303 star_init(star
, z_move
, color
);
307 #ifdef HAVE_LCD_COLOR
308 rb
->lcd_set_foreground(star
->color
);
311 rb
->lcd_drawpixel(x_draw
, y_draw
);
312 if(star
->z
<5*Z_MAX_DIST
/6)
314 rb
->lcd_drawpixel(x_draw
, y_draw
- 1);
315 rb
->lcd_drawpixel(x_draw
- 1, y_draw
);
316 if(star
->z
<Z_MAX_DIST
/2)
318 rb
->lcd_drawpixel(x_draw
+ 1, y_draw
);
319 rb
->lcd_drawpixel(x_draw
, y_draw
+ 1);
325 * Whole starfield operations
329 struct star tab
[MAX_STARS
];
335 static inline void starfield_init(struct starfield
* starfield
)
337 starfield
->nb_stars
=0;
338 starfield
->z_move
=INIT_SPACE_SPEED
;
339 starfield
->color
=false;
342 static inline void starfield_add_stars(struct starfield
* starfield
,
346 old_nb_stars
=starfield
->nb_stars
;
347 starfield
->nb_stars
+=nb_to_add
;
349 if(starfield
->nb_stars
> MAX_STARS
)
350 starfield
->nb_stars
=MAX_STARS
;
352 for( i
=old_nb_stars
; i
< starfield
->nb_stars
; ++i
)
354 star_init( &(starfield
->tab
[i
]), starfield
->z_move
, starfield
->color
);
358 static inline void starfield_del_stars(struct starfield
* starfield
,
361 starfield
->nb_stars
-=nb_to_add
;
362 if(starfield
->nb_stars
<0)
363 starfield
->nb_stars
=0;
366 static inline void starfield_move_and_draw(struct starfield
* starfield
)
369 for(i
=0;i
<starfield
->nb_stars
;++i
)
371 star_move(&(starfield
->tab
[i
]), starfield
->z_move
, starfield
->color
);
372 star_draw(&(starfield
->tab
[i
]), starfield
->z_move
, starfield
->color
);
376 static struct starfield starfield
;
378 int plugin_main(void)
380 int button
, avg_peak
, t_disp
=0;
383 rb
->lcd_getstringsize("A", &font_w
, &font_h
);
384 starfield_init(&starfield
);
385 starfield_add_stars(&starfield
, INIT_STARS
);
388 rb
->lcd_set_backdrop(NULL
);
390 #ifdef HAVE_LCD_COLOR
391 rb
->lcd_set_background(LCD_BLACK
);
392 rb
->lcd_set_foreground(LCD_WHITE
);
398 rb
->lcd_clear_display();
400 #if ((CONFIG_CODEC == SWCODEC) || !defined(SIMULATOR) && \
401 ((CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)))
403 /* This will make the stars pulse to the music */
406 /* Get the peaks. ( Borrowed from vu_meter ) */
407 #if (CONFIG_CODEC == SWCODEC)
408 int left_peak
, right_peak
;
409 rb
->pcm_calculate_peaks(&left_peak
, &right_peak
);
411 int left_peak
= rb
->mas_codec_readreg(0xC);
412 int right_peak
= rb
->mas_codec_readreg(0xD);
414 /* Devide peak data by 4098 to bring the max
415 value down from ~32k to 8 */
416 left_peak
= left_peak
/0x1000;
417 right_peak
= right_peak
/0x1000;
419 /* Make sure they dont stop */
425 /* And make sure they dont go over 8 */
431 /* We need the average of both chanels */
432 avg_peak
= ( left_peak
+ right_peak
)/2;
434 /* Set the speed to the peak meter */
435 starfield
.z_move
= avg_peak
;
441 starfield_move_and_draw(&starfield
);
443 #ifdef HAVE_LCD_COLOR
444 rb
->lcd_set_foreground(LCD_WHITE
);
447 /* if a parameter is updated (by the user), we must print it */
451 #ifdef HAVE_LCD_COLOR
452 rb
->lcd_set_foreground(LCD_WHITE
);
454 rb
->lcd_putsxyf(0, LCD_HEIGHT
-font_h
, "star:%d speed:%d",
455 starfield
.nb_stars
, starfield
.z_move
);
459 button
= rb
->button_get(false);
462 case (STARFIELD_INCREASE_ZMOVE
):
463 case (STARFIELD_INCREASE_ZMOVE
| BUTTON_REPEAT
):
464 ++(starfield
.z_move
);
466 t_disp
=MSG_DISP_TIME
;
468 case (STARFIELD_DECREASE_ZMOVE
):
469 case (STARFIELD_DECREASE_ZMOVE
| BUTTON_REPEAT
):
470 --(starfield
.z_move
);
472 t_disp
=MSG_DISP_TIME
;
474 case(STARFIELD_INCREASE_NB_STARS
):
475 case(STARFIELD_INCREASE_NB_STARS
| BUTTON_REPEAT
):
476 starfield_add_stars(&starfield
, STARFIELD_INCREASE_STEP
);
477 t_disp
=MSG_DISP_TIME
;
479 case(STARFIELD_DECREASE_NB_STARS
):
480 case(STARFIELD_DECREASE_NB_STARS
| BUTTON_REPEAT
):
481 starfield_del_stars(&starfield
, STARFIELD_INCREASE_STEP
);
482 t_disp
=MSG_DISP_TIME
;
484 #ifdef HAVE_LCD_COLOR
485 case(STARFIELD_TOGGLE_COLOR
):
486 starfield
.color
=!starfield
.color
;
489 #ifdef STARFIELD_RC_QUIT
490 case STARFIELD_RC_QUIT
:
492 case(STARFIELD_QUIT
):
502 /*************************** Plugin entry point ****************************/
504 enum plugin_status
plugin_start(const void* parameter
)
509 /* Turn off backlight timeout */
510 backlight_force_on(); /* backlight control in lib/helper.c */
514 /* Turn on backlight timeout (revert to settings) */
515 backlight_use_settings(); /* backlight control in lib/helper.c*/