Fork of David Smart's RA8875 library for the purpose of adding touch screen support

Fork of RA8875 by David Smart

Revision:
44:207594dece70
Parent:
43:3becae133285
Child:
46:1321832f11d8
Child:
48:065cc320473e
Child:
50:2c4f474a2453
--- a/RA8875.cpp	Sun Mar 09 23:45:23 2014 +0000
+++ b/RA8875.cpp	Mon Mar 10 11:40:56 2014 +0000
@@ -1,9 +1,11 @@
 /// RA8875 Display Controller Library.
 /// 
 /// This is being created for a specific display from buydisplay.com,
-/// which is 480 x xxx. It has other attributes (like display controller
+/// which is 480 x 272. It has other attributes (like display controller
 /// managed backlight brightness. So, there are expectations and some
-/// defined constants based on that specific display.
+/// defined constants based on that specific display. Some initial work
+/// was done to support other display resolutions (e.g. 800 x 480), but
+/// this has not been tested.
 ///
 #include "RA8875.h"
 
@@ -84,6 +86,25 @@
     return noerror;
 }
 
+
+RetCode_t RA8875::SetLayerMode(uint8_t mode)
+{
+    WriteCommand(0x52, mode);
+    return noerror;
+}
+
+
+RetCode_t RA8875::SetLayerTransparency(uint8_t layer1, uint8_t layer2)
+{
+    if (layer1 > 8)
+        layer1 = 8;
+    if (layer2 > 8)
+        layer2 = 8;
+    WriteCommand(0x53, ((layer2 & 0xF) << 4) | (layer1 & 0xF));
+    return noerror;
+}
+
+
 #ifdef PERF_METRICS
 void RA8875::ClearPerformance()
 {
@@ -91,6 +112,7 @@
         metrics[i] = 0;
 }
 
+
 void RA8875::RegisterPerformance(method_e method)
 {
     unsigned long elapsed = performance.read_us();
@@ -99,6 +121,7 @@
         metrics[method] = elapsed;
 }
 
+
 void RA8875::ReportPerformance(Serial & pc)
 {
     pc.printf("\r\nPerformance Metrics\r\n");
@@ -108,6 +131,7 @@
 }
 #endif
 
+
 RetCode_t RA8875::WriteCommandW(uint8_t command, uint16_t data)
 {
     #if 1
@@ -127,6 +151,7 @@
     return noerror;
 }
 
+
 RetCode_t RA8875::WriteCommand(unsigned char command, unsigned int data)
 {
     select(true);
@@ -140,6 +165,7 @@
     return noerror;
 }
 
+
 RetCode_t RA8875::WriteDataW(uint16_t data)
 {
     select(true);
@@ -150,6 +176,7 @@
     return noerror;
 }
 
+
 RetCode_t RA8875::WriteData(unsigned char data)
 {
     select(true);
@@ -159,12 +186,14 @@
     return noerror;
 }
 
+
 unsigned char RA8875::ReadCommand(unsigned char command)
 {
     WriteCommand(command);
     return ReadData();
 }
 
+
 unsigned char RA8875::ReadData(void)
 {
     unsigned char data;
@@ -176,6 +205,7 @@
     return data;
 }
 
+
 uint16_t RA8875::ReadDataW(void)
 {
     uint16_t data;
@@ -188,6 +218,7 @@
     return data;
 }
 
+
 unsigned char RA8875::ReadStatus(void)
 {
     unsigned char data;
@@ -199,6 +230,7 @@
     return data;
 }
 
+
 dim_t RA8875::fontwidth(void)
 {
     if (font == NULL)
@@ -207,6 +239,7 @@
         return font[1];
 }
 
+
 dim_t RA8875::fontheight(void)
 {
     if (font == NULL)
@@ -215,31 +248,37 @@
         return font[2];
 }
 
+
 RetCode_t RA8875::locate(textloc_t column, textloc_t row)
 {
     return SetTextCursor(column * fontwidth(), row * fontheight());
 }
 
