/*
 * Copyright (c) 2021-2022 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(const 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 */
