
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; } }