test

Dependencies:   GraphicsFramework GR-PEACH_video LCD_shield_config R_BSP

Committer:
shilianming
Date:
Tue Dec 01 07:32:37 2020 +0000
Revision:
0:66434fa5ef92
0.1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
shilianming 0:66434fa5ef92 1 /*
shilianming 0:66434fa5ef92 2 Permission is hereby granted, free of charge, to any person obtaining a copy
shilianming 0:66434fa5ef92 3 of this software and associated documentation files (the "Software"), to deal
shilianming 0:66434fa5ef92 4 in the Software without restriction, including without limitation the rights
shilianming 0:66434fa5ef92 5 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
shilianming 0:66434fa5ef92 6 copies of the Software, and to permit persons to whom the Software is
shilianming 0:66434fa5ef92 7 furnished to do so, subject to the following conditions:
shilianming 0:66434fa5ef92 8
shilianming 0:66434fa5ef92 9 The above copyright notice and this permission notice shall be included in
shilianming 0:66434fa5ef92 10 all copies or substantial portions of the Software.
shilianming 0:66434fa5ef92 11
shilianming 0:66434fa5ef92 12 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
shilianming 0:66434fa5ef92 13 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
shilianming 0:66434fa5ef92 14 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
shilianming 0:66434fa5ef92 15 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
shilianming 0:66434fa5ef92 16 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
shilianming 0:66434fa5ef92 17 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
shilianming 0:66434fa5ef92 18 THE SOFTWARE.
shilianming 0:66434fa5ef92 19 */
shilianming 0:66434fa5ef92 20
shilianming 0:66434fa5ef92 21 #include "mbed.h"
shilianming 0:66434fa5ef92 22 #include "rga_func.h"
shilianming 0:66434fa5ef92 23 #include "DisplayBace.h"
shilianming 0:66434fa5ef92 24 #include "rtos.h"
shilianming 0:66434fa5ef92 25 #include "LCD_shield_config_7_1inch.h"
shilianming 0:66434fa5ef92 26
shilianming 0:66434fa5ef92 27 #define GRAPHICS_FORMAT (DisplayBase::GRAPHICS_FORMAT_RGB565)
shilianming 0:66434fa5ef92 28 #define WR_RD_WRSWA (DisplayBase::WR_RD_WRSWA_32_16BIT)
shilianming 0:66434fa5ef92 29 #define TOUCH_NUM (1u)
shilianming 0:66434fa5ef92 30
shilianming 0:66434fa5ef92 31 /* FRAME BUFFER Parameter */
shilianming 0:66434fa5ef92 32 #define FRAME_BUFFER_BYTE_PER_PIXEL (2)
shilianming 0:66434fa5ef92 33 #define FRAME_BUFFER_STRIDE (((LCD_PIXEL_WIDTH * FRAME_BUFFER_BYTE_PER_PIXEL) + 31u) & ~31u)
shilianming 0:66434fa5ef92 34
shilianming 0:66434fa5ef92 35 #define DRAW_RECTANGLE_CNT_MAX (4)
shilianming 0:66434fa5ef92 36
shilianming 0:66434fa5ef92 37 typedef enum {
shilianming 0:66434fa5ef92 38 RGA_FUNC_NON,
shilianming 0:66434fa5ef92 39 RGA_FUNC_DRAW_RECTANGLE,
shilianming 0:66434fa5ef92 40 RGA_FUNC_DRAW_IMAGE,
shilianming 0:66434fa5ef92 41 RGA_FUNC_DISSOLVE,
shilianming 0:66434fa5ef92 42 RGA_FUNC_SCROLL,
shilianming 0:66434fa5ef92 43 RGA_FUNC_ZOOM,
shilianming 0:66434fa5ef92 44 RGA_FUNC_ROTATION,
shilianming 0:66434fa5ef92 45 RGA_FUNC_ACCELERATE,
shilianming 0:66434fa5ef92 46 RGA_FUNC_ANIME_EASE,
shilianming 0:66434fa5ef92 47 RGA_FUNC_ANIME_LINEAR,
shilianming 0:66434fa5ef92 48 RGA_FUNC_ANIME_EASE_IN,
shilianming 0:66434fa5ef92 49 RGA_FUNC_ANIME_EASE_OUT,
shilianming 0:66434fa5ef92 50 RGA_FUNC_ANIME_EASE_IN_OUT,
shilianming 0:66434fa5ef92 51 RGA_FUNC_RETURN,
shilianming 0:66434fa5ef92 52 RGA_FUNC_END
shilianming 0:66434fa5ef92 53 } func_code_t;
shilianming 0:66434fa5ef92 54
shilianming 0:66434fa5ef92 55 DigitalOut lcd_pwon(P7_15);
shilianming 0:66434fa5ef92 56 DigitalOut lcd_blon(P8_1);
shilianming 0:66434fa5ef92 57 PwmOut lcd_cntrst(P8_15);
shilianming 0:66434fa5ef92 58 DisplayBase Display;
shilianming 0:66434fa5ef92 59
shilianming 0:66434fa5ef92 60 typedef struct {
shilianming 0:66434fa5ef92 61 uint32_t pic_pos_x; /* X position of the key picture. */
shilianming 0:66434fa5ef92 62 uint32_t pic_pos_y; /* Y position of the key picture. */
shilianming 0:66434fa5ef92 63 uint32_t pic_width; /* Width of the key picture. */
shilianming 0:66434fa5ef92 64 uint32_t pic_height; /* Height of the key picture. */
shilianming 0:66434fa5ef92 65 func_code_t func_code; /* func code of the key picture. */
shilianming 0:66434fa5ef92 66 } key_pic_info_t;
shilianming 0:66434fa5ef92 67
shilianming 0:66434fa5ef92 68 #if defined(__ICCARM__)
shilianming 0:66434fa5ef92 69 #pragma data_alignment=32
shilianming 0:66434fa5ef92 70 static uint8_t user_frame_buffer1[FRAME_BUFFER_STRIDE * LCD_PIXEL_HEIGHT];
shilianming 0:66434fa5ef92 71 #pragma data_alignment=32
shilianming 0:66434fa5ef92 72 static uint8_t user_frame_buffer2[FRAME_BUFFER_STRIDE * LCD_PIXEL_HEIGHT];
shilianming 0:66434fa5ef92 73 #else
shilianming 0:66434fa5ef92 74 static uint8_t user_frame_buffer1[FRAME_BUFFER_STRIDE * LCD_PIXEL_HEIGHT]__attribute((aligned(32))); /* 32 bytes aligned */
shilianming 0:66434fa5ef92 75 static uint8_t user_frame_buffer2[FRAME_BUFFER_STRIDE * LCD_PIXEL_HEIGHT]__attribute((aligned(32))); /* 32 bytes aligned */
shilianming 0:66434fa5ef92 76 #endif
shilianming 0:66434fa5ef92 77 static frame_buffer_t frame_buffer_info;
shilianming 0:66434fa5ef92 78 static volatile int32_t vsync_count = 0;
shilianming 0:66434fa5ef92 79
shilianming 0:66434fa5ef92 80 static const key_pic_info_t top_screen_key_tbl[] = {
shilianming 0:66434fa5ef92 81 /* X Y Width Height Func code */
shilianming 0:66434fa5ef92 82 { 50, 350, 120, 52, RGA_FUNC_DRAW_RECTANGLE }, /* RGA Func1 */
shilianming 0:66434fa5ef92 83 { 230, 350, 120, 52, RGA_FUNC_DRAW_IMAGE }, /* RGA Func2 */
shilianming 0:66434fa5ef92 84 { 410, 350, 120, 52, RGA_FUNC_DISSOLVE }, /* RGA Func3 */
shilianming 0:66434fa5ef92 85 { 50, 420, 120, 52, RGA_FUNC_SCROLL }, /* RGA Func4 */
shilianming 0:66434fa5ef92 86 { 230, 420, 120, 52, RGA_FUNC_ZOOM }, /* RGA Func5 */
shilianming 0:66434fa5ef92 87 { 410, 420, 120, 52, RGA_FUNC_ROTATION }, /* RGA Func6 */
shilianming 0:66434fa5ef92 88 { 615, 420, 120, 52, RGA_FUNC_ACCELERATE }, /* RGA Func7 */
shilianming 0:66434fa5ef92 89 { 0, 0, 0, 0, RGA_FUNC_END } /* table end */
shilianming 0:66434fa5ef92 90 };
shilianming 0:66434fa5ef92 91
shilianming 0:66434fa5ef92 92 static const key_pic_info_t return_key_tbl[] = {
shilianming 0:66434fa5ef92 93 /* X Y Width Height Func code */
shilianming 0:66434fa5ef92 94 { 640, 10, 150, 84, RGA_FUNC_RETURN }, /* Return Top Screen */
shilianming 0:66434fa5ef92 95 { 0, 0, 0, 0, RGA_FUNC_END } /* table end */
shilianming 0:66434fa5ef92 96 };
shilianming 0:66434fa5ef92 97
shilianming 0:66434fa5ef92 98 static const key_pic_info_t animetion_timing_key_tbl[] = {
shilianming 0:66434fa5ef92 99 /* X Y Width Height Func code */
shilianming 0:66434fa5ef92 100 { 640, 10, 150, 84, RGA_FUNC_RETURN }, /* Return Top Screen */
shilianming 0:66434fa5ef92 101 { 17, 372, 136, 50, RGA_FUNC_ANIME_EASE }, /* ease */
shilianming 0:66434fa5ef92 102 { 173, 372, 136, 50, RGA_FUNC_ANIME_LINEAR }, /* linear */
shilianming 0:66434fa5ef92 103 { 330, 372, 136, 50, RGA_FUNC_ANIME_EASE_IN }, /* ease-in */
shilianming 0:66434fa5ef92 104 { 487, 372, 136, 50, RGA_FUNC_ANIME_EASE_OUT }, /* ease-out */
shilianming 0:66434fa5ef92 105 { 644, 372, 136, 50, RGA_FUNC_ANIME_EASE_IN_OUT }, /* ease-in-out */
shilianming 0:66434fa5ef92 106 { 0, 0, 0, 0, RGA_FUNC_END } /* table end */
shilianming 0:66434fa5ef92 107 };
shilianming 0:66434fa5ef92 108
shilianming 0:66434fa5ef92 109 /****** LCD ******/
shilianming 0:66434fa5ef92 110 static void IntCallbackFunc_LoVsync(DisplayBase::int_type_t int_type) {
shilianming 0:66434fa5ef92 111 /* Interrupt callback function for Vsync interruption */
shilianming 0:66434fa5ef92 112 if (vsync_count > 0) {
shilianming 0:66434fa5ef92 113 vsync_count--;
shilianming 0:66434fa5ef92 114 }
shilianming 0:66434fa5ef92 115 }
shilianming 0:66434fa5ef92 116
shilianming 0:66434fa5ef92 117 static void Wait_Vsync(const int32_t wait_count) {
shilianming 0:66434fa5ef92 118 /* Wait for the specified number of times Vsync occurs */
shilianming 0:66434fa5ef92 119 vsync_count = wait_count;
shilianming 0:66434fa5ef92 120 while (vsync_count > 0) {
shilianming 0:66434fa5ef92 121 /* Do nothing */
shilianming 0:66434fa5ef92 122 }
shilianming 0:66434fa5ef92 123 }
shilianming 0:66434fa5ef92 124
shilianming 0:66434fa5ef92 125 static void Init_LCD_Display(void) {
shilianming 0:66434fa5ef92 126 DisplayBase::graphics_error_t error;
shilianming 0:66434fa5ef92 127 DisplayBase::lcd_config_t lcd_config;
shilianming 0:66434fa5ef92 128 PinName lvds_pin[8] = {
shilianming 0:66434fa5ef92 129 /* data pin */
shilianming 0:66434fa5ef92 130 P5_7, P5_6, P5_5, P5_4, P5_3, P5_2, P5_1, P5_0
shilianming 0:66434fa5ef92 131 };
shilianming 0:66434fa5ef92 132
shilianming 0:66434fa5ef92 133 lcd_pwon = 0;
shilianming 0:66434fa5ef92 134 lcd_blon = 0;
shilianming 0:66434fa5ef92 135 Thread::wait(100);
shilianming 0:66434fa5ef92 136 lcd_pwon = 1;
shilianming 0:66434fa5ef92 137 lcd_blon = 1;
shilianming 0:66434fa5ef92 138
shilianming 0:66434fa5ef92 139 Display.Graphics_Lvds_Port_Init(lvds_pin, 8);
shilianming 0:66434fa5ef92 140
shilianming 0:66434fa5ef92 141 /* Graphics initialization process */
shilianming 0:66434fa5ef92 142 lcd_config = LcdCfgTbl_LCD_shield;
shilianming 0:66434fa5ef92 143 error = Display.Graphics_init(&lcd_config);
shilianming 0:66434fa5ef92 144 if (error != DisplayBase::GRAPHICS_OK) {
shilianming 0:66434fa5ef92 145 printf("Line %d, error %d\n", __LINE__, error);
shilianming 0:66434fa5ef92 146 mbed_die();
shilianming 0:66434fa5ef92 147 }
shilianming 0:66434fa5ef92 148
shilianming 0:66434fa5ef92 149 /* Interrupt callback function setting (Vsync signal output from scaler 0) */
shilianming 0:66434fa5ef92 150 error = Display.Graphics_Irq_Handler_Set(DisplayBase::INT_TYPE_S0_LO_VSYNC, 0, IntCallbackFunc_LoVsync);
shilianming 0:66434fa5ef92 151 if (error != DisplayBase::GRAPHICS_OK) {
shilianming 0:66434fa5ef92 152 printf("Line %d, error %d\n", __LINE__, error);
shilianming 0:66434fa5ef92 153 mbed_die();
shilianming 0:66434fa5ef92 154 }
shilianming 0:66434fa5ef92 155 }
shilianming 0:66434fa5ef92 156
shilianming 0:66434fa5ef92 157 static void Start_LCD_Display(uint8_t * p_buf) {
shilianming 0:66434fa5ef92 158 DisplayBase::rect_t rect;
shilianming 0:66434fa5ef92 159
shilianming 0:66434fa5ef92 160 rect.vs = 0;
shilianming 0:66434fa5ef92 161 rect.vw = LCD_PIXEL_HEIGHT;
shilianming 0:66434fa5ef92 162 rect.hs = 0;
shilianming 0:66434fa5ef92 163 rect.hw = LCD_PIXEL_WIDTH;
shilianming 0:66434fa5ef92 164 Display.Graphics_Read_Setting(
shilianming 0:66434fa5ef92 165 DisplayBase::GRAPHICS_LAYER_0,
shilianming 0:66434fa5ef92 166 (void *)p_buf,
shilianming 0:66434fa5ef92 167 FRAME_BUFFER_STRIDE,
shilianming 0:66434fa5ef92 168 GRAPHICS_FORMAT,
shilianming 0:66434fa5ef92 169 WR_RD_WRSWA,
shilianming 0:66434fa5ef92 170 &rect
shilianming 0:66434fa5ef92 171 );
shilianming 0:66434fa5ef92 172 Display.Graphics_Start(DisplayBase::GRAPHICS_LAYER_0);
shilianming 0:66434fa5ef92 173 }
shilianming 0:66434fa5ef92 174
shilianming 0:66434fa5ef92 175 static void Update_LCD_Display(frame_buffer_t * frmbuf_info) {
shilianming 0:66434fa5ef92 176 Display.Graphics_Read_Change(DisplayBase::GRAPHICS_LAYER_0,
shilianming 0:66434fa5ef92 177 (void *)frmbuf_info->buffer_address[frmbuf_info->draw_buffer_index]);
shilianming 0:66434fa5ef92 178 Wait_Vsync(1);
shilianming 0:66434fa5ef92 179 }
shilianming 0:66434fa5ef92 180
shilianming 0:66434fa5ef92 181 static void Swap_FrameBuffer(frame_buffer_t * frmbuf_info) {
shilianming 0:66434fa5ef92 182 if (frmbuf_info->draw_buffer_index == 1) {
shilianming 0:66434fa5ef92 183 frmbuf_info->draw_buffer_index = 0;
shilianming 0:66434fa5ef92 184 } else {
shilianming 0:66434fa5ef92 185 frmbuf_info->draw_buffer_index = 1;
shilianming 0:66434fa5ef92 186 }
shilianming 0:66434fa5ef92 187 }
shilianming 0:66434fa5ef92 188
shilianming 0:66434fa5ef92 189 /****** Touch ******/
shilianming 0:66434fa5ef92 190 static func_code_t Scan_Key(const key_pic_info_t * key_tbl, const uint32_t pos_x, const uint32_t pos_y) {
shilianming 0:66434fa5ef92 191 func_code_t ret = RGA_FUNC_NON;
shilianming 0:66434fa5ef92 192
shilianming 0:66434fa5ef92 193 while (ret == RGA_FUNC_NON) {
shilianming 0:66434fa5ef92 194 if (key_tbl->func_code == RGA_FUNC_END) {
shilianming 0:66434fa5ef92 195 break;
shilianming 0:66434fa5ef92 196 }
shilianming 0:66434fa5ef92 197 /* Check the range of the X position */
shilianming 0:66434fa5ef92 198 if ((pos_x >= key_tbl->pic_pos_x) && (pos_x <= (key_tbl->pic_pos_x + key_tbl->pic_width))) {
shilianming 0:66434fa5ef92 199 /* Check the range of the Y position */
shilianming 0:66434fa5ef92 200 if ((pos_y >= key_tbl->pic_pos_y) && (pos_y <= (key_tbl->pic_pos_y + key_tbl->pic_height))) {
shilianming 0:66434fa5ef92 201 /* Decide the func code. */
shilianming 0:66434fa5ef92 202 ret = key_tbl->func_code;
shilianming 0:66434fa5ef92 203 }
shilianming 0:66434fa5ef92 204 }
shilianming 0:66434fa5ef92 205 key_tbl++;
shilianming 0:66434fa5ef92 206 }
shilianming 0:66434fa5ef92 207
shilianming 0:66434fa5ef92 208 return ret;
shilianming 0:66434fa5ef92 209 }
shilianming 0:66434fa5ef92 210
shilianming 0:66434fa5ef92 211 /****** Efect ******/
shilianming 0:66434fa5ef92 212 static void Exe_RGA_Func(func_code_t func_name, frame_buffer_t* frmbuf_info, TouckKey_LCD_shield * p_touch) {
shilianming 0:66434fa5ef92 213 uint8_t touch_num = 0;
shilianming 0:66434fa5ef92 214 TouchKey::touch_pos_t touch_pos[TOUCH_NUM];
shilianming 0:66434fa5ef92 215
shilianming 0:66434fa5ef92 216 switch (func_name) {
shilianming 0:66434fa5ef92 217 case RGA_FUNC_DRAW_RECTANGLE:
shilianming 0:66434fa5ef92 218 {
shilianming 0:66434fa5ef92 219 bool key_on = false;
shilianming 0:66434fa5ef92 220 int cnt;
shilianming 0:66434fa5ef92 221 int color_cnt = 0;
shilianming 0:66434fa5ef92 222 int x_0 = 0;
shilianming 0:66434fa5ef92 223 int y_0 = 0;
shilianming 0:66434fa5ef92 224 draw_rectangle_pos_t pos_tbl[DRAW_RECTANGLE_CNT_MAX] = {0};
shilianming 0:66434fa5ef92 225
shilianming 0:66434fa5ef92 226 pos_tbl[0].style = "#FF0000"; /* red */
shilianming 0:66434fa5ef92 227 pos_tbl[1].style = "#00FF00"; /* green */
shilianming 0:66434fa5ef92 228 pos_tbl[2].style = "#0000FF"; /* blue */
shilianming 0:66434fa5ef92 229 pos_tbl[3].style = "#000000"; /* black */
shilianming 0:66434fa5ef92 230
shilianming 0:66434fa5ef92 231 while (1) {
shilianming 0:66434fa5ef92 232 /* Get coordinates */
shilianming 0:66434fa5ef92 233 touch_num = p_touch->GetCoordinates(TOUCH_NUM, touch_pos);
shilianming 0:66434fa5ef92 234 if (touch_num != 0) {
shilianming 0:66434fa5ef92 235 if (Scan_Key(return_key_tbl, touch_pos[0].x, touch_pos[0].y) == RGA_FUNC_RETURN) {
shilianming 0:66434fa5ef92 236 break;
shilianming 0:66434fa5ef92 237 }
shilianming 0:66434fa5ef92 238 if (key_on == false) {
shilianming 0:66434fa5ef92 239 key_on = true;
shilianming 0:66434fa5ef92 240 if (color_cnt == 0) {
shilianming 0:66434fa5ef92 241 for (cnt = 0; cnt < DRAW_RECTANGLE_CNT_MAX; cnt++) {
shilianming 0:66434fa5ef92 242 pos_tbl[cnt].x = 0;
shilianming 0:66434fa5ef92 243 pos_tbl[cnt].y = 0;
shilianming 0:66434fa5ef92 244 pos_tbl[cnt].w = 0;
shilianming 0:66434fa5ef92 245 pos_tbl[cnt].h = 0;
shilianming 0:66434fa5ef92 246 }
shilianming 0:66434fa5ef92 247 }
shilianming 0:66434fa5ef92 248 x_0 = touch_pos[0].x;
shilianming 0:66434fa5ef92 249 y_0 = touch_pos[0].y;
shilianming 0:66434fa5ef92 250 }
shilianming 0:66434fa5ef92 251 if (x_0 < touch_pos[0].x) {
shilianming 0:66434fa5ef92 252 pos_tbl[color_cnt].x = x_0;
shilianming 0:66434fa5ef92 253 pos_tbl[color_cnt].w = touch_pos[0].x - x_0;
shilianming 0:66434fa5ef92 254 } else {
shilianming 0:66434fa5ef92 255 pos_tbl[color_cnt].x = touch_pos[0].x;
shilianming 0:66434fa5ef92 256 pos_tbl[color_cnt].w = x_0 - touch_pos[0].x;
shilianming 0:66434fa5ef92 257 }
shilianming 0:66434fa5ef92 258 if (y_0 < touch_pos[0].y) {
shilianming 0:66434fa5ef92 259 pos_tbl[color_cnt].y = y_0;
shilianming 0:66434fa5ef92 260 pos_tbl[color_cnt].h = touch_pos[0].y - y_0;
shilianming 0:66434fa5ef92 261 } else {
shilianming 0:66434fa5ef92 262 pos_tbl[color_cnt].y = touch_pos[0].y;
shilianming 0:66434fa5ef92 263 pos_tbl[color_cnt].h = y_0 - touch_pos[0].y;
shilianming 0:66434fa5ef92 264 }
shilianming 0:66434fa5ef92 265 } else {
shilianming 0:66434fa5ef92 266 if (key_on != false) {
shilianming 0:66434fa5ef92 267 color_cnt++;
shilianming 0:66434fa5ef92 268 if (color_cnt == DRAW_RECTANGLE_CNT_MAX) {
shilianming 0:66434fa5ef92 269 color_cnt = 0;
shilianming 0:66434fa5ef92 270 }
shilianming 0:66434fa5ef92 271 }
shilianming 0:66434fa5ef92 272 key_on = false;
shilianming 0:66434fa5ef92 273 }
shilianming 0:66434fa5ef92 274 /* Draw screen */
shilianming 0:66434fa5ef92 275 Swap_FrameBuffer(frmbuf_info);
shilianming 0:66434fa5ef92 276 RGA_Func_DrawRectangle(frmbuf_info, pos_tbl, DRAW_RECTANGLE_CNT_MAX);
shilianming 0:66434fa5ef92 277 Update_LCD_Display(frmbuf_info);
shilianming 0:66434fa5ef92 278 }
shilianming 0:66434fa5ef92 279 }
shilianming 0:66434fa5ef92 280 break;
shilianming 0:66434fa5ef92 281 case RGA_FUNC_DRAW_IMAGE:
shilianming 0:66434fa5ef92 282 {
shilianming 0:66434fa5ef92 283 int center_pos_x = 320;
shilianming 0:66434fa5ef92 284 int center_pos_y = 110;
shilianming 0:66434fa5ef92 285 while (1) {
shilianming 0:66434fa5ef92 286 /* Get coordinates */
shilianming 0:66434fa5ef92 287 touch_num = p_touch->GetCoordinates(TOUCH_NUM, touch_pos);
shilianming 0:66434fa5ef92 288 if (touch_num != 0) {
shilianming 0:66434fa5ef92 289 if (Scan_Key(return_key_tbl, touch_pos[0].x, touch_pos[0].y) == RGA_FUNC_RETURN) {
shilianming 0:66434fa5ef92 290 break;
shilianming 0:66434fa5ef92 291 }
shilianming 0:66434fa5ef92 292 center_pos_x = touch_pos[0].x;
shilianming 0:66434fa5ef92 293 center_pos_y = touch_pos[0].y;
shilianming 0:66434fa5ef92 294 }
shilianming 0:66434fa5ef92 295 /* Draw screen */
shilianming 0:66434fa5ef92 296 Swap_FrameBuffer(frmbuf_info);
shilianming 0:66434fa5ef92 297 RGA_Func_DrawImage(frmbuf_info, center_pos_x, center_pos_y);
shilianming 0:66434fa5ef92 298 Update_LCD_Display(frmbuf_info);
shilianming 0:66434fa5ef92 299 }
shilianming 0:66434fa5ef92 300 }
shilianming 0:66434fa5ef92 301 break;
shilianming 0:66434fa5ef92 302 case RGA_FUNC_DISSOLVE:
shilianming 0:66434fa5ef92 303 {
shilianming 0:66434fa5ef92 304 float32_t work_alpha = 0.0f;
shilianming 0:66434fa5ef92 305 while (1) {
shilianming 0:66434fa5ef92 306 /* Get coordinates */
shilianming 0:66434fa5ef92 307 touch_num = p_touch->GetCoordinates(TOUCH_NUM, touch_pos);
shilianming 0:66434fa5ef92 308 if (touch_num != 0) {
shilianming 0:66434fa5ef92 309 if (Scan_Key(return_key_tbl, touch_pos[0].x, touch_pos[0].y) == RGA_FUNC_RETURN) {
shilianming 0:66434fa5ef92 310 break;
shilianming 0:66434fa5ef92 311 }
shilianming 0:66434fa5ef92 312 work_alpha = (float32_t)touch_pos[0].x / (float32_t)(LCD_PIXEL_WIDTH);
shilianming 0:66434fa5ef92 313 }
shilianming 0:66434fa5ef92 314 /* Draw screen */
shilianming 0:66434fa5ef92 315 Swap_FrameBuffer(frmbuf_info);
shilianming 0:66434fa5ef92 316 RGA_Func_Dissolve(frmbuf_info, work_alpha);
shilianming 0:66434fa5ef92 317 Update_LCD_Display(frmbuf_info);
shilianming 0:66434fa5ef92 318 }
shilianming 0:66434fa5ef92 319 }
shilianming 0:66434fa5ef92 320 break;
shilianming 0:66434fa5ef92 321 case RGA_FUNC_SCROLL:
shilianming 0:66434fa5ef92 322 {
shilianming 0:66434fa5ef92 323 int work_width_pos = 0;
shilianming 0:66434fa5ef92 324 while (1) {
shilianming 0:66434fa5ef92 325 /* Get coordinates */
shilianming 0:66434fa5ef92 326 touch_num = p_touch->GetCoordinates(TOUCH_NUM, touch_pos);
shilianming 0:66434fa5ef92 327 if (touch_num != 0) {
shilianming 0:66434fa5ef92 328 if (Scan_Key(return_key_tbl, touch_pos[0].x, touch_pos[0].y) == RGA_FUNC_RETURN) {
shilianming 0:66434fa5ef92 329 break;
shilianming 0:66434fa5ef92 330 }
shilianming 0:66434fa5ef92 331 work_width_pos = SCROLL_MAX_NUM * ((float32_t)touch_pos[0].x / (float32_t)(LCD_PIXEL_WIDTH));
shilianming 0:66434fa5ef92 332 }
shilianming 0:66434fa5ef92 333 /* Draw screen */
shilianming 0:66434fa5ef92 334 Swap_FrameBuffer(frmbuf_info);
shilianming 0:66434fa5ef92 335 RGA_Func_Scroll(frmbuf_info, work_width_pos);
shilianming 0:66434fa5ef92 336 Update_LCD_Display(frmbuf_info);
shilianming 0:66434fa5ef92 337 }
shilianming 0:66434fa5ef92 338 }
shilianming 0:66434fa5ef92 339 break;
shilianming 0:66434fa5ef92 340 case RGA_FUNC_ZOOM:
shilianming 0:66434fa5ef92 341 {
shilianming 0:66434fa5ef92 342 int work_height_pos = ZOOM_MAX_NUM;
shilianming 0:66434fa5ef92 343 while (1) {
shilianming 0:66434fa5ef92 344 /* Get coordinates */
shilianming 0:66434fa5ef92 345 touch_num = p_touch->GetCoordinates(TOUCH_NUM, touch_pos);
shilianming 0:66434fa5ef92 346 if (touch_num != 0) {
shilianming 0:66434fa5ef92 347 if (Scan_Key(return_key_tbl, touch_pos[0].x, touch_pos[0].y) == RGA_FUNC_RETURN) {
shilianming 0:66434fa5ef92 348 break;
shilianming 0:66434fa5ef92 349 }
shilianming 0:66434fa5ef92 350 work_height_pos = ZOOM_MAX_NUM * ((float32_t)touch_pos[0].x / (float32_t)(LCD_PIXEL_WIDTH));
shilianming 0:66434fa5ef92 351 }
shilianming 0:66434fa5ef92 352 /* Draw screen */
shilianming 0:66434fa5ef92 353 Swap_FrameBuffer(frmbuf_info);
shilianming 0:66434fa5ef92 354 RGA_Func_Zoom(frmbuf_info, work_height_pos);
shilianming 0:66434fa5ef92 355 Update_LCD_Display(frmbuf_info);
shilianming 0:66434fa5ef92 356 }
shilianming 0:66434fa5ef92 357 }
shilianming 0:66434fa5ef92 358 break;
shilianming 0:66434fa5ef92 359 case RGA_FUNC_ROTATION:
shilianming 0:66434fa5ef92 360 {
shilianming 0:66434fa5ef92 361 graphics_matrix_float_t work_angle = 0;
shilianming 0:66434fa5ef92 362 while (1) {
shilianming 0:66434fa5ef92 363 /* Get coordinates */
shilianming 0:66434fa5ef92 364 touch_num = p_touch->GetCoordinates(TOUCH_NUM, touch_pos);
shilianming 0:66434fa5ef92 365 if (touch_num != 0) {
shilianming 0:66434fa5ef92 366 if (Scan_Key(return_key_tbl, touch_pos[0].x, touch_pos[0].y) == RGA_FUNC_RETURN) {
shilianming 0:66434fa5ef92 367 break;
shilianming 0:66434fa5ef92 368 }
shilianming 0:66434fa5ef92 369 work_angle = ROTATION_MAX_NUM * ((float32_t)touch_pos[0].x / (float32_t)(LCD_PIXEL_WIDTH));
shilianming 0:66434fa5ef92 370 }
shilianming 0:66434fa5ef92 371 /* Draw screen */
shilianming 0:66434fa5ef92 372 Swap_FrameBuffer(frmbuf_info);
shilianming 0:66434fa5ef92 373 RGA_Func_Rotation(frmbuf_info, work_angle);
shilianming 0:66434fa5ef92 374 Update_LCD_Display(frmbuf_info);
shilianming 0:66434fa5ef92 375 }
shilianming 0:66434fa5ef92 376 }
shilianming 0:66434fa5ef92 377 break;
shilianming 0:66434fa5ef92 378 case RGA_FUNC_ACCELERATE:
shilianming 0:66434fa5ef92 379 {
shilianming 0:66434fa5ef92 380 int acce_frame_num = 0;
shilianming 0:66434fa5ef92 381 int animation_timing = 0;
shilianming 0:66434fa5ef92 382 float32_t work_relative_pos;
shilianming 0:66434fa5ef92 383 while (1) {
shilianming 0:66434fa5ef92 384 /* Get coordinates */
shilianming 0:66434fa5ef92 385 touch_num = p_touch->GetCoordinates(TOUCH_NUM, touch_pos);
shilianming 0:66434fa5ef92 386 if (touch_num != 0) {
shilianming 0:66434fa5ef92 387 func_code_t func_code;
shilianming 0:66434fa5ef92 388
shilianming 0:66434fa5ef92 389 func_code = Scan_Key(animetion_timing_key_tbl, touch_pos[0].x, touch_pos[0].y);
shilianming 0:66434fa5ef92 390 if (func_code == RGA_FUNC_RETURN) {
shilianming 0:66434fa5ef92 391 break;
shilianming 0:66434fa5ef92 392 }
shilianming 0:66434fa5ef92 393 switch (func_code) {
shilianming 0:66434fa5ef92 394 case RGA_FUNC_ANIME_EASE:
shilianming 0:66434fa5ef92 395 animation_timing = 0;
shilianming 0:66434fa5ef92 396 acce_frame_num = 0;
shilianming 0:66434fa5ef92 397 break;
shilianming 0:66434fa5ef92 398 case RGA_FUNC_ANIME_LINEAR:
shilianming 0:66434fa5ef92 399 animation_timing = 1;
shilianming 0:66434fa5ef92 400 acce_frame_num = 0;
shilianming 0:66434fa5ef92 401 break;
shilianming 0:66434fa5ef92 402 case RGA_FUNC_ANIME_EASE_IN:
shilianming 0:66434fa5ef92 403 animation_timing = 2;
shilianming 0:66434fa5ef92 404 acce_frame_num = 0;
shilianming 0:66434fa5ef92 405 break;
shilianming 0:66434fa5ef92 406 case RGA_FUNC_ANIME_EASE_OUT:
shilianming 0:66434fa5ef92 407 animation_timing = 3;
shilianming 0:66434fa5ef92 408 acce_frame_num = 0;
shilianming 0:66434fa5ef92 409 break;
shilianming 0:66434fa5ef92 410 case RGA_FUNC_ANIME_EASE_IN_OUT:
shilianming 0:66434fa5ef92 411 animation_timing = 4;
shilianming 0:66434fa5ef92 412 acce_frame_num = 0;
shilianming 0:66434fa5ef92 413 break;
shilianming 0:66434fa5ef92 414 default:
shilianming 0:66434fa5ef92 415 /* Do Nothing */
shilianming 0:66434fa5ef92 416 break;
shilianming 0:66434fa5ef92 417 }
shilianming 0:66434fa5ef92 418 }
shilianming 0:66434fa5ef92 419 work_relative_pos = acce_frame_num / (float32_t)ACCELERATE_MAX_NUM;
shilianming 0:66434fa5ef92 420 acce_frame_num++;
shilianming 0:66434fa5ef92 421 if (acce_frame_num > ACCELERATE_MAX_NUM) {
shilianming 0:66434fa5ef92 422 acce_frame_num = 0;
shilianming 0:66434fa5ef92 423 }
shilianming 0:66434fa5ef92 424 /* Draw screen */
shilianming 0:66434fa5ef92 425 Swap_FrameBuffer(frmbuf_info);
shilianming 0:66434fa5ef92 426 RGA_Func_Accelerate(frmbuf_info, animation_timing, work_relative_pos);
shilianming 0:66434fa5ef92 427 Update_LCD_Display(frmbuf_info);
shilianming 0:66434fa5ef92 428 }
shilianming 0:66434fa5ef92 429 }
shilianming 0:66434fa5ef92 430 break;
shilianming 0:66434fa5ef92 431 default :
shilianming 0:66434fa5ef92 432 /* Do nothing */
shilianming 0:66434fa5ef92 433 break;
shilianming 0:66434fa5ef92 434 }
shilianming 0:66434fa5ef92 435 }
shilianming 0:66434fa5ef92 436
shilianming 0:66434fa5ef92 437 int main(void) {
shilianming 0:66434fa5ef92 438 func_code_t func_code;
shilianming 0:66434fa5ef92 439 uint8_t touch_num = 0;
shilianming 0:66434fa5ef92 440 TouchKey::touch_pos_t touch_pos[TOUCH_NUM];
shilianming 0:66434fa5ef92 441
shilianming 0:66434fa5ef92 442 /* Initialization of LCD */
shilianming 0:66434fa5ef92 443 Init_LCD_Display(); /* When using LCD, please call before than Init_Video(). */
shilianming 0:66434fa5ef92 444
shilianming 0:66434fa5ef92 445 memset(user_frame_buffer1, 0, sizeof(user_frame_buffer1));
shilianming 0:66434fa5ef92 446 memset(user_frame_buffer2, 0, sizeof(user_frame_buffer2));
shilianming 0:66434fa5ef92 447 frame_buffer_info.buffer_address[0] = user_frame_buffer1;
shilianming 0:66434fa5ef92 448 frame_buffer_info.buffer_address[1] = user_frame_buffer2;
shilianming 0:66434fa5ef92 449 frame_buffer_info.buffer_count = 2;
shilianming 0:66434fa5ef92 450 frame_buffer_info.show_buffer_index = 0;
shilianming 0:66434fa5ef92 451 frame_buffer_info.draw_buffer_index = 0;
shilianming 0:66434fa5ef92 452 frame_buffer_info.width = LCD_PIXEL_WIDTH;
shilianming 0:66434fa5ef92 453 frame_buffer_info.byte_per_pixel = FRAME_BUFFER_BYTE_PER_PIXEL;
shilianming 0:66434fa5ef92 454 frame_buffer_info.stride = LCD_PIXEL_WIDTH * FRAME_BUFFER_BYTE_PER_PIXEL;
shilianming 0:66434fa5ef92 455 frame_buffer_info.height = LCD_PIXEL_HEIGHT;
shilianming 0:66434fa5ef92 456 frame_buffer_info.pixel_format = PIXEL_FORMAT_RGB565;
shilianming 0:66434fa5ef92 457
shilianming 0:66434fa5ef92 458 /* Display Top Screen */
shilianming 0:66434fa5ef92 459 Set_RGAObject(&frame_buffer_info);
shilianming 0:66434fa5ef92 460 RGA_Func_DrawTopScreen(&frame_buffer_info);
shilianming 0:66434fa5ef92 461
shilianming 0:66434fa5ef92 462 /* Start of LCD */
shilianming 0:66434fa5ef92 463 Start_LCD_Display(frame_buffer_info.buffer_address[0]);
shilianming 0:66434fa5ef92 464
shilianming 0:66434fa5ef92 465 /* Backlight on */
shilianming 0:66434fa5ef92 466 Thread::wait(200);
shilianming 0:66434fa5ef92 467 lcd_cntrst.write(1.0);
shilianming 0:66434fa5ef92 468
shilianming 0:66434fa5ef92 469 /* Reset touch IC */
shilianming 0:66434fa5ef92 470 TouckKey_LCD_shield touch(P4_0, P2_13, I2C_SDA, I2C_SCL);
shilianming 0:66434fa5ef92 471 touch.Reset();
shilianming 0:66434fa5ef92 472
shilianming 0:66434fa5ef92 473 while (1) {
shilianming 0:66434fa5ef92 474 /* Get Coordinates */
shilianming 0:66434fa5ef92 475 touch_num = touch.GetCoordinates(TOUCH_NUM, touch_pos);
shilianming 0:66434fa5ef92 476 if (touch_num != 0) {
shilianming 0:66434fa5ef92 477 func_code = Scan_Key(top_screen_key_tbl, touch_pos[0].x, touch_pos[0].y);
shilianming 0:66434fa5ef92 478 if (func_code != RGA_FUNC_NON) {
shilianming 0:66434fa5ef92 479 /* Wait key off */
shilianming 0:66434fa5ef92 480 while (1) {
shilianming 0:66434fa5ef92 481 touch_num = touch.GetCoordinates(TOUCH_NUM, touch_pos);
shilianming 0:66434fa5ef92 482 if (touch_num == 0) {
shilianming 0:66434fa5ef92 483 break;
shilianming 0:66434fa5ef92 484 }
shilianming 0:66434fa5ef92 485 Thread::wait(20);
shilianming 0:66434fa5ef92 486 }
shilianming 0:66434fa5ef92 487
shilianming 0:66434fa5ef92 488 /* Execute RGA functions */
shilianming 0:66434fa5ef92 489 Exe_RGA_Func(func_code, &frame_buffer_info, &touch);
shilianming 0:66434fa5ef92 490
shilianming 0:66434fa5ef92 491 /* Return Top Screen */
shilianming 0:66434fa5ef92 492 Swap_FrameBuffer(&frame_buffer_info);
shilianming 0:66434fa5ef92 493 RGA_Func_DrawTopScreen(&frame_buffer_info);
shilianming 0:66434fa5ef92 494 Update_LCD_Display(&frame_buffer_info);
shilianming 0:66434fa5ef92 495 }
shilianming 0:66434fa5ef92 496 }
shilianming 0:66434fa5ef92 497 Thread::wait(20);
shilianming 0:66434fa5ef92 498 }
shilianming 0:66434fa5ef92 499 }