+
 int RA8875::columns(void)
 {
     return width() / fontwidth();
 }
 
+
 int RA8875::rows(void)
 {
     return height() / fontheight();
 }
 
+
 dim_t RA8875::width(void)
 {
     return (ReadCommand(0x14) + 1) * 8;
 }
 
+
 dim_t RA8875::height(void)
 {
     return (ReadCommand(0x19) | (ReadCommand(0x1A) << 8)) + 1;
 }
 
+
 dim_t RA8875::color_bpp(void)
 {
     if ((ReadCommand(0x10) & 0x0C) == 0x04)
@@ -248,6 +287,7 @@
         return 8;
 }
 
+
 RetCode_t RA8875::SetTextCursor(loc_t x, loc_t y)
 {
     cursor_x = x; cursor_y = y;     // for non-internal fonts
@@ -256,6 +296,7 @@
     return noerror;
 }
 
+
 loc_t RA8875::GetTextCursor_Y(void)
 {
     if (font == NULL)
@@ -264,6 +305,7 @@
         return cursor_y;
 }
 
+
 loc_t RA8875::GetTextCursor_X(void)
 {
     if (font == NULL)
@@ -272,6 +314,7 @@
         return cursor_x;
 }
 
+
 RetCode_t RA8875::SetTextCursorControl(cursor_t cursor, bool blink)
 {
     unsigned char mwcr0 = ReadCommand(0x40) & 0x0F; // retain direction, auto-increase
@@ -309,6 +352,7 @@
     return noerror;
 }
 
+
 RetCode_t RA8875::SetTextFont(RA8875::font_t font)
 {
     if (/*font >= RA8875::ISO8859_1 && */ font <= RA8875::ISO8859_4) {
@@ -319,6 +363,7 @@
     }
 }
 
+
 RetCode_t RA8875::SetTextFontControl(fill_t fillit,
     RA8875::font_angle_t angle, 
     RA8875::HorizontalScale hScale, 
@@ -344,6 +389,7 @@
     }
 }
 
+
 RetCode_t RA8875::SetTextFontSize(RA8875::HorizontalScale hScale, RA8875::VerticalScale vScale)
 {
     unsigned char reg = ReadCommand(0x22);
@@ -361,6 +407,7 @@
     }
 }
 
+
 int RA8875::_putc(int c)
 {
     if (font == NULL) {
@@ -370,6 +417,7 @@
     }
 }
 
