First project for DISCO_F746NG board

Dependents:   DISCO-F746NG_rtos_test EmbedSDE

Committer:
TuxLeon
Date:
Sun Feb 11 18:33:41 2018 +0000
Revision:
0:99b5a7505a7a
first commit;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
TuxLeon 0:99b5a7505a7a 1 /**
TuxLeon 0:99b5a7505a7a 2 ******************************************************************************
TuxLeon 0:99b5a7505a7a 3 * @file stm32746g_discovery_lcd.c
TuxLeon 0:99b5a7505a7a 4 * @author MCD Application Team
TuxLeon 0:99b5a7505a7a 5 * @version V1.0.0
TuxLeon 0:99b5a7505a7a 6 * @date 25-June-2015
TuxLeon 0:99b5a7505a7a 7 * @brief This file includes the driver for Liquid Crystal Display (LCD) module
TuxLeon 0:99b5a7505a7a 8 * mounted on STM32746G-Discovery board.
TuxLeon 0:99b5a7505a7a 9 @verbatim
TuxLeon 0:99b5a7505a7a 10 1. How To use this driver:
TuxLeon 0:99b5a7505a7a 11 --------------------------
TuxLeon 0:99b5a7505a7a 12 - This driver is used to drive directly an LCD TFT using the LTDC controller.
TuxLeon 0:99b5a7505a7a 13 - This driver uses timing and setting for RK043FN48H LCD.
TuxLeon 0:99b5a7505a7a 14
TuxLeon 0:99b5a7505a7a 15 2. Driver description:
TuxLeon 0:99b5a7505a7a 16 ---------------------
TuxLeon 0:99b5a7505a7a 17 + Initialization steps:
TuxLeon 0:99b5a7505a7a 18 o Initialize the LCD using the BSP_LCD_Init() function.
TuxLeon 0:99b5a7505a7a 19 o Apply the Layer configuration using the BSP_LCD_LayerDefaultInit() function.
TuxLeon 0:99b5a7505a7a 20 o Select the LCD layer to be used using the BSP_LCD_SelectLayer() function.
TuxLeon 0:99b5a7505a7a 21 o Enable the LCD display using the BSP_LCD_DisplayOn() function.
TuxLeon 0:99b5a7505a7a 22
TuxLeon 0:99b5a7505a7a 23 + Options
TuxLeon 0:99b5a7505a7a 24 o Configure and enable the color keying functionality using the
TuxLeon 0:99b5a7505a7a 25 BSP_LCD_SetColorKeying() function.
TuxLeon 0:99b5a7505a7a 26 o Modify in the fly the transparency and/or the frame buffer address
TuxLeon 0:99b5a7505a7a 27 using the following functions:
TuxLeon 0:99b5a7505a7a 28 - BSP_LCD_SetTransparency()
TuxLeon 0:99b5a7505a7a 29 - BSP_LCD_SetLayerAddress()
TuxLeon 0:99b5a7505a7a 30
TuxLeon 0:99b5a7505a7a 31 + Display on LCD
TuxLeon 0:99b5a7505a7a 32 o Clear the hole LCD using BSP_LCD_Clear() function or only one specified string
TuxLeon 0:99b5a7505a7a 33 line using the BSP_LCD_ClearStringLine() function.
TuxLeon 0:99b5a7505a7a 34 o Display a character on the specified line and column using the BSP_LCD_DisplayChar()
TuxLeon 0:99b5a7505a7a 35 function or a complete string line using the BSP_LCD_DisplayStringAtLine() function.
TuxLeon 0:99b5a7505a7a 36 o Display a string line on the specified position (x,y in pixel) and align mode
TuxLeon 0:99b5a7505a7a 37 using the BSP_LCD_DisplayStringAtLine() function.
TuxLeon 0:99b5a7505a7a 38 o Draw and fill a basic shapes (dot, line, rectangle, circle, ellipse, .. bitmap)
TuxLeon 0:99b5a7505a7a 39 on LCD using the available set of functions.
TuxLeon 0:99b5a7505a7a 40 @endverbatim
TuxLeon 0:99b5a7505a7a 41 ******************************************************************************
TuxLeon 0:99b5a7505a7a 42 * @attention
TuxLeon 0:99b5a7505a7a 43 *
TuxLeon 0:99b5a7505a7a 44 * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
TuxLeon 0:99b5a7505a7a 45 *
TuxLeon 0:99b5a7505a7a 46 * Redistribution and use in source and binary forms, with or without modification,
TuxLeon 0:99b5a7505a7a 47 * are permitted provided that the following conditions are met:
TuxLeon 0:99b5a7505a7a 48 * 1. Redistributions of source code must retain the above copyright notice,
TuxLeon 0:99b5a7505a7a 49 * this list of conditions and the following disclaimer.
TuxLeon 0:99b5a7505a7a 50 * 2. Redistributions in binary form must reproduce the above copyright notice,
TuxLeon 0:99b5a7505a7a 51 * this list of conditions and the following disclaimer in the documentation
TuxLeon 0:99b5a7505a7a 52 * and/or other materials provided with the distribution.
TuxLeon 0:99b5a7505a7a 53 * 3. Neither the name of STMicroelectronics nor the names of its contributors
TuxLeon 0:99b5a7505a7a 54 * may be used to endorse or promote products derived from this software
TuxLeon 0:99b5a7505a7a 55 * without specific prior written permission.
TuxLeon 0:99b5a7505a7a 56 *
TuxLeon 0:99b5a7505a7a 57 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
TuxLeon 0:99b5a7505a7a 58 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
TuxLeon 0:99b5a7505a7a 59 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
TuxLeon 0:99b5a7505a7a 60 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
TuxLeon 0:99b5a7505a7a 61 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
TuxLeon 0:99b5a7505a7a 62 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
TuxLeon 0:99b5a7505a7a 63 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
TuxLeon 0:99b5a7505a7a 64 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
TuxLeon 0:99b5a7505a7a 65 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
TuxLeon 0:99b5a7505a7a 66 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
TuxLeon 0:99b5a7505a7a 67 *
TuxLeon 0:99b5a7505a7a 68 ******************************************************************************
TuxLeon 0:99b5a7505a7a 69 */
TuxLeon 0:99b5a7505a7a 70
TuxLeon 0:99b5a7505a7a 71 /* Includes ------------------------------------------------------------------*/
TuxLeon 0:99b5a7505a7a 72 #include "stm32746g_discovery_lcd.h"
TuxLeon 0:99b5a7505a7a 73 #include "fonts.h"
TuxLeon 0:99b5a7505a7a 74 /*
TuxLeon 0:99b5a7505a7a 75 #include "font24.c"
TuxLeon 0:99b5a7505a7a 76 #include "font20.c"
TuxLeon 0:99b5a7505a7a 77 #include "font16.c"
TuxLeon 0:99b5a7505a7a 78 #include "font12.c"
TuxLeon 0:99b5a7505a7a 79 #include "font8.c"
TuxLeon 0:99b5a7505a7a 80 */
TuxLeon 0:99b5a7505a7a 81
TuxLeon 0:99b5a7505a7a 82 /** @addtogroup BSP
TuxLeon 0:99b5a7505a7a 83 * @{
TuxLeon 0:99b5a7505a7a 84 */
TuxLeon 0:99b5a7505a7a 85
TuxLeon 0:99b5a7505a7a 86 /** @addtogroup STM32746G_DISCOVERY
TuxLeon 0:99b5a7505a7a 87 * @{
TuxLeon 0:99b5a7505a7a 88 */
TuxLeon 0:99b5a7505a7a 89
TuxLeon 0:99b5a7505a7a 90 /** @addtogroup STM32746G_DISCOVERY_LCD
TuxLeon 0:99b5a7505a7a 91 * @{
TuxLeon 0:99b5a7505a7a 92 */
TuxLeon 0:99b5a7505a7a 93
TuxLeon 0:99b5a7505a7a 94 /** @defgroup STM32746G_DISCOVERY_LCD_Private_TypesDefinitions STM32746G_DISCOVERY_LCD Private Types Definitions
TuxLeon 0:99b5a7505a7a 95 * @{
TuxLeon 0:99b5a7505a7a 96 */
TuxLeon 0:99b5a7505a7a 97 /**
TuxLeon 0:99b5a7505a7a 98 * @}
TuxLeon 0:99b5a7505a7a 99 */
TuxLeon 0:99b5a7505a7a 100
TuxLeon 0:99b5a7505a7a 101 /** @defgroup STM32746G_DISCOVERY_LCD_Private_Defines STM32746G_DISCOVERY LCD Private Defines
TuxLeon 0:99b5a7505a7a 102 * @{
TuxLeon 0:99b5a7505a7a 103 */
TuxLeon 0:99b5a7505a7a 104 #define POLY_X(Z) ((int32_t)((Points + Z)->X))
TuxLeon 0:99b5a7505a7a 105 #define POLY_Y(Z) ((int32_t)((Points + Z)->Y))
TuxLeon 0:99b5a7505a7a 106 /**
TuxLeon 0:99b5a7505a7a 107 * @}
TuxLeon 0:99b5a7505a7a 108 */
TuxLeon 0:99b5a7505a7a 109
TuxLeon 0:99b5a7505a7a 110 /** @defgroup STM32746G_DISCOVERY_LCD_Private_Macros STM32746G_DISCOVERY_LCD Private Macros
TuxLeon 0:99b5a7505a7a 111 * @{
TuxLeon 0:99b5a7505a7a 112 */
TuxLeon 0:99b5a7505a7a 113 #define ABS(X) ((X) > 0 ? (X) : -(X))
TuxLeon 0:99b5a7505a7a 114 /**
TuxLeon 0:99b5a7505a7a 115 * @}
TuxLeon 0:99b5a7505a7a 116 */
TuxLeon 0:99b5a7505a7a 117
TuxLeon 0:99b5a7505a7a 118 /** @defgroup STM32746G_DISCOVERY_LCD_Private_Variables STM32746G_DISCOVERY_LCD Private Variables
TuxLeon 0:99b5a7505a7a 119 * @{
TuxLeon 0:99b5a7505a7a 120 */
TuxLeon 0:99b5a7505a7a 121 static LTDC_HandleTypeDef hLtdcHandler;
TuxLeon 0:99b5a7505a7a 122 static DMA2D_HandleTypeDef hDma2dHandler;
TuxLeon 0:99b5a7505a7a 123
TuxLeon 0:99b5a7505a7a 124 /* Default LCD configuration with LCD Layer 1 */
TuxLeon 0:99b5a7505a7a 125 static uint32_t ActiveLayer = 0;
TuxLeon 0:99b5a7505a7a 126 static LCD_DrawPropTypeDef DrawProp[MAX_LAYER_NUMBER];
TuxLeon 0:99b5a7505a7a 127 /**
TuxLeon 0:99b5a7505a7a 128 * @}
TuxLeon 0:99b5a7505a7a 129 */
TuxLeon 0:99b5a7505a7a 130
TuxLeon 0:99b5a7505a7a 131 /** @defgroup STM32746G_DISCOVERY_LCD_Private_FunctionPrototypes STM32746G_DISCOVERY_LCD Private Function Prototypes
TuxLeon 0:99b5a7505a7a 132 * @{
TuxLeon 0:99b5a7505a7a 133 */
TuxLeon 0:99b5a7505a7a 134 static void DrawChar(uint16_t Xpos, uint16_t Ypos, const uint8_t *c);
TuxLeon 0:99b5a7505a7a 135 static void FillTriangle(uint16_t x1, uint16_t x2, uint16_t x3, uint16_t y1, uint16_t y2, uint16_t y3);
TuxLeon 0:99b5a7505a7a 136 static void LL_FillBuffer(uint32_t LayerIndex, void *pDst, uint32_t xSize, uint32_t ySize, uint32_t OffLine, uint32_t ColorIndex);
TuxLeon 0:99b5a7505a7a 137 static void LL_ConvertLineToARGB8888(void * pSrc, void *pDst, uint32_t xSize, uint32_t ColorMode);
TuxLeon 0:99b5a7505a7a 138 /**
TuxLeon 0:99b5a7505a7a 139 * @}
TuxLeon 0:99b5a7505a7a 140 */
TuxLeon 0:99b5a7505a7a 141
TuxLeon 0:99b5a7505a7a 142 /** @defgroup STM32746G_DISCOVERY_LCD_Exported_Functions STM32746G_DISCOVERY_LCD Exported Functions
TuxLeon 0:99b5a7505a7a 143 * @{
TuxLeon 0:99b5a7505a7a 144 */
TuxLeon 0:99b5a7505a7a 145
TuxLeon 0:99b5a7505a7a 146 /**
TuxLeon 0:99b5a7505a7a 147 * @brief Initializes the LCD.
TuxLeon 0:99b5a7505a7a 148 * @retval LCD state
TuxLeon 0:99b5a7505a7a 149 */
TuxLeon 0:99b5a7505a7a 150 uint8_t BSP_LCD_Init(void)
TuxLeon 0:99b5a7505a7a 151 {
TuxLeon 0:99b5a7505a7a 152 /* Select the used LCD */
TuxLeon 0:99b5a7505a7a 153
TuxLeon 0:99b5a7505a7a 154 /* The RK043FN48H LCD 480x272 is selected */
TuxLeon 0:99b5a7505a7a 155 /* Timing Configuration */
TuxLeon 0:99b5a7505a7a 156 hLtdcHandler.Init.HorizontalSync = (RK043FN48H_HSYNC - 1);
TuxLeon 0:99b5a7505a7a 157 hLtdcHandler.Init.VerticalSync = (RK043FN48H_VSYNC - 1);
TuxLeon 0:99b5a7505a7a 158 hLtdcHandler.Init.AccumulatedHBP = (RK043FN48H_HSYNC + RK043FN48H_HBP - 1);
TuxLeon 0:99b5a7505a7a 159 hLtdcHandler.Init.AccumulatedVBP = (RK043FN48H_VSYNC + RK043FN48H_VBP - 1);
TuxLeon 0:99b5a7505a7a 160 hLtdcHandler.Init.AccumulatedActiveH = (RK043FN48H_HEIGHT + RK043FN48H_VSYNC + RK043FN48H_VBP - 1);
TuxLeon 0:99b5a7505a7a 161 hLtdcHandler.Init.AccumulatedActiveW = (RK043FN48H_WIDTH + RK043FN48H_HSYNC + RK043FN48H_HBP - 1);
TuxLeon 0:99b5a7505a7a 162 hLtdcHandler.Init.TotalHeigh = (RK043FN48H_HEIGHT + RK043FN48H_VSYNC + RK043FN48H_VBP + RK043FN48H_VFP - 1);
TuxLeon 0:99b5a7505a7a 163 hLtdcHandler.Init.TotalWidth = (RK043FN48H_WIDTH + RK043FN48H_HSYNC + RK043FN48H_HBP + RK043FN48H_HFP - 1);
TuxLeon 0:99b5a7505a7a 164
TuxLeon 0:99b5a7505a7a 165 /* LCD clock configuration */
TuxLeon 0:99b5a7505a7a 166 BSP_LCD_ClockConfig(&hLtdcHandler, NULL);
TuxLeon 0:99b5a7505a7a 167
TuxLeon 0:99b5a7505a7a 168 /* Initialize the LCD pixel width and pixel height */
TuxLeon 0:99b5a7505a7a 169 hLtdcHandler.LayerCfg->ImageWidth = RK043FN48H_WIDTH;
TuxLeon 0:99b5a7505a7a 170 hLtdcHandler.LayerCfg->ImageHeight = RK043FN48H_HEIGHT;
TuxLeon 0:99b5a7505a7a 171
TuxLeon 0:99b5a7505a7a 172 /* Background value */
TuxLeon 0:99b5a7505a7a 173 hLtdcHandler.Init.Backcolor.Blue = 0;
TuxLeon 0:99b5a7505a7a 174 hLtdcHandler.Init.Backcolor.Green = 0;
TuxLeon 0:99b5a7505a7a 175 hLtdcHandler.Init.Backcolor.Red = 0;
TuxLeon 0:99b5a7505a7a 176
TuxLeon 0:99b5a7505a7a 177 /* Polarity */
TuxLeon 0:99b5a7505a7a 178 hLtdcHandler.Init.HSPolarity = LTDC_HSPOLARITY_AL;
TuxLeon 0:99b5a7505a7a 179 hLtdcHandler.Init.VSPolarity = LTDC_VSPOLARITY_AL;
TuxLeon 0:99b5a7505a7a 180 hLtdcHandler.Init.DEPolarity = LTDC_DEPOLARITY_AL;
TuxLeon 0:99b5a7505a7a 181 hLtdcHandler.Init.PCPolarity = LTDC_PCPOLARITY_IPC;
TuxLeon 0:99b5a7505a7a 182 hLtdcHandler.Instance = LTDC;
TuxLeon 0:99b5a7505a7a 183
TuxLeon 0:99b5a7505a7a 184 if(HAL_LTDC_GetState(&hLtdcHandler) == HAL_LTDC_STATE_RESET)
TuxLeon 0:99b5a7505a7a 185 {
TuxLeon 0:99b5a7505a7a 186 /* Initialize the LCD Msp: this __weak function can be rewritten by the application */
TuxLeon 0:99b5a7505a7a 187 BSP_LCD_MspInit(&hLtdcHandler, NULL);
TuxLeon 0:99b5a7505a7a 188 }
TuxLeon 0:99b5a7505a7a 189 HAL_LTDC_Init(&hLtdcHandler);
TuxLeon 0:99b5a7505a7a 190
TuxLeon 0:99b5a7505a7a 191 /* Assert display enable LCD_DISP pin */
TuxLeon 0:99b5a7505a7a 192 HAL_GPIO_WritePin(LCD_DISP_GPIO_PORT, LCD_DISP_PIN, GPIO_PIN_SET);
TuxLeon 0:99b5a7505a7a 193
TuxLeon 0:99b5a7505a7a 194 /* Assert backlight LCD_BL_CTRL pin */
TuxLeon 0:99b5a7505a7a 195 HAL_GPIO_WritePin(LCD_BL_CTRL_GPIO_PORT, LCD_BL_CTRL_PIN, GPIO_PIN_SET);
TuxLeon 0:99b5a7505a7a 196
TuxLeon 0:99b5a7505a7a 197 #if !defined(DATA_IN_ExtSDRAM)
TuxLeon 0:99b5a7505a7a 198 /* Initialize the SDRAM */
TuxLeon 0:99b5a7505a7a 199 BSP_SDRAM_Init();
TuxLeon 0:99b5a7505a7a 200 #endif
TuxLeon 0:99b5a7505a7a 201
TuxLeon 0:99b5a7505a7a 202 /* Initialize the font */
TuxLeon 0:99b5a7505a7a 203 BSP_LCD_SetFont(&LCD_DEFAULT_FONT);
TuxLeon 0:99b5a7505a7a 204
TuxLeon 0:99b5a7505a7a 205 return LCD_OK;
TuxLeon 0:99b5a7505a7a 206 }
TuxLeon 0:99b5a7505a7a 207
TuxLeon 0:99b5a7505a7a 208 /**
TuxLeon 0:99b5a7505a7a 209 * @brief DeInitializes the LCD.
TuxLeon 0:99b5a7505a7a 210 * @retval LCD state
TuxLeon 0:99b5a7505a7a 211 */
TuxLeon 0:99b5a7505a7a 212 uint8_t BSP_LCD_DeInit(void)
TuxLeon 0:99b5a7505a7a 213 {
TuxLeon 0:99b5a7505a7a 214 /* Initialize the hLtdcHandler Instance parameter */
TuxLeon 0:99b5a7505a7a 215 hLtdcHandler.Instance = LTDC;
TuxLeon 0:99b5a7505a7a 216
TuxLeon 0:99b5a7505a7a 217 /* Disable LTDC block */
TuxLeon 0:99b5a7505a7a 218 __HAL_LTDC_DISABLE(&hLtdcHandler);
TuxLeon 0:99b5a7505a7a 219
TuxLeon 0:99b5a7505a7a 220 /* DeInit the LTDC */
TuxLeon 0:99b5a7505a7a 221 HAL_LTDC_DeInit(&hLtdcHandler);
TuxLeon 0:99b5a7505a7a 222
TuxLeon 0:99b5a7505a7a 223 /* DeInit the LTDC MSP : this __weak function can be rewritten by the application */
TuxLeon 0:99b5a7505a7a 224 BSP_LCD_MspDeInit(&hLtdcHandler, NULL);
TuxLeon 0:99b5a7505a7a 225
TuxLeon 0:99b5a7505a7a 226 return LCD_OK;
TuxLeon 0:99b5a7505a7a 227 }
TuxLeon 0:99b5a7505a7a 228
TuxLeon 0:99b5a7505a7a 229 /**
TuxLeon 0:99b5a7505a7a 230 * @brief Gets the LCD X size.
TuxLeon 0:99b5a7505a7a 231 * @retval Used LCD X size
TuxLeon 0:99b5a7505a7a 232 */
TuxLeon 0:99b5a7505a7a 233 uint32_t BSP_LCD_GetXSize(void)
TuxLeon 0:99b5a7505a7a 234 {
TuxLeon 0:99b5a7505a7a 235 return hLtdcHandler.LayerCfg[ActiveLayer].ImageWidth;
TuxLeon 0:99b5a7505a7a 236 }
TuxLeon 0:99b5a7505a7a 237
TuxLeon 0:99b5a7505a7a 238 /**
TuxLeon 0:99b5a7505a7a 239 * @brief Gets the LCD Y size.
TuxLeon 0:99b5a7505a7a 240 * @retval Used LCD Y size
TuxLeon 0:99b5a7505a7a 241 */
TuxLeon 0:99b5a7505a7a 242 uint32_t BSP_LCD_GetYSize(void)
TuxLeon 0:99b5a7505a7a 243 {
TuxLeon 0:99b5a7505a7a 244 return hLtdcHandler.LayerCfg[ActiveLayer].ImageHeight;
TuxLeon 0:99b5a7505a7a 245 }
TuxLeon 0:99b5a7505a7a 246
TuxLeon 0:99b5a7505a7a 247 /**
TuxLeon 0:99b5a7505a7a 248 * @brief Set the LCD X size.
TuxLeon 0:99b5a7505a7a 249 * @param imageWidthPixels : image width in pixels unit
TuxLeon 0:99b5a7505a7a 250 * @retval None
TuxLeon 0:99b5a7505a7a 251 */
TuxLeon 0:99b5a7505a7a 252 void BSP_LCD_SetXSize(uint32_t imageWidthPixels)
TuxLeon 0:99b5a7505a7a 253 {
TuxLeon 0:99b5a7505a7a 254 hLtdcHandler.LayerCfg[ActiveLayer].ImageWidth = imageWidthPixels;
TuxLeon 0:99b5a7505a7a 255 }
TuxLeon 0:99b5a7505a7a 256
TuxLeon 0:99b5a7505a7a 257 /**
TuxLeon 0:99b5a7505a7a 258 * @brief Set the LCD Y size.
TuxLeon 0:99b5a7505a7a 259 * @param imageHeightPixels : image height in lines unit
TuxLeon 0:99b5a7505a7a 260 * @retval None
TuxLeon 0:99b5a7505a7a 261 */
TuxLeon 0:99b5a7505a7a 262 void BSP_LCD_SetYSize(uint32_t imageHeightPixels)
TuxLeon 0:99b5a7505a7a 263 {
TuxLeon 0:99b5a7505a7a 264 hLtdcHandler.LayerCfg[ActiveLayer].ImageHeight = imageHeightPixels;
TuxLeon 0:99b5a7505a7a 265 }
TuxLeon 0:99b5a7505a7a 266
TuxLeon 0:99b5a7505a7a 267 /**
TuxLeon 0:99b5a7505a7a 268 * @brief Initializes the LCD layer in ARGB8888 format (32 bits per pixel).
TuxLeon 0:99b5a7505a7a 269 * @param LayerIndex: Layer foreground or background
TuxLeon 0:99b5a7505a7a 270 * @param FB_Address: Layer frame buffer
TuxLeon 0:99b5a7505a7a 271 * @retval None
TuxLeon 0:99b5a7505a7a 272 */
TuxLeon 0:99b5a7505a7a 273 void BSP_LCD_LayerDefaultInit(uint16_t LayerIndex, uint32_t FB_Address)
TuxLeon 0:99b5a7505a7a 274 {
TuxLeon 0:99b5a7505a7a 275 LCD_LayerCfgTypeDef layer_cfg;
TuxLeon 0:99b5a7505a7a 276
TuxLeon 0:99b5a7505a7a 277 /* Layer Init */
TuxLeon 0:99b5a7505a7a 278 layer_cfg.WindowX0 = 0;
TuxLeon 0:99b5a7505a7a 279 layer_cfg.WindowX1 = BSP_LCD_GetXSize();
TuxLeon 0:99b5a7505a7a 280 layer_cfg.WindowY0 = 0;
TuxLeon 0:99b5a7505a7a 281 layer_cfg.WindowY1 = BSP_LCD_GetYSize();
TuxLeon 0:99b5a7505a7a 282 layer_cfg.PixelFormat = LTDC_PIXEL_FORMAT_ARGB8888;
TuxLeon 0:99b5a7505a7a 283 layer_cfg.FBStartAdress = FB_Address;
TuxLeon 0:99b5a7505a7a 284 layer_cfg.Alpha = 255;
TuxLeon 0:99b5a7505a7a 285 layer_cfg.Alpha0 = 0;
TuxLeon 0:99b5a7505a7a 286 layer_cfg.Backcolor.Blue = 0;
TuxLeon 0:99b5a7505a7a 287 layer_cfg.Backcolor.Green = 0;
TuxLeon 0:99b5a7505a7a 288 layer_cfg.Backcolor.Red = 0;
TuxLeon 0:99b5a7505a7a 289 layer_cfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_PAxCA;
TuxLeon 0:99b5a7505a7a 290 layer_cfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_PAxCA;
TuxLeon 0:99b5a7505a7a 291 layer_cfg.ImageWidth = BSP_LCD_GetXSize();
TuxLeon 0:99b5a7505a7a 292 layer_cfg.ImageHeight = BSP_LCD_GetYSize();
TuxLeon 0:99b5a7505a7a 293
TuxLeon 0:99b5a7505a7a 294 HAL_LTDC_ConfigLayer(&hLtdcHandler, &layer_cfg, LayerIndex);
TuxLeon 0:99b5a7505a7a 295
TuxLeon 0:99b5a7505a7a 296 DrawProp[LayerIndex].BackColor = LCD_COLOR_WHITE;
TuxLeon 0:99b5a7505a7a 297 DrawProp[LayerIndex].pFont = &Font24;
TuxLeon 0:99b5a7505a7a 298 DrawProp[LayerIndex].TextColor = LCD_COLOR_BLACK;
TuxLeon 0:99b5a7505a7a 299 }
TuxLeon 0:99b5a7505a7a 300
TuxLeon 0:99b5a7505a7a 301 /**
TuxLeon 0:99b5a7505a7a 302 * @brief Initializes the LCD layer in RGB565 format (16 bits per pixel).
TuxLeon 0:99b5a7505a7a 303 * @param LayerIndex: Layer foreground or background
TuxLeon 0:99b5a7505a7a 304 * @param FB_Address: Layer frame buffer
TuxLeon 0:99b5a7505a7a 305 * @retval None
TuxLeon 0:99b5a7505a7a 306 */
TuxLeon 0:99b5a7505a7a 307 void BSP_LCD_LayerRgb565Init(uint16_t LayerIndex, uint32_t FB_Address)
TuxLeon 0:99b5a7505a7a 308 {
TuxLeon 0:99b5a7505a7a 309 LCD_LayerCfgTypeDef layer_cfg;
TuxLeon 0:99b5a7505a7a 310
TuxLeon 0:99b5a7505a7a 311 /* Layer Init */
TuxLeon 0:99b5a7505a7a 312 layer_cfg.WindowX0 = 0;
TuxLeon 0:99b5a7505a7a 313 layer_cfg.WindowX1 = BSP_LCD_GetXSize();
TuxLeon 0:99b5a7505a7a 314 layer_cfg.WindowY0 = 0;
TuxLeon 0:99b5a7505a7a 315 layer_cfg.WindowY1 = BSP_LCD_GetYSize();
TuxLeon 0:99b5a7505a7a 316 layer_cfg.PixelFormat = LTDC_PIXEL_FORMAT_RGB565;
TuxLeon 0:99b5a7505a7a 317 layer_cfg.FBStartAdress = FB_Address;
TuxLeon 0:99b5a7505a7a 318 layer_cfg.Alpha = 255;
TuxLeon 0:99b5a7505a7a 319 layer_cfg.Alpha0 = 0;
TuxLeon 0:99b5a7505a7a 320 layer_cfg.Backcolor.Blue = 0;
TuxLeon 0:99b5a7505a7a 321 layer_cfg.Backcolor.Green = 0;
TuxLeon 0:99b5a7505a7a 322 layer_cfg.Backcolor.Red = 0;
TuxLeon 0:99b5a7505a7a 323 layer_cfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_PAxCA;
TuxLeon 0:99b5a7505a7a 324 layer_cfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_PAxCA;
TuxLeon 0:99b5a7505a7a 325 layer_cfg.ImageWidth = BSP_LCD_GetXSize();
TuxLeon 0:99b5a7505a7a 326 layer_cfg.ImageHeight = BSP_LCD_GetYSize();
TuxLeon 0:99b5a7505a7a 327
TuxLeon 0:99b5a7505a7a 328 HAL_LTDC_ConfigLayer(&hLtdcHandler, &layer_cfg, LayerIndex);
TuxLeon 0:99b5a7505a7a 329
TuxLeon 0:99b5a7505a7a 330 DrawProp[LayerIndex].BackColor = LCD_COLOR_WHITE;
TuxLeon 0:99b5a7505a7a 331 DrawProp[LayerIndex].pFont = &Font24;
TuxLeon 0:99b5a7505a7a 332 DrawProp[LayerIndex].TextColor = LCD_COLOR_BLACK;
TuxLeon 0:99b5a7505a7a 333 }
TuxLeon 0:99b5a7505a7a 334
TuxLeon 0:99b5a7505a7a 335 /**
TuxLeon 0:99b5a7505a7a 336 * @brief Selects the LCD Layer.
TuxLeon 0:99b5a7505a7a 337 * @param LayerIndex: Layer foreground or background
TuxLeon 0:99b5a7505a7a 338 * @retval None
TuxLeon 0:99b5a7505a7a 339 */
TuxLeon 0:99b5a7505a7a 340 void BSP_LCD_SelectLayer(uint32_t LayerIndex)
TuxLeon 0:99b5a7505a7a 341 {
TuxLeon 0:99b5a7505a7a 342 ActiveLayer = LayerIndex;
TuxLeon 0:99b5a7505a7a 343 }
TuxLeon 0:99b5a7505a7a 344
TuxLeon 0:99b5a7505a7a 345 /**
TuxLeon 0:99b5a7505a7a 346 * @brief Sets an LCD Layer visible
TuxLeon 0:99b5a7505a7a 347 * @param LayerIndex: Visible Layer
TuxLeon 0:99b5a7505a7a 348 * @param State: New state of the specified layer
TuxLeon 0:99b5a7505a7a 349 * This parameter can be one of the following values:
TuxLeon 0:99b5a7505a7a 350 * @arg ENABLE
TuxLeon 0:99b5a7505a7a 351 * @arg DISABLE
TuxLeon 0:99b5a7505a7a 352 * @retval None
TuxLeon 0:99b5a7505a7a 353 */
TuxLeon 0:99b5a7505a7a 354 void BSP_LCD_SetLayerVisible(uint32_t LayerIndex, FunctionalState State)
TuxLeon 0:99b5a7505a7a 355 {
TuxLeon 0:99b5a7505a7a 356 if(State == ENABLE)
TuxLeon 0:99b5a7505a7a 357 {
TuxLeon 0:99b5a7505a7a 358 __HAL_LTDC_LAYER_ENABLE(&hLtdcHandler, LayerIndex);
TuxLeon 0:99b5a7505a7a 359 }
TuxLeon 0:99b5a7505a7a 360 else
TuxLeon 0:99b5a7505a7a 361 {
TuxLeon 0:99b5a7505a7a 362 __HAL_LTDC_LAYER_DISABLE(&hLtdcHandler, LayerIndex);
TuxLeon 0:99b5a7505a7a 363 }
TuxLeon 0:99b5a7505a7a 364 __HAL_LTDC_RELOAD_CONFIG(&hLtdcHandler);
TuxLeon 0:99b5a7505a7a 365 }
TuxLeon 0:99b5a7505a7a 366
TuxLeon 0:99b5a7505a7a 367 /**
TuxLeon 0:99b5a7505a7a 368 * @brief Configures the transparency.
TuxLeon 0:99b5a7505a7a 369 * @param LayerIndex: Layer foreground or background.
TuxLeon 0:99b5a7505a7a 370 * @param Transparency: Transparency
TuxLeon 0:99b5a7505a7a 371 * This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF
TuxLeon 0:99b5a7505a7a 372 * @retval None
TuxLeon 0:99b5a7505a7a 373 */
TuxLeon 0:99b5a7505a7a 374 void BSP_LCD_SetTransparency(uint32_t LayerIndex, uint8_t Transparency)
TuxLeon 0:99b5a7505a7a 375 {
TuxLeon 0:99b5a7505a7a 376 HAL_LTDC_SetAlpha(&hLtdcHandler, Transparency, LayerIndex);
TuxLeon 0:99b5a7505a7a 377 }
TuxLeon 0:99b5a7505a7a 378
TuxLeon 0:99b5a7505a7a 379 /**
TuxLeon 0:99b5a7505a7a 380 * @brief Sets an LCD layer frame buffer address.
TuxLeon 0:99b5a7505a7a 381 * @param LayerIndex: Layer foreground or background
TuxLeon 0:99b5a7505a7a 382 * @param Address: New LCD frame buffer value
TuxLeon 0:99b5a7505a7a 383 * @retval None
TuxLeon 0:99b5a7505a7a 384 */
TuxLeon 0:99b5a7505a7a 385 void BSP_LCD_SetLayerAddress(uint32_t LayerIndex, uint32_t Address)
TuxLeon 0:99b5a7505a7a 386 {
TuxLeon 0:99b5a7505a7a 387 HAL_LTDC_SetAddress(&hLtdcHandler, Address, LayerIndex);
TuxLeon 0:99b5a7505a7a 388 }
TuxLeon 0:99b5a7505a7a 389
TuxLeon 0:99b5a7505a7a 390 /**
TuxLeon 0:99b5a7505a7a 391 * @brief Sets display window.
TuxLeon 0:99b5a7505a7a 392 * @param LayerIndex: Layer index
TuxLeon 0:99b5a7505a7a 393 * @param Xpos: LCD X position
TuxLeon 0:99b5a7505a7a 394 * @param Ypos: LCD Y position
TuxLeon 0:99b5a7505a7a 395 * @param Width: LCD window width
TuxLeon 0:99b5a7505a7a 396 * @param Height: LCD window height
TuxLeon 0:99b5a7505a7a 397 * @retval None
TuxLeon 0:99b5a7505a7a 398 */
TuxLeon 0:99b5a7505a7a 399 void BSP_LCD_SetLayerWindow(uint16_t LayerIndex, uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height)
TuxLeon 0:99b5a7505a7a 400 {
TuxLeon 0:99b5a7505a7a 401 /* Reconfigure the layer size */
TuxLeon 0:99b5a7505a7a 402 HAL_LTDC_SetWindowSize(&hLtdcHandler, Width, Height, LayerIndex);
TuxLeon 0:99b5a7505a7a 403
TuxLeon 0:99b5a7505a7a 404 /* Reconfigure the layer position */
TuxLeon 0:99b5a7505a7a 405 HAL_LTDC_SetWindowPosition(&hLtdcHandler, Xpos, Ypos, LayerIndex);
TuxLeon 0:99b5a7505a7a 406 }
TuxLeon 0:99b5a7505a7a 407
TuxLeon 0:99b5a7505a7a 408 /**
TuxLeon 0:99b5a7505a7a 409 * @brief Configures and sets the color keying.
TuxLeon 0:99b5a7505a7a 410 * @param LayerIndex: Layer foreground or background
TuxLeon 0:99b5a7505a7a 411 * @param RGBValue: Color reference
TuxLeon 0:99b5a7505a7a 412 * @retval None
TuxLeon 0:99b5a7505a7a 413 */
TuxLeon 0:99b5a7505a7a 414 void BSP_LCD_SetColorKeying(uint32_t LayerIndex, uint32_t RGBValue)
TuxLeon 0:99b5a7505a7a 415 {
TuxLeon 0:99b5a7505a7a 416 /* Configure and Enable the color Keying for LCD Layer */
TuxLeon 0:99b5a7505a7a 417 HAL_LTDC_ConfigColorKeying(&hLtdcHandler, RGBValue, LayerIndex);
TuxLeon 0:99b5a7505a7a 418 HAL_LTDC_EnableColorKeying(&hLtdcHandler, LayerIndex);
TuxLeon 0:99b5a7505a7a 419 }
TuxLeon 0:99b5a7505a7a 420
TuxLeon 0:99b5a7505a7a 421 /**
TuxLeon 0:99b5a7505a7a 422 * @brief Disables the color keying.
TuxLeon 0:99b5a7505a7a 423 * @param LayerIndex: Layer foreground or background
TuxLeon 0:99b5a7505a7a 424 * @retval None
TuxLeon 0:99b5a7505a7a 425 */
TuxLeon 0:99b5a7505a7a 426 void BSP_LCD_ResetColorKeying(uint32_t LayerIndex)
TuxLeon 0:99b5a7505a7a 427 {
TuxLeon 0:99b5a7505a7a 428 /* Disable the color Keying for LCD Layer */
TuxLeon 0:99b5a7505a7a 429 HAL_LTDC_DisableColorKeying(&hLtdcHandler, LayerIndex);
TuxLeon 0:99b5a7505a7a 430 }
TuxLeon 0:99b5a7505a7a 431
TuxLeon 0:99b5a7505a7a 432 /**
TuxLeon 0:99b5a7505a7a 433 * @brief Sets the LCD text color.
TuxLeon 0:99b5a7505a7a 434 * @param Color: Text color code ARGB(8-8-8-8)
TuxLeon 0:99b5a7505a7a 435 * @retval None
TuxLeon 0:99b5a7505a7a 436 */
TuxLeon 0:99b5a7505a7a 437 void BSP_LCD_SetTextColor(uint32_t Color)
TuxLeon 0:99b5a7505a7a 438 {
TuxLeon 0:99b5a7505a7a 439 DrawProp[ActiveLayer].TextColor = Color;
TuxLeon 0:99b5a7505a7a 440 }
TuxLeon 0:99b5a7505a7a 441
TuxLeon 0:99b5a7505a7a 442 /**
TuxLeon 0:99b5a7505a7a 443 * @brief Gets the LCD text color.
TuxLeon 0:99b5a7505a7a 444 * @retval Used text color.
TuxLeon 0:99b5a7505a7a 445 */
TuxLeon 0:99b5a7505a7a 446 uint32_t BSP_LCD_GetTextColor(void)
TuxLeon 0:99b5a7505a7a 447 {
TuxLeon 0:99b5a7505a7a 448 return DrawProp[ActiveLayer].TextColor;
TuxLeon 0:99b5a7505a7a 449 }
TuxLeon 0:99b5a7505a7a 450
TuxLeon 0:99b5a7505a7a 451 /**
TuxLeon 0:99b5a7505a7a 452 * @brief Sets the LCD background color.
TuxLeon 0:99b5a7505a7a 453 * @param Color: Layer background color code ARGB(8-8-8-8)
TuxLeon 0:99b5a7505a7a 454 * @retval None
TuxLeon 0:99b5a7505a7a 455 */
TuxLeon 0:99b5a7505a7a 456 void BSP_LCD_SetBackColor(uint32_t Color)
TuxLeon 0:99b5a7505a7a 457 {
TuxLeon 0:99b5a7505a7a 458 DrawProp[ActiveLayer].BackColor = Color;
TuxLeon 0:99b5a7505a7a 459 }
TuxLeon 0:99b5a7505a7a 460
TuxLeon 0:99b5a7505a7a 461 /**
TuxLeon 0:99b5a7505a7a 462 * @brief Gets the LCD background color.
TuxLeon 0:99b5a7505a7a 463 * @retval Used background colour
TuxLeon 0:99b5a7505a7a 464 */
TuxLeon 0:99b5a7505a7a 465 uint32_t BSP_LCD_GetBackColor(void)
TuxLeon 0:99b5a7505a7a 466 {
TuxLeon 0:99b5a7505a7a 467 return DrawProp[ActiveLayer].BackColor;
TuxLeon 0:99b5a7505a7a 468 }
TuxLeon 0:99b5a7505a7a 469
TuxLeon 0:99b5a7505a7a 470 /**
TuxLeon 0:99b5a7505a7a 471 * @brief Sets the LCD text font.
TuxLeon 0:99b5a7505a7a 472 * @param fonts: Layer font to be used
TuxLeon 0:99b5a7505a7a 473 * @retval None
TuxLeon 0:99b5a7505a7a 474 */
TuxLeon 0:99b5a7505a7a 475 void BSP_LCD_SetFont(sFONT *fonts)
TuxLeon 0:99b5a7505a7a 476 {
TuxLeon 0:99b5a7505a7a 477 DrawProp[ActiveLayer].pFont = fonts;
TuxLeon 0:99b5a7505a7a 478 }
TuxLeon 0:99b5a7505a7a 479
TuxLeon 0:99b5a7505a7a 480 /**
TuxLeon 0:99b5a7505a7a 481 * @brief Gets the LCD text font.
TuxLeon 0:99b5a7505a7a 482 * @retval Used layer font
TuxLeon 0:99b5a7505a7a 483 */
TuxLeon 0:99b5a7505a7a 484 sFONT *BSP_LCD_GetFont(void)
TuxLeon 0:99b5a7505a7a 485 {
TuxLeon 0:99b5a7505a7a 486 return DrawProp[ActiveLayer].pFont;
TuxLeon 0:99b5a7505a7a 487 }
TuxLeon 0:99b5a7505a7a 488
TuxLeon 0:99b5a7505a7a 489 /**
TuxLeon 0:99b5a7505a7a 490 * @brief Reads an LCD pixel.
TuxLeon 0:99b5a7505a7a 491 * @param Xpos: X position
TuxLeon 0:99b5a7505a7a 492 * @param Ypos: Y position
TuxLeon 0:99b5a7505a7a 493 * @retval RGB pixel color
TuxLeon 0:99b5a7505a7a 494 */
TuxLeon 0:99b5a7505a7a 495 uint32_t BSP_LCD_ReadPixel(uint16_t Xpos, uint16_t Ypos)
TuxLeon 0:99b5a7505a7a 496 {
TuxLeon 0:99b5a7505a7a 497 uint32_t ret = 0;
TuxLeon 0:99b5a7505a7a 498
TuxLeon 0:99b5a7505a7a 499 if(hLtdcHandler.LayerCfg[ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_ARGB8888)
TuxLeon 0:99b5a7505a7a 500 {
TuxLeon 0:99b5a7505a7a 501 /* Read data value from SDRAM memory */
TuxLeon 0:99b5a7505a7a 502 ret = *(__IO uint32_t*) (hLtdcHandler.LayerCfg[ActiveLayer].FBStartAdress + (2*(Ypos*BSP_LCD_GetXSize() + Xpos)));
TuxLeon 0:99b5a7505a7a 503 }
TuxLeon 0:99b5a7505a7a 504 else if(hLtdcHandler.LayerCfg[ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_RGB888)
TuxLeon 0:99b5a7505a7a 505 {
TuxLeon 0:99b5a7505a7a 506 /* Read data value from SDRAM memory */
TuxLeon 0:99b5a7505a7a 507 ret = (*(__IO uint32_t*) (hLtdcHandler.LayerCfg[ActiveLayer].FBStartAdress + (2*(Ypos*BSP_LCD_GetXSize() + Xpos))) & 0x00FFFFFF);
TuxLeon 0:99b5a7505a7a 508 }
TuxLeon 0:99b5a7505a7a 509 else if((hLtdcHandler.LayerCfg[ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_RGB565) || \
TuxLeon 0:99b5a7505a7a 510 (hLtdcHandler.LayerCfg[ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_ARGB4444) || \
TuxLeon 0:99b5a7505a7a 511 (hLtdcHandler.LayerCfg[ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_AL88))
TuxLeon 0:99b5a7505a7a 512 {
TuxLeon 0:99b5a7505a7a 513 /* Read data value from SDRAM memory */
TuxLeon 0:99b5a7505a7a 514 ret = *(__IO uint16_t*) (hLtdcHandler.LayerCfg[ActiveLayer].FBStartAdress + (2*(Ypos*BSP_LCD_GetXSize() + Xpos)));
TuxLeon 0:99b5a7505a7a 515 }
TuxLeon 0:99b5a7505a7a 516 else
TuxLeon 0:99b5a7505a7a 517 {
TuxLeon 0:99b5a7505a7a 518 /* Read data value from SDRAM memory */
TuxLeon 0:99b5a7505a7a 519 ret = *(__IO uint8_t*) (hLtdcHandler.LayerCfg[ActiveLayer].FBStartAdress + (2*(Ypos*BSP_LCD_GetXSize() + Xpos)));
TuxLeon 0:99b5a7505a7a 520 }
TuxLeon 0:99b5a7505a7a 521
TuxLeon 0:99b5a7505a7a 522 return ret;
TuxLeon 0:99b5a7505a7a 523 }
TuxLeon 0:99b5a7505a7a 524
TuxLeon 0:99b5a7505a7a 525 /**
TuxLeon 0:99b5a7505a7a 526 * @brief Clears the hole LCD.
TuxLeon 0:99b5a7505a7a 527 * @param Color: Color of the background
TuxLeon 0:99b5a7505a7a 528 * @retval None
TuxLeon 0:99b5a7505a7a 529 */
TuxLeon 0:99b5a7505a7a 530 void BSP_LCD_Clear(uint32_t Color)
TuxLeon 0:99b5a7505a7a 531 {
TuxLeon 0:99b5a7505a7a 532 /* Clear the LCD */
TuxLeon 0:99b5a7505a7a 533 LL_FillBuffer(ActiveLayer, (uint32_t *)(hLtdcHandler.LayerCfg[ActiveLayer].FBStartAdress), BSP_LCD_GetXSize(), BSP_LCD_GetYSize(), 0, Color);
TuxLeon 0:99b5a7505a7a 534 }
TuxLeon 0:99b5a7505a7a 535
TuxLeon 0:99b5a7505a7a 536 /**
TuxLeon 0:99b5a7505a7a 537 * @brief Clears the selected line.
TuxLeon 0:99b5a7505a7a 538 * @param Line: Line to be cleared
TuxLeon 0:99b5a7505a7a 539 * @retval None
TuxLeon 0:99b5a7505a7a 540 */
TuxLeon 0:99b5a7505a7a 541 void BSP_LCD_ClearStringLine(uint32_t Line)
TuxLeon 0:99b5a7505a7a 542 {
TuxLeon 0:99b5a7505a7a 543 uint32_t color_backup = DrawProp[ActiveLayer].TextColor;
TuxLeon 0:99b5a7505a7a 544 DrawProp[ActiveLayer].TextColor = DrawProp[ActiveLayer].BackColor;
TuxLeon 0:99b5a7505a7a 545
TuxLeon 0:99b5a7505a7a 546 /* Draw rectangle with background color */
TuxLeon 0:99b5a7505a7a 547 BSP_LCD_FillRect(0, (Line * DrawProp[ActiveLayer].pFont->Height), BSP_LCD_GetXSize(), DrawProp[ActiveLayer].pFont->Height);
TuxLeon 0:99b5a7505a7a 548
TuxLeon 0:99b5a7505a7a 549 DrawProp[ActiveLayer].TextColor = color_backup;
TuxLeon 0:99b5a7505a7a 550 BSP_LCD_SetTextColor(DrawProp[ActiveLayer].TextColor);
TuxLeon 0:99b5a7505a7a 551 }
TuxLeon 0:99b5a7505a7a 552
TuxLeon 0:99b5a7505a7a 553 /**
TuxLeon 0:99b5a7505a7a 554 * @brief Displays one character.
TuxLeon 0:99b5a7505a7a 555 * @param Xpos: Start column address
TuxLeon 0:99b5a7505a7a 556 * @param Ypos: Line where to display the character shape.
TuxLeon 0:99b5a7505a7a 557 * @param Ascii: Character ascii code
TuxLeon 0:99b5a7505a7a 558 * This parameter must be a number between Min_Data = 0x20 and Max_Data = 0x7E
TuxLeon 0:99b5a7505a7a 559 * @retval None
TuxLeon 0:99b5a7505a7a 560 */
TuxLeon 0:99b5a7505a7a 561 void BSP_LCD_DisplayChar(uint16_t Xpos, uint16_t Ypos, uint8_t Ascii)
TuxLeon 0:99b5a7505a7a 562 {
TuxLeon 0:99b5a7505a7a 563 DrawChar(Xpos, Ypos, &DrawProp[ActiveLayer].pFont->table[(Ascii-' ') *\
TuxLeon 0:99b5a7505a7a 564 DrawProp[ActiveLayer].pFont->Height * ((DrawProp[ActiveLayer].pFont->Width + 7) / 8)]);
TuxLeon 0:99b5a7505a7a 565 }
TuxLeon 0:99b5a7505a7a 566
TuxLeon 0:99b5a7505a7a 567 /**
TuxLeon 0:99b5a7505a7a 568 * @brief Displays characters on the LCD.
TuxLeon 0:99b5a7505a7a 569 * @param Xpos: X position (in pixel)
TuxLeon 0:99b5a7505a7a 570 * @param Ypos: Y position (in pixel)
TuxLeon 0:99b5a7505a7a 571 * @param Text: Pointer to string to display on LCD
TuxLeon 0:99b5a7505a7a 572 * @param Mode: Display mode
TuxLeon 0:99b5a7505a7a 573 * This parameter can be one of the following values:
TuxLeon 0:99b5a7505a7a 574 * @arg CENTER_MODE
TuxLeon 0:99b5a7505a7a 575 * @arg RIGHT_MODE
TuxLeon 0:99b5a7505a7a 576 * @arg LEFT_MODE
TuxLeon 0:99b5a7505a7a 577 * @retval None
TuxLeon 0:99b5a7505a7a 578 */
TuxLeon 0:99b5a7505a7a 579 void BSP_LCD_DisplayStringAt(uint16_t Xpos, uint16_t Ypos, uint8_t *Text, Text_AlignModeTypdef Mode)
TuxLeon 0:99b5a7505a7a 580 {
TuxLeon 0:99b5a7505a7a 581 uint16_t ref_column = 1, i = 0;
TuxLeon 0:99b5a7505a7a 582 uint32_t size = 0, xsize = 0;
TuxLeon 0:99b5a7505a7a 583 uint8_t *ptr = Text;
TuxLeon 0:99b5a7505a7a 584
TuxLeon 0:99b5a7505a7a 585 /* Get the text size */
TuxLeon 0:99b5a7505a7a 586 while (*ptr++) size ++ ;
TuxLeon 0:99b5a7505a7a 587
TuxLeon 0:99b5a7505a7a 588 /* Characters number per line */
TuxLeon 0:99b5a7505a7a 589 xsize = (BSP_LCD_GetXSize()/DrawProp[ActiveLayer].pFont->Width);
TuxLeon 0:99b5a7505a7a 590
TuxLeon 0:99b5a7505a7a 591 switch (Mode)
TuxLeon 0:99b5a7505a7a 592 {
TuxLeon 0:99b5a7505a7a 593 case CENTER_MODE:
TuxLeon 0:99b5a7505a7a 594 {
TuxLeon 0:99b5a7505a7a 595 ref_column = Xpos + ((xsize - size)* DrawProp[ActiveLayer].pFont->Width) / 2;
TuxLeon 0:99b5a7505a7a 596 break;
TuxLeon 0:99b5a7505a7a 597 }
TuxLeon 0:99b5a7505a7a 598 case LEFT_MODE:
TuxLeon 0:99b5a7505a7a 599 {
TuxLeon 0:99b5a7505a7a 600 ref_column = Xpos;
TuxLeon 0:99b5a7505a7a 601 break;
TuxLeon 0:99b5a7505a7a 602 }
TuxLeon 0:99b5a7505a7a 603 case RIGHT_MODE:
TuxLeon 0:99b5a7505a7a 604 {
TuxLeon 0:99b5a7505a7a 605 ref_column = - Xpos + ((xsize - size)*DrawProp[ActiveLayer].pFont->Width);
TuxLeon 0:99b5a7505a7a 606 break;
TuxLeon 0:99b5a7505a7a 607 }
TuxLeon 0:99b5a7505a7a 608 default:
TuxLeon 0:99b5a7505a7a 609 {
TuxLeon 0:99b5a7505a7a 610 ref_column = Xpos;
TuxLeon 0:99b5a7505a7a 611 break;
TuxLeon 0:99b5a7505a7a 612 }
TuxLeon 0:99b5a7505a7a 613 }
TuxLeon 0:99b5a7505a7a 614
TuxLeon 0:99b5a7505a7a 615 /* Check that the Start column is located in the screen */
TuxLeon 0:99b5a7505a7a 616 if ((ref_column < 1) || (ref_column >= 0x8000))
TuxLeon 0:99b5a7505a7a 617 {
TuxLeon 0:99b5a7505a7a 618 ref_column = 1;
TuxLeon 0:99b5a7505a7a 619 }
TuxLeon 0:99b5a7505a7a 620
TuxLeon 0:99b5a7505a7a 621 /* Send the string character by character on LCD */
TuxLeon 0:99b5a7505a7a 622 while ((*Text != 0) & (((BSP_LCD_GetXSize() - (i*DrawProp[ActiveLayer].pFont->Width)) & 0xFFFF) >= DrawProp[ActiveLayer].pFont->Width))
TuxLeon 0:99b5a7505a7a 623 {
TuxLeon 0:99b5a7505a7a 624 /* Display one character on LCD */
TuxLeon 0:99b5a7505a7a 625 BSP_LCD_DisplayChar(ref_column, Ypos, *Text);
TuxLeon 0:99b5a7505a7a 626 /* Decrement the column position by 16 */
TuxLeon 0:99b5a7505a7a 627 ref_column += DrawProp[ActiveLayer].pFont->Width;
TuxLeon 0:99b5a7505a7a 628 /* Point on the next character */
TuxLeon 0:99b5a7505a7a 629 Text++;
TuxLeon 0:99b5a7505a7a 630 i++;
TuxLeon 0:99b5a7505a7a 631 }
TuxLeon 0:99b5a7505a7a 632 }
TuxLeon 0:99b5a7505a7a 633
TuxLeon 0:99b5a7505a7a 634 /**
TuxLeon 0:99b5a7505a7a 635 * @brief Displays a maximum of 60 characters on the LCD.
TuxLeon 0:99b5a7505a7a 636 * @param Line: Line where to display the character shape
TuxLeon 0:99b5a7505a7a 637 * @param ptr: Pointer to string to display on LCD
TuxLeon 0:99b5a7505a7a 638 * @retval None
TuxLeon 0:99b5a7505a7a 639 */
TuxLeon 0:99b5a7505a7a 640 void BSP_LCD_DisplayStringAtLine(uint16_t Line, uint8_t *ptr)
TuxLeon 0:99b5a7505a7a 641 {
TuxLeon 0:99b5a7505a7a 642 BSP_LCD_DisplayStringAt(0, LINE(Line), ptr, LEFT_MODE);
TuxLeon 0:99b5a7505a7a 643 }
TuxLeon 0:99b5a7505a7a 644
TuxLeon 0:99b5a7505a7a 645 /**
TuxLeon 0:99b5a7505a7a 646 * @brief Draws an horizontal line.
TuxLeon 0:99b5a7505a7a 647 * @param Xpos: X position
TuxLeon 0:99b5a7505a7a 648 * @param Ypos: Y position
TuxLeon 0:99b5a7505a7a 649 * @param Length: Line length
TuxLeon 0:99b5a7505a7a 650 * @retval None
TuxLeon 0:99b5a7505a7a 651 */
TuxLeon 0:99b5a7505a7a 652 void BSP_LCD_DrawHLine(uint16_t Xpos, uint16_t Ypos, uint16_t Length)
TuxLeon 0:99b5a7505a7a 653 {
TuxLeon 0:99b5a7505a7a 654 uint32_t Xaddress = 0;
TuxLeon 0:99b5a7505a7a 655
TuxLeon 0:99b5a7505a7a 656 /* Get the line address */
TuxLeon 0:99b5a7505a7a 657 if(hLtdcHandler.LayerCfg[ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_RGB565)
TuxLeon 0:99b5a7505a7a 658 { /* RGB565 format */
TuxLeon 0:99b5a7505a7a 659 Xaddress = (hLtdcHandler.LayerCfg[ActiveLayer].FBStartAdress) + 2*(BSP_LCD_GetXSize()*Ypos + Xpos);
TuxLeon 0:99b5a7505a7a 660 }
TuxLeon 0:99b5a7505a7a 661 else
TuxLeon 0:99b5a7505a7a 662 { /* ARGB8888 format */
TuxLeon 0:99b5a7505a7a 663 Xaddress = (hLtdcHandler.LayerCfg[ActiveLayer].FBStartAdress) + 4*(BSP_LCD_GetXSize()*Ypos + Xpos);
TuxLeon 0:99b5a7505a7a 664 }
TuxLeon 0:99b5a7505a7a 665
TuxLeon 0:99b5a7505a7a 666 /* Write line */
TuxLeon 0:99b5a7505a7a 667 LL_FillBuffer(ActiveLayer, (uint32_t *)Xaddress, Length, 1, 0, DrawProp[ActiveLayer].TextColor);
TuxLeon 0:99b5a7505a7a 668 }
TuxLeon 0:99b5a7505a7a 669
TuxLeon 0:99b5a7505a7a 670 /**
TuxLeon 0:99b5a7505a7a 671 * @brief Draws a vertical line.
TuxLeon 0:99b5a7505a7a 672 * @param Xpos: X position
TuxLeon 0:99b5a7505a7a 673 * @param Ypos: Y position
TuxLeon 0:99b5a7505a7a 674 * @param Length: Line length
TuxLeon 0:99b5a7505a7a 675 * @retval None
TuxLeon 0:99b5a7505a7a 676 */
TuxLeon 0:99b5a7505a7a 677 void BSP_LCD_DrawVLine(uint16_t Xpos, uint16_t Ypos, uint16_t Length)
TuxLeon 0:99b5a7505a7a 678 {
TuxLeon 0:99b5a7505a7a 679 uint32_t Xaddress = 0;
TuxLeon 0:99b5a7505a7a 680
TuxLeon 0:99b5a7505a7a 681 /* Get the line address */
TuxLeon 0:99b5a7505a7a 682 if(hLtdcHandler.LayerCfg[ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_RGB565)
TuxLeon 0:99b5a7505a7a 683 { /* RGB565 format */
TuxLeon 0:99b5a7505a7a 684 Xaddress = (hLtdcHandler.LayerCfg[ActiveLayer].FBStartAdress) + 2*(BSP_LCD_GetXSize()*Ypos + Xpos);
TuxLeon 0:99b5a7505a7a 685 }
TuxLeon 0:99b5a7505a7a 686 else
TuxLeon 0:99b5a7505a7a 687 { /* ARGB8888 format */
TuxLeon 0:99b5a7505a7a 688 Xaddress = (hLtdcHandler.LayerCfg[ActiveLayer].FBStartAdress) + 4*(BSP_LCD_GetXSize()*Ypos + Xpos);
TuxLeon 0:99b5a7505a7a 689 }
TuxLeon 0:99b5a7505a7a 690
TuxLeon 0:99b5a7505a7a 691 /* Write line */
TuxLeon 0:99b5a7505a7a 692 LL_FillBuffer(ActiveLayer, (uint32_t *)Xaddress, 1, Length, (BSP_LCD_GetXSize() - 1), DrawProp[ActiveLayer].TextColor);
TuxLeon 0:99b5a7505a7a 693 }
TuxLeon 0:99b5a7505a7a 694
TuxLeon 0:99b5a7505a7a 695 /**
TuxLeon 0:99b5a7505a7a 696 * @brief Draws an uni-line (between two points).
TuxLeon 0:99b5a7505a7a 697 * @param x1: Point 1 X position
TuxLeon 0:99b5a7505a7a 698 * @param y1: Point 1 Y position
TuxLeon 0:99b5a7505a7a 699 * @param x2: Point 2 X position
TuxLeon 0:99b5a7505a7a 700 * @param y2: Point 2 Y position
TuxLeon 0:99b5a7505a7a 701 * @retval None
TuxLeon 0:99b5a7505a7a 702 */
TuxLeon 0:99b5a7505a7a 703 void BSP_LCD_DrawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2)
TuxLeon 0:99b5a7505a7a 704 {
TuxLeon 0:99b5a7505a7a 705 int16_t deltax = 0, deltay = 0, x = 0, y = 0, xinc1 = 0, xinc2 = 0,
TuxLeon 0:99b5a7505a7a 706 yinc1 = 0, yinc2 = 0, den = 0, num = 0, num_add = 0, num_pixels = 0,
TuxLeon 0:99b5a7505a7a 707 curpixel = 0;
TuxLeon 0:99b5a7505a7a 708
TuxLeon 0:99b5a7505a7a 709 deltax = ABS(x2 - x1); /* The difference between the x's */
TuxLeon 0:99b5a7505a7a 710 deltay = ABS(y2 - y1); /* The difference between the y's */
TuxLeon 0:99b5a7505a7a 711 x = x1; /* Start x off at the first pixel */
TuxLeon 0:99b5a7505a7a 712 y = y1; /* Start y off at the first pixel */
TuxLeon 0:99b5a7505a7a 713
TuxLeon 0:99b5a7505a7a 714 if (x2 >= x1) /* The x-values are increasing */
TuxLeon 0:99b5a7505a7a 715 {
TuxLeon 0:99b5a7505a7a 716 xinc1 = 1;
TuxLeon 0:99b5a7505a7a 717 xinc2 = 1;
TuxLeon 0:99b5a7505a7a 718 }
TuxLeon 0:99b5a7505a7a 719 else /* The x-values are decreasing */
TuxLeon 0:99b5a7505a7a 720 {
TuxLeon 0:99b5a7505a7a 721 xinc1 = -1;
TuxLeon 0:99b5a7505a7a 722 xinc2 = -1;
TuxLeon 0:99b5a7505a7a 723 }
TuxLeon 0:99b5a7505a7a 724
TuxLeon 0:99b5a7505a7a 725 if (y2 >= y1) /* The y-values are increasing */
TuxLeon 0:99b5a7505a7a 726 {
TuxLeon 0:99b5a7505a7a 727 yinc1 = 1;
TuxLeon 0:99b5a7505a7a 728 yinc2 = 1;
TuxLeon 0:99b5a7505a7a 729 }
TuxLeon 0:99b5a7505a7a 730 else /* The y-values are decreasing */
TuxLeon 0:99b5a7505a7a 731 {
TuxLeon 0:99b5a7505a7a 732 yinc1 = -1;
TuxLeon 0:99b5a7505a7a 733 yinc2 = -1;
TuxLeon 0:99b5a7505a7a 734 }
TuxLeon 0:99b5a7505a7a 735
TuxLeon 0:99b5a7505a7a 736 if (deltax >= deltay) /* There is at least one x-value for every y-value */
TuxLeon 0:99b5a7505a7a 737 {
TuxLeon 0:99b5a7505a7a 738 xinc1 = 0; /* Don't change the x when numerator >= denominator */
TuxLeon 0:99b5a7505a7a 739 yinc2 = 0; /* Don't change the y for every iteration */
TuxLeon 0:99b5a7505a7a 740 den = deltax;
TuxLeon 0:99b5a7505a7a 741 num = deltax / 2;
TuxLeon 0:99b5a7505a7a 742 num_add = deltay;
TuxLeon 0:99b5a7505a7a 743 num_pixels = deltax; /* There are more x-values than y-values */
TuxLeon 0:99b5a7505a7a 744 }
TuxLeon 0:99b5a7505a7a 745 else /* There is at least one y-value for every x-value */
TuxLeon 0:99b5a7505a7a 746 {
TuxLeon 0:99b5a7505a7a 747 xinc2 = 0; /* Don't change the x for every iteration */
TuxLeon 0:99b5a7505a7a 748 yinc1 = 0; /* Don't change the y when numerator >= denominator */
TuxLeon 0:99b5a7505a7a 749 den = deltay;
TuxLeon 0:99b5a7505a7a 750 num = deltay / 2;
TuxLeon 0:99b5a7505a7a 751 num_add = deltax;
TuxLeon 0:99b5a7505a7a 752 num_pixels = deltay; /* There are more y-values than x-values */
TuxLeon 0:99b5a7505a7a 753 }
TuxLeon 0:99b5a7505a7a 754
TuxLeon 0:99b5a7505a7a 755 for (curpixel = 0; curpixel <= num_pixels; curpixel++)
TuxLeon 0:99b5a7505a7a 756 {
TuxLeon 0:99b5a7505a7a 757 BSP_LCD_DrawPixel(x, y, DrawProp[ActiveLayer].TextColor); /* Draw the current pixel */
TuxLeon 0:99b5a7505a7a 758 num += num_add; /* Increase the numerator by the top of the fraction */
TuxLeon 0:99b5a7505a7a 759 if (num >= den) /* Check if numerator >= denominator */
TuxLeon 0:99b5a7505a7a 760 {
TuxLeon 0:99b5a7505a7a 761 num -= den; /* Calculate the new numerator value */
TuxLeon 0:99b5a7505a7a 762 x += xinc1; /* Change the x as appropriate */
TuxLeon 0:99b5a7505a7a 763 y += yinc1; /* Change the y as appropriate */
TuxLeon 0:99b5a7505a7a 764 }
TuxLeon 0:99b5a7505a7a 765 x += xinc2; /* Change the x as appropriate */
TuxLeon 0:99b5a7505a7a 766 y += yinc2; /* Change the y as appropriate */
TuxLeon 0:99b5a7505a7a 767 }
TuxLeon 0:99b5a7505a7a 768 }
TuxLeon 0:99b5a7505a7a 769
TuxLeon 0:99b5a7505a7a 770 /**
TuxLeon 0:99b5a7505a7a 771 * @brief Draws a rectangle.
TuxLeon 0:99b5a7505a7a 772 * @param Xpos: X position
TuxLeon 0:99b5a7505a7a 773 * @param Ypos: Y position
TuxLeon 0:99b5a7505a7a 774 * @param Width: Rectangle width
TuxLeon 0:99b5a7505a7a 775 * @param Height: Rectangle height
TuxLeon 0:99b5a7505a7a 776 * @retval None
TuxLeon 0:99b5a7505a7a 777 */
TuxLeon 0:99b5a7505a7a 778 void BSP_LCD_DrawRect(uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height)
TuxLeon 0:99b5a7505a7a 779 {
TuxLeon 0:99b5a7505a7a 780 /* Draw horizontal lines */
TuxLeon 0:99b5a7505a7a 781 BSP_LCD_DrawHLine(Xpos, Ypos, Width);
TuxLeon 0:99b5a7505a7a 782 BSP_LCD_DrawHLine(Xpos, (Ypos+ Height), Width);
TuxLeon 0:99b5a7505a7a 783
TuxLeon 0:99b5a7505a7a 784 /* Draw vertical lines */
TuxLeon 0:99b5a7505a7a 785 BSP_LCD_DrawVLine(Xpos, Ypos, Height);
TuxLeon 0:99b5a7505a7a 786 BSP_LCD_DrawVLine((Xpos + Width), Ypos, Height);
TuxLeon 0:99b5a7505a7a 787 }
TuxLeon 0:99b5a7505a7a 788
TuxLeon 0:99b5a7505a7a 789 /**
TuxLeon 0:99b5a7505a7a 790 * @brief Draws a circle.
TuxLeon 0:99b5a7505a7a 791 * @param Xpos: X position
TuxLeon 0:99b5a7505a7a 792 * @param Ypos: Y position
TuxLeon 0:99b5a7505a7a 793 * @param Radius: Circle radius
TuxLeon 0:99b5a7505a7a 794 * @retval None
TuxLeon 0:99b5a7505a7a 795 */
TuxLeon 0:99b5a7505a7a 796 void BSP_LCD_DrawCircle(uint16_t Xpos, uint16_t Ypos, uint16_t Radius)
TuxLeon 0:99b5a7505a7a 797 {
TuxLeon 0:99b5a7505a7a 798 int32_t decision; /* Decision Variable */
TuxLeon 0:99b5a7505a7a 799 uint32_t current_x; /* Current X Value */
TuxLeon 0:99b5a7505a7a 800 uint32_t current_y; /* Current Y Value */
TuxLeon 0:99b5a7505a7a 801
TuxLeon 0:99b5a7505a7a 802 decision = 3 - (Radius << 1);
TuxLeon 0:99b5a7505a7a 803 current_x = 0;
TuxLeon 0:99b5a7505a7a 804 current_y = Radius;
TuxLeon 0:99b5a7505a7a 805
TuxLeon 0:99b5a7505a7a 806 while (current_x <= current_y)
TuxLeon 0:99b5a7505a7a 807 {
TuxLeon 0:99b5a7505a7a 808 BSP_LCD_DrawPixel((Xpos + current_x), (Ypos - current_y), DrawProp[ActiveLayer].TextColor);
TuxLeon 0:99b5a7505a7a 809
TuxLeon 0:99b5a7505a7a 810 BSP_LCD_DrawPixel((Xpos - current_x), (Ypos - current_y), DrawProp[ActiveLayer].TextColor);
TuxLeon 0:99b5a7505a7a 811
TuxLeon 0:99b5a7505a7a 812 BSP_LCD_DrawPixel((Xpos + current_y), (Ypos - current_x), DrawProp[ActiveLayer].TextColor);
TuxLeon 0:99b5a7505a7a 813
TuxLeon 0:99b5a7505a7a 814 BSP_LCD_DrawPixel((Xpos - current_y), (Ypos - current_x), DrawProp[ActiveLayer].TextColor);
TuxLeon 0:99b5a7505a7a 815
TuxLeon 0:99b5a7505a7a 816 BSP_LCD_DrawPixel((Xpos + current_x), (Ypos + current_y), DrawProp[ActiveLayer].TextColor);
TuxLeon 0:99b5a7505a7a 817
TuxLeon 0:99b5a7505a7a 818 BSP_LCD_DrawPixel((Xpos - current_x), (Ypos + current_y), DrawProp[ActiveLayer].TextColor);
TuxLeon 0:99b5a7505a7a 819
TuxLeon 0:99b5a7505a7a 820 BSP_LCD_DrawPixel((Xpos + current_y), (Ypos + current_x), DrawProp[ActiveLayer].TextColor);
TuxLeon 0:99b5a7505a7a 821
TuxLeon 0:99b5a7505a7a 822 BSP_LCD_DrawPixel((Xpos - current_y), (Ypos + current_x), DrawProp[ActiveLayer].TextColor);
TuxLeon 0:99b5a7505a7a 823
TuxLeon 0:99b5a7505a7a 824 if (decision < 0)
TuxLeon 0:99b5a7505a7a 825 {
TuxLeon 0:99b5a7505a7a 826 decision += (current_x << 2) + 6;
TuxLeon 0:99b5a7505a7a 827 }
TuxLeon 0:99b5a7505a7a 828 else
TuxLeon 0:99b5a7505a7a 829 {
TuxLeon 0:99b5a7505a7a 830 decision += ((current_x - current_y) << 2) + 10;
TuxLeon 0:99b5a7505a7a 831 current_y--;
TuxLeon 0:99b5a7505a7a 832 }
TuxLeon 0:99b5a7505a7a 833 current_x++;
TuxLeon 0:99b5a7505a7a 834 }
TuxLeon 0:99b5a7505a7a 835 }
TuxLeon 0:99b5a7505a7a 836
TuxLeon 0:99b5a7505a7a 837 /**
TuxLeon 0:99b5a7505a7a 838 * @brief Draws an poly-line (between many points).
TuxLeon 0:99b5a7505a7a 839 * @param Points: Pointer to the points array
TuxLeon 0:99b5a7505a7a 840 * @param PointCount: Number of points
TuxLeon 0:99b5a7505a7a 841 * @retval None
TuxLeon 0:99b5a7505a7a 842 */
TuxLeon 0:99b5a7505a7a 843 void BSP_LCD_DrawPolygon(pPoint Points, uint16_t PointCount)
TuxLeon 0:99b5a7505a7a 844 {
TuxLeon 0:99b5a7505a7a 845 int16_t x = 0, y = 0;
TuxLeon 0:99b5a7505a7a 846
TuxLeon 0:99b5a7505a7a 847 if(PointCount < 2)
TuxLeon 0:99b5a7505a7a 848 {
TuxLeon 0:99b5a7505a7a 849 return;
TuxLeon 0:99b5a7505a7a 850 }
TuxLeon 0:99b5a7505a7a 851
TuxLeon 0:99b5a7505a7a 852 BSP_LCD_DrawLine(Points->X, Points->Y, (Points+PointCount-1)->X, (Points+PointCount-1)->Y);
TuxLeon 0:99b5a7505a7a 853
TuxLeon 0:99b5a7505a7a 854 while(--PointCount)
TuxLeon 0:99b5a7505a7a 855 {
TuxLeon 0:99b5a7505a7a 856 x = Points->X;
TuxLeon 0:99b5a7505a7a 857 y = Points->Y;
TuxLeon 0:99b5a7505a7a 858 Points++;
TuxLeon 0:99b5a7505a7a 859 BSP_LCD_DrawLine(x, y, Points->X, Points->Y);
TuxLeon 0:99b5a7505a7a 860 }
TuxLeon 0:99b5a7505a7a 861 }
TuxLeon 0:99b5a7505a7a 862
TuxLeon 0:99b5a7505a7a 863 /**
TuxLeon 0:99b5a7505a7a 864 * @brief Draws an ellipse on LCD.
TuxLeon 0:99b5a7505a7a 865 * @param Xpos: X position
TuxLeon 0:99b5a7505a7a 866 * @param Ypos: Y position
TuxLeon 0:99b5a7505a7a 867 * @param XRadius: Ellipse X radius
TuxLeon 0:99b5a7505a7a 868 * @param YRadius: Ellipse Y radius
TuxLeon 0:99b5a7505a7a 869 * @retval None
TuxLeon 0:99b5a7505a7a 870 */
TuxLeon 0:99b5a7505a7a 871 void BSP_LCD_DrawEllipse(int Xpos, int Ypos, int XRadius, int YRadius)
TuxLeon 0:99b5a7505a7a 872 {
TuxLeon 0:99b5a7505a7a 873 int x = 0, y = -YRadius, err = 2-2*XRadius, e2;
TuxLeon 0:99b5a7505a7a 874 float k = 0, rad1 = 0, rad2 = 0;
TuxLeon 0:99b5a7505a7a 875
TuxLeon 0:99b5a7505a7a 876 rad1 = XRadius;
TuxLeon 0:99b5a7505a7a 877 rad2 = YRadius;
TuxLeon 0:99b5a7505a7a 878
TuxLeon 0:99b5a7505a7a 879 k = (float)(rad2/rad1);
TuxLeon 0:99b5a7505a7a 880
TuxLeon 0:99b5a7505a7a 881 do {
TuxLeon 0:99b5a7505a7a 882 BSP_LCD_DrawPixel((Xpos-(uint16_t)(x/k)), (Ypos+y), DrawProp[ActiveLayer].TextColor);
TuxLeon 0:99b5a7505a7a 883 BSP_LCD_DrawPixel((Xpos+(uint16_t)(x/k)), (Ypos+y), DrawProp[ActiveLayer].TextColor);
TuxLeon 0:99b5a7505a7a 884 BSP_LCD_DrawPixel((Xpos+(uint16_t)(x/k)), (Ypos-y), DrawProp[ActiveLayer].TextColor);
TuxLeon 0:99b5a7505a7a 885 BSP_LCD_DrawPixel((Xpos-(uint16_t)(x/k)), (Ypos-y), DrawProp[ActiveLayer].TextColor);
TuxLeon 0:99b5a7505a7a 886
TuxLeon 0:99b5a7505a7a 887 e2 = err;
TuxLeon 0:99b5a7505a7a 888 if (e2 <= x) {
TuxLeon 0:99b5a7505a7a 889 err += ++x*2+1;
TuxLeon 0:99b5a7505a7a 890 if (-y == x && e2 <= y) e2 = 0;
TuxLeon 0:99b5a7505a7a 891 }
TuxLeon 0:99b5a7505a7a 892 if (e2 > y) err += ++y*2+1;
TuxLeon 0:99b5a7505a7a 893 }
TuxLeon 0:99b5a7505a7a 894 while (y <= 0);
TuxLeon 0:99b5a7505a7a 895 }
TuxLeon 0:99b5a7505a7a 896
TuxLeon 0:99b5a7505a7a 897 /**
TuxLeon 0:99b5a7505a7a 898 * @brief Draws a pixel on LCD.
TuxLeon 0:99b5a7505a7a 899 * @param Xpos: X position
TuxLeon 0:99b5a7505a7a 900 * @param Ypos: Y position
TuxLeon 0:99b5a7505a7a 901 * @param RGB_Code: Pixel color in ARGB mode (8-8-8-8)
TuxLeon 0:99b5a7505a7a 902 * @retval None
TuxLeon 0:99b5a7505a7a 903 */
TuxLeon 0:99b5a7505a7a 904 void BSP_LCD_DrawPixel(uint16_t Xpos, uint16_t Ypos, uint32_t RGB_Code)
TuxLeon 0:99b5a7505a7a 905 {
TuxLeon 0:99b5a7505a7a 906 /* Write data value to all SDRAM memory */
TuxLeon 0:99b5a7505a7a 907 if(hLtdcHandler.LayerCfg[ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_RGB565)
TuxLeon 0:99b5a7505a7a 908 { /* RGB565 format */
TuxLeon 0:99b5a7505a7a 909 *(__IO uint16_t*) (hLtdcHandler.LayerCfg[ActiveLayer].FBStartAdress + (2*(Ypos*BSP_LCD_GetXSize() + Xpos))) = (uint16_t)RGB_Code;
TuxLeon 0:99b5a7505a7a 910 }
TuxLeon 0:99b5a7505a7a 911 else
TuxLeon 0:99b5a7505a7a 912 { /* ARGB8888 format */
TuxLeon 0:99b5a7505a7a 913 *(__IO uint32_t*) (hLtdcHandler.LayerCfg[ActiveLayer].FBStartAdress + (4*(Ypos*BSP_LCD_GetXSize() + Xpos))) = RGB_Code;
TuxLeon 0:99b5a7505a7a 914 }
TuxLeon 0:99b5a7505a7a 915 }
TuxLeon 0:99b5a7505a7a 916
TuxLeon 0:99b5a7505a7a 917 /**
TuxLeon 0:99b5a7505a7a 918 * @brief Draws a bitmap picture loaded in the internal Flash in ARGB888 format (32 bits per pixel).
TuxLeon 0:99b5a7505a7a 919 * @param Xpos: Bmp X position in the LCD
TuxLeon 0:99b5a7505a7a 920 * @param Ypos: Bmp Y position in the LCD
TuxLeon 0:99b5a7505a7a 921 * @param pbmp: Pointer to Bmp picture address in the internal Flash
TuxLeon 0:99b5a7505a7a 922 * @retval None
TuxLeon 0:99b5a7505a7a 923 */
TuxLeon 0:99b5a7505a7a 924 void BSP_LCD_DrawBitmap(uint32_t Xpos, uint32_t Ypos, uint8_t *pbmp)
TuxLeon 0:99b5a7505a7a 925 {
TuxLeon 0:99b5a7505a7a 926 uint32_t index = 0, width = 0, height = 0, bit_pixel = 0;
TuxLeon 0:99b5a7505a7a 927 uint32_t address;
TuxLeon 0:99b5a7505a7a 928 uint32_t input_color_mode = 0;
TuxLeon 0:99b5a7505a7a 929
TuxLeon 0:99b5a7505a7a 930 /* Get bitmap data address offset */
TuxLeon 0:99b5a7505a7a 931 index = *(__IO uint16_t *) (pbmp + 10);
TuxLeon 0:99b5a7505a7a 932 index |= (*(__IO uint16_t *) (pbmp + 12)) << 16;
TuxLeon 0:99b5a7505a7a 933
TuxLeon 0:99b5a7505a7a 934 /* Read bitmap width */
TuxLeon 0:99b5a7505a7a 935 width = *(uint16_t *) (pbmp + 18);
TuxLeon 0:99b5a7505a7a 936 width |= (*(uint16_t *) (pbmp + 20)) << 16;
TuxLeon 0:99b5a7505a7a 937
TuxLeon 0:99b5a7505a7a 938 /* Read bitmap height */
TuxLeon 0:99b5a7505a7a 939 height = *(uint16_t *) (pbmp + 22);
TuxLeon 0:99b5a7505a7a 940 height |= (*(uint16_t *) (pbmp + 24)) << 16;
TuxLeon 0:99b5a7505a7a 941
TuxLeon 0:99b5a7505a7a 942 /* Read bit/pixel */
TuxLeon 0:99b5a7505a7a 943 bit_pixel = *(uint16_t *) (pbmp + 28);
TuxLeon 0:99b5a7505a7a 944
TuxLeon 0:99b5a7505a7a 945 /* Set the address */
TuxLeon 0:99b5a7505a7a 946 address = hLtdcHandler.LayerCfg[ActiveLayer].FBStartAdress + (((BSP_LCD_GetXSize()*Ypos) + Xpos)*(4));
TuxLeon 0:99b5a7505a7a 947
TuxLeon 0:99b5a7505a7a 948 /* Get the layer pixel format */
TuxLeon 0:99b5a7505a7a 949 if ((bit_pixel/8) == 4)
TuxLeon 0:99b5a7505a7a 950 {
TuxLeon 0:99b5a7505a7a 951 input_color_mode = CM_ARGB8888;
TuxLeon 0:99b5a7505a7a 952 }
TuxLeon 0:99b5a7505a7a 953 else if ((bit_pixel/8) == 2)
TuxLeon 0:99b5a7505a7a 954 {
TuxLeon 0:99b5a7505a7a 955 input_color_mode = CM_RGB565;
TuxLeon 0:99b5a7505a7a 956 }
TuxLeon 0:99b5a7505a7a 957 else
TuxLeon 0:99b5a7505a7a 958 {
TuxLeon 0:99b5a7505a7a 959 input_color_mode = CM_RGB888;
TuxLeon 0:99b5a7505a7a 960 }
TuxLeon 0:99b5a7505a7a 961
TuxLeon 0:99b5a7505a7a 962 /* Bypass the bitmap header */
TuxLeon 0:99b5a7505a7a 963 pbmp += (index + (width * (height - 1) * (bit_pixel/8)));
TuxLeon 0:99b5a7505a7a 964
TuxLeon 0:99b5a7505a7a 965 /* Convert picture to ARGB8888 pixel format */
TuxLeon 0:99b5a7505a7a 966 for(index=0; index < height; index++)
TuxLeon 0:99b5a7505a7a 967 {
TuxLeon 0:99b5a7505a7a 968 /* Pixel format conversion */
TuxLeon 0:99b5a7505a7a 969 LL_ConvertLineToARGB8888((uint32_t *)pbmp, (uint32_t *)address, width, input_color_mode);
TuxLeon 0:99b5a7505a7a 970
TuxLeon 0:99b5a7505a7a 971 /* Increment the source and destination buffers */
TuxLeon 0:99b5a7505a7a 972 address+= (BSP_LCD_GetXSize()*4);
TuxLeon 0:99b5a7505a7a 973 pbmp -= width*(bit_pixel/8);
TuxLeon 0:99b5a7505a7a 974 }
TuxLeon 0:99b5a7505a7a 975 }
TuxLeon 0:99b5a7505a7a 976
TuxLeon 0:99b5a7505a7a 977 /**
TuxLeon 0:99b5a7505a7a 978 * @brief Draws a full rectangle.
TuxLeon 0:99b5a7505a7a 979 * @param Xpos: X position
TuxLeon 0:99b5a7505a7a 980 * @param Ypos: Y position
TuxLeon 0:99b5a7505a7a 981 * @param Width: Rectangle width
TuxLeon 0:99b5a7505a7a 982 * @param Height: Rectangle height
TuxLeon 0:99b5a7505a7a 983 * @retval None
TuxLeon 0:99b5a7505a7a 984 */
TuxLeon 0:99b5a7505a7a 985 void BSP_LCD_FillRect(uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height)
TuxLeon 0:99b5a7505a7a 986 {
TuxLeon 0:99b5a7505a7a 987 uint32_t x_address = 0;
TuxLeon 0:99b5a7505a7a 988
TuxLeon 0:99b5a7505a7a 989 /* Set the text color */
TuxLeon 0:99b5a7505a7a 990 BSP_LCD_SetTextColor(DrawProp[ActiveLayer].TextColor);
TuxLeon 0:99b5a7505a7a 991
TuxLeon 0:99b5a7505a7a 992 /* Get the rectangle start address */
TuxLeon 0:99b5a7505a7a 993 if(hLtdcHandler.LayerCfg[ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_RGB565)
TuxLeon 0:99b5a7505a7a 994 { /* RGB565 format */
TuxLeon 0:99b5a7505a7a 995 x_address = (hLtdcHandler.LayerCfg[ActiveLayer].FBStartAdress) + 2*(BSP_LCD_GetXSize()*Ypos + Xpos);
TuxLeon 0:99b5a7505a7a 996 }
TuxLeon 0:99b5a7505a7a 997 else
TuxLeon 0:99b5a7505a7a 998 { /* ARGB8888 format */
TuxLeon 0:99b5a7505a7a 999 x_address = (hLtdcHandler.LayerCfg[ActiveLayer].FBStartAdress) + 4*(BSP_LCD_GetXSize()*Ypos + Xpos);
TuxLeon 0:99b5a7505a7a 1000 }
TuxLeon 0:99b5a7505a7a 1001 /* Fill the rectangle */
TuxLeon 0:99b5a7505a7a 1002 LL_FillBuffer(ActiveLayer, (uint32_t *)x_address, Width, Height, (BSP_LCD_GetXSize() - Width), DrawProp[ActiveLayer].TextColor);
TuxLeon 0:99b5a7505a7a 1003 }
TuxLeon 0:99b5a7505a7a 1004
TuxLeon 0:99b5a7505a7a 1005 /**
TuxLeon 0:99b5a7505a7a 1006 * @brief Draws a full circle.
TuxLeon 0:99b5a7505a7a 1007 * @param Xpos: X position
TuxLeon 0:99b5a7505a7a 1008 * @param Ypos: Y position
TuxLeon 0:99b5a7505a7a 1009 * @param Radius: Circle radius
TuxLeon 0:99b5a7505a7a 1010 * @retval None
TuxLeon 0:99b5a7505a7a 1011 */
TuxLeon 0:99b5a7505a7a 1012 void BSP_LCD_FillCircle(uint16_t Xpos, uint16_t Ypos, uint16_t Radius)
TuxLeon 0:99b5a7505a7a 1013 {
TuxLeon 0:99b5a7505a7a 1014 int32_t decision; /* Decision Variable */
TuxLeon 0:99b5a7505a7a 1015 uint32_t current_x; /* Current X Value */
TuxLeon 0:99b5a7505a7a 1016 uint32_t current_y; /* Current Y Value */
TuxLeon 0:99b5a7505a7a 1017
TuxLeon 0:99b5a7505a7a 1018 decision = 3 - (Radius << 1);
TuxLeon 0:99b5a7505a7a 1019
TuxLeon 0:99b5a7505a7a 1020 current_x = 0;
TuxLeon 0:99b5a7505a7a 1021 current_y = Radius;
TuxLeon 0:99b5a7505a7a 1022
TuxLeon 0:99b5a7505a7a 1023 BSP_LCD_SetTextColor(DrawProp[ActiveLayer].TextColor);
TuxLeon 0:99b5a7505a7a 1024
TuxLeon 0:99b5a7505a7a 1025 while (current_x <= current_y)
TuxLeon 0:99b5a7505a7a 1026 {
TuxLeon 0:99b5a7505a7a 1027 if(current_y > 0)
TuxLeon 0:99b5a7505a7a 1028 {
TuxLeon 0:99b5a7505a7a 1029 BSP_LCD_DrawHLine(Xpos - current_y, Ypos + current_x, 2*current_y);
TuxLeon 0:99b5a7505a7a 1030 BSP_LCD_DrawHLine(Xpos - current_y, Ypos - current_x, 2*current_y);
TuxLeon 0:99b5a7505a7a 1031 }
TuxLeon 0:99b5a7505a7a 1032
TuxLeon 0:99b5a7505a7a 1033 if(current_x > 0)
TuxLeon 0:99b5a7505a7a 1034 {
TuxLeon 0:99b5a7505a7a 1035 BSP_LCD_DrawHLine(Xpos - current_x, Ypos - current_y, 2*current_x);
TuxLeon 0:99b5a7505a7a 1036 BSP_LCD_DrawHLine(Xpos - current_x, Ypos + current_y, 2*current_x);
TuxLeon 0:99b5a7505a7a 1037 }
TuxLeon 0:99b5a7505a7a 1038 if (decision < 0)
TuxLeon 0:99b5a7505a7a 1039 {
TuxLeon 0:99b5a7505a7a 1040 decision += (current_x << 2) + 6;
TuxLeon 0:99b5a7505a7a 1041 }
TuxLeon 0:99b5a7505a7a 1042 else
TuxLeon 0:99b5a7505a7a 1043 {
TuxLeon 0:99b5a7505a7a 1044 decision += ((current_x - current_y) << 2) + 10;
TuxLeon 0:99b5a7505a7a 1045 current_y--;
TuxLeon 0:99b5a7505a7a 1046 }
TuxLeon 0:99b5a7505a7a 1047 current_x++;
TuxLeon 0:99b5a7505a7a 1048 }
TuxLeon 0:99b5a7505a7a 1049
TuxLeon 0:99b5a7505a7a 1050 BSP_LCD_SetTextColor(DrawProp[ActiveLayer].TextColor);
TuxLeon 0:99b5a7505a7a 1051 BSP_LCD_DrawCircle(Xpos, Ypos, Radius);
TuxLeon 0:99b5a7505a7a 1052 }
TuxLeon 0:99b5a7505a7a 1053
TuxLeon 0:99b5a7505a7a 1054 /**
TuxLeon 0:99b5a7505a7a 1055 * @brief Draws a full poly-line (between many points).
TuxLeon 0:99b5a7505a7a 1056 * @param Points: Pointer to the points array
TuxLeon 0:99b5a7505a7a 1057 * @param PointCount: Number of points
TuxLeon 0:99b5a7505a7a 1058 * @retval None
TuxLeon 0:99b5a7505a7a 1059 */
TuxLeon 0:99b5a7505a7a 1060 void BSP_LCD_FillPolygon(pPoint Points, uint16_t PointCount)
TuxLeon 0:99b5a7505a7a 1061 {
TuxLeon 0:99b5a7505a7a 1062 int16_t X = 0, Y = 0, X2 = 0, Y2 = 0, X_center = 0, Y_center = 0, X_first = 0, Y_first = 0, pixelX = 0, pixelY = 0, counter = 0;
TuxLeon 0:99b5a7505a7a 1063 uint16_t image_left = 0, image_right = 0, image_top = 0, image_bottom = 0;
TuxLeon 0:99b5a7505a7a 1064
TuxLeon 0:99b5a7505a7a 1065 image_left = image_right = Points->X;
TuxLeon 0:99b5a7505a7a 1066 image_top= image_bottom = Points->Y;
TuxLeon 0:99b5a7505a7a 1067
TuxLeon 0:99b5a7505a7a 1068 for(counter = 1; counter < PointCount; counter++)
TuxLeon 0:99b5a7505a7a 1069 {
TuxLeon 0:99b5a7505a7a 1070 pixelX = POLY_X(counter);
TuxLeon 0:99b5a7505a7a 1071 if(pixelX < image_left)
TuxLeon 0:99b5a7505a7a 1072 {
TuxLeon 0:99b5a7505a7a 1073 image_left = pixelX;
TuxLeon 0:99b5a7505a7a 1074 }
TuxLeon 0:99b5a7505a7a 1075 if(pixelX > image_right)
TuxLeon 0:99b5a7505a7a 1076 {
TuxLeon 0:99b5a7505a7a 1077 image_right = pixelX;
TuxLeon 0:99b5a7505a7a 1078 }
TuxLeon 0:99b5a7505a7a 1079
TuxLeon 0:99b5a7505a7a 1080 pixelY = POLY_Y(counter);
TuxLeon 0:99b5a7505a7a 1081 if(pixelY < image_top)
TuxLeon 0:99b5a7505a7a 1082 {
TuxLeon 0:99b5a7505a7a 1083 image_top = pixelY;
TuxLeon 0:99b5a7505a7a 1084 }
TuxLeon 0:99b5a7505a7a 1085 if(pixelY > image_bottom)
TuxLeon 0:99b5a7505a7a 1086 {
TuxLeon 0:99b5a7505a7a 1087 image_bottom = pixelY;
TuxLeon 0:99b5a7505a7a 1088 }
TuxLeon 0:99b5a7505a7a 1089 }
TuxLeon 0:99b5a7505a7a 1090
TuxLeon 0:99b5a7505a7a 1091 if(PointCount < 2)
TuxLeon 0:99b5a7505a7a 1092 {
TuxLeon 0:99b5a7505a7a 1093 return;
TuxLeon 0:99b5a7505a7a 1094 }
TuxLeon 0:99b5a7505a7a 1095
TuxLeon 0:99b5a7505a7a 1096 X_center = (image_left + image_right)/2;
TuxLeon 0:99b5a7505a7a 1097 Y_center = (image_bottom + image_top)/2;
TuxLeon 0:99b5a7505a7a 1098
TuxLeon 0:99b5a7505a7a 1099 X_first = Points->X;
TuxLeon 0:99b5a7505a7a 1100 Y_first = Points->Y;
TuxLeon 0:99b5a7505a7a 1101
TuxLeon 0:99b5a7505a7a 1102 while(--PointCount)
TuxLeon 0:99b5a7505a7a 1103 {
TuxLeon 0:99b5a7505a7a 1104 X = Points->X;
TuxLeon 0:99b5a7505a7a 1105 Y = Points->Y;
TuxLeon 0:99b5a7505a7a 1106 Points++;
TuxLeon 0:99b5a7505a7a 1107 X2 = Points->X;
TuxLeon 0:99b5a7505a7a 1108 Y2 = Points->Y;
TuxLeon 0:99b5a7505a7a 1109
TuxLeon 0:99b5a7505a7a 1110 FillTriangle(X, X2, X_center, Y, Y2, Y_center);
TuxLeon 0:99b5a7505a7a 1111 FillTriangle(X, X_center, X2, Y, Y_center, Y2);
TuxLeon 0:99b5a7505a7a 1112 FillTriangle(X_center, X2, X, Y_center, Y2, Y);
TuxLeon 0:99b5a7505a7a 1113 }
TuxLeon 0:99b5a7505a7a 1114
TuxLeon 0:99b5a7505a7a 1115 FillTriangle(X_first, X2, X_center, Y_first, Y2, Y_center);
TuxLeon 0:99b5a7505a7a 1116 FillTriangle(X_first, X_center, X2, Y_first, Y_center, Y2);
TuxLeon 0:99b5a7505a7a 1117 FillTriangle(X_center, X2, X_first, Y_center, Y2, Y_first);
TuxLeon 0:99b5a7505a7a 1118 }
TuxLeon 0:99b5a7505a7a 1119
TuxLeon 0:99b5a7505a7a 1120 /**
TuxLeon 0:99b5a7505a7a 1121 * @brief Draws a full ellipse.
TuxLeon 0:99b5a7505a7a 1122 * @param Xpos: X position
TuxLeon 0:99b5a7505a7a 1123 * @param Ypos: Y position
TuxLeon 0:99b5a7505a7a 1124 * @param XRadius: Ellipse X radius
TuxLeon 0:99b5a7505a7a 1125 * @param YRadius: Ellipse Y radius
TuxLeon 0:99b5a7505a7a 1126 * @retval None
TuxLeon 0:99b5a7505a7a 1127 */
TuxLeon 0:99b5a7505a7a 1128 void BSP_LCD_FillEllipse(int Xpos, int Ypos, int XRadius, int YRadius)
TuxLeon 0:99b5a7505a7a 1129 {
TuxLeon 0:99b5a7505a7a 1130 int x = 0, y = -YRadius, err = 2-2*XRadius, e2;
TuxLeon 0:99b5a7505a7a 1131 float k = 0, rad1 = 0, rad2 = 0;
TuxLeon 0:99b5a7505a7a 1132
TuxLeon 0:99b5a7505a7a 1133 rad1 = XRadius;
TuxLeon 0:99b5a7505a7a 1134 rad2 = YRadius;
TuxLeon 0:99b5a7505a7a 1135
TuxLeon 0:99b5a7505a7a 1136 k = (float)(rad2/rad1);
TuxLeon 0:99b5a7505a7a 1137
TuxLeon 0:99b5a7505a7a 1138 do
TuxLeon 0:99b5a7505a7a 1139 {
TuxLeon 0:99b5a7505a7a 1140 BSP_LCD_DrawHLine((Xpos-(uint16_t)(x/k)), (Ypos+y), (2*(uint16_t)(x/k) + 1));
TuxLeon 0:99b5a7505a7a 1141 BSP_LCD_DrawHLine((Xpos-(uint16_t)(x/k)), (Ypos-y), (2*(uint16_t)(x/k) + 1));
TuxLeon 0:99b5a7505a7a 1142
TuxLeon 0:99b5a7505a7a 1143 e2 = err;
TuxLeon 0:99b5a7505a7a 1144 if (e2 <= x)
TuxLeon 0:99b5a7505a7a 1145 {
TuxLeon 0:99b5a7505a7a 1146 err += ++x*2+1;
TuxLeon 0:99b5a7505a7a 1147 if (-y == x && e2 <= y) e2 = 0;
TuxLeon 0:99b5a7505a7a 1148 }
TuxLeon 0:99b5a7505a7a 1149 if (e2 > y) err += ++y*2+1;
TuxLeon 0:99b5a7505a7a 1150 }
TuxLeon 0:99b5a7505a7a 1151 while (y <= 0);
TuxLeon 0:99b5a7505a7a 1152 }
TuxLeon 0:99b5a7505a7a 1153
TuxLeon 0:99b5a7505a7a 1154 /**
TuxLeon 0:99b5a7505a7a 1155 * @brief Enables the display.
TuxLeon 0:99b5a7505a7a 1156 * @retval None
TuxLeon 0:99b5a7505a7a 1157 */
TuxLeon 0:99b5a7505a7a 1158 void BSP_LCD_DisplayOn(void)
TuxLeon 0:99b5a7505a7a 1159 {
TuxLeon 0:99b5a7505a7a 1160 /* Display On */
TuxLeon 0:99b5a7505a7a 1161 __HAL_LTDC_ENABLE(&hLtdcHandler);
TuxLeon 0:99b5a7505a7a 1162 HAL_GPIO_WritePin(LCD_DISP_GPIO_PORT, LCD_DISP_PIN, GPIO_PIN_SET); /* Assert LCD_DISP pin */
TuxLeon 0:99b5a7505a7a 1163 HAL_GPIO_WritePin(LCD_BL_CTRL_GPIO_PORT, LCD_BL_CTRL_PIN, GPIO_PIN_SET); /* Assert LCD_BL_CTRL pin */
TuxLeon 0:99b5a7505a7a 1164 }
TuxLeon 0:99b5a7505a7a 1165
TuxLeon 0:99b5a7505a7a 1166 /**
TuxLeon 0:99b5a7505a7a 1167 * @brief Disables the display.
TuxLeon 0:99b5a7505a7a 1168 * @retval None
TuxLeon 0:99b5a7505a7a 1169 */
TuxLeon 0:99b5a7505a7a 1170 void BSP_LCD_DisplayOff(void)
TuxLeon 0:99b5a7505a7a 1171 {
TuxLeon 0:99b5a7505a7a 1172 /* Display Off */
TuxLeon 0:99b5a7505a7a 1173 __HAL_LTDC_DISABLE(&hLtdcHandler);
TuxLeon 0:99b5a7505a7a 1174 HAL_GPIO_WritePin(LCD_DISP_GPIO_PORT, LCD_DISP_PIN, GPIO_PIN_RESET); /* De-assert LCD_DISP pin */
TuxLeon 0:99b5a7505a7a 1175 HAL_GPIO_WritePin(LCD_BL_CTRL_GPIO_PORT, LCD_BL_CTRL_PIN, GPIO_PIN_RESET);/* De-assert LCD_BL_CTRL pin */
TuxLeon 0:99b5a7505a7a 1176 }
TuxLeon 0:99b5a7505a7a 1177
TuxLeon 0:99b5a7505a7a 1178 /**
TuxLeon 0:99b5a7505a7a 1179 * @brief Initializes the LTDC MSP.
TuxLeon 0:99b5a7505a7a 1180 * @param hltdc: LTDC handle
TuxLeon 0:99b5a7505a7a 1181 * @param Params
TuxLeon 0:99b5a7505a7a 1182 * @retval None
TuxLeon 0:99b5a7505a7a 1183 */
TuxLeon 0:99b5a7505a7a 1184 __weak void BSP_LCD_MspInit(LTDC_HandleTypeDef *hltdc, void *Params)
TuxLeon 0:99b5a7505a7a 1185 {
TuxLeon 0:99b5a7505a7a 1186 GPIO_InitTypeDef gpio_init_structure;
TuxLeon 0:99b5a7505a7a 1187
TuxLeon 0:99b5a7505a7a 1188 /* Enable the LTDC and DMA2D clocks */
TuxLeon 0:99b5a7505a7a 1189 __HAL_RCC_LTDC_CLK_ENABLE();
TuxLeon 0:99b5a7505a7a 1190 __HAL_RCC_DMA2D_CLK_ENABLE();
TuxLeon 0:99b5a7505a7a 1191
TuxLeon 0:99b5a7505a7a 1192 /* Enable GPIOs clock */
TuxLeon 0:99b5a7505a7a 1193 __HAL_RCC_GPIOE_CLK_ENABLE();
TuxLeon 0:99b5a7505a7a 1194 __HAL_RCC_GPIOG_CLK_ENABLE();
TuxLeon 0:99b5a7505a7a 1195 __HAL_RCC_GPIOI_CLK_ENABLE();
TuxLeon 0:99b5a7505a7a 1196 __HAL_RCC_GPIOJ_CLK_ENABLE();
TuxLeon 0:99b5a7505a7a 1197 __HAL_RCC_GPIOK_CLK_ENABLE();
TuxLeon 0:99b5a7505a7a 1198 LCD_DISP_GPIO_CLK_ENABLE();
TuxLeon 0:99b5a7505a7a 1199 LCD_BL_CTRL_GPIO_CLK_ENABLE();
TuxLeon 0:99b5a7505a7a 1200
TuxLeon 0:99b5a7505a7a 1201 /*** LTDC Pins configuration ***/
TuxLeon 0:99b5a7505a7a 1202 /* GPIOE configuration */
TuxLeon 0:99b5a7505a7a 1203 gpio_init_structure.Pin = GPIO_PIN_4;
TuxLeon 0:99b5a7505a7a 1204 gpio_init_structure.Mode = GPIO_MODE_AF_PP;
TuxLeon 0:99b5a7505a7a 1205 gpio_init_structure.Pull = GPIO_NOPULL;
TuxLeon 0:99b5a7505a7a 1206 gpio_init_structure.Speed = GPIO_SPEED_FAST;
TuxLeon 0:99b5a7505a7a 1207 gpio_init_structure.Alternate = GPIO_AF14_LTDC;
TuxLeon 0:99b5a7505a7a 1208 HAL_GPIO_Init(GPIOE, &gpio_init_structure);
TuxLeon 0:99b5a7505a7a 1209
TuxLeon 0:99b5a7505a7a 1210 /* GPIOG configuration */
TuxLeon 0:99b5a7505a7a 1211 gpio_init_structure.Pin = GPIO_PIN_12;
TuxLeon 0:99b5a7505a7a 1212 gpio_init_structure.Mode = GPIO_MODE_AF_PP;
TuxLeon 0:99b5a7505a7a 1213 gpio_init_structure.Alternate = GPIO_AF9_LTDC;
TuxLeon 0:99b5a7505a7a 1214 HAL_GPIO_Init(GPIOG, &gpio_init_structure);
TuxLeon 0:99b5a7505a7a 1215
TuxLeon 0:99b5a7505a7a 1216 /* GPIOI LTDC alternate configuration */
TuxLeon 0:99b5a7505a7a 1217 gpio_init_structure.Pin = GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | \
TuxLeon 0:99b5a7505a7a 1218 GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15;
TuxLeon 0:99b5a7505a7a 1219 gpio_init_structure.Mode = GPIO_MODE_AF_PP;
TuxLeon 0:99b5a7505a7a 1220 gpio_init_structure.Alternate = GPIO_AF14_LTDC;
TuxLeon 0:99b5a7505a7a 1221 HAL_GPIO_Init(GPIOI, &gpio_init_structure);
TuxLeon 0:99b5a7505a7a 1222
TuxLeon 0:99b5a7505a7a 1223 /* GPIOJ configuration */
TuxLeon 0:99b5a7505a7a 1224 gpio_init_structure.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | \
TuxLeon 0:99b5a7505a7a 1225 GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7 | \
TuxLeon 0:99b5a7505a7a 1226 GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11 | \
TuxLeon 0:99b5a7505a7a 1227 GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15;
TuxLeon 0:99b5a7505a7a 1228 gpio_init_structure.Mode = GPIO_MODE_AF_PP;
TuxLeon 0:99b5a7505a7a 1229 gpio_init_structure.Alternate = GPIO_AF14_LTDC;
TuxLeon 0:99b5a7505a7a 1230 HAL_GPIO_Init(GPIOJ, &gpio_init_structure);
TuxLeon 0:99b5a7505a7a 1231
TuxLeon 0:99b5a7505a7a 1232 /* GPIOK configuration */
TuxLeon 0:99b5a7505a7a 1233 gpio_init_structure.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_4 | \
TuxLeon 0:99b5a7505a7a 1234 GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7;
TuxLeon 0:99b5a7505a7a 1235 gpio_init_structure.Mode = GPIO_MODE_AF_PP;
TuxLeon 0:99b5a7505a7a 1236 gpio_init_structure.Alternate = GPIO_AF14_LTDC;
TuxLeon 0:99b5a7505a7a 1237 HAL_GPIO_Init(GPIOK, &gpio_init_structure);
TuxLeon 0:99b5a7505a7a 1238
TuxLeon 0:99b5a7505a7a 1239 /* LCD_DISP GPIO configuration */
TuxLeon 0:99b5a7505a7a 1240 gpio_init_structure.Pin = LCD_DISP_PIN; /* LCD_DISP pin has to be manually controlled */
TuxLeon 0:99b5a7505a7a 1241 gpio_init_structure.Mode = GPIO_MODE_OUTPUT_PP;
TuxLeon 0:99b5a7505a7a 1242 HAL_GPIO_Init(LCD_DISP_GPIO_PORT, &gpio_init_structure);
TuxLeon 0:99b5a7505a7a 1243
TuxLeon 0:99b5a7505a7a 1244 /* LCD_BL_CTRL GPIO configuration */
TuxLeon 0:99b5a7505a7a 1245 gpio_init_structure.Pin = LCD_BL_CTRL_PIN; /* LCD_BL_CTRL pin has to be manually controlled */
TuxLeon 0:99b5a7505a7a 1246 gpio_init_structure.Mode = GPIO_MODE_OUTPUT_PP;
TuxLeon 0:99b5a7505a7a 1247 HAL_GPIO_Init(LCD_BL_CTRL_GPIO_PORT, &gpio_init_structure);
TuxLeon 0:99b5a7505a7a 1248 }
TuxLeon 0:99b5a7505a7a 1249
TuxLeon 0:99b5a7505a7a 1250 /**
TuxLeon 0:99b5a7505a7a 1251 * @brief DeInitializes BSP_LCD MSP.
TuxLeon 0:99b5a7505a7a 1252 * @param hltdc: LTDC handle
TuxLeon 0:99b5a7505a7a 1253 * @param Params
TuxLeon 0:99b5a7505a7a 1254 * @retval None
TuxLeon 0:99b5a7505a7a 1255 */
TuxLeon 0:99b5a7505a7a 1256 __weak void BSP_LCD_MspDeInit(LTDC_HandleTypeDef *hltdc, void *Params)
TuxLeon 0:99b5a7505a7a 1257 {
TuxLeon 0:99b5a7505a7a 1258 GPIO_InitTypeDef gpio_init_structure;
TuxLeon 0:99b5a7505a7a 1259
TuxLeon 0:99b5a7505a7a 1260 /* Disable LTDC block */
TuxLeon 0:99b5a7505a7a 1261 __HAL_LTDC_DISABLE(hltdc);
TuxLeon 0:99b5a7505a7a 1262
TuxLeon 0:99b5a7505a7a 1263 /* LTDC Pins deactivation */
TuxLeon 0:99b5a7505a7a 1264
TuxLeon 0:99b5a7505a7a 1265 /* GPIOE deactivation */
TuxLeon 0:99b5a7505a7a 1266 gpio_init_structure.Pin = GPIO_PIN_4;
TuxLeon 0:99b5a7505a7a 1267 HAL_GPIO_DeInit(GPIOE, gpio_init_structure.Pin);
TuxLeon 0:99b5a7505a7a 1268
TuxLeon 0:99b5a7505a7a 1269 /* GPIOG deactivation */
TuxLeon 0:99b5a7505a7a 1270 gpio_init_structure.Pin = GPIO_PIN_12;
TuxLeon 0:99b5a7505a7a 1271 HAL_GPIO_DeInit(GPIOG, gpio_init_structure.Pin);
TuxLeon 0:99b5a7505a7a 1272
TuxLeon 0:99b5a7505a7a 1273 /* GPIOI deactivation */
TuxLeon 0:99b5a7505a7a 1274 gpio_init_structure.Pin = GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_12 | \
TuxLeon 0:99b5a7505a7a 1275 GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15;
TuxLeon 0:99b5a7505a7a 1276 HAL_GPIO_DeInit(GPIOI, gpio_init_structure.Pin);
TuxLeon 0:99b5a7505a7a 1277
TuxLeon 0:99b5a7505a7a 1278 /* GPIOJ deactivation */
TuxLeon 0:99b5a7505a7a 1279 gpio_init_structure.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | \
TuxLeon 0:99b5a7505a7a 1280 GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7 | \
TuxLeon 0:99b5a7505a7a 1281 GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11 | \
TuxLeon 0:99b5a7505a7a 1282 GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15;
TuxLeon 0:99b5a7505a7a 1283 HAL_GPIO_DeInit(GPIOJ, gpio_init_structure.Pin);
TuxLeon 0:99b5a7505a7a 1284
TuxLeon 0:99b5a7505a7a 1285 /* GPIOK deactivation */
TuxLeon 0:99b5a7505a7a 1286 gpio_init_structure.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_4 | \
TuxLeon 0:99b5a7505a7a 1287 GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7;
TuxLeon 0:99b5a7505a7a 1288 HAL_GPIO_DeInit(GPIOK, gpio_init_structure.Pin);
TuxLeon 0:99b5a7505a7a 1289
TuxLeon 0:99b5a7505a7a 1290 /* Disable LTDC clock */
TuxLeon 0:99b5a7505a7a 1291 __HAL_RCC_LTDC_CLK_DISABLE();
TuxLeon 0:99b5a7505a7a 1292
TuxLeon 0:99b5a7505a7a 1293 /* GPIO pins clock can be shut down in the application
TuxLeon 0:99b5a7505a7a 1294 by surcharging this __weak function */
TuxLeon 0:99b5a7505a7a 1295 }
TuxLeon 0:99b5a7505a7a 1296
TuxLeon 0:99b5a7505a7a 1297 /**
TuxLeon 0:99b5a7505a7a 1298 * @brief Clock Config.
TuxLeon 0:99b5a7505a7a 1299 * @param hltdc: LTDC handle
TuxLeon 0:99b5a7505a7a 1300 * @param Params
TuxLeon 0:99b5a7505a7a 1301 * @note This API is called by BSP_LCD_Init()
TuxLeon 0:99b5a7505a7a 1302 * Being __weak it can be overwritten by the application
TuxLeon 0:99b5a7505a7a 1303 * @retval None
TuxLeon 0:99b5a7505a7a 1304 */
TuxLeon 0:99b5a7505a7a 1305 __weak void BSP_LCD_ClockConfig(LTDC_HandleTypeDef *hltdc, void *Params)
TuxLeon 0:99b5a7505a7a 1306 {
TuxLeon 0:99b5a7505a7a 1307 static RCC_PeriphCLKInitTypeDef periph_clk_init_struct;
TuxLeon 0:99b5a7505a7a 1308
TuxLeon 0:99b5a7505a7a 1309 /* RK043FN48H LCD clock configuration */
TuxLeon 0:99b5a7505a7a 1310 /* PLLSAI_VCO Input = HSE_VALUE/PLL_M = 1 Mhz */
TuxLeon 0:99b5a7505a7a 1311 /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN = 192 Mhz */
TuxLeon 0:99b5a7505a7a 1312 /* PLLLCDCLK = PLLSAI_VCO Output/PLLSAIR = 192/5 = 38.4 Mhz */
TuxLeon 0:99b5a7505a7a 1313 /* LTDC clock frequency = PLLLCDCLK / LTDC_PLLSAI_DIVR_4 = 38.4/4 = 9.6Mhz */
TuxLeon 0:99b5a7505a7a 1314 periph_clk_init_struct.PeriphClockSelection = RCC_PERIPHCLK_LTDC;
TuxLeon 0:99b5a7505a7a 1315 periph_clk_init_struct.PLLSAI.PLLSAIN = 192;
TuxLeon 0:99b5a7505a7a 1316 periph_clk_init_struct.PLLSAI.PLLSAIR = RK043FN48H_FREQUENCY_DIVIDER;
TuxLeon 0:99b5a7505a7a 1317 periph_clk_init_struct.PLLSAIDivR = RCC_PLLSAIDIVR_4;
TuxLeon 0:99b5a7505a7a 1318 HAL_RCCEx_PeriphCLKConfig(&periph_clk_init_struct);
TuxLeon 0:99b5a7505a7a 1319 }
TuxLeon 0:99b5a7505a7a 1320
TuxLeon 0:99b5a7505a7a 1321
TuxLeon 0:99b5a7505a7a 1322 /*******************************************************************************
TuxLeon 0:99b5a7505a7a 1323 Static Functions
TuxLeon 0:99b5a7505a7a 1324 *******************************************************************************/
TuxLeon 0:99b5a7505a7a 1325
TuxLeon 0:99b5a7505a7a 1326 /**
TuxLeon 0:99b5a7505a7a 1327 * @brief Draws a character on LCD.
TuxLeon 0:99b5a7505a7a 1328 * @param Xpos: Line where to display the character shape
TuxLeon 0:99b5a7505a7a 1329 * @param Ypos: Start column address
TuxLeon 0:99b5a7505a7a 1330 * @param c: Pointer to the character data
TuxLeon 0:99b5a7505a7a 1331 * @retval None
TuxLeon 0:99b5a7505a7a 1332 */
TuxLeon 0:99b5a7505a7a 1333 static void DrawChar(uint16_t Xpos, uint16_t Ypos, const uint8_t *c)
TuxLeon 0:99b5a7505a7a 1334 {
TuxLeon 0:99b5a7505a7a 1335 uint32_t i = 0, j = 0;
TuxLeon 0:99b5a7505a7a 1336 uint16_t height, width;
TuxLeon 0:99b5a7505a7a 1337 uint8_t offset;
TuxLeon 0:99b5a7505a7a 1338 uint8_t *pchar;
TuxLeon 0:99b5a7505a7a 1339 uint32_t line;
TuxLeon 0:99b5a7505a7a 1340
TuxLeon 0:99b5a7505a7a 1341 height = DrawProp[ActiveLayer].pFont->Height;
TuxLeon 0:99b5a7505a7a 1342 width = DrawProp[ActiveLayer].pFont->Width;
TuxLeon 0:99b5a7505a7a 1343
TuxLeon 0:99b5a7505a7a 1344 offset = 8 *((width + 7)/8) - width ;
TuxLeon 0:99b5a7505a7a 1345
TuxLeon 0:99b5a7505a7a 1346 for(i = 0; i < height; i++)
TuxLeon 0:99b5a7505a7a 1347 {
TuxLeon 0:99b5a7505a7a 1348 pchar = ((uint8_t *)c + (width + 7)/8 * i);
TuxLeon 0:99b5a7505a7a 1349
TuxLeon 0:99b5a7505a7a 1350 switch(((width + 7)/8))
TuxLeon 0:99b5a7505a7a 1351 {
TuxLeon 0:99b5a7505a7a 1352
TuxLeon 0:99b5a7505a7a 1353 case 1:
TuxLeon 0:99b5a7505a7a 1354 line = pchar[0];
TuxLeon 0:99b5a7505a7a 1355 break;
TuxLeon 0:99b5a7505a7a 1356
TuxLeon 0:99b5a7505a7a 1357 case 2:
TuxLeon 0:99b5a7505a7a 1358 line = (pchar[0]<< 8) | pchar[1];
TuxLeon 0:99b5a7505a7a 1359 break;
TuxLeon 0:99b5a7505a7a 1360
TuxLeon 0:99b5a7505a7a 1361 case 3:
TuxLeon 0:99b5a7505a7a 1362 default:
TuxLeon 0:99b5a7505a7a 1363 line = (pchar[0]<< 16) | (pchar[1]<< 8) | pchar[2];
TuxLeon 0:99b5a7505a7a 1364 break;
TuxLeon 0:99b5a7505a7a 1365 }
TuxLeon 0:99b5a7505a7a 1366
TuxLeon 0:99b5a7505a7a 1367 for (j = 0; j < width; j++)
TuxLeon 0:99b5a7505a7a 1368 {
TuxLeon 0:99b5a7505a7a 1369 if(line & (1 << (width- j + offset- 1)))
TuxLeon 0:99b5a7505a7a 1370 {
TuxLeon 0:99b5a7505a7a 1371 BSP_LCD_DrawPixel((Xpos + j), Ypos, DrawProp[ActiveLayer].TextColor);
TuxLeon 0:99b5a7505a7a 1372 }
TuxLeon 0:99b5a7505a7a 1373 else
TuxLeon 0:99b5a7505a7a 1374 {
TuxLeon 0:99b5a7505a7a 1375 BSP_LCD_DrawPixel((Xpos + j), Ypos, DrawProp[ActiveLayer].BackColor);
TuxLeon 0:99b5a7505a7a 1376 }
TuxLeon 0:99b5a7505a7a 1377 }
TuxLeon 0:99b5a7505a7a 1378 Ypos++;
TuxLeon 0:99b5a7505a7a 1379 }
TuxLeon 0:99b5a7505a7a 1380 }
TuxLeon 0:99b5a7505a7a 1381
TuxLeon 0:99b5a7505a7a 1382 /**
TuxLeon 0:99b5a7505a7a 1383 * @brief Fills a triangle (between 3 points).
TuxLeon 0:99b5a7505a7a 1384 * @param x1: Point 1 X position
TuxLeon 0:99b5a7505a7a 1385 * @param y1: Point 1 Y position
TuxLeon 0:99b5a7505a7a 1386 * @param x2: Point 2 X position
TuxLeon 0:99b5a7505a7a 1387 * @param y2: Point 2 Y position
TuxLeon 0:99b5a7505a7a 1388 * @param x3: Point 3 X position
TuxLeon 0:99b5a7505a7a 1389 * @param y3: Point 3 Y position
TuxLeon 0:99b5a7505a7a 1390 * @retval None
TuxLeon 0:99b5a7505a7a 1391 */
TuxLeon 0:99b5a7505a7a 1392 static void FillTriangle(uint16_t x1, uint16_t x2, uint16_t x3, uint16_t y1, uint16_t y2, uint16_t y3)
TuxLeon 0:99b5a7505a7a 1393 {
TuxLeon 0:99b5a7505a7a 1394 int16_t deltax = 0, deltay = 0, x = 0, y = 0, xinc1 = 0, xinc2 = 0,
TuxLeon 0:99b5a7505a7a 1395 yinc1 = 0, yinc2 = 0, den = 0, num = 0, num_add = 0, num_pixels = 0,
TuxLeon 0:99b5a7505a7a 1396 curpixel = 0;
TuxLeon 0:99b5a7505a7a 1397
TuxLeon 0:99b5a7505a7a 1398 deltax = ABS(x2 - x1); /* The difference between the x's */
TuxLeon 0:99b5a7505a7a 1399 deltay = ABS(y2 - y1); /* The difference between the y's */
TuxLeon 0:99b5a7505a7a 1400 x = x1; /* Start x off at the first pixel */
TuxLeon 0:99b5a7505a7a 1401 y = y1; /* Start y off at the first pixel */
TuxLeon 0:99b5a7505a7a 1402
TuxLeon 0:99b5a7505a7a 1403 if (x2 >= x1) /* The x-values are increasing */
TuxLeon 0:99b5a7505a7a 1404 {
TuxLeon 0:99b5a7505a7a 1405 xinc1 = 1;
TuxLeon 0:99b5a7505a7a 1406 xinc2 = 1;
TuxLeon 0:99b5a7505a7a 1407 }
TuxLeon 0:99b5a7505a7a 1408 else /* The x-values are decreasing */
TuxLeon 0:99b5a7505a7a 1409 {
TuxLeon 0:99b5a7505a7a 1410 xinc1 = -1;
TuxLeon 0:99b5a7505a7a 1411 xinc2 = -1;
TuxLeon 0:99b5a7505a7a 1412 }
TuxLeon 0:99b5a7505a7a 1413
TuxLeon 0:99b5a7505a7a 1414 if (y2 >= y1) /* The y-values are increasing */
TuxLeon 0:99b5a7505a7a 1415 {
TuxLeon 0:99b5a7505a7a 1416 yinc1 = 1;
TuxLeon 0:99b5a7505a7a 1417 yinc2 = 1;
TuxLeon 0:99b5a7505a7a 1418 }
TuxLeon 0:99b5a7505a7a 1419 else /* The y-values are decreasing */
TuxLeon 0:99b5a7505a7a 1420 {
TuxLeon 0:99b5a7505a7a 1421 yinc1 = -1;
TuxLeon 0:99b5a7505a7a 1422 yinc2 = -1;
TuxLeon 0:99b5a7505a7a 1423 }
TuxLeon 0:99b5a7505a7a 1424
TuxLeon 0:99b5a7505a7a 1425 if (deltax >= deltay) /* There is at least one x-value for every y-value */
TuxLeon 0:99b5a7505a7a 1426 {
TuxLeon 0:99b5a7505a7a 1427 xinc1 = 0; /* Don't change the x when numerator >= denominator */
TuxLeon 0:99b5a7505a7a 1428 yinc2 = 0; /* Don't change the y for every iteration */
TuxLeon 0:99b5a7505a7a 1429 den = deltax;
TuxLeon 0:99b5a7505a7a 1430 num = deltax / 2;
TuxLeon 0:99b5a7505a7a 1431 num_add = deltay;
TuxLeon 0:99b5a7505a7a 1432 num_pixels = deltax; /* There are more x-values than y-values */
TuxLeon 0:99b5a7505a7a 1433 }
TuxLeon 0:99b5a7505a7a 1434 else /* There is at least one y-value for every x-value */
TuxLeon 0:99b5a7505a7a 1435 {
TuxLeon 0:99b5a7505a7a 1436 xinc2 = 0; /* Don't change the x for every iteration */
TuxLeon 0:99b5a7505a7a 1437 yinc1 = 0; /* Don't change the y when numerator >= denominator */
TuxLeon 0:99b5a7505a7a 1438 den = deltay;
TuxLeon 0:99b5a7505a7a 1439 num = deltay / 2;
TuxLeon 0:99b5a7505a7a 1440 num_add = deltax;
TuxLeon 0:99b5a7505a7a 1441 num_pixels = deltay; /* There are more y-values than x-values */
TuxLeon 0:99b5a7505a7a 1442 }
TuxLeon 0:99b5a7505a7a 1443
TuxLeon 0:99b5a7505a7a 1444 for (curpixel = 0; curpixel <= num_pixels; curpixel++)
TuxLeon 0:99b5a7505a7a 1445 {
TuxLeon 0:99b5a7505a7a 1446 BSP_LCD_DrawLine(x, y, x3, y3);
TuxLeon 0:99b5a7505a7a 1447
TuxLeon 0:99b5a7505a7a 1448 num += num_add; /* Increase the numerator by the top of the fraction */
TuxLeon 0:99b5a7505a7a 1449 if (num >= den) /* Check if numerator >= denominator */
TuxLeon 0:99b5a7505a7a 1450 {
TuxLeon 0:99b5a7505a7a 1451 num -= den; /* Calculate the new numerator value */
TuxLeon 0:99b5a7505a7a 1452 x += xinc1; /* Change the x as appropriate */
TuxLeon 0:99b5a7505a7a 1453 y += yinc1; /* Change the y as appropriate */
TuxLeon 0:99b5a7505a7a 1454 }
TuxLeon 0:99b5a7505a7a 1455 x += xinc2; /* Change the x as appropriate */
TuxLeon 0:99b5a7505a7a 1456 y += yinc2; /* Change the y as appropriate */
TuxLeon 0:99b5a7505a7a 1457 }
TuxLeon 0:99b5a7505a7a 1458 }
TuxLeon 0:99b5a7505a7a 1459
TuxLeon 0:99b5a7505a7a 1460 /**
TuxLeon 0:99b5a7505a7a 1461 * @brief Fills a buffer.
TuxLeon 0:99b5a7505a7a 1462 * @param LayerIndex: Layer index
TuxLeon 0:99b5a7505a7a 1463 * @param pDst: Pointer to destination buffer
TuxLeon 0:99b5a7505a7a 1464 * @param xSize: Buffer width
TuxLeon 0:99b5a7505a7a 1465 * @param ySize: Buffer height
TuxLeon 0:99b5a7505a7a 1466 * @param OffLine: Offset
TuxLeon 0:99b5a7505a7a 1467 * @param ColorIndex: Color index
TuxLeon 0:99b5a7505a7a 1468 * @retval None
TuxLeon 0:99b5a7505a7a 1469 */
TuxLeon 0:99b5a7505a7a 1470 static void LL_FillBuffer(uint32_t LayerIndex, void *pDst, uint32_t xSize, uint32_t ySize, uint32_t OffLine, uint32_t ColorIndex)
TuxLeon 0:99b5a7505a7a 1471 {
TuxLeon 0:99b5a7505a7a 1472 /* Register to memory mode with ARGB8888 as color Mode */
TuxLeon 0:99b5a7505a7a 1473 hDma2dHandler.Init.Mode = DMA2D_R2M;
TuxLeon 0:99b5a7505a7a 1474 if(hLtdcHandler.LayerCfg[ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_RGB565)
TuxLeon 0:99b5a7505a7a 1475 { /* RGB565 format */
TuxLeon 0:99b5a7505a7a 1476 hDma2dHandler.Init.ColorMode = DMA2D_RGB565;
TuxLeon 0:99b5a7505a7a 1477 }
TuxLeon 0:99b5a7505a7a 1478 else
TuxLeon 0:99b5a7505a7a 1479 { /* ARGB8888 format */
TuxLeon 0:99b5a7505a7a 1480 hDma2dHandler.Init.ColorMode = DMA2D_ARGB8888;
TuxLeon 0:99b5a7505a7a 1481 }
TuxLeon 0:99b5a7505a7a 1482 hDma2dHandler.Init.OutputOffset = OffLine;
TuxLeon 0:99b5a7505a7a 1483
TuxLeon 0:99b5a7505a7a 1484 hDma2dHandler.Instance = DMA2D;
TuxLeon 0:99b5a7505a7a 1485
TuxLeon 0:99b5a7505a7a 1486 /* DMA2D Initialization */
TuxLeon 0:99b5a7505a7a 1487 if(HAL_DMA2D_Init(&hDma2dHandler) == HAL_OK)
TuxLeon 0:99b5a7505a7a 1488 {
TuxLeon 0:99b5a7505a7a 1489 if(HAL_DMA2D_ConfigLayer(&hDma2dHandler, LayerIndex) == HAL_OK)
TuxLeon 0:99b5a7505a7a 1490 {
TuxLeon 0:99b5a7505a7a 1491 if (HAL_DMA2D_Start(&hDma2dHandler, ColorIndex, (uint32_t)pDst, xSize, ySize) == HAL_OK)
TuxLeon 0:99b5a7505a7a 1492 {
TuxLeon 0:99b5a7505a7a 1493 /* Polling For DMA transfer */
TuxLeon 0:99b5a7505a7a 1494 HAL_DMA2D_PollForTransfer(&hDma2dHandler, 10);
TuxLeon 0:99b5a7505a7a 1495 }
TuxLeon 0:99b5a7505a7a 1496 }
TuxLeon 0:99b5a7505a7a 1497 }
TuxLeon 0:99b5a7505a7a 1498 }
TuxLeon 0:99b5a7505a7a 1499
TuxLeon 0:99b5a7505a7a 1500 /**
TuxLeon 0:99b5a7505a7a 1501 * @brief Converts a line to an ARGB8888 pixel format.
TuxLeon 0:99b5a7505a7a 1502 * @param pSrc: Pointer to source buffer
TuxLeon 0:99b5a7505a7a 1503 * @param pDst: Output color
TuxLeon 0:99b5a7505a7a 1504 * @param xSize: Buffer width
TuxLeon 0:99b5a7505a7a 1505 * @param ColorMode: Input color mode
TuxLeon 0:99b5a7505a7a 1506 * @retval None
TuxLeon 0:99b5a7505a7a 1507 */
TuxLeon 0:99b5a7505a7a 1508 static void LL_ConvertLineToARGB8888(void *pSrc, void *pDst, uint32_t xSize, uint32_t ColorMode)
TuxLeon 0:99b5a7505a7a 1509 {
TuxLeon 0:99b5a7505a7a 1510 /* Configure the DMA2D Mode, Color Mode and output offset */
TuxLeon 0:99b5a7505a7a 1511 hDma2dHandler.Init.Mode = DMA2D_M2M_PFC;
TuxLeon 0:99b5a7505a7a 1512 hDma2dHandler.Init.ColorMode = DMA2D_ARGB8888;
TuxLeon 0:99b5a7505a7a 1513 hDma2dHandler.Init.OutputOffset = 0;
TuxLeon 0:99b5a7505a7a 1514
TuxLeon 0:99b5a7505a7a 1515 /* Foreground Configuration */
TuxLeon 0:99b5a7505a7a 1516 hDma2dHandler.LayerCfg[1].AlphaMode = DMA2D_NO_MODIF_ALPHA;
TuxLeon 0:99b5a7505a7a 1517 hDma2dHandler.LayerCfg[1].InputAlpha = 0xFF;
TuxLeon 0:99b5a7505a7a 1518 hDma2dHandler.LayerCfg[1].InputColorMode = ColorMode;
TuxLeon 0:99b5a7505a7a 1519 hDma2dHandler.LayerCfg[1].InputOffset = 0;
TuxLeon 0:99b5a7505a7a 1520
TuxLeon 0:99b5a7505a7a 1521 hDma2dHandler.Instance = DMA2D;
TuxLeon 0:99b5a7505a7a 1522
TuxLeon 0:99b5a7505a7a 1523 /* DMA2D Initialization */
TuxLeon 0:99b5a7505a7a 1524 if(HAL_DMA2D_Init(&hDma2dHandler) == HAL_OK)
TuxLeon 0:99b5a7505a7a 1525 {
TuxLeon 0:99b5a7505a7a 1526 if(HAL_DMA2D_ConfigLayer(&hDma2dHandler, 1) == HAL_OK)
TuxLeon 0:99b5a7505a7a 1527 {
TuxLeon 0:99b5a7505a7a 1528 if (HAL_DMA2D_Start(&hDma2dHandler, (uint32_t)pSrc, (uint32_t)pDst, xSize, 1) == HAL_OK)
TuxLeon 0:99b5a7505a7a 1529 {
TuxLeon 0:99b5a7505a7a 1530 /* Polling For DMA transfer */
TuxLeon 0:99b5a7505a7a 1531 HAL_DMA2D_PollForTransfer(&hDma2dHandler, 10);
TuxLeon 0:99b5a7505a7a 1532 }
TuxLeon 0:99b5a7505a7a 1533 }
TuxLeon 0:99b5a7505a7a 1534 }
TuxLeon 0:99b5a7505a7a 1535 }
TuxLeon 0:99b5a7505a7a 1536
TuxLeon 0:99b5a7505a7a 1537 /**
TuxLeon 0:99b5a7505a7a 1538 * @}
TuxLeon 0:99b5a7505a7a 1539 */
TuxLeon 0:99b5a7505a7a 1540
TuxLeon 0:99b5a7505a7a 1541 /**
TuxLeon 0:99b5a7505a7a 1542 * @}
TuxLeon 0:99b5a7505a7a 1543 */
TuxLeon 0:99b5a7505a7a 1544
TuxLeon 0:99b5a7505a7a 1545 /**
TuxLeon 0:99b5a7505a7a 1546 * @}
TuxLeon 0:99b5a7505a7a 1547 */
TuxLeon 0:99b5a7505a7a 1548
TuxLeon 0:99b5a7505a7a 1549 /**
TuxLeon 0:99b5a7505a7a 1550 * @}
TuxLeon 0:99b5a7505a7a 1551 */
TuxLeon 0:99b5a7505a7a 1552
TuxLeon 0:99b5a7505a7a 1553 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/