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
main.cpp
- Committer:
- dkato
- Date:
- 2016-06-29
- Revision:
- 0:a3f0de3891b2
File content as of revision 0:a3f0de3891b2:
#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;
}
}