/*
 * Copyright (c) 2021 Arm Limited. All rights reserved.
 * SPDX-License-Identifier: Apache-2.0
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
#ifndef GLCD_MPS3_H
#define GLCD_MPS3_H

#include <stdint.h>

/******************************************************************************
  Color coding
  GLCD is coded:   15..11 red, 10..5 green, 4..0 blue  (unsigned short)
                   GLCD_R5, GLCD_G6, GLCD_B5
  original coding: 17..12 red, 11..6 green, 5..0 blue
                   ORG_R6,  ORG_G6,  ORG_B6

  ORG_R1..5 = GLCD_R0..4,  ORG_R0 = GLCD_R4
  ORG_G0..5 = GLCD_G0..5,
  ORG_B1..5 = GLCD_B0..4,  ORG_B0 = GLCD_B4

  GLCD RGB color definitions
******************************************************************************/
#define Black           0x0000      /*   0,   0,   0 */
#define Navy            0x000F      /*   0,   0, 128 */
#define DarkGreen       0x03E0      /*   0, 128,   0 */
#define DarkCyan        0x03EF      /*   0, 128, 128 */
#define Maroon          0x7800      /* 128,   0,   0 */
#define Purple          0x780F      /* 128,   0, 128 */
#define Olive           0x7BE0      /* 128, 128,   0 */
#define LightGrey       0xC618      /* 192, 192, 192 */
#define DarkGrey        0x7BEF      /* 128, 128, 128 */
#define Blue            0x001F      /*   0,   0, 255 */
#define Green           0x07E0      /*   0, 255,   0 */
#define Cyan            0x07FF      /*   0, 255, 255 */
#define Red             0xF800      /* 255,   0,   0 */
#define Magenta         0xF81F      /* 255,   0, 255 */
#define Yellow          0xFFE0      /* 255, 255, 0   */
#define White           0xFFFF      /* 255, 255, 255 */

/************************** Orientation  configuration ************************/
#ifndef LANDSCAPE
#define LANDSCAPE   1               /* 1 for landscape, 0 for portrait.    */
#endif
#ifndef ROTATE180
#define ROTATE180   1               /* 1 to rotate the screen for 180 deg. */
#endif

/*------------------------- Speed dependant settings -------------------------*/

/* If processor works on high frequency delay has to be increased, it can be
   increased by factor 2^N by this constant. */
#define DELAY_2N    8

/*---------------------- Graphic LCD size definitions ------------------------*/
#if (LANDSCAPE == 1)
   #define GLCD_WIDTH       320                 /* Screen Width (in pixels). */
   #define GLCD_HEIGHT      240                 /* Screen Hight (in pixels). */
#else
   #define GLCD_WIDTH       240                 /* Screen Width (in pixels). */
   #define GLCD_HEIGHT      320                 /* Screen Hight (in pixels). */
#endif

#define BPP                 16                  /* Bits per pixel.           */
#define BYPP                ((BPP+7)/8)         /* Bytes per pixel.          */


/**
 * @brief      Initialize the Himax LCD with HX8347-D LCD Controller.
 */
void GLCD_Initialize(void);

/**
 * @brief      Set draw window region to whole screen.
 */
void GLCD_WindowMax(void);

/**
 * @brief      Set draw window region.
 * @param[in]  x  Horizontal position.
 * @param[in]  y  Vertical position.
 * @param[in]  w  Window width in pixel.
 * @param[in]  h  Window height in pixels.
 */
void GLCD_SetWindow(unsigned int x, unsigned int y,
                     unsigned int w, unsigned int h);

/**
 * @brief      Set foreground color.
 * @param[in]  color    Foreground color.
 */
void GLCD_SetTextColor(unsigned short color);

/**
 * @brief      Set background color.
 * @param[in]  color    Background color.
 */
void GLCD_SetBackColor(unsigned short color);

/**
 * @brief      Clear display.
 * @param[in]  color Display clearing color.
 *
 */
void GLCD_Clear(unsigned short color);

/**
 * @brief      Draw character on given position.
 * @param[in]  x     Horizontal position.
 * @param[in]  y     Vertical position.
 * @param[in]  cw    Character width in pixel.
 * @param[in]  ch    Character height in pixels.
 * @param[in]  c     Pointer to character bitmap.
 *
 */
void GLCD_DrawChar(unsigned int x,  unsigned int y,
                  unsigned int cw, unsigned int ch,
                  unsigned char *c);

/**
 * @brief      Display character on given line.
 * @param[in]  ln    Line number.
 * @param[in]  col   Column number.
 * @param[in]  fi    Font index (0 = 9x15).
 * @param[in]  c     ASCII character.
 */
void GLCD_DisplayChar(unsigned int ln, unsigned int col,
                     unsigned char fi, unsigned char  c);


/**
 * @brief      Display string on given line.
 * @param[in]  ln    Line number.
 * @param[in]  col   Column number.
 * @param[in]  fi    Font index (0 = 9x15).
 * @param[in]  s     Pointer to string.
 */
void GLCD_DisplayString(unsigned int ln, unsigned int col,
                        unsigned char fi, char *s);

/**
 * @brief      Clear given line.
 * @param[in]  ln:   Line number.
 * @param[in]  fi    Font index (0 = 9x15).
 */
void GLCD_ClearLn(unsigned int ln, unsigned char fi);

/**
 * @brief      Display graphical bitmap image at position x horizontally and y
 *             vertically. This function is optimized for 16 bits per pixel
 *             format, it has to be adapted for any other format.
 * @param[in]  x        Horizontal position.
 * @param[in]  y        Vertical position.
 * @param[in]  w        Width of bitmap.
 * @param[in]  h        Height of bitmap.
 * @param[in]  bitmap   Address at which the bitmap data resides.
 */
void GLCD_Bitmap(unsigned int x,  unsigned int y,
               unsigned int w, unsigned int h,
               unsigned short *bitmap);

/**
 * @brief Displays an 8 bit image, conversion to the LCD's
 *        16 bit codec is done on the fly.
 * @param[in]  data                 Pointer to the full sized image data.
 * @param[in]  width                Image width.
 * @param[in]  height               Image height.
 * @param[in]  channels             Number of channels in the image.
 * @param[in]  pos_x                Start x position for the LCD.
 * @param[in]  pos_y                Start y position for the LCD.
 * @param[in]  downsample_factor    Factor by which the image
 *                                  is downsampled by.
 */
void GLCD_Image(void *data, const uint32_t width,
               const uint32_t height, const uint32_t channels,
               const uint32_t pos_x, const uint32_t pos_y,
               const uint32_t downsample_factor);

/**
 * @brief      Draw box filled with color.
 * @param[in]  x        Horizontal position.
 * @param[in]  y        Vertical position.
 * @param[in]  w        Window width in pixels.
 * @param[in]  h        Window height in pixels.
 * @param[in]  color    Box color.
 */
void GLCD_Box(unsigned int x, unsigned int y,
            unsigned int w, unsigned int h,
            unsigned short color);

#endif /* GLCD_MPS3_H */