+
 int RA8875::_external_putc(int c)
 {
     if (c) {
@@ -395,6 +443,7 @@
     return c;
 }
 
+
 int RA8875::_internal_putc(int c)
 {
     if (c) {
@@ -427,6 +476,7 @@
     return c;
 }
 
+
 RetCode_t RA8875::_StartGraphicsStream(void)
 {
     WriteCommand(0x40,0x00);    // Graphics write mode
@@ -434,23 +484,27 @@
     return noerror;
 }
 
+
 RetCode_t RA8875::_EndGraphicsStream(void)
 {
     return noerror;
 }
 
+
 RetCode_t RA8875::putp(color_t pixel)
 {
     WriteDataW((pixel>>8) | (pixel<<8));
     return noerror;   
 }
 
+
 void RA8875::puts(loc_t x, loc_t y, const char * string)
 {
     SetTextCursor(x,y);
     puts(string);
 }
 
+
 void RA8875::puts(const char * string)
 {
     unsigned char mwcr0 = ReadCommand(0x40);
@@ -482,6 +536,7 @@
         _EndGraphicsStream();
 }
 
+
 RetCode_t RA8875::SetGraphicsCursor(loc_t x, loc_t y)
 {
     WriteCommandW(0x46, x);
@@ -489,6 +544,7 @@
     return noerror;
 }
 
+
 RetCode_t RA8875::SetGraphicsCursorRead(loc_t x, loc_t y)
 {
     //WriteCommand(0x40, 0);  // Graphics mode
@@ -498,6 +554,7 @@
     return noerror;
 }
 
+
 RetCode_t RA8875::window(loc_t x, loc_t y, dim_t width, dim_t height)
 {
     GraphicsDisplay::window(x,y, width,height);
@@ -509,6 +566,7 @@
     return noerror;
 }
 
+
 RetCode_t RA8875::cls(void)
 {
     PERFORMANCE_RESET;
@@ -518,6 +576,7 @@
     return noerror;
 }
 
+
 RetCode_t RA8875::clsw(RA8875::Region_t region)
 {
     PERFORMANCE_RESET;
@@ -528,6 +587,7 @@
     return noerror;
 }
 
+
 RetCode_t RA8875::pixel(loc_t x, loc_t y, color_t color)
 {
     #if 1
@@ -538,6 +598,7 @@
     #endif
 }
 
+
 RetCode_t RA8875::pixel(loc_t x, loc_t y)
 {
     RetCode_t ret;
@@ -553,6 +614,7 @@
     return ret;
 }
 
+
 RetCode_t RA8875::pixelStream(color_t * p, uint32_t count, loc_t x, loc_t y)
 {
     PERFORMANCE_RESET;
@@ -571,6 +633,7 @@
     return(noerror);
 }
 
+
 color_t RA8875::getPixel(loc_t x, loc_t y)
 {
     color_t pixel;
@@ -590,6 +653,7 @@
     return pixel;
 }
 
+
 RetCode_t RA8875::getPixelStream(color_t * p, uint32_t count, loc_t x, loc_t y)
 {
     color_t pixel;
@@ -612,12 +676,14 @@
     return noerror;
 }
 
+
 RetCode_t RA8875::line(loc_t x1, loc_t y1, loc_t x2, loc_t y2, color_t color)
 {
     foreground(color);
     return line(x1,y1,x2,y2);
 }
 
+
 RetCode_t RA8875::line(loc_t x1, loc_t y1, loc_t x2, loc_t y2)
 {
     PERFORMANCE_RESET;
@@ -634,12 +700,14 @@
     return noerror;
 }
 
+
 RetCode_t RA8875::fillrect(loc_t x1, loc_t y1, loc_t x2, loc_t y2, 
     color_t color, fill_t fillit)
 {
     return rect(x1,y1,x2,y2,color,fillit);
 }
 
+
 RetCode_t RA8875::rect(loc_t x1, loc_t y1, loc_t x2, loc_t y2, 
     color_t color, fill_t fillit)
 {
@@ -647,6 +715,7 @@
     return rect(x1,y1,x2,y2,fillit);
 }
 
+
 RetCode_t RA8875::rect(loc_t x1, loc_t y1, loc_t x2, loc_t y2, 
     fill_t fillit)
 {
@@ -674,6 +743,7 @@
     return noerror;
 }
 
+
 RetCode_t RA8875::fillroundrect(loc_t x1, loc_t y1, loc_t x2, loc_t y2, 
     dim_t radius1, dim_t radius2, color_t color, fill_t fillit)
 {
@@ -681,6 +751,7 @@
     return roundrect(x1,y1,x2,y2,radius1,radius2,fillit);
 }
 
+
 RetCode_t RA8875::roundrect(loc_t x1, loc_t y1, loc_t x2, loc_t y2, 
     dim_t radius1, dim_t radius2, color_t color, fill_t fillit)
 {
@@ -688,6 +759,7 @@
     return roundrect(x1,y1,x2,y2,radius1,radius2,fillit);
 }
 
+
 RetCode_t RA8875::roundrect(loc_t x1, loc_t y1, loc_t x2, loc_t y2, 
     dim_t radius1, dim_t radius2, fill_t fillit)
 {
@@ -725,6 +797,7 @@
     return ret;
 }
 
+
 RetCode_t RA8875::triangle(loc_t x1, loc_t y1, loc_t x2, loc_t y2, 
     loc_t x3, loc_t y3, color_t color, fill_t fillit)
 {
@@ -735,6 +808,7 @@
     return ret;
 }
 
+
 RetCode_t RA8875::filltriangle(loc_t x1, loc_t y1, loc_t x2, loc_t y2, 
     loc_t x3, loc_t y3, color_t color, fill_t fillit)
 {
@@ -745,6 +819,7 @@
     return ret;
 }
 
+
 RetCode_t RA8875::triangle(loc_t x1, loc_t y1 ,loc_t x2, loc_t y2, 
     loc_t x3, loc_t y3, fill_t fillit)
 {
@@ -779,6 +854,7 @@
     return circle(x,y,radius,fillit);
 }
 
+
 RetCode_t RA8875::fillcircle(loc_t x, loc_t y, dim_t radius, 
     color_t color, fill_t fillit)
 {
@@ -786,6 +862,7 @@
     return circle(x,y,radius,fillit);
 }
 
+
 RetCode_t RA8875::circle(loc_t x, loc_t y, dim_t radius, fill_t fillit)
 {
     RetCode_t ret = noerror;
@@ -811,17 +888,20 @@
     return ret;
 }
 
+
 RetCode_t RA8875::ellipse(loc_t x, loc_t y, dim_t radius1, dim_t radius2, color_t color, fill_t fillit)
 {
     foreground(color);
     return ellipse(x,y,radius1,radius2,fillit);
 }
 
+
 RetCode_t RA8875::fillellipse(loc_t x, loc_t y, dim_t radius1, dim_t radius2, color_t color, fill_t fillit)
 {
     foreground(color);
     return ellipse(x,y,radius1,radius2,fillit);
 }
+
         
 RetCode_t RA8875::ellipse(loc_t x, loc_t y, dim_t radius1, dim_t radius2, fill_t fillit)
 {
@@ -849,6 +929,7 @@
     return ret;
 }
 
+
 RetCode_t RA8875::frequency(unsigned long Hz)
 {
     spi.frequency(Hz);
@@ -860,12 +941,14 @@
     return noerror;
 }
 
+
 RetCode_t RA8875::Power(bool on)
 {
     WriteCommand(0x01, (on) ? 0x80 : 0x00);
     return noerror;
 }
 
+
 RetCode_t RA8875::Reset(void)
 {
     WriteCommand(0x01, 0x01);   // Apply Display Off, Reset
@@ -895,6 +978,7 @@
     return noerror;
 }
 
+
 RetCode_t RA8875::Backlight(float brightness)
 {
     unsigned char b;
@@ -908,6 +992,7 @@
     return Backlight_u8(b);
 }
 
+
 RetCode_t RA8875::set_font(const unsigned char * _font)
 {
     if (font && ! _font) {
@@ -918,6 +1003,7 @@
     return noerror;     // trusting them, but it might be good to put some checks in here...
 }
 
+
 RetCode_t RA8875::background(color_t color)
 {
     GraphicsDisplay::background(color);
@@ -927,6 +1013,7 @@
     return noerror;
 }
 
+
 RetCode_t RA8875::background(unsigned char r, unsigned char g, unsigned char b)
 {
     background(RGB(r,g,b));
@@ -936,6 +1023,7 @@
     return noerror;
 }
 
+
 RetCode_t RA8875::foreground(color_t color)
 {
     GraphicsDisplay::foreground(color);
@@ -945,6 +1033,7 @@
     return noerror;
 }
 
+
 RetCode_t RA8875::foreground(unsigned char r, unsigned char g, unsigned char b)
 {
     foreground(RGB(r,g,b));
@@ -954,6 +1043,7 @@
     return noerror;
 }
 
+
 color_t RA8875::GetForeColor(void)
 {
     color_t color;
@@ -964,6 +1054,7 @@
     return color;
 }
 
+
 color_t RA8875::DOSColor(int i)
     {
     const color_t colors[16] = 
@@ -979,6 +1070,7 @@
         return 0;
     }
 
+
 const char * RA8875::DOSColorNames(int i) 
     {
     const char * names[16] = 
@@ -1006,6 +1098,7 @@
     return retval;
 }
 
+
 unsigned char RA8875::spiread(void)
 {
     unsigned char retval;
@@ -1015,12 +1108,14 @@
     return retval;
 }
 
+
 RetCode_t RA8875::select(bool chipsel)
 {
     cs = (chipsel == true) ? 0 : 1;
     return noerror;
 }
 
+
 RetCode_t RA8875::init(int width, int height, int color_bpp)
 {
     Backlight_u8(0);
@@ -1087,6 +1182,7 @@
 //    Everything from here down is test code.
 bool SuppressSlowStuff = false;
 
+
 void TextCursorTest(RA8875 & display, Serial & pc)
 {
     const char * iCursor = "The I-Beam cursor should be visible for this text.\r\n";
@@ -1139,6 +1235,7 @@
     display.SetTextCursorControl(NOCURSOR, false);
 }
 
+
 void BacklightTest(RA8875 & display, Serial & pc, float ramptime)
 {
     char buf[60];
@@ -1165,6 +1262,7 @@
     }
 }
 
+
 void BacklightTest2(RA8875 & display, Serial & pc)
 {
     int delay = 20;
@@ -1185,6 +1283,7 @@
     display.Backlight_u8(0);
 }
 
+
 void ExternalFontTest(RA8875 & display, Serial & pc)
 {
     if (!SuppressSlowStuff)
@@ -1206,6 +1305,7 @@
     //display.window(0,0, display.width(), display.height());
 }
 
+
 void DOSColorTest(RA8875 & display, Serial & pc)
 {
     if (!SuppressSlowStuff)
@@ -1229,6 +1329,7 @@
     }
 }
 
+
 void WebColorTest(RA8875 & display, Serial & pc)
 {
     if (!SuppressSlowStuff)
@@ -1248,6 +1349,7 @@
     display.SetTextFontSize(1,1);
 }
 
+
 void PixelTest(RA8875 & display, Serial & pc)
 {
     int i, c, x, y;
@@ -1267,6 +1369,7 @@
     }
 }
 
+
 void LineTest(RA8875 & display, Serial & pc)
 {
     int i, x, y, x2, y2;
@@ -1287,6 +1390,7 @@
     }
 }
 
