LA: Adding some "Ex" features to DmTftBase

Committer:
lex9296
Date:
Fri Mar 11 10:09:43 2022 +0000
Revision:
18:980fff4fd306
Parent:
7:6cd8c36cbdb3
Added some "DrawVerticalLineEx" with INT "Length"

Who changed what in which revision?

UserRevisionLine numberNew contents of line
displaymodule 0:d6ff5fa503e8 1 /**********************************************************************************************
displaymodule 0:d6ff5fa503e8 2 Copyright (c) 2014 DisplayModule. All rights reserved.
displaymodule 0:d6ff5fa503e8 3
displaymodule 0:d6ff5fa503e8 4 Redistribution and use of this source code, part of this source code or any compiled binary
displaymodule 0:d6ff5fa503e8 5 based on this source code is permitted as long as the above copyright notice and following
displaymodule 0:d6ff5fa503e8 6 disclaimer is retained.
displaymodule 0:d6ff5fa503e8 7
displaymodule 0:d6ff5fa503e8 8 DISCLAIMER:
displaymodule 0:d6ff5fa503e8 9 THIS SOFTWARE IS SUPPLIED "AS IS" WITHOUT ANY WARRANTIES AND SUPPORT. DISPLAYMODULE ASSUMES
displaymodule 0:d6ff5fa503e8 10 NO RESPONSIBILITY OR LIABILITY FOR THE USE OF THE SOFTWARE.
displaymodule 0:d6ff5fa503e8 11 ********************************************************************************************/
displaymodule 0:d6ff5fa503e8 12
displaymodule 0:d6ff5fa503e8 13 #include "DmTftBase.h"
displaymodule 0:d6ff5fa503e8 14
displaymodule 0:d6ff5fa503e8 15 #define FONT_CHAR_WIDTH 8
displaymodule 0:d6ff5fa503e8 16 #define FONT_CHAR_HEIGHT 16
displaymodule 0:d6ff5fa503e8 17 extern uint8_t font[];
displaymodule 0:d6ff5fa503e8 18
displaymodule 0:d6ff5fa503e8 19 /*
displaymodule 0:d6ff5fa503e8 20 * Macro to read the 8 bits representing one line of a character.
displaymodule 0:d6ff5fa503e8 21 * The macro is needed as the reading is handled differently on
displaymodule 0:d6ff5fa503e8 22 * Arduino and Mbed platforms.
displaymodule 0:d6ff5fa503e8 23 */
displaymodule 0:d6ff5fa503e8 24 #if defined (DM_TOOLCHAIN_ARDUINO)
displaymodule 0:d6ff5fa503e8 25 #define read_font_line(__char, __line) \
displaymodule 0:d6ff5fa503e8 26 pgm_read_byte(&font[((uint16_t)(__char))*FONT_CHAR_HEIGHT+(__line)])
displaymodule 0:d6ff5fa503e8 27 #elif defined (DM_TOOLCHAIN_MBED)
displaymodule 0:d6ff5fa503e8 28 #define read_font_line(__char, __line) \
displaymodule 0:d6ff5fa503e8 29 font[((uint16_t)(__char))*FONT_CHAR_HEIGHT+(__line)]
displaymodule 0:d6ff5fa503e8 30 #endif
displaymodule 0:d6ff5fa503e8 31
displaymodule 0:d6ff5fa503e8 32
displaymodule 0:d6ff5fa503e8 33 void DmTftBase::setPixel(uint16_t x, uint16_t y, uint16_t color) {
displaymodule 0:d6ff5fa503e8 34 cbi(_pinCS, _bitmaskCS);
displaymodule 0:d6ff5fa503e8 35
displaymodule 7:6cd8c36cbdb3 36 if ((x >= _width) || (y >= _height)) {
displaymodule 7:6cd8c36cbdb3 37 return;
displaymodule 7:6cd8c36cbdb3 38 }
displaymodule 7:6cd8c36cbdb3 39
displaymodule 0:d6ff5fa503e8 40 setAddress(x, y, x, y);
displaymodule 0:d6ff5fa503e8 41
displaymodule 0:d6ff5fa503e8 42 sendData(color);
displaymodule 0:d6ff5fa503e8 43 sbi(_pinCS, _bitmaskCS);
displaymodule 0:d6ff5fa503e8 44 }
displaymodule 0:d6ff5fa503e8 45
displaymodule 0:d6ff5fa503e8 46 void DmTftBase::clearScreen(uint16_t color) {
displaymodule 0:d6ff5fa503e8 47 cbi(_pinCS, _bitmaskCS);
displaymodule 0:d6ff5fa503e8 48
displaymodule 0:d6ff5fa503e8 49 setAddress(0,0,_width-1, _height-1);
displaymodule 0:d6ff5fa503e8 50
displaymodule 0:d6ff5fa503e8 51 for(uint16_t i=0; i<_height; i++) {
displaymodule 0:d6ff5fa503e8 52 for(uint16_t j=0; j<_width; j++) {
displaymodule 0:d6ff5fa503e8 53 sendData(color);
displaymodule 0:d6ff5fa503e8 54 }
displaymodule 0:d6ff5fa503e8 55 }
displaymodule 0:d6ff5fa503e8 56
displaymodule 0:d6ff5fa503e8 57 sbi(_pinCS, _bitmaskCS);
displaymodule 0:d6ff5fa503e8 58 }
displaymodule 0:d6ff5fa503e8 59
displaymodule 0:d6ff5fa503e8 60 void DmTftBase::drawHorizontalLine(uint16_t x, uint16_t y, uint16_t length, uint16_t color) {
displaymodule 0:d6ff5fa503e8 61 cbi(_pinCS, _bitmaskCS);
displaymodule 0:d6ff5fa503e8 62
displaymodule 0:d6ff5fa503e8 63 setAddress(x, y, x + length, y);
displaymodule 0:d6ff5fa503e8 64
displaymodule 0:d6ff5fa503e8 65 for (int i = 0; i <= length; i++) {
displaymodule 0:d6ff5fa503e8 66 sendData(color);
displaymodule 0:d6ff5fa503e8 67 }
displaymodule 0:d6ff5fa503e8 68
displaymodule 0:d6ff5fa503e8 69 sbi(_pinCS, _bitmaskCS);
displaymodule 0:d6ff5fa503e8 70 }
displaymodule 0:d6ff5fa503e8 71
displaymodule 0:d6ff5fa503e8 72 void DmTftBase::drawVerticalLine(uint16_t x, uint16_t y, uint16_t length, uint16_t color) {
displaymodule 0:d6ff5fa503e8 73 cbi(_pinCS, _bitmaskCS);
displaymodule 0:d6ff5fa503e8 74
displaymodule 0:d6ff5fa503e8 75 setAddress(x, y, x, y + length);
displaymodule 0:d6ff5fa503e8 76
displaymodule 0:d6ff5fa503e8 77 for (int i = 0; i <= length; i++) {
displaymodule 0:d6ff5fa503e8 78 sendData(color);
displaymodule 0:d6ff5fa503e8 79 }
displaymodule 0:d6ff5fa503e8 80
displaymodule 0:d6ff5fa503e8 81 sbi(_pinCS, _bitmaskCS);
displaymodule 0:d6ff5fa503e8 82 }
displaymodule 0:d6ff5fa503e8 83
lex9296 18:980fff4fd306 84 void DmTftBase::drawVerticalLineEx (uint16_t ui16_X, uint16_t ui16_Y, int16_t i16_YLen, uint16_t ui16_Color) {
lex9296 18:980fff4fd306 85 cbi(_pinCS, _bitmaskCS);
lex9296 18:980fff4fd306 86
lex9296 18:980fff4fd306 87 if (i16_YLen >= 0)
lex9296 18:980fff4fd306 88 setAddress(ui16_X, ui16_Y, ui16_X, ui16_Y+ i16_YLen);
lex9296 18:980fff4fd306 89 else
lex9296 18:980fff4fd306 90 setAddress(ui16_X, ui16_Y+ i16_YLen, ui16_X, ui16_Y);
lex9296 18:980fff4fd306 91
lex9296 18:980fff4fd306 92 for (int i = 0; i <= abs(i16_YLen); i++)
lex9296 18:980fff4fd306 93 sendData(ui16_Color);
lex9296 18:980fff4fd306 94
lex9296 18:980fff4fd306 95 sbi(_pinCS, _bitmaskCS);
lex9296 18:980fff4fd306 96 }
lex9296 18:980fff4fd306 97
displaymodule 0:d6ff5fa503e8 98 void DmTftBase::drawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t color) {
displaymodule 0:d6ff5fa503e8 99 int x = x1-x0;
displaymodule 0:d6ff5fa503e8 100 int y = y1-y0;
displaymodule 0:d6ff5fa503e8 101 int dx = abs(x), sx = x0<x1 ? 1 : -1;
displaymodule 0:d6ff5fa503e8 102 int dy = -abs(y), sy = y0<y1 ? 1 : -1;
displaymodule 0:d6ff5fa503e8 103 int err = dx+dy, e2; /* error value e_xy */
displaymodule 0:d6ff5fa503e8 104 for (;;) {
displaymodule 0:d6ff5fa503e8 105 setPixel(x0,y0,color);
displaymodule 0:d6ff5fa503e8 106 e2 = 2*err;
displaymodule 0:d6ff5fa503e8 107 if (e2 >= dy) { /* e_xy+e_x > 0 */
displaymodule 0:d6ff5fa503e8 108 if (x0 == x1) {
displaymodule 0:d6ff5fa503e8 109 break;
displaymodule 0:d6ff5fa503e8 110 }
displaymodule 0:d6ff5fa503e8 111 err += dy; x0 += sx;
displaymodule 0:d6ff5fa503e8 112 }
displaymodule 0:d6ff5fa503e8 113 if (e2 <= dx) { /* e_xy+e_y < 0 */
displaymodule 0:d6ff5fa503e8 114 if (y0 == y1) {
displaymodule 0:d6ff5fa503e8 115 break;
displaymodule 0:d6ff5fa503e8 116 }
displaymodule 0:d6ff5fa503e8 117 err += dx; y0 += sy;
displaymodule 0:d6ff5fa503e8 118 }
displaymodule 0:d6ff5fa503e8 119 }
displaymodule 0:d6ff5fa503e8 120 }
displaymodule 0:d6ff5fa503e8 121
displaymodule 0:d6ff5fa503e8 122 void DmTftBase::drawRectangle(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t color) {
displaymodule 0:d6ff5fa503e8 123 // Make sure x0,y0 are in the top left corner
displaymodule 0:d6ff5fa503e8 124 if(x0 > x1) {
displaymodule 0:d6ff5fa503e8 125 x0 = x0^x1;
displaymodule 0:d6ff5fa503e8 126 x1 = x0^x1;
displaymodule 0:d6ff5fa503e8 127 x0 = x0^x1;
displaymodule 0:d6ff5fa503e8 128 }
displaymodule 0:d6ff5fa503e8 129 if(y0 > y1) {
displaymodule 0:d6ff5fa503e8 130 y0 = y0^y1;
displaymodule 0:d6ff5fa503e8 131 y1 = y0^y1;
displaymodule 0:d6ff5fa503e8 132 y0 = y0^y1;
displaymodule 0:d6ff5fa503e8 133 }
displaymodule 0:d6ff5fa503e8 134
displaymodule 0:d6ff5fa503e8 135 drawHorizontalLine(x0, y0, x1-x0, color);
displaymodule 0:d6ff5fa503e8 136 drawHorizontalLine(x0, y1, x1-x0, color);
displaymodule 0:d6ff5fa503e8 137 drawVerticalLine(x0, y0, y1-y0, color);
displaymodule 0:d6ff5fa503e8 138 drawVerticalLine(x1, y0, y1-y0, color);
displaymodule 0:d6ff5fa503e8 139 }
displaymodule 0:d6ff5fa503e8 140
displaymodule 0:d6ff5fa503e8 141 void DmTftBase::fillRectangle(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t color) {
displaymodule 0:d6ff5fa503e8 142 unsigned long numPixels=0;
displaymodule 0:d6ff5fa503e8 143 unsigned long i=0;
displaymodule 0:d6ff5fa503e8 144
displaymodule 0:d6ff5fa503e8 145 // Make sure x0,y0 are in the top left corner
displaymodule 0:d6ff5fa503e8 146 if(x0 > x1) {
displaymodule 0:d6ff5fa503e8 147 x0 = x0^x1;
displaymodule 0:d6ff5fa503e8 148 x1 = x0^x1;
displaymodule 0:d6ff5fa503e8 149 x0 = x0^x1;
displaymodule 0:d6ff5fa503e8 150 }
displaymodule 0:d6ff5fa503e8 151 if(y0 > y1) {
displaymodule 0:d6ff5fa503e8 152 y0 = y0^y1;
displaymodule 0:d6ff5fa503e8 153 y1 = y0^y1;
displaymodule 0:d6ff5fa503e8 154 y0 = y0^y1;
displaymodule 0:d6ff5fa503e8 155 }
displaymodule 0:d6ff5fa503e8 156
displaymodule 0:d6ff5fa503e8 157 x0 = constrain(x0, 0, _width-1);
displaymodule 0:d6ff5fa503e8 158 x1 = constrain(x1, 0, _width-1);
displaymodule 0:d6ff5fa503e8 159 y0 = constrain(y0, 0, _height-1);
displaymodule 0:d6ff5fa503e8 160 y1 = constrain(y1, 0, _height-1);
displaymodule 0:d6ff5fa503e8 161
displaymodule 0:d6ff5fa503e8 162 numPixels = (x1-x0+1);
displaymodule 0:d6ff5fa503e8 163 numPixels = numPixels*(y1-y0+1);
displaymodule 0:d6ff5fa503e8 164
displaymodule 0:d6ff5fa503e8 165 cbi(_pinCS, _bitmaskCS);
displaymodule 0:d6ff5fa503e8 166 setAddress(x0,y0,x1,y1);/* start to write to display ra */
displaymodule 0:d6ff5fa503e8 167
displaymodule 0:d6ff5fa503e8 168 for(i=0; i < numPixels; i++) {
displaymodule 0:d6ff5fa503e8 169 sendData(color);
displaymodule 0:d6ff5fa503e8 170 }
displaymodule 0:d6ff5fa503e8 171
displaymodule 0:d6ff5fa503e8 172 sbi(_pinCS, _bitmaskCS);
displaymodule 0:d6ff5fa503e8 173 }
displaymodule 0:d6ff5fa503e8 174
displaymodule 0:d6ff5fa503e8 175 void DmTftBase::drawCircle(uint16_t x0, uint16_t y0, uint16_t r, uint16_t color) {
displaymodule 0:d6ff5fa503e8 176 int x = -r, y = 0, err = 2-2*r, e2;
displaymodule 0:d6ff5fa503e8 177 do {
displaymodule 0:d6ff5fa503e8 178 setPixel(x0-x, y0+y, color);
displaymodule 0:d6ff5fa503e8 179 setPixel(x0+x, y0+y, color);
displaymodule 0:d6ff5fa503e8 180 setPixel(x0+x, y0-y, color);
displaymodule 0:d6ff5fa503e8 181 setPixel(x0-x, y0-y, color);
displaymodule 0:d6ff5fa503e8 182 e2 = err;
displaymodule 0:d6ff5fa503e8 183 if (e2 <= y) {
displaymodule 0:d6ff5fa503e8 184 err += ++y*2+1;
displaymodule 0:d6ff5fa503e8 185 if (-x == y && e2 <= x) {
displaymodule 0:d6ff5fa503e8 186 e2 = 0;
displaymodule 0:d6ff5fa503e8 187 }
displaymodule 0:d6ff5fa503e8 188 }
displaymodule 0:d6ff5fa503e8 189 if (e2 > x) {
displaymodule 0:d6ff5fa503e8 190 err += ++x * 2 + 1;
displaymodule 0:d6ff5fa503e8 191 }
displaymodule 0:d6ff5fa503e8 192 } while (x <= 0);
displaymodule 0:d6ff5fa503e8 193 }
displaymodule 0:d6ff5fa503e8 194
displaymodule 0:d6ff5fa503e8 195 void DmTftBase::fillCircle(uint16_t x0, uint16_t y0, uint16_t r, uint16_t color) {
displaymodule 0:d6ff5fa503e8 196 int x = -r, y = 0, err = 2-2*r, e2;
displaymodule 0:d6ff5fa503e8 197 do {
displaymodule 0:d6ff5fa503e8 198 drawVerticalLine(x0-x, y0-y, 2*y, color);
displaymodule 0:d6ff5fa503e8 199 drawVerticalLine(x0+x, y0-y, 2*y, color);
displaymodule 0:d6ff5fa503e8 200
displaymodule 0:d6ff5fa503e8 201 e2 = err;
displaymodule 0:d6ff5fa503e8 202 if (e2 <= y) {
displaymodule 0:d6ff5fa503e8 203 err += ++y * 2 + 1;
displaymodule 0:d6ff5fa503e8 204 if (-x == y && e2 <= x) {
displaymodule 0:d6ff5fa503e8 205 e2 = 0;
displaymodule 0:d6ff5fa503e8 206 }
displaymodule 0:d6ff5fa503e8 207 }
displaymodule 0:d6ff5fa503e8 208 if (e2 > x) {
displaymodule 0:d6ff5fa503e8 209 err += ++x*2+1;
displaymodule 0:d6ff5fa503e8 210 }
displaymodule 0:d6ff5fa503e8 211 } while (x <= 0);
displaymodule 0:d6ff5fa503e8 212 }
displaymodule 0:d6ff5fa503e8 213
displaymodule 0:d6ff5fa503e8 214 void DmTftBase::drawTriangle(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t color) {
displaymodule 0:d6ff5fa503e8 215 drawLine(x0, y0, x1, y1, color);
displaymodule 0:d6ff5fa503e8 216 drawLine(x0, y0, x2, y2, color);
displaymodule 0:d6ff5fa503e8 217 drawLine(x1, y1, x2, y2, color);
displaymodule 0:d6ff5fa503e8 218 }
displaymodule 0:d6ff5fa503e8 219
displaymodule 0:d6ff5fa503e8 220 void DmTftBase::drawPoint(uint16_t x, uint16_t y, uint16_t radius) {
displaymodule 0:d6ff5fa503e8 221 if (radius == 0) {
displaymodule 0:d6ff5fa503e8 222 cbi(_pinCS, _bitmaskCS);
displaymodule 0:d6ff5fa503e8 223
displaymodule 0:d6ff5fa503e8 224 setAddress(x,y,x,y);
displaymodule 0:d6ff5fa503e8 225 sendData(_fgColor);
displaymodule 0:d6ff5fa503e8 226
displaymodule 0:d6ff5fa503e8 227 sbi(_pinCS, _bitmaskCS);
displaymodule 0:d6ff5fa503e8 228 } else {
displaymodule 0:d6ff5fa503e8 229 fillRectangle(x-radius,y-radius,x+radius,y+radius, _fgColor);
displaymodule 0:d6ff5fa503e8 230 }
displaymodule 0:d6ff5fa503e8 231 }
displaymodule 0:d6ff5fa503e8 232
displaymodule 0:d6ff5fa503e8 233 void DmTftBase::drawChar(uint16_t x, uint16_t y, char ch, bool transparent) {
displaymodule 0:d6ff5fa503e8 234 cbi(_pinCS, _bitmaskCS);
displaymodule 0:d6ff5fa503e8 235
displaymodule 0:d6ff5fa503e8 236 uint8_t temp;
displaymodule 0:d6ff5fa503e8 237 uint8_t pos,t;
displaymodule 0:d6ff5fa503e8 238
displaymodule 0:d6ff5fa503e8 239 if ((x > (_width - FONT_CHAR_WIDTH)) || (y > (_height - FONT_CHAR_HEIGHT))) {
displaymodule 0:d6ff5fa503e8 240 return;
displaymodule 0:d6ff5fa503e8 241 }
displaymodule 0:d6ff5fa503e8 242
displaymodule 0:d6ff5fa503e8 243 ch=ch-' ';
displaymodule 0:d6ff5fa503e8 244 if (!transparent) { // Clear background
displaymodule 0:d6ff5fa503e8 245 setAddress(x,y,x+FONT_CHAR_WIDTH-1,y+FONT_CHAR_HEIGHT-1);
displaymodule 0:d6ff5fa503e8 246 for(pos=0;pos<FONT_CHAR_HEIGHT;pos++) {
displaymodule 0:d6ff5fa503e8 247 temp = read_font_line(ch, pos);
displaymodule 0:d6ff5fa503e8 248 for(t=0;t<FONT_CHAR_WIDTH;t++) {
displaymodule 0:d6ff5fa503e8 249 if (temp & 0x01) {
displaymodule 0:d6ff5fa503e8 250 sendData(_fgColor);
displaymodule 0:d6ff5fa503e8 251 }
displaymodule 0:d6ff5fa503e8 252 else {
displaymodule 0:d6ff5fa503e8 253 sendData(_bgColor);
displaymodule 0:d6ff5fa503e8 254 }
displaymodule 0:d6ff5fa503e8 255 temp>>=1;
displaymodule 0:d6ff5fa503e8 256 }
displaymodule 0:d6ff5fa503e8 257 y++;
displaymodule 0:d6ff5fa503e8 258 }
displaymodule 0:d6ff5fa503e8 259 }
displaymodule 0:d6ff5fa503e8 260 else { //Draw directly without clearing background
displaymodule 0:d6ff5fa503e8 261 for(pos=0;pos<FONT_CHAR_HEIGHT;pos++) {
displaymodule 0:d6ff5fa503e8 262 temp = read_font_line(ch, pos);
displaymodule 0:d6ff5fa503e8 263 for(t=0;t<FONT_CHAR_WIDTH;t++) {
displaymodule 0:d6ff5fa503e8 264 if (temp & 0x01) {
displaymodule 0:d6ff5fa503e8 265 setAddress(x + t, y + pos, x + t, y + pos);
displaymodule 0:d6ff5fa503e8 266 sendData(_fgColor);
displaymodule 0:d6ff5fa503e8 267 //drawPoint(x + t, y + pos);
displaymodule 0:d6ff5fa503e8 268 }
displaymodule 0:d6ff5fa503e8 269 temp>>=1;
displaymodule 0:d6ff5fa503e8 270 }
displaymodule 0:d6ff5fa503e8 271 }
displaymodule 0:d6ff5fa503e8 272 }
displaymodule 0:d6ff5fa503e8 273
displaymodule 0:d6ff5fa503e8 274 sbi(_pinCS, _bitmaskCS);
displaymodule 0:d6ff5fa503e8 275 }
displaymodule 0:d6ff5fa503e8 276
displaymodule 0:d6ff5fa503e8 277 void DmTftBase::drawNumber(uint16_t x, uint16_t y, int num, int digitsToShow, bool leadingZeros) {
displaymodule 0:d6ff5fa503e8 278 bool minus = false;
displaymodule 0:d6ff5fa503e8 279 if (num < 0) {
displaymodule 0:d6ff5fa503e8 280 num = -num;
displaymodule 0:d6ff5fa503e8 281 minus = true;
displaymodule 0:d6ff5fa503e8 282 }
displaymodule 0:d6ff5fa503e8 283 for (int i = 0; i < digitsToShow; i++) {
displaymodule 0:d6ff5fa503e8 284 char c = ' ';
displaymodule 0:d6ff5fa503e8 285 if ((num == 0) && (i > 0)) {
displaymodule 0:d6ff5fa503e8 286 if (leadingZeros) {
displaymodule 0:d6ff5fa503e8 287 c = '0';
displaymodule 0:d6ff5fa503e8 288 if (minus && (i == (digitsToShow-1))) {
displaymodule 0:d6ff5fa503e8 289 c = '-';
displaymodule 0:d6ff5fa503e8 290 }
displaymodule 0:d6ff5fa503e8 291 } else if (minus) {
displaymodule 0:d6ff5fa503e8 292 c = '-';
displaymodule 0:d6ff5fa503e8 293 minus = false;
displaymodule 0:d6ff5fa503e8 294 }
displaymodule 0:d6ff5fa503e8 295 } else {
displaymodule 0:d6ff5fa503e8 296 c = '0' + (num % 10);
displaymodule 0:d6ff5fa503e8 297 }
displaymodule 0:d6ff5fa503e8 298 drawChar(x + FONT_CHAR_WIDTH*(digitsToShow - i - 1), y, c, false);
displaymodule 0:d6ff5fa503e8 299 num = num / 10;
displaymodule 0:d6ff5fa503e8 300 }
displaymodule 0:d6ff5fa503e8 301 }
displaymodule 0:d6ff5fa503e8 302
displaymodule 0:d6ff5fa503e8 303 void DmTftBase::drawString(uint16_t x, uint16_t y, const char *p) {
displaymodule 0:d6ff5fa503e8 304 while(*p!='\0')
displaymodule 0:d6ff5fa503e8 305 {
displaymodule 0:d6ff5fa503e8 306 if(x > (_width - FONT_CHAR_WIDTH)) {
displaymodule 0:d6ff5fa503e8 307 x = 0;
displaymodule 0:d6ff5fa503e8 308 y += FONT_CHAR_HEIGHT;
displaymodule 0:d6ff5fa503e8 309 }
displaymodule 0:d6ff5fa503e8 310 if(y > (_height - FONT_CHAR_HEIGHT)) {
displaymodule 0:d6ff5fa503e8 311 y = x = 0;
displaymodule 0:d6ff5fa503e8 312 }
displaymodule 0:d6ff5fa503e8 313 drawChar(x, y, *p, false);
displaymodule 0:d6ff5fa503e8 314 x += FONT_CHAR_WIDTH;
displaymodule 0:d6ff5fa503e8 315 p++;
displaymodule 0:d6ff5fa503e8 316 }
displaymodule 0:d6ff5fa503e8 317 }
displaymodule 0:d6ff5fa503e8 318
displaymodule 0:d6ff5fa503e8 319 void DmTftBase::drawStringCentered(uint16_t x, uint16_t y, uint16_t width, uint16_t height, const char *p) {
displaymodule 0:d6ff5fa503e8 320 int len = strlen(p);
displaymodule 0:d6ff5fa503e8 321 uint16_t tmp = len * FONT_CHAR_WIDTH;
displaymodule 0:d6ff5fa503e8 322 if (tmp <= width) {
displaymodule 0:d6ff5fa503e8 323 x += (width - tmp)/2;
displaymodule 0:d6ff5fa503e8 324 }
displaymodule 0:d6ff5fa503e8 325 if (FONT_CHAR_HEIGHT <= height) {
displaymodule 0:d6ff5fa503e8 326 y += (height - FONT_CHAR_HEIGHT)/2;
displaymodule 0:d6ff5fa503e8 327 }
displaymodule 0:d6ff5fa503e8 328 drawString(x, y, p);
displaymodule 0:d6ff5fa503e8 329 }
displaymodule 0:d6ff5fa503e8 330
displaymodule 0:d6ff5fa503e8 331 void DmTftBase::drawImage(uint16_t x, uint16_t y, uint16_t width, uint16_t height, const uint16_t* data) {
displaymodule 0:d6ff5fa503e8 332 const uint16_t* p = data;
displaymodule 0:d6ff5fa503e8 333
displaymodule 0:d6ff5fa503e8 334 cbi(_pinCS, _bitmaskCS);
displaymodule 0:d6ff5fa503e8 335
displaymodule 0:d6ff5fa503e8 336 setAddress(x,y,x+width-1,y+height-1);
displaymodule 0:d6ff5fa503e8 337 for (int i = width*height; i > 0; i--) {
displaymodule 0:d6ff5fa503e8 338 sendData(*p);
displaymodule 0:d6ff5fa503e8 339 p++;
displaymodule 0:d6ff5fa503e8 340 }
displaymodule 0:d6ff5fa503e8 341
displaymodule 0:d6ff5fa503e8 342 sbi(_pinCS, _bitmaskCS);
displaymodule 0:d6ff5fa503e8 343 }
displaymodule 0:d6ff5fa503e8 344
displaymodule 0:d6ff5fa503e8 345 void DmTftBase::select(){
displaymodule 0:d6ff5fa503e8 346 cbi(_pinCS, _bitmaskCS);
displaymodule 0:d6ff5fa503e8 347 }
displaymodule 0:d6ff5fa503e8 348
displaymodule 0:d6ff5fa503e8 349 void DmTftBase::unSelect() {
displaymodule 0:d6ff5fa503e8 350 sbi(_pinCS, _bitmaskCS);
displaymodule 0:d6ff5fa503e8 351 }
displaymodule 0:d6ff5fa503e8 352