Index: apps/plugins/lamp.c =================================================================== --- apps/plugins/lamp.c (revision 17428) +++ apps/plugins/lamp.c (working copy) @@ -26,79 +26,195 @@ 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 LAMP_LEFT BUTTON_LEFT -# define LAMP_RIGHT BUTTON_RIGHT +# 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_STOP #elif (CONFIG_KEYPAD == IPOD_4G_PAD) -# define LAMP_LEFT BUTTON_LEFT -# define LAMP_RIGHT BUTTON_RIGHT -# define LAMP_NEXT BUTTON_SCROLL_FWD -# define LAMP_PREV BUTTON_SCROLL_BACK +# 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 LAMP_LEFT BUTTON_LEFT -# define LAMP_RIGHT BUTTON_RIGHT +# 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 LAMP_LEFT BUTTON_LEFT -# define LAMP_RIGHT BUTTON_RIGHT +# 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 LAMP_LEFT BUTTON_LEFT -# define LAMP_RIGHT BUTTON_RIGHT +# 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 LAMP_LEFT BUTTON_LEFT -# define LAMP_RIGHT BUTTON_RIGHT -# define LAMP_NEXT BUTTON_SCROLL_FWD -# define LAMP_PREV BUTTON_SCROLL_BACK +# 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 LAMP_LEFT BUTTON_LEFT -# define LAMP_RIGHT BUTTON_RIGHT +# 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 LAMP_LEFT BUTTON_LEFT -# define LAMP_RIGHT BUTTON_RIGHT -# define LAMP_NEXT BUTTON_SCROLL_UP -# define LAMP_PREV BUTTON_SCROLL_DOWN +# 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 LAMP_LEFT BUTTON_LEFT -# define LAMP_RIGHT BUTTON_RIGHT +# 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_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_STOP + +#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 + +#elif (CONFIG_KEYPAD == ONDIO_PAD) +# define FLASHLIGHT_TOGGLE BUTTON_MENU +# define FLASHLIGHT_QUIT BUTTON_OFF + #else # error Missing key definitions for this keypad #endif -#endif #ifdef HAVE_TOUCHPAD -# ifndef LAMP_LEFT -# define LAMP_LEFT BUTTON_MIDLEFT +# ifndef FLASHLIGHT_LEFT +# define FLASHLIGHT_LEFT BUTTON_MIDLEFT # endif -# ifndef LAMP_RIGHT -# define LAMP_RIGHT BUTTON_MIDRIGHT +# ifndef FLASHLIGHT_RIGHT +# define FLASHLIGHT_RIGHT BUTTON_MIDRIGHT # endif -# ifndef LAMP_NEXT -# define LAMP_NEXT BUTTON_TOPMIDDLE +# ifndef FLASHLIGHT_NEXT +# define FLASHLIGHT_NEXT BUTTON_TOPMIDDLE # endif -# ifndef LAMP_PREV -# define LAMP_PREV BUTTON_BOTTOMMIDDLE +# ifndef FLASHLIGHT_PREV +# define FLASHLIGHT_PREV BUTTON_BOTTOMMIDDLE # endif +# ifndef FLASHLIGHT_TOGGLE +# define FLASHLIGHT_TOGGLE BUTTON_CENTER +# 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 */ @@ -109,22 +225,29 @@ #ifdef HAVE_LCD_COLOR int cs = 0; + int h = 0; +#endif /* HAVE_LCD_COLOR */ + int button; + bool bl = true; bool quit = false; -#endif /* HAVE_LCD_COLOR */ + bool usb_detected = false; #ifdef HAVE_BACKLIGHT_BRIGHTNESS short old_brightness = rb->global_settings->brightness; #endif /* HAVE_BACKLIGHT_BRIGHTNESS */ #ifdef HAVE_BUTTONLIGHT_BRIGHTNESS - short old_buttonlight_brightness = - rb->global_settings->buttonlight_brightness; + short old_buttonlight_brightness = rb->global_settings->buttonlight_brightness; #endif /* HAVE_BUTTONLIGHT_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); @@ -147,70 +270,112 @@ buttonlight_force_on(rb); #endif /* HAVE_BUTTON_LIGHT */ -#ifdef HAVE_LCD_COLOR - do + 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-1; - if(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)) + button = rb->button_get(true); + switch(button) { - case LAMP_RIGHT: -#ifdef LAMP_NEXT - case LAMP_NEXT: -#endif /* LAMP_NEXT */ - cs++; +#ifdef HAVE_LCD_COLOR + case FLASHLIGHT_NEXT: + case (FLASHLIGHT_NEXT|BUTTON_REPEAT): + h = (h + 5) % 360; + rb->lcd_set_background(hsv_to_lcd(h , 255, 255)); break; - case LAMP_LEFT: -#ifdef LAMP_PREV - case LAMP_PREV: -#endif /* LAMP_PREV */ - cs--; + case FLASHLIGHT_PREV: + case (FLASHLIGHT_PREV|BUTTON_REPEAT): + h = (h + 355) % 360; + rb->lcd_set_background(hsv_to_lcd(h , 255, 255)); break; - case (LAMP_RIGHT|BUTTON_REPEAT): - case (LAMP_RIGHT|BUTTON_REL): - case (LAMP_LEFT|BUTTON_REPEAT): - case (LAMP_LEFT|BUTTON_REL): -#ifdef LAMP_NEXT - case (LAMP_NEXT|BUTTON_REPEAT): - case (LAMP_NEXT|BUTTON_REL): -#endif /* LAMP_NEXT */ -#ifdef LAMP_PREV - case (LAMP_PREV|BUTTON_REPEAT): - case (LAMP_PREV|BUTTON_REL): -#endif /* LAMP_PREV */ - /* eat these... */ + case FLASHLIGHT_RIGHT: + case (FLASHLIGHT_RIGHT|BUTTON_REPEAT): + 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): + 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; +#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 */ +#ifdef HAVE_BUTTON_LIGHT + rb->buttonlight_on(); +#endif /* HAVE_BUTTON_LIGHT */ + bl = false; + } else { + rb->backlight_off(); +#ifdef HAVE_REMOTE_LCD + rb->remote_backlight_off(); +#endif /* HAVE_REMOTE_LCD */ +#ifdef HAVE_BUTTON_LIGHT + rb->buttonlight_off(); +#endif /* HAVE_BUTTON_LIGHT */ + bl = true; + } + break; + + case FLASHLIGHT_QUIT: +#ifdef HAVE_REMOTE_LCD + case FLASHLIGHT_R_QUIT: +#endif /* HAVE_REMOTE_LCD */ + quit = true; + break; + default: - quit = true; + if(rb->default_event_handler(button) == SYS_USB_CONNECTED) { + usb_detected = true; + 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_BUTTON_LIGHT buttonlight_use_settings(rb); #endif /* HAVE_BUTTON_LIGHT */ +#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); @@ -226,6 +391,9 @@ #if LCD_DEPTH > 1 rb->lcd_set_background(bg_color); #endif - return PLUGIN_OK; +#if defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1) + rb->lcd_remote_set_background(bg_color_r); +#endif + return (usb_detected ? PLUGIN_USB_CONNECTED : PLUGIN_OK); } #endif