+
 void RectangleTest(RA8875 & display, Serial & pc)
 {
     int i, x1,y1, x2,y2;
@@ -1312,6 +1416,69 @@
     }
 }
 
+
+void LayerTest(RA8875 & display, Serial & pc)
+{
+    loc_t i, x1,y1, x2,y2, r1,r2;
+
+    if (!SuppressSlowStuff)
+        pc.printf("Layer Test\r\n");
+
+    display.SelectLayer(0);
+    display.background(Black);
+    display.foreground(Blue);
+    display.cls();
+    display.puts(0,0, "Layer 0");
+    for (i=0; i<16; i++) {
+        x1 = rand() % 240;
+        y1 = 50 + rand() % 200;
+        x2 = x1 + rand() % 100;
+        y2 = y1 + rand() % 100;
+        r1 = rand() % (x2 - x1)/2;
+        r2 = rand() % (y2 - y1)/2;
+        display.roundrect(x1,y1, x2,y2, r1,r2, display.DOSColor(i));
+        if (!SuppressSlowStuff)
+            wait_ms(20);
+    }
+    if (!SuppressSlowStuff)
+        wait_ms(1000);
+
+    display.SelectLayer(1);
+    display.background(Black);
+    display.foreground(Yellow);
+    display.cls();
+    display.puts(240,0, "Layer 1");
+    for (i=0; i<16; i++) {
+        x1 = 300 + rand() % 100;
+        y1 = 70 + rand() % 200;
+        r1 = rand() % min(y1 - 20, 100);
+        display.circle(x1,y1,r1, display.DOSColor(i));
+        if (!SuppressSlowStuff)
+            wait_ms(20);
+    }
+    display.SetLayerMode(1);        // Show it after the build-up
+    if (!SuppressSlowStuff)
+        wait_ms(2000);
+
+    display.SelectLayer(0);
+    display.SetLayerMode(0);        // Show Layer 0 again
+    if (!SuppressSlowStuff)
+        wait_ms(1000);
+    display.SetLayerMode(3);        // Transparent mode
+    if (!SuppressSlowStuff)
+        wait_ms(1000);
+    for (i=0; i<=8; i++) {
+        display.SetLayerTransparency(i, 8-i);
+        if (!SuppressSlowStuff)
+            wait_ms(200);
+    }
+    
+    // Restore before we exit
+    display.SetLayerTransparency(0, 0);
+    display.SetLayerMode(0);        // Restore to layer 0
+}
+
+
 void RoundRectTest(RA8875 & display, Serial & pc)
 {
     loc_t i, x1,y1, x2,y2, r1,r2;
@@ -1342,6 +1509,7 @@
     }
 }
 
