/***************************************************************************
 *             __________               __   ___.
 *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
 *   Source     |       _// __ \_/ ___\|  |/ /| __ \ / __ \  \/  /
 *   Jukebox    |    |   ( (__) )  \___|    ( | \_\ ( (__) )    (
 *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
 *                     \/            \/     \/    \/            \/
 * $Id: lamp.c 18338 2008-08-23 09:46:38Z mcuelenaere $
 *
 * Copyright (C) 2007 Vuong Minh Hiep (vmh)
 * Copyright (C) 2008 Thomas Martitz (kugel.)
 * Copyright (C) 2008 Alexander Papst
 * Copyright (C) 2008 Peter D'Hoye
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * 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 LAMP_LEFT       BUTTON_LEFT
#   define LAMP_RIGHT      BUTTON_RIGHT

#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

#elif (CONFIG_KEYPAD == IAUDIO_X5M5_PAD)
#   define LAMP_LEFT       BUTTON_LEFT
#   define LAMP_RIGHT      BUTTON_RIGHT

#elif (CONFIG_KEYPAD == GIGABEAT_PAD)
#   define LAMP_LEFT       BUTTON_LEFT
#   define LAMP_RIGHT      BUTTON_RIGHT

#elif (CONFIG_KEYPAD == GIGABEAT_S_PAD)
#   define LAMP_LEFT       BUTTON_LEFT
#   define LAMP_RIGHT      BUTTON_RIGHT

#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

#elif (CONFIG_KEYPAD == SANSA_C200_PAD)
#   define LAMP_LEFT       BUTTON_LEFT
#   define LAMP_RIGHT      BUTTON_RIGHT

#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

#elif CONFIG_KEYPAD == MROBE500_PAD
#   define LAMP_LEFT       BUTTON_LEFT
#   define LAMP_RIGHT      BUTTON_RIGHT

#elif CONFIG_KEYPAD == COWOND2_PAD

#else
#   error Missing key definitions for this keypad
#endif
#endif

#ifdef HAVE_TOUCHSCREEN
# ifndef LAMP_LEFT
#   define LAMP_LEFT       BUTTON_MIDLEFT
# endif
# ifndef LAMP_RIGHT
#   define LAMP_RIGHT      BUTTON_MIDRIGHT
# endif
# ifndef LAMP_NEXT
#   define LAMP_NEXT       BUTTON_TOPMIDDLE
# endif
# ifndef LAMP_PREV
#   define LAMP_PREV       BUTTON_BOTTOMMIDDLE
# endif
#endif

static const 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 */
#endif /* HAVE_LCD_COLOR */

/* this is the plugin entry point */
enum plugin_status plugin_start(const struct plugin_api* api, const void* parameter)
{
    (void)parameter;
    rb = api;

#ifdef HAVE_LCD_COLOR
    int cs = 0;
    bool quit = false;
#endif /* HAVE_LCD_COLOR */

#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();
    rb->lcd_set_backdrop(NULL);
    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
#ifdef MROBE_100
    /* mrobe-100 has inverted display so invert it for max brightness */
    rb->lcd_set_invert_display(true);
#else
    rb->lcd_set_invert_display(false);
#endif /* MROBE_100 */
#endif /* HAVE_LCD_INVERT */

    backlight_force_on(rb);
#ifdef HAVE_BUTTON_LIGHT
    buttonlight_force_on(rb);
#endif /* HAVE_BUTTON_LIGHT */

#ifdef HAVE_LCD_COLOR
    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))
        {
            case LAMP_RIGHT:
#ifdef LAMP_NEXT
            case LAMP_NEXT:
#endif /* LAMP_NEXT */
                cs++;
                break;

            case LAMP_LEFT:
#ifdef LAMP_PREV
            case LAMP_PREV:
#endif /* LAMP_PREV */
                cs--;
                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... */
                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_BUTTON_LIGHT
    buttonlight_use_settings(rb);
#endif /* HAVE_BUTTON_LIGHT */

#ifdef HAVE_LCD_INVERT
    rb->lcd_set_invert_display(rb->global_settings->invert);
#endif /* HAVE_LCD_INVERT */

#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;
}
#endif
