/*****************************************************************************
 * (c) Copyright 2009 Actel Corporation.  All rights reserved.
 *
 * Author : Actel Application Team
 * Rev    : 1.0.0.0
 * Description: Device driver for the on-board OLED for SmartFusion KITS
 *  API of sample basic driver for OLED display found on Actel SmartFusion
 *  development boards.
 *  This code is intended as an example of using the SmartFusion I2C driver.
 *
 */
#ifndef OLED_H_
#define OLED_H_

#include "i2c.h"

#define OLED_HORIZ_SCROLL_ON    0x01
#define OLED_HORIZ_SCROLL_OFF   0x00
#define OLED_HORIZ_SCROLL_STEP  0x08
#define OLED_CONTRAST_VAL       0xFF
#define OLED_START_PAGE         0x01
#define OLED_HORIZ_SCROLL_TINVL 0x00
#define OLED_END_PAGE           0x05
/*-------------------------------------------------------------------------*/
/*  The oled_no_of_line type represents number of lines to be written on OLED.
    FIRST LINE  : The OLED cursor is set to line number 1 and only 1 line is
                  printed on OLED
    SECOND_LINE : The OLED cursor is set to line number 2 and only 1 line is
                  printed on OLED
    BOTH_LINES  : The OLED cursor is set to line number 1 and line 1 and line 2
                  are printed on OLED
*/
typedef enum {
    FIRST_LINE = 0,
    SECOND_LINE,
    BOTH_LINES
} oled_no_of_line;

/*-------------------------------------------------------------------------*//**
  oled_data
  ------------------------------------------------------------------------------
  There is one instance of this structure for OLED data. Instances of this
  structure is used to provide the data to OLED. A pointer to an instance of
  the oled_data structure is passed as the parameter OLED driver functions.
 */
struct oled_data
{
    /* Represents line number, where String 1 has to be printed */
    uint8_t line1;
    /* Represents character offset within the line1, from where String 1 has to be
     * printed */
    uint8_t char_offset1;
    /* Represents line number, where String 2 has to be printed */
    uint8_t line2;
    /* Represents character offset within the line2, from where String 2 has to be
     * printed */
    uint8_t char_offset2;
    /* String 1 holds the data to be displayed on line 1 of OLED, It has to be
     * less that 49 characters*/
    char    *string1;
    /* String 1 holds the data to be displayed on line 2 of OLED, It has to be
     * less that 49 characters*/
    char    *string2;
    /* Holds the contrast value to be set for String 1 and String 2 */
    uint8_t contrast_val;
    /* Represents ON or OFF for horizontal scrolling  */
    uint8_t on_off;
    /* Represents  number of coumns scrolls per step for horizontal scroll*/
    unsigned char column_scrool_per_step;
    /* Represents  start page for horizontal scroll*/
    unsigned char start_page;
    /* Represents  time interval for horizontal scroll*/
    unsigned char time_intrval_btw_scroll_step;
    /* Represents  end page for horizontal scroll*/
    unsigned char end_page;

};
/***************************************************************************//**
  The following defines can be used as parameter to the OLED_set_cursor()
  function.
 */

/***************************************************************************//**
  The OLED_init function initializes the OLED display.
 */
void vOLEDInit( void );
void OLED_init( void );

/***************************************************************************//**
  This function(OLED_clear_display) clears the content of the display RAM
  based on the LINES input.
  ------------------------------------------------------------------------------
  @param oled_no_of_line:
      The oled_no_of_line parameter enum that holds Number of lines.
      If FIRST_LINE is passed as parameter to this function thnen, this functions
      clears only First line that is 0
      If SECOND_LINE is passed as parameter to this function thnen, this functions
      clears only Second line that is 1
      If BOTH_LINE is passed as parameter to this function thnen, this functions
      clears entire OLED display.
 */
void OLED_clear_display( oled_no_of_line LINES );

/*-------------------------------------------------------------------------*//**
  OLED Write data.
  ------------------------------------------------------------------------------
  This function (OLED_write_data ) writes the data to OLED basedon the
  parameters passed to this function.
  ------------------------------------------------------------------------------
  @param data:
      The data parameter is a pointer to an oled_data structure, that holds
      different fields of data to be required for OLED (see the oled_data structure
      definition).

  @param oled_no_of_line:
      The oled_no_of_line parameter enum that holds Number of lines.
      If FIRST_LINE is passed as parameter to this function thnen, this functions
      wtites string 1 at FIRST LINE
      If SECOND_LINE is passed as parameter to this function thnen, this functions
      wtites string 1 at SECOND LINE
      If BOTH_LINE is passed as parameter to this function thnen, this functions
      wtites string 1 and string 2 at FIRST LINE and SECOND LINE respectively.
Example:
  @code
#include "drivers/mss_watchdog/mss_watchdog.h"
#include "oled.h"
#define FIRST_CHARACTER 0

int main()
{

    char *string1="SmartFusion";
    char *string2="INNOVATIVE ";
    struct oled_data write_data;

    write_data.line1 = FIRST_LINE;
    write_data.char_offset1 = FIRST_CHARACTER;
    write_data.string1 = string1;
    write_data.line2 = SECOND_LINE;
    write_data.char_offset2 = FIRST_CHARACTER;
    write_data.string2 = string2;
    write_data.contrast_val = 0x01;

    MSS_WD_disable();
    OLED_init();
    OLED_write_data(&write_data,BOTH_LINES);
    return 0;
}
  @endcode
 */

void OLED_write_data(struct oled_data * data, oled_no_of_line flag);

/*-------------------------------------------------------------------------*//**
  OLED Horizontal scrolling.
  ------------------------------------------------------------------------------
  This function (OLED_horizontal_scroll ) enbles the Horizontal scrolling.
  ------------------------------------------------------------------------------
  @param data:
      The horiz_scroll parameter is a pointer to an oled_data structure, that holds
      different fields of data to be required for OLED (see the oled_data structure
      definition).
Example:
  @code

int main()
{

    char *string1="SmartFusion";
    char *string2="INNOVATIVE     ";
    struct oled_data write_data;

    write_data.line1 = FIRST_LINE;
    write_data.char_offset1 = FIRST_CHARACTER;
    write_data.string1 = string1;
    write_data.line2 = SECOND_LINE;
    write_data.char_offset2 = FIRST_CHARACTER;
    write_data.string2 = string2;
    write_data.contrast_val = 0x01;
    write_data.on_off = 0x01;
    write_data.column_scrool_per_step = 0x08;
    write_data.start_page = 0x01;
    write_data.time_intrval_btw_scroll_step = 0x00;
    write_data.end_page = 0x05;

    MSS_WD_disable();
    OLED_init();
    OLED_write_data(&write_data,BOTH_LINES);
    OLED_horizontal_scroll(&write_data);
    return 0;
}
  @endcode
 */

void OLED_horizontal_scroll(struct oled_data * horiz_scroll);

/***************************************************************************//**
  This function(OLED_contrast) sets ths conrtast to the data displayed on the
  OLED.
  ------------------------------------------------------------------------------
  @param color_contrast:
  The color_contrast parameter that holds contrast value.
  The color_contrast values should be in the range of 1 to 256.
 */
void OLED_contrast(uint8_t color_contrast);

#endif



