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 Peter Drescher

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)

Files at this revision

API Documentation at this revision

Comitter:
WiredHome
Date:
Sat Jan 17 20:59:51 2015 +0000
Parent:
85:022bba13c5c4
Child:
87:ee2240581aa7
Commit message:
Added GetBacklight() and small refactoring of the memory allocation in PrintScreen().

Changed in this revision

RA8875.cpp Show annotated file Show diff for this revision Revisions of this file
RA8875.h Show annotated file Show diff for this revision Revisions of this file
--- a/RA8875.cpp	Tue Jan 13 12:31:44 2015 +0000
+++ b/RA8875.cpp	Sat Jan 17 20:59:51 2015 +0000
@@ -1016,12 +1016,17 @@
 RetCode_t RA8875::getPixelStream(color_t * p, uint32_t count, loc_t x, loc_t y)
 {
     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
-    WriteCommand(0x40,0x00);    // Graphics write mode
-    SetGraphicsCursorRead(x, y);
-    WriteCommand(0x02);
+    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
@@ -1032,7 +1037,7 @@
     }
     _select(false);
     REGISTERPERFORMANCE(PRF_READPIXELSTREAM);
-    return noerror;
+    return ret;
 }
 
 
@@ -1396,6 +1401,10 @@
     return noerror;
 }
 
+uint8_t RA8875::GetBacklight_u8(void)
+{
+    return ReadCommand(0x8b);
+}
 
 RetCode_t RA8875::Backlight(float brightness)
 {
@@ -1410,6 +1419,10 @@
     return Backlight_u8(b);
 }
 
