BSP Drivers

Dependencies:   CMSIS_STM32L4xx CMSIS_DSP_401 STM32L4xx_HAL_Driver

Dependents:   DiscoAudioRecord

Committer:
EricLew
Date:
Mon Nov 02 19:38:36 2015 +0000
Revision:
0:ad9dfc0179dc
commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
EricLew 0:ad9dfc0179dc 1 /**
EricLew 0:ad9dfc0179dc 2 ******************************************************************************
EricLew 0:ad9dfc0179dc 3 * @file stm32_adafruit_lcd.c
EricLew 0:ad9dfc0179dc 4 * @author MCD Application Team
EricLew 0:ad9dfc0179dc 5 * @version V2.0.0
EricLew 0:ad9dfc0179dc 6 * @date 10-September-2015
EricLew 0:ad9dfc0179dc 7 * @brief This file includes the driver for Liquid Crystal Display (LCD) module
EricLew 0:ad9dfc0179dc 8 * mounted on the Adafruit 1.8" TFT LCD shield (reference ID 802),
EricLew 0:ad9dfc0179dc 9 * that is used with the STM32 Nucleo board through SPI interface.
EricLew 0:ad9dfc0179dc 10 ******************************************************************************
EricLew 0:ad9dfc0179dc 11 * @attention
EricLew 0:ad9dfc0179dc 12 *
EricLew 0:ad9dfc0179dc 13 * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
EricLew 0:ad9dfc0179dc 14 *
EricLew 0:ad9dfc0179dc 15 * Redistribution and use in source and binary forms, with or without modification,
EricLew 0:ad9dfc0179dc 16 * are permitted provided that the following conditions are met:
EricLew 0:ad9dfc0179dc 17 * 1. Redistributions of source code must retain the above copyright notice,
EricLew 0:ad9dfc0179dc 18 * this list of conditions and the following disclaimer.
EricLew 0:ad9dfc0179dc 19 * 2. Redistributions in binary form must reproduce the above copyright notice,
EricLew 0:ad9dfc0179dc 20 * this list of conditions and the following disclaimer in the documentation
EricLew 0:ad9dfc0179dc 21 * and/or other materials provided with the distribution.
EricLew 0:ad9dfc0179dc 22 * 3. Neither the name of STMicroelectronics nor the names of its contributors
EricLew 0:ad9dfc0179dc 23 * may be used to endorse or promote products derived from this software
EricLew 0:ad9dfc0179dc 24 * without specific prior written permission.
EricLew 0:ad9dfc0179dc 25 *
EricLew 0:ad9dfc0179dc 26 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
EricLew 0:ad9dfc0179dc 27 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
EricLew 0:ad9dfc0179dc 28 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
EricLew 0:ad9dfc0179dc 29 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
EricLew 0:ad9dfc0179dc 30 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
EricLew 0:ad9dfc0179dc 31 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
EricLew 0:ad9dfc0179dc 32 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
EricLew 0:ad9dfc0179dc 33 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
EricLew 0:ad9dfc0179dc 34 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
EricLew 0:ad9dfc0179dc 35 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
EricLew 0:ad9dfc0179dc 36 *
EricLew 0:ad9dfc0179dc 37 ******************************************************************************
EricLew 0:ad9dfc0179dc 38 */
EricLew 0:ad9dfc0179dc 39
EricLew 0:ad9dfc0179dc 40 /* File Info : -----------------------------------------------------------------
EricLew 0:ad9dfc0179dc 41 User NOTES
EricLew 0:ad9dfc0179dc 42 1. How To use this driver:
EricLew 0:ad9dfc0179dc 43 --------------------------
EricLew 0:ad9dfc0179dc 44 - The LCD st7735 component driver MUST be included with this driver.
EricLew 0:ad9dfc0179dc 45
EricLew 0:ad9dfc0179dc 46 2. Driver description:
EricLew 0:ad9dfc0179dc 47 ---------------------
EricLew 0:ad9dfc0179dc 48 + Initialization steps:
EricLew 0:ad9dfc0179dc 49 o Initialize the LCD using the BSP_LCD_Init() function.
EricLew 0:ad9dfc0179dc 50
EricLew 0:ad9dfc0179dc 51 + Display on LCD
EricLew 0:ad9dfc0179dc 52 o Clear the whole LCD using the BSP_LCD_Clear() function or only one specified
EricLew 0:ad9dfc0179dc 53 string line using the BSP_LCD_ClearStringLine() function.
EricLew 0:ad9dfc0179dc 54 o Display a character on the specified line and column using the BSP_LCD_DisplayChar()
EricLew 0:ad9dfc0179dc 55 function or a complete string line using the BSP_LCD_DisplayStringAtLine() function.
EricLew 0:ad9dfc0179dc 56 o Display a string line on the specified position (x,y in pixel) and align mode
EricLew 0:ad9dfc0179dc 57 using the BSP_LCD_DisplayStringAtLine() function.
EricLew 0:ad9dfc0179dc 58 o Draw and fill a basic shapes (dot, line, rectangle, circle, ellipse, ..)
EricLew 0:ad9dfc0179dc 59 on LCD using a set of functions.
EricLew 0:ad9dfc0179dc 60
EricLew 0:ad9dfc0179dc 61 ------------------------------------------------------------------------------*/
EricLew 0:ad9dfc0179dc 62
EricLew 0:ad9dfc0179dc 63 /* Includes ------------------------------------------------------------------*/
EricLew 0:ad9dfc0179dc 64 #include "stm32_adafruit_lcd.h"
EricLew 0:ad9dfc0179dc 65 #include "../../../Utilities/Fonts/fonts.h"
EricLew 0:ad9dfc0179dc 66 #include "../../../Utilities/Fonts/font24.c"
EricLew 0:ad9dfc0179dc 67 #include "../../../Utilities/Fonts/font20.c"
EricLew 0:ad9dfc0179dc 68 #include "../../../Utilities/Fonts/font16.c"
EricLew 0:ad9dfc0179dc 69 #include "../../../Utilities/Fonts/font12.c"
EricLew 0:ad9dfc0179dc 70 #include "../../../Utilities/Fonts/font8.c"
EricLew 0:ad9dfc0179dc 71
EricLew 0:ad9dfc0179dc 72 /** @addtogroup BSP
EricLew 0:ad9dfc0179dc 73 * @{
EricLew 0:ad9dfc0179dc 74 */
EricLew 0:ad9dfc0179dc 75
EricLew 0:ad9dfc0179dc 76 /** @addtogroup STM32_ADAFRUIT
EricLew 0:ad9dfc0179dc 77 * @{
EricLew 0:ad9dfc0179dc 78 */
EricLew 0:ad9dfc0179dc 79
EricLew 0:ad9dfc0179dc 80 /** @addtogroup STM32_ADAFRUIT_LCD
EricLew 0:ad9dfc0179dc 81 * @{
EricLew 0:ad9dfc0179dc 82 */
EricLew 0:ad9dfc0179dc 83
EricLew 0:ad9dfc0179dc 84 /** @defgroup STM32_ADAFRUIT_LCD_Private_TypesDefinitions
EricLew 0:ad9dfc0179dc 85 * @{
EricLew 0:ad9dfc0179dc 86 */
EricLew 0:ad9dfc0179dc 87
EricLew 0:ad9dfc0179dc 88 /**
EricLew 0:ad9dfc0179dc 89 * @}
EricLew 0:ad9dfc0179dc 90 */
EricLew 0:ad9dfc0179dc 91
EricLew 0:ad9dfc0179dc 92 /** @defgroup STM32_ADAFRUIT_LCD_Private_Defines
EricLew 0:ad9dfc0179dc 93 * @{
EricLew 0:ad9dfc0179dc 94 */
EricLew 0:ad9dfc0179dc 95 #define POLY_X(Z) ((int32_t)((Points + (Z))->X))
EricLew 0:ad9dfc0179dc 96 #define POLY_Y(Z) ((int32_t)((Points + (Z))->Y))
EricLew 0:ad9dfc0179dc 97 #define NULL (void *)0
EricLew 0:ad9dfc0179dc 98
EricLew 0:ad9dfc0179dc 99 #define MAX_HEIGHT_FONT 17
EricLew 0:ad9dfc0179dc 100 #define MAX_WIDTH_FONT 24
EricLew 0:ad9dfc0179dc 101 #define OFFSET_BITMAP 54
EricLew 0:ad9dfc0179dc 102 /**
EricLew 0:ad9dfc0179dc 103 * @}
EricLew 0:ad9dfc0179dc 104 */
EricLew 0:ad9dfc0179dc 105
EricLew 0:ad9dfc0179dc 106 /** @defgroup STM32_ADAFRUIT_LCD_Private_Macros
EricLew 0:ad9dfc0179dc 107 * @{
EricLew 0:ad9dfc0179dc 108 */
EricLew 0:ad9dfc0179dc 109 #define ABS(X) ((X) > 0 ? (X) : -(X))
EricLew 0:ad9dfc0179dc 110
EricLew 0:ad9dfc0179dc 111 /**
EricLew 0:ad9dfc0179dc 112 * @}
EricLew 0:ad9dfc0179dc 113 */
EricLew 0:ad9dfc0179dc 114
EricLew 0:ad9dfc0179dc 115 /** @defgroup STM32_ADAFRUIT_LCD_Private_Variables
EricLew 0:ad9dfc0179dc 116 * @{
EricLew 0:ad9dfc0179dc 117 */
EricLew 0:ad9dfc0179dc 118 LCD_DrawPropTypeDef DrawProp;
EricLew 0:ad9dfc0179dc 119
EricLew 0:ad9dfc0179dc 120 static LCD_DrvTypeDef *lcd_drv;
EricLew 0:ad9dfc0179dc 121
EricLew 0:ad9dfc0179dc 122 /* Max size of bitmap will based on a font24 (17x24) */
EricLew 0:ad9dfc0179dc 123 static uint8_t bitmap[MAX_HEIGHT_FONT*MAX_WIDTH_FONT*2+OFFSET_BITMAP] = {0};
EricLew 0:ad9dfc0179dc 124
EricLew 0:ad9dfc0179dc 125 /**
EricLew 0:ad9dfc0179dc 126 * @}
EricLew 0:ad9dfc0179dc 127 */
EricLew 0:ad9dfc0179dc 128
EricLew 0:ad9dfc0179dc 129 /** @defgroup STM32_ADAFRUIT_LCD_Private_FunctionPrototypes
EricLew 0:ad9dfc0179dc 130 * @{
EricLew 0:ad9dfc0179dc 131 */
EricLew 0:ad9dfc0179dc 132 static void DrawChar(uint16_t Xpos, uint16_t Ypos, const uint8_t *c);
EricLew 0:ad9dfc0179dc 133 static void FillTriangle(uint16_t x1, uint16_t x2, uint16_t x3, uint16_t y1, uint16_t y2, uint16_t y3);
EricLew 0:ad9dfc0179dc 134 static void SetDisplayWindow(uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height);
EricLew 0:ad9dfc0179dc 135 /**
EricLew 0:ad9dfc0179dc 136 * @}
EricLew 0:ad9dfc0179dc 137 */
EricLew 0:ad9dfc0179dc 138
EricLew 0:ad9dfc0179dc 139
EricLew 0:ad9dfc0179dc 140 /** @defgroup STM32_ADAFRUIT_LCD_Private_Functions
EricLew 0:ad9dfc0179dc 141 * @{
EricLew 0:ad9dfc0179dc 142 */
EricLew 0:ad9dfc0179dc 143
EricLew 0:ad9dfc0179dc 144 /**
EricLew 0:ad9dfc0179dc 145 * @brief Initializes the LCD.
EricLew 0:ad9dfc0179dc 146 * @param None
EricLew 0:ad9dfc0179dc 147 * @retval LCD state
EricLew 0:ad9dfc0179dc 148 */
EricLew 0:ad9dfc0179dc 149 uint8_t BSP_LCD_Init(void)
EricLew 0:ad9dfc0179dc 150 {
EricLew 0:ad9dfc0179dc 151 uint8_t ret = LCD_ERROR;
EricLew 0:ad9dfc0179dc 152
EricLew 0:ad9dfc0179dc 153 /* Default value for draw propriety */
EricLew 0:ad9dfc0179dc 154 DrawProp.BackColor = 0xFFFF;
EricLew 0:ad9dfc0179dc 155 DrawProp.pFont = &Font24;
EricLew 0:ad9dfc0179dc 156 DrawProp.TextColor = 0x0000;
EricLew 0:ad9dfc0179dc 157
EricLew 0:ad9dfc0179dc 158 lcd_drv = &st7735_drv;
EricLew 0:ad9dfc0179dc 159
EricLew 0:ad9dfc0179dc 160 /* LCD Init */
EricLew 0:ad9dfc0179dc 161 lcd_drv->Init();
EricLew 0:ad9dfc0179dc 162
EricLew 0:ad9dfc0179dc 163 /* Clear the LCD screen */
EricLew 0:ad9dfc0179dc 164 BSP_LCD_Clear(LCD_COLOR_WHITE);
EricLew 0:ad9dfc0179dc 165
EricLew 0:ad9dfc0179dc 166 /* Initialize the font */
EricLew 0:ad9dfc0179dc 167 BSP_LCD_SetFont(&LCD_DEFAULT_FONT);
EricLew 0:ad9dfc0179dc 168
EricLew 0:ad9dfc0179dc 169 ret = LCD_OK;
EricLew 0:ad9dfc0179dc 170
EricLew 0:ad9dfc0179dc 171 return ret;
EricLew 0:ad9dfc0179dc 172 }
EricLew 0:ad9dfc0179dc 173
EricLew 0:ad9dfc0179dc 174 /**
EricLew 0:ad9dfc0179dc 175 * @brief Gets the LCD X size.
EricLew 0:ad9dfc0179dc 176 * @param None
EricLew 0:ad9dfc0179dc 177 * @retval Used LCD X size
EricLew 0:ad9dfc0179dc 178 */
EricLew 0:ad9dfc0179dc 179 uint32_t BSP_LCD_GetXSize(void)
EricLew 0:ad9dfc0179dc 180 {
EricLew 0:ad9dfc0179dc 181 return(lcd_drv->GetLcdPixelWidth());
EricLew 0:ad9dfc0179dc 182 }
EricLew 0:ad9dfc0179dc 183
EricLew 0:ad9dfc0179dc 184 /**
EricLew 0:ad9dfc0179dc 185 * @brief Gets the LCD Y size.
EricLew 0:ad9dfc0179dc 186 * @param None
EricLew 0:ad9dfc0179dc 187 * @retval Used LCD Y size
EricLew 0:ad9dfc0179dc 188 */
EricLew 0:ad9dfc0179dc 189 uint32_t BSP_LCD_GetYSize(void)
EricLew 0:ad9dfc0179dc 190 {
EricLew 0:ad9dfc0179dc 191 return(lcd_drv->GetLcdPixelHeight());
EricLew 0:ad9dfc0179dc 192 }
EricLew 0:ad9dfc0179dc 193
EricLew 0:ad9dfc0179dc 194 /**
EricLew 0:ad9dfc0179dc 195 * @brief Gets the LCD text color.
EricLew 0:ad9dfc0179dc 196 * @param None
EricLew 0:ad9dfc0179dc 197 * @retval Used text color.
EricLew 0:ad9dfc0179dc 198 */
EricLew 0:ad9dfc0179dc 199 uint16_t BSP_LCD_GetTextColor(void)
EricLew 0:ad9dfc0179dc 200 {
EricLew 0:ad9dfc0179dc 201 return DrawProp.TextColor;
EricLew 0:ad9dfc0179dc 202 }
EricLew 0:ad9dfc0179dc 203
EricLew 0:ad9dfc0179dc 204 /**
EricLew 0:ad9dfc0179dc 205 * @brief Gets the LCD background color.
EricLew 0:ad9dfc0179dc 206 * @param None
EricLew 0:ad9dfc0179dc 207 * @retval Used background color
EricLew 0:ad9dfc0179dc 208 */
EricLew 0:ad9dfc0179dc 209 uint16_t BSP_LCD_GetBackColor(void)
EricLew 0:ad9dfc0179dc 210 {
EricLew 0:ad9dfc0179dc 211 return DrawProp.BackColor;
EricLew 0:ad9dfc0179dc 212 }
EricLew 0:ad9dfc0179dc 213
EricLew 0:ad9dfc0179dc 214 /**
EricLew 0:ad9dfc0179dc 215 * @brief Sets the LCD text color.
EricLew 0:ad9dfc0179dc 216 * @param Color: Text color code RGB(5-6-5)
EricLew 0:ad9dfc0179dc 217 * @retval None
EricLew 0:ad9dfc0179dc 218 */
EricLew 0:ad9dfc0179dc 219 void BSP_LCD_SetTextColor(uint16_t Color)
EricLew 0:ad9dfc0179dc 220 {
EricLew 0:ad9dfc0179dc 221 DrawProp.TextColor = Color;
EricLew 0:ad9dfc0179dc 222 }
EricLew 0:ad9dfc0179dc 223
EricLew 0:ad9dfc0179dc 224 /**
EricLew 0:ad9dfc0179dc 225 * @brief Sets the LCD background color.
EricLew 0:ad9dfc0179dc 226 * @param Color: Background color code RGB(5-6-5)
EricLew 0:ad9dfc0179dc 227 * @retval None
EricLew 0:ad9dfc0179dc 228 */
EricLew 0:ad9dfc0179dc 229 void BSP_LCD_SetBackColor(uint16_t Color)
EricLew 0:ad9dfc0179dc 230 {
EricLew 0:ad9dfc0179dc 231 DrawProp.BackColor = Color;
EricLew 0:ad9dfc0179dc 232 }
EricLew 0:ad9dfc0179dc 233
EricLew 0:ad9dfc0179dc 234 /**
EricLew 0:ad9dfc0179dc 235 * @brief Sets the LCD text font.
EricLew 0:ad9dfc0179dc 236 * @param fonts: Font to be used
EricLew 0:ad9dfc0179dc 237 * @retval None
EricLew 0:ad9dfc0179dc 238 */
EricLew 0:ad9dfc0179dc 239 void BSP_LCD_SetFont(sFONT *pFonts)
EricLew 0:ad9dfc0179dc 240 {
EricLew 0:ad9dfc0179dc 241 DrawProp.pFont = pFonts;
EricLew 0:ad9dfc0179dc 242 }
EricLew 0:ad9dfc0179dc 243
EricLew 0:ad9dfc0179dc 244 /**
EricLew 0:ad9dfc0179dc 245 * @brief Gets the LCD text font.
EricLew 0:ad9dfc0179dc 246 * @param None
EricLew 0:ad9dfc0179dc 247 * @retval Used font
EricLew 0:ad9dfc0179dc 248 */
EricLew 0:ad9dfc0179dc 249 sFONT *BSP_LCD_GetFont(void)
EricLew 0:ad9dfc0179dc 250 {
EricLew 0:ad9dfc0179dc 251 return DrawProp.pFont;
EricLew 0:ad9dfc0179dc 252 }
EricLew 0:ad9dfc0179dc 253
EricLew 0:ad9dfc0179dc 254 /**
EricLew 0:ad9dfc0179dc 255 * @brief Clears the hole LCD.
EricLew 0:ad9dfc0179dc 256 * @param Color: Color of the background
EricLew 0:ad9dfc0179dc 257 * @retval None
EricLew 0:ad9dfc0179dc 258 */
EricLew 0:ad9dfc0179dc 259 void BSP_LCD_Clear(uint16_t Color)
EricLew 0:ad9dfc0179dc 260 {
EricLew 0:ad9dfc0179dc 261 uint32_t counter = 0;
EricLew 0:ad9dfc0179dc 262 uint32_t color_backup = DrawProp.TextColor;
EricLew 0:ad9dfc0179dc 263 DrawProp.TextColor = Color;
EricLew 0:ad9dfc0179dc 264
EricLew 0:ad9dfc0179dc 265 for(counter = 0; counter < BSP_LCD_GetYSize(); counter++)
EricLew 0:ad9dfc0179dc 266 {
EricLew 0:ad9dfc0179dc 267 BSP_LCD_DrawHLine(0, counter, BSP_LCD_GetXSize());
EricLew 0:ad9dfc0179dc 268 }
EricLew 0:ad9dfc0179dc 269 DrawProp.TextColor = color_backup;
EricLew 0:ad9dfc0179dc 270 BSP_LCD_SetTextColor(DrawProp.TextColor);
EricLew 0:ad9dfc0179dc 271 }
EricLew 0:ad9dfc0179dc 272
EricLew 0:ad9dfc0179dc 273 /**
EricLew 0:ad9dfc0179dc 274 * @brief Clears the selected line.
EricLew 0:ad9dfc0179dc 275 * @param Line: Line to be cleared
EricLew 0:ad9dfc0179dc 276 * This parameter can be one of the following values:
EricLew 0:ad9dfc0179dc 277 * @arg 0..9: if the Current fonts is Font16x24
EricLew 0:ad9dfc0179dc 278 * @arg 0..19: if the Current fonts is Font12x12 or Font8x12
EricLew 0:ad9dfc0179dc 279 * @arg 0..29: if the Current fonts is Font8x8
EricLew 0:ad9dfc0179dc 280 * @retval None
EricLew 0:ad9dfc0179dc 281 */
EricLew 0:ad9dfc0179dc 282 void BSP_LCD_ClearStringLine(uint16_t Line)
EricLew 0:ad9dfc0179dc 283 {
EricLew 0:ad9dfc0179dc 284 uint32_t color_backup = DrawProp.TextColor;
EricLew 0:ad9dfc0179dc 285 DrawProp.TextColor = DrawProp.BackColor;;
EricLew 0:ad9dfc0179dc 286
EricLew 0:ad9dfc0179dc 287 /* Draw a rectangle with background color */
EricLew 0:ad9dfc0179dc 288 BSP_LCD_FillRect(0, (Line * DrawProp.pFont->Height), BSP_LCD_GetXSize(), DrawProp.pFont->Height);
EricLew 0:ad9dfc0179dc 289
EricLew 0:ad9dfc0179dc 290 DrawProp.TextColor = color_backup;
EricLew 0:ad9dfc0179dc 291 BSP_LCD_SetTextColor(DrawProp.TextColor);
EricLew 0:ad9dfc0179dc 292 }
EricLew 0:ad9dfc0179dc 293
EricLew 0:ad9dfc0179dc 294 /**
EricLew 0:ad9dfc0179dc 295 * @brief Displays one character.
EricLew 0:ad9dfc0179dc 296 * @param Xpos: Start column address
EricLew 0:ad9dfc0179dc 297 * @param Ypos: Line where to display the character shape.
EricLew 0:ad9dfc0179dc 298 * @param Ascii: Character ascii code
EricLew 0:ad9dfc0179dc 299 * This parameter must be a number between Min_Data = 0x20 and Max_Data = 0x7E
EricLew 0:ad9dfc0179dc 300 * @retval None
EricLew 0:ad9dfc0179dc 301 */
EricLew 0:ad9dfc0179dc 302 void BSP_LCD_DisplayChar(uint16_t Xpos, uint16_t Ypos, uint8_t Ascii)
EricLew 0:ad9dfc0179dc 303 {
EricLew 0:ad9dfc0179dc 304 DrawChar(Xpos, Ypos, &DrawProp.pFont->table[(Ascii-' ') *\
EricLew 0:ad9dfc0179dc 305 DrawProp.pFont->Height * ((DrawProp.pFont->Width + 7) / 8)]);
EricLew 0:ad9dfc0179dc 306 }
EricLew 0:ad9dfc0179dc 307
EricLew 0:ad9dfc0179dc 308 /**
EricLew 0:ad9dfc0179dc 309 * @brief Displays characters on the LCD.
EricLew 0:ad9dfc0179dc 310 * @param Xpos: X position (in pixel)
EricLew 0:ad9dfc0179dc 311 * @param Ypos: Y position (in pixel)
EricLew 0:ad9dfc0179dc 312 * @param Text: Pointer to string to display on LCD
EricLew 0:ad9dfc0179dc 313 * @param Mode: Display mode
EricLew 0:ad9dfc0179dc 314 * This parameter can be one of the following values:
EricLew 0:ad9dfc0179dc 315 * @arg CENTER_MODE
EricLew 0:ad9dfc0179dc 316 * @arg RIGHT_MODE
EricLew 0:ad9dfc0179dc 317 * @arg LEFT_MODE
EricLew 0:ad9dfc0179dc 318 * @retval None
EricLew 0:ad9dfc0179dc 319 */
EricLew 0:ad9dfc0179dc 320 void BSP_LCD_DisplayStringAt(uint16_t Xpos, uint16_t Ypos, uint8_t *Text, Line_ModeTypdef Mode)
EricLew 0:ad9dfc0179dc 321 {
EricLew 0:ad9dfc0179dc 322 uint16_t refcolumn = 1, i = 0;
EricLew 0:ad9dfc0179dc 323 uint32_t size = 0, xsize = 0;
EricLew 0:ad9dfc0179dc 324 uint8_t *ptr = Text;
EricLew 0:ad9dfc0179dc 325
EricLew 0:ad9dfc0179dc 326 /* Get the text size */
EricLew 0:ad9dfc0179dc 327 while (*ptr++) size ++ ;
EricLew 0:ad9dfc0179dc 328
EricLew 0:ad9dfc0179dc 329 /* Characters number per line */
EricLew 0:ad9dfc0179dc 330 xsize = (BSP_LCD_GetXSize()/DrawProp.pFont->Width);
EricLew 0:ad9dfc0179dc 331
EricLew 0:ad9dfc0179dc 332 switch (Mode)
EricLew 0:ad9dfc0179dc 333 {
EricLew 0:ad9dfc0179dc 334 case CENTER_MODE:
EricLew 0:ad9dfc0179dc 335 {
EricLew 0:ad9dfc0179dc 336 refcolumn = Xpos + ((xsize - size)* DrawProp.pFont->Width) / 2;
EricLew 0:ad9dfc0179dc 337 break;
EricLew 0:ad9dfc0179dc 338 }
EricLew 0:ad9dfc0179dc 339 case LEFT_MODE:
EricLew 0:ad9dfc0179dc 340 {
EricLew 0:ad9dfc0179dc 341 refcolumn = Xpos;
EricLew 0:ad9dfc0179dc 342 break;
EricLew 0:ad9dfc0179dc 343 }
EricLew 0:ad9dfc0179dc 344 case RIGHT_MODE:
EricLew 0:ad9dfc0179dc 345 {
EricLew 0:ad9dfc0179dc 346 refcolumn = - Xpos + ((xsize - size)*DrawProp.pFont->Width);
EricLew 0:ad9dfc0179dc 347 break;
EricLew 0:ad9dfc0179dc 348 }
EricLew 0:ad9dfc0179dc 349 default:
EricLew 0:ad9dfc0179dc 350 {
EricLew 0:ad9dfc0179dc 351 refcolumn = Xpos;
EricLew 0:ad9dfc0179dc 352 break;
EricLew 0:ad9dfc0179dc 353 }
EricLew 0:ad9dfc0179dc 354 }
EricLew 0:ad9dfc0179dc 355
EricLew 0:ad9dfc0179dc 356 /* Send the string character by character on lCD */
EricLew 0:ad9dfc0179dc 357 while ((*Text != 0) & (((BSP_LCD_GetXSize() - (i*DrawProp.pFont->Width)) & 0xFFFF) >= DrawProp.pFont->Width))
EricLew 0:ad9dfc0179dc 358 {
EricLew 0:ad9dfc0179dc 359 /* Display one character on LCD */
EricLew 0:ad9dfc0179dc 360 BSP_LCD_DisplayChar(refcolumn, Ypos, *Text);
EricLew 0:ad9dfc0179dc 361 /* Decrement the column position by 16 */
EricLew 0:ad9dfc0179dc 362 refcolumn += DrawProp.pFont->Width;
EricLew 0:ad9dfc0179dc 363 /* Point on the next character */
EricLew 0:ad9dfc0179dc 364 Text++;
EricLew 0:ad9dfc0179dc 365 i++;
EricLew 0:ad9dfc0179dc 366 }
EricLew 0:ad9dfc0179dc 367 }
EricLew 0:ad9dfc0179dc 368
EricLew 0:ad9dfc0179dc 369 /**
EricLew 0:ad9dfc0179dc 370 * @brief Displays a character on the LCD.
EricLew 0:ad9dfc0179dc 371 * @param Line: Line where to display the character shape
EricLew 0:ad9dfc0179dc 372 * This parameter can be one of the following values:
EricLew 0:ad9dfc0179dc 373 * @arg 0..19: if the Current fonts is Font8
EricLew 0:ad9dfc0179dc 374 * @arg 0..12: if the Current fonts is Font12
EricLew 0:ad9dfc0179dc 375 * @arg 0...9: if the Current fonts is Font16
EricLew 0:ad9dfc0179dc 376 * @arg 0...7: if the Current fonts is Font20
EricLew 0:ad9dfc0179dc 377 * @arg 0...5: if the Current fonts is Font24
EricLew 0:ad9dfc0179dc 378 * @param ptr: Pointer to string to display on LCD
EricLew 0:ad9dfc0179dc 379 * @retval None
EricLew 0:ad9dfc0179dc 380 */
EricLew 0:ad9dfc0179dc 381 void BSP_LCD_DisplayStringAtLine(uint16_t Line, uint8_t *ptr)
EricLew 0:ad9dfc0179dc 382 {
EricLew 0:ad9dfc0179dc 383 BSP_LCD_DisplayStringAt(0, LINE(Line), ptr, LEFT_MODE);
EricLew 0:ad9dfc0179dc 384 }
EricLew 0:ad9dfc0179dc 385
EricLew 0:ad9dfc0179dc 386 /**
EricLew 0:ad9dfc0179dc 387 * @brief Draws a pixel on LCD.
EricLew 0:ad9dfc0179dc 388 * @param Xpos: X position
EricLew 0:ad9dfc0179dc 389 * @param Ypos: Y position
EricLew 0:ad9dfc0179dc 390 * @param RGB_Code: Pixel color in RGB mode (5-6-5)
EricLew 0:ad9dfc0179dc 391 * @retval None
EricLew 0:ad9dfc0179dc 392 */
EricLew 0:ad9dfc0179dc 393 void BSP_LCD_DrawPixel(uint16_t Xpos, uint16_t Ypos, uint16_t RGB_Code)
EricLew 0:ad9dfc0179dc 394 {
EricLew 0:ad9dfc0179dc 395 if(lcd_drv->WritePixel != NULL)
EricLew 0:ad9dfc0179dc 396 {
EricLew 0:ad9dfc0179dc 397 lcd_drv->WritePixel(Xpos, Ypos, RGB_Code);
EricLew 0:ad9dfc0179dc 398 }
EricLew 0:ad9dfc0179dc 399 }
EricLew 0:ad9dfc0179dc 400
EricLew 0:ad9dfc0179dc 401 /**
EricLew 0:ad9dfc0179dc 402 * @brief Draws an horizontal line.
EricLew 0:ad9dfc0179dc 403 * @param Xpos: X position
EricLew 0:ad9dfc0179dc 404 * @param Ypos: Y position
EricLew 0:ad9dfc0179dc 405 * @param Length: Line length
EricLew 0:ad9dfc0179dc 406 * @retval None
EricLew 0:ad9dfc0179dc 407 */
EricLew 0:ad9dfc0179dc 408 void BSP_LCD_DrawHLine(uint16_t Xpos, uint16_t Ypos, uint16_t Length)
EricLew 0:ad9dfc0179dc 409 {
EricLew 0:ad9dfc0179dc 410 uint32_t index = 0;
EricLew 0:ad9dfc0179dc 411
EricLew 0:ad9dfc0179dc 412 if(lcd_drv->DrawHLine != NULL)
EricLew 0:ad9dfc0179dc 413 {
EricLew 0:ad9dfc0179dc 414 lcd_drv->DrawHLine(DrawProp.TextColor, Xpos, Ypos, Length);
EricLew 0:ad9dfc0179dc 415 }
EricLew 0:ad9dfc0179dc 416 else
EricLew 0:ad9dfc0179dc 417 {
EricLew 0:ad9dfc0179dc 418 for(index = 0; index < Length; index++)
EricLew 0:ad9dfc0179dc 419 {
EricLew 0:ad9dfc0179dc 420 BSP_LCD_DrawPixel((Xpos + index), Ypos, DrawProp.TextColor);
EricLew 0:ad9dfc0179dc 421 }
EricLew 0:ad9dfc0179dc 422 }
EricLew 0:ad9dfc0179dc 423 }
EricLew 0:ad9dfc0179dc 424
EricLew 0:ad9dfc0179dc 425 /**
EricLew 0:ad9dfc0179dc 426 * @brief Draws a vertical line.
EricLew 0:ad9dfc0179dc 427 * @param Xpos: X position
EricLew 0:ad9dfc0179dc 428 * @param Ypos: Y position
EricLew 0:ad9dfc0179dc 429 * @param Length: Line length
EricLew 0:ad9dfc0179dc 430 * @retval None
EricLew 0:ad9dfc0179dc 431 */
EricLew 0:ad9dfc0179dc 432 void BSP_LCD_DrawVLine(uint16_t Xpos, uint16_t Ypos, uint16_t Length)
EricLew 0:ad9dfc0179dc 433 {
EricLew 0:ad9dfc0179dc 434 uint32_t index = 0;
EricLew 0:ad9dfc0179dc 435
EricLew 0:ad9dfc0179dc 436 if(lcd_drv->DrawVLine != NULL)
EricLew 0:ad9dfc0179dc 437 {
EricLew 0:ad9dfc0179dc 438 lcd_drv->DrawVLine(DrawProp.TextColor, Xpos, Ypos, Length);
EricLew 0:ad9dfc0179dc 439 }
EricLew 0:ad9dfc0179dc 440 else
EricLew 0:ad9dfc0179dc 441 {
EricLew 0:ad9dfc0179dc 442 for(index = 0; index < Length; index++)
EricLew 0:ad9dfc0179dc 443 {
EricLew 0:ad9dfc0179dc 444 BSP_LCD_DrawPixel(Xpos, Ypos + index, DrawProp.TextColor);
EricLew 0:ad9dfc0179dc 445 }
EricLew 0:ad9dfc0179dc 446 }
EricLew 0:ad9dfc0179dc 447 }
EricLew 0:ad9dfc0179dc 448
EricLew 0:ad9dfc0179dc 449 /**
EricLew 0:ad9dfc0179dc 450 * @brief Draws an uni-line (between two points).
EricLew 0:ad9dfc0179dc 451 * @param x1: Point 1 X position
EricLew 0:ad9dfc0179dc 452 * @param y1: Point 1 Y position
EricLew 0:ad9dfc0179dc 453 * @param x2: Point 2 X position
EricLew 0:ad9dfc0179dc 454 * @param y2: Point 2 Y position
EricLew 0:ad9dfc0179dc 455 * @retval None
EricLew 0:ad9dfc0179dc 456 */
EricLew 0:ad9dfc0179dc 457 void BSP_LCD_DrawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2)
EricLew 0:ad9dfc0179dc 458 {
EricLew 0:ad9dfc0179dc 459 int16_t deltax = 0, deltay = 0, x = 0, y = 0, xinc1 = 0, xinc2 = 0,
EricLew 0:ad9dfc0179dc 460 yinc1 = 0, yinc2 = 0, den = 0, num = 0, numadd = 0, numpixels = 0,
EricLew 0:ad9dfc0179dc 461 curpixel = 0;
EricLew 0:ad9dfc0179dc 462
EricLew 0:ad9dfc0179dc 463 deltax = ABS(x2 - x1); /* The difference between the x's */
EricLew 0:ad9dfc0179dc 464 deltay = ABS(y2 - y1); /* The difference between the y's */
EricLew 0:ad9dfc0179dc 465 x = x1; /* Start x off at the first pixel */
EricLew 0:ad9dfc0179dc 466 y = y1; /* Start y off at the first pixel */
EricLew 0:ad9dfc0179dc 467
EricLew 0:ad9dfc0179dc 468 if (x2 >= x1) /* The x-values are increasing */
EricLew 0:ad9dfc0179dc 469 {
EricLew 0:ad9dfc0179dc 470 xinc1 = 1;
EricLew 0:ad9dfc0179dc 471 xinc2 = 1;
EricLew 0:ad9dfc0179dc 472 }
EricLew 0:ad9dfc0179dc 473 else /* The x-values are decreasing */
EricLew 0:ad9dfc0179dc 474 {
EricLew 0:ad9dfc0179dc 475 xinc1 = -1;
EricLew 0:ad9dfc0179dc 476 xinc2 = -1;
EricLew 0:ad9dfc0179dc 477 }
EricLew 0:ad9dfc0179dc 478
EricLew 0:ad9dfc0179dc 479 if (y2 >= y1) /* The y-values are increasing */
EricLew 0:ad9dfc0179dc 480 {
EricLew 0:ad9dfc0179dc 481 yinc1 = 1;
EricLew 0:ad9dfc0179dc 482 yinc2 = 1;
EricLew 0:ad9dfc0179dc 483 }
EricLew 0:ad9dfc0179dc 484 else /* The y-values are decreasing */
EricLew 0:ad9dfc0179dc 485 {
EricLew 0:ad9dfc0179dc 486 yinc1 = -1;
EricLew 0:ad9dfc0179dc 487 yinc2 = -1;
EricLew 0:ad9dfc0179dc 488 }
EricLew 0:ad9dfc0179dc 489
EricLew 0:ad9dfc0179dc 490 if (deltax >= deltay) /* There is at least one x-value for every y-value */
EricLew 0:ad9dfc0179dc 491 {
EricLew 0:ad9dfc0179dc 492 xinc1 = 0; /* Don't change the x when numerator >= denominator */
EricLew 0:ad9dfc0179dc 493 yinc2 = 0; /* Don't change the y for every iteration */
EricLew 0:ad9dfc0179dc 494 den = deltax;
EricLew 0:ad9dfc0179dc 495 num = deltax / 2;
EricLew 0:ad9dfc0179dc 496 numadd = deltay;
EricLew 0:ad9dfc0179dc 497 numpixels = deltax; /* There are more x-values than y-values */
EricLew 0:ad9dfc0179dc 498 }
EricLew 0:ad9dfc0179dc 499 else /* There is at least one y-value for every x-value */
EricLew 0:ad9dfc0179dc 500 {
EricLew 0:ad9dfc0179dc 501 xinc2 = 0; /* Don't change the x for every iteration */
EricLew 0:ad9dfc0179dc 502 yinc1 = 0; /* Don't change the y when numerator >= denominator */
EricLew 0:ad9dfc0179dc 503 den = deltay;
EricLew 0:ad9dfc0179dc 504 num = deltay / 2;
EricLew 0:ad9dfc0179dc 505 numadd = deltax;
EricLew 0:ad9dfc0179dc 506 numpixels = deltay; /* There are more y-values than x-values */
EricLew 0:ad9dfc0179dc 507 }
EricLew 0:ad9dfc0179dc 508
EricLew 0:ad9dfc0179dc 509 for (curpixel = 0; curpixel <= numpixels; curpixel++)
EricLew 0:ad9dfc0179dc 510 {
EricLew 0:ad9dfc0179dc 511 BSP_LCD_DrawPixel(x, y, DrawProp.TextColor); /* Draw the current pixel */
EricLew 0:ad9dfc0179dc 512 num += numadd; /* Increase the numerator by the top of the fraction */
EricLew 0:ad9dfc0179dc 513 if (num >= den) /* Check if numerator >= denominator */
EricLew 0:ad9dfc0179dc 514 {
EricLew 0:ad9dfc0179dc 515 num -= den; /* Calculate the new numerator value */
EricLew 0:ad9dfc0179dc 516 x += xinc1; /* Change the x as appropriate */
EricLew 0:ad9dfc0179dc 517 y += yinc1; /* Change the y as appropriate */
EricLew 0:ad9dfc0179dc 518 }
EricLew 0:ad9dfc0179dc 519 x += xinc2; /* Change the x as appropriate */
EricLew 0:ad9dfc0179dc 520 y += yinc2; /* Change the y as appropriate */
EricLew 0:ad9dfc0179dc 521 }
EricLew 0:ad9dfc0179dc 522 }
EricLew 0:ad9dfc0179dc 523
EricLew 0:ad9dfc0179dc 524 /**
EricLew 0:ad9dfc0179dc 525 * @brief Draws a rectangle.
EricLew 0:ad9dfc0179dc 526 * @param Xpos: X position
EricLew 0:ad9dfc0179dc 527 * @param Ypos: Y position
EricLew 0:ad9dfc0179dc 528 * @param Width: Rectangle width
EricLew 0:ad9dfc0179dc 529 * @param Height: Rectangle height
EricLew 0:ad9dfc0179dc 530 * @retval None
EricLew 0:ad9dfc0179dc 531 */
EricLew 0:ad9dfc0179dc 532 void BSP_LCD_DrawRect(uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height)
EricLew 0:ad9dfc0179dc 533 {
EricLew 0:ad9dfc0179dc 534 /* Draw horizontal lines */
EricLew 0:ad9dfc0179dc 535 BSP_LCD_DrawHLine(Xpos, Ypos, Width);
EricLew 0:ad9dfc0179dc 536 BSP_LCD_DrawHLine(Xpos, (Ypos+ Height), Width);
EricLew 0:ad9dfc0179dc 537
EricLew 0:ad9dfc0179dc 538 /* Draw vertical lines */
EricLew 0:ad9dfc0179dc 539 BSP_LCD_DrawVLine(Xpos, Ypos, Height);
EricLew 0:ad9dfc0179dc 540 BSP_LCD_DrawVLine((Xpos + Width), Ypos, Height);
EricLew 0:ad9dfc0179dc 541 }
EricLew 0:ad9dfc0179dc 542
EricLew 0:ad9dfc0179dc 543 /**
EricLew 0:ad9dfc0179dc 544 * @brief Draws a circle.
EricLew 0:ad9dfc0179dc 545 * @param Xpos: X position
EricLew 0:ad9dfc0179dc 546 * @param Ypos: Y position
EricLew 0:ad9dfc0179dc 547 * @param Radius: Circle radius
EricLew 0:ad9dfc0179dc 548 * @retval None
EricLew 0:ad9dfc0179dc 549 */
EricLew 0:ad9dfc0179dc 550 void BSP_LCD_DrawCircle(uint16_t Xpos, uint16_t Ypos, uint16_t Radius)
EricLew 0:ad9dfc0179dc 551 {
EricLew 0:ad9dfc0179dc 552 int32_t D; /* Decision Variable */
EricLew 0:ad9dfc0179dc 553 uint32_t CurX; /* Current X Value */
EricLew 0:ad9dfc0179dc 554 uint32_t CurY; /* Current Y Value */
EricLew 0:ad9dfc0179dc 555
EricLew 0:ad9dfc0179dc 556 D = 3 - (Radius << 1);
EricLew 0:ad9dfc0179dc 557 CurX = 0;
EricLew 0:ad9dfc0179dc 558 CurY = Radius;
EricLew 0:ad9dfc0179dc 559
EricLew 0:ad9dfc0179dc 560 while (CurX <= CurY)
EricLew 0:ad9dfc0179dc 561 {
EricLew 0:ad9dfc0179dc 562 BSP_LCD_DrawPixel((Xpos + CurX), (Ypos - CurY), DrawProp.TextColor);
EricLew 0:ad9dfc0179dc 563
EricLew 0:ad9dfc0179dc 564 BSP_LCD_DrawPixel((Xpos - CurX), (Ypos - CurY), DrawProp.TextColor);
EricLew 0:ad9dfc0179dc 565
EricLew 0:ad9dfc0179dc 566 BSP_LCD_DrawPixel((Xpos + CurY), (Ypos - CurX), DrawProp.TextColor);
EricLew 0:ad9dfc0179dc 567
EricLew 0:ad9dfc0179dc 568 BSP_LCD_DrawPixel((Xpos - CurY), (Ypos - CurX), DrawProp.TextColor);
EricLew 0:ad9dfc0179dc 569
EricLew 0:ad9dfc0179dc 570 BSP_LCD_DrawPixel((Xpos + CurX), (Ypos + CurY), DrawProp.TextColor);
EricLew 0:ad9dfc0179dc 571
EricLew 0:ad9dfc0179dc 572 BSP_LCD_DrawPixel((Xpos - CurX), (Ypos + CurY), DrawProp.TextColor);
EricLew 0:ad9dfc0179dc 573
EricLew 0:ad9dfc0179dc 574 BSP_LCD_DrawPixel((Xpos + CurY), (Ypos + CurX), DrawProp.TextColor);
EricLew 0:ad9dfc0179dc 575
EricLew 0:ad9dfc0179dc 576 BSP_LCD_DrawPixel((Xpos - CurY), (Ypos + CurX), DrawProp.TextColor);
EricLew 0:ad9dfc0179dc 577
EricLew 0:ad9dfc0179dc 578 /* Initialize the font */
EricLew 0:ad9dfc0179dc 579 BSP_LCD_SetFont(&LCD_DEFAULT_FONT);
EricLew 0:ad9dfc0179dc 580
EricLew 0:ad9dfc0179dc 581 if (D < 0)
EricLew 0:ad9dfc0179dc 582 {
EricLew 0:ad9dfc0179dc 583 D += (CurX << 2) + 6;
EricLew 0:ad9dfc0179dc 584 }
EricLew 0:ad9dfc0179dc 585 else
EricLew 0:ad9dfc0179dc 586 {
EricLew 0:ad9dfc0179dc 587 D += ((CurX - CurY) << 2) + 10;
EricLew 0:ad9dfc0179dc 588 CurY--;
EricLew 0:ad9dfc0179dc 589 }
EricLew 0:ad9dfc0179dc 590 CurX++;
EricLew 0:ad9dfc0179dc 591 }
EricLew 0:ad9dfc0179dc 592 }
EricLew 0:ad9dfc0179dc 593
EricLew 0:ad9dfc0179dc 594 /**
EricLew 0:ad9dfc0179dc 595 * @brief Draws an poly-line (between many points).
EricLew 0:ad9dfc0179dc 596 * @param Points: Pointer to the points array
EricLew 0:ad9dfc0179dc 597 * @param PointCount: Number of points
EricLew 0:ad9dfc0179dc 598 * @retval None
EricLew 0:ad9dfc0179dc 599 */
EricLew 0:ad9dfc0179dc 600 void BSP_LCD_DrawPolygon(pPoint Points, uint16_t PointCount)
EricLew 0:ad9dfc0179dc 601 {
EricLew 0:ad9dfc0179dc 602 int16_t X = 0, Y = 0;
EricLew 0:ad9dfc0179dc 603
EricLew 0:ad9dfc0179dc 604 if(PointCount < 2)
EricLew 0:ad9dfc0179dc 605 {
EricLew 0:ad9dfc0179dc 606 return;
EricLew 0:ad9dfc0179dc 607 }
EricLew 0:ad9dfc0179dc 608
EricLew 0:ad9dfc0179dc 609 BSP_LCD_DrawLine(Points->X, Points->Y, (Points+PointCount-1)->X, (Points+PointCount-1)->Y);
EricLew 0:ad9dfc0179dc 610
EricLew 0:ad9dfc0179dc 611 while(--PointCount)
EricLew 0:ad9dfc0179dc 612 {
EricLew 0:ad9dfc0179dc 613 X = Points->X;
EricLew 0:ad9dfc0179dc 614 Y = Points->Y;
EricLew 0:ad9dfc0179dc 615 Points++;
EricLew 0:ad9dfc0179dc 616 BSP_LCD_DrawLine(X, Y, Points->X, Points->Y);
EricLew 0:ad9dfc0179dc 617 }
EricLew 0:ad9dfc0179dc 618 }
EricLew 0:ad9dfc0179dc 619
EricLew 0:ad9dfc0179dc 620 /**
EricLew 0:ad9dfc0179dc 621 * @brief Draws an ellipse on LCD.
EricLew 0:ad9dfc0179dc 622 * @param Xpos: X position
EricLew 0:ad9dfc0179dc 623 * @param Ypos: Y position
EricLew 0:ad9dfc0179dc 624 * @param XRadius: Ellipse X radius
EricLew 0:ad9dfc0179dc 625 * @param YRadius: Ellipse Y radius
EricLew 0:ad9dfc0179dc 626 * @retval None
EricLew 0:ad9dfc0179dc 627 */
EricLew 0:ad9dfc0179dc 628 void BSP_LCD_DrawEllipse(int Xpos, int Ypos, int XRadius, int YRadius)
EricLew 0:ad9dfc0179dc 629 {
EricLew 0:ad9dfc0179dc 630 int x = 0, y = -YRadius, err = 2-2*XRadius, e2;
EricLew 0:ad9dfc0179dc 631 float K = 0, rad1 = 0, rad2 = 0;
EricLew 0:ad9dfc0179dc 632
EricLew 0:ad9dfc0179dc 633 rad1 = XRadius;
EricLew 0:ad9dfc0179dc 634 rad2 = YRadius;
EricLew 0:ad9dfc0179dc 635
EricLew 0:ad9dfc0179dc 636 K = (float)(rad2/rad1);
EricLew 0:ad9dfc0179dc 637
EricLew 0:ad9dfc0179dc 638 do {
EricLew 0:ad9dfc0179dc 639 BSP_LCD_DrawPixel((Xpos-(uint16_t)(x/K)), (Ypos+y), DrawProp.TextColor);
EricLew 0:ad9dfc0179dc 640 BSP_LCD_DrawPixel((Xpos+(uint16_t)(x/K)), (Ypos+y), DrawProp.TextColor);
EricLew 0:ad9dfc0179dc 641 BSP_LCD_DrawPixel((Xpos+(uint16_t)(x/K)), (Ypos-y), DrawProp.TextColor);
EricLew 0:ad9dfc0179dc 642 BSP_LCD_DrawPixel((Xpos-(uint16_t)(x/K)), (Ypos-y), DrawProp.TextColor);
EricLew 0:ad9dfc0179dc 643
EricLew 0:ad9dfc0179dc 644 e2 = err;
EricLew 0:ad9dfc0179dc 645 if (e2 <= x) {
EricLew 0:ad9dfc0179dc 646 err += ++x*2+1;
EricLew 0:ad9dfc0179dc 647 if (-y == x && e2 <= y) e2 = 0;
EricLew 0:ad9dfc0179dc 648 }
EricLew 0:ad9dfc0179dc 649 if (e2 > y) err += ++y*2+1;
EricLew 0:ad9dfc0179dc 650 }
EricLew 0:ad9dfc0179dc 651 while (y <= 0);
EricLew 0:ad9dfc0179dc 652 }
EricLew 0:ad9dfc0179dc 653
EricLew 0:ad9dfc0179dc 654 /**
EricLew 0:ad9dfc0179dc 655 * @brief Draws a bitmap picture loaded in the STM32 MCU internal memory.
EricLew 0:ad9dfc0179dc 656 * @param Xpos: Bmp X position in the LCD
EricLew 0:ad9dfc0179dc 657 * @param Ypos: Bmp Y position in the LCD
EricLew 0:ad9dfc0179dc 658 * @param pBmp: Pointer to Bmp picture address
EricLew 0:ad9dfc0179dc 659 * @retval None
EricLew 0:ad9dfc0179dc 660 */
EricLew 0:ad9dfc0179dc 661 void BSP_LCD_DrawBitmap(uint16_t Xpos, uint16_t Ypos, uint8_t *pBmp)
EricLew 0:ad9dfc0179dc 662 {
EricLew 0:ad9dfc0179dc 663 uint32_t height = 0, width = 0;
EricLew 0:ad9dfc0179dc 664
EricLew 0:ad9dfc0179dc 665 /* Read bitmap width */
EricLew 0:ad9dfc0179dc 666 width = *(uint16_t *) (pBmp + 18);
EricLew 0:ad9dfc0179dc 667 width |= (*(uint16_t *) (pBmp + 20)) << 16;
EricLew 0:ad9dfc0179dc 668
EricLew 0:ad9dfc0179dc 669 /* Read bitmap height */
EricLew 0:ad9dfc0179dc 670 height = *(uint16_t *) (pBmp + 22);
EricLew 0:ad9dfc0179dc 671 height |= (*(uint16_t *) (pBmp + 24)) << 16;
EricLew 0:ad9dfc0179dc 672
EricLew 0:ad9dfc0179dc 673 /* Remap Ypos, st7735 works with inverted X in case of bitmap */
EricLew 0:ad9dfc0179dc 674 /* X = 0, cursor is on Top corner */
EricLew 0:ad9dfc0179dc 675 if(lcd_drv == &st7735_drv)
EricLew 0:ad9dfc0179dc 676 {
EricLew 0:ad9dfc0179dc 677 Ypos = BSP_LCD_GetYSize() - Ypos - height;
EricLew 0:ad9dfc0179dc 678 }
EricLew 0:ad9dfc0179dc 679
EricLew 0:ad9dfc0179dc 680 SetDisplayWindow(Xpos, Ypos, width, height);
EricLew 0:ad9dfc0179dc 681
EricLew 0:ad9dfc0179dc 682 if(lcd_drv->DrawBitmap != NULL)
EricLew 0:ad9dfc0179dc 683 {
EricLew 0:ad9dfc0179dc 684 lcd_drv->DrawBitmap(Xpos, Ypos, pBmp);
EricLew 0:ad9dfc0179dc 685 }
EricLew 0:ad9dfc0179dc 686 SetDisplayWindow(0, 0, BSP_LCD_GetXSize(), BSP_LCD_GetYSize());
EricLew 0:ad9dfc0179dc 687 }
EricLew 0:ad9dfc0179dc 688
EricLew 0:ad9dfc0179dc 689 /**
EricLew 0:ad9dfc0179dc 690 * @brief Draws a full rectangle.
EricLew 0:ad9dfc0179dc 691 * @param Xpos: X position
EricLew 0:ad9dfc0179dc 692 * @param Ypos: Y position
EricLew 0:ad9dfc0179dc 693 * @param Width: Rectangle width
EricLew 0:ad9dfc0179dc 694 * @param Height: Rectangle height
EricLew 0:ad9dfc0179dc 695 * @retval None
EricLew 0:ad9dfc0179dc 696 */
EricLew 0:ad9dfc0179dc 697 void BSP_LCD_FillRect(uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height)
EricLew 0:ad9dfc0179dc 698 {
EricLew 0:ad9dfc0179dc 699 BSP_LCD_SetTextColor(DrawProp.TextColor);
EricLew 0:ad9dfc0179dc 700 do
EricLew 0:ad9dfc0179dc 701 {
EricLew 0:ad9dfc0179dc 702 BSP_LCD_DrawHLine(Xpos, Ypos++, Width);
EricLew 0:ad9dfc0179dc 703 }
EricLew 0:ad9dfc0179dc 704 while(Height--);
EricLew 0:ad9dfc0179dc 705 }
EricLew 0:ad9dfc0179dc 706
EricLew 0:ad9dfc0179dc 707 /**
EricLew 0:ad9dfc0179dc 708 * @brief Draws a full circle.
EricLew 0:ad9dfc0179dc 709 * @param Xpos: X position
EricLew 0:ad9dfc0179dc 710 * @param Ypos: Y position
EricLew 0:ad9dfc0179dc 711 * @param Radius: Circle radius
EricLew 0:ad9dfc0179dc 712 * @retval None
EricLew 0:ad9dfc0179dc 713 */
EricLew 0:ad9dfc0179dc 714 void BSP_LCD_FillCircle(uint16_t Xpos, uint16_t Ypos, uint16_t Radius)
EricLew 0:ad9dfc0179dc 715 {
EricLew 0:ad9dfc0179dc 716 int32_t D; /* Decision Variable */
EricLew 0:ad9dfc0179dc 717 uint32_t CurX; /* Current X Value */
EricLew 0:ad9dfc0179dc 718 uint32_t CurY; /* Current Y Value */
EricLew 0:ad9dfc0179dc 719
EricLew 0:ad9dfc0179dc 720 D = 3 - (Radius << 1);
EricLew 0:ad9dfc0179dc 721
EricLew 0:ad9dfc0179dc 722 CurX = 0;
EricLew 0:ad9dfc0179dc 723 CurY = Radius;
EricLew 0:ad9dfc0179dc 724
EricLew 0:ad9dfc0179dc 725 BSP_LCD_SetTextColor(DrawProp.TextColor);
EricLew 0:ad9dfc0179dc 726
EricLew 0:ad9dfc0179dc 727 while (CurX <= CurY)
EricLew 0:ad9dfc0179dc 728 {
EricLew 0:ad9dfc0179dc 729 if(CurY > 0)
EricLew 0:ad9dfc0179dc 730 {
EricLew 0:ad9dfc0179dc 731 BSP_LCD_DrawHLine(Xpos - CurY, Ypos + CurX, 2*CurY);
EricLew 0:ad9dfc0179dc 732 BSP_LCD_DrawHLine(Xpos - CurY, Ypos - CurX, 2*CurY);
EricLew 0:ad9dfc0179dc 733 }
EricLew 0:ad9dfc0179dc 734
EricLew 0:ad9dfc0179dc 735 if(CurX > 0)
EricLew 0:ad9dfc0179dc 736 {
EricLew 0:ad9dfc0179dc 737 BSP_LCD_DrawHLine(Xpos - CurX, Ypos - CurY, 2*CurX);
EricLew 0:ad9dfc0179dc 738 BSP_LCD_DrawHLine(Xpos - CurX, Ypos + CurY, 2*CurX);
EricLew 0:ad9dfc0179dc 739 }
EricLew 0:ad9dfc0179dc 740 if (D < 0)
EricLew 0:ad9dfc0179dc 741 {
EricLew 0:ad9dfc0179dc 742 D += (CurX << 2) + 6;
EricLew 0:ad9dfc0179dc 743 }
EricLew 0:ad9dfc0179dc 744 else
EricLew 0:ad9dfc0179dc 745 {
EricLew 0:ad9dfc0179dc 746 D += ((CurX - CurY) << 2) + 10;
EricLew 0:ad9dfc0179dc 747 CurY--;
EricLew 0:ad9dfc0179dc 748 }
EricLew 0:ad9dfc0179dc 749 CurX++;
EricLew 0:ad9dfc0179dc 750 }
EricLew 0:ad9dfc0179dc 751
EricLew 0:ad9dfc0179dc 752 BSP_LCD_SetTextColor(DrawProp.TextColor);
EricLew 0:ad9dfc0179dc 753 BSP_LCD_DrawCircle(Xpos, Ypos, Radius);
EricLew 0:ad9dfc0179dc 754 }
EricLew 0:ad9dfc0179dc 755
EricLew 0:ad9dfc0179dc 756 /**
EricLew 0:ad9dfc0179dc 757 * @brief Draws a full poly-line (between many points).
EricLew 0:ad9dfc0179dc 758 * @param Points: Pointer to the points array
EricLew 0:ad9dfc0179dc 759 * @param PointCount: Number of points
EricLew 0:ad9dfc0179dc 760 * @retval None
EricLew 0:ad9dfc0179dc 761 */
EricLew 0:ad9dfc0179dc 762 void BSP_LCD_FillPolygon(pPoint Points, uint16_t PointCount)
EricLew 0:ad9dfc0179dc 763 {
EricLew 0:ad9dfc0179dc 764 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;
EricLew 0:ad9dfc0179dc 765 uint16_t IMAGE_LEFT = 0, IMAGE_RIGHT = 0, IMAGE_TOP = 0, IMAGE_BOTTOM = 0;
EricLew 0:ad9dfc0179dc 766
EricLew 0:ad9dfc0179dc 767 IMAGE_LEFT = IMAGE_RIGHT = Points->X;
EricLew 0:ad9dfc0179dc 768 IMAGE_TOP= IMAGE_BOTTOM = Points->Y;
EricLew 0:ad9dfc0179dc 769
EricLew 0:ad9dfc0179dc 770 for(counter = 1; counter < PointCount; counter++)
EricLew 0:ad9dfc0179dc 771 {
EricLew 0:ad9dfc0179dc 772 pixelX = POLY_X(counter);
EricLew 0:ad9dfc0179dc 773 if(pixelX < IMAGE_LEFT)
EricLew 0:ad9dfc0179dc 774 {
EricLew 0:ad9dfc0179dc 775 IMAGE_LEFT = pixelX;
EricLew 0:ad9dfc0179dc 776 }
EricLew 0:ad9dfc0179dc 777 if(pixelX > IMAGE_RIGHT)
EricLew 0:ad9dfc0179dc 778 {
EricLew 0:ad9dfc0179dc 779 IMAGE_RIGHT = pixelX;
EricLew 0:ad9dfc0179dc 780 }
EricLew 0:ad9dfc0179dc 781
EricLew 0:ad9dfc0179dc 782 pixelY = POLY_Y(counter);
EricLew 0:ad9dfc0179dc 783 if(pixelY < IMAGE_TOP)
EricLew 0:ad9dfc0179dc 784 {
EricLew 0:ad9dfc0179dc 785 IMAGE_TOP = pixelY;
EricLew 0:ad9dfc0179dc 786 }
EricLew 0:ad9dfc0179dc 787 if(pixelY > IMAGE_BOTTOM)
EricLew 0:ad9dfc0179dc 788 {
EricLew 0:ad9dfc0179dc 789 IMAGE_BOTTOM = pixelY;
EricLew 0:ad9dfc0179dc 790 }
EricLew 0:ad9dfc0179dc 791 }
EricLew 0:ad9dfc0179dc 792
EricLew 0:ad9dfc0179dc 793 if(PointCount < 2)
EricLew 0:ad9dfc0179dc 794 {
EricLew 0:ad9dfc0179dc 795 return;
EricLew 0:ad9dfc0179dc 796 }
EricLew 0:ad9dfc0179dc 797
EricLew 0:ad9dfc0179dc 798 X_center = (IMAGE_LEFT + IMAGE_RIGHT)/2;
EricLew 0:ad9dfc0179dc 799 Y_center = (IMAGE_BOTTOM + IMAGE_TOP)/2;
EricLew 0:ad9dfc0179dc 800
EricLew 0:ad9dfc0179dc 801 X_first = Points->X;
EricLew 0:ad9dfc0179dc 802 Y_first = Points->Y;
EricLew 0:ad9dfc0179dc 803
EricLew 0:ad9dfc0179dc 804 while(--PointCount)
EricLew 0:ad9dfc0179dc 805 {
EricLew 0:ad9dfc0179dc 806 X = Points->X;
EricLew 0:ad9dfc0179dc 807 Y = Points->Y;
EricLew 0:ad9dfc0179dc 808 Points++;
EricLew 0:ad9dfc0179dc 809 X2 = Points->X;
EricLew 0:ad9dfc0179dc 810 Y2 = Points->Y;
EricLew 0:ad9dfc0179dc 811
EricLew 0:ad9dfc0179dc 812 FillTriangle(X, X2, X_center, Y, Y2, Y_center);
EricLew 0:ad9dfc0179dc 813 FillTriangle(X, X_center, X2, Y, Y_center, Y2);
EricLew 0:ad9dfc0179dc 814 FillTriangle(X_center, X2, X, Y_center, Y2, Y);
EricLew 0:ad9dfc0179dc 815 }
EricLew 0:ad9dfc0179dc 816
EricLew 0:ad9dfc0179dc 817 FillTriangle(X_first, X2, X_center, Y_first, Y2, Y_center);
EricLew 0:ad9dfc0179dc 818 FillTriangle(X_first, X_center, X2, Y_first, Y_center, Y2);
EricLew 0:ad9dfc0179dc 819 FillTriangle(X_center, X2, X_first, Y_center, Y2, Y_first);
EricLew 0:ad9dfc0179dc 820 }
EricLew 0:ad9dfc0179dc 821
EricLew 0:ad9dfc0179dc 822 /**
EricLew 0:ad9dfc0179dc 823 * @brief Draws a full ellipse.
EricLew 0:ad9dfc0179dc 824 * @param Xpos: X position
EricLew 0:ad9dfc0179dc 825 * @param Ypos: Y position
EricLew 0:ad9dfc0179dc 826 * @param XRadius: Ellipse X radius
EricLew 0:ad9dfc0179dc 827 * @param YRadius: Ellipse Y radius
EricLew 0:ad9dfc0179dc 828 * @retval None
EricLew 0:ad9dfc0179dc 829 */
EricLew 0:ad9dfc0179dc 830 void BSP_LCD_FillEllipse(int Xpos, int Ypos, int XRadius, int YRadius)
EricLew 0:ad9dfc0179dc 831 {
EricLew 0:ad9dfc0179dc 832 int x = 0, y = -YRadius, err = 2-2*XRadius, e2;
EricLew 0:ad9dfc0179dc 833 float K = 0, rad1 = 0, rad2 = 0;
EricLew 0:ad9dfc0179dc 834
EricLew 0:ad9dfc0179dc 835 rad1 = XRadius;
EricLew 0:ad9dfc0179dc 836 rad2 = YRadius;
EricLew 0:ad9dfc0179dc 837
EricLew 0:ad9dfc0179dc 838 K = (float)(rad2/rad1);
EricLew 0:ad9dfc0179dc 839
EricLew 0:ad9dfc0179dc 840 do
EricLew 0:ad9dfc0179dc 841 {
EricLew 0:ad9dfc0179dc 842 BSP_LCD_DrawHLine((Xpos-(uint16_t)(x/K)), (Ypos+y), (2*(uint16_t)(x/K) + 1));
EricLew 0:ad9dfc0179dc 843 BSP_LCD_DrawHLine((Xpos-(uint16_t)(x/K)), (Ypos-y), (2*(uint16_t)(x/K) + 1));
EricLew 0:ad9dfc0179dc 844
EricLew 0:ad9dfc0179dc 845 e2 = err;
EricLew 0:ad9dfc0179dc 846 if (e2 <= x)
EricLew 0:ad9dfc0179dc 847 {
EricLew 0:ad9dfc0179dc 848 err += ++x*2+1;
EricLew 0:ad9dfc0179dc 849 if (-y == x && e2 <= y) e2 = 0;
EricLew 0:ad9dfc0179dc 850 }
EricLew 0:ad9dfc0179dc 851 if (e2 > y) err += ++y*2+1;
EricLew 0:ad9dfc0179dc 852 }
EricLew 0:ad9dfc0179dc 853 while (y <= 0);
EricLew 0:ad9dfc0179dc 854 }
EricLew 0:ad9dfc0179dc 855
EricLew 0:ad9dfc0179dc 856 /**
EricLew 0:ad9dfc0179dc 857 * @brief Enables the display.
EricLew 0:ad9dfc0179dc 858 * @param None
EricLew 0:ad9dfc0179dc 859 * @retval None
EricLew 0:ad9dfc0179dc 860 */
EricLew 0:ad9dfc0179dc 861 void BSP_LCD_DisplayOn(void)
EricLew 0:ad9dfc0179dc 862 {
EricLew 0:ad9dfc0179dc 863 lcd_drv->DisplayOn();
EricLew 0:ad9dfc0179dc 864 }
EricLew 0:ad9dfc0179dc 865
EricLew 0:ad9dfc0179dc 866 /**
EricLew 0:ad9dfc0179dc 867 * @brief Disables the display.
EricLew 0:ad9dfc0179dc 868 * @param None
EricLew 0:ad9dfc0179dc 869 * @retval None
EricLew 0:ad9dfc0179dc 870 */
EricLew 0:ad9dfc0179dc 871 void BSP_LCD_DisplayOff(void)
EricLew 0:ad9dfc0179dc 872 {
EricLew 0:ad9dfc0179dc 873 lcd_drv->DisplayOff();
EricLew 0:ad9dfc0179dc 874 }
EricLew 0:ad9dfc0179dc 875
EricLew 0:ad9dfc0179dc 876 /*******************************************************************************
EricLew 0:ad9dfc0179dc 877 Static Functions
EricLew 0:ad9dfc0179dc 878 *******************************************************************************/
EricLew 0:ad9dfc0179dc 879
EricLew 0:ad9dfc0179dc 880 /**
EricLew 0:ad9dfc0179dc 881 * @brief Draws a character on LCD.
EricLew 0:ad9dfc0179dc 882 * @param Xpos: Line where to display the character shape
EricLew 0:ad9dfc0179dc 883 * @param Ypos: Start column address
EricLew 0:ad9dfc0179dc 884 * @param pChar: Pointer to the character data
EricLew 0:ad9dfc0179dc 885 * @retval None
EricLew 0:ad9dfc0179dc 886 */
EricLew 0:ad9dfc0179dc 887 static void DrawChar(uint16_t Xpos, uint16_t Ypos, const uint8_t *pChar)
EricLew 0:ad9dfc0179dc 888 {
EricLew 0:ad9dfc0179dc 889 uint32_t counterh = 0, counterw = 0, index = 0;
EricLew 0:ad9dfc0179dc 890 uint16_t height = 0, width = 0;
EricLew 0:ad9dfc0179dc 891 uint8_t offset = 0;
EricLew 0:ad9dfc0179dc 892 uint8_t *pchar = NULL;
EricLew 0:ad9dfc0179dc 893 uint32_t line = 0;
EricLew 0:ad9dfc0179dc 894
EricLew 0:ad9dfc0179dc 895 height = DrawProp.pFont->Height;
EricLew 0:ad9dfc0179dc 896 width = DrawProp.pFont->Width;
EricLew 0:ad9dfc0179dc 897
EricLew 0:ad9dfc0179dc 898 /* Fill bitmap header*/
EricLew 0:ad9dfc0179dc 899 *(uint16_t *) (bitmap + 2) = (uint16_t)(height*width*2+OFFSET_BITMAP);
EricLew 0:ad9dfc0179dc 900 *(uint16_t *) (bitmap + 4) = (uint16_t)((height*width*2+OFFSET_BITMAP)>>16);
EricLew 0:ad9dfc0179dc 901 *(uint16_t *) (bitmap + 10) = OFFSET_BITMAP;
EricLew 0:ad9dfc0179dc 902 *(uint16_t *) (bitmap + 18) = (uint16_t)(width);
EricLew 0:ad9dfc0179dc 903 *(uint16_t *) (bitmap + 20) = (uint16_t)((width)>>16);
EricLew 0:ad9dfc0179dc 904 *(uint16_t *) (bitmap + 22) = (uint16_t)(height);
EricLew 0:ad9dfc0179dc 905 *(uint16_t *) (bitmap + 24) = (uint16_t)((height)>>16);
EricLew 0:ad9dfc0179dc 906
EricLew 0:ad9dfc0179dc 907 offset = 8 *((width + 7)/8) - width ;
EricLew 0:ad9dfc0179dc 908
EricLew 0:ad9dfc0179dc 909 for(counterh = 0; counterh < height; counterh++)
EricLew 0:ad9dfc0179dc 910 {
EricLew 0:ad9dfc0179dc 911 pchar = ((uint8_t *)pChar + (width + 7)/8 * counterh);
EricLew 0:ad9dfc0179dc 912
EricLew 0:ad9dfc0179dc 913 if(((width + 7)/8) == 3)
EricLew 0:ad9dfc0179dc 914 {
EricLew 0:ad9dfc0179dc 915 line = (pchar[0]<< 16) | (pchar[1]<< 8) | pchar[2];
EricLew 0:ad9dfc0179dc 916 }
EricLew 0:ad9dfc0179dc 917
EricLew 0:ad9dfc0179dc 918 if(((width + 7)/8) == 2)
EricLew 0:ad9dfc0179dc 919 {
EricLew 0:ad9dfc0179dc 920 line = (pchar[0]<< 8) | pchar[1];
EricLew 0:ad9dfc0179dc 921 }
EricLew 0:ad9dfc0179dc 922
EricLew 0:ad9dfc0179dc 923 if(((width + 7)/8) == 1)
EricLew 0:ad9dfc0179dc 924 {
EricLew 0:ad9dfc0179dc 925 line = pchar[0];
EricLew 0:ad9dfc0179dc 926 }
EricLew 0:ad9dfc0179dc 927
EricLew 0:ad9dfc0179dc 928 for (counterw = 0; counterw < width; counterw++)
EricLew 0:ad9dfc0179dc 929 {
EricLew 0:ad9dfc0179dc 930 /* Image in the bitmap is written from the bottom to the top */
EricLew 0:ad9dfc0179dc 931 /* Need to invert image in the bitmap */
EricLew 0:ad9dfc0179dc 932 index = (((height-counterh-1)*width)+(counterw))*2+OFFSET_BITMAP;
EricLew 0:ad9dfc0179dc 933 if(line & (1 << (width- counterw + offset- 1)))
EricLew 0:ad9dfc0179dc 934 {
EricLew 0:ad9dfc0179dc 935 bitmap[index] = (uint8_t)DrawProp.TextColor;
EricLew 0:ad9dfc0179dc 936 bitmap[index+1] = (uint8_t)(DrawProp.TextColor >> 8);
EricLew 0:ad9dfc0179dc 937 }
EricLew 0:ad9dfc0179dc 938 else
EricLew 0:ad9dfc0179dc 939 {
EricLew 0:ad9dfc0179dc 940 bitmap[index] = (uint8_t)DrawProp.BackColor;
EricLew 0:ad9dfc0179dc 941 bitmap[index+1] = (uint8_t)(DrawProp.BackColor >> 8);
EricLew 0:ad9dfc0179dc 942 }
EricLew 0:ad9dfc0179dc 943 }
EricLew 0:ad9dfc0179dc 944 }
EricLew 0:ad9dfc0179dc 945
EricLew 0:ad9dfc0179dc 946 BSP_LCD_DrawBitmap(Xpos, Ypos, bitmap);
EricLew 0:ad9dfc0179dc 947 }
EricLew 0:ad9dfc0179dc 948
EricLew 0:ad9dfc0179dc 949 /**
EricLew 0:ad9dfc0179dc 950 * @brief Fills a triangle (between 3 points).
EricLew 0:ad9dfc0179dc 951 * @param Points: Pointer to the points array
EricLew 0:ad9dfc0179dc 952 * @param x1: Point 1 X position
EricLew 0:ad9dfc0179dc 953 * @param y1: Point 1 Y position
EricLew 0:ad9dfc0179dc 954 * @param x2: Point 2 X position
EricLew 0:ad9dfc0179dc 955 * @param y2: Point 2 Y position
EricLew 0:ad9dfc0179dc 956 * @param x3: Point 3 X position
EricLew 0:ad9dfc0179dc 957 * @param y3: Point 3 Y position
EricLew 0:ad9dfc0179dc 958 * @retval None
EricLew 0:ad9dfc0179dc 959 */
EricLew 0:ad9dfc0179dc 960 static void FillTriangle(uint16_t x1, uint16_t x2, uint16_t x3, uint16_t y1, uint16_t y2, uint16_t y3)
EricLew 0:ad9dfc0179dc 961 {
EricLew 0:ad9dfc0179dc 962 int16_t deltax = 0, deltay = 0, x = 0, y = 0, xinc1 = 0, xinc2 = 0,
EricLew 0:ad9dfc0179dc 963 yinc1 = 0, yinc2 = 0, den = 0, num = 0, numadd = 0, numpixels = 0,
EricLew 0:ad9dfc0179dc 964 curpixel = 0;
EricLew 0:ad9dfc0179dc 965
EricLew 0:ad9dfc0179dc 966 deltax = ABS(x2 - x1); /* The difference between the x's */
EricLew 0:ad9dfc0179dc 967 deltay = ABS(y2 - y1); /* The difference between the y's */
EricLew 0:ad9dfc0179dc 968 x = x1; /* Start x off at the first pixel */
EricLew 0:ad9dfc0179dc 969 y = y1; /* Start y off at the first pixel */
EricLew 0:ad9dfc0179dc 970
EricLew 0:ad9dfc0179dc 971 if (x2 >= x1) /* The x-values are increasing */
EricLew 0:ad9dfc0179dc 972 {
EricLew 0:ad9dfc0179dc 973 xinc1 = 1;
EricLew 0:ad9dfc0179dc 974 xinc2 = 1;
EricLew 0:ad9dfc0179dc 975 }
EricLew 0:ad9dfc0179dc 976 else /* The x-values are decreasing */
EricLew 0:ad9dfc0179dc 977 {
EricLew 0:ad9dfc0179dc 978 xinc1 = -1;
EricLew 0:ad9dfc0179dc 979 xinc2 = -1;
EricLew 0:ad9dfc0179dc 980 }
EricLew 0:ad9dfc0179dc 981
EricLew 0:ad9dfc0179dc 982 if (y2 >= y1) /* The y-values are increasing */
EricLew 0:ad9dfc0179dc 983 {
EricLew 0:ad9dfc0179dc 984 yinc1 = 1;
EricLew 0:ad9dfc0179dc 985 yinc2 = 1;
EricLew 0:ad9dfc0179dc 986 }
EricLew 0:ad9dfc0179dc 987 else /* The y-values are decreasing */
EricLew 0:ad9dfc0179dc 988 {
EricLew 0:ad9dfc0179dc 989 yinc1 = -1;
EricLew 0:ad9dfc0179dc 990 yinc2 = -1;
EricLew 0:ad9dfc0179dc 991 }
EricLew 0:ad9dfc0179dc 992
EricLew 0:ad9dfc0179dc 993 if (deltax >= deltay) /* There is at least one x-value for every y-value */
EricLew 0:ad9dfc0179dc 994 {
EricLew 0:ad9dfc0179dc 995 xinc1 = 0; /* Don't change the x when numerator >= denominator */
EricLew 0:ad9dfc0179dc 996 yinc2 = 0; /* Don't change the y for every iteration */
EricLew 0:ad9dfc0179dc 997 den = deltax;
EricLew 0:ad9dfc0179dc 998 num = deltax / 2;
EricLew 0:ad9dfc0179dc 999 numadd = deltay;
EricLew 0:ad9dfc0179dc 1000 numpixels = deltax; /* There are more x-values than y-values */
EricLew 0:ad9dfc0179dc 1001 }
EricLew 0:ad9dfc0179dc 1002 else /* There is at least one y-value for every x-value */
EricLew 0:ad9dfc0179dc 1003 {
EricLew 0:ad9dfc0179dc 1004 xinc2 = 0; /* Don't change the x for every iteration */
EricLew 0:ad9dfc0179dc 1005 yinc1 = 0; /* Don't change the y when numerator >= denominator */
EricLew 0:ad9dfc0179dc 1006 den = deltay;
EricLew 0:ad9dfc0179dc 1007 num = deltay / 2;
EricLew 0:ad9dfc0179dc 1008 numadd = deltax;
EricLew 0:ad9dfc0179dc 1009 numpixels = deltay; /* There are more y-values than x-values */
EricLew 0:ad9dfc0179dc 1010 }
EricLew 0:ad9dfc0179dc 1011
EricLew 0:ad9dfc0179dc 1012 for (curpixel = 0; curpixel <= numpixels; curpixel++)
EricLew 0:ad9dfc0179dc 1013 {
EricLew 0:ad9dfc0179dc 1014 BSP_LCD_DrawLine(x, y, x3, y3);
EricLew 0:ad9dfc0179dc 1015
EricLew 0:ad9dfc0179dc 1016 num += numadd; /* Increase the numerator by the top of the fraction */
EricLew 0:ad9dfc0179dc 1017 if (num >= den) /* Check if numerator >= denominator */
EricLew 0:ad9dfc0179dc 1018 {
EricLew 0:ad9dfc0179dc 1019 num -= den; /* Calculate the new numerator value */
EricLew 0:ad9dfc0179dc 1020 x += xinc1; /* Change the x as appropriate */
EricLew 0:ad9dfc0179dc 1021 y += yinc1; /* Change the y as appropriate */
EricLew 0:ad9dfc0179dc 1022 }
EricLew 0:ad9dfc0179dc 1023 x += xinc2; /* Change the x as appropriate */
EricLew 0:ad9dfc0179dc 1024 y += yinc2; /* Change the y as appropriate */
EricLew 0:ad9dfc0179dc 1025 }
EricLew 0:ad9dfc0179dc 1026 }
EricLew 0:ad9dfc0179dc 1027
EricLew 0:ad9dfc0179dc 1028 /**
EricLew 0:ad9dfc0179dc 1029 * @brief Sets display window.
EricLew 0:ad9dfc0179dc 1030 * @param LayerIndex: layer index
EricLew 0:ad9dfc0179dc 1031 * @param Xpos: LCD X position
EricLew 0:ad9dfc0179dc 1032 * @param Ypos: LCD Y position
EricLew 0:ad9dfc0179dc 1033 * @param Width: LCD window width
EricLew 0:ad9dfc0179dc 1034 * @param Height: LCD window height
EricLew 0:ad9dfc0179dc 1035 * @retval None
EricLew 0:ad9dfc0179dc 1036 */
EricLew 0:ad9dfc0179dc 1037 static void SetDisplayWindow(uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height)
EricLew 0:ad9dfc0179dc 1038 {
EricLew 0:ad9dfc0179dc 1039 if(lcd_drv->SetDisplayWindow != NULL)
EricLew 0:ad9dfc0179dc 1040 {
EricLew 0:ad9dfc0179dc 1041 lcd_drv->SetDisplayWindow(Xpos, Ypos, Width, Height);
EricLew 0:ad9dfc0179dc 1042 }
EricLew 0:ad9dfc0179dc 1043 }
EricLew 0:ad9dfc0179dc 1044
EricLew 0:ad9dfc0179dc 1045 /**
EricLew 0:ad9dfc0179dc 1046 * @}
EricLew 0:ad9dfc0179dc 1047 */
EricLew 0:ad9dfc0179dc 1048
EricLew 0:ad9dfc0179dc 1049 /**
EricLew 0:ad9dfc0179dc 1050 * @}
EricLew 0:ad9dfc0179dc 1051 */
EricLew 0:ad9dfc0179dc 1052
EricLew 0:ad9dfc0179dc 1053 /**
EricLew 0:ad9dfc0179dc 1054 * @}
EricLew 0:ad9dfc0179dc 1055 */
EricLew 0:ad9dfc0179dc 1056
EricLew 0:ad9dfc0179dc 1057 /**
EricLew 0:ad9dfc0179dc 1058 * @}
EricLew 0:ad9dfc0179dc 1059 */
EricLew 0:ad9dfc0179dc 1060 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
EricLew 0:ad9dfc0179dc 1061