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:
Thu Oct 25 05:04:48 2018 +0000
Revision:
10:cdef6df6eac9
Parent:
9:61f53c094a1c
Supports mbed-os 5.10.0 and later

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