+float RA8875::GetBacklight(void)
+{
+    return (float)(GetBacklight_u8())/255;
+}
 
 RetCode_t RA8875::set_font(const unsigned char * _font)
 {
@@ -1541,7 +1554,10 @@
 {
     BITMAPFILEHEADER BMP_Header;
     BITMAPINFOHEADER BMP_Info;
-
+    uint8_t * lineBuffer = NULL;
+    color_t * pixelBuffer = NULL;
+    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()
@@ -1566,43 +1582,66 @@
         BMP_Info.biClrUsed = 0;
         BMP_Info.biClrImportant = 0;
 
-        INFO("Writing {%s}", Name_BMP);
+        // Allocate the memory we need to proceed
+        int lineBufSize = ((24 * w + 7)/8);
+        lineBuffer = (uint8_t *)malloc(lineBufSize);
+        if (lineBuffer == NULL) {
+            ERR("Not enough RAM for PrintScreen lineBuffer");
+            return(not_enough_ram);
+        }
+
+        #define DOUBLEBUF /* one larger buffer instead of two */
+        
+        #ifdef DOUBLEBUF
+        // In the "#else", pixelBuffer2 malloc returns a value, 
+        // but is actually causing a failure later. 
+        // This test helps determine if it is truly out of memory,
+        // or if malloc is broken.
+        pixelBuffer = (color_t *)malloc(2 * w * sizeof(color_t));
+        pixelBuffer2 = pixelBuffer + (w * sizeof(color_t));
+        #else
+        pixelBuffer = (color_t *)malloc(w * sizeof(color_t));
+        pixelBuffer2 = (color_t *)malloc(w * sizeof(color_t));
+        #endif
+        if (pixelBuffer == NULL || pixelBuffer2 == NULL) {
+            ERR("Not enough RAM for pixelBuffer");
+            #ifndef DOUBLEBUF
+            if (pixelBuffer2)
+                free(pixelBuffer2);
+            #endif
+            if (pixelBuffer)
+                free(pixelBuffer);
+            free(lineBuffer);
+            if (pixelBuffer)
+                free(pixelBuffer);
+            return(not_enough_ram);
+        }
+
         FILE *Image = fopen(Name_BMP, "wb");
         if (!Image) {
-            ERR("File not found");
+            ERR("Can't open file for write");
+            #ifndef DOUBLEBUF
+            if (pixelBuffer2)
+                free(pixelBuffer2);
+            #endif
+            if (pixelBuffer)
+                free(pixelBuffer);
+            free(lineBuffer);
+            if (pixelBuffer)
+                free(pixelBuffer);
             return(file_not_found);
         }
 
         // Be optimistic - don't check for errors.
         //HexDump("BMP_Header", (uint8_t *)&BMP_Header, sizeof(BMP_Header));
-        fwrite(&BMP_Header, sizeof(char), sizeof(BMP_Header), Image);
-        //INFO("fwrite returned %d", r);
+        size_t r = fwrite(&BMP_Header, sizeof(char), sizeof(BMP_Header), Image);
 
         //HexDump("BMP_Info", (uint8_t *)&BMP_Info, sizeof(BMP_Info));
-        fwrite(&BMP_Info, sizeof(char), sizeof(BMP_Info), Image);
-        //INFO("fwrite returned %d", r);
+        r = fwrite(&BMP_Info, sizeof(char), sizeof(BMP_Info), Image);
 
-        int lineBufSize = ((24 * w + 7)/8);
-        uint8_t * lineBuffer = (uint8_t *)malloc(lineBufSize);
-        if (lineBuffer == NULL) {
-            fclose(Image);
-            ERR("Not enough RAM for lineBuffer");
-            return(not_enough_ram);
-        }
-        color_t * pixelBuffer = (color_t *)malloc(w * sizeof(color_t));
-        color_t * pixelBuffer2 = (color_t *)malloc(w * sizeof(color_t));
         color_t transparency = GetBackgroundTransparencyColor();
         unsigned char ltpr0 = ReadCommand(0x52) & 0x7;
 
-        if (pixelBuffer == NULL || pixelBuffer2 == NULL) {
-            fclose(Image);
-            free(lineBuffer);
-            ERR("Not enough RAM for pixelBuffer");
-            if (pixelBuffer)
-                free(pixelBuffer);
-            return(not_enough_ram);
-        }
-
         uint16_t prevLayer = GetDrawingLayer();
         // If only one of the layers is visible, select that layer
         switch(ltpr0) {
@@ -1626,7 +1665,7 @@
                 ERR("getPixelStream error, and no recovery handler...");
             }
             if (ltpr0 >= 2) {           // Need to combine the layers...
-                SelectDrawingLayer(1);  // so read layer 0 first
+                SelectDrawingLayer(1);  // so read layer 1 next
                 if (getPixelStream(pixelBuffer2, w, x,y+j) != noerror) {
                     ERR("getPixelStream error, and no recovery handler...");
                 }
@@ -1666,9 +1705,15 @@
         }
         SelectDrawingLayer(prevLayer);
         fclose(Image);
-        free(pixelBuffer2);  // don't leak memory.
-        free(pixelBuffer);
+        #ifndef DOUBLEBUF
+        if (pixelBuffer2)
+            free(pixelBuffer2);
+        #endif
+        if (pixelBuffer)
+            free(pixelBuffer);
         free(lineBuffer);
+        if (pixelBuffer)
+            free(pixelBuffer);
         INFO("Image closed");
         return noerror;
     } else {
--- a/RA8875.h	Tue Jan 13 12:31:44 2015 +0000
+++ b/RA8875.h	Sat Jan 17 20:59:51 2015 +0000
@@ -1650,6 +1650,12 @@
     ///
     RetCode_t Backlight_u8(unsigned char brightness);
     
+    /// Get backlight brightness.
+    ///
+    /// @returns backlight setting from 0 (off) to 255 (full on).
+    /// 
+    uint8_t GetBacklight_u8(void);
+
     /// Set backlight brightness.
     ///
     /// When the built-in PWM is used to control the backlight, this 
@@ -1660,6 +1666,12 @@
     ///
     RetCode_t Backlight(float brightness);
 
+    /// Get backlight brightness.
+    ///
+    /// @returns backlight setting from 0 (off) to 1.0 (full on).
+    /// 
+    float GetBacklight(void);
+
     /// Select a bitmap font (provided by the user) for all subsequent text.
     ///
     /// @note Tool to create the fonts is accessible from its creator