Plays MJPEG Video using the RGA. THe RGA allows resize of the JPEG file.

Dependencies:   GR-PEACH_video GraphicsFramework LCD_shield_config R_BSP SDBlockDevice_GR_PEACH TLV320_RBSP USBHost_custom

Fork of RGA_HelloWorld by Renesas

Overview

This demo shows how play a MJPEG and WAV file video using the RZA1 hardware RGA, JCU and SSIF. The JCU decodes each MJPEG frame. The SSIF plays the raw WAV file, and the RGA supplies the GUI and resize of the JPEG image.

MJPEG Creation

Requirements

Python Script

SD Card

  • Rename the jpg file to Renesas.jpg and audio file Renesas.wav
  • Download this image file and rename is Background.jpg /media/uploads/zkimike/background.jpg
Committer:
zkimike
Date:
Wed Jan 17 19:02:00 2018 +0000
Revision:
13:0a5bd13f6e7f
Parent:
12:9a413bec6673
Plays MJPEG Video on GR-PEACH

Who changed what in which revision?

UserRevisionLine numberNew contents of line
1050186 0:84e4649e7707 1 /*
1050186 0:84e4649e7707 2 Permission is hereby granted, free of charge, to any person obtaining a copy
1050186 0:84e4649e7707 3 of this software and associated documentation files (the "Software"), to deal
1050186 0:84e4649e7707 4 in the Software without restriction, including without limitation the rights
1050186 0:84e4649e7707 5 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
1050186 0:84e4649e7707 6 copies of the Software, and to permit persons to whom the Software is
1050186 0:84e4649e7707 7 furnished to do so, subject to the following conditions:
1050186 0:84e4649e7707 8
1050186 0:84e4649e7707 9 The above copyright notice and this permission notice shall be included in
1050186 0:84e4649e7707 10 all copies or substantial portions of the Software.
1050186 0:84e4649e7707 11
1050186 0:84e4649e7707 12 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1050186 0:84e4649e7707 13 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1050186 0:84e4649e7707 14 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
1050186 0:84e4649e7707 15 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1050186 0:84e4649e7707 16 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
1050186 0:84e4649e7707 17 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
1050186 0:84e4649e7707 18 THE SOFTWARE.
1050186 0:84e4649e7707 19 */
dkato 2:c7faef0ef374 20
1050186 0:84e4649e7707 21 #include "mbed.h"
1050186 0:84e4649e7707 22 #include "rga_func.h"
1050186 0:84e4649e7707 23 #include "DisplayBace.h"
1050186 0:84e4649e7707 24 #include "rtos.h"
zkimike 12:9a413bec6673 25 #include "TLV320_RBSP.h"
dkato 4:ce438477eddb 26 #include "LCD_shield_config_7_1inch.h"
zkimike 12:9a413bec6673 27 #include "FATFileSystem.h"
zkimike 12:9a413bec6673 28 #include "SDBlockDevice_GR_PEACH.h"
zkimike 12:9a413bec6673 29 #include "USBHostMSD.h"
zkimike 12:9a413bec6673 30 #include "dec_wav.h"
1050186 0:84e4649e7707 31
dkato 4:ce438477eddb 32 #define GRAPHICS_FORMAT (DisplayBase::GRAPHICS_FORMAT_RGB565)
dkato 4:ce438477eddb 33 #define WR_RD_WRSWA (DisplayBase::WR_RD_WRSWA_32_16BIT)
dkato 4:ce438477eddb 34 #define TOUCH_NUM (1u)
1050186 0:84e4649e7707 35
1050186 0:84e4649e7707 36 /* FRAME BUFFER Parameter */
dkato 2:c7faef0ef374 37 #define FRAME_BUFFER_BYTE_PER_PIXEL (2)
1050186 0:84e4649e7707 38 #define FRAME_BUFFER_STRIDE (((LCD_PIXEL_WIDTH * FRAME_BUFFER_BYTE_PER_PIXEL) + 31u) & ~31u)
1050186 0:84e4649e7707 39
dkato 2:c7faef0ef374 40 #define DRAW_RECTANGLE_CNT_MAX (4)
dkato 2:c7faef0ef374 41
zkimike 12:9a413bec6673 42 #define FILE_NAME_LEN (64)
zkimike 12:9a413bec6673 43 #define FLD_PATH "/usb/"
zkimike 12:9a413bec6673 44 #define TEXT_SIZE (64 + 1) //null-terminated
zkimike 12:9a413bec6673 45
zkimike 12:9a413bec6673 46 #define MJPEG_DIV 2
zkimike 12:9a413bec6673 47 #define AUDIO_WRITE_BUFF_SIZE (7056 * MJPEG_DIV)
zkimike 12:9a413bec6673 48 #define AUDIO_WRITE_BUFF_NUM (9)
zkimike 12:9a413bec6673 49
zkimike 12:9a413bec6673 50 // Testing
zkimike 12:9a413bec6673 51 DigitalOut TestPin0(D0); // Video File Read
zkimike 12:9a413bec6673 52 DigitalOut TestPin1(D1); // Audio File Read
zkimike 12:9a413bec6673 53 DigitalOut TestPin2(D6); // Update Display
zkimike 12:9a413bec6673 54 DigitalOut TestPin3(D7); // Sync
zkimike 12:9a413bec6673 55
1050186 0:84e4649e7707 56 typedef enum {
dkato 2:c7faef0ef374 57 RGA_FUNC_NON,
dkato 2:c7faef0ef374 58 RGA_FUNC_DRAW_RECTANGLE,
1050186 0:84e4649e7707 59 RGA_FUNC_DRAW_IMAGE,
zkimike 12:9a413bec6673 60 RGA_FUNC_VIDEO_PLAYER,
zkimike 12:9a413bec6673 61 RGA_FUNC_VIDEO_PLAY,
zkimike 12:9a413bec6673 62 RGA_FUNC_VIDEO_STOP,
zkimike 12:9a413bec6673 63 RGA_FUNC_VIDEO_FWD,
zkimike 12:9a413bec6673 64 RGA_FUNC_VIDEO_REV,
1050186 0:84e4649e7707 65 RGA_FUNC_DISSOLVE,
1050186 0:84e4649e7707 66 RGA_FUNC_SCROLL,
1050186 0:84e4649e7707 67 RGA_FUNC_ZOOM,
1050186 0:84e4649e7707 68 RGA_FUNC_ROTATION,
1050186 0:84e4649e7707 69 RGA_FUNC_ACCELERATE,
dkato 2:c7faef0ef374 70 RGA_FUNC_ANIME_EASE,
dkato 2:c7faef0ef374 71 RGA_FUNC_ANIME_LINEAR,
dkato 2:c7faef0ef374 72 RGA_FUNC_ANIME_EASE_IN,
dkato 2:c7faef0ef374 73 RGA_FUNC_ANIME_EASE_OUT,
dkato 2:c7faef0ef374 74 RGA_FUNC_ANIME_EASE_IN_OUT,
dkato 2:c7faef0ef374 75 RGA_FUNC_RETURN,
dkato 2:c7faef0ef374 76 RGA_FUNC_END
dkato 4:ce438477eddb 77 } func_code_t;
1050186 0:84e4649e7707 78
1050186 0:84e4649e7707 79 DigitalOut lcd_pwon(P7_15);
1050186 0:84e4649e7707 80 DigitalOut lcd_blon(P8_1);
1050186 0:84e4649e7707 81 PwmOut lcd_cntrst(P8_15);
1050186 0:84e4649e7707 82 DisplayBase Display;
1050186 0:84e4649e7707 83
1050186 0:84e4649e7707 84 typedef struct {
1050186 0:84e4649e7707 85 uint32_t pic_pos_x; /* X position of the key picture. */
1050186 0:84e4649e7707 86 uint32_t pic_pos_y; /* Y position of the key picture. */
1050186 0:84e4649e7707 87 uint32_t pic_width; /* Width of the key picture. */
1050186 0:84e4649e7707 88 uint32_t pic_height; /* Height of the key picture. */
1050186 0:84e4649e7707 89 func_code_t func_code; /* func code of the key picture. */
1050186 0:84e4649e7707 90 } key_pic_info_t;
1050186 0:84e4649e7707 91
dkato 4:ce438477eddb 92 #if defined(__ICCARM__)
dkato 4:ce438477eddb 93 #pragma data_alignment=32
dkato 4:ce438477eddb 94 static uint8_t user_frame_buffer1[FRAME_BUFFER_STRIDE * LCD_PIXEL_HEIGHT];
1050186 7:8fd684e60d66 95 #pragma data_alignment=32
dkato 4:ce438477eddb 96 static uint8_t user_frame_buffer2[FRAME_BUFFER_STRIDE * LCD_PIXEL_HEIGHT];
dkato 4:ce438477eddb 97 #else
dkato 4:ce438477eddb 98 static uint8_t user_frame_buffer1[FRAME_BUFFER_STRIDE * LCD_PIXEL_HEIGHT]__attribute((aligned(32))); /* 32 bytes aligned */
dkato 2:c7faef0ef374 99 static uint8_t user_frame_buffer2[FRAME_BUFFER_STRIDE * LCD_PIXEL_HEIGHT]__attribute((aligned(32))); /* 32 bytes aligned */
zkimike 12:9a413bec6673 100 static uint8_t jpeg_frame_buffer1[FRAME_BUFFER_STRIDE * LCD_PIXEL_HEIGHT]__attribute((aligned(32))); /* 32 bytes aligned */
zkimike 12:9a413bec6673 101 static uint8_t jpeg_frame_buffer2[FRAME_BUFFER_STRIDE * LCD_PIXEL_HEIGHT]__attribute((aligned(32))); /* 32 bytes aligned */
zkimike 12:9a413bec6673 102 static uint8_t audio_write_buff[AUDIO_WRITE_BUFF_NUM][AUDIO_WRITE_BUFF_SIZE] __attribute((section("NC_BSS"),aligned(4)));
dkato 4:ce438477eddb 103 #endif
1050186 0:84e4649e7707 104 static frame_buffer_t frame_buffer_info;
1050186 0:84e4649e7707 105 static volatile int32_t vsync_count = 0;
1050186 0:84e4649e7707 106
zkimike 12:9a413bec6673 107 // Audio Tag buffers
zkimike 12:9a413bec6673 108 static uint8_t title_buf[TEXT_SIZE];
zkimike 12:9a413bec6673 109 static uint8_t artist_buf[TEXT_SIZE];
zkimike 12:9a413bec6673 110 static uint8_t album_buf[TEXT_SIZE];
zkimike 12:9a413bec6673 111
dkato 2:c7faef0ef374 112 static const key_pic_info_t top_screen_key_tbl[] = {
dkato 2:c7faef0ef374 113 /* X Y Width Height Func code */
dkato 2:c7faef0ef374 114 { 50, 350, 120, 52, RGA_FUNC_DRAW_RECTANGLE }, /* RGA Func1 */
zkimike 12:9a413bec6673 115 { 230, 350, 120, 52, RGA_FUNC_VIDEO_PLAYER }, /* RGA Func2 */
dkato 2:c7faef0ef374 116 { 410, 350, 120, 52, RGA_FUNC_DISSOLVE }, /* RGA Func3 */
dkato 2:c7faef0ef374 117 { 50, 420, 120, 52, RGA_FUNC_SCROLL }, /* RGA Func4 */
dkato 2:c7faef0ef374 118 { 230, 420, 120, 52, RGA_FUNC_ZOOM }, /* RGA Func5 */
dkato 2:c7faef0ef374 119 { 410, 420, 120, 52, RGA_FUNC_ROTATION }, /* RGA Func6 */
dkato 2:c7faef0ef374 120 { 615, 420, 120, 52, RGA_FUNC_ACCELERATE }, /* RGA Func7 */
dkato 2:c7faef0ef374 121 { 0, 0, 0, 0, RGA_FUNC_END } /* table end */
dkato 2:c7faef0ef374 122 };
dkato 2:c7faef0ef374 123
dkato 2:c7faef0ef374 124 static const key_pic_info_t return_key_tbl[] = {
dkato 2:c7faef0ef374 125 /* X Y Width Height Func code */
dkato 2:c7faef0ef374 126 { 640, 10, 150, 84, RGA_FUNC_RETURN }, /* Return Top Screen */
dkato 2:c7faef0ef374 127 { 0, 0, 0, 0, RGA_FUNC_END } /* table end */
dkato 2:c7faef0ef374 128 };
dkato 2:c7faef0ef374 129
dkato 2:c7faef0ef374 130 static const key_pic_info_t animetion_timing_key_tbl[] = {
dkato 2:c7faef0ef374 131 /* X Y Width Height Func code */
dkato 2:c7faef0ef374 132 { 640, 10, 150, 84, RGA_FUNC_RETURN }, /* Return Top Screen */
dkato 2:c7faef0ef374 133 { 17, 372, 136, 50, RGA_FUNC_ANIME_EASE }, /* ease */
dkato 2:c7faef0ef374 134 { 173, 372, 136, 50, RGA_FUNC_ANIME_LINEAR }, /* linear */
dkato 2:c7faef0ef374 135 { 330, 372, 136, 50, RGA_FUNC_ANIME_EASE_IN }, /* ease-in */
dkato 2:c7faef0ef374 136 { 487, 372, 136, 50, RGA_FUNC_ANIME_EASE_OUT }, /* ease-out */
dkato 2:c7faef0ef374 137 { 644, 372, 136, 50, RGA_FUNC_ANIME_EASE_IN_OUT }, /* ease-in-out */
dkato 2:c7faef0ef374 138 { 0, 0, 0, 0, RGA_FUNC_END } /* table end */
1050186 0:84e4649e7707 139 };
1050186 0:84e4649e7707 140
zkimike 12:9a413bec6673 141 static const key_pic_info_t video_screen_key_tbl[] = {
zkimike 12:9a413bec6673 142 /* X Y Width Height Func code */
zkimike 12:9a413bec6673 143 { 640, 10, 150, 84, RGA_FUNC_RETURN }, /* Return Top Screen */
zkimike 12:9a413bec6673 144 { 545, 55, 192, 64, RGA_FUNC_VIDEO_PLAY }, /* Video Play */
zkimike 12:9a413bec6673 145 { 545, 138, 192, 64, RGA_FUNC_VIDEO_STOP }, /* Video Stop */
zkimike 12:9a413bec6673 146 { 654, 241, 89, 60, RGA_FUNC_VIDEO_FWD }, /* Video Forward */
zkimike 12:9a413bec6673 147 { 545, 241, 89, 60, RGA_FUNC_VIDEO_REV } /* Video Reverse */
zkimike 12:9a413bec6673 148 };
zkimike 12:9a413bec6673 149 TLV320_RBSP audio(P10_13, I2C_SDA, I2C_SCL, P4_4, P4_5, P4_7, P4_6,
zkimike 12:9a413bec6673 150 0x80, (AUDIO_WRITE_BUFF_NUM - 1), 0);
zkimike 12:9a413bec6673 151
dkato 4:ce438477eddb 152 /****** LCD ******/
dkato 4:ce438477eddb 153 static void IntCallbackFunc_LoVsync(DisplayBase::int_type_t int_type) {
1050186 0:84e4649e7707 154 /* Interrupt callback function for Vsync interruption */
1050186 0:84e4649e7707 155 if (vsync_count > 0) {
1050186 0:84e4649e7707 156 vsync_count--;
1050186 0:84e4649e7707 157 }
1050186 0:84e4649e7707 158 }
1050186 0:84e4649e7707 159
1050186 0:84e4649e7707 160 static void Wait_Vsync(const int32_t wait_count) {
1050186 0:84e4649e7707 161 /* Wait for the specified number of times Vsync occurs */
1050186 0:84e4649e7707 162 vsync_count = wait_count;
1050186 0:84e4649e7707 163 while (vsync_count > 0) {
1050186 0:84e4649e7707 164 /* Do nothing */
1050186 0:84e4649e7707 165 }
1050186 0:84e4649e7707 166 }
1050186 0:84e4649e7707 167
dkato 4:ce438477eddb 168 static void Init_LCD_Display(void) {
1050186 0:84e4649e7707 169 DisplayBase::graphics_error_t error;
1050186 0:84e4649e7707 170 DisplayBase::lcd_config_t lcd_config;
1050186 0:84e4649e7707 171 PinName lvds_pin[8] = {
1050186 0:84e4649e7707 172 /* data pin */
1050186 0:84e4649e7707 173 P5_7, P5_6, P5_5, P5_4, P5_3, P5_2, P5_1, P5_0
1050186 0:84e4649e7707 174 };
1050186 0:84e4649e7707 175
1050186 0:84e4649e7707 176 lcd_pwon = 0;
1050186 0:84e4649e7707 177 lcd_blon = 0;
1050186 0:84e4649e7707 178 Thread::wait(100);
1050186 0:84e4649e7707 179 lcd_pwon = 1;
1050186 0:84e4649e7707 180 lcd_blon = 1;
1050186 0:84e4649e7707 181
dkato 4:ce438477eddb 182 Display.Graphics_Lvds_Port_Init(lvds_pin, 8);
1050186 0:84e4649e7707 183
1050186 0:84e4649e7707 184 /* Graphics initialization process */
dkato 4:ce438477eddb 185 lcd_config = LcdCfgTbl_LCD_shield;
1050186 0:84e4649e7707 186 error = Display.Graphics_init(&lcd_config);
1050186 0:84e4649e7707 187 if (error != DisplayBase::GRAPHICS_OK) {
1050186 0:84e4649e7707 188 printf("Line %d, error %d\n", __LINE__, error);
dkato 4:ce438477eddb 189 mbed_die();
1050186 0:84e4649e7707 190 }
1050186 0:84e4649e7707 191
1050186 0:84e4649e7707 192 /* Interrupt callback function setting (Vsync signal output from scaler 0) */
dkato 4:ce438477eddb 193 error = Display.Graphics_Irq_Handler_Set(DisplayBase::INT_TYPE_S0_LO_VSYNC, 0, IntCallbackFunc_LoVsync);
1050186 0:84e4649e7707 194 if (error != DisplayBase::GRAPHICS_OK) {
1050186 0:84e4649e7707 195 printf("Line %d, error %d\n", __LINE__, error);
dkato 4:ce438477eddb 196 mbed_die();
1050186 0:84e4649e7707 197 }
dkato 4:ce438477eddb 198 }
1050186 0:84e4649e7707 199
dkato 4:ce438477eddb 200 static void Start_LCD_Display(uint8_t * p_buf) {
dkato 4:ce438477eddb 201 DisplayBase::rect_t rect;
dkato 4:ce438477eddb 202
1050186 0:84e4649e7707 203 rect.vs = 0;
1050186 0:84e4649e7707 204 rect.vw = LCD_PIXEL_HEIGHT;
1050186 0:84e4649e7707 205 rect.hs = 0;
1050186 0:84e4649e7707 206 rect.hw = LCD_PIXEL_WIDTH;
1050186 0:84e4649e7707 207 Display.Graphics_Read_Setting(
1050186 0:84e4649e7707 208 DisplayBase::GRAPHICS_LAYER_0,
dkato 4:ce438477eddb 209 (void *)p_buf,
1050186 0:84e4649e7707 210 FRAME_BUFFER_STRIDE,
dkato 4:ce438477eddb 211 GRAPHICS_FORMAT,
dkato 4:ce438477eddb 212 WR_RD_WRSWA,
1050186 0:84e4649e7707 213 &rect
1050186 0:84e4649e7707 214 );
1050186 0:84e4649e7707 215 Display.Graphics_Start(DisplayBase::GRAPHICS_LAYER_0);
1050186 0:84e4649e7707 216 }
1050186 0:84e4649e7707 217
dkato 2:c7faef0ef374 218 static void Update_LCD_Display(frame_buffer_t * frmbuf_info) {
dkato 2:c7faef0ef374 219 Display.Graphics_Read_Change(DisplayBase::GRAPHICS_LAYER_0,
dkato 2:c7faef0ef374 220 (void *)frmbuf_info->buffer_address[frmbuf_info->draw_buffer_index]);
1050186 0:84e4649e7707 221 Wait_Vsync(1);
1050186 0:84e4649e7707 222 }
1050186 0:84e4649e7707 223
dkato 4:ce438477eddb 224 static void Swap_FrameBuffer(frame_buffer_t * frmbuf_info) {
dkato 4:ce438477eddb 225 if (frmbuf_info->draw_buffer_index == 1) {
dkato 4:ce438477eddb 226 frmbuf_info->draw_buffer_index = 0;
dkato 4:ce438477eddb 227 } else {
dkato 4:ce438477eddb 228 frmbuf_info->draw_buffer_index = 1;
1050186 0:84e4649e7707 229 }
1050186 0:84e4649e7707 230 }
zkimike 12:9a413bec6673 231 /****** Audio ******/
zkimike 12:9a413bec6673 232 static void callback_audio_write_end(void * p_data, int32_t result, void * p_app_data) {
zkimike 12:9a413bec6673 233 if (result < 0) {
zkimike 12:9a413bec6673 234 printf("audio write callback error %d\n", result);
zkimike 12:9a413bec6673 235 }
zkimike 12:9a413bec6673 236 }
1050186 0:84e4649e7707 237
dkato 4:ce438477eddb 238 /****** Touch ******/
dkato 2:c7faef0ef374 239 static func_code_t Scan_Key(const key_pic_info_t * key_tbl, const uint32_t pos_x, const uint32_t pos_y) {
1050186 0:84e4649e7707 240 func_code_t ret = RGA_FUNC_NON;
1050186 0:84e4649e7707 241
dkato 2:c7faef0ef374 242 while (ret == RGA_FUNC_NON) {
dkato 2:c7faef0ef374 243 if (key_tbl->func_code == RGA_FUNC_END) {
dkato 2:c7faef0ef374 244 break;
dkato 2:c7faef0ef374 245 }
1050186 0:84e4649e7707 246 /* Check the range of the X position */
dkato 2:c7faef0ef374 247 if ((pos_x >= key_tbl->pic_pos_x) && (pos_x <= (key_tbl->pic_pos_x + key_tbl->pic_width))) {
1050186 0:84e4649e7707 248 /* Check the range of the Y position */
dkato 2:c7faef0ef374 249 if ((pos_y >= key_tbl->pic_pos_y) && (pos_y <= (key_tbl->pic_pos_y + key_tbl->pic_height))) {
1050186 0:84e4649e7707 250 /* Decide the func code. */
dkato 2:c7faef0ef374 251 ret = key_tbl->func_code;
1050186 0:84e4649e7707 252 }
1050186 0:84e4649e7707 253 }
dkato 2:c7faef0ef374 254 key_tbl++;
1050186 0:84e4649e7707 255 }
1050186 0:84e4649e7707 256
1050186 0:84e4649e7707 257 return ret;
1050186 0:84e4649e7707 258 }
1050186 0:84e4649e7707 259
dkato 4:ce438477eddb 260 /****** Efect ******/
dkato 4:ce438477eddb 261 static void Exe_RGA_Func(func_code_t func_name, frame_buffer_t* frmbuf_info, TouckKey_LCD_shield * p_touch) {
dkato 2:c7faef0ef374 262 uint8_t touch_num = 0;
dkato 4:ce438477eddb 263 TouchKey::touch_pos_t touch_pos[TOUCH_NUM];
1050186 0:84e4649e7707 264
1050186 0:84e4649e7707 265 switch (func_name) {
1050186 0:84e4649e7707 266 case RGA_FUNC_DRAW_RECTANGLE:
1050186 6:6a8ce6f7767b 267 {
dkato 2:c7faef0ef374 268 bool key_on = false;
dkato 2:c7faef0ef374 269 int cnt;
dkato 2:c7faef0ef374 270 int color_cnt = 0;
dkato 2:c7faef0ef374 271 int x_0 = 0;
dkato 2:c7faef0ef374 272 int y_0 = 0;
dkato 2:c7faef0ef374 273 draw_rectangle_pos_t pos_tbl[DRAW_RECTANGLE_CNT_MAX] = {0};
dkato 2:c7faef0ef374 274
dkato 2:c7faef0ef374 275 pos_tbl[0].style = "#FF0000"; /* red */
dkato 2:c7faef0ef374 276 pos_tbl[1].style = "#00FF00"; /* green */
dkato 2:c7faef0ef374 277 pos_tbl[2].style = "#0000FF"; /* blue */
dkato 2:c7faef0ef374 278 pos_tbl[3].style = "#000000"; /* black */
dkato 2:c7faef0ef374 279
dkato 2:c7faef0ef374 280 while (1) {
dkato 2:c7faef0ef374 281 /* Get coordinates */
dkato 4:ce438477eddb 282 touch_num = p_touch->GetCoordinates(TOUCH_NUM, touch_pos);
dkato 2:c7faef0ef374 283 if (touch_num != 0) {
dkato 4:ce438477eddb 284 if (Scan_Key(return_key_tbl, touch_pos[0].x, touch_pos[0].y) == RGA_FUNC_RETURN) {
dkato 2:c7faef0ef374 285 break;
dkato 2:c7faef0ef374 286 }
dkato 2:c7faef0ef374 287 if (key_on == false) {
dkato 2:c7faef0ef374 288 key_on = true;
dkato 2:c7faef0ef374 289 if (color_cnt == 0) {
dkato 2:c7faef0ef374 290 for (cnt = 0; cnt < DRAW_RECTANGLE_CNT_MAX; cnt++) {
dkato 2:c7faef0ef374 291 pos_tbl[cnt].x = 0;
dkato 2:c7faef0ef374 292 pos_tbl[cnt].y = 0;
dkato 2:c7faef0ef374 293 pos_tbl[cnt].w = 0;
dkato 2:c7faef0ef374 294 pos_tbl[cnt].h = 0;
dkato 2:c7faef0ef374 295 }
dkato 2:c7faef0ef374 296 }
dkato 4:ce438477eddb 297 x_0 = touch_pos[0].x;
dkato 4:ce438477eddb 298 y_0 = touch_pos[0].y;
dkato 2:c7faef0ef374 299 }
dkato 4:ce438477eddb 300 if (x_0 < touch_pos[0].x) {
dkato 2:c7faef0ef374 301 pos_tbl[color_cnt].x = x_0;
dkato 4:ce438477eddb 302 pos_tbl[color_cnt].w = touch_pos[0].x - x_0;
dkato 2:c7faef0ef374 303 } else {
dkato 4:ce438477eddb 304 pos_tbl[color_cnt].x = touch_pos[0].x;
dkato 4:ce438477eddb 305 pos_tbl[color_cnt].w = x_0 - touch_pos[0].x;
dkato 2:c7faef0ef374 306 }
dkato 4:ce438477eddb 307 if (y_0 < touch_pos[0].y) {
dkato 2:c7faef0ef374 308 pos_tbl[color_cnt].y = y_0;
dkato 4:ce438477eddb 309 pos_tbl[color_cnt].h = touch_pos[0].y - y_0;
dkato 2:c7faef0ef374 310 } else {
dkato 4:ce438477eddb 311 pos_tbl[color_cnt].y = touch_pos[0].y;
dkato 4:ce438477eddb 312 pos_tbl[color_cnt].h = y_0 - touch_pos[0].y;
dkato 2:c7faef0ef374 313 }
dkato 2:c7faef0ef374 314 } else {
dkato 2:c7faef0ef374 315 if (key_on != false) {
dkato 2:c7faef0ef374 316 color_cnt++;
dkato 2:c7faef0ef374 317 if (color_cnt == DRAW_RECTANGLE_CNT_MAX) {
dkato 2:c7faef0ef374 318 color_cnt = 0;
dkato 2:c7faef0ef374 319 }
dkato 2:c7faef0ef374 320 }
dkato 2:c7faef0ef374 321 key_on = false;
dkato 2:c7faef0ef374 322 }
dkato 2:c7faef0ef374 323 /* Draw screen */
dkato 2:c7faef0ef374 324 Swap_FrameBuffer(frmbuf_info);
dkato 2:c7faef0ef374 325 RGA_Func_DrawRectangle(frmbuf_info, pos_tbl, DRAW_RECTANGLE_CNT_MAX);
dkato 2:c7faef0ef374 326 Update_LCD_Display(frmbuf_info);
dkato 2:c7faef0ef374 327 }
1050186 6:6a8ce6f7767b 328 }
1050186 6:6a8ce6f7767b 329 break;
1050186 0:84e4649e7707 330 case RGA_FUNC_DRAW_IMAGE:
1050186 6:6a8ce6f7767b 331 {
dkato 2:c7faef0ef374 332 int center_pos_x = 320;
dkato 2:c7faef0ef374 333 int center_pos_y = 110;
dkato 2:c7faef0ef374 334 while (1) {
dkato 2:c7faef0ef374 335 /* Get coordinates */
dkato 4:ce438477eddb 336 touch_num = p_touch->GetCoordinates(TOUCH_NUM, touch_pos);
dkato 2:c7faef0ef374 337 if (touch_num != 0) {
dkato 4:ce438477eddb 338 if (Scan_Key(return_key_tbl, touch_pos[0].x, touch_pos[0].y) == RGA_FUNC_RETURN) {
dkato 2:c7faef0ef374 339 break;
dkato 2:c7faef0ef374 340 }
dkato 4:ce438477eddb 341 center_pos_x = touch_pos[0].x;
dkato 4:ce438477eddb 342 center_pos_y = touch_pos[0].y;
dkato 2:c7faef0ef374 343 }
dkato 2:c7faef0ef374 344 /* Draw screen */
dkato 2:c7faef0ef374 345 Swap_FrameBuffer(frmbuf_info);
dkato 2:c7faef0ef374 346 RGA_Func_DrawImage(frmbuf_info, center_pos_x, center_pos_y);
dkato 2:c7faef0ef374 347 Update_LCD_Display(frmbuf_info);
dkato 2:c7faef0ef374 348 }
1050186 6:6a8ce6f7767b 349 }
1050186 6:6a8ce6f7767b 350 break;
zkimike 12:9a413bec6673 351 case RGA_FUNC_VIDEO_PLAYER:
zkimike 12:9a413bec6673 352 {
zkimike 12:9a413bec6673 353 // FileSystem
zkimike 12:9a413bec6673 354 FILE * vfp = NULL;
zkimike 12:9a413bec6673 355 FILE * afp = NULL;
zkimike 12:9a413bec6673 356 DIR * d = NULL;
zkimike 12:9a413bec6673 357 char file_path[sizeof(FLD_PATH) + FILE_NAME_LEN];
zkimike 12:9a413bec6673 358 uint16_t read_bytes = 0;
zkimike 12:9a413bec6673 359 dec_wav wav_file;
zkimike 12:9a413bec6673 360
zkimike 12:9a413bec6673 361 // Video File
zkimike 12:9a413bec6673 362 int framesize = 0;
zkimike 12:9a413bec6673 363 float framerate = 0.0;
zkimike 12:9a413bec6673 364 uint8_t frame_skip = 2;
zkimike 12:9a413bec6673 365
zkimike 12:9a413bec6673 366 // Audio File
zkimike 12:9a413bec6673 367 uint16_t buff_index = 0;
zkimike 12:9a413bec6673 368 uint8_t * p_buf = NULL;
zkimike 12:9a413bec6673 369 size_t audio_data_size;
zkimike 12:9a413bec6673 370 rbsp_data_conf_t audio_write_async_ctl = {&callback_audio_write_end, NULL};
zkimike 12:9a413bec6673 371
zkimike 12:9a413bec6673 372 // Sync
zkimike 12:9a413bec6673 373 uint32_t frame_period_ms = 0;
zkimike 12:9a413bec6673 374 uint32_t audio_sample_size = 0;
zkimike 12:9a413bec6673 375 Timer timer;
zkimike 12:9a413bec6673 376
zkimike 13:0a5bd13f6e7f 377 // Control
zkimike 13:0a5bd13f6e7f 378 bool audio_off = false;
zkimike 13:0a5bd13f6e7f 379 bool video_off = false;
zkimike 13:0a5bd13f6e7f 380 int8_t audio_skip = 0;
zkimike 13:0a5bd13f6e7f 381
zkimike 12:9a413bec6673 382 /*******************************************************************
zkimike 12:9a413bec6673 383 * Initialize SDHC FileSystem
zkimike 12:9a413bec6673 384 *******************************************************************/
zkimike 12:9a413bec6673 385 FATFileSystem fs("usb");
zkimike 12:9a413bec6673 386 SDBlockDevice_GR_PEACH msd;
zkimike 12:9a413bec6673 387
zkimike 12:9a413bec6673 388 printf("GR-PEACH SDHC MSD\n");
zkimike 12:9a413bec6673 389
zkimike 12:9a413bec6673 390 while(!msd.connect()) {
zkimike 12:9a413bec6673 391 Thread::wait(500);
zkimike 12:9a413bec6673 392 }
zkimike 12:9a413bec6673 393 // Now that the MSD device is connected, file system is mounted.
zkimike 12:9a413bec6673 394 fs.mount(&msd);
zkimike 12:9a413bec6673 395
zkimike 12:9a413bec6673 396 /*******************************************************************
zkimike 12:9a413bec6673 397 * Initialize Audio
zkimike 12:9a413bec6673 398 *******************************************************************/
zkimike 12:9a413bec6673 399 audio.power(0x02); // mic off
zkimike 12:9a413bec6673 400 audio.inputVolume(0.7, 0.7);
zkimike 12:9a413bec6673 401
zkimike 12:9a413bec6673 402 /*******************************************************************
zkimike 12:9a413bec6673 403 * Read background
zkimike 12:9a413bec6673 404 *******************************************************************/
zkimike 12:9a413bec6673 405 strcpy(file_path, FLD_PATH);
zkimike 12:9a413bec6673 406 strcat(file_path, "Background.jpg");
zkimike 12:9a413bec6673 407 printf("File Open: %s\n", file_path);
zkimike 12:9a413bec6673 408 vfp = fopen(file_path, "r");
zkimike 12:9a413bec6673 409 read_bytes = fread(&jpeg_frame_buffer1[0], sizeof(char), 114419, vfp);
zkimike 12:9a413bec6673 410 fclose(vfp);
zkimike 12:9a413bec6673 411
zkimike 12:9a413bec6673 412 /*******************************************************************
zkimike 12:9a413bec6673 413 * Open Video File
zkimike 12:9a413bec6673 414 *******************************************************************/
zkimike 12:9a413bec6673 415 strcpy(file_path, FLD_PATH);
zkimike 12:9a413bec6673 416 strcat(file_path, "Renesas.jpg");
zkimike 12:9a413bec6673 417 vfp = fopen(file_path, "r");
zkimike 12:9a413bec6673 418 fread ( &framerate, sizeof(char), 4, vfp);
zkimike 12:9a413bec6673 419 printf( "Video FrameRate : %f\n", framerate );
zkimike 12:9a413bec6673 420 fread ( &framesize, sizeof(char), 4, vfp);
zkimike 12:9a413bec6673 421 fread ( jpeg_frame_buffer2, sizeof(char), framesize, vfp);
zkimike 12:9a413bec6673 422
zkimike 12:9a413bec6673 423 /*******************************************************************
zkimike 12:9a413bec6673 424 * Open and Anylize WAV file
zkimike 12:9a413bec6673 425 *******************************************************************/
zkimike 12:9a413bec6673 426 strcpy(file_path, FLD_PATH);
zkimike 12:9a413bec6673 427 strcat(file_path, "Renesas.wav");
zkimike 12:9a413bec6673 428 afp = fopen(file_path, "r");
zkimike 12:9a413bec6673 429 wav_file.AnalyzeHeder(title_buf, artist_buf, album_buf, TEXT_SIZE, afp);
zkimike 12:9a413bec6673 430 if ( false == audio.format(wav_file.GetBlockSize()) ) {
zkimike 12:9a413bec6673 431 printf( "Audio ERROR Setting format : %d\n", wav_file.GetBlockSize());
zkimike 12:9a413bec6673 432 break;
zkimike 12:9a413bec6673 433 }
zkimike 12:9a413bec6673 434 if ( false == audio.frequency(wav_file.GetSamplingRate()) ) {
zkimike 12:9a413bec6673 435 printf( "Audio ERROR Setting frequency : f%Hz\n", wav_file.GetSamplingRate());
zkimike 12:9a413bec6673 436 break;
zkimike 12:9a413bec6673 437 }
zkimike 12:9a413bec6673 438 /*******************************************************************
zkimike 12:9a413bec6673 439 * Initialize Sync
zkimike 12:9a413bec6673 440 *******************************************************************/
zkimike 12:9a413bec6673 441 frame_period_ms = (int)((1/framerate) * 1000);
zkimike 12:9a413bec6673 442 printf( "Audio Frame Lenght : %dms\n", frame_period_ms);
zkimike 12:9a413bec6673 443 frame_period_ms = frame_period_ms * MJPEG_DIV;
zkimike 12:9a413bec6673 444 printf( "Video Frame Lenght : %dms\n", frame_period_ms);
zkimike 12:9a413bec6673 445 audio_sample_size = (int)((wav_file.GetSamplingRate() * wav_file.GetChannel()
zkimike 12:9a413bec6673 446 * (wav_file.GetBlockSize()/8)) / ( framerate )) * MJPEG_DIV;
zkimike 12:9a413bec6673 447 frame_skip = MJPEG_DIV-1;
zkimike 12:9a413bec6673 448
zkimike 12:9a413bec6673 449 TestPin0 = 0;
zkimike 12:9a413bec6673 450 TestPin1 = 0;
zkimike 12:9a413bec6673 451 TestPin2 = 0;
zkimike 12:9a413bec6673 452 TestPin3 = 0;
zkimike 12:9a413bec6673 453 timer.reset();
zkimike 13:0a5bd13f6e7f 454
zkimike 12:9a413bec6673 455 while (1) {
zkimike 13:0a5bd13f6e7f 456
zkimike 13:0a5bd13f6e7f 457 switch ( video_mode ) {
zkimike 13:0a5bd13f6e7f 458 case RGA_FUNC_VIDEO_STOP:
zkimike 13:0a5bd13f6e7f 459 audio_skip = 0;
zkimike 13:0a5bd13f6e7f 460 audio_off = true;
zkimike 13:0a5bd13f6e7f 461 frame_skip = MJPEG_DIV-1;
zkimike 13:0a5bd13f6e7f 462 video_off = true;
zkimike 13:0a5bd13f6e7f 463 case RGA_FUNC_VIDEO_FWD:
zkimike 13:0a5bd13f6e7f 464 audio_skip = 4/MJPEG_DIV;
zkimike 13:0a5bd13f6e7f 465 audio_off = true;
zkimike 13:0a5bd13f6e7f 466 frame_skip += 4;
zkimike 13:0a5bd13f6e7f 467 video_off = false;
zkimike 13:0a5bd13f6e7f 468 break;
zkimike 13:0a5bd13f6e7f 469 case RGA_FUNC_VIDEO_REV:
zkimike 13:0a5bd13f6e7f 470 // TODO
zkimike 13:0a5bd13f6e7f 471 break;
zkimike 13:0a5bd13f6e7f 472 case RGA_FUNC_VIDEO_PLAY:
zkimike 13:0a5bd13f6e7f 473 audio_skip = 0;
zkimike 13:0a5bd13f6e7f 474 audio_off = false;
zkimike 13:0a5bd13f6e7f 475 frame_skip = MJPEG_DIV-1;
zkimike 13:0a5bd13f6e7f 476 video_off = false;
zkimike 13:0a5bd13f6e7f 477 default :
zkimike 13:0a5bd13f6e7f 478 }
zkimike 12:9a413bec6673 479 timer.start();
zkimike 12:9a413bec6673 480
zkimike 12:9a413bec6673 481 // if device disconnected, try to connect again
zkimike 12:9a413bec6673 482 if (!msd.connected()) {
zkimike 12:9a413bec6673 483 break;
zkimike 12:9a413bec6673 484 }
zkimike 12:9a413bec6673 485
zkimike 12:9a413bec6673 486 // Read Next Video Frame
zkimike 12:9a413bec6673 487 TestPin0 = 1;
zkimike 13:0a5bd13f6e7f 488 if ( video_off != true ) {
zkimike 13:0a5bd13f6e7f 489 for ( int i = 0; i < frame_skip; i++ ) {
zkimike 13:0a5bd13f6e7f 490 fread ( &framesize, sizeof(char), 4, vfp);
zkimike 13:0a5bd13f6e7f 491 fseek ( vfp, framesize, SEEK_CUR);
zkimike 13:0a5bd13f6e7f 492 }
zkimike 12:9a413bec6673 493 fread ( &framesize, sizeof(char), 4, vfp);
zkimike 13:0a5bd13f6e7f 494 fread ( jpeg_frame_buffer2, sizeof(char), framesize, vfp);
zkimike 13:0a5bd13f6e7f 495 } else {
zkimike 13:0a5bd13f6e7f 496 if ( vfp != NULL || afp != NULL ) {
zkimike 13:0a5bd13f6e7f 497 fclose(vfp);
zkimike 13:0a5bd13f6e7f 498 vfp = NULL;
zkimike 13:0a5bd13f6e7f 499 fclose(afp);
zkimike 13:0a5bd13f6e7f 500 afp = NULL;
zkimike 13:0a5bd13f6e7f 501 }
zkimike 12:9a413bec6673 502 }
zkimike 12:9a413bec6673 503 TestPin0 = 0;
zkimike 12:9a413bec6673 504
zkimike 12:9a413bec6673 505 // Read and play Next Audio Frame
zkimike 12:9a413bec6673 506 TestPin1 = 1;
zkimike 12:9a413bec6673 507 p_buf = audio_write_buff[buff_index];
zkimike 12:9a413bec6673 508 audio_data_size = wav_file.GetNextData(p_buf, AUDIO_WRITE_BUFF_SIZE);
zkimike 12:9a413bec6673 509 if (audio_data_size > 0) {
zkimike 12:9a413bec6673 510 audio.write(p_buf, audio_data_size, &audio_write_async_ctl);
zkimike 12:9a413bec6673 511 buff_index++;
zkimike 12:9a413bec6673 512 if (buff_index >= AUDIO_WRITE_BUFF_NUM) {
zkimike 12:9a413bec6673 513 buff_index = 0;
zkimike 12:9a413bec6673 514 }
zkimike 12:9a413bec6673 515 }
zkimike 12:9a413bec6673 516 TestPin1 = 0;
zkimike 12:9a413bec6673 517
zkimike 12:9a413bec6673 518 /* Draw screen */
zkimike 12:9a413bec6673 519 TestPin2 = 1;
zkimike 13:0a5bd13f6e7f 520 if ( video_off != true ) {
zkimike 13:0a5bd13f6e7f 521 Swap_FrameBuffer(frmbuf_info);
zkimike 13:0a5bd13f6e7f 522 RGA_Func_VideoPlayer(frmbuf_info, jpeg_frame_buffer1, jpeg_frame_buffer2);
zkimike 13:0a5bd13f6e7f 523 Update_LCD_Display(frmbuf_info);
zkimike 13:0a5bd13f6e7f 524 }
zkimike 12:9a413bec6673 525 TestPin2 = 0;
zkimike 12:9a413bec6673 526 buff_index++;
zkimike 12:9a413bec6673 527
zkimike 12:9a413bec6673 528 // Sync
zkimike 12:9a413bec6673 529 TestPin3 = 1;
zkimike 13:0a5bd13f6e7f 530 while( frame_period_ms > timer.read_ms() && frame_skip < MJPEG_DIV );
zkimike 12:9a413bec6673 531 timer.stop();
zkimike 12:9a413bec6673 532 timer.reset();
zkimike 12:9a413bec6673 533 TestPin3 = 0;
zkimike 13:0a5bd13f6e7f 534
zkimike 13:0a5bd13f6e7f 535 } // end of switch
zkimike 12:9a413bec6673 536 }
zkimike 12:9a413bec6673 537 break;
1050186 0:84e4649e7707 538 case RGA_FUNC_DISSOLVE:
1050186 6:6a8ce6f7767b 539 {
dkato 2:c7faef0ef374 540 float32_t work_alpha = 0.0f;
dkato 2:c7faef0ef374 541 while (1) {
dkato 2:c7faef0ef374 542 /* Get coordinates */
dkato 4:ce438477eddb 543 touch_num = p_touch->GetCoordinates(TOUCH_NUM, touch_pos);
dkato 2:c7faef0ef374 544 if (touch_num != 0) {
dkato 4:ce438477eddb 545 if (Scan_Key(return_key_tbl, touch_pos[0].x, touch_pos[0].y) == RGA_FUNC_RETURN) {
dkato 2:c7faef0ef374 546 break;
dkato 2:c7faef0ef374 547 }
dkato 4:ce438477eddb 548 work_alpha = (float32_t)touch_pos[0].x / (float32_t)(LCD_PIXEL_WIDTH);
dkato 2:c7faef0ef374 549 }
dkato 2:c7faef0ef374 550 /* Draw screen */
1050186 0:84e4649e7707 551 Swap_FrameBuffer(frmbuf_info);
1050186 0:84e4649e7707 552 RGA_Func_Dissolve(frmbuf_info, work_alpha);
dkato 2:c7faef0ef374 553 Update_LCD_Display(frmbuf_info);
1050186 0:84e4649e7707 554 }
1050186 6:6a8ce6f7767b 555 }
1050186 6:6a8ce6f7767b 556 break;
1050186 0:84e4649e7707 557 case RGA_FUNC_SCROLL:
1050186 6:6a8ce6f7767b 558 {
dkato 2:c7faef0ef374 559 int work_width_pos = 0;
dkato 2:c7faef0ef374 560 while (1) {
dkato 2:c7faef0ef374 561 /* Get coordinates */
dkato 4:ce438477eddb 562 touch_num = p_touch->GetCoordinates(TOUCH_NUM, touch_pos);
dkato 2:c7faef0ef374 563 if (touch_num != 0) {
dkato 4:ce438477eddb 564 if (Scan_Key(return_key_tbl, touch_pos[0].x, touch_pos[0].y) == RGA_FUNC_RETURN) {
dkato 2:c7faef0ef374 565 break;
dkato 2:c7faef0ef374 566 }
dkato 4:ce438477eddb 567 work_width_pos = SCROLL_MAX_NUM * ((float32_t)touch_pos[0].x / (float32_t)(LCD_PIXEL_WIDTH));
dkato 2:c7faef0ef374 568 }
dkato 2:c7faef0ef374 569 /* Draw screen */
1050186 0:84e4649e7707 570 Swap_FrameBuffer(frmbuf_info);
1050186 0:84e4649e7707 571 RGA_Func_Scroll(frmbuf_info, work_width_pos);
dkato 2:c7faef0ef374 572 Update_LCD_Display(frmbuf_info);
1050186 0:84e4649e7707 573 }
1050186 6:6a8ce6f7767b 574 }
1050186 6:6a8ce6f7767b 575 break;
1050186 0:84e4649e7707 576 case RGA_FUNC_ZOOM:
1050186 6:6a8ce6f7767b 577 {
dkato 2:c7faef0ef374 578 int work_height_pos = ZOOM_MAX_NUM;
dkato 2:c7faef0ef374 579 while (1) {
dkato 2:c7faef0ef374 580 /* Get coordinates */
dkato 4:ce438477eddb 581 touch_num = p_touch->GetCoordinates(TOUCH_NUM, touch_pos);
dkato 2:c7faef0ef374 582 if (touch_num != 0) {
dkato 4:ce438477eddb 583 if (Scan_Key(return_key_tbl, touch_pos[0].x, touch_pos[0].y) == RGA_FUNC_RETURN) {
dkato 2:c7faef0ef374 584 break;
dkato 2:c7faef0ef374 585 }
dkato 4:ce438477eddb 586 work_height_pos = ZOOM_MAX_NUM * ((float32_t)touch_pos[0].x / (float32_t)(LCD_PIXEL_WIDTH));
dkato 2:c7faef0ef374 587 }
dkato 2:c7faef0ef374 588 /* Draw screen */
1050186 0:84e4649e7707 589 Swap_FrameBuffer(frmbuf_info);
dkato 2:c7faef0ef374 590 RGA_Func_Zoom(frmbuf_info, work_height_pos);
dkato 2:c7faef0ef374 591 Update_LCD_Display(frmbuf_info);
1050186 0:84e4649e7707 592 }
1050186 6:6a8ce6f7767b 593 }
1050186 6:6a8ce6f7767b 594 break;
1050186 0:84e4649e7707 595 case RGA_FUNC_ROTATION:
1050186 6:6a8ce6f7767b 596 {
dkato 2:c7faef0ef374 597 graphics_matrix_float_t work_angle = 0;
dkato 2:c7faef0ef374 598 while (1) {
dkato 2:c7faef0ef374 599 /* Get coordinates */
dkato 4:ce438477eddb 600 touch_num = p_touch->GetCoordinates(TOUCH_NUM, touch_pos);
dkato 2:c7faef0ef374 601 if (touch_num != 0) {
dkato 4:ce438477eddb 602 if (Scan_Key(return_key_tbl, touch_pos[0].x, touch_pos[0].y) == RGA_FUNC_RETURN) {
dkato 2:c7faef0ef374 603 break;
dkato 2:c7faef0ef374 604 }
dkato 4:ce438477eddb 605 work_angle = ROTATION_MAX_NUM * ((float32_t)touch_pos[0].x / (float32_t)(LCD_PIXEL_WIDTH));
dkato 2:c7faef0ef374 606 }
dkato 2:c7faef0ef374 607 /* Draw screen */
1050186 0:84e4649e7707 608 Swap_FrameBuffer(frmbuf_info);
1050186 0:84e4649e7707 609 RGA_Func_Rotation(frmbuf_info, work_angle);
dkato 2:c7faef0ef374 610 Update_LCD_Display(frmbuf_info);
1050186 0:84e4649e7707 611 }
1050186 6:6a8ce6f7767b 612 }
1050186 6:6a8ce6f7767b 613 break;
1050186 0:84e4649e7707 614 case RGA_FUNC_ACCELERATE:
1050186 6:6a8ce6f7767b 615 {
dkato 2:c7faef0ef374 616 int acce_frame_num = 0;
dkato 2:c7faef0ef374 617 int animation_timing = 0;
1050186 0:84e4649e7707 618 float32_t work_relative_pos;
dkato 2:c7faef0ef374 619 while (1) {
dkato 2:c7faef0ef374 620 /* Get coordinates */
dkato 4:ce438477eddb 621 touch_num = p_touch->GetCoordinates(TOUCH_NUM, touch_pos);
dkato 2:c7faef0ef374 622 if (touch_num != 0) {
dkato 2:c7faef0ef374 623 func_code_t func_code;
dkato 2:c7faef0ef374 624
dkato 4:ce438477eddb 625 func_code = Scan_Key(animetion_timing_key_tbl, touch_pos[0].x, touch_pos[0].y);
dkato 2:c7faef0ef374 626 if (func_code == RGA_FUNC_RETURN) {
dkato 2:c7faef0ef374 627 break;
dkato 2:c7faef0ef374 628 }
dkato 2:c7faef0ef374 629 switch (func_code) {
dkato 2:c7faef0ef374 630 case RGA_FUNC_ANIME_EASE:
dkato 2:c7faef0ef374 631 animation_timing = 0;
dkato 2:c7faef0ef374 632 acce_frame_num = 0;
dkato 2:c7faef0ef374 633 break;
dkato 2:c7faef0ef374 634 case RGA_FUNC_ANIME_LINEAR:
dkato 2:c7faef0ef374 635 animation_timing = 1;
dkato 2:c7faef0ef374 636 acce_frame_num = 0;
dkato 2:c7faef0ef374 637 break;
dkato 2:c7faef0ef374 638 case RGA_FUNC_ANIME_EASE_IN:
dkato 2:c7faef0ef374 639 animation_timing = 2;
dkato 2:c7faef0ef374 640 acce_frame_num = 0;
dkato 2:c7faef0ef374 641 break;
dkato 2:c7faef0ef374 642 case RGA_FUNC_ANIME_EASE_OUT:
dkato 2:c7faef0ef374 643 animation_timing = 3;
dkato 2:c7faef0ef374 644 acce_frame_num = 0;
dkato 2:c7faef0ef374 645 break;
dkato 2:c7faef0ef374 646 case RGA_FUNC_ANIME_EASE_IN_OUT:
dkato 2:c7faef0ef374 647 animation_timing = 4;
dkato 2:c7faef0ef374 648 acce_frame_num = 0;
dkato 2:c7faef0ef374 649 break;
dkato 2:c7faef0ef374 650 default:
dkato 2:c7faef0ef374 651 /* Do Nothing */
dkato 2:c7faef0ef374 652 break;
dkato 2:c7faef0ef374 653 }
dkato 2:c7faef0ef374 654 }
dkato 2:c7faef0ef374 655 work_relative_pos = acce_frame_num / (float32_t)ACCELERATE_MAX_NUM;
dkato 2:c7faef0ef374 656 acce_frame_num++;
dkato 2:c7faef0ef374 657 if (acce_frame_num > ACCELERATE_MAX_NUM) {
dkato 2:c7faef0ef374 658 acce_frame_num = 0;
dkato 2:c7faef0ef374 659 }
dkato 2:c7faef0ef374 660 /* Draw screen */
1050186 0:84e4649e7707 661 Swap_FrameBuffer(frmbuf_info);
dkato 2:c7faef0ef374 662 RGA_Func_Accelerate(frmbuf_info, animation_timing, work_relative_pos);
dkato 2:c7faef0ef374 663 Update_LCD_Display(frmbuf_info);
1050186 0:84e4649e7707 664 }
1050186 6:6a8ce6f7767b 665 }
1050186 6:6a8ce6f7767b 666 break;
1050186 0:84e4649e7707 667 default :
1050186 0:84e4649e7707 668 /* Do nothing */
1050186 0:84e4649e7707 669 break;
1050186 0:84e4649e7707 670 }
1050186 0:84e4649e7707 671 }
1050186 0:84e4649e7707 672
1050186 0:84e4649e7707 673 int main(void) {
1050186 0:84e4649e7707 674 func_code_t func_code;
1050186 0:84e4649e7707 675 uint8_t touch_num = 0;
dkato 4:ce438477eddb 676 TouchKey::touch_pos_t touch_pos[TOUCH_NUM];
1050186 0:84e4649e7707 677
dkato 4:ce438477eddb 678 /* Initialization of LCD */
dkato 4:ce438477eddb 679 Init_LCD_Display(); /* When using LCD, please call before than Init_Video(). */
dkato 4:ce438477eddb 680
dkato 4:ce438477eddb 681 memset(user_frame_buffer1, 0, sizeof(user_frame_buffer1));
1050186 0:84e4649e7707 682 memset(user_frame_buffer2, 0, sizeof(user_frame_buffer2));
dkato 4:ce438477eddb 683 frame_buffer_info.buffer_address[0] = user_frame_buffer1;
1050186 0:84e4649e7707 684 frame_buffer_info.buffer_address[1] = user_frame_buffer2;
1050186 0:84e4649e7707 685 frame_buffer_info.buffer_count = 2;
1050186 0:84e4649e7707 686 frame_buffer_info.show_buffer_index = 0;
1050186 0:84e4649e7707 687 frame_buffer_info.draw_buffer_index = 0;
1050186 0:84e4649e7707 688 frame_buffer_info.width = LCD_PIXEL_WIDTH;
1050186 0:84e4649e7707 689 frame_buffer_info.byte_per_pixel = FRAME_BUFFER_BYTE_PER_PIXEL;
1050186 0:84e4649e7707 690 frame_buffer_info.stride = LCD_PIXEL_WIDTH * FRAME_BUFFER_BYTE_PER_PIXEL;
1050186 0:84e4649e7707 691 frame_buffer_info.height = LCD_PIXEL_HEIGHT;
1050186 0:84e4649e7707 692 frame_buffer_info.pixel_format = PIXEL_FORMAT_RGB565;
1050186 0:84e4649e7707 693
1050186 0:84e4649e7707 694 /* Display Top Screen */
dkato 2:c7faef0ef374 695 Set_RGAObject(&frame_buffer_info);
dkato 2:c7faef0ef374 696 RGA_Func_DrawTopScreen(&frame_buffer_info);
zkimike 12:9a413bec6673 697
dkato 4:ce438477eddb 698 /* Start of LCD */
dkato 4:ce438477eddb 699 Start_LCD_Display(frame_buffer_info.buffer_address[0]);
dkato 4:ce438477eddb 700
dkato 4:ce438477eddb 701 /* Backlight on */
dkato 4:ce438477eddb 702 Thread::wait(200);
dkato 4:ce438477eddb 703 lcd_cntrst.write(1.0);
dkato 4:ce438477eddb 704
dkato 4:ce438477eddb 705 /* Reset touch IC */
dkato 4:ce438477eddb 706 TouckKey_LCD_shield touch(P4_0, P2_13, I2C_SDA, I2C_SCL);
dkato 4:ce438477eddb 707 touch.Reset();
zkimike 12:9a413bec6673 708
1050186 0:84e4649e7707 709 while (1) {
dkato 2:c7faef0ef374 710 /* Get Coordinates */
dkato 4:ce438477eddb 711 touch_num = touch.GetCoordinates(TOUCH_NUM, touch_pos);
1050186 0:84e4649e7707 712 if (touch_num != 0) {
dkato 4:ce438477eddb 713 func_code = Scan_Key(top_screen_key_tbl, touch_pos[0].x, touch_pos[0].y);
1050186 0:84e4649e7707 714 if (func_code != RGA_FUNC_NON) {
dkato 2:c7faef0ef374 715 /* Wait key off */
dkato 2:c7faef0ef374 716 while (1) {
dkato 4:ce438477eddb 717 touch_num = touch.GetCoordinates(TOUCH_NUM, touch_pos);
dkato 2:c7faef0ef374 718 if (touch_num == 0) {
dkato 2:c7faef0ef374 719 break;
dkato 2:c7faef0ef374 720 }
dkato 4:ce438477eddb 721 Thread::wait(20);
dkato 2:c7faef0ef374 722 }
dkato 2:c7faef0ef374 723
1050186 0:84e4649e7707 724 /* Execute RGA functions */
dkato 4:ce438477eddb 725 Exe_RGA_Func(func_code, &frame_buffer_info, &touch);
dkato 2:c7faef0ef374 726
1050186 0:84e4649e7707 727 /* Return Top Screen */
dkato 2:c7faef0ef374 728 Swap_FrameBuffer(&frame_buffer_info);
dkato 2:c7faef0ef374 729 RGA_Func_DrawTopScreen(&frame_buffer_info);
dkato 2:c7faef0ef374 730 Update_LCD_Display(&frame_buffer_info);
1050186 0:84e4649e7707 731 }
1050186 0:84e4649e7707 732 }
dkato 4:ce438477eddb 733 Thread::wait(20);
1050186 0:84e4649e7707 734 }
zkimike 12:9a413bec6673 735 }