diff options
author | Peter D'Hoye <peter.dhoye@gmail.com> | 2008-04-23 21:15:07 +0000 |
---|---|---|
committer | Peter D'Hoye <peter.dhoye@gmail.com> | 2008-04-23 21:15:07 +0000 |
commit | 39718e358518ef16a42415a7b44b6e37bacaa656 (patch) | |
tree | be66533008c2b94f4b513d2c87351f0f357f9109 | |
parent | a616c4851a7c3496e0aae15cdb382f4d0219dc8a (diff) |
Accept FS #8285 - "Flashlight" plugin by Vuong Minh Hiep, Thomas Martitz and Alexander Papst
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@17226 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r-- | apps/plugin.c | 5 | ||||
-rw-r--r-- | apps/plugin.h | 9 | ||||
-rw-r--r-- | apps/plugins/CATEGORIES | 1 | ||||
-rw-r--r-- | apps/plugins/SOURCES | 3 | ||||
-rw-r--r-- | apps/plugins/flashlight.c | 219 |
5 files changed, 235 insertions, 2 deletions
diff --git a/apps/plugin.c b/apps/plugin.c index a7baa6d314..fa59fcf799 100644 --- a/apps/plugin.c +++ b/apps/plugin.c @@ -141,6 +141,7 @@ static const struct plugin_api rockbox_api = { backlight_on, backlight_off, backlight_set_timeout, + #if CONFIG_CHARGING backlight_set_timeout_plugged, #endif @@ -577,6 +578,10 @@ static const struct plugin_api rockbox_api = { /* new stuff at the end, sort into place next time the API gets incompatible */ +#ifdef HAVE_BACKLIGHT_BRIGHTNESS + backlight_set_brightness, +#endif /* HAVE_BACKLIGHT_BRIGHTNESS */ + }; int plugin_load(const char* plugin, void* parameter) diff --git a/apps/plugin.h b/apps/plugin.h index 9e0386f001..9ca14735e5 100644 --- a/apps/plugin.h +++ b/apps/plugin.h @@ -120,7 +120,7 @@ #define PLUGIN_MAGIC 0x526F634B /* RocK */ /* increase this every time the api struct changes */ -#define PLUGIN_API_VERSION 108 +#define PLUGIN_API_VERSION 109 /* update this to latest version if a change to the api struct breaks backwards compatibility (and please take the opportunity to sort in any @@ -232,6 +232,7 @@ struct plugin_api { void (*backlight_on)(void); void (*backlight_off)(void); void (*backlight_set_timeout)(int index); + #if CONFIG_CHARGING void (*backlight_set_timeout_plugged)(int index); #endif @@ -723,7 +724,11 @@ struct plugin_api { /* new stuff at the end, sort into place next time the API gets incompatible */ - + +#ifdef HAVE_BACKLIGHT_BRIGHTNESS + void (*backlight_set_brightness)(int val); +#endif /* HAVE_BACKLIGHT_BRIGHTNESS */ + }; /* plugin header */ diff --git a/apps/plugins/CATEGORIES b/apps/plugins/CATEGORIES index 738c031698..607dcbc544 100644 --- a/apps/plugins/CATEGORIES +++ b/apps/plugins/CATEGORIES @@ -97,3 +97,4 @@ wavview,viewers wormlet,games xobox,games zxbox,viewers +flashlight,apps diff --git a/apps/plugins/SOURCES b/apps/plugins/SOURCES index 8e138d72cb..b33b6305f3 100644 --- a/apps/plugins/SOURCES +++ b/apps/plugins/SOURCES @@ -19,6 +19,9 @@ stats.c stopwatch.c vbrfix.c viewer.c +#ifdef HAVE_BACKLIGHT +flashlight.c +#endif /* HAVE_BACKLIGHT */ #ifdef OLYMPUS_MROBE_500 /* remove these once the plugins before it are compileable */ diff --git a/apps/plugins/flashlight.c b/apps/plugins/flashlight.c new file mode 100644 index 0000000000..748848310f --- /dev/null +++ b/apps/plugins/flashlight.c @@ -0,0 +1,219 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// __ \_/ ___\| |/ /| __ \ / __ \ \/ / + * Jukebox | | ( (__) ) \___| ( | \_\ ( (__) ) ( + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2007 Vuong Minh Hiep (vmh) + * Copyright (C) 2008 Thomas Martitz (kugel.) + * Copyright (C) 2008 Alexander Papst + * + * All files in this archive are subject to the GNU General Public License. + * See the file COPYING in the source tree root for full license agreement. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ + +#include "plugin.h" +#include "helper.h" + +PLUGIN_HEADER + +#if defined(HAVE_BACKLIGHT) +/* variable button definitions - only targets with a colour display */ +#if defined(HAVE_LCD_COLOR) +#if (CONFIG_KEYPAD == IRIVER_H300_PAD) +# define FLASHLIGHT_LEFT BUTTON_LEFT +# define FLASHLIGHT_RIGHT BUTTON_RIGHT + +#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 + +#elif (CONFIG_KEYPAD == IAUDIO_X5M5_PAD) +# define FLASHLIGHT_LEFT BUTTON_LEFT +# define FLASHLIGHT_RIGHT BUTTON_RIGHT + +#elif (CONFIG_KEYPAD == GIGABEAT_PAD) +# define FLASHLIGHT_LEFT BUTTON_LEFT +# define FLASHLIGHT_RIGHT BUTTON_RIGHT + +#elif (CONFIG_KEYPAD == GIGABEAT_S_PAD) +# define FLASHLIGHT_LEFT BUTTON_LEFT +# define FLASHLIGHT_RIGHT BUTTON_RIGHT + +#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 + +#elif (CONFIG_KEYPAD == SANSA_C200_PAD) +# define FLASHLIGHT_LEFT BUTTON_LEFT +# define FLASHLIGHT_RIGHT BUTTON_RIGHT + +#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 + +#else +# error Missing key definitions for this keypad +#endif +#endif + +static struct plugin_api* rb; /* global api struct pointer */ + +#ifdef HAVE_LCD_COLOR +void hsv_to_rgb(float hue, float sat, float v, + float *red, float *green, float *blue) +{ + float r, g, b; + + if (hue > 0.17 && hue <= 0.33) /* green/red */ + { + g = 1.0; + r = ((float)0.33 - hue) / (float)0.16; + b = 0.0; + } + else if (hue > 0.33 && hue <= 0.5) /* green/blue */ + { + g = 1.0; + b = (hue - (float)0.33) / (float)0.17; + r = 0.0; + } + else if (hue > 0.5 && hue <= 0.67) /* blue/green */ + { + b = 1.0; + g = ((float)0.67 - hue) / (float)0.17; + r = 0.0; + } + else if (hue > 0.67 && hue <= 0.83) /* blue/red */ + { + b = 1.0; + r = (hue - (float)0.67) / (float)0.16; + g = 0.0; + } + else if (hue > 0.83 && hue <= 1.0) /* red/blue */ + { + r = 1.0; + b = ((float)1.0 - hue) / (float)0.17; + g = 0.0; + } + else /* red/green */ + { + r = 1.0; + g = hue / (float)0.17; + b = 0.0; + } + + *red = (sat * r + ((float)1.0 - sat)) * v; + *green = (sat * g + ((float)1.0 - sat)) * v; + *blue = (sat * b + ((float)1.0 - sat)) * v; +} +#endif + +/* this is the plugin entry point */ +enum plugin_status plugin_start(struct plugin_api* api, void* parameter) +{ + (void)parameter; + rb = api; + +#ifdef HAVE_LCD_COLOR + int h = 0; + float var_r, var_g, var_b; + 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 + rb->lcd_set_backdrop(NULL); + unsigned bg_color=rb->lcd_get_background(); + rb->lcd_set_background(LCD_WHITE); +#endif +#ifdef HAVE_BACKLIGHT_BRIGHTNESS + rb->backlight_set_brightness(MAX_BRIGHTNESS_SETTING); +#endif /* HAVE_BACKLIGHT_BRIGHTNESS */ + + backlight_force_on(rb); + +#ifdef HAVE_LCD_COLOR + do + { + if (h != 0) + { + hsv_to_rgb( ((float)(h - 5) / 360.0), 1, 1, &var_r, &var_g, &var_b); + rb->lcd_set_background( LCD_RGBPACK( ((int)(var_r * 255)), + ((int)(var_g * 255)), + ((int)(var_b * 255)) ) ); + } + else + { /* Whilte screen */ + rb->lcd_set_background(LCD_WHITE); + } + rb->lcd_clear_display(); + rb->lcd_update(); + + switch(rb->button_get(true)) + { + case FLASHLIGHT_RIGHT: + case (FLASHLIGHT_RIGHT|BUTTON_REPEAT): + case (FLASHLIGHT_RIGHT|BUTTON_REL): +#ifdef FLASHLIGHT_NEXT + case FLASHLIGHT_NEXT: + case (FLASHLIGHT_NEXT|BUTTON_REPEAT): + case (FLASHLIGHT_NEXT|BUTTON_REL): +#endif /* FLASHLIGHT_NEXT */ + h = (h + 5) % 365; + break; + case FLASHLIGHT_LEFT: + case (FLASHLIGHT_LEFT|BUTTON_REPEAT): + case (FLASHLIGHT_LEFT|BUTTON_REL): +#ifdef FLASHLIGHT_PREV + case FLASHLIGHT_PREV: + case (FLASHLIGHT_PREV|BUTTON_REPEAT): + case (FLASHLIGHT_PREV|BUTTON_REL): +#endif /* FLASHLIGHT_PREV */ + h = (h + 360) % 365; + break; + + default: + quit = true; + } + } 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_BACKLIGHT_BRIGHTNESS + rb->backlight_set_brightness(old_brightness); +#endif /* HAVE_BACKLIGHT_BRIGHTNESS */ + +#if LCD_DEPTH > 1 + rb->lcd_set_background(bg_color); +#endif + return PLUGIN_OK; +} +#endif |