+
 void TriangleTest(RA8875 & display, Serial & pc)
 {
     int i, x1, y1, x2, y2, x3, y3;
@@ -1403,6 +1571,7 @@
     }
 }
 
+
 void CircleTest(RA8875 & display, Serial & pc)
 {
     int i, x, y, r1;
@@ -1428,6 +1597,7 @@
     }
 }
 
+
 void EllipseTest(RA8875 & display, Serial & pc)
 {
     int i,x,y,r1,r2;
@@ -1453,6 +1623,7 @@
     }
 }
 
+
 void TestGraphicsBitmap(RA8875 & display, Serial & pc)
 {
     LocalFileSystem local("local");
@@ -1467,6 +1638,7 @@
     int r = display.RenderBitmapFile(0,0, "/local/TestPat.bmp");
 }
 
+
 void SpeedTest(RA8875 & display, Serial & pc)
 {
     Timer t;
@@ -1487,14 +1659,16 @@
     TriangleTest(display, pc);
     CircleTest(display, pc);
     EllipseTest(display, pc);
+    LayerTest(display, pc);
     //TestGraphicsBitmap(display, pc);
     pc.printf("SpeedTest completed in %d msec\r\n", t.read_ms());
-    #ifdef DEBUG
+    #ifdef PERF_METRICS
     display.ReportPerformance(pc);
     #endif
     SuppressSlowStuff = false;
 }
 
+
 void PrintScreen(RA8875 & display, Serial & pc)
 {
     LocalFileSystem local("local");
@@ -1503,11 +1677,12 @@
     display.PrintScreen( 0,0, 480,272, "/local/Capture.bmp");
 }
 
+
 void RunTestSet(RA8875 & lcd, Serial & pc)
 {
     int q = 0;
     int automode = 0;
-    const unsigned char modelist[] = "BDWtGLFROTPCEb";   // auto-test in this order.
+    const unsigned char modelist[] = "BDWtGLlFROTPCEb";   // auto-test in this order.
 
     while(1) {
         pc.printf("\r\n"
@@ -1520,6 +1695,7 @@
                   "C - Circles           E - Ellipses\r\n"
                   "A - Auto Test mode    S - Speed Test\r\n"
                   "p - print screen      r - reset  \r\n"
+                  "l - layer test             \r\n"
                   #ifdef DEBUG
                   "0 - clear performance 1 - report performance\r\n"
                   #endif
@@ -1565,6 +1741,9 @@
             case 'L':
                 LineTest(lcd, pc);
                 break;
+            case 'l':
+                LayerTest(lcd, pc);
+                break;
             case 'R':
                 RectangleTest(lcd, pc);
                 break;