Touch panel sample for GR-PEACH LCD Shield.

Dependencies:   GR-PEACH_video LCD_shield_config TouchKey_LCD_shield mbed-rtos mbed

What is this ?

Information on a touch panel is shown to a screen. The touch location of the blue and the 2nd point becomes pink in the 1st touch location in case of a multi-touch.
While touching the screen, a white square in the upper left corner of the screen will be displayed.
Touch information is being output in printf. When doing terminal designation, please set 921600 as a baud rate.

LCD shield can be changed by changing the following macro.

LCD_shield_config.h

/**** User Selection *********/
#define LCD_TYPE                            (0)  // 0: 4.3inch  1:7.1inch
/*****************************/


Composition

GR-PEACH, GR-PEACH 4.3 inch LCD Shield or GR-PEACH 7.1 inch LCD Shield.


概要

タッチパネルの情報を画面に表示します。マルチタッチの場合は1点目のタッチ位置は青、2点目のタッチ位置はピンクになります。
画面がタッチされている間、画面左上に白い四角が表示されます。
printfでもタッチ情報を出力しています。ターミナル表示を行う際は、ボーレートに921600を設定してください。

下記のマクロを変更することで、LCD shieldの切り替えができます。

LCD_shield_config.h

/**** User Selection *********/
#define LCD_TYPE                            (0)  // 0: 4.3inch  1:7.1inch
/*****************************/


構成

GR-PEACH、GR-PEACH 4.3 inch LCD Shield または GR-PEACH 7.1 inch LCD Shield

Files at this revision

API Documentation at this revision

Comitter:
dkato
Date:
Wed Jun 29 03:31:37 2016 +0000
Commit message:
first commit

Changed in this revision

