/*
 * Copyright (c) 2016, Zolertia <http://www.zolertia.com>
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. Neither the name of the Institute nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOcFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 * This file is part of the Contiki operating system.
 *
 */
/*---------------------------------------------------------------------------*/
/**
 * \addtogroup zoul-sensors
 * @{
 *
 * \defgroup zoul-lcd-backlight-lcd Grove LCD with RGB backlight
 * @{
 *
 * \file
 *         Grove LCD with RGB backlight header
 * \author
 *         Antonio Lignan <alinan@zolertia.com>
 */
/*---------------------------------------------------------------------------*/
#include "lib/sensors.h"
/* -------------------------------------------------------------------------- */
#ifndef RGB_BL_LCD_H_
#define RGB_BL_LCD_H_
/* -------------------------------------------------------------------------- */
/**
 * \name LCD w/ backlight enums
 * @{
 */
enum {
  LCD_RGB_WHITE  = 0x00,
  LCD_RGB_RED    = 0x01,
  LCD_RGB_GREEN  = 0x02,
  LCD_RGB_BLUE   = 0x03,
  LCD_RGB_BLACK  = 0x04,
  LCD_RGB_YELLOW = 0x05,
  LCD_RGB_PURPLE = 0x06,
};
/* -------------------------------------------------------------------------- */
enum {
  LCD_RGB_1ST_ROW  = 0x00,
  LCD_RGB_2ND_ROW  = 0x01,
};
/** @} */
/* -------------------------------------------------------------------------- */
/**
 * \name LCD w/ backlight address, registers and bitmasks
 * @{
 */
#define LCD_ADDR                        0x3E
#define LCD_RGB_ADDR                    0x62
/* -------------------------------------------------------------------------- */
#define LCD_RGB_REG_MODE1               0x00
#define LCD_RGB_REG_MODE2               0x01
#define LCD_RGB_REG_OUTPUT              0x08
/* -------------------------------------------------------------------------- */
#define LCD_RGB_COMMAND_BYTE            0x80
/* -------------------------------------------------------------------------- */
#define LCD_RGB_CLEAR_DISPLAY           0x01
#define LCD_RGB_RETURN_HOME             0x02
#define LCD_RGB_ENTRY_MODE_SET          0x04
#define LCD_RGB_DISPLAY_CONTROL         0x08
#define LCD_RGB_CURSOR_SHIFT            0x10
#define LCD_RGB_FUNCTION_SET            0x20
#define LCD_RGB_SETCGRAM_ADDR           0x40
#define LCD_RGB_SETDDRAM_ADDR           0x80
/* -------------------------------------------------------------------------- */
#define LCD_RGB_ENTRY_MODE_RIGHT        0x00
#define LCD_RGB_ENTRY_MODE_LEFT         0x02
#define LCD_RGB_ENTRY_SHIFT_INCREMENT   0x01
#define LCD_RGB_ENTRY_SHIFT_DECREMENT   0x00
/* -------------------------------------------------------------------------- */
#define LCD_RGB_DISPLAY_ON              0x04
#define LCD_RGB_DISPLAY_OFF             0x00
#define LCD_RGB_DISPLAY_CURSOR_ON       0x02
#define LCD_RGB_DISPLAY_CURSOR_OFF      0x00
#define LCD_RGB_DISPLAY_BLINK_ON        0x01
#define LCD_RGB_DISPLAY_BLINK_OFF       0x00
/* -------------------------------------------------------------------------- */
#define LCD_RGB_CURSOR_DISPLAY_MOVE     0x08
#define LCD_RGB_CURSOR_MOVE             0x00
#define LCD_RGB_CURSOR_MOVE_RIGHT       0x04
#define LCD_RGB_CURSOR_MOVE_LEFT        0x00
/* -------------------------------------------------------------------------- */
#define LCD_RGB_FUNCTION_SET_8BIT       0x10
#define LCD_RGB_FUNCTION_SET_4BIT       0x00
#define LCD_RGB_FUNCTION_SET_2_LINE     0x08
#define LCD_RGB_FUNCTION_SET_1_LINE     0x00
#define LCD_RGB_FUNCTION_SET_5x10_DOTS  0x04
#define LCD_RGB_FUNCTION_SET_5x8_DOTS   0x00
/* -------------------------------------------------------------------------- */
#define LCD_RGB_LED_MODE_1              0x00
#define LCD_RGB_LED_MODE_2              0x01
#define LCD_RGB_LED_OUT                 0x08
/* -------------------------------------------------------------------------- */
#define LCD_RGB_LED_RED                 0x04
#define LCD_RGB_LED_GREEN               0x03
#define LCD_RGB_LED_BLUE                0x02
/* -------------------------------------------------------------------------- */
#define LCD_RGB_LED_MODE_DEFAULT        0x00
#define LCD_RGB_LED_OUT_PWM_CTRL        0xAA
/* -------------------------------------------------------------------------- */
#define LCD_RGB_DELAY_50MS              50000
#define LCD_RGB_DELAY_4_5MS             4500
#define LCD_RGB_DELAY_150US             150
#define LCD_RGB_DELAY_2MS               2000
/* -------------------------------------------------------------------------- */
#define LCD_RGB_START_1ST_ROW           0x80
#define LCD_RGB_START_2ND_ROW           0xC0
/* -------------------------------------------------------------------------- */
#define LCD_RGB_ACTIVE                  SENSORS_ACTIVE
#define LCD_RGB_ERROR                   (-1)
#define LCD_RGB_SUCCESS                 0x00
/** @} */
/* -------------------------------------------------------------------------- */
/**
 * \name TSL2563 return and command values
 * @{
 */
/* LCD functions */
uint8_t lcd_write(const char *s);
int lcd_set_cursor(uint8_t col, uint8_t row);
int lcd_autoscroll(uint8_t state);
int lcd_scroll_display(uint8_t direction, uint8_t num);
int lcd_blink(uint8_t state);
int lcd_clear_display(void);
int lcd_return_home(void);
int lcd_display(uint8_t state);
int lcd_cursor(uint8_t state);
int lcd_text_direction(uint8_t direction);

/* Backlight functions */
int lcd_backlight_color(uint8_t color);
/** @} */
/* -------------------------------------------------------------------------- */
#define RGB_BACKLIGHT_LCD "LCD with RGB backlight"
extern const struct sensors_sensor rgb_bl_lcd;
/* -------------------------------------------------------------------------- */
#endif /* ifndef RGB_BL_LCD_ */
/**
 * @}
 * @}
 */