Forked para SNOCC

Dependencies:   GPS

Dependents:   SNOCC_V1 SNOCC_V2

Fork of RA8875 by SNOCC

Revision:
105:4f116006ba1f
Parent:
103:7e0464ca6c5c
Child:
106:c80828f5dea4
diff -r 8d1d3832a215 -r 4f116006ba1f RA8875.cpp
--- a/RA8875.cpp	Mon Feb 08 01:47:56 2016 +0000
+++ b/RA8875.cpp	Sat Feb 27 18:40:35 2016 +0000
@@ -119,6 +119,7 @@
     wait_ms(1);
 
     // System Config Register (SYSR)
+    screenbpp = color_bpp;
     if (color_bpp == 16) {
         WriteCommand(0x10, 0x0C);               // 16-bpp (65K colors) color depth, 8-bit interface
     } else { // color_bpp == 8
@@ -215,7 +216,7 @@
 {
     unsigned char mwcr1 = ReadCommand(0x41) & ~0x01; // retain all but the currently selected layer
 
-    if (width() >= 800 && height() >= 480 && color_bpp() == 8) {
+    if (screenwidth >= 800 && screenheight >= 480 && screenbpp == 8) {
         return bad_parameter;
     } else if (layer > 1) {
         return bad_parameter;
@@ -234,6 +235,7 @@
 RetCode_t RA8875::SetLayerMode(LayerMode_T mode)
 {
     unsigned char ltpr0 = ReadCommand(0x52) & ~0x7; // retain all but the display layer mode
+    
     if (mode <= (LayerMode_T)6) {
         WriteCommand(0x52, ltpr0 | (mode & 0x7));
         return noerror;
@@ -266,6 +268,7 @@
 color_t RA8875::GetBackgroundTransparencyColor(void)
 {
     RGBQUAD q;
+    
     q.rgbRed = ReadCommand(0x67);
     q.rgbGreen = ReadCommand(0x68);
     q.rgbBlue = ReadCommand(0x69);
@@ -565,6 +568,24 @@
         return false;
 }
 
+uint8_t RA8875::_cvt16to8(color_t c16)
+{
+    return ((c16 >> 8) & 0xE0)
+        | ((c16 >> 6) & 0x1C)
+        | ((c16 >> 3) & 0x03);
+}
+
+color_t RA8875::_cvt8to16(uint8_t c8)
+{
+    color_t c16 = ((c8 & 0xE0) << 8)
+        | ((c8 & 0xC0) << 5)
+        | ((c8 & 0x1C) << 6)
+        | ((c8 & 0x1C) << 3)
+        | ((c8 & 0x03) << 3)
+        | ((c8 & 0x03) << 1)
+        | ((c8 & 0x03) >> 1);
+    return c16;
+}
 
 dim_t RA8875::fontwidth(void)
 {
@@ -592,13 +613,13 @@
 
 int RA8875::columns(void)
 {
-    return width() / fontwidth();
+    return screenwidth / fontwidth();
 }
 
 
 int RA8875::rows(void)
 {
-    return height() / fontheight();
+    return screenheight / fontheight();
 }
 
 
@@ -622,10 +643,7 @@
 
 dim_t RA8875::color_bpp(void)
 {
-    if ((ReadCommand(0x10) & 0x0C) == 0x04)
-        return 16;
-    else
-        return 8;
+    return screenbpp;
 }
 
 RetCode_t RA8875::SetTextCursor(point_t p)
@@ -838,11 +856,11 @@
             INFO("(%d,%d) ,charWidth: %d '%c", cursor_x, cursor_y, charWidth, c);
             if (charRecord) {
                 //cursor_x += advance;
-                if (cursor_x + charWidth >= width()) {
+                if (cursor_x + charWidth >= screenwidth) {
                     cursor_x = 0;
                     cursor_y += charHeight;
                 }
-                if (cursor_y + charHeight >= height()) {
+                if (cursor_y + charHeight >= screenheight) {
                     cursor_y = 0;               // @todo Should it scroll?
                 }
                 (void)character(cursor_x, cursor_y, c);
@@ -1020,12 +1038,7 @@
     RetCode_t ret;
 
     PERFORMANCE_RESET;
-#if 1
     ret = pixelStream(&color, 1, x,y);
-#else
-    foreground(color);
-    ret = pixel(x,y);
-#endif
     REGISTERPERFORMANCE(PRF_DRAWPIXEL);
     return ret;
 }
@@ -1037,15 +1050,7 @@
 
     PERFORMANCE_RESET;
     color_t color = GetForeColor();
-#if 1
     ret = pixelStream(&color, 1, x, y);
-#else
-    WriteCommand(0x40,0x00);    // Graphics write mode
-    SetGraphicsCursor(x, y);
-    WriteCommand(0x02);
-    WriteDataW(color);
-    ret = noerror;
-#endif
     REGISTERPERFORMANCE(PRF_DRAWPIXEL);
     return ret;
 }
@@ -1060,8 +1065,12 @@
     _select(true);
     _spiwrite(0x00);         // Cmd: write data
     while (count--) {
-        _spiwrite(*p >> 8);
-        _spiwrite(*p & 0xFF);
+        if (screenbpp == 16) {
+            _spiwrite(*p >> 8);
+            _spiwrite(*p & 0xFF);
+        } else {
+            _spiwrite(_cvt16to8(*p));
+        }
         p++;
     }
     _select(false);
@@ -1082,8 +1091,12 @@
     _select(true);
     _spiwrite(0x40);         // Cmd: read data
     _spiwrite(0x00);         // dummy read
-    pixel  = _spiread();
-    pixel |= (_spiread() << 8);
+    if (screenbpp == 16) {
+        pixel  = _spiread();
+        pixel |= (_spiread() << 8);
+    } else {
+        pixel = _cvt8to16(_spiread());
+    }
     _select(false);
     REGISTERPERFORMANCE(PRF_READPIXEL);
     return pixel;
@@ -1095,22 +1108,21 @@
     color_t pixel;
     RetCode_t ret = noerror;
 
-    //INFO("getPixelStream(%p, %u, %d, %d)", p, count, x, y);
     PERFORMANCE_RESET;
-    //WriteCommand(0x45,0x00);    // read left->right, top->bottom
     ret = WriteCommand(0x40,0x00);    // Graphics write mode
-    //INFO("  r = %d", ret);
     ret = SetGraphicsCursorRead(x, y);
-    //INFO("  r = %d", ret);
     ret = WriteCommand(0x02);
-    //INFO("  r = %d", ret);
     _select(true);
     _spiwrite(0x40);         // Cmd: read data
     _spiwrite(0x00);         // dummy read
     _spiwrite(0x00);         // dummy read  [20150201: Required to properly align the data stream. Not yet sure why...]
     while (count--) {
-        pixel  = _spiread();
-        pixel |= (_spiread() << 8);
+        if (screenbpp == 16) {
+            pixel  = _spiread();
+            pixel |= (_spiread() << 8);
+        } else {
+            pixel = _cvt8to16(_spiread());
+        }
         *p++ = pixel;
     }
     _select(false);
@@ -1187,8 +1199,8 @@
     RetCode_t ret = noerror;
     PERFORMANCE_RESET;
     // check for bad_parameter
-    if (x1 < 0 || x1 >= width() || x2 < 0 || x2 >= width() 
-    || y1 < 0 || y1 >= height() || y2 < 0 || y2 >= height()) {
+    if (x1 < 0 || x1 >= screenwidth || x2 < 0 || x2 >= screenwidth 
+    || y1 < 0 || y1 >= screenheight || y2 < 0 || y2 >= screenheight) {
         ret = bad_parameter;
     } else {
         if (x1 == x2 && y1 == y2) {
@@ -1237,8 +1249,8 @@
     RetCode_t ret = noerror;
 
     PERFORMANCE_RESET;
-    if (x1 < 0 || x1 >= width() || x2 < 0 || x2 >= width() 
-    || y1 < 0 || y1 >= height() || y2 < 0 || y2 >= height()) {
+    if (x1 < 0 || x1 >= screenwidth || x2 < 0 || x2 >= screenwidth 
+    || y1 < 0 || y1 >= screenheight || y2 < 0 || y2 >= screenheight) {
         ret = bad_parameter;
     } else if (x1 > x2 || y1 > y2 || (radius1 > (x2-x1)/2) || (radius2 > (y2-y1)/2) ) {
         ret = bad_parameter;
@@ -1275,8 +1287,8 @@
 {
     RetCode_t ret;
 
-    if (x1 < 0 || x1 >= width() || x2 < 0 || x2 >= width() || x3 < 0 || x3 >= width()
-    || y1 < 0 || y1 >= height() || y2 < 0 || y2 >= height() || y3 < 0 || y3 >= height())
+    if (x1 < 0 || x1 >= screenwidth || x2 < 0 || x2 >= screenwidth || x3 < 0 || x3 >= screenwidth
+    || y1 < 0 || y1 >= screenheight || y2 < 0 || y2 >= screenheight || y3 < 0 || y3 >= screenheight)
         ret = bad_parameter;
     foreground(color);
     ret = triangle(x1,y1,x2,y2,x3,y3,fillit);
@@ -1365,8 +1377,8 @@
     RetCode_t ret = noerror;
 
     PERFORMANCE_RESET;
-    if (radius <= 0 || (x - radius) < 0 || (x + radius) > width() 
-    || (y - radius) < 0 || (y + radius) > height()) {
+    if (radius <= 0 || (x - radius) < 0 || (x + radius) > screenwidth 
+    || (y - radius) < 0 || (y + radius) > screenheight) {
         ret = bad_parameter;
     } else if (radius == 1) {
         pixel(x,y);
@@ -1405,8 +1417,8 @@
     RetCode_t ret = noerror;
 
     PERFORMANCE_RESET;
-    if (radius1 <= 0 || radius2 <= 0 || (x - radius1) < 0 || (x + radius1) > width() 
-    || (y - radius2) < 0 || (y + radius2) > height()) {
+    if (radius1 <= 0 || radius2 <= 0 || (x - radius1) < 0 || (x + radius1) > screenwidth 
+    || (y - radius2) < 0 || (y + radius2) > screenheight) {
         ret = bad_parameter;
     } else if (radius1 == 1 && radius2 == 1) {
         pixel(x, y);
@@ -1680,10 +1692,10 @@
     color_t * pixelBuffer2 = NULL;
     
     INFO("(%d,%d) - (%d,%d)", x,y,w,h);
-    if (x >= 0 && x < width()
-            && y >= 0 && y < height()
-            && w > 0 && x + w <= width()
-            && h > 0 && y + h <= height()) {
+    if (x >= 0 && x < screenwidth
+            && y >= 0 && y < screenheight
+            && w > 0 && x + w <= screenwidth
+            && h > 0 && y + h <= screenheight) {
 
         BMP_Header.bfType = BF_TYPE;
         BMP_Header.bfSize = (w * h * sizeof(RGBQUAD)) + sizeof(BMP_Header) + sizeof(BMP_Header);
@@ -1843,10 +1855,10 @@
     color_t * pixelBuffer2 = NULL;
     
     INFO("(%d,%d) - (%d,%d) %s", x,y,w,h,Name_BMP);
-    if (x >= 0 && x < width()
-            && y >= 0 && y < height()
-            && w > 0 && x + w <= width()
-            && h > 0 && y + h <= height()) {
+    if (x >= 0 && x < screenwidth
+            && y >= 0 && y < screenheight
+            && w > 0 && x + w <= screenwidth
+            && h > 0 && y + h <= screenheight) {
 
         BMP_Header.bfType = BF_TYPE;
         BMP_Header.bfSize = (w * h * sizeof(RGBQUAD)) + sizeof(BMP_Header) + sizeof(BMP_Header);
@@ -2854,3 +2866,4 @@
 }
 
 #endif // TESTENABLE
+