GR-PEACH_video.lib Show annotated file Show diff for this revision Revisions of this file
LCD_shield_config.lib Show annotated file Show diff for this revision Revisions of this file
TouchKey_LCD_shield.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed-rtos.lib Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r a3f0de3891b2 GR-PEACH_video.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GR-PEACH_video.lib	Wed Jun 29 03:31:37 2016 +0000
@@ -0,0 +1,1 @@
+http://developer.mbed.org/teams/Renesas/code/GR-PEACH_video/#e0e475089616
diff -r 000000000000 -r a3f0de3891b2 LCD_shield_config.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/LCD_shield_config.lib	Wed Jun 29 03:31:37 2016 +0000
@@ -0,0 +1,1 @@
+https://developer.mbed.org/users/dkato/code/LCD_shield_config/#b230ec751c56
diff -r 000000000000 -r a3f0de3891b2 TouchKey_LCD_shield.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TouchKey_LCD_shield.lib	Wed Jun 29 03:31:37 2016 +0000
@@ -0,0 +1,1 @@
+https://developer.mbed.org/users/dkato/code/TouchKey_LCD_shield/#da3d7ba2674b
diff -r 000000000000 -r a3f0de3891b2 main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Wed Jun 29 03:31:37 2016 +0000
@@ -0,0 +1,201 @@
+#include "mbed.h"
+#include "DisplayBace.h"
+#include "rtos.h"
+#include "LCD_shield_config.h"
+#if (LCD_TYPE == 0)
+  #include "TouchKey_4_3inch.h"
+  #define TouckKey_LCD_shield               TouchKey_4_3inch
+#else
+  #include "TouchKey_7_1inch.h"
+  #define TouckKey_LCD_shield               TouchKey_7_1inch
+#endif
+
+/* FRAME BUFFER Parameter */
+#define FRAME_BUFFER_BYTE_PER_PIXEL         (2)
+#define FRAME_BUFFER_STRIDE                 (((LCD_PIXEL_WIDTH * FRAME_BUFFER_BYTE_PER_PIXEL) + 31u) & ~31u)
+
+#define TOUCH_NUM                           (2)
+#define DROW_POINT                          (3)
+
+DisplayBase Display;
+DigitalOut  lcd_pwon(P7_15);
+DigitalOut  lcd_blon(P8_1);
+PwmOut      lcd_cntrst(P8_15);
+Serial      pc(USBTX, USBRX);
+Semaphore   sem_touch_int(0);
+TouckKey_LCD_shield touch(P4_0, P2_13, I2C_SDA, I2C_SCL);
+
+static uint8_t user_frame_buffer[FRAME_BUFFER_STRIDE * LCD_PIXEL_HEIGHT]__attribute((section("NC_BSS"),aligned(32)));  /* 32 bytes aligned */
+static volatile int32_t vsync_count = 0;
+
+static void IntCallbackFunc_Vsync(DisplayBase::int_type_t int_type) {
+    /* Interrupt callback function for Vsync interruption */
+    if (vsync_count > 0) {
+        vsync_count--;
+    }
+}
+
+static void Wait_Vsync(const int32_t wait_count) {
+    /* Wait for the specified number of times Vsync occurs */
+    vsync_count = wait_count;
+    while (vsync_count > 0) {
+        /* Do nothing */
+    }
+}
+
+static void Init_LCD_Display(void) {
+    /* Create DisplayBase object */
+    DisplayBase::graphics_error_t error;
+    DisplayBase::lcd_config_t lcd_config;
+    PinName lvds_pin[8] = {
+        /* data pin */
+        P5_7, P5_6, P5_5, P5_4, P5_3, P5_2, P5_1, P5_0
+    };
+
+    lcd_pwon = 0;
+    lcd_blon = 0;
+    Thread::wait(100);
+    lcd_pwon = 1;
+    lcd_blon = 1;
+    Thread::wait(100);
+    lcd_cntrst.write(1.0);
+
+    /* Graphics initialization process */
+    GetLcdConfig(&lcd_config);
+    error = Display.Graphics_init(&lcd_config);
+    if (error != DisplayBase::GRAPHICS_OK) {
+        printf("Line %d, error %d\n", __LINE__, error);
+        while (1);
+    }
+
+    /* Interrupt callback function setting (Vsync signal output from scaler 0) */
+    error = Display.Graphics_Irq_Handler_Set(DisplayBase::INT_TYPE_S0_LO_VSYNC, 0, IntCallbackFunc_Vsync);
+    if (error != DisplayBase::GRAPHICS_OK) {
+        printf("Line %d, error %d\n", __LINE__, error);
+        while (1);
+    }
+
+    Display.Graphics_Lvds_Port_Init(lvds_pin, 8);
+}
+
+static void drow_touch_pos(int id, int x, int y) {
+    int idx_base;
+    int wk_idx;
+    int i;
+    int j;
+    uint8_t coller_pix[2];
+
+    if ((x - (DROW_POINT / 2)) >= 0) {
+        x -= (DROW_POINT / 2);
+    }
+    if (x > (LCD_PIXEL_WIDTH - DROW_POINT)) {
+        x = (LCD_PIXEL_WIDTH - DROW_POINT);
+    }
+    if ((y - (DROW_POINT / 2)) >= 0) {
+        y -= (DROW_POINT / 2);
+    }
+    if (y > (LCD_PIXEL_HEIGHT - DROW_POINT)) {
+        y = (LCD_PIXEL_HEIGHT - DROW_POINT);
+    }
+    idx_base = (x + (LCD_PIXEL_WIDTH * y)) * FRAME_BUFFER_BYTE_PER_PIXEL;
+
+    if (id == 0) {
+        coller_pix[0] = 0xDD;
+        coller_pix[1] = 0x9E;
+    } else {
+        coller_pix[0] = 0x34;
+        coller_pix[1] = 0xDB;
+    }
+
+    for (i = 0; i < DROW_POINT; i++) {
+        wk_idx = idx_base + (LCD_PIXEL_WIDTH * FRAME_BUFFER_BYTE_PER_PIXEL * i);
+        for (j = 0; j < DROW_POINT; j++) {
+            user_frame_buffer[wk_idx++] = coller_pix[0];
+            user_frame_buffer[wk_idx++] = coller_pix[1];
+        }
+    }
+}
+
+static void drow_touch_keyonoff(int id, bool onoff) {
+    int idx_base;
+    int wk_idx;
+    int i;
+    int j;
+    uint8_t coller_pix[2];
+
+    if (id == 0) {
+        idx_base = 0;
+    } else {
+        idx_base = 5 * FRAME_BUFFER_BYTE_PER_PIXEL;
+    }
+
+    if (onoff == false) {
+        coller_pix[0] = 0x00;
+        coller_pix[1] = 0x00;
+    } else {
+        coller_pix[0] = 0xff;
+        coller_pix[1] = 0xff;
+    }
+
+    for (i = 0; i < 5; i++) {
+        wk_idx = idx_base + (LCD_PIXEL_WIDTH * FRAME_BUFFER_BYTE_PER_PIXEL * i);
+        for (j = 0; j < 5; j++) {
+            user_frame_buffer[wk_idx++] = coller_pix[0];
+            user_frame_buffer[wk_idx++] = coller_pix[1];
+        }
+    }
+}
+
+static void touch_int_callback(void) {
+    sem_touch_int.release();
+}
+
+int main(void) {
+    // Change the baud rate of the printf()
+    pc.baud(921600);
+
+    // Initialization of LCD
+    DisplayBase::rect_t rect;
+
+    Init_LCD_Display();
+    memset(user_frame_buffer, 0, sizeof(user_frame_buffer));
+    rect.vs = 0;
+    rect.vw = LCD_PIXEL_HEIGHT;
+    rect.hs = 0;
+    rect.hw = LCD_PIXEL_WIDTH;
+    Display.Graphics_Read_Setting(
+        DisplayBase::GRAPHICS_LAYER_0,
+        (void *)user_frame_buffer,
+        FRAME_BUFFER_STRIDE,
+        DisplayBase::GRAPHICS_FORMAT_RGB565,
+        DisplayBase::WR_RD_WRSWA_32_16BIT,
+        &rect
+    );
+    Wait_Vsync(2);
+    Display.Graphics_Start(DisplayBase::GRAPHICS_LAYER_0);
+
+    // Touch panel processing
+    TouchKey::touch_pos_t touch_pos[TOUCH_NUM];
+    int touch_num = 0;
+    int touch_num_last = 0;
+    int i;
+
+    touch.SetCallback(&touch_int_callback);
+    touch.Reset();
+    while (1) {
+        sem_touch_int.wait();
+        touch_num = touch.GetCoordinates(TOUCH_NUM, touch_pos);
+        if ((touch_num != 0) && (touch_num_last == 0)) {
+            memset(user_frame_buffer, 0, sizeof(user_frame_buffer));
+        }
+        for (i = 0; i < TOUCH_NUM; i ++) {
+            printf("{valid=%d,x=%d,y=%d} ", touch_pos[i].valid, touch_pos[i].x, touch_pos[i].y);
+            drow_touch_keyonoff(i, touch_pos[i].valid);
+            if (touch_pos[i].valid) {
+                drow_touch_pos(i, touch_pos[i].x, touch_pos[i].y);
+            }
+        }
+        printf("\n");
+        touch_num_last = touch_num;
+    }
+}
diff -r 000000000000 -r a3f0de3891b2 mbed-rtos.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed-rtos.lib	Wed Jun 29 03:31:37 2016 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed-rtos/#4c105b8d7cae
diff -r 000000000000 -r a3f0de3891b2 mbed.bld
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Wed Jun 29 03:31:37 2016 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/6c34061e7c34
\ No newline at end of file