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:
Tue May 24 06:35:47 2016 +0000
Revision:
0:8970afa15acc
Child:
1:2f9f102b2b4c
first commit

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 0:8970afa15acc 27 #define SVGA (0u) /* 800 x 600 */
dkato 0:8970afa15acc 28 #define XGA (1u) /* 1024 x 768 */
dkato 0:8970afa15acc 29 #define WXGA (2u) /* 1280 x 800 */
dkato 0:8970afa15acc 30
dkato 0:8970afa15acc 31 /**** User Selection *********/
dkato 0:8970afa15acc 32 #define WAIT_TIME (8000)
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 0:8970afa15acc 36 #define LCD_SIZE WXGA /* Select SVGA, XGA or WXGA */
dkato 0:8970afa15acc 37 #define MAX_JPEG_SIZE (1024 * 300)
dkato 0:8970afa15acc 38 /*****************************/
dkato 0:8970afa15acc 39
dkato 0:8970afa15acc 40 #define FILE_NAME_LEN (64)
dkato 0:8970afa15acc 41 #define TEXT_SIZE (64 + 1) //null-terminated
dkato 0:8970afa15acc 42 #define FLD_PATH "/sd/"
dkato 0:8970afa15acc 43
dkato 0:8970afa15acc 44 /* LCD Parameter */
dkato 0:8970afa15acc 45 #define LCD_INPUT_CLOCK (66.67f)
dkato 0:8970afa15acc 46 #if ( LCD_SIZE == SVGA )
dkato 0:8970afa15acc 47 #define LCD_OUTPUT_CLOCK (40.0f)
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 0:8970afa15acc 57 #define LCD_OUTPUT_CLOCK (65.00325f)
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 0:8970afa15acc 66 #elif ( LCD_SIZE == WXGA )
dkato 0:8970afa15acc 67 #define LCD_OUTPUT_CLOCK (83.51112f)
dkato 0:8970afa15acc 68 #define LCD_PIXEL_WIDTH (1280u)
dkato 0:8970afa15acc 69 #define LCD_PIXEL_HEIGHT (800u)
dkato 0:8970afa15acc 70 #define LCD_H_BACK_PORCH (200u)
dkato 0:8970afa15acc 71 #define LCD_H_FRONT_PORCH (64u)
dkato 0:8970afa15acc 72 #define LCD_H_SYNC_WIDTH (136u)
dkato 0:8970afa15acc 73 #define LCD_V_BACK_PORCH (24u)
dkato 0:8970afa15acc 74 #define LCD_V_FRONT_PORCH (1u)
dkato 0:8970afa15acc 75 #define LCD_V_SYNC_WIDTH (3u)
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 0:8970afa15acc 87 static uint8_t user_frame_buffer[FRAME_BUFFER_STRIDE * LCD_PIXEL_HEIGHT]__attribute((aligned(32))); /* 32 bytes aligned */
dkato 0:8970afa15acc 88 static uint8_t user_frame_buffer2[FRAME_BUFFER_STRIDE * LCD_PIXEL_HEIGHT]__attribute((aligned(32))); /* 32 bytes aligned */
dkato 0:8970afa15acc 89 static frame_buffer_t frame_buffer_info;
dkato 0:8970afa15acc 90 static volatile int32_t vsync_count = 0;
dkato 0:8970afa15acc 91
dkato 0:8970afa15acc 92 #if defined(__ICCARM__)
dkato 0:8970afa15acc 93 #pragma data_alignment=8
dkato 0:8970afa15acc 94 static uint8_t JpegBuffer[2][MAX_JPEG_SIZE]@ ".mirrorram"; //8 bytes aligned!;
dkato 0:8970afa15acc 95 #pragma data_alignment=4
dkato 0:8970afa15acc 96 #else
dkato 0:8970afa15acc 97 static uint8_t JpegBuffer[2][MAX_JPEG_SIZE]__attribute((section("NC_BSS"),aligned(8))); //8 bytes aligned!;
dkato 0:8970afa15acc 98 #endif
dkato 0:8970afa15acc 99
dkato 0:8970afa15acc 100 static void IntCallbackFunc_Vsync(DisplayBase::int_type_t int_type) {
dkato 0:8970afa15acc 101 /* Interrupt callback function for Vsync interruption */
dkato 0:8970afa15acc 102 if (vsync_count > 0) {
dkato 0:8970afa15acc 103 vsync_count--;
dkato 0:8970afa15acc 104 }
dkato 0:8970afa15acc 105 }
dkato 0:8970afa15acc 106
dkato 0:8970afa15acc 107 static void Wait_Vsync(const int32_t wait_count) {
dkato 0:8970afa15acc 108 /* Wait for the specified number of times Vsync occurs */
dkato 0:8970afa15acc 109 vsync_count = wait_count;
dkato 0:8970afa15acc 110 while (vsync_count > 0) {
dkato 0:8970afa15acc 111 /* Do nothing */
dkato 0:8970afa15acc 112 }
dkato 0:8970afa15acc 113 }
dkato 0:8970afa15acc 114
dkato 0:8970afa15acc 115 static void Init_LCD_Display(uint8_t* disp_buf) {
dkato 0:8970afa15acc 116 /* Create DisplayBase object */
dkato 0:8970afa15acc 117 DisplayBase::graphics_error_t error;
dkato 0:8970afa15acc 118 DisplayBase::rect_t rect;
dkato 0:8970afa15acc 119 DisplayBase::lcd_config_t lcd_config;
dkato 0:8970afa15acc 120 PinName lcd_pin[28] = {
dkato 0:8970afa15acc 121 /* data pin */
dkato 0:8970afa15acc 122 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 123 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 124 P3_12, P3_11, P3_10, P3_9, P3_8
dkato 0:8970afa15acc 125 };
dkato 0:8970afa15acc 126
dkato 0:8970afa15acc 127 Thread::wait(100);
dkato 0:8970afa15acc 128
dkato 0:8970afa15acc 129 lcd_config.lcd_type = DisplayBase::LCD_TYPE_PARALLEL_RGB;
dkato 0:8970afa15acc 130 lcd_config.intputClock = LCD_INPUT_CLOCK;
dkato 0:8970afa15acc 131 lcd_config.outputClock = LCD_OUTPUT_CLOCK;
dkato 0:8970afa15acc 132 lcd_config.lcd_outformat = DisplayBase::LCD_OUTFORMAT_RGB888;
dkato 0:8970afa15acc 133 lcd_config.lcd_edge = DisplayBase::EDGE_RISING;
dkato 0:8970afa15acc 134 lcd_config.h_toatal_period = (LCD_PIXEL_WIDTH + LCD_H_FRONT_PORCH + LCD_H_BACK_PORCH);
dkato 0:8970afa15acc 135 lcd_config.v_toatal_period = (LCD_PIXEL_HEIGHT + LCD_V_FRONT_PORCH + LCD_V_BACK_PORCH);
dkato 0:8970afa15acc 136
dkato 0:8970afa15acc 137 lcd_config.h_disp_widht = LCD_PIXEL_WIDTH;
dkato 0:8970afa15acc 138 lcd_config.v_disp_widht = LCD_PIXEL_HEIGHT;
dkato 0:8970afa15acc 139 lcd_config.h_back_porch = LCD_H_BACK_PORCH;
dkato 0:8970afa15acc 140 lcd_config.v_back_porch = LCD_V_BACK_PORCH;
dkato 0:8970afa15acc 141
dkato 0:8970afa15acc 142 lcd_config.h_sync_port = DisplayBase::LCD_TCON_PIN_1;
dkato 0:8970afa15acc 143 lcd_config.h_sync_port_polarity = DisplayBase::SIG_POL_NOT_INVERTED;
dkato 0:8970afa15acc 144 lcd_config.h_sync_width = LCD_H_SYNC_WIDTH;
dkato 0:8970afa15acc 145
dkato 0:8970afa15acc 146 lcd_config.v_sync_port = DisplayBase::LCD_TCON_PIN_2;
dkato 0:8970afa15acc 147 lcd_config.v_sync_port_polarity = DisplayBase::SIG_POL_NOT_INVERTED;
dkato 0:8970afa15acc 148 lcd_config.v_sync_width = LCD_V_SYNC_WIDTH;
dkato 0:8970afa15acc 149
dkato 0:8970afa15acc 150 lcd_config.de_port = DisplayBase::LCD_TCON_PIN_0;
dkato 0:8970afa15acc 151 lcd_config.de_port_polarity = DisplayBase::SIG_POL_NOT_INVERTED;
dkato 0:8970afa15acc 152
dkato 0:8970afa15acc 153 /* Graphics initialization process */
dkato 0:8970afa15acc 154 error = Display.Graphics_init(&lcd_config);
dkato 0:8970afa15acc 155 if (error != DisplayBase::GRAPHICS_OK) {
dkato 0:8970afa15acc 156 printf("Line %d, error %d\n", __LINE__, error);
dkato 0:8970afa15acc 157 while (1);
dkato 0:8970afa15acc 158 }
dkato 0:8970afa15acc 159
dkato 0:8970afa15acc 160 /* Interrupt callback function setting (Vsync signal output from scaler 0) */
dkato 0:8970afa15acc 161 error = Display.Graphics_Irq_Handler_Set(DisplayBase::INT_TYPE_S0_LO_VSYNC, 0, IntCallbackFunc_Vsync);
dkato 0:8970afa15acc 162 if (error != DisplayBase::GRAPHICS_OK) {
dkato 0:8970afa15acc 163 printf("Line %d, error %d\n", __LINE__, error);
dkato 0:8970afa15acc 164 while (1);
dkato 0:8970afa15acc 165 }
dkato 0:8970afa15acc 166
dkato 0:8970afa15acc 167 Display.Graphics_Lcd_Port_Init(lcd_pin, 28);
dkato 0:8970afa15acc 168 rect.vs = 0;
dkato 0:8970afa15acc 169 rect.vw = LCD_PIXEL_HEIGHT;
dkato 0:8970afa15acc 170 rect.hs = 0;
dkato 0:8970afa15acc 171 rect.hw = LCD_PIXEL_WIDTH;
dkato 0:8970afa15acc 172
dkato 0:8970afa15acc 173 Display.Graphics_Read_Setting(
dkato 0:8970afa15acc 174 DisplayBase::GRAPHICS_LAYER_0,
dkato 0:8970afa15acc 175 (void *)disp_buf,
dkato 0:8970afa15acc 176 FRAME_BUFFER_STRIDE,
dkato 0:8970afa15acc 177 DisplayBase::GRAPHICS_FORMAT_RGB565,
dkato 0:8970afa15acc 178 DisplayBase::WR_RD_WRSWA_32_16BIT,
dkato 0:8970afa15acc 179 &rect
dkato 0:8970afa15acc 180 );
dkato 0:8970afa15acc 181 }
dkato 0:8970afa15acc 182
dkato 0:8970afa15acc 183 static void Start_LCD_Display(void) {
dkato 0:8970afa15acc 184 Display.Graphics_Start(DisplayBase::GRAPHICS_LAYER_0);
dkato 0:8970afa15acc 185 }
dkato 0:8970afa15acc 186
dkato 0:8970afa15acc 187 static void Update_LCD_Display(frame_buffer_t * frmbuf_info) {
dkato 0:8970afa15acc 188 Display.Graphics_Read_Change(DisplayBase::GRAPHICS_LAYER_0,
dkato 0:8970afa15acc 189 (void *)frmbuf_info->buffer_address[frmbuf_info->draw_buffer_index]);
dkato 0:8970afa15acc 190 Wait_Vsync(1);
dkato 0:8970afa15acc 191 }
dkato 0:8970afa15acc 192
dkato 0:8970afa15acc 193 static void Swap_FrameBuffer(frame_buffer_t * frmbuf_info) {
dkato 0:8970afa15acc 194 if (frmbuf_info->draw_buffer_index == 1) {
dkato 0:8970afa15acc 195 frmbuf_info->draw_buffer_index = 0;
dkato 0:8970afa15acc 196 } else {
dkato 0:8970afa15acc 197 frmbuf_info->draw_buffer_index = 1;
dkato 0:8970afa15acc 198 }
dkato 0:8970afa15acc 199 }
dkato 0:8970afa15acc 200
dkato 0:8970afa15acc 201 static void draw_image(frame_buffer_t* frmbuf_info, const graphics_image_t* image_new) {
dkato 0:8970afa15acc 202 Swap_FrameBuffer(frmbuf_info);
dkato 0:8970afa15acc 203 /* Clear */
dkato 0:8970afa15acc 204 canvas2d.clearRect(0, 0, frmbuf_info->width, frmbuf_info->height);
dkato 0:8970afa15acc 205 /* Draw a image */
dkato 0:8970afa15acc 206 canvas2d.globalAlpha = 1.0f;
dkato 0:8970afa15acc 207 canvas2d.drawImage((const graphics_image_t*)image_new, 0, 0, frmbuf_info->width, frmbuf_info->height);
dkato 0:8970afa15acc 208 R_OSPL_CLEAR_ERROR();
dkato 0:8970afa15acc 209 /* Complete drawing */
dkato 0:8970afa15acc 210 R_GRAPHICS_Finish(canvas2d.c_LanguageContext);
dkato 0:8970afa15acc 211 Update_LCD_Display(frmbuf_info);
dkato 0:8970afa15acc 212 }
dkato 0:8970afa15acc 213
dkato 0:8970afa15acc 214 static void draw_image_scroll(frame_buffer_t* frmbuf_info, const graphics_image_t* image_last,
dkato 0:8970afa15acc 215 const graphics_image_t* image_new, float32_t scroll) {
dkato 0:8970afa15acc 216 Swap_FrameBuffer(frmbuf_info);
dkato 0:8970afa15acc 217 /* Clear */
dkato 0:8970afa15acc 218 canvas2d.clearRect(0, 0, frmbuf_info->width, frmbuf_info->height);
dkato 0:8970afa15acc 219 /* Draw a image */
dkato 0:8970afa15acc 220 canvas2d.globalAlpha = 1.0f;
dkato 0:8970afa15acc 221 canvas2d.drawImage((const graphics_image_t*)image_last,
dkato 0:8970afa15acc 222 (int_t)(frmbuf_info->width * scroll) * SCROLL_DIRECTION, 0,
dkato 0:8970afa15acc 223 frmbuf_info->width, frmbuf_info->height);
dkato 0:8970afa15acc 224 R_OSPL_CLEAR_ERROR();
dkato 0:8970afa15acc 225 canvas2d.globalAlpha = 1.0f;
dkato 0:8970afa15acc 226 canvas2d.drawImage((const graphics_image_t*)image_new,
dkato 0:8970afa15acc 227 ((int_t)(frmbuf_info->width * scroll) - frmbuf_info->width) * SCROLL_DIRECTION, 0,
dkato 0:8970afa15acc 228 frmbuf_info->width, frmbuf_info->height);
dkato 0:8970afa15acc 229 R_OSPL_CLEAR_ERROR();
dkato 0:8970afa15acc 230 /* Complete drawing */
dkato 0:8970afa15acc 231 R_GRAPHICS_Finish(canvas2d.c_LanguageContext);
dkato 0:8970afa15acc 232 Update_LCD_Display(frmbuf_info);
dkato 0:8970afa15acc 233 }
dkato 0:8970afa15acc 234
dkato 0:8970afa15acc 235 static void draw_image_dissolve(frame_buffer_t* frmbuf_info, const graphics_image_t* image_last,
dkato 0:8970afa15acc 236 const graphics_image_t* image_new, float32_t alpha) {
dkato 0:8970afa15acc 237 Swap_FrameBuffer(frmbuf_info);
dkato 0:8970afa15acc 238 /* Clear */
dkato 0:8970afa15acc 239 canvas2d.clearRect(0, 0, frmbuf_info->width, frmbuf_info->height);
dkato 0:8970afa15acc 240 /* Draw a image */
dkato 0:8970afa15acc 241 canvas2d.globalAlpha = 1.0f - alpha;
dkato 0:8970afa15acc 242 canvas2d.drawImage((const graphics_image_t*)image_last, 0, 0, frmbuf_info->width, frmbuf_info->height);
dkato 0:8970afa15acc 243 R_OSPL_CLEAR_ERROR();
dkato 0:8970afa15acc 244 canvas2d.globalAlpha = alpha;
dkato 0:8970afa15acc 245 canvas2d.drawImage((const graphics_image_t*)image_new, 0, 0, frmbuf_info->width, frmbuf_info->height);
dkato 0:8970afa15acc 246 R_OSPL_CLEAR_ERROR();
dkato 0:8970afa15acc 247 /* Complete drawing */
dkato 0:8970afa15acc 248 R_GRAPHICS_Finish(canvas2d.c_LanguageContext);
dkato 0:8970afa15acc 249 Update_LCD_Display(frmbuf_info);
dkato 0:8970afa15acc 250 }
dkato 0:8970afa15acc 251
dkato 0:8970afa15acc 252 int main(void) {
dkato 0:8970afa15acc 253 errnum_t err;
dkato 0:8970afa15acc 254 Canvas2D_ContextConfigClass config;
dkato 0:8970afa15acc 255
dkato 0:8970afa15acc 256 memset(user_frame_buffer, 0, sizeof(user_frame_buffer));
dkato 0:8970afa15acc 257 memset(user_frame_buffer2, 0, sizeof(user_frame_buffer2));
dkato 0:8970afa15acc 258 frame_buffer_info.buffer_address[0] = user_frame_buffer;
dkato 0:8970afa15acc 259 frame_buffer_info.buffer_address[1] = user_frame_buffer2;
dkato 0:8970afa15acc 260 frame_buffer_info.buffer_count = 2;
dkato 0:8970afa15acc 261 frame_buffer_info.show_buffer_index = 0;
dkato 0:8970afa15acc 262 frame_buffer_info.draw_buffer_index = 0;
dkato 0:8970afa15acc 263 frame_buffer_info.width = LCD_PIXEL_WIDTH;
dkato 0:8970afa15acc 264 frame_buffer_info.byte_per_pixel = FRAME_BUFFER_BYTE_PER_PIXEL;
dkato 0:8970afa15acc 265 frame_buffer_info.stride = LCD_PIXEL_WIDTH * FRAME_BUFFER_BYTE_PER_PIXEL;
dkato 0:8970afa15acc 266 frame_buffer_info.height = LCD_PIXEL_HEIGHT;
dkato 0:8970afa15acc 267 frame_buffer_info.pixel_format = PIXEL_FORMAT_RGB565;
dkato 0:8970afa15acc 268 Init_LCD_Display(frame_buffer_info.buffer_address[0]);
dkato 0:8970afa15acc 269
dkato 0:8970afa15acc 270 config.frame_buffer = &frame_buffer_info;
dkato 0:8970afa15acc 271 canvas2d = R_RGA_New_Canvas2D_ContextClass(config);
dkato 0:8970afa15acc 272 err = R_OSPL_GetErrNum();
dkato 0:8970afa15acc 273 if (err != 0) {
dkato 0:8970afa15acc 274 printf("Line %d, error %d\n", __LINE__, err);
dkato 0:8970afa15acc 275 while (1);
dkato 0:8970afa15acc 276 }
dkato 0:8970afa15acc 277 Start_LCD_Display();
dkato 0:8970afa15acc 278
dkato 0:8970afa15acc 279 SDFileSystem sd(P8_5, P8_6, P8_3, P8_4, "sd");
dkato 0:8970afa15acc 280 FILE * fp = NULL;
dkato 0:8970afa15acc 281 DIR * d = NULL;
dkato 0:8970afa15acc 282 char file_path[sizeof(FLD_PATH) + FILE_NAME_LEN];
dkato 0:8970afa15acc 283 int jpeg_toggle = 0;
dkato 0:8970afa15acc 284 bool first_view = true;
dkato 0:8970afa15acc 285 size_t ret;
dkato 0:8970afa15acc 286
dkato 0:8970afa15acc 287 while (1) {
dkato 0:8970afa15acc 288 // file search
dkato 0:8970afa15acc 289 if (d == NULL) {
dkato 0:8970afa15acc 290 d = opendir(FLD_PATH);
dkato 0:8970afa15acc 291 }
dkato 0:8970afa15acc 292 struct dirent * p;
dkato 0:8970afa15acc 293 while ((p = readdir(d)) != NULL) {
dkato 0:8970afa15acc 294 size_t len = strlen(p->d_name);
dkato 0:8970afa15acc 295 if ((len > 4) && (len < FILE_NAME_LEN)
dkato 0:8970afa15acc 296 && (strncasecmp(&p->d_name[len - 4], ".jpg", 4) == 0)) {
dkato 0:8970afa15acc 297 strcpy(file_path, FLD_PATH);
dkato 0:8970afa15acc 298 strcat(file_path, p->d_name);
dkato 0:8970afa15acc 299 fp = fopen(file_path, "r");
dkato 0:8970afa15acc 300 ret = fread(&JpegBuffer[jpeg_toggle], sizeof(char), MAX_JPEG_SIZE, fp);
dkato 0:8970afa15acc 301 fclose(fp);
dkato 0:8970afa15acc 302 if (ret < MAX_JPEG_SIZE) {
dkato 0:8970afa15acc 303 if (first_view != false) {
dkato 0:8970afa15acc 304 // Effect NONE
dkato 0:8970afa15acc 305 first_view = false;
dkato 0:8970afa15acc 306 draw_image(&frame_buffer_info, (const graphics_image_t*)&JpegBuffer[jpeg_toggle]);
dkato 0:8970afa15acc 307 } else {
dkato 0:8970afa15acc 308 bool key_press = false;
dkato 0:8970afa15acc 309 // Wait timeout or key press
dkato 0:8970afa15acc 310 for (int i = 0; i < WAIT_TIME; i += 100) {
dkato 0:8970afa15acc 311 if (button == 0) {
dkato 0:8970afa15acc 312 key_press = true;
dkato 0:8970afa15acc 313 break;
dkato 0:8970afa15acc 314 }
dkato 0:8970afa15acc 315 Thread::wait(100);
dkato 0:8970afa15acc 316 }
dkato 0:8970afa15acc 317 if (key_press == false) {
dkato 0:8970afa15acc 318 // Effect DISSOLVE
dkato 0:8970afa15acc 319 for (int i = 1; i <= DISSOLVE_STEP_NUM; i++) {
dkato 0:8970afa15acc 320 draw_image_dissolve(&frame_buffer_info,
dkato 0:8970afa15acc 321 (const graphics_image_t*)&JpegBuffer[!jpeg_toggle],
dkato 0:8970afa15acc 322 (const graphics_image_t*)&JpegBuffer[jpeg_toggle],
dkato 0:8970afa15acc 323 (float32_t)i / (float32_t)DISSOLVE_STEP_NUM);
dkato 0:8970afa15acc 324 }
dkato 0:8970afa15acc 325 } else {
dkato 0:8970afa15acc 326 // Effect SCROLL
dkato 0:8970afa15acc 327 for (int i = 1; i <= SCROLL_STEP_NUM; i++) {
dkato 0:8970afa15acc 328 draw_image_scroll(&frame_buffer_info,
dkato 0:8970afa15acc 329 (const graphics_image_t*)&JpegBuffer[!jpeg_toggle],
dkato 0:8970afa15acc 330 (const graphics_image_t*)&JpegBuffer[jpeg_toggle],
dkato 0:8970afa15acc 331 (float32_t)i / (float32_t)SCROLL_STEP_NUM);
dkato 0:8970afa15acc 332 }
dkato 0:8970afa15acc 333 }
dkato 0:8970afa15acc 334 }
dkato 0:8970afa15acc 335 jpeg_toggle = !jpeg_toggle;
dkato 0:8970afa15acc 336 }
dkato 0:8970afa15acc 337 break;
dkato 0:8970afa15acc 338 }
dkato 0:8970afa15acc 339 }
dkato 0:8970afa15acc 340 if (p == NULL) {
dkato 0:8970afa15acc 341 closedir(d);
dkato 0:8970afa15acc 342 d = NULL;
dkato 0:8970afa15acc 343 }
dkato 0:8970afa15acc 344 }
dkato 0:8970afa15acc 345 }