Library to control a Graphics TFT connected to 4-wire SPI - revised for the Raio RA8875 Display Controller.
Dependents: FRDM_RA8875_mPaint RA8875_Demo RA8875_KeyPadDemo SignalGenerator ... more
Fork of SPI_TFT by
See Components - RA8875 Based Display
Enhanced touch-screen support - where it previous supported both the Resistive Touch and Capacitive Touch based on the FT5206 Touch Controller, now it also has support for the GSL1680 Touch Controller.
Offline Help Manual (Windows chm)
/media/uploads/WiredHome/ra8875.zip.bin (download, rename to .zip and unzip)
Diff: RA8875.cpp
- Revision:
- 98:ecebed9b80b2
- Parent:
- 96:40b74dd3695b
- Child:
- 100:0b084475d5a9
--- a/RA8875.cpp Sat Nov 28 15:39:44 2015 +0000 +++ b/RA8875.cpp Thu Dec 17 12:16:40 2015 +0000 @@ -15,10 +15,10 @@ // INFO("Stuff to show %d", var); // new-line is automatically appended // #if (defined(DEBUG) && !defined(TARGET_LPC11U24)) -#define INFO(x, ...) std::printf("[INF %s %3d] "x"\r\n", DEBUG, __LINE__, ##__VA_ARGS__); -#define WARN(x, ...) std::printf("[WRN %s %3d] "x"\r\n", DEBUG, __LINE__, ##__VA_ARGS__); -#define ERR(x, ...) std::printf("[ERR %s %3d] "x"\r\n", DEBUG, __LINE__, ##__VA_ARGS__); -static void HexDump(char * title, uint8_t * p, int count) +#define INFO(x, ...) std::printf("[INF %s %4d] "x"\r\n", DEBUG, __LINE__, ##__VA_ARGS__); +#define WARN(x, ...) std::printf("[WRN %s %4d] "x"\r\n", DEBUG, __LINE__, ##__VA_ARGS__); +#define ERR(x, ...) std::printf("[ERR %s %4d] "x"\r\n", DEBUG, __LINE__, ##__VA_ARGS__); +static void HexDump(const char * title, const uint8_t * p, int count) { int i; char buf[100] = "0000: "; @@ -108,10 +108,10 @@ RetCode_t RA8875::init(int width, int height, int color_bpp, bool poweron, bool keypadon, bool touchscreenon) { - font = NULL; // no external font, use internal. - pKeyMap = DefaultKeyMap; // set default key map - _select(false); // deselect the display - frequency(RA8875_DEFAULT_SPI_FREQ); // data rate + font = NULL; // no external font, use internal. + pKeyMap = DefaultKeyMap; // set default key map + _select(false); // deselect the display + frequency(RA8875_DEFAULT_SPI_FREQ); // data rate Reset(); WriteCommand(0x88, 0x0B); // PLLC1 - Phase Lock Loop registers wait_ms(1); @@ -144,7 +144,7 @@ WriteCommand(0x1c, 0x00); //VNDR1 //Vertical Non-Display Period Bit [8] WriteCommand(0x1d, 0x0e); //VSTR0 //VSYNC Start Position[7:0] WriteCommand(0x1e, 0x06); //VSTR1 //VSYNC Start Position[8] - WriteCommand(0x1f, 0x01); //VPWR //VSYNC Polarity ,VSYNC Pulse Width[6:0] + WriteCommand(0x1f, 0x01); //VPWR //VSYNC Polarity ,VSYNC Pulse Width[6:0] if (width >= 800 && height >= 480 && color_bpp > 8) { WriteCommand(0x20, 0x00); // DPCR - 1-layer mode when the resolution is too high @@ -563,7 +563,7 @@ if (font == NULL) return (((ReadCommand(0x22) >> 2) & 0x3) + 1) * 8; else - return font[1]; + return extFontWidth; } @@ -572,7 +572,7 @@ if (font == NULL) return (((ReadCommand(0x22) >> 0) & 0x3) + 1) * 16; else - return font[2]; + return extFontHeight; } @@ -600,7 +600,6 @@ return screenheight; else return screenwidth; -// return (ReadCommand(0x14) + 1) * 8; } @@ -610,7 +609,6 @@ return screenwidth; else return screenheight; -// return (ReadCommand(0x19) | (ReadCommand(0x1A) << 8)) + 1; } @@ -625,6 +623,7 @@ RetCode_t RA8875::SetTextCursor(loc_t x, loc_t y) { + INFO("SetTextCursor(%d, %d)", x, y); cursor_x = x; // set these values for non-internal fonts cursor_y = y; WriteCommandW(0x2A, x); @@ -635,19 +634,27 @@ loc_t RA8875::GetTextCursor_Y(void) { + loc_t y; + if (font == NULL) - return ReadCommand(0x2C) | (ReadCommand(0x2D) << 8); + y = ReadCommand(0x2C) | (ReadCommand(0x2D) << 8); else - return cursor_y; + y = cursor_y; + INFO("GetTextCursor_Y = %d", y); + return y; } loc_t RA8875::GetTextCursor_X(void) { + loc_t x; + if (font == NULL) - return ReadCommand(0x2A) | (ReadCommand(0x2B) << 8); + x = ReadCommand(0x2A) | (ReadCommand(0x2B) << 8); else - return cursor_x; + x = cursor_x; + INFO("GetTextCursor_X = %d", x); + return x; } @@ -745,7 +752,7 @@ vScale >= 1 && vScale <= 4) { uint8_t fncr1Val = ReadCommand(0x22); - fncr1Val &= ~0x10; // do not disturbe the rotate flag + fncr1Val &= ~0x10; // do not disturb the rotate flag if (alignment == align_full) fncr1Val |= 0x80; if (fillit == NOFILL) @@ -793,15 +800,15 @@ if (c == '\r') { cursor_x = 0; } else if (c == '\n') { - cursor_y += font[2]; + cursor_y += extFontHeight; } else { int advance = character(cursor_x, cursor_y, c); // advance tells us how many pixels we advanced - //INFO("x,y,advance %d,%d,%d", cursor_x, cursor_y, advance); + INFO("x,y,advance %d,%d,%d '%c", cursor_x, cursor_y, advance, c); if (advance) { cursor_x += advance; if (cursor_x >= width()) { cursor_x = 0; - cursor_y += font[2]; + cursor_y += extFontHeight; if (cursor_y >= height()) { cursor_y = 0; // @todo Should it scroll? } @@ -878,10 +885,11 @@ unsigned char mwcr0 = ReadCommand(0x40); if (font == NULL) { - if ((mwcr0 & 0x80) == 0x00) + if ((mwcr0 & 0x80) == 0x00) { WriteCommand(0x40,0x80); // Put in Text mode if not already - } else { - _StartGraphicsStream(); + } + //} else { + // _StartGraphicsStream(); } if (*string != '\0') { #if 1 @@ -899,8 +907,8 @@ _select(false); #endif } - if (font) - _EndGraphicsStream(); + //if (font) + // _EndGraphicsStream(); } @@ -1474,10 +1482,33 @@ SetTextCursor(cursor_x, cursor_y); // soft-font cursor -> hw cursor } font = _font; - GraphicsDisplay::set_font(_font); - return noerror; // trusting them, but it might be good to put some checks in here... + return GraphicsDisplay::set_font(_font); // trusting them, but it might be good to put some checks in here... } +RetCode_t RA8875::SelectUserFont(const uint8_t * _font) +{ + INFO("Cursor(%d,%d) %p", cursor_x, cursor_y, _font); + INFO("Text C(%d,%d)", GetTextCursor_X(), GetTextCursor_Y()); + if (_font) { + HexDump("Font Memory", _font, 16); + extFontHeight = _font[6]; + uint32_t totalWidth = 0; + uint16_t firstChar = _font[3] * 256 + _font[2]; + uint16_t lastChar = _font[5] * 256 + _font[4]; + uint16_t i; + + for (i=firstChar; i<=lastChar; i++) { + // 8 bytes of preamble to the first level lookup table + uint16_t offsetToCharLookup = 8 + 4 * (i - firstChar); // 4-bytes: width(pixels), 16-bit offset from table start, 0 + totalWidth += _font[offsetToCharLookup]; + } + extFontWidth = totalWidth / (lastChar - firstChar); + INFO("Font Metrics: Avg W: %2d, H: %2d, First:%d, Last:%d", extFontWidth, extFontHeight, firstChar, lastChar); + } + SetTextCursor(GetTextCursor_X(), GetTextCursor_Y()); // soft-font cursor -> hw cursor + font = _font; + return GraphicsDisplay::SelectUserFont(_font); +} RetCode_t RA8875::background(color_t color) { @@ -1631,7 +1662,7 @@ color_t * pixelBuffer = NULL; color_t * pixelBuffer2 = NULL; - INFO("(%d,%d) - (%d,%d) %s", x,y,w,h,Name_BMP); + INFO("(%d,%d) - (%d,%d)", x,y,w,h); if (x >= 0 && x < width() && y >= 0 && y < height() && w > 0 && x + w <= width() @@ -1971,8 +2002,8 @@ #ifdef TESTENABLE -#include "Arial12x12.h" -#include "Small_6.h" +#include "BPG_Arial08x08.h" +#include "BPG_Arial20x20.h" // ______________ ______________ ______________ _______________ // /_____ _____/ / ___________/ / ___________/ /_____ ______/ @@ -2202,12 +2233,14 @@ display.Backlight(1); display.puts(0,0, "External Font Test."); - display.set_font(Small_6); + display.SelectUserFont(BPG_Arial08x08); display.puts(0,30, "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\r\n"); - display.set_font(Arial12x12); + display.SelectUserFont(BPG_Arial20x20); display.puts("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\r\n"); - display.set_font(); // restore to internal + + display.SelectUserFont(); + //display.set_font(); // restore to internal display.puts("Normal font again."); //display.window(0,0, display.width(), display.height()); @@ -2590,7 +2623,7 @@ void TouchPanelTest(RA8875 & display, Serial & pc) { Timer t; - loc_t x, y; + int x, y; tpMatrix_t calmatrix; display.background(Black);