Video image display and touch panel sample for GR-PEACH LCD Shield.

Information

Japanese version is available in lower part of this page.
このページの後半に日本語版が用意されています.

Information

This sample has multiple frame buffers so that the clock source can display different cameras and LCDs cleanly. If you are using the NTSC signal, the following sample is simpler.
このサンプルはクロック元が異なるカメラとLCDを綺麗に表示するために、複数のフレームバッファを持っています。NTSC信号を使用するのであれば、以下のサンプルの方が単純です。

https://developer.mbed.org/users/dkato/code/GR-PEACH_NTSC_in_2ch/

What is this ?

The basic function of the GR-PEACH LCD Shield can be tried by this sample.
Display the information of the touch panel on the camera image.
A character font is shown to the screen lower right every 1 second.

Touch panel information

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 230400 as a baud rate.

Composition

GR-PEACH, GR-PEACH 4.3 inch LCD Shield or GR-PEACH 7.1 inch LCD Shield, GR-PEACH AUDIO CAMERA Shield and Camera.
/media/uploads/dkato/gr-peach_with_camera_lcd.png

When using analog input for video input, GR-PEACH AUDIO CAMERA Shield and the camera are unnecessary.
(Setting the VIDEO_CVBS to VIDEO_INPUT_METHOD)
Please input analog signal to NTSC1A pin. (Even if there are no input signals, a touch panel can be operated.).
/media/uploads/dkato/video_display_analog.jpg

Video input of default is a digital input (Cmos Camera). When changing the video input, please change the below.

mbed_app.json

{
    "config": {
        "camera":{
            "help": "0:disable 1:enable",
            "value": "1"
        },
        "camera-type":{
            "help": "Please see README.md",
            "value": "CAMERA_CVBS"
        },
        "lcd":{
            "help": "0:disable 1:enable",
            "value": "1"
        },
        "lcd-type":{
            "help": "Please see README.md",
            "value": "GR_PEACH_4_3INCH_SHIELD"
        }
    }
}
camera-type "value"Description
CAMERA_CVBSGR-PEACH NTSC signal
CAMERA_MT9V111GR-PEACH MT9V111
CAMERA_OV7725GR-LYHCEE included camera
CAMERA_OV5642GR-PEACH OV5642
CAMERA_WIRELESS_CAMERAGR-PEACH Wireless/Camera shield (MT9V111)
lcd-type "value"Description
GR_PEACH_4_3INCH_SHIELDGR-PEACH 4.3 inch LCD shield
GR_PEACH_7_1INCH_SHIELDGR-PEACH 7.1 inch LCD shield
GR_PEACH_RSK_TFTGR-PEACH RSK board LCD
GR_PEACH_DISPLAY_SHIELDGR-PEACH Display Shield or DVi-Board
GR_LYCHEE_LCDGR-LYHCEE TF043HV001A0..etc(40pin)




概要

このサンプルではGR-PEACH LCD Shieldの基本的な機能を試せます。
カメラ画像の上にタッチパネルの情報を重ねて表示します。
文字フォントが右下に1秒毎に表示されます。

タッチパネルの情報

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

構成

GR-PEACH、GR-PEACH 4.3 inch LCD Shield または GR-PEACH 7.1 inch LCD Shield、GR-PEACH AUDIO CAMERA Shield 、カメラ。
/media/uploads/dkato/gr-peach_with_camera_lcd.png

ビデオ入力にアナログ入力を使用する場合はGR-PEACH AUDIO CAMERA Shield とカメラは不要です。
(VIDEO_INPUT_METHOD にVIDEO_CVBS を設定)
NTSC1Aピンにアナログ信号を入力してください。(入力信号が無くてもタッチパネルは操作できます。)
/media/uploads/dkato/video_display_analog.jpg

デフォルトのビデオ入力はデジタル入力(Cmos Camera)です。ビデオ入力を変更する際は以下を変更してください。

mbed_app.json

