/*!
 * \file      display-board.h
 *
 * \brief     Target board OLED low level driver implementation
 *
 * \remarks   Some snippets of these drivers are based on the Adafruit_GFX library.
 *            https://github.com/adafruit/Adafruit-GFX-Library
 *            Please take a look at their LICENSE.TXT file.
 *            Copyright (c) 2012 Adafruit Industries. All rights reserved.
 *
 * \copyright Revised BSD License, see section \ref LICENSE.
 *
 * \code
 *                ______                              _
 *               / _____)             _              | |
 *              ( (____  _____ ____ _| |_ _____  ____| |__
 *               \____ \| ___ |    (_   _) ___ |/ ___)  _ \
 *               _____) ) ____| | | || |_| ____( (___| | | |
 *              (______/|_____)_|_|_| \__)_____)\____)_| |_|
 *              (C)2013-2017 Semtech
 *
 * \endcode
 *
 * \author    Miguel Luis ( Semtech )
 *
 * \author    Gregory Cristian ( Semtech )
 */
#ifndef __DISPLAY_BOARD_H__
#define __DISPLAY_BOARD_H__

#ifdef __cplusplus
extern "C"
{
#endif

#include <stdint.h>
#include <stdbool.h>

/*!
 * \brief Display colors enumeration
 */
typedef enum
{
    DISPLAY_BLACK,
    DISPLAY_WHITE,
    DISPLAY_INVERSE,
}DisplayColor_t;

/*!
 * \brief Initializes the display
 */
void DisplayInit( void );

/*!
 * \brief Resets the display
 */
void DisplayReset( void );

/*!
 * \brief Sends a command to the display
 *
 * \param cmd Command to be sent
 */
void DisplaySendCommand( uint8_t cmd );

/*!
 * \brief Sends a data buffer to the display
 *
 * \param buffer Buffer to be sent
 * \param size   Buffer size to be sent
 */
void DisplaySendData( uint8_t *buffer, uint16_t size );

/*!
 * \brief Enables the display
 */
void DisplayOn( void );

/*!
 * \brief Disables the display
 */
void DisplayOff( void );

/*!
 * \brief Clears the display
 */
void DisplayClear( void );

/*!
 * \brief Inverts colors of the display
 *
 * \param invert [true: invert, false: normal]
 */
void DisplayInvertColors( bool invert );

/*!
 * \brief Updates the display with MCU RAM copy
 */
void DisplayUpdate( void );

/*!
 * \brief Sets the cursor at coordinates (x,y)
 *
 * \param x   X coordinate
 * \param y   Y coordinate
 */
void DisplaySetCursor( int16_t x, int16_t y );

/*!
 * \brief Gets current X coordinate of the cursor
 *
 * \retval x   X coordinate
 */
int16_t DisplayGetCursorX( void );

/*!
 * \brief Gets current Y coordinate of the cursor
 *
 * \retval y   Y coordinate
 */
int16_t DisplayGetCursorY( void );

/*!
 * \brief Sets text size
 *
 * \param s New text size
 */
void DisplaySetTextSize( uint8_t s );

/*!
 * \brief Sets text color
 *
 * \param color New text color
 */
void DisplaySetTextColor( DisplayColor_t color );

/*!
 * \brief Sets foreground and background color
 *
 * \param fg Foreground color
 * \param bg Background color
 */
void DisplaySetFgAndBg( DisplayColor_t fg, DisplayColor_t bg );

/*!
 * \brief Enables/Disable text wrapping
 *
 * \param w [true: wrap ON, false: wrap OFF]
 */
void DisplaySetTextWrap( bool w );

/*!
 * \brief Gets current display rotation
 *
 * \retval rotation   Display rotation (Vertical/Horizontal)
 */
uint8_t DisplayGetRotation( void );

/*!
 * \brief Sets current display rotation
 *
 * \param x   Display rotation (Vertical/Horizontal)
 */
void DisplaySetRotation( uint8_t x );

/*!
 * \brief Draws a pixel of color at coordinates (x,y)
 *
 * \param x     X coordinate
 * \param y     Y coordinate
 * \param color Pixel color
 */
void DisplayDrawPixel( int16_t x, int16_t y, DisplayColor_t color );

/*!
 * \brief Draws a line starting at coordinates (x0,y0) ending at
 *        coordinates (x1,y1) of color
 *
 * \param x0     X0 coordinate
 * \param y0     Y0 coordinate
 * \param x1     X1 coordinate
 * \param y1     Y1 coordinate
 * \param color  Line color
 */
void DisplayDrawLine( int16_t x0, int16_t y0, int16_t x1, int16_t y1, DisplayColor_t color );

/*!
 * \brief Draws a vertical line starting at coordinates (x,y) with given height
 *
 * \param x     X coordinate
 * \param y     Y coordinate
 * \param h     Line height
 * \param color Line color
 */
void DisplayDrawVerticalLine( int16_t x, int16_t y, int16_t h, DisplayColor_t color );

/*!
 * \brief Draws an Horizontal line starting at coordinates (x,y) with given width
 *
 * \param x     X coordinate
 * \param y     Y coordinate
 * \param w     Line width
 * \param color Line color
 */
void DisplayDrawHorizontalLine( int16_t x, int16_t y, int16_t w, DisplayColor_t color );

/*!
 * \brief Draws a rectangle at coordinates (x,y) with given width and height
 *
 * \param x     X coordinate
 * \param y     Y coordinate
 * \param w     Line width
 * \param h     Line height
 * \param color Line color
 */
void DisplayDrawRect( int16_t x, int16_t y, int16_t w, int16_t h, DisplayColor_t color );

/*!
 * \brief Draws a filled rectangle at coordinates (x,y) with given width and height
 *
 * \param x     X coordinate
 * \param y     Y coordinate
 * \param w     Line width
 * \param h     Line height
 * \param color Fill color
 */
void DisplayFillRect( int16_t x, int16_t y, int16_t w, int16_t h, DisplayColor_t color );

/*!
 * \brief Fills all display with pixels of color
 *
 * \param color Fill color
 */
void DisplayFillScreen( DisplayColor_t color );

/*!
 * \brief Draws a triangle by giving the 3 vertices coordinates
 *
 * \param x0    X0 coordinate
 * \param y0    Y0 coordinate
 * \param x1    X1 coordinate
 * \param y1    Y1 coordinate
 * \param x2    X2 coordinate
 * \param y2    Y2 coordinate
 * \param color Line color
 */
void DisplayDrawTriangle( int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2, int16_t y2, DisplayColor_t color );

/*!
 * \brief Draws a filled triangle by giving the 3 vertices coordinates
 *
 * \param x0    X0 coordinate
 * \param y0    Y0 coordinate
 * \param x1    X1 coordinate
 * \param y1    Y1 coordinate
 * \param x2    X2 coordinate
 * \param y2    Y2 coordinate
 * \param color Fill color
 */
void DisplayFillTriangle( int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2, int16_t y2, DisplayColor_t color ) ;

/*!
 * \brief Draws a character at given coordinates
 *
 * \param x     X coordinate
 * \param y     Y coordinate
 * \param c     Character
 * \param color Character color
 * \param bg    Background color
 * \param size  Character size
 */
void DisplayDrawChar( int16_t x, int16_t y, unsigned char c, DisplayColor_t color, DisplayColor_t bg, uint8_t size );

/*!
 * \brief Display putc function. (Mimics standard C putc function)
 *
 * \param c     Character
 */
void DisplayPutc( uint8_t c );

/*!
 * \brief Sets cursor at line
 *
 * \param line  Line number
 */
void DisplaySetLine( uint8_t line );

/*!
 * \brief Display print function. Prints the given string
 */
void DisplayPrint( const char *string );

/*!
 * \brief Display printf function. (Mimics standard C printf function)
 */
void DisplayPrintf( const char *format, ... );

#ifdef __cplusplus
}
#endif

#endif // __DISPLAY_BOARD_H__