Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of RA8875 by
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);