{
    "config": {
        "camera":{
            "help": "0:disable 1:enable",
            "value": "1"
        },
        "camera-type":{
            "help": "Please see README.md",
            "value": "CAMERA_CVBS"
        },
        "lcd":{
            "help": "0:disable 1:enable",
            "value": "1"
        },
        "lcd-type":{
            "help": "Please see README.md",
            "value": "GR_PEACH_4_3INCH_SHIELD"
        }
    }
}
camera-type "value"Description
CAMERA_CVBSGR-PEACH NTSC signal
CAMERA_MT9V111GR-PEACH MT9V111
CAMERA_OV7725GR-LYHCEE included camera
CAMERA_OV5642GR-PEACH OV5642
CAMERA_WIRELESS_CAMERAGR-PEACH Wireless/Camera shield (MT9V111)
lcd-type "value"Description
GR_PEACH_4_3INCH_SHIELDGR-PEACH 4.3 inch LCD shield
GR_PEACH_7_1INCH_SHIELDGR-PEACH 7.1 inch LCD shield
GR_PEACH_RSK_TFTGR-PEACH RSK board LCD
GR_PEACH_DISPLAY_SHIELDGR-PEACH Display Shield or DVi-Board
GR_LYCHEE_LCDGR-LYHCEE TF043HV001A0..etc(40pin)
Committer:
dkato
Date:
Tue Jul 24 03:10:14 2018 +0000
Revision:
8:5975dd9a8177
Parent:
7:d782dce51ee6
Child:
9:61f53c094a1c
Minor change

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dkato 0:b2184c2d15dd 1 #include "mbed.h"
dkato 7:d782dce51ee6 2 #include "dcache-control.h"
dkato 7:d782dce51ee6 3 #include "EasyAttach_CameraAndLCD.h"
dkato 4:bafd63604b7c 4 #include "AsciiFont.h"
dkato 0:b2184c2d15dd 5
dkato 8:5975dd9a8177 6 #define STRING_DISP_TEST (1)
dkato 8:5975dd9a8177 7
dkato 0:b2184c2d15dd 8 /* Video input and LCD layer 0 output */
dkato 7:d782dce51ee6 9 #define DATA_SIZE_PER_PIC (2u)
dkato 0:b2184c2d15dd 10
dkato 0:b2184c2d15dd 11 /*! Frame buffer stride: Frame buffer stride should be set to a multiple of 32 or 128
dkato 0:b2184c2d15dd 12 in accordance with the frame buffer burst transfer mode. */
dkato 7:d782dce51ee6 13 #define VIDEO_PIXEL_HW LCD_PIXEL_WIDTH
dkato 7:d782dce51ee6 14 #define VIDEO_PIXEL_VW LCD_PIXEL_HEIGHT
dkato 7:d782dce51ee6 15 #if (MBED_CONF_APP_LCD_TYPE == GR_PEACH_4_3INCH_SHIELD)
dkato 7:d782dce51ee6 16 #define ASPECT_RATIO_16_9 (1)
dkato 0:b2184c2d15dd 17 #endif
dkato 0:b2184c2d15dd 18
dkato 7:d782dce51ee6 19 #define FRAME_BUFFER_STRIDE (((VIDEO_PIXEL_HW * DATA_SIZE_PER_PIC) + 31u) & ~31u)
dkato 7:d782dce51ee6 20 #define FRAME_BUFFER_HEIGHT (VIDEO_PIXEL_VW)
dkato 0:b2184c2d15dd 21
dkato 0:b2184c2d15dd 22 static DisplayBase Display;
dkato 0:b2184c2d15dd 23
dkato 0:b2184c2d15dd 24 #if defined(__ICCARM__)
dkato 0:b2184c2d15dd 25 #pragma data_alignment=32
dkato 7:d782dce51ee6 26 static uint8_t user_frame_buffer0[FRAME_BUFFER_STRIDE * FRAME_BUFFER_HEIGHT]@ ".mirrorram";
dkato 0:b2184c2d15dd 27 #else
dkato 7:d782dce51ee6 28 static uint8_t user_frame_buffer0[FRAME_BUFFER_STRIDE * FRAME_BUFFER_HEIGHT]__attribute((section("NC_BSS"),aligned(32)));
dkato 0:b2184c2d15dd 29 #endif
dkato 0:b2184c2d15dd 30
dkato 7:d782dce51ee6 31 #if defined(TouckKey_LCD_shield)
dkato 0:b2184c2d15dd 32
dkato 7:d782dce51ee6 33 /* TOUCH BUFFER Parameter GRAPHICS_LAYER_1 */
dkato 7:d782dce51ee6 34 #define TOUCH_BUFFER_BYTE_PER_PIXEL (2u)
dkato 7:d782dce51ee6 35 #define TOUCH_BUFFER_STRIDE (((LCD_PIXEL_WIDTH * TOUCH_BUFFER_BYTE_PER_PIXEL) + 31u) & ~31u)
dkato 0:b2184c2d15dd 36
dkato 7:d782dce51ee6 37 /* Touch panel parameter */
dkato 7:d782dce51ee6 38 #define TOUCH_NUM (2u)
dkato 7:d782dce51ee6 39 #define DRAW_POINT (8)
dkato 0:b2184c2d15dd 40
dkato 7:d782dce51ee6 41 static Semaphore sem_touch_int(0);
dkato 7:d782dce51ee6 42 #if defined(__ICCARM__)
dkato 7:d782dce51ee6 43 #pragma data_alignment=32
dkato 7:d782dce51ee6 44 static uint8_t user_frame_buffer_touch[TOUCH_BUFFER_STRIDE * LCD_PIXEL_HEIGHT];
dkato 0:b2184c2d15dd 45 #else
dkato 7:d782dce51ee6 46 static uint8_t user_frame_buffer_touch[TOUCH_BUFFER_STRIDE * LCD_PIXEL_HEIGHT]__attribute((aligned(32)));
dkato 0:b2184c2d15dd 47 #endif
dkato 0:b2184c2d15dd 48
dkato 6:95b92f2035dc 49 static void draw_touch_pos(uint8_t * p_buf, int id, int x, int y) {
dkato 0:b2184c2d15dd 50 int idx_base;
dkato 0:b2184c2d15dd 51 int wk_idx;
dkato 0:b2184c2d15dd 52 int i;
dkato 0:b2184c2d15dd 53 int j;
dkato 0:b2184c2d15dd 54 uint8_t coller_pix[TOUCH_BUFFER_BYTE_PER_PIXEL]; /* ARGB4444 */
dkato 0:b2184c2d15dd 55
dkato 0:b2184c2d15dd 56 /* A coordinate in the upper left is calculated from a central coordinate. */
dkato 6:95b92f2035dc 57 if ((x - (DRAW_POINT / 2)) >= 0) {
dkato 6:95b92f2035dc 58 x -= (DRAW_POINT / 2);
dkato 0:b2184c2d15dd 59 }
dkato 7:d782dce51ee6 60 if (x > ((int)LCD_PIXEL_WIDTH - DRAW_POINT)) {
dkato 7:d782dce51ee6 61 x = ((int)LCD_PIXEL_WIDTH - DRAW_POINT);
dkato 0:b2184c2d15dd 62 }
dkato 6:95b92f2035dc 63 if ((y - (DRAW_POINT / 2)) >= 0) {
dkato 6:95b92f2035dc 64 y -= (DRAW_POINT / 2);
dkato 0:b2184c2d15dd 65 }
dkato 7:d782dce51ee6 66 if (y > ((int)LCD_PIXEL_HEIGHT - DRAW_POINT)) {
dkato 7:d782dce51ee6 67 y = ((int)LCD_PIXEL_HEIGHT - DRAW_POINT);
dkato 0:b2184c2d15dd 68 }
dkato 7:d782dce51ee6 69 idx_base = (x + ((int)LCD_PIXEL_WIDTH * y)) * TOUCH_BUFFER_BYTE_PER_PIXEL;
dkato 0:b2184c2d15dd 70
dkato 0:b2184c2d15dd 71 /* Select color */
dkato 0:b2184c2d15dd 72 if (id == 0) {
dkato 0:b2184c2d15dd 73 /* Blue */
dkato 0:b2184c2d15dd 74 coller_pix[0] = 0x0F; /* 4:Green 4:Blue */
dkato 0:b2184c2d15dd 75 coller_pix[1] = 0xF0; /* 4:Alpha 4:Red */
dkato 0:b2184c2d15dd 76 } else {
dkato 0:b2184c2d15dd 77 /* Pink */
dkato 0:b2184c2d15dd 78 coller_pix[0] = 0x07; /* 4:Green 4:Blue */
dkato 0:b2184c2d15dd 79 coller_pix[1] = 0xFF; /* 4:Alpha 4:Red */
dkato 0:b2184c2d15dd 80 }
dkato 0:b2184c2d15dd 81
dkato 0:b2184c2d15dd 82 /* Drawing */
dkato 6:95b92f2035dc 83 for (i = 0; i < DRAW_POINT; i++) {
dkato 7:d782dce51ee6 84 wk_idx = idx_base + ((int)LCD_PIXEL_WIDTH * TOUCH_BUFFER_BYTE_PER_PIXEL * i);
dkato 6:95b92f2035dc 85 for (j = 0; j < DRAW_POINT; j++) {
dkato 0:b2184c2d15dd 86 p_buf[wk_idx++] = coller_pix[0];
dkato 0:b2184c2d15dd 87 p_buf[wk_idx++] = coller_pix[1];
dkato 0:b2184c2d15dd 88 }
dkato 0:b2184c2d15dd 89 }
dkato 0:b2184c2d15dd 90 }
dkato 0:b2184c2d15dd 91
dkato 0:b2184c2d15dd 92 static void touch_int_callback(void) {
dkato 0:b2184c2d15dd 93 sem_touch_int.release();
dkato 0:b2184c2d15dd 94 }
dkato 0:b2184c2d15dd 95
dkato 2:8721836b639d 96 static void touch_task(void) {
dkato 0:b2184c2d15dd 97 DisplayBase::rect_t rect;
dkato 0:b2184c2d15dd 98 TouchKey::touch_pos_t touch_pos[TOUCH_NUM];
dkato 0:b2184c2d15dd 99 int touch_num = 0;
dkato 0:b2184c2d15dd 100 int touch_num_last = 0;
dkato 7:d782dce51ee6 101 uint32_t i;
dkato 7:d782dce51ee6 102 TouckKey_LCD_shield touch(P4_0, P2_13, I2C_SDA, I2C_SCL);
dkato 0:b2184c2d15dd 103
dkato 0:b2184c2d15dd 104 /* The layer by which the touch panel location is drawn */
dkato 0:b2184c2d15dd 105 memset(user_frame_buffer_touch, 0, sizeof(user_frame_buffer_touch));
dkato 0:b2184c2d15dd 106 dcache_clean(user_frame_buffer_touch, sizeof(user_frame_buffer_touch));
dkato 0:b2184c2d15dd 107 rect.vs = 0;
dkato 0:b2184c2d15dd 108 rect.vw = LCD_PIXEL_HEIGHT;
dkato 0:b2184c2d15dd 109 rect.hs = 0;
dkato 0:b2184c2d15dd 110 rect.hw = LCD_PIXEL_WIDTH;
dkato 0:b2184c2d15dd 111 Display.Graphics_Read_Setting(
dkato 0:b2184c2d15dd 112 DisplayBase::GRAPHICS_LAYER_1,
dkato 0:b2184c2d15dd 113 (void *)user_frame_buffer_touch,
dkato 0:b2184c2d15dd 114 TOUCH_BUFFER_STRIDE,
dkato 0:b2184c2d15dd 115 DisplayBase::GRAPHICS_FORMAT_ARGB4444,
dkato 0:b2184c2d15dd 116 DisplayBase::WR_RD_WRSWA_32_16BIT,
dkato 0:b2184c2d15dd 117 &rect
dkato 0:b2184c2d15dd 118 );
dkato 0:b2184c2d15dd 119 Display.Graphics_Start(DisplayBase::GRAPHICS_LAYER_1);
dkato 0:b2184c2d15dd 120
dkato 0:b2184c2d15dd 121 /* Callback setting */
dkato 0:b2184c2d15dd 122 touch.SetCallback(&touch_int_callback);
dkato 0:b2184c2d15dd 123
dkato 0:b2184c2d15dd 124 /* Reset touch IC */
dkato 0:b2184c2d15dd 125 touch.Reset();
dkato 0:b2184c2d15dd 126
dkato 0:b2184c2d15dd 127 while (1) {
dkato 0:b2184c2d15dd 128 /* Wait touch event */
dkato 0:b2184c2d15dd 129 sem_touch_int.wait();
dkato 0:b2184c2d15dd 130
dkato 0:b2184c2d15dd 131 /* Get touch coordinates */
dkato 0:b2184c2d15dd 132 touch_num = touch.GetCoordinates(TOUCH_NUM, touch_pos);
dkato 0:b2184c2d15dd 133
dkato 0:b2184c2d15dd 134 /* When it's a new touch, touch frame buffer is initialized */
dkato 0:b2184c2d15dd 135 if ((touch_num != 0) && (touch_num_last == 0)) {
dkato 0:b2184c2d15dd 136 memset(user_frame_buffer_touch, 0, sizeof(user_frame_buffer_touch));
dkato 0:b2184c2d15dd 137 }
dkato 0:b2184c2d15dd 138 touch_num_last = touch_num;
dkato 0:b2184c2d15dd 139
dkato 0:b2184c2d15dd 140 /* Drawing of a touch coordinate */
dkato 0:b2184c2d15dd 141 for (i = 0; i < TOUCH_NUM; i ++) {
dkato 7:d782dce51ee6 142 printf("{valid=%d,x=%lu,y=%lu} ", touch_pos[i].valid, touch_pos[i].x, touch_pos[i].y);
dkato 0:b2184c2d15dd 143 if (touch_pos[i].valid) {
dkato 6:95b92f2035dc 144 draw_touch_pos(user_frame_buffer_touch, i, touch_pos[i].x, touch_pos[i].y);
dkato 0:b2184c2d15dd 145 }
dkato 0:b2184c2d15dd 146 }
dkato 7:d782dce51ee6 147 printf("\r\n");
dkato 0:b2184c2d15dd 148
dkato 0:b2184c2d15dd 149 /* Data cache clean */
dkato 0:b2184c2d15dd 150 dcache_clean(user_frame_buffer_touch, sizeof(user_frame_buffer_touch));
dkato 0:b2184c2d15dd 151 }
dkato 0:b2184c2d15dd 152 }
dkato 7:d782dce51ee6 153 #endif // TouckKey_LCD_shield
dkato 0:b2184c2d15dd 154
dkato 8:5975dd9a8177 155 #if STRING_DISP_TEST
dkato 8:5975dd9a8177 156 /* STRING BUFFER Parameter GRAPHICS_LAYER_2 */
dkato 8:5975dd9a8177 157 #define STRING_PIXEL_HW (120)
dkato 8:5975dd9a8177 158 #define STRING_PIXEL_VM (24)
dkato 8:5975dd9a8177 159 #define STRING_BUFFER_BYTE_PER_PIXEL (2u)
dkato 8:5975dd9a8177 160 #define STRING_BUFFER_STRIDE (((LCD_PIXEL_WIDTH * STRING_BUFFER_BYTE_PER_PIXEL) + 31u) & ~31u)
dkato 8:5975dd9a8177 161
dkato 8:5975dd9a8177 162 #if defined(__ICCARM__)
dkato 8:5975dd9a8177 163 #pragma data_alignment=32
dkato 8:5975dd9a8177 164 static uint8_t user_frame_buffer_string[STRING_BUFFER_STRIDE * STRING_PIXEL_VM];
dkato 8:5975dd9a8177 165 #else
dkato 8:5975dd9a8177 166 static uint8_t user_frame_buffer_string[STRING_BUFFER_STRIDE * STRING_PIXEL_VM]__attribute((aligned(32)));
dkato 8:5975dd9a8177 167 #endif
dkato 8:5975dd9a8177 168
dkato 7:d782dce51ee6 169 static void string_task(void) {
dkato 4:bafd63604b7c 170 DisplayBase::rect_t rect;
dkato 4:bafd63604b7c 171 char test_cnt = 0x20;
dkato 4:bafd63604b7c 172
dkato 8:5975dd9a8177 173 DigitalOut led_blue(LED_BLUE);
dkato 8:5975dd9a8177 174
dkato 5:4e96673f4830 175 /* The layer by which the character string is drawn */
dkato 4:bafd63604b7c 176 memset(user_frame_buffer_string, 0, sizeof(user_frame_buffer_string));
dkato 4:bafd63604b7c 177 dcache_clean(user_frame_buffer_string, sizeof(user_frame_buffer_string));
dkato 7:d782dce51ee6 178
dkato 4:bafd63604b7c 179 rect.vs = LCD_PIXEL_HEIGHT - STRING_PIXEL_VM - 10;
dkato 4:bafd63604b7c 180 rect.vw = STRING_PIXEL_VM;
dkato 4:bafd63604b7c 181 rect.hs = LCD_PIXEL_WIDTH - STRING_PIXEL_HW - 10;
dkato 4:bafd63604b7c 182 rect.hw = STRING_PIXEL_HW;
dkato 4:bafd63604b7c 183 Display.Graphics_Read_Setting(
dkato 4:bafd63604b7c 184 DisplayBase::GRAPHICS_LAYER_2,
dkato 4:bafd63604b7c 185 (void *)user_frame_buffer_string,
dkato 4:bafd63604b7c 186 STRING_BUFFER_STRIDE,
dkato 4:bafd63604b7c 187 DisplayBase::GRAPHICS_FORMAT_ARGB4444,
dkato 4:bafd63604b7c 188 DisplayBase::WR_RD_WRSWA_32_16BIT,
dkato 4:bafd63604b7c 189 &rect
dkato 4:bafd63604b7c 190 );
dkato 4:bafd63604b7c 191 Display.Graphics_Start(DisplayBase::GRAPHICS_LAYER_2);
dkato 4:bafd63604b7c 192
dkato 4:bafd63604b7c 193 /* String */
dkato 4:bafd63604b7c 194 AsciiFont ascii_font(user_frame_buffer_string, STRING_PIXEL_HW, STRING_PIXEL_VM,
dkato 4:bafd63604b7c 195 STRING_BUFFER_STRIDE, STRING_BUFFER_BYTE_PER_PIXEL);
dkato 5:4e96673f4830 196 ascii_font.DrawStr("Font:", 0, 8, 0x0000ffff, 2);
dkato 7:d782dce51ee6 197
dkato 0:b2184c2d15dd 198 while (1) {
dkato 0:b2184c2d15dd 199 led_blue = !led_blue;
dkato 4:bafd63604b7c 200 //colour: rrrrGBAR (r:Reserve G:Green B:Blue A:Alpha R:Red
dkato 4:bafd63604b7c 201 ascii_font.DrawChar(test_cnt, 84, 0, 0x0000aa9f, 3);
dkato 4:bafd63604b7c 202 if (test_cnt < 0x7e) {
dkato 4:bafd63604b7c 203 test_cnt++;
dkato 4:bafd63604b7c 204 } else {
dkato 4:bafd63604b7c 205 test_cnt = 0x20;
dkato 4:bafd63604b7c 206 }
dkato 4:bafd63604b7c 207 dcache_clean(user_frame_buffer_string, sizeof(user_frame_buffer_string));
dkato 0:b2184c2d15dd 208 Thread::wait(1000);
dkato 0:b2184c2d15dd 209 }
dkato 0:b2184c2d15dd 210 }
dkato 8:5975dd9a8177 211 #endif // STRING_DISP_TEST
dkato 7:d782dce51ee6 212
dkato 7:d782dce51ee6 213 static void Start_Video_Camera(void) {
dkato 7:d782dce51ee6 214 // Video capture setting (progressive form fixed)
dkato 7:d782dce51ee6 215 Display.Video_Write_Setting(
dkato 7:d782dce51ee6 216 DisplayBase::VIDEO_INPUT_CHANNEL_0,
dkato 7:d782dce51ee6 217 DisplayBase::COL_SYS_NTSC_358,
dkato 7:d782dce51ee6 218 (void *)user_frame_buffer0,
dkato 7:d782dce51ee6 219 FRAME_BUFFER_STRIDE,
dkato 7:d782dce51ee6 220 DisplayBase::VIDEO_FORMAT_YCBCR422,
dkato 7:d782dce51ee6 221 DisplayBase::WR_RD_WRSWA_32_16BIT,
dkato 7:d782dce51ee6 222 VIDEO_PIXEL_VW,
dkato 7:d782dce51ee6 223 VIDEO_PIXEL_HW
dkato 7:d782dce51ee6 224 );
dkato 7:d782dce51ee6 225 EasyAttach_CameraStart(Display, DisplayBase::VIDEO_INPUT_CHANNEL_0);
dkato 7:d782dce51ee6 226 }
dkato 7:d782dce51ee6 227
dkato 7:d782dce51ee6 228 static void Start_LCD_Display(void) {
dkato 7:d782dce51ee6 229 DisplayBase::rect_t rect;
dkato 7:d782dce51ee6 230
dkato 7:d782dce51ee6 231 rect.vs = 0;
dkato 7:d782dce51ee6 232 rect.vw = LCD_PIXEL_HEIGHT;
dkato 7:d782dce51ee6 233 rect.hs = 0;
dkato 7:d782dce51ee6 234 rect.hw = LCD_PIXEL_WIDTH;
dkato 7:d782dce51ee6 235 Display.Graphics_Read_Setting(
dkato 7:d782dce51ee6 236 DisplayBase::GRAPHICS_LAYER_0,
dkato 7:d782dce51ee6 237 (void *)user_frame_buffer0,
dkato 7:d782dce51ee6 238 FRAME_BUFFER_STRIDE,
dkato 7:d782dce51ee6 239 DisplayBase::GRAPHICS_FORMAT_YCBCR422,
dkato 7:d782dce51ee6 240 DisplayBase::WR_RD_WRSWA_32_16BIT,
dkato 7:d782dce51ee6 241 &rect
dkato 7:d782dce51ee6 242 );
dkato 7:d782dce51ee6 243 Display.Graphics_Start(DisplayBase::GRAPHICS_LAYER_0);
dkato 7:d782dce51ee6 244
dkato 7:d782dce51ee6 245 Thread::wait(50);
dkato 7:d782dce51ee6 246 EasyAttach_LcdBacklight(true);
dkato 7:d782dce51ee6 247 }
dkato 7:d782dce51ee6 248
dkato 7:d782dce51ee6 249 int main(void) {
dkato 7:d782dce51ee6 250 // Initialize the background to black
dkato 7:d782dce51ee6 251 for (uint32_t i = 0; i < sizeof(user_frame_buffer0); i += 2) {
dkato 7:d782dce51ee6 252 user_frame_buffer0[i + 0] = 0x00;
dkato 7:d782dce51ee6 253 user_frame_buffer0[i + 1] = 0x80;
dkato 7:d782dce51ee6 254 }
dkato 7:d782dce51ee6 255
dkato 7:d782dce51ee6 256 #if ASPECT_RATIO_16_9
dkato 7:d782dce51ee6 257 EasyAttach_Init(Display, 640, 360); //aspect ratio 16:9
dkato 7:d782dce51ee6 258 #else
dkato 7:d782dce51ee6 259 EasyAttach_Init(Display); //aspect ratio 4:3
dkato 7:d782dce51ee6 260 #endif
dkato 7:d782dce51ee6 261 Start_Video_Camera();
dkato 7:d782dce51ee6 262 Start_LCD_Display();
dkato 7:d782dce51ee6 263
dkato 7:d782dce51ee6 264 /* Start touch panel processing */
dkato 7:d782dce51ee6 265 #if defined(TouckKey_LCD_shield)
dkato 7:d782dce51ee6 266 Thread touchTask;
dkato 7:d782dce51ee6 267 touchTask.start(callback(touch_task));
dkato 7:d782dce51ee6 268 #endif // TouckKey_LCD_shield
dkato 7:d782dce51ee6 269
dkato 8:5975dd9a8177 270 #if STRING_DISP_TEST
dkato 7:d782dce51ee6 271 /* Start string disp processing */
dkato 7:d782dce51ee6 272 Thread stringTask;
dkato 7:d782dce51ee6 273 stringTask.start(callback(string_task));
dkato 8:5975dd9a8177 274 #endif // STRING_DISP_TEST
dkato 8:5975dd9a8177 275
dkato 8:5975dd9a8177 276 #if defined(TouckKey_LCD_shield)
dkato 8:5975dd9a8177 277 touchTask.join();
dkato 8:5975dd9a8177 278 #endif // TouckKey_LCD_shield
dkato 8:5975dd9a8177 279 #if STRING_DISP_TEST
dkato 7:d782dce51ee6 280 stringTask.join();
dkato 8:5975dd9a8177 281 #endif // STRING_DISP_TEST
dkato 7:d782dce51ee6 282 }