Index: apps/plugins/flashlight.c =================================================================== --- apps/plugins/flashlight.c (revision 17262) +++ apps/plugins/flashlight.c (working copy) @@ -25,56 +25,112 @@ 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_STOP #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_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 FLASHLIGHT_LEFT @@ -89,15 +145,85 @@ # ifndef FLASHLIGHT_PREV # define FLASHLIGHT_PREV BUTTON_BOTTOMMIDDLE # endif +# ifndef FLASHLIGHT_TOGGLE +# define FLASHLIGHT_TOGGLE BUTTON_MIDMIDDLE +# endif #endif static struct plugin_api* rb; /* global api struct pointer */ +#ifdef HAVE_BUTTON_LIGHT +/* Force the buttonlight on */ +void buttonlight_force_on(void) +{ + if (rb->global_settings->buttonlight_timeout > 0) + rb->buttonlight_set_timeout(0); +} + +/* Reset buttonlight operation to its settings */ +void buttonlight_use_settings(void) +{ + rb->buttonlight_set_timeout(rb->global_settings->buttonlight_timeout); +} +#endif /* HAVE_BUTTON_LIGHT */ + #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 */ @@ -108,22 +234,36 @@ #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; +#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); #endif /* HAVE_BACKLIGHT_BRIGHTNESS */ +#ifdef HAVE_BUTTONLIGHT_BRIGHTNESS + rb->buttonlight_set_brightness(MAX_BRIGHTNESS_SETTING); +#endif /* HAVE_BUTTONLIGHT_BRIGHTNESS */ #ifdef HAVE_LCD_INVERT #ifdef OLYMPUS_MROBE_100 @@ -135,66 +275,116 @@ #endif /* HAVE_LCD_INVERT */ backlight_force_on(rb); +#ifdef HAVE_BUTTON_LIGHT + buttonlight_force_on(); +#endif /* HAVE_BUTTON_LIGHT */ -#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)) + button = rb->button_get(true); + switch(button) { - 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; +#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(); +#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); @@ -203,10 +393,16 @@ #ifdef HAVE_BACKLIGHT_BRIGHTNESS rb->backlight_set_brightness(old_brightness); #endif /* HAVE_BACKLIGHT_BRIGHTNESS */ +#ifdef HAVE_BUTTONLIGHT_BRIGHTNESS + rb->buttonlight_set_brightness(old_buttonlight_brightness); +#endif /* HAVE_BUTTONLIGHT_BRIGHTNESS */ #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 Index: apps/plugin.c =================================================================== --- apps/plugin.c (revision 17262) +++ apps/plugin.c (working copy) @@ -584,6 +584,16 @@ #ifdef HAVE_LCD_INVERT lcd_set_invert_display, #endif /* HAVE_LCD_INVERT */ + simplelist_info_init, + simplelist_show_list, +#ifdef HAVE_BUTTON_LIGHT + buttonlight_set_timeout, + buttonlight_off, + buttonlight_on, +#ifdef HAVE_BUTTONLIGHT_BRIGHTNESS + buttonlight_set_brightness, +#endif /* HAVE_BUTTONLIGHT_BRIGHTNESS */ +#endif /* HAVE_BUTTON_LIGHT */ }; int plugin_load(const char* plugin, void* parameter) Index: apps/plugin.h =================================================================== --- apps/plugin.h (revision 17262) +++ apps/plugin.h (working copy) @@ -120,7 +120,7 @@ #define PLUGIN_MAGIC 0x526F634B /* RocK */ /* increase this every time the api struct changes */ -#define PLUGIN_API_VERSION 109 +#define PLUGIN_API_VERSION 110 /* update this to latest version if a change to the api struct breaks backwards compatibility (and please take the opportunity to sort in any @@ -731,6 +731,17 @@ #ifdef HAVE_LCD_INVERT void (*lcd_set_invert_display)(bool yesno); #endif /* HAVE_LCD_INVERT */ + void (*simplelist_info_init)(struct simplelist_info *info, char* title, + int count, void* data); + bool (*simplelist_show_list)(struct simplelist_info *info); +#ifdef HAVE_BUTTON_LIGHT + void (*buttonlight_set_timeout)(int value); + void (*buttonlight_off)(void); + void (*buttonlight_on)(void); +#ifdef HAVE_BUTTONLIGHT_BRIGHTNESS + void (*buttonlight_set_brightness)(int val); +#endif /* HAVE_BUTTONLIGHT_BRIGHTNESS */ +#endif /* HAVE_BUTTON_LIGHT */ }; /* plugin header */