Tiny graphics library for STM32F746G-DISCO board
Dependents: RadarDemo 3DDemo RadarDemoT
RK043FN48H.cpp@3:1ddc4aa1e5cb, 2016-11-11 (annotated)
- Committer:
- karpent
- Date:
- Fri Nov 11 12:05:16 2016 +0000
- Revision:
- 3:1ddc4aa1e5cb
- Parent:
- 2:02b7b78e8510
Missing method DrawChar() added, DrawText() corrected.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
karpent | 0:566855d63a2f | 1 | // |
karpent | 0:566855d63a2f | 2 | // RK043FN48H.h - DISCO_F746NG display |
karpent | 0:566855d63a2f | 3 | // |
karpent | 0:566855d63a2f | 4 | |
karpent | 0:566855d63a2f | 5 | #include "RK043FN48H.h" |
karpent | 0:566855d63a2f | 6 | |
karpent | 0:566855d63a2f | 7 | static Layer _selectedLayer = Foreground; |
karpent | 0:566855d63a2f | 8 | |
karpent | 0:566855d63a2f | 9 | RK043FN48H::RK043FN48H() |
karpent | 0:566855d63a2f | 10 | { |
karpent | 0:566855d63a2f | 11 | BSP_LCD_Init(); |
karpent | 0:566855d63a2f | 12 | |
karpent | 0:566855d63a2f | 13 | FbBackgroundStartAdress = LCD_FB_START_ADDRESS; |
karpent | 0:566855d63a2f | 14 | FbForegroundStartAdress = LCD_FB_START_ADDRESS+(BSP_LCD_GetXSize()*BSP_LCD_GetYSize()*4); |
karpent | 0:566855d63a2f | 15 | |
karpent | 0:566855d63a2f | 16 | BSP_LCD_LayerDefaultInit(0, FbBackgroundStartAdress); |
karpent | 0:566855d63a2f | 17 | BSP_LCD_LayerDefaultInit(1, FbForegroundStartAdress); |
karpent | 0:566855d63a2f | 18 | |
karpent | 0:566855d63a2f | 19 | BSP_LCD_DisplayOn(); |
karpent | 0:566855d63a2f | 20 | |
karpent | 0:566855d63a2f | 21 | actualDrawProp[0].TextColor = LCD_COLOR_WHITE; |
karpent | 0:566855d63a2f | 22 | actualDrawProp[0].BackColor = LCD_COLOR_BLACK; |
karpent | 0:566855d63a2f | 23 | actualDrawProp[0].pFont = &Font16; // &LCD_DEFAULT_FONT |
karpent | 2:02b7b78e8510 | 24 | _selectedFont[0] = GrFont(Courier16); |
karpent | 0:566855d63a2f | 25 | |
karpent | 2:02b7b78e8510 | 26 | actualDrawProp[1].TextColor = LCD_COLOR_WHITE; // & ALPHA_MASK; |
karpent | 0:566855d63a2f | 27 | actualDrawProp[1].BackColor = LCD_COLOR_BLACK & ALPHA_MASK; |
karpent | 0:566855d63a2f | 28 | actualDrawProp[1].pFont = &Font16; // &LCD_DEFAULT_FONT |
karpent | 2:02b7b78e8510 | 29 | _selectedFont[1] = GrFont(Courier16); |
karpent | 0:566855d63a2f | 30 | |
karpent | 0:566855d63a2f | 31 | // Initialize layer 0 properties |
karpent | 0:566855d63a2f | 32 | SetActiveLayer(Background); |
karpent | 0:566855d63a2f | 33 | SetBackgroundColor(actualDrawProp[0].BackColor); |
karpent | 0:566855d63a2f | 34 | Clear(); |
karpent | 0:566855d63a2f | 35 | SetForegroundColor(actualDrawProp[0].TextColor); |
karpent | 0:566855d63a2f | 36 | BSP_LCD_SetFont(&Font16); |
karpent | 0:566855d63a2f | 37 | |
karpent | 0:566855d63a2f | 38 | // Initialize layer 1 properties |
karpent | 0:566855d63a2f | 39 | SetActiveLayer(Foreground); |
karpent | 0:566855d63a2f | 40 | SetBackgroundColor(actualDrawProp[1].BackColor); |
karpent | 0:566855d63a2f | 41 | Clear(); |
karpent | 0:566855d63a2f | 42 | SetForegroundColor(actualDrawProp[1].TextColor); |
karpent | 0:566855d63a2f | 43 | BSP_LCD_SetFont(&Font16); |
karpent | 0:566855d63a2f | 44 | |
karpent | 0:566855d63a2f | 45 | // Set layers transparency |
karpent | 0:566855d63a2f | 46 | SetLayersTransparency(0xFF, 0xFF); |
karpent | 0:566855d63a2f | 47 | SetLayersVisibility(true, true); |
karpent | 0:566855d63a2f | 48 | |
karpent | 0:566855d63a2f | 49 | _cursorPos[Background].X = 0; |
karpent | 0:566855d63a2f | 50 | _cursorPos[Background].Y = 0; |
karpent | 0:566855d63a2f | 51 | _cursorPos[Foreground].X = 0; |
karpent | 0:566855d63a2f | 52 | _cursorPos[Foreground].Y = 0; |
karpent | 0:566855d63a2f | 53 | } |
karpent | 0:566855d63a2f | 54 | |
karpent | 0:566855d63a2f | 55 | |
karpent | 0:566855d63a2f | 56 | RK043FN48H::~RK043FN48H() |
karpent | 0:566855d63a2f | 57 | { |
karpent | 0:566855d63a2f | 58 | BSP_LCD_DeInit(); |
karpent | 0:566855d63a2f | 59 | } |
karpent | 0:566855d63a2f | 60 | |
karpent | 0:566855d63a2f | 61 | |
karpent | 0:566855d63a2f | 62 | void RK043FN48H::Clear() |
karpent | 0:566855d63a2f | 63 | { |
karpent | 0:566855d63a2f | 64 | BSP_LCD_Clear(actualDrawProp[_selectedLayer].BackColor); |
karpent | 0:566855d63a2f | 65 | } |
karpent | 0:566855d63a2f | 66 | |
karpent | 0:566855d63a2f | 67 | |
karpent | 0:566855d63a2f | 68 | void RK043FN48H::Clear(uint32_t color) |
karpent | 0:566855d63a2f | 69 | { |
karpent | 0:566855d63a2f | 70 | BSP_LCD_Clear(color); |
karpent | 0:566855d63a2f | 71 | } |
karpent | 0:566855d63a2f | 72 | |
karpent | 0:566855d63a2f | 73 | |
karpent | 0:566855d63a2f | 74 | void RK043FN48H::ClearLayer(Layer layer, uint32_t color) |
karpent | 0:566855d63a2f | 75 | { |
karpent | 0:566855d63a2f | 76 | Layer oldLayer = GetActiveLayer(); |
karpent | 0:566855d63a2f | 77 | |
karpent | 0:566855d63a2f | 78 | SetActiveLayer(layer); |
karpent | 0:566855d63a2f | 79 | Clear(color); |
karpent | 0:566855d63a2f | 80 | SetActiveLayer(oldLayer); |
karpent | 0:566855d63a2f | 81 | } |
karpent | 0:566855d63a2f | 82 | |
karpent | 0:566855d63a2f | 83 | |
karpent | 0:566855d63a2f | 84 | void RK043FN48H::SetBackgroundColor(uint32_t color) |
karpent | 0:566855d63a2f | 85 | { |
karpent | 0:566855d63a2f | 86 | actualDrawProp[_selectedLayer].BackColor = color; |
karpent | 0:566855d63a2f | 87 | BSP_LCD_SetBackColor(actualDrawProp[_selectedLayer].BackColor); |
karpent | 0:566855d63a2f | 88 | } |
karpent | 0:566855d63a2f | 89 | |
karpent | 0:566855d63a2f | 90 | |
karpent | 0:566855d63a2f | 91 | void RK043FN48H::SetForegroundColor(uint32_t color) |
karpent | 0:566855d63a2f | 92 | { |
karpent | 0:566855d63a2f | 93 | actualDrawProp[_selectedLayer].TextColor = color; |
karpent | 0:566855d63a2f | 94 | BSP_LCD_SetTextColor(actualDrawProp[_selectedLayer].TextColor); |
karpent | 0:566855d63a2f | 95 | } |
karpent | 0:566855d63a2f | 96 | |
karpent | 0:566855d63a2f | 97 | |
karpent | 0:566855d63a2f | 98 | void RK043FN48H::SetDrawColor(uint8_t red, uint8_t green, uint8_t blue, uint8_t alpha) |
karpent | 0:566855d63a2f | 99 | { |
karpent | 0:566855d63a2f | 100 | // Calculate display pixel value for selected color |
karpent | 0:566855d63a2f | 101 | uint32_t color = red << 16 | green << 8 | blue | alpha << 24; |
karpent | 0:566855d63a2f | 102 | SetForegroundColor(color); |
karpent | 0:566855d63a2f | 103 | } |
karpent | 0:566855d63a2f | 104 | |
karpent | 0:566855d63a2f | 105 | uint32_t RK043FN48H::GetDrawColor() |
karpent | 0:566855d63a2f | 106 | { |
karpent | 0:566855d63a2f | 107 | return actualDrawProp[_selectedLayer].TextColor; |
karpent | 0:566855d63a2f | 108 | } |
karpent | 0:566855d63a2f | 109 | |
karpent | 2:02b7b78e8510 | 110 | void RK043FN48H::SetClearColor(uint8_t red, uint8_t green, uint8_t blue, uint8_t alpha) |
karpent | 2:02b7b78e8510 | 111 | { |
karpent | 2:02b7b78e8510 | 112 | // Calculate display pixel value for selected color |
karpent | 2:02b7b78e8510 | 113 | uint32_t color = red << 16 | green << 8 | blue | alpha << 24; |
karpent | 2:02b7b78e8510 | 114 | SetBackgroundColor(color); |
karpent | 2:02b7b78e8510 | 115 | } |
karpent | 2:02b7b78e8510 | 116 | |
karpent | 2:02b7b78e8510 | 117 | uint32_t RK043FN48H::GetClearColor() |
karpent | 2:02b7b78e8510 | 118 | { |
karpent | 2:02b7b78e8510 | 119 | return actualDrawProp[_selectedLayer].BackColor; |
karpent | 2:02b7b78e8510 | 120 | } |
karpent | 0:566855d63a2f | 121 | |
karpent | 0:566855d63a2f | 122 | void RK043FN48H::DrawPoint(int posX, int posY, uint32_t colorMask) |
karpent | 0:566855d63a2f | 123 | { |
karpent | 0:566855d63a2f | 124 | if( posX >= 0 && posX < DisplayWidth() && posY >=0 && posY < DisplayHeight()) { |
karpent | 0:566855d63a2f | 125 | BSP_LCD_DrawPixel(posX, posY, colorMask); |
karpent | 0:566855d63a2f | 126 | } |
karpent | 0:566855d63a2f | 127 | } |
karpent | 0:566855d63a2f | 128 | |
karpent | 0:566855d63a2f | 129 | |
karpent | 0:566855d63a2f | 130 | //void RK043FN48H::DrawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2) |
karpent | 0:566855d63a2f | 131 | //{ |
karpent | 0:566855d63a2f | 132 | // BSP_LCD_DrawLine(x1, y1, x2, y2); |
karpent | 0:566855d63a2f | 133 | //} |
karpent | 0:566855d63a2f | 134 | |
karpent | 0:566855d63a2f | 135 | |
karpent | 0:566855d63a2f | 136 | void RK043FN48H::CopyBitmap(Layer layer, uint8_t * bitmap, uint32_t width, uint32_t height, uint32_t rgbGolorCode) |
karpent | 0:566855d63a2f | 137 | { |
karpent | 0:566855d63a2f | 138 | // Check size |
karpent | 0:566855d63a2f | 139 | if(width > DisplayWidth() || height > DisplayHeight()) |
karpent | 0:566855d63a2f | 140 | return; |
karpent | 0:566855d63a2f | 141 | |
karpent | 0:566855d63a2f | 142 | ClearLayer(layer, 0x00000000); |
karpent | 0:566855d63a2f | 143 | |
karpent | 0:566855d63a2f | 144 | uint16_t maxCol = width / 8; // 60 columns |
karpent | 0:566855d63a2f | 145 | if ((width % 8) != 0) |
karpent | 0:566855d63a2f | 146 | { |
karpent | 0:566855d63a2f | 147 | maxCol++; |
karpent | 0:566855d63a2f | 148 | } |
karpent | 0:566855d63a2f | 149 | |
karpent | 0:566855d63a2f | 150 | for (int y = 0; y < height; y++) { |
karpent | 0:566855d63a2f | 151 | for (int col = 0; col < maxCol; col++) { |
karpent | 0:566855d63a2f | 152 | uint8_t shift = bitmap[y*maxCol + col]; |
karpent | 0:566855d63a2f | 153 | for (int pos = 0; pos < 8; pos++) { |
karpent | 0:566855d63a2f | 154 | int x = (col << 3) + pos; // x = col * 8 + pos |
karpent | 0:566855d63a2f | 155 | if (x >= width) |
karpent | 0:566855d63a2f | 156 | break; |
karpent | 0:566855d63a2f | 157 | |
karpent | 0:566855d63a2f | 158 | if(shift & 1 << pos) |
karpent | 0:566855d63a2f | 159 | { |
karpent | 0:566855d63a2f | 160 | DrawPoint(x, y, rgbGolorCode); |
karpent | 0:566855d63a2f | 161 | } |
karpent | 0:566855d63a2f | 162 | } |
karpent | 0:566855d63a2f | 163 | } |
karpent | 0:566855d63a2f | 164 | } |
karpent | 0:566855d63a2f | 165 | } |
karpent | 0:566855d63a2f | 166 | |
karpent | 0:566855d63a2f | 167 | |
karpent | 0:566855d63a2f | 168 | uint16_t RK043FN48H::DisplayWidth() |
karpent | 0:566855d63a2f | 169 | { |
karpent | 0:566855d63a2f | 170 | return BSP_LCD_GetXSize(); |
karpent | 0:566855d63a2f | 171 | } |
karpent | 0:566855d63a2f | 172 | |
karpent | 0:566855d63a2f | 173 | |
karpent | 0:566855d63a2f | 174 | uint16_t RK043FN48H::DisplayHeight() |
karpent | 0:566855d63a2f | 175 | { |
karpent | 0:566855d63a2f | 176 | return BSP_LCD_GetYSize(); |
karpent | 0:566855d63a2f | 177 | } |
karpent | 0:566855d63a2f | 178 | |
karpent | 0:566855d63a2f | 179 | |
karpent | 0:566855d63a2f | 180 | void RK043FN48H::SetActiveLayer(Layer layer) |
karpent | 0:566855d63a2f | 181 | { |
karpent | 0:566855d63a2f | 182 | _selectedLayer = layer; |
karpent | 0:566855d63a2f | 183 | |
karpent | 0:566855d63a2f | 184 | BSP_LCD_SelectLayer((uint32_t)layer); |
karpent | 0:566855d63a2f | 185 | } |
karpent | 0:566855d63a2f | 186 | |
karpent | 0:566855d63a2f | 187 | |
karpent | 0:566855d63a2f | 188 | Layer RK043FN48H::GetActiveLayer() |
karpent | 0:566855d63a2f | 189 | { |
karpent | 0:566855d63a2f | 190 | return _selectedLayer; |
karpent | 0:566855d63a2f | 191 | } |
karpent | 0:566855d63a2f | 192 | |
karpent | 0:566855d63a2f | 193 | |
karpent | 0:566855d63a2f | 194 | void RK043FN48H::SetLayersTransparency( uint8_t background, uint8_t foreground) |
karpent | 0:566855d63a2f | 195 | { |
karpent | 0:566855d63a2f | 196 | BSP_LCD_SetTransparency(0, background); |
karpent | 0:566855d63a2f | 197 | BSP_LCD_SetTransparency(1, foreground); |
karpent | 0:566855d63a2f | 198 | } |
karpent | 0:566855d63a2f | 199 | |
karpent | 0:566855d63a2f | 200 | |
karpent | 0:566855d63a2f | 201 | void RK043FN48H::SetLayersVisibility( bool background, bool foreground) |
karpent | 0:566855d63a2f | 202 | { |
karpent | 0:566855d63a2f | 203 | BSP_LCD_SetLayerVisible(0, background ? ENABLE : DISABLE); |
karpent | 0:566855d63a2f | 204 | BSP_LCD_SetLayerVisible(1, foreground ? ENABLE : DISABLE); |
karpent | 0:566855d63a2f | 205 | } |
karpent | 0:566855d63a2f | 206 | |
karpent | 0:566855d63a2f | 207 | |
karpent | 2:02b7b78e8510 | 208 | //============================================================================== |
karpent | 2:02b7b78e8510 | 209 | // |
karpent | 2:02b7b78e8510 | 210 | // Text output |
karpent | 2:02b7b78e8510 | 211 | // |
karpent | 2:02b7b78e8510 | 212 | //============================================================================== |
karpent | 0:566855d63a2f | 213 | |
karpent | 2:02b7b78e8510 | 214 | void RK043FN48H::GotoXY(int x, int y) |
karpent | 2:02b7b78e8510 | 215 | { |
karpent | 2:02b7b78e8510 | 216 | _cursorPos[_selectedLayer].X = x; |
karpent | 2:02b7b78e8510 | 217 | _cursorPos[_selectedLayer].Y = y; |
karpent | 2:02b7b78e8510 | 218 | } |
karpent | 2:02b7b78e8510 | 219 | |
karpent | 2:02b7b78e8510 | 220 | void RK043FN48H::gotoNewLine(int width, int height) |
karpent | 2:02b7b78e8510 | 221 | { |
karpent | 2:02b7b78e8510 | 222 | GotoXY(0, _cursorPos[_selectedLayer].X + height >= DisplayHeight() ? 0 : _cursorPos[_selectedLayer].Y + height); |
karpent | 2:02b7b78e8510 | 223 | } |
karpent | 2:02b7b78e8510 | 224 | |
karpent | 2:02b7b78e8510 | 225 | void RK043FN48H::putch(char ch) |
karpent | 2:02b7b78e8510 | 226 | { |
karpent | 2:02b7b78e8510 | 227 | int fontHeight = _selectedFont[_selectedLayer].Height(); |
karpent | 2:02b7b78e8510 | 228 | int fontWidth = _selectedFont[_selectedLayer].Width(); |
karpent | 2:02b7b78e8510 | 229 | |
karpent | 2:02b7b78e8510 | 230 | if(ch == 0x0A) // '/r' |
karpent | 2:02b7b78e8510 | 231 | return; |
karpent | 2:02b7b78e8510 | 232 | |
karpent | 2:02b7b78e8510 | 233 | if(ch == 0x0D) { // '/n' |
karpent | 2:02b7b78e8510 | 234 | gotoNewLine(fontWidth, fontHeight); |
karpent | 2:02b7b78e8510 | 235 | return; |
karpent | 2:02b7b78e8510 | 236 | } |
karpent | 2:02b7b78e8510 | 237 | |
karpent | 2:02b7b78e8510 | 238 | // Check that the character will fit on the screen |
karpent | 2:02b7b78e8510 | 239 | if(_cursorPos[_selectedLayer].X + fontWidth >= DisplayWidth()) |
karpent | 2:02b7b78e8510 | 240 | { |
karpent | 2:02b7b78e8510 | 241 | gotoNewLine(fontWidth, fontHeight); |
karpent | 2:02b7b78e8510 | 242 | } |
karpent | 2:02b7b78e8510 | 243 | |
karpent | 2:02b7b78e8510 | 244 | BSP_LCD_DisplayChar(_cursorPos[_selectedLayer].X, _cursorPos[_selectedLayer].Y, ch); |
karpent | 2:02b7b78e8510 | 245 | GotoXY(_cursorPos[_selectedLayer].X + fontWidth, _cursorPos[_selectedLayer].Y); |
karpent | 2:02b7b78e8510 | 246 | } |
karpent | 2:02b7b78e8510 | 247 | |
karpent | 2:02b7b78e8510 | 248 | |
karpent | 2:02b7b78e8510 | 249 | void RK043FN48H::puts(const char * str) |
karpent | 2:02b7b78e8510 | 250 | { |
karpent | 2:02b7b78e8510 | 251 | for(int i=0; i < strlen(str); i++) |
karpent | 2:02b7b78e8510 | 252 | putch(*(str+i)); |
karpent | 2:02b7b78e8510 | 253 | } |
karpent | 2:02b7b78e8510 | 254 | |
karpent | 2:02b7b78e8510 | 255 | |
karpent | 2:02b7b78e8510 | 256 | void RK043FN48H::DrawText(int posX, int posY, char * str) |
karpent | 2:02b7b78e8510 | 257 | { |
karpent | 2:02b7b78e8510 | 258 | // Draw text horizontaly |
karpent | 2:02b7b78e8510 | 259 | int fontWidth = _selectedFont[_selectedLayer].Width(); |
karpent | 2:02b7b78e8510 | 260 | int x = posX; |
karpent | 2:02b7b78e8510 | 261 | |
karpent | 2:02b7b78e8510 | 262 | for(int i=0; i < strlen(str); i++) |
karpent | 2:02b7b78e8510 | 263 | { |
karpent | 2:02b7b78e8510 | 264 | BSP_LCD_DisplayChar(x, posY, str[i]); |
karpent | 2:02b7b78e8510 | 265 | x += fontWidth; |
karpent | 2:02b7b78e8510 | 266 | } |
karpent | 2:02b7b78e8510 | 267 | } |
karpent | 2:02b7b78e8510 | 268 | |
karpent | 2:02b7b78e8510 | 269 | |
karpent | 2:02b7b78e8510 | 270 |