Example using the GFX graphical library, EaLcdBoard, TSC2046 touch screen and SDRAM initialization

Dependencies:   EALib mbed

Revision:
0:79a419828f86
Child:
2:661a997f0ec7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Thu Sep 26 07:59:11 2013 +0000
@@ -0,0 +1,333 @@
+
+/******************************************************************************
+ * Includes
+ *****************************************************************************/
+
+#include "mbed.h"
+
+
+#include "LcdController.h"
+#include "EaLcdBoard.h"
+#include "TSC2046.h"
+#include "sdram.h"
+
+#include "wchar.h"
+#include "GFXFb.h"
+
+
+
+/******************************************************************************
+ * Typedefs and defines
+ *****************************************************************************/
+
+
+/******************************************************************************
+ * Local variables
+ *****************************************************************************/
+
+// EA LCD Board interface
+static EaLcdBoard lcdBoard(P0_27, P0_28);
+
+// touch interface
+static TSC2046 touch(P2_27, P2_26, P2_22, P2_21);
+
+static uint16_t const colors[16] = {
+        BLACK,
+        LIGHTGRAY,
+        DARKGRAY,
+        WHITE,
+        RED,
+        GREEN,
+        BLUE,
+        MAGENTA,
+        CYAN,
+        YELLOW,
+        LIGHTRED,
+        LIGHTGREEN,
+        LIGHTBLUE,
+        LIGHTMAGENTA,
+        LIGHTCYAN,
+        LIGHTYELLOW
+};
+
+/******************************************************************************
+ * Local functions
+ *****************************************************************************/
+
+static uint16_t random(uint16_t max)
+{
+  uint16_t temp;
+
+  temp = rand();
+  temp = temp % max;
+  return temp;
+}
+
+static void demo1(GFXFb &gfx) {
+
+    int16_t x0 = 0;
+    int16_t y0 = 0;
+    int16_t radius = 0;
+    int color = 0;
+    int fill = 0;
+
+
+    gfx.fillScreen(BLACK);
+
+    for (int i = 0; i < 100; i++) {
+        x0 = random(gfx.width());
+        y0 = random(gfx.height());
+        color = random(16);
+        radius = random(50);
+        fill = random(2);
+
+        if (!fill) {
+            gfx.drawCircle(x0, y0, radius, colors[color]);
+        } else {
+            gfx.fillCircle(x0, y0, radius, colors[color]);
+        }
+
+        wait_ms(10);
+    }
+
+}
+
+
+static void demo2(GFXFb &gfx) {
+    int32_t margin = 5;
+    int32_t rowHeight = gfx.height() / 3;
+    int32_t colWidth = gfx.width() / 3;
+    int32_t graphPosX = gfx.getStringWidth("drawRoundRect");
+    int32_t maxGraphW = colWidth - graphPosX;
+
+    gfx.fillScreen(BLACK);
+
+    // ##############
+    // C O L U M N  1
+    // ##############
+
+    // drawLine
+    gfx.setCursor(0, rowHeight/2);
+    gfx.writeString("drawLine");
+    gfx.drawLine(0+graphPosX+margin, margin,
+            0+graphPosX+maxGraphW-margin, rowHeight-margin, colors[1]);
+
+    // drawRect
+    gfx.setCursor(0, rowHeight+rowHeight/2);
+    gfx.writeString("drawRect");
+    gfx.drawRect(0+graphPosX+margin, rowHeight+margin,
+            maxGraphW-2*margin, rowHeight-margin, colors[2]);
+
+    // fillRect
+    gfx.setCursor(0, rowHeight*2+rowHeight/2);
+    gfx.writeString("fillRect");
+    gfx.fillRect(0+graphPosX+margin, rowHeight*2+margin,
+                maxGraphW-2*margin, rowHeight-margin, colors[3]);
+
+    // ##############
+    // C O L U M N  2
+    // ##############
+
+    // drawCircle
+    gfx.setCursor(colWidth, rowHeight/2);
+    gfx.writeString("drawCircle");
+    gfx.drawCircle(colWidth+graphPosX+maxGraphW/2, rowHeight/2,
+            rowHeight/2-2*margin, colors[4]);
+
+    // fillCircle
+    gfx.setCursor(colWidth, rowHeight+rowHeight/2);
+    gfx.writeString("fillCircle");
+    gfx.fillCircle(colWidth+graphPosX+maxGraphW/2, rowHeight+rowHeight/2,
+            rowHeight/2-2*margin, colors[5]);
+
+    // drawTriangle
+    gfx.setCursor(colWidth, rowHeight*2+rowHeight/2);
+    gfx.writeString("drawTriangle");
+    gfx.drawTriangle(colWidth+graphPosX+margin, rowHeight*3-margin,
+            colWidth+graphPosX+maxGraphW/2, rowHeight*2+margin,
+            colWidth+graphPosX+maxGraphW-margin, rowHeight*3-margin, colors[6]);
+
+    // ##############
+    // C O L U M N  3
+    // ##############
+
+    // fillTriangle
+    gfx.setCursor(colWidth*2, rowHeight/2);
+    gfx.writeString("fillTriangle");
+    gfx.fillTriangle(colWidth*2+graphPosX+margin, rowHeight-margin,
+            colWidth*2+graphPosX+maxGraphW/2, margin,
+            colWidth*2+graphPosX+maxGraphW-margin, rowHeight-margin, colors[7]);
+
+
+    // drawRoundRect
+    gfx.setCursor(colWidth*2, rowHeight+rowHeight/2);
+    gfx.writeString("drawRoundRect");
+    gfx.drawRoundRect(colWidth*2+graphPosX+margin, rowHeight+margin,
+            maxGraphW-2*margin, rowHeight-margin, 10, colors[8]);
+
+    // fillRoundRect
+    gfx.setCursor(colWidth*2, rowHeight*2+rowHeight/2);
+    gfx.writeString("fillRoundRect");
+    gfx.fillRoundRect(colWidth*2+graphPosX+margin, rowHeight*2+margin,
+            maxGraphW-2*margin, rowHeight-margin, 10, colors[9]);
+
+
+}
+
+static void drawCalibPoint(GFXFb &gfx, TSC2046::touchCoordinate_t &coord)
+{
+    gfx.fillScreen(BLACK);
+    gfx.setCursor(0, 0);
+    gfx.writeString("Calibrate Touch Screen");
+    gfx.drawRect(coord.x-5, coord.y-5, 10, 10, WHITE);
+}
+
+static void touchCalibrate(GFXFb &gfx)
+{
+    TSC2046::touchCoordinate_t coord;
+    TSC2046::touchCoordinate_t ref1 = {15, gfx.height()-15};
+    TSC2046::touchCoordinate_t ref2 = {gfx.width()/2, 80};
+    TSC2046::touchCoordinate_t ref3 = {gfx.width()-15, gfx.height()-15};
+    TSC2046::touchCoordinate_t scr1 = {0,0};
+    TSC2046::touchCoordinate_t scr2 = {0,0};
+    TSC2046::touchCoordinate_t scr3 = {0,0};
+
+    bool calibrated = false;
+    bool releaseNeeded = false;
+    bool touchReleased = false;
+
+    int calibPoint = 0;
+
+    drawCalibPoint(gfx, ref1);
+
+    while(!calibrated) {
+        wait_ms(100);
+
+        touch.read(coord);
+
+        if (coord.z == 0) {
+            touchReleased = true;
+            continue;
+        }
+
+        if (releaseNeeded && !touchReleased) {
+            continue;
+        }
+
+        touchReleased = false;
+
+        switch(calibPoint++) {
+        case 0:
+            scr1.x = coord.x;
+            scr1.y = coord.y;
+            drawCalibPoint(gfx, ref2);
+
+            releaseNeeded = true;
+            break;
+        case 1:
+            scr2.x = coord.x;
+            scr2.y = coord.y;
+            drawCalibPoint(gfx, ref3);
+
+            releaseNeeded = true;
+            break;
+        case 2:
+            scr3.x = coord.x;
+            scr3.y = coord.y;
+
+            releaseNeeded = true;
+
+            touch.calibrate(ref1, ref2, ref3, scr1, scr2, scr3);
+            calibrated = true;
+            break;
+        }
+    }
+
+    gfx.fillScreen(BLACK);
+}
+
+
+static void demo3(GFXFb &gfx) {
+    TSC2046::touchCoordinate_t coord;
+
+    touchCalibrate(gfx);
+
+    while(1) {
+        touch.read(coord);
+        if (coord.z > 0) {
+            gfx.drawPixel(coord.x, coord.y, WHITE);
+        }
+    }
+}
+
+/******************************************************************************
+ * Main function
+ *****************************************************************************/
+
+
+int main (void) {
+    bool initSuccessful = false;
+
+    EaLcdBoard::Result result;
+    LcdController::Config lcdCfg;
+    uint32_t frameBuf1 = (uint32_t) SDRAM_BASE;
+
+
+    // framebuffer is put in SDRAM
+    if (sdram_init() == 1) {
+        printf("Failed to initialize SDRAM\n");
+        return 1;
+    }
+
+
+    do {
+
+        result = lcdBoard.open(NULL, NULL);
+        if (result != EaLcdBoard::Ok) {
+            printf("Failed to open display: %d\n", result);
+            break;
+        }
+
+        result = lcdBoard.setFrameBuffer(frameBuf1);
+        if (result != EaLcdBoard::Ok) {
+            printf("Failed to activate frameBuffer: %d\n", result);
+            break;
+        }
+
+        result = lcdBoard.getLcdConfig(&lcdCfg);
+        if (result != EaLcdBoard::Ok) {
+            printf("Failed to get LCD configuration: %d\n", result);
+            break;
+        }
+
+        memset((void*)frameBuf1, 0x0, lcdCfg.width*lcdCfg.height*2);
+
+        initSuccessful = true;
+
+
+    } while(0);
+
+
+
+
+    if (initSuccessful) {
+
+        GFXFb gfx(lcdCfg.width, lcdCfg.height, (uint16_t*)frameBuf1);
+
+        while (1) {
+            demo1(gfx);
+            wait_ms(5000);
+            demo2(gfx);
+            wait_ms(15000);
+            demo3(gfx);
+        }
+
+    }
+    else {
+        printf("Couldn't start demo -> Initialization failed\n");
+    }
+
+
+    return 0;
+}
+