Index: apps/plugins/flashlight.c =================================================================== --- apps/plugins/flashlight.c (revision 17246) +++ apps/plugins/flashlight.c (working copy) @@ -25,66 +25,178 @@ PLUGIN_HEADER #if defined(HAVE_BACKLIGHT) -/* variable button definitions - only targets with a colour display */ -#if defined(HAVE_LCD_COLOR) +/* Targets with colour LCD */ #if (CONFIG_KEYPAD == IRIVER_H300_PAD) # define FLASHLIGHT_LEFT BUTTON_LEFT # define FLASHLIGHT_RIGHT BUTTON_RIGHT +# define FLASHLIGHT_NEXT BUTTON_UP +# define FLASHLIGHT_PREV BUTTON_DOWN +# define FLASHLIGHT_TOGGLE BUTTON_SELECT +# define FLASHLIGHT_QUIT BUTTON_OFF +# define FLASHLIGHT_R_TOGGLE BUTTON_RC_ON +# define FLASHLIGHT_R_QUIT BUTTON_RC_MENU #elif (CONFIG_KEYPAD == IPOD_4G_PAD) # define FLASHLIGHT_LEFT BUTTON_LEFT # define FLASHLIGHT_RIGHT BUTTON_RIGHT # define FLASHLIGHT_NEXT BUTTON_SCROLL_FWD # define FLASHLIGHT_PREV BUTTON_SCROLL_BACK +# define FLASHLIGHT_TOGGLE BUTTON_SELECT +# define FLASHLIGHT_QUIT BUTTON_MENU #elif (CONFIG_KEYPAD == IAUDIO_X5M5_PAD) # define FLASHLIGHT_LEFT BUTTON_LEFT # define FLASHLIGHT_RIGHT BUTTON_RIGHT +# define FLASHLIGHT_NEXT BUTTON_UP +# define FLASHLIGHT_PREV BUTTON_DOWN +# define FLASHLIGHT_TOGGLE BUTTON_SELECT +# define FLASHLIGHT_QUIT BUTTON_POWER #elif (CONFIG_KEYPAD == GIGABEAT_PAD) # define FLASHLIGHT_LEFT BUTTON_LEFT # define FLASHLIGHT_RIGHT BUTTON_RIGHT +# define FLASHLIGHT_NEXT BUTTON_UP +# define FLASHLIGHT_PREV BUTTON_DOWN +# define FLASHLIGHT_TOGGLE BUTTON_SELECT +# define FLASHLIGHT_QUIT BUTTON_POWER #elif (CONFIG_KEYPAD == GIGABEAT_S_PAD) # define FLASHLIGHT_LEFT BUTTON_LEFT # define FLASHLIGHT_RIGHT BUTTON_RIGHT +# define FLASHLIGHT_NEXT BUTTON_UP +# define FLASHLIGHT_PREV BUTTON_DOWN +# define FLASHLIGHT_TOGGLE BUTTON_SELECT +# define FLASHLIGHT_QUIT BUTTON_BACK #elif (CONFIG_KEYPAD == SANSA_E200_PAD) # define FLASHLIGHT_LEFT BUTTON_LEFT # define FLASHLIGHT_RIGHT BUTTON_RIGHT # define FLASHLIGHT_NEXT BUTTON_SCROLL_FWD # define FLASHLIGHT_PREV BUTTON_SCROLL_BACK +# define FLASHLIGHT_TOGGLE BUTTON_SELECT +# define FLASHLIGHT_QUIT BUTTON_POWER #elif (CONFIG_KEYPAD == SANSA_C200_PAD) # define FLASHLIGHT_LEFT BUTTON_LEFT # define FLASHLIGHT_RIGHT BUTTON_RIGHT +# define FLASHLIGHT_NEXT BUTTON_VOL_UP +# define FLASHLIGHT_PREV BUTTON_VOL_DOWN +# define FLASHLIGHT_TOGGLE BUTTON_SELECT +# define FLASHLIGHT_QUIT BUTTON_POWER #elif (CONFIG_KEYPAD == IRIVER_H10_PAD) # define FLASHLIGHT_LEFT BUTTON_LEFT # define FLASHLIGHT_RIGHT BUTTON_RIGHT # define FLASHLIGHT_NEXT BUTTON_SCROLL_UP # define FLASHLIGHT_PREV BUTTON_SCROLL_DOWN +# define FLASHLIGHT_TOGGLE BUTTON_PLAY +# define FLASHLIGHT_QUIT BUTTON_POWER #elif CONFIG_KEYPAD == MROBE500_PAD # define FLASHLIGHT_LEFT BUTTON_LEFT # define FLASHLIGHT_RIGHT BUTTON_RIGHT +# define FLASHLIGHT_NEXT BUTTON_UP +# define FLASHLIGHT_PREV BUTTON_DOWN +# define FLASHLIGHT_TOGGLE BUTTON_RC_HEART +# define FLASHLIGHT_QUIT BUTTON_POWER #elif CONFIG_KEYPAD == COWOND2_PAD # define FLASHLIGHT_LEFT BUTTON_LEFT # define FLASHLIGHT_RIGHT BUTTON_RIGHT +# define FLASHLIGHT_NEXT BUTTON_MINUS +# define FLASHLIGHT_PREV BUTTON_PLUS +# define FLASHLIGHT_TOGGLE BUTTON_SELECT +# define FLASHLIGHT_QUIT BUTTON_POWER +/* Targets without colour LCD but backlight */ +#elif (CONFIG_KEYPAD == IPOD_3G_PAD) || \ + (CONFIG_KEYPAD == IPOD_1G2G_PAD) +# define FLASHLIGHT_TOGGLE BUTTON_SELECT +# define FLASHLIGHT_QUIT BUTTON_MENU + +#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) +# define FLASHLIGHT_TOGGLE BUTTON_SELECT +# define FLASHLIGHT_QUIT BUTTON_OFF +# define FLASHLIGHT_R_TOGGLE BUTTON_RC_ON +# define FLASHLIGHT_R_QUIT BUTTON_RC_MENU + +#elif (CONFIG_KEYPAD == RECORDER_PAD) +# define FLASHLIGHT_TOGGLE BUTTON_ON +# define FLASHLIGHT_QUIT BUTTON_OFF + +#elif (CONFIG_KEYPAD == MROBE100_PAD) +# define FLASHLIGHT_TOGGLE BUTTON_SELECT +# define FLASHLIGHT_QUIT BUTTON_POWER + +#elif (CONFIG_KEYPAD == IAUDIO_M3_PAD) +# define FLASHLIGHT_TOGGLE BUTTON_RC_PLAY +# define FLASHLIGHT_QUIT BUTTON_RC_REC +# define FLASHLIGHT_R_TOGGLE BUTTON_PLAY +# define FLASHLIGHT_R_QUIT BUTTON_REC + #else # error Missing key definitions for this keypad #endif -#endif static struct plugin_api* rb; /* global api struct pointer */ #ifdef HAVE_LCD_COLOR -/* RGB color sets */ -#define NUM_COLORSETS 2 -static int colorset[NUM_COLORSETS][3] = { { 255, 255, 255 } , /* white */ - { 255, 0, 0 } }; /* red */ +/* HSV color sets */ +#define NUM_COLORSETS 7 +static int colorset[NUM_COLORSETS][2] = { { 0, 0 }, /* white */ + { 0, 255 }, /* red */ + { 60, 255 }, /* yellow */ + { 120, 255 }, /* green */ + { 180, 255 }, /* indigo */ + { 240, 255 }, /* blue */ + { 300, 255 } }; /* magenta */ + +/* hue [0..360], sat [0..255], v [0..255] */ +unsigned hsv_to_lcd(int hue, int sat, int v) +{ + int r, g, b; + + if (hue <= 60) /* red/green */ + { + r = 255; + g = 255 * hue / 60; + b = 0; + } + else if (hue > 60 && hue <= 120) /* green/red */ + { + g = 255; + r = 255 * (120 - hue) / 60; + b = 0; + } + else if (hue > 120 && hue <= 180) /* green/blue */ + { + g = 255; + b = 255 * (hue - 120) / 60; + r = 0; + } + else if (hue > 180 && hue <= 240) /* blue/green */ + { + b = 255; + g = 255 * (240 - hue) / 60; + r = 0; + } + else if (hue > 240 && hue <= 300) /* blue/red */ + { + b = 255; + r = 255 * (hue - 240) / 60; + g = 0; + } + else if (hue > 300) /* red/blue */ + { + r = 255; + b = 255 * (360 - hue) / 60; + g = 0; + } + r = (sat * r + (255 - sat) * v) / 255; + g = (sat * g + (255 - sat) * v) / 255; + b = (sat * b + (255 - sat) * v) / 255; + return LCD_RGBPACK(r, g, b); +} #endif /* HAVE_LCD_COLOR */ /* this is the plugin entry point */ @@ -95,18 +207,24 @@ #ifdef HAVE_LCD_COLOR int cs = 0; + int h = 0; +#endif /* HAVE_LCD_COLOR */ + bool bl = true; bool quit = false; -#endif /* HAVE_LCD_COLOR */ #ifdef HAVE_BACKLIGHT_BRIGHTNESS short old_brightness = rb->global_settings->brightness; #endif /* HAVE_BACKLIGHT_BRIGHTNESS */ #if LCD_DEPTH > 1 - unsigned bg_color=rb->lcd_get_background(); + unsigned bg_color = rb->lcd_get_background(); rb->lcd_set_backdrop(NULL); rb->lcd_set_background(LCD_WHITE); #endif +#if defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1) + unsigned bg_color_r = rb->lcd_remote_get_background(); + rb->lcd_remote_set_background(LCD_WHITE); +#endif #ifdef HAVE_BACKLIGHT_BRIGHTNESS rb->backlight_set_brightness(MAX_BRIGHTNESS_SETTING); @@ -123,65 +241,95 @@ backlight_force_on(rb); -#ifdef HAVE_LCD_COLOR + rb->lcd_clear_display(); + rb->lcd_update(); + +#ifdef HAVE_REMOTE_LCD + rb->lcd_remote_clear_display(); + remote_backlight_force_on(rb); +#endif /* HAVE_REMOTE_LCD */ + do { - if((cs < 0) || (cs >= NUM_COLORSETS)) - cs = 0; - rb->lcd_set_background( LCD_RGBPACK( colorset[cs][0], - colorset[cs][1], - colorset[cs][2] ) ); - rb->lcd_clear_display(); - rb->lcd_update(); - switch(rb->button_get(true)) { - case FLASHLIGHT_RIGHT: -#ifdef FLASHLIGHT_NEXT +#ifdef HAVE_LCD_COLOR case FLASHLIGHT_NEXT: -#endif /* FLASHLIGHT_NEXT */ - cs++; + case (FLASHLIGHT_NEXT|BUTTON_REPEAT): + h = (h + 5) % 360; + rb->lcd_set_background(hsv_to_lcd(h , 255, 255)); break; - case FLASHLIGHT_LEFT: -#ifdef FLASHLIGHT_PREV case FLASHLIGHT_PREV: -#endif /* FLASHLIGHT_PREV */ - cs--; + case (FLASHLIGHT_PREV|BUTTON_REPEAT): + h = (h + 355) % 360; + rb->lcd_set_background(hsv_to_lcd(h , 255, 255)); break; + case FLASHLIGHT_RIGHT: case (FLASHLIGHT_RIGHT|BUTTON_REPEAT): - case (FLASHLIGHT_RIGHT|BUTTON_REL): + if (h == colorset[cs][0]) { + cs = (cs + 1) % 7; + } else { + cs = (((h / 60) + 1) % 6) + 1; + } + rb->lcd_set_background( hsv_to_lcd( colorset[cs][0], + colorset[cs][1], 255 ) ); + h = colorset[cs][0]; + break; + + case FLASHLIGHT_LEFT: case (FLASHLIGHT_LEFT|BUTTON_REPEAT): - case (FLASHLIGHT_LEFT|BUTTON_REL): -#ifdef FLASHLIGHT_NEXT - case (FLASHLIGHT_NEXT|BUTTON_REPEAT): - case (FLASHLIGHT_NEXT|BUTTON_REL): -#endif /* FLASHLIGHT_NEXT */ -#ifdef FLASHLIGHT_PREV - case (FLASHLIGHT_PREV|BUTTON_REPEAT): - case (FLASHLIGHT_PREV|BUTTON_REL): -#endif /* FLASHLIGHT_PREV */ - /* eat these... */ + if (h == colorset[cs][0]) { + cs = (cs + 6) % 7; + } else { + cs = ((h / 60) % 6) + 1; + } + rb->lcd_set_background( hsv_to_lcd( colorset[cs][0], + colorset[cs][1], 255 ) ); + h = colorset[cs][0]; break; - default: +#endif /* HAVE_LCD_COLOR */ + + case FLASHLIGHT_TOGGLE: + case (FLASHLIGHT_TOGGLE|BUTTON_REPEAT): +#ifdef HAVE_REMOTE_LCD + case FLASHLIGHT_R_TOGGLE: + case (FLASHLIGHT_R_TOGGLE|BUTTON_REPEAT): +#endif /* HAVE_REMOTE_LCD */ + if (bl) { + rb->backlight_on(); +#ifdef HAVE_REMOTE_LCD + rb->remote_backlight_on(); +#endif /* HAVE_REMOTE_LCD */ + bl = false; + } else { + rb->backlight_off(); +#ifdef HAVE_REMOTE_LCD + rb->remote_backlight_off(); +#endif /* HAVE_REMOTE_LCD */ + bl = true; + } + break; + + case FLASHLIGHT_QUIT: +#ifdef HAVE_REMOTE_LCD + case FLASHLIGHT_R_QUIT: +#endif /* HAVE_REMOTE_LCD */ quit = true; } +#ifdef HAVE_LCD_COLOR + rb->lcd_clear_display(); + rb->lcd_update(); +#endif /* HAVE_LCD_COLOR */ + } while (!quit); -#else /* HAVE_LCD_COLOR */ - rb->lcd_clear_display(); - rb->lcd_update(); - /* wait */ - while(rb->button_get(false) == BUTTON_NONE) - { - rb->yield(); - } - -#endif /*HAVE_LCD_COLOR */ - /* restore */ backlight_use_settings(rb); +#ifdef HAVE_REMOTE_LCD + remote_backlight_use_settings(rb); +#endif /* HAVE_REMOTE_LCD */ #ifdef HAVE_LCD_INVERT rb->lcd_set_invert_display(rb->global_settings->invert); @@ -194,6 +342,10 @@ #if LCD_DEPTH > 1 rb->lcd_set_background(bg_color); #endif +#if defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1) + rb->lcd_remote_set_background(bg_color_r); +#endif + return PLUGIN_OK; } #endif