Index: apps/plugins/lib/helper.c =================================================================== --- apps/plugins/lib/helper.c (Revision 19944) +++ apps/plugins/lib/helper.c (Arbeitskopie) @@ -22,19 +22,35 @@ #include "plugin.h" #include "helper.h" -/* Force the backlight on */ -void backlight_force_on(void) +/* Values of the backlight related setting for 'always on' and 'always off' */ +#define BACKLIGHT_ON 0 +#define BACKLIGHT_OFF (-1) + +/* Force the backlight to the new value */ +static void backlight_set(int newvalue) { if(!rb) return; - if (rb->global_settings->backlight_timeout > 0) - rb->backlight_set_timeout(0); + if (rb->global_settings->backlight_timeout != newvalue) + rb->backlight_set_timeout(newvalue); #if CONFIG_CHARGING - if (rb->global_settings->backlight_timeout_plugged > 0) - rb->backlight_set_timeout_plugged(0); + if (rb->global_settings->backlight_timeout_plugged != newvalue) + rb->backlight_set_timeout_plugged(newvalue); #endif /* CONFIG_CHARGING */ } +/* Force the backlight on */ +void backlight_force_on(void) +{ + backlight_set(BACKLIGHT_ON); +} + +/* Force the backlight off */ +void backlight_force_off(void) +{ + backlight_set(BACKLIGHT_OFF); +} + /* Reset backlight operation to its settings */ void backlight_use_settings(void) { @@ -48,19 +64,32 @@ } #ifdef HAVE_REMOTE_LCD -/* Force the backlight on */ -void remote_backlight_force_on(void) +/* Force the remote backlight to the new value */ +static void remote_backlight_set(int newvalue) { if (!rb) return; - if (rb->global_settings->remote_backlight_timeout > 0) - rb->remote_backlight_set_timeout(0); + if (rb->global_settings->remote_backlight_timeout != newvalue) + rb->remote_backlight_set_timeout(newvalue); #if CONFIG_CHARGING - if (rb->global_settings->remote_backlight_timeout_plugged > 0) - rb->remote_backlight_set_timeout_plugged(0); + if (rb->global_settings->remote_backlight_timeout_plugged != newvalue) + rb->remote_backlight_set_timeout_plugged(newvalue); #endif /* CONFIG_CHARGING */ } +/* Force the remote backlight on */ +void remote_backlight_force_on(void) +{ + remote_backlight_set(BACKLIGHT_ON); +} + +/* Force the remote backlight off */ +void remote_backlight_force_off(void) +{ + remote_backlight_set(BACKLIGHT_OFF); +} + + /* Reset backlight operation to its settings */ void remote_backlight_use_settings(void) { @@ -76,15 +105,27 @@ #endif /* HAVE_REMOTE_LCD */ #ifdef HAVE_BUTTON_LIGHT -/* Force the buttonlight on */ -void buttonlight_force_on(void) +/* Force the buttonlight to the new value */ +static void buttonlight_set(int newvalue) { if (!rb) return; - if (rb->global_settings->buttonlight_timeout > 0) - rb->buttonlight_set_timeout(0); + if (rb->global_settings->buttonlight_timeout != newvalue) + rb->buttonlight_set_timeout(newvalue); } +/* Force the buttonlight on */ +void buttonlight_force_on(void) +{ + buttonlight_set(BACKLIGHT_ON); +} + +/* Force the buttonlight off */ +void buttonlight_force_off(void) +{ + buttonlight_set(BACKLIGHT_OFF); +} + /* Reset buttonlight operation to its settings */ void buttonlight_use_settings(void) { Index: apps/plugins/lib/helper.h =================================================================== --- apps/plugins/lib/helper.h (Revision 19944) +++ apps/plugins/lib/helper.h (Arbeitskopie) @@ -27,13 +27,16 @@ * Backlight on/off operations */ void backlight_force_on(void); +void backlight_force_off(void); void backlight_use_settings(void); #ifdef HAVE_REMOTE_LCD void remote_backlight_force_on(void); +void remote_backlight_force_off(void); void remote_backlight_use_settings(void); #endif #ifdef HAVE_BUTTON_LIGHT void buttonlight_force_on(void); +void buttonlight_force_off(void); void buttonlight_use_settings(void); #endif Index: apps/plugins/lamp.c =================================================================== --- apps/plugins/lamp.c (Revision 19944) +++ apps/plugins/lamp.c (Arbeitskopie) @@ -28,29 +28,53 @@ PLUGIN_HEADER #if defined(HAVE_BACKLIGHT) -/* variable button definitions - only targets with a colour display */ -#if defined(HAVE_LCD_COLOR) + +/* Variable button definitions. + + All targets should define LAMP_QUIT (and LAMP_R_QUIT, if a remote + is available) to quit. + + LAMP_TOGGLE and LAMP_R_TOGGLE can be defined to toggle the lamp on and off + without leaving the plugin. + + Targets with a colour display should also define LAMP_LEFT and LAMP_RIGHT + to switch the colour back and forth. If there are other buttons to switch + the colour, LAMP_PREV and LAMP_NEXT can be defined. + */ + #if (CONFIG_KEYPAD == IRIVER_H300_PAD) # define LAMP_LEFT BUTTON_LEFT # define LAMP_RIGHT BUTTON_RIGHT +# define LAMP_QUIT BUTTON_OFF +# define LAMP_R_QUIT BUTTON_RC_STOP +# define LAMP_TOGGLE BUTTON_SELECT +# define LAMP_R_TOGGLE BUTTON_RC_ON #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 LAMP_QUIT BUTTON_MENU +# define LAMP_TOGGLE BUTTON_SELECT #elif (CONFIG_KEYPAD == IAUDIO_X5M5_PAD) # define LAMP_LEFT BUTTON_LEFT # define LAMP_RIGHT BUTTON_RIGHT +# define LAMP_QUIT BUTTON_POWER +# define LAMP_TOGGLE BUTTON_SELECT #elif (CONFIG_KEYPAD == GIGABEAT_PAD) # define LAMP_LEFT BUTTON_LEFT # define LAMP_RIGHT BUTTON_RIGHT +# define LAMP_QUIT BUTTON_POWER +# define LAMP_TOGGLE BUTTON_SELECT #elif (CONFIG_KEYPAD == GIGABEAT_S_PAD) # define LAMP_LEFT BUTTON_LEFT # define LAMP_RIGHT BUTTON_RIGHT +# define LAMP_QUIT BUTTON_BACK +# define LAMP_TOGGLE BUTTON_SELECT #elif (CONFIG_KEYPAD == SANSA_E200_PAD) || \ (CONFIG_KEYPAD == SANSA_FUZE_PAD) @@ -58,35 +82,78 @@ # define LAMP_RIGHT BUTTON_RIGHT # define LAMP_NEXT BUTTON_SCROLL_FWD # define LAMP_PREV BUTTON_SCROLL_BACK +# define LAMP_QUIT BUTTON_POWER +# define LAMP_TOGGLE BUTTON_SELECT #elif (CONFIG_KEYPAD == SANSA_C200_PAD) # define LAMP_LEFT BUTTON_LEFT # define LAMP_RIGHT BUTTON_RIGHT +# define LAMP_QUIT BUTTON_POWER +# define LAMP_TOGGLE BUTTON_SELECT #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 LAMP_QUIT BUTTON_POWER +# define LAMP_TOGGLE BUTTON_PLAY #elif CONFIG_KEYPAD == MROBE500_PAD # define LAMP_LEFT BUTTON_LEFT # define LAMP_RIGHT BUTTON_RIGHT +# define LAMP_QUIT BUTTON_POWER +# define LAMP_TOGGLE BUTTON_RC_HEART #elif CONFIG_KEYPAD == COWOND2_PAD +# define LAMP_QUIT BUTTON_POWER +# define LAMP_TOGGLE BUTTON_MENU #elif CONFIG_KEYPAD == IAUDIO67_PAD # define LAMP_LEFT BUTTON_LEFT # define LAMP_RIGHT BUTTON_RIGHT +# define LAMP_QUIT BUTTON_STOP +# define LAMP_TOGGLE BUTTON_PLAY #elif CONFIG_KEYPAD == PHILIPS_HDD1630_PAD # define LAMP_LEFT BUTTON_LEFT # define LAMP_RIGHT BUTTON_RIGHT +# define LAMP_QUIT BUTTON_POWER +# define LAMP_TOGGLE BUTTON_SELECT + +/* Targets without colour LCD but with backlight */ +#elif (CONFIG_KEYPAD == IPOD_3G_PAD) || \ + (CONFIG_KEYPAD == IPOD_1G2G_PAD) +# define LAMP_QUIT BUTTON_MENU +# define LAMP_TOGGLE BUTTON_SELECT +#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) +# define LAMP_QUIT BUTTON_OFF +# define LAMP_R_QUIT BUTTON_RC_STOP +# define LAMP_TOGGLE BUTTON_SELECT +# define LAMP_R_TOGGLE BUTTON_RC_ON + +#elif (CONFIG_KEYPAD == RECORDER_PAD) +# define LAMP_QUIT BUTTON_OFF +# define LAMP_TOGGLE BUTTON_ON + +#elif (CONFIG_KEYPAD == MROBE100_PAD) +# define LAMP_QUIT BUTTON_POWER +# define LAMP_TOGGLE BUTTON_SELECT + +#elif (CONFIG_KEYPAD == IAUDIO_M3_PAD) +# define LAMP_QUIT BUTTON_RC_REC +# define LAMP_R_QUIT BUTTON_REC +# define LAMP_TOGGLE BUTTON_RC_PLAY +# define LAMP_R_TOGGLE BUTTON_PLAY + +#elif (CONFIG_KEYPAD == ONDIO_PAD) +# define LAMP_QUIT BUTTON_OFF +# define LAMP_TOGGLE BUTTON_MENU + #else # error Missing key definitions for this keypad #endif -#endif #ifdef HAVE_TOUCHSCREEN # ifndef LAMP_LEFT @@ -101,6 +168,9 @@ # ifndef LAMP_PREV # define LAMP_PREV BUTTON_BOTTOMMIDDLE # endif +# ifndef LAMP_TOGGLE +# define LAMP_TOGGLE BUTTON_CENTER +# endif #endif #ifdef HAVE_LCD_COLOR @@ -110,15 +180,26 @@ { 255, 0, 0 } }; /* red */ #endif /* HAVE_LCD_COLOR */ + +/* Function to switch the lamp on or off */ +static void switch_lamp(bool new_state); + + /* this is the plugin entry point */ enum plugin_status plugin_start(const void* parameter) { long button; (void)parameter; + +#ifdef LAMP_TOGGLE + bool lamp_on = true; +#endif /* LAMP_TOGGLE */ + bool quit = false; + bool usb_detected = false; + #ifdef HAVE_LCD_COLOR int cs = 0; - bool quit = false; #endif /* HAVE_LCD_COLOR */ #ifdef HAVE_BACKLIGHT_BRIGHTNESS @@ -135,13 +216,6 @@ rb->lcd_set_background(LCD_WHITE); #endif -#ifdef HAVE_BACKLIGHT_BRIGHTNESS - rb->backlight_set_brightness(MAX_BRIGHTNESS_SETTING); -#endif /* HAVE_BACKLIGHT_BRIGHTNESS */ -#ifdef HAVE_BUTTONLIGHT_BRIGHTNESS - rb->buttonlight_set_brightness(MAX_BRIGHTNESS_SETTING); -#endif /* HAVE_BUTTONLIGHT_BRIGHTNESS */ - #ifdef HAVE_LCD_INVERT #if defined(MROBE_100) || defined(SANSA_CLIP) /* mrobe-100 has inverted display so invert it for max brightness */ @@ -152,14 +226,11 @@ #endif /* MROBE_100 */ #endif /* HAVE_LCD_INVERT */ - backlight_force_on(); -#ifdef HAVE_BUTTON_LIGHT - buttonlight_force_on(); -#endif /* HAVE_BUTTON_LIGHT */ + switch_lamp(lamp_on); -#ifdef HAVE_LCD_COLOR do { +#ifdef HAVE_LCD_COLOR if(cs < 0) cs = NUM_COLORSETS-1; if(cs >= NUM_COLORSETS) @@ -169,9 +240,33 @@ colorset[cs][2] ) ); rb->lcd_clear_display(); rb->lcd_update(); +#endif /* HAVE_LCD_COLOR */ switch((button = rb->button_get(true))) { + case LAMP_QUIT: +#ifdef LAMP_R_QUIT + case LAMP_R_QUIT: +#endif /* LAMP_R_QUIT */ + quit = true; + break; + +#ifdef LAMP_TOGGLE + case LAMP_TOGGLE: + case (LAMP_TOGGLE|BUTTON_REPEAT): +#ifdef LAMP_R_TOGGLE + case LAMP_R_TOGGLE: + case (LAMP_R_TOGGLE|BUTTON_REPEAT): +#endif /* LAMP_R_TOGGLE */ + lamp_on = !lamp_on; + switch_lamp(lamp_on); + break; +#endif /* LAMP_TOGGLE */ + +#ifdef HAVE_LCD_COLOR + +/* If we have a colour display, let the user to switch the colour */ + case LAMP_RIGHT: #ifdef LAMP_NEXT case LAMP_NEXT: @@ -199,27 +294,20 @@ case (LAMP_PREV|BUTTON_REL): #endif /* LAMP_PREV */ /* eat these... */ - break; + break; + +#endif /* HAVE_LCD_COLOR */ + default: - if (IS_SYSEVENT(button)) + if(rb->default_event_handler(button) == SYS_USB_CONNECTED) + { + usb_detected = true; quit = true; + } } } while (!quit); -#else /* HAVE_LCD_COLOR */ - rb->lcd_clear_display(); - rb->lcd_update(); - /* wait */ - do - { - button = rb->button_get(false); - if (button && !IS_SYSEVENT(button)) - break; - rb->yield(); - } while (1); -#endif /*HAVE_LCD_COLOR */ - /* restore */ backlight_use_settings(); #ifdef HAVE_BUTTON_LIGHT @@ -240,6 +328,47 @@ #if LCD_DEPTH > 1 rb->lcd_set_background(bg_color); #endif - return PLUGIN_OK; + return (usb_detected ? PLUGIN_USB_CONNECTED : PLUGIN_OK); } + + + +static void switch_lamp(bool new_state) +{ + if (new_state) + { +#ifdef HAVE_BACKLIGHT_BRIGHTNESS + rb->backlight_set_brightness(MAX_BRIGHTNESS_SETTING); +#endif /* HAVE_BACKLIGHT_BRIGHTNESS */ + +#ifdef HAVE_BUTTONLIGHT_BRIGHTNESS + rb->buttonlight_set_brightness(MAX_BRIGHTNESS_SETTING); +#endif /* HAVE_BUTTONLIGHT_BRIGHTNESS */ + + backlight_force_on(); + +#ifdef HAVE_BUTTON_LIGHT + buttonlight_force_on(); +#endif /* HAVE_BUTTON_LIGHT */ + +#ifdef HAVE_REMOTE_LCD + remote_backlight_force_on(); +#endif /* HAVE_REMOTE_LCD */ + + } + else + { + backlight_force_off(); + +#ifdef HAVE_BUTTON_LIGHT + buttonlight_force_off(); +#endif /* HAVE_BUTTON_LIGHT */ + +#ifdef HAVE_REMOTE_LCD + remote_backlight_force_off(); +#endif /* HAVE_REMOTE_LCD */ + + } +} + #endif