Daiki Kato / Mbed 2 deprecated GR-PEACH_Digital_Signage_display_shield

Dependencies:   GR-PEACH_video GraphicsFramework R_BSP SDFileSystem_tmp mbed-rtos mbed

Committer:
dkato
Date:
Fri May 27 06:43:05 2016 +0000
Revision:
7:ed885a78b17f
Parent:
6:e7bafd9bba1a
Fix the frequency.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dkato 0:8970afa15acc 1 /*
dkato 0:8970afa15acc 2 Permission is hereby granted, free of charge, to any person obtaining a copy
dkato 0:8970afa15acc 3 of this software and associated documentation files (the "Software"), to deal
dkato 0:8970afa15acc 4 in the Software without restriction, including without limitation the rights
dkato 0:8970afa15acc 5 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
dkato 0:8970afa15acc 6 copies of the Software, and to permit persons to whom the Software is
dkato 0:8970afa15acc 7 furnished to do so, subject to the following conditions:
dkato 0:8970afa15acc 8
dkato 0:8970afa15acc 9 The above copyright notice and this permission notice shall be included in
dkato 0:8970afa15acc 10 all copies or substantial portions of the Software.
dkato 0:8970afa15acc 11
dkato 0:8970afa15acc 12 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
dkato 0:8970afa15acc 13 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
dkato 0:8970afa15acc 14 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
dkato 0:8970afa15acc 15 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
dkato 0:8970afa15acc 16 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
dkato 0:8970afa15acc 17 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
dkato 0:8970afa15acc 18 THE SOFTWARE.
dkato 0:8970afa15acc 19 */
dkato 0:8970afa15acc 20
dkato 0:8970afa15acc 21 #include "mbed.h"
dkato 0:8970afa15acc 22 #include "DisplayBace.h"
dkato 0:8970afa15acc 23 #include "RGA.h"
dkato 0:8970afa15acc 24 #include "rtos.h"
dkato 0:8970afa15acc 25 #include "SDFileSystem.h"
dkato 0:8970afa15acc 26
dkato 7:ed885a78b17f 27 #define SVGA (0u) /* 800x600@60 37.9kHz/60Hz */
dkato 7:ed885a78b17f 28 #define XGA (1u) /* 1024x768@60 48.4kHz/60Hz */
dkato 7:ed885a78b17f 29 #define HD_720p (2u) /* 1280x720@60 45.0kHz/60Hz */
dkato 0:8970afa15acc 30
dkato 0:8970afa15acc 31 /**** User Selection *********/
dkato 3:8489fb71f53d 32 #define WAIT_TIME (10000) /* wait time (ms) */
dkato 0:8970afa15acc 33 #define DISSOLVE_STEP_NUM (16) /* minimum 1 */
dkato 0:8970afa15acc 34 #define SCROLL_STEP_NUM (8) /* minimum 1 */
dkato 0:8970afa15acc 35 #define SCROLL_DIRECTION (-1) /* Select 1(left to right) or -1(right to left) */
dkato 7:ed885a78b17f 36 #define LCD_SIZE HD_720p /* Select SVGA, XGA, or HD_720p */
dkato 0:8970afa15acc 37 /*****************************/
dkato 0:8970afa15acc 38
dkato 0:8970afa15acc 39 #define FILE_NAME_LEN (64)
dkato 0:8970afa15acc 40 #define TEXT_SIZE (64 + 1) //null-terminated
dkato 0:8970afa15acc 41 #define FLD_PATH "/sd/"
dkato 4:1a08ad86d9af 42 #define MAX_JPEG_SIZE (1024 * 450)
dkato 0:8970afa15acc 43
dkato 0:8970afa15acc 44 /* LCD Parameter */
dkato 7:ed885a78b17f 45 #define LCD_INPUT_CLOCK (66.67)
dkato 0:8970afa15acc 46 #if ( LCD_SIZE == SVGA )
dkato 7:ed885a78b17f 47 #define LCD_OUTPUT_CLOCK (40.0003)
dkato 0:8970afa15acc 48 #define LCD_PIXEL_WIDTH (800u)
dkato 0:8970afa15acc 49 #define LCD_PIXEL_HEIGHT (600u)
dkato 0:8970afa15acc 50 #define LCD_H_BACK_PORCH (88u)
dkato 0:8970afa15acc 51 #define LCD_H_FRONT_PORCH (40u)
dkato 0:8970afa15acc 52 #define LCD_H_SYNC_WIDTH (128u)
dkato 0:8970afa15acc 53 #define LCD_V_BACK_PORCH (23u)
dkato 0:8970afa15acc 54 #define LCD_V_FRONT_PORCH (1u)
dkato 0:8970afa15acc 55 #define LCD_V_SYNC_WIDTH (4u)
dkato 0:8970afa15acc 56 #elif ( LCD_SIZE == XGA )
dkato 7:ed885a78b17f 57 #define LCD_OUTPUT_CLOCK (65.0002)
dkato 0:8970afa15acc 58 #define LCD_PIXEL_WIDTH (1024u)
dkato 0:8970afa15acc 59 #define LCD_PIXEL_HEIGHT (768u)
dkato 0:8970afa15acc 60 #define LCD_H_BACK_PORCH (160u)
dkato 0:8970afa15acc 61 #define LCD_H_FRONT_PORCH (24u)
dkato 0:8970afa15acc 62 #define LCD_H_SYNC_WIDTH (136u)
dkato 0:8970afa15acc 63 #define LCD_V_BACK_PORCH (29u)
dkato 0:8970afa15acc 64 #define LCD_V_FRONT_PORCH (3u)
dkato 0:8970afa15acc 65 #define LCD_V_SYNC_WIDTH (6u)
dkato 1:2f9f102b2b4c 66 #elif ( LCD_SIZE == HD_720p )
dkato 7:ed885a78b17f 67 #define LCD_OUTPUT_CLOCK (74.1800)
dkato 1:2f9f102b2b4c 68 #define LCD_PIXEL_WIDTH (1280u)
dkato 6:e7bafd9bba1a 69 #define LCD_PIXEL_HEIGHT (720u)
dkato 1:2f9f102b2b4c 70 #define LCD_H_BACK_PORCH (220u)
dkato 1:2f9f102b2b4c 71 #define LCD_H_FRONT_PORCH (70u)
dkato 1:2f9f102b2b4c 72 #define LCD_H_SYNC_WIDTH (80u)
dkato 1:2f9f102b2b4c 73 #define LCD_V_BACK_PORCH (20u)
dkato 1:2f9f102b2b4c 74 #define LCD_V_FRONT_PORCH (5u)
dkato 1:2f9f102b2b4c 75 #define LCD_V_SYNC_WIDTH (5u)
dkato 0:8970afa15acc 76 #endif
dkato 0:8970afa15acc 77
dkato 0:8970afa15acc 78 /* FRAME BUFFER Parameter */
dkato 0:8970afa15acc 79 #define FRAME_BUFFER_BYTE_PER_PIXEL (2)
dkato 0:8970afa15acc 80 #define FRAME_BUFFER_STRIDE (((LCD_PIXEL_WIDTH * FRAME_BUFFER_BYTE_PER_PIXEL) + 31u) & ~31u)
dkato 0:8970afa15acc 81
dkato 0:8970afa15acc 82 DigitalIn button(USER_BUTTON0);
dkato 0:8970afa15acc 83 I2C i2c(I2C_SDA, I2C_SCL);
dkato 0:8970afa15acc 84 DisplayBase Display;
dkato 0:8970afa15acc 85 Canvas2D_ContextClass canvas2d;
dkato 0:8970afa15acc 86
dkato 2:e79ddc136968 87 #if defined(__ICCARM__)
dkato 3:8489fb71f53d 88 #pragma data_alignment=32
dkato 3:8489fb71f53d 89 static uint8_t user_frame_buffer[FRAME_BUFFER_STRIDE * LCD_PIXEL_HEIGHT];
dkato 3:8489fb71f53d 90 static uint8_t user_frame_buffer2[FRAME_BUFFER_STRIDE * LCD_PIXEL_HEIGHT];
dkato 3:8489fb71f53d 91 #pragma data_alignment=8
dkato 4:1a08ad86d9af 92 static uint8_t JpegBuffer[MAX_JPEG_SIZE]@ ".mirrorram"; //8 bytes aligned!;
dkato 3:8489fb71f53d 93 #pragma data_alignment=4
dkato 2:e79ddc136968 94 #else
dkato 3:8489fb71f53d 95 static uint8_t user_frame_buffer[FRAME_BUFFER_STRIDE * LCD_PIXEL_HEIGHT]__attribute((aligned(32))); /* 32 bytes aligned */
dkato 3:8489fb71f53d 96 static uint8_t user_frame_buffer2[FRAME_BUFFER_STRIDE * LCD_PIXEL_HEIGHT]__attribute((aligned(32))); /* 32 bytes aligned */
dkato 4:1a08ad86d9af 97 static uint8_t JpegBuffer[MAX_JPEG_SIZE]__attribute((section("NC_BSS"),aligned(8))); //8 bytes aligned!;
dkato 2:e79ddc136968 98 #endif
dkato 0:8970afa15acc 99 static frame_buffer_t frame_buffer_info;
dkato 0:8970afa15acc 100 static volatile int32_t vsync_count = 0;
dkato 0:8970afa15acc 101
dkato 0:8970afa15acc 102 static void IntCallbackFunc_Vsync(DisplayBase::int_type_t int_type) {
dkato 0:8970afa15acc 103 /* Interrupt callback function for Vsync interruption */
dkato 0:8970afa15acc 104 if (vsync_count > 0) {
dkato 0:8970afa15acc 105 vsync_count--;
dkato 0:8970afa15acc 106 }
dkato 0:8970afa15acc 107 }
dkato 0:8970afa15acc 108
dkato 0:8970afa15acc 109 static void Wait_Vsync(const int32_t wait_count) {
dkato 0:8970afa15acc 110 /* Wait for the specified number of times Vsync occurs */
dkato 0:8970afa15acc 111 vsync_count = wait_count;
dkato 0:8970afa15acc 112 while (vsync_count > 0) {
dkato 0:8970afa15acc 113 /* Do nothing */
dkato 0:8970afa15acc 114 }
dkato 0:8970afa15acc 115 }
dkato 0:8970afa15acc 116
dkato 0:8970afa15acc 117 static void Init_LCD_Display(uint8_t* disp_buf) {
dkato 0:8970afa15acc 118 /* Create DisplayBase object */
dkato 0:8970afa15acc 119 DisplayBase::graphics_error_t error;
dkato 0:8970afa15acc 120 DisplayBase::rect_t rect;
dkato 0:8970afa15acc 121 DisplayBase::lcd_config_t lcd_config;
dkato 0:8970afa15acc 122 PinName lcd_pin[28] = {
dkato 0:8970afa15acc 123 /* data pin */
dkato 0:8970afa15acc 124 P11_15, P11_14, P11_13, P11_12, P5_7, P5_6, P5_5, P5_4, P5_3, P5_2, P5_1, P5_0,
dkato 0:8970afa15acc 125 P4_7, P4_6, P4_5, P4_4, P10_12, P10_13, P10_14, P10_15, P3_15, P3_14, P3_13,
dkato 0:8970afa15acc 126 P3_12, P3_11, P3_10, P3_9, P3_8
dkato 0:8970afa15acc 127 };
dkato 0:8970afa15acc 128
dkato 0:8970afa15acc 129 Thread::wait(100);
dkato 0:8970afa15acc 130
dkato 0:8970afa15acc 131 lcd_config.lcd_type = DisplayBase::LCD_TYPE_PARALLEL_RGB;
dkato 0:8970afa15acc 132 lcd_config.intputClock = LCD_INPUT_CLOCK;
dkato 0:8970afa15acc 133 lcd_config.outputClock = LCD_OUTPUT_CLOCK;
dkato 0:8970afa15acc 134 lcd_config.lcd_outformat = DisplayBase::LCD_OUTFORMAT_RGB888;
dkato 0:8970afa15acc 135 lcd_config.lcd_edge = DisplayBase::EDGE_RISING;
dkato 7:ed885a78b17f 136 lcd_config.h_toatal_period = (LCD_PIXEL_WIDTH + LCD_H_FRONT_PORCH + LCD_H_BACK_PORCH + LCD_H_SYNC_WIDTH);
dkato 7:ed885a78b17f 137 lcd_config.v_toatal_period = (LCD_PIXEL_HEIGHT + LCD_V_FRONT_PORCH + LCD_V_BACK_PORCH + LCD_V_SYNC_WIDTH);
dkato 0:8970afa15acc 138
dkato 0:8970afa15acc 139 lcd_config.h_disp_widht = LCD_PIXEL_WIDTH;
dkato 0:8970afa15acc 140 lcd_config.v_disp_widht = LCD_PIXEL_HEIGHT;
dkato 0:8970afa15acc 141 lcd_config.h_back_porch = LCD_H_BACK_PORCH;
dkato 0:8970afa15acc 142 lcd_config.v_back_porch = LCD_V_BACK_PORCH;
dkato 0:8970afa15acc 143
dkato 0:8970afa15acc 144 lcd_config.h_sync_port = DisplayBase::LCD_TCON_PIN_1;
dkato 0:8970afa15acc 145 lcd_config.h_sync_port_polarity = DisplayBase::SIG_POL_NOT_INVERTED;
dkato 0:8970afa15acc 146 lcd_config.h_sync_width = LCD_H_SYNC_WIDTH;
dkato 0:8970afa15acc 147
dkato 0:8970afa15acc 148 lcd_config.v_sync_port = DisplayBase::LCD_TCON_PIN_2;
dkato 0:8970afa15acc 149 lcd_config.v_sync_port_polarity = DisplayBase::SIG_POL_NOT_INVERTED;
dkato 0:8970afa15acc 150 lcd_config.v_sync_width = LCD_V_SYNC_WIDTH;
dkato 0:8970afa15acc 151
dkato 0:8970afa15acc 152 lcd_config.de_port = DisplayBase::LCD_TCON_PIN_0;
dkato 0:8970afa15acc 153 lcd_config.de_port_polarity = DisplayBase::SIG_POL_NOT_INVERTED;
dkato 0:8970afa15acc 154
dkato 0:8970afa15acc 155 /* Graphics initialization process */
dkato 0:8970afa15acc 156 error = Display.Graphics_init(&lcd_config);
dkato 0:8970afa15acc 157 if (error != DisplayBase::GRAPHICS_OK) {
dkato 0:8970afa15acc 158 printf("Line %d, error %d\n", __LINE__, error);
dkato 0:8970afa15acc 159 while (1);
dkato 0:8970afa15acc 160 }
dkato 0:8970afa15acc 161
dkato 0:8970afa15acc 162 /* Interrupt callback function setting (Vsync signal output from scaler 0) */
dkato 0:8970afa15acc 163 error = Display.Graphics_Irq_Handler_Set(DisplayBase::INT_TYPE_S0_LO_VSYNC, 0, IntCallbackFunc_Vsync);
dkato 0:8970afa15acc 164 if (error != DisplayBase::GRAPHICS_OK) {
dkato 0:8970afa15acc 165 printf("Line %d, error %d\n", __LINE__, error);
dkato 0:8970afa15acc 166 while (1);
dkato 0:8970afa15acc 167 }
dkato 0:8970afa15acc 168
dkato 0:8970afa15acc 169 Display.Graphics_Lcd_Port_Init(lcd_pin, 28);
dkato 0:8970afa15acc 170 rect.vs = 0;
dkato 0:8970afa15acc 171 rect.vw = LCD_PIXEL_HEIGHT;
dkato 0:8970afa15acc 172 rect.hs = 0;
dkato 0:8970afa15acc 173 rect.hw = LCD_PIXEL_WIDTH;
dkato 0:8970afa15acc 174
dkato 0:8970afa15acc 175 Display.Graphics_Read_Setting(
dkato 0:8970afa15acc 176 DisplayBase::GRAPHICS_LAYER_0,
dkato 0:8970afa15acc 177 (void *)disp_buf,
dkato 0:8970afa15acc 178 FRAME_BUFFER_STRIDE,
dkato 0:8970afa15acc 179 DisplayBase::GRAPHICS_FORMAT_RGB565,
dkato 0:8970afa15acc 180 DisplayBase::WR_RD_WRSWA_32_16BIT,
dkato 0:8970afa15acc 181 &rect
dkato 0:8970afa15acc 182 );
dkato 0:8970afa15acc 183 }
dkato 0:8970afa15acc 184
dkato 0:8970afa15acc 185 static void Start_LCD_Display(void) {
dkato 0:8970afa15acc 186 Display.Graphics_Start(DisplayBase::GRAPHICS_LAYER_0);
dkato 0:8970afa15acc 187 }
dkato 0:8970afa15acc 188
dkato 0:8970afa15acc 189 static void Update_LCD_Display(frame_buffer_t * frmbuf_info) {
dkato 0:8970afa15acc 190 Display.Graphics_Read_Change(DisplayBase::GRAPHICS_LAYER_0,
dkato 0:8970afa15acc 191 (void *)frmbuf_info->buffer_address[frmbuf_info->draw_buffer_index]);
dkato 0:8970afa15acc 192 Wait_Vsync(1);
dkato 0:8970afa15acc 193 }
dkato 0:8970afa15acc 194
dkato 0:8970afa15acc 195 static void Swap_FrameBuffer(frame_buffer_t * frmbuf_info) {
dkato 0:8970afa15acc 196 if (frmbuf_info->draw_buffer_index == 1) {
dkato 0:8970afa15acc 197 frmbuf_info->draw_buffer_index = 0;
dkato 0:8970afa15acc 198 } else {
dkato 0:8970afa15acc 199 frmbuf_info->draw_buffer_index = 1;
dkato 0:8970afa15acc 200 }
dkato 0:8970afa15acc 201 }
dkato 0:8970afa15acc 202
dkato 0:8970afa15acc 203 static void draw_image(frame_buffer_t* frmbuf_info, const graphics_image_t* image_new) {
dkato 0:8970afa15acc 204 Swap_FrameBuffer(frmbuf_info);
dkato 0:8970afa15acc 205 /* Clear */
dkato 0:8970afa15acc 206 canvas2d.clearRect(0, 0, frmbuf_info->width, frmbuf_info->height);
dkato 0:8970afa15acc 207 /* Draw a image */
dkato 0:8970afa15acc 208 canvas2d.globalAlpha = 1.0f;
dkato 0:8970afa15acc 209 canvas2d.drawImage((const graphics_image_t*)image_new, 0, 0, frmbuf_info->width, frmbuf_info->height);
dkato 0:8970afa15acc 210 R_OSPL_CLEAR_ERROR();
dkato 0:8970afa15acc 211 /* Complete drawing */
dkato 0:8970afa15acc 212 R_GRAPHICS_Finish(canvas2d.c_LanguageContext);
dkato 0:8970afa15acc 213 Update_LCD_Display(frmbuf_info);
dkato 0:8970afa15acc 214 }
dkato 0:8970afa15acc 215
dkato 0:8970afa15acc 216 static void draw_image_scroll(frame_buffer_t* frmbuf_info, const graphics_image_t* image_last,
dkato 0:8970afa15acc 217 const graphics_image_t* image_new, float32_t scroll) {
dkato 0:8970afa15acc 218 Swap_FrameBuffer(frmbuf_info);
dkato 0:8970afa15acc 219 /* Clear */
dkato 0:8970afa15acc 220 canvas2d.clearRect(0, 0, frmbuf_info->width, frmbuf_info->height);
dkato 0:8970afa15acc 221 /* Draw a image */
dkato 0:8970afa15acc 222 canvas2d.globalAlpha = 1.0f;
dkato 0:8970afa15acc 223 canvas2d.drawImage((const graphics_image_t*)image_last,
dkato 0:8970afa15acc 224 (int_t)(frmbuf_info->width * scroll) * SCROLL_DIRECTION, 0,
dkato 0:8970afa15acc 225 frmbuf_info->width, frmbuf_info->height);
dkato 0:8970afa15acc 226 R_OSPL_CLEAR_ERROR();
dkato 0:8970afa15acc 227 canvas2d.globalAlpha = 1.0f;
dkato 0:8970afa15acc 228 canvas2d.drawImage((const graphics_image_t*)image_new,
dkato 0:8970afa15acc 229 ((int_t)(frmbuf_info->width * scroll) - frmbuf_info->width) * SCROLL_DIRECTION, 0,
dkato 0:8970afa15acc 230 frmbuf_info->width, frmbuf_info->height);
dkato 0:8970afa15acc 231 R_OSPL_CLEAR_ERROR();
dkato 0:8970afa15acc 232 /* Complete drawing */
dkato 0:8970afa15acc 233 R_GRAPHICS_Finish(canvas2d.c_LanguageContext);
dkato 0:8970afa15acc 234 Update_LCD_Display(frmbuf_info);
dkato 0:8970afa15acc 235 }
dkato 0:8970afa15acc 236
dkato 0:8970afa15acc 237 static void draw_image_dissolve(frame_buffer_t* frmbuf_info, const graphics_image_t* image_last,
dkato 0:8970afa15acc 238 const graphics_image_t* image_new, float32_t alpha) {
dkato 0:8970afa15acc 239 Swap_FrameBuffer(frmbuf_info);
dkato 0:8970afa15acc 240 /* Clear */
dkato 0:8970afa15acc 241 canvas2d.clearRect(0, 0, frmbuf_info->width, frmbuf_info->height);
dkato 0:8970afa15acc 242 /* Draw a image */
dkato 0:8970afa15acc 243 canvas2d.globalAlpha = 1.0f - alpha;
dkato 0:8970afa15acc 244 canvas2d.drawImage((const graphics_image_t*)image_last, 0, 0, frmbuf_info->width, frmbuf_info->height);
dkato 0:8970afa15acc 245 R_OSPL_CLEAR_ERROR();
dkato 0:8970afa15acc 246 canvas2d.globalAlpha = alpha;
dkato 0:8970afa15acc 247 canvas2d.drawImage((const graphics_image_t*)image_new, 0, 0, frmbuf_info->width, frmbuf_info->height);
dkato 0:8970afa15acc 248 R_OSPL_CLEAR_ERROR();
dkato 0:8970afa15acc 249 /* Complete drawing */
dkato 0:8970afa15acc 250 R_GRAPHICS_Finish(canvas2d.c_LanguageContext);
dkato 0:8970afa15acc 251 Update_LCD_Display(frmbuf_info);
dkato 0:8970afa15acc 252 }
dkato 0:8970afa15acc 253
dkato 0:8970afa15acc 254 int main(void) {
dkato 0:8970afa15acc 255 errnum_t err;
dkato 0:8970afa15acc 256 Canvas2D_ContextConfigClass config;
dkato 0:8970afa15acc 257
dkato 0:8970afa15acc 258 memset(user_frame_buffer, 0, sizeof(user_frame_buffer));
dkato 0:8970afa15acc 259 memset(user_frame_buffer2, 0, sizeof(user_frame_buffer2));
dkato 0:8970afa15acc 260 frame_buffer_info.buffer_address[0] = user_frame_buffer;
dkato 0:8970afa15acc 261 frame_buffer_info.buffer_address[1] = user_frame_buffer2;
dkato 0:8970afa15acc 262 frame_buffer_info.buffer_count = 2;
dkato 0:8970afa15acc 263 frame_buffer_info.show_buffer_index = 0;
dkato 0:8970afa15acc 264 frame_buffer_info.draw_buffer_index = 0;
dkato 0:8970afa15acc 265 frame_buffer_info.width = LCD_PIXEL_WIDTH;
dkato 0:8970afa15acc 266 frame_buffer_info.byte_per_pixel = FRAME_BUFFER_BYTE_PER_PIXEL;
dkato 0:8970afa15acc 267 frame_buffer_info.stride = LCD_PIXEL_WIDTH * FRAME_BUFFER_BYTE_PER_PIXEL;
dkato 0:8970afa15acc 268 frame_buffer_info.height = LCD_PIXEL_HEIGHT;
dkato 0:8970afa15acc 269 frame_buffer_info.pixel_format = PIXEL_FORMAT_RGB565;
dkato 0:8970afa15acc 270 Init_LCD_Display(frame_buffer_info.buffer_address[0]);
dkato 0:8970afa15acc 271
dkato 0:8970afa15acc 272 config.frame_buffer = &frame_buffer_info;
dkato 0:8970afa15acc 273 canvas2d = R_RGA_New_Canvas2D_ContextClass(config);
dkato 0:8970afa15acc 274 err = R_OSPL_GetErrNum();
dkato 0:8970afa15acc 275 if (err != 0) {
dkato 0:8970afa15acc 276 printf("Line %d, error %d\n", __LINE__, err);
dkato 0:8970afa15acc 277 while (1);
dkato 0:8970afa15acc 278 }
dkato 0:8970afa15acc 279 Start_LCD_Display();
dkato 0:8970afa15acc 280
dkato 7:ed885a78b17f 281 Thread::wait(100); // wait sd mount
dkato 7:ed885a78b17f 282
dkato 0:8970afa15acc 283 SDFileSystem sd(P8_5, P8_6, P8_3, P8_4, "sd");
dkato 0:8970afa15acc 284 FILE * fp = NULL;
dkato 0:8970afa15acc 285 DIR * d = NULL;
dkato 0:8970afa15acc 286 char file_path[sizeof(FLD_PATH) + FILE_NAME_LEN];
dkato 0:8970afa15acc 287 int jpeg_toggle = 0;
dkato 0:8970afa15acc 288 bool first_view = true;
dkato 0:8970afa15acc 289 size_t ret;
dkato 3:8489fb71f53d 290 Timer t;
dkato 4:1a08ad86d9af 291 uint8_t * p_JpegBuffer[2];
dkato 4:1a08ad86d9af 292
dkato 4:1a08ad86d9af 293 p_JpegBuffer[0] = JpegBuffer;
dkato 4:1a08ad86d9af 294 p_JpegBuffer[1] = new uint8_t[MAX_JPEG_SIZE];
dkato 0:8970afa15acc 295
dkato 0:8970afa15acc 296 while (1) {
dkato 0:8970afa15acc 297 // file search
dkato 0:8970afa15acc 298 if (d == NULL) {
dkato 0:8970afa15acc 299 d = opendir(FLD_PATH);
dkato 0:8970afa15acc 300 }
dkato 0:8970afa15acc 301 struct dirent * p;
dkato 0:8970afa15acc 302 while ((p = readdir(d)) != NULL) {
dkato 0:8970afa15acc 303 size_t len = strlen(p->d_name);
dkato 0:8970afa15acc 304 if ((len > 4) && (len < FILE_NAME_LEN)
dkato 0:8970afa15acc 305 && (strncasecmp(&p->d_name[len - 4], ".jpg", 4) == 0)) {
dkato 0:8970afa15acc 306 strcpy(file_path, FLD_PATH);
dkato 0:8970afa15acc 307 strcat(file_path, p->d_name);
dkato 0:8970afa15acc 308 fp = fopen(file_path, "r");
dkato 4:1a08ad86d9af 309 ret = fread(p_JpegBuffer[jpeg_toggle], sizeof(char), MAX_JPEG_SIZE, fp);
dkato 0:8970afa15acc 310 fclose(fp);
dkato 0:8970afa15acc 311 if (ret < MAX_JPEG_SIZE) {
dkato 0:8970afa15acc 312 if (first_view != false) {
dkato 3:8489fb71f53d 313 t.reset();
dkato 3:8489fb71f53d 314 t.start();
dkato 0:8970afa15acc 315 // Effect NONE
dkato 0:8970afa15acc 316 first_view = false;
dkato 4:1a08ad86d9af 317 draw_image(&frame_buffer_info, (const graphics_image_t*)p_JpegBuffer[jpeg_toggle]);
dkato 0:8970afa15acc 318 } else {
dkato 0:8970afa15acc 319 bool key_press = false;
dkato 3:8489fb71f53d 320 t.stop();
dkato 0:8970afa15acc 321 // Wait timeout or key press
dkato 3:8489fb71f53d 322 for (int i = t.read_ms(); i < WAIT_TIME; i += 100) {
dkato 0:8970afa15acc 323 if (button == 0) {
dkato 0:8970afa15acc 324 key_press = true;
dkato 0:8970afa15acc 325 break;
dkato 0:8970afa15acc 326 }
dkato 0:8970afa15acc 327 Thread::wait(100);
dkato 0:8970afa15acc 328 }
dkato 3:8489fb71f53d 329 t.reset();
dkato 3:8489fb71f53d 330 t.start();
dkato 0:8970afa15acc 331 if (key_press == false) {
dkato 0:8970afa15acc 332 // Effect DISSOLVE
dkato 0:8970afa15acc 333 for (int i = 1; i <= DISSOLVE_STEP_NUM; i++) {
dkato 0:8970afa15acc 334 draw_image_dissolve(&frame_buffer_info,
dkato 4:1a08ad86d9af 335 (const graphics_image_t*)p_JpegBuffer[!jpeg_toggle],
dkato 4:1a08ad86d9af 336 (const graphics_image_t*)p_JpegBuffer[jpeg_toggle],
dkato 0:8970afa15acc 337 (float32_t)i / (float32_t)DISSOLVE_STEP_NUM);
dkato 0:8970afa15acc 338 }
dkato 0:8970afa15acc 339 } else {
dkato 0:8970afa15acc 340 // Effect SCROLL
dkato 0:8970afa15acc 341 for (int i = 1; i <= SCROLL_STEP_NUM; i++) {
dkato 0:8970afa15acc 342 draw_image_scroll(&frame_buffer_info,
dkato 4:1a08ad86d9af 343 (const graphics_image_t*)p_JpegBuffer[!jpeg_toggle],
dkato 4:1a08ad86d9af 344 (const graphics_image_t*)p_JpegBuffer[jpeg_toggle],
dkato 0:8970afa15acc 345 (float32_t)i / (float32_t)SCROLL_STEP_NUM);
dkato 0:8970afa15acc 346 }
dkato 0:8970afa15acc 347 }
dkato 0:8970afa15acc 348 }
dkato 0:8970afa15acc 349 jpeg_toggle = !jpeg_toggle;
dkato 0:8970afa15acc 350 }
dkato 0:8970afa15acc 351 break;
dkato 0:8970afa15acc 352 }
dkato 0:8970afa15acc 353 }
dkato 0:8970afa15acc 354 if (p == NULL) {
dkato 0:8970afa15acc 355 closedir(d);
dkato 0:8970afa15acc 356 d = NULL;
dkato 0:8970afa15acc 357 }
dkato 0:8970afa15acc 358 }
dkato 0:8970afa15acc 359 }