MY TRAIAL (1)

Dependencies:   FATFileSystem GR-PEACH_video GraphicsFramework LCD_shield_config R_BSP mbed-rtos mbed

Fork of GR-PEACH_NTSC_in_2ch_MOD_try by Hirofumi Inomata

I put an OVERVIEW in the blow URL. https://developer.mbed.org/users/digiponta/notebook/my-trial-ar--vr-2-eyes-display-goes-by-a-gr-peach/

Committer:
digiponta
Date:
Thu Sep 08 12:18:45 2016 +0000
Revision:
3:1daadbe91b49
Parent:
2:e59e938472ac
Child:
4:2bea25cf1883
?????????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dkato 0:f8cb87301ad8 1 #include "mbed.h"
digiponta 3:1daadbe91b49 2 #include "SDFileSystem.h"
digiponta 3:1daadbe91b49 3 #include "JPEG_Converter.h"
dkato 0:f8cb87301ad8 4 #include "DisplayBace.h"
dkato 0:f8cb87301ad8 5 #include "rtos.h"
dkato 0:f8cb87301ad8 6
digiponta 3:1daadbe91b49 7 DigitalOut led1(LED1);
digiponta 3:1daadbe91b49 8 Serial pc(USBTX, USBRX);
digiponta 3:1daadbe91b49 9 SDFileSystem sd(P8_5, P8_6, P8_3, P8_4, "sd");
digiponta 3:1daadbe91b49 10
digiponta 3:1daadbe91b49 11 DigitalIn sw0(USER_BUTTON0);
digiponta 3:1daadbe91b49 12 // DigitalIn sw1(P6_1);
digiponta 3:1daadbe91b49 13 DigitalIn sw2(P4_0);
digiponta 3:1daadbe91b49 14 DigitalIn sw3(P2_13);
digiponta 3:1daadbe91b49 15
digiponta 3:1daadbe91b49 16 int prev_sw0 = 1;
digiponta 3:1daadbe91b49 17 // int prev_sw1 = 1;
digiponta 3:1daadbe91b49 18 int prev_sw2 = 1;
digiponta 3:1daadbe91b49 19 int prev_sw3 = 1;
digiponta 3:1daadbe91b49 20 int mode = 0;
digiponta 3:1daadbe91b49 21 char fname[64];
digiponta 3:1daadbe91b49 22
digiponta 3:1daadbe91b49 23 unsigned int imgCnt = 0;
digiponta 3:1daadbe91b49 24 unsigned int viewCnt = 0;
digiponta 3:1daadbe91b49 25
digiponta 3:1daadbe91b49 26
dkato 0:f8cb87301ad8 27 #define VIDEO_YCBCR422 (0)
dkato 0:f8cb87301ad8 28 #define VIDEO_RGB888 (1)
dkato 0:f8cb87301ad8 29 #define VIDEO_RGB565 (2)
dkato 0:f8cb87301ad8 30
dkato 0:f8cb87301ad8 31 /**** User Selection *********/
dkato 0:f8cb87301ad8 32 /** Camera setting **/
dkato 0:f8cb87301ad8 33 #define VIDEO_INPUT_FORMAT (VIDEO_YCBCR422) /* Select VIDEO_YCBCR422 or VIDEO_RGB888 or VIDEO_RGB565 */
dkato 0:f8cb87301ad8 34 #define VIDEO_PAL (0) /* Select 0(NTSC) or 1(PAL) If selecting VIDEO_CVBS, this parameter is not referenced.) */
dkato 0:f8cb87301ad8 35 /** LCD setting **/
dkato 0:f8cb87301ad8 36 #define LCD_TYPE (0) /* Select 0(4.3inch) or 1(7.1inch) */
dkato 0:f8cb87301ad8 37 /*****************************/
dkato 0:f8cb87301ad8 38
dkato 0:f8cb87301ad8 39 /** LCD shield config **/
dkato 0:f8cb87301ad8 40 #if (LCD_TYPE == 0)
dkato 0:f8cb87301ad8 41 #include "LCD_shield_config_4_3inch.h"
dkato 0:f8cb87301ad8 42 #else
dkato 0:f8cb87301ad8 43 #include "LCD_shield_config_7_1inch.h"
dkato 0:f8cb87301ad8 44 #endif
dkato 0:f8cb87301ad8 45
dkato 0:f8cb87301ad8 46 /** Video and Grapics (GRAPHICS_LAYER_0) parameter **/
dkato 0:f8cb87301ad8 47 /* NTSC or PAL */
dkato 0:f8cb87301ad8 48 #if VIDEO_PAL == 0
dkato 0:f8cb87301ad8 49 #define COL_SYS (DisplayBase::COL_SYS_NTSC_358)
dkato 0:f8cb87301ad8 50 #else
dkato 0:f8cb87301ad8 51 #define COL_SYS (DisplayBase::COL_SYS_PAL_443)
dkato 0:f8cb87301ad8 52 #endif
dkato 0:f8cb87301ad8 53
dkato 0:f8cb87301ad8 54 /* Video input and LCD layer 0 output */
dkato 0:f8cb87301ad8 55 #if VIDEO_INPUT_FORMAT == VIDEO_YCBCR422
dkato 0:f8cb87301ad8 56 #define VIDEO_FORMAT (DisplayBase::VIDEO_FORMAT_YCBCR422)
dkato 0:f8cb87301ad8 57 #define GRAPHICS_FORMAT (DisplayBase::GRAPHICS_FORMAT_YCBCR422)
dkato 0:f8cb87301ad8 58 #define WR_RD_WRSWA (DisplayBase::WR_RD_WRSWA_NON)
dkato 0:f8cb87301ad8 59 #elif VIDEO_INPUT_FORMAT == VIDEO_RGB565
dkato 0:f8cb87301ad8 60 #define VIDEO_FORMAT (DisplayBase::VIDEO_FORMAT_RGB565)
dkato 0:f8cb87301ad8 61 #define GRAPHICS_FORMAT (DisplayBase::GRAPHICS_FORMAT_RGB565)
dkato 0:f8cb87301ad8 62 #define WR_RD_WRSWA (DisplayBase::WR_RD_WRSWA_32_16BIT)
dkato 0:f8cb87301ad8 63 #else
dkato 0:f8cb87301ad8 64 #define VIDEO_FORMAT (DisplayBase::VIDEO_FORMAT_RGB888)
dkato 0:f8cb87301ad8 65 #define GRAPHICS_FORMAT (DisplayBase::GRAPHICS_FORMAT_RGB888)
dkato 0:f8cb87301ad8 66 #define WR_RD_WRSWA (DisplayBase::WR_RD_WRSWA_32BIT)
dkato 0:f8cb87301ad8 67 #endif
dkato 0:f8cb87301ad8 68
dkato 0:f8cb87301ad8 69 /*! Frame buffer stride: Frame buffer stride should be set to a multiple of 32 or 128
dkato 0:f8cb87301ad8 70 in accordance with the frame buffer burst transfer mode. */
dkato 0:f8cb87301ad8 71 /* FRAME BUFFER Parameter GRAPHICS_LAYER_0 */
dkato 0:f8cb87301ad8 72 #if ( VIDEO_INPUT_FORMAT == VIDEO_YCBCR422 || VIDEO_INPUT_FORMAT == VIDEO_RGB565 )
dkato 0:f8cb87301ad8 73 #define FRAME_BUFFER_BYTE_PER_PIXEL (2u)
dkato 0:f8cb87301ad8 74 #else
dkato 0:f8cb87301ad8 75 #define FRAME_BUFFER_BYTE_PER_PIXEL (4u)
dkato 0:f8cb87301ad8 76 #endif
dkato 0:f8cb87301ad8 77 #define FRAME_BUFFER_STRIDE (((LCD_PIXEL_WIDTH * FRAME_BUFFER_BYTE_PER_PIXEL) + 31u) & ~31u)
dkato 0:f8cb87301ad8 78
dkato 0:f8cb87301ad8 79 static DisplayBase Display;
dkato 0:f8cb87301ad8 80 static DigitalOut lcd_pwon(P7_15);
dkato 0:f8cb87301ad8 81 static DigitalOut lcd_blon(P8_1);
dkato 0:f8cb87301ad8 82 static PwmOut lcd_cntrst(P8_15);
dkato 0:f8cb87301ad8 83 static DigitalOut led_blue(LED_BLUE);
dkato 0:f8cb87301ad8 84
dkato 0:f8cb87301ad8 85 #if defined(__ICCARM__)
dkato 0:f8cb87301ad8 86 /* 32 bytes aligned */
dkato 0:f8cb87301ad8 87 #pragma data_alignment=32
dkato 0:f8cb87301ad8 88 static uint8_t user_frame_buffer0[FRAME_BUFFER_STRIDE * LCD_PIXEL_HEIGHT];
digiponta 3:1daadbe91b49 89 static uint8_t user_frame_buffer1[FRAME_BUFFER_STRIDE * LCD_PIXEL_HEIGHT];
dkato 0:f8cb87301ad8 90 #pragma data_alignment=4
dkato 0:f8cb87301ad8 91 #else
dkato 0:f8cb87301ad8 92 /* 32 bytes aligned */
dkato 0:f8cb87301ad8 93 static uint8_t user_frame_buffer0[FRAME_BUFFER_STRIDE * LCD_PIXEL_HEIGHT]__attribute((aligned(32)));
digiponta 3:1daadbe91b49 94 static uint8_t user_frame_buffer1[FRAME_BUFFER_STRIDE * LCD_PIXEL_HEIGHT]__attribute((aligned(32)));
dkato 0:f8cb87301ad8 95 #endif
dkato 0:f8cb87301ad8 96 static bool graphics_init_end = false;
dkato 0:f8cb87301ad8 97
dkato 0:f8cb87301ad8 98 /****** LCD ******/
dkato 0:f8cb87301ad8 99 static void Init_LCD_Display(void) {
dkato 0:f8cb87301ad8 100 DisplayBase::graphics_error_t error;
dkato 0:f8cb87301ad8 101 DisplayBase::lcd_config_t lcd_config;
dkato 0:f8cb87301ad8 102 PinName lvds_pin[8] = {
dkato 0:f8cb87301ad8 103 /* data pin */
dkato 0:f8cb87301ad8 104 P5_7, P5_6, P5_5, P5_4, P5_3, P5_2, P5_1, P5_0
dkato 0:f8cb87301ad8 105 };
dkato 0:f8cb87301ad8 106
dkato 0:f8cb87301ad8 107 lcd_pwon = 0;
dkato 0:f8cb87301ad8 108 lcd_blon = 0;
dkato 0:f8cb87301ad8 109 Thread::wait(100);
dkato 0:f8cb87301ad8 110 lcd_pwon = 1;
dkato 0:f8cb87301ad8 111 lcd_blon = 1;
dkato 0:f8cb87301ad8 112
dkato 0:f8cb87301ad8 113 Display.Graphics_Lvds_Port_Init(lvds_pin, 8);
dkato 0:f8cb87301ad8 114
dkato 0:f8cb87301ad8 115 /* Graphics initialization process */
dkato 0:f8cb87301ad8 116 lcd_config = LcdCfgTbl_LCD_shield;
dkato 0:f8cb87301ad8 117 error = Display.Graphics_init(&lcd_config);
dkato 0:f8cb87301ad8 118 if (error != DisplayBase::GRAPHICS_OK) {
dkato 0:f8cb87301ad8 119 printf("Line %d, error %d\n", __LINE__, error);
dkato 0:f8cb87301ad8 120 mbed_die();
dkato 0:f8cb87301ad8 121 }
dkato 0:f8cb87301ad8 122 graphics_init_end = true;
dkato 0:f8cb87301ad8 123 }
dkato 0:f8cb87301ad8 124
dkato 0:f8cb87301ad8 125 static void Start_LCD_Display(uint8_t * p_buf) {
dkato 0:f8cb87301ad8 126 DisplayBase::rect_t rect;
dkato 0:f8cb87301ad8 127
dkato 0:f8cb87301ad8 128 rect.vs = 0;
dkato 0:f8cb87301ad8 129 rect.vw = LCD_PIXEL_HEIGHT;
dkato 0:f8cb87301ad8 130 rect.hs = 0;
dkato 0:f8cb87301ad8 131 rect.hw = LCD_PIXEL_WIDTH;
dkato 0:f8cb87301ad8 132 Display.Graphics_Read_Setting(
dkato 0:f8cb87301ad8 133 DisplayBase::GRAPHICS_LAYER_0,
dkato 0:f8cb87301ad8 134 (void *)p_buf,
dkato 0:f8cb87301ad8 135 FRAME_BUFFER_STRIDE,
dkato 0:f8cb87301ad8 136 GRAPHICS_FORMAT,
dkato 0:f8cb87301ad8 137 WR_RD_WRSWA,
dkato 0:f8cb87301ad8 138 &rect
dkato 0:f8cb87301ad8 139 );
dkato 0:f8cb87301ad8 140 Display.Graphics_Start(DisplayBase::GRAPHICS_LAYER_0);
dkato 0:f8cb87301ad8 141 }
dkato 0:f8cb87301ad8 142
digiponta 3:1daadbe91b49 143 static volatile int32_t vfield_count_0 = 0;
digiponta 3:1daadbe91b49 144 static volatile int32_t vfield_count_1 = 0;
digiponta 3:1daadbe91b49 145
digiponta 3:1daadbe91b49 146 /** Video and Grapics (GRAPHICS_LAYER_0) parameter **/
digiponta 3:1daadbe91b49 147 /* video input */
digiponta 3:1daadbe91b49 148 #define VIDEO_INPUT_CH_0 (DisplayBase::VIDEO_INPUT_CHANNEL_0)
digiponta 3:1daadbe91b49 149 #define VIDEO_INT_TYPE_0 (DisplayBase::INT_TYPE_S0_VFIELD)
digiponta 3:1daadbe91b49 150 #define VIDEO_INPUT_CH_1 (DisplayBase::VIDEO_INPUT_CHANNEL_1)
digiponta 3:1daadbe91b49 151 #define VIDEO_INT_TYPE_1 (DisplayBase::INT_TYPE_S1_VFIELD)
digiponta 3:1daadbe91b49 152
digiponta 3:1daadbe91b49 153 static void IntCallbackFunc_Vfield_0(DisplayBase::int_type_t int_type) {
digiponta 3:1daadbe91b49 154 /* Interrupt callback function */
digiponta 3:1daadbe91b49 155 if (vfield_count_0 == 0) {
digiponta 3:1daadbe91b49 156 vfield_count_0 = 1;
digiponta 3:1daadbe91b49 157 } else {
digiponta 3:1daadbe91b49 158 ;
digiponta 3:1daadbe91b49 159 }
digiponta 3:1daadbe91b49 160 }
digiponta 3:1daadbe91b49 161 static void IntCallbackFunc_Vfield_1(DisplayBase::int_type_t int_type) {
digiponta 3:1daadbe91b49 162 /* Interrupt callback function */
digiponta 3:1daadbe91b49 163 if (vfield_count_1 == 0) {
digiponta 3:1daadbe91b49 164 vfield_count_1 = 1;
digiponta 3:1daadbe91b49 165 } else {
digiponta 3:1daadbe91b49 166 ;
digiponta 3:1daadbe91b49 167 }
digiponta 3:1daadbe91b49 168 }
digiponta 3:1daadbe91b49 169
digiponta 3:1daadbe91b49 170
dkato 0:f8cb87301ad8 171 /****** Video ******/
dkato 0:f8cb87301ad8 172 static void Init_Video(void) {
dkato 0:f8cb87301ad8 173 DisplayBase::graphics_error_t error;
dkato 0:f8cb87301ad8 174
dkato 0:f8cb87301ad8 175 /* Graphics initialization process */
dkato 0:f8cb87301ad8 176 if (graphics_init_end == false) {
dkato 0:f8cb87301ad8 177 /* When not initializing LCD, this processing is needed. */
dkato 0:f8cb87301ad8 178 error = Display.Graphics_init(NULL);
dkato 0:f8cb87301ad8 179 if (error != DisplayBase::GRAPHICS_OK) {
dkato 0:f8cb87301ad8 180 printf("Line %d, error %d\n", __LINE__, error);
dkato 0:f8cb87301ad8 181 mbed_die();
dkato 0:f8cb87301ad8 182 }
dkato 0:f8cb87301ad8 183 graphics_init_end = true;
dkato 0:f8cb87301ad8 184 }
dkato 0:f8cb87301ad8 185
dkato 0:f8cb87301ad8 186 error = Display.Graphics_Video_init( DisplayBase::INPUT_SEL_VDEC, NULL);
dkato 0:f8cb87301ad8 187 if( error != DisplayBase::GRAPHICS_OK ) {
dkato 0:f8cb87301ad8 188 printf("Line %d, error %d\n", __LINE__, error);
dkato 0:f8cb87301ad8 189 mbed_die();
dkato 0:f8cb87301ad8 190 }
digiponta 3:1daadbe91b49 191
digiponta 3:1daadbe91b49 192 /* Interrupt callback function setting (Field end signal for recording function in scaler 0) */
digiponta 3:1daadbe91b49 193 error = Display.Graphics_Irq_Handler_Set(VIDEO_INT_TYPE_0, 0, IntCallbackFunc_Vfield_0);
digiponta 3:1daadbe91b49 194 if (error != DisplayBase::GRAPHICS_OK) {
digiponta 3:1daadbe91b49 195 printf("Line %d, error %d\n", __LINE__, error);
digiponta 3:1daadbe91b49 196 mbed_die();
digiponta 3:1daadbe91b49 197 }
digiponta 3:1daadbe91b49 198 /* Interrupt callback function setting (Field end signal for recording function in scaler 0) */
digiponta 3:1daadbe91b49 199 error = Display.Graphics_Irq_Handler_Set(VIDEO_INT_TYPE_1, 0, IntCallbackFunc_Vfield_1);
digiponta 3:1daadbe91b49 200 if (error != DisplayBase::GRAPHICS_OK) {
digiponta 3:1daadbe91b49 201 printf("Line %d, error %d\n", __LINE__, error);
digiponta 3:1daadbe91b49 202 mbed_die();
digiponta 3:1daadbe91b49 203 }
dkato 0:f8cb87301ad8 204 }
dkato 0:f8cb87301ad8 205
dkato 2:e59e938472ac 206 static void Start_Video(DisplayBase::video_input_channel_t ch, uint8_t * p_frame_buffer,
dkato 2:e59e938472ac 207 uint16_t pos_x, uint16_t pos_y, uint16_t width, uint16_t height) {
dkato 0:f8cb87301ad8 208 DisplayBase::graphics_error_t error;
dkato 2:e59e938472ac 209 uint8_t * p_buf;
dkato 2:e59e938472ac 210
dkato 2:e59e938472ac 211 p_buf = p_frame_buffer + (FRAME_BUFFER_BYTE_PER_PIXEL * pos_x) + (FRAME_BUFFER_STRIDE * pos_y);
dkato 0:f8cb87301ad8 212
dkato 0:f8cb87301ad8 213 /* Video capture setting (progressive form fixed) */
dkato 0:f8cb87301ad8 214 error = Display.Video_Write_Setting(
dkato 0:f8cb87301ad8 215 ch,
dkato 0:f8cb87301ad8 216 COL_SYS,
dkato 0:f8cb87301ad8 217 p_buf,
dkato 0:f8cb87301ad8 218 FRAME_BUFFER_STRIDE,
dkato 0:f8cb87301ad8 219 VIDEO_FORMAT,
dkato 0:f8cb87301ad8 220 WR_RD_WRSWA,
dkato 2:e59e938472ac 221 (height & ~7u), /* A multiple of 8 */
dkato 2:e59e938472ac 222 (width & ~15u) /* A multiple of 16 */
dkato 0:f8cb87301ad8 223 );
dkato 0:f8cb87301ad8 224 if (error != DisplayBase::GRAPHICS_OK) {
dkato 0:f8cb87301ad8 225 printf("Line %d, error %d\n", __LINE__, error);
dkato 0:f8cb87301ad8 226 mbed_die();
dkato 0:f8cb87301ad8 227 }
dkato 0:f8cb87301ad8 228
dkato 0:f8cb87301ad8 229 /* Video write process start */
dkato 0:f8cb87301ad8 230 error = Display.Video_Start(ch);
dkato 0:f8cb87301ad8 231 if (error != DisplayBase::GRAPHICS_OK) {
dkato 0:f8cb87301ad8 232 printf("Line %d, error %d\n", __LINE__, error);
dkato 0:f8cb87301ad8 233 mbed_die();
dkato 0:f8cb87301ad8 234 }
dkato 0:f8cb87301ad8 235
dkato 0:f8cb87301ad8 236 /* Video write process stop */
dkato 0:f8cb87301ad8 237 error = Display.Video_Stop(ch);
dkato 0:f8cb87301ad8 238 if (error != DisplayBase::GRAPHICS_OK) {
dkato 0:f8cb87301ad8 239 printf("Line %d, error %d\n", __LINE__, error);
dkato 0:f8cb87301ad8 240 mbed_die();
dkato 0:f8cb87301ad8 241 }
dkato 0:f8cb87301ad8 242
dkato 0:f8cb87301ad8 243 /* Video write process start */
dkato 0:f8cb87301ad8 244 error = Display.Video_Start(ch);
dkato 0:f8cb87301ad8 245 if (error != DisplayBase::GRAPHICS_OK) {
dkato 0:f8cb87301ad8 246 printf("Line %d, error %d\n", __LINE__, error);
dkato 0:f8cb87301ad8 247 mbed_die();
dkato 0:f8cb87301ad8 248 }
dkato 0:f8cb87301ad8 249 }
dkato 0:f8cb87301ad8 250
dkato 2:e59e938472ac 251 /****** Cache control ******/
dkato 2:e59e938472ac 252 static void dcache_clean(void * p_buf, uint32_t size){
dkato 2:e59e938472ac 253 uint32_t start_addr = (uint32_t)p_buf & 0xFFFFFFE0;
dkato 2:e59e938472ac 254 uint32_t end_addr = (uint32_t)p_buf + size;
dkato 2:e59e938472ac 255 uint32_t addr;
dkato 2:e59e938472ac 256
dkato 2:e59e938472ac 257 /* Data cache clean */
dkato 2:e59e938472ac 258 for (addr = start_addr; addr < end_addr; addr += 0x20) {
dkato 2:e59e938472ac 259 __v7_clean_dcache_mva((void *)addr);
dkato 2:e59e938472ac 260 }
dkato 2:e59e938472ac 261 }
dkato 2:e59e938472ac 262
dkato 0:f8cb87301ad8 263 /****** main ******/
dkato 0:f8cb87301ad8 264 int main(void) {
dkato 0:f8cb87301ad8 265 /* Initialization of LCD */
dkato 0:f8cb87301ad8 266 Init_LCD_Display(); /* When using LCD, please call before than Init_Video(). */
dkato 0:f8cb87301ad8 267
dkato 0:f8cb87301ad8 268 /* Initialization of Video */
dkato 0:f8cb87301ad8 269 Init_Video();
dkato 0:f8cb87301ad8 270
dkato 0:f8cb87301ad8 271 /* Initialization memory */
dkato 2:e59e938472ac 272 #if VIDEO_INPUT_FORMAT == VIDEO_YCBCR422
dkato 2:e59e938472ac 273 for (int i = 0; i < sizeof(user_frame_buffer0); i += 2) {
dkato 2:e59e938472ac 274 user_frame_buffer0[i + 0] = 0x10;
dkato 2:e59e938472ac 275 user_frame_buffer0[i + 1] = 0x80;
dkato 2:e59e938472ac 276 }
dkato 2:e59e938472ac 277 #else
dkato 2:e59e938472ac 278 memset(user_frame_buffer0, 0, sizeof(user_frame_buffer0));
dkato 2:e59e938472ac 279 #endif
dkato 2:e59e938472ac 280 dcache_clean(user_frame_buffer0, sizeof(user_frame_buffer0));
dkato 0:f8cb87301ad8 281
dkato 2:e59e938472ac 282 /* Start of Video ch0 */
dkato 2:e59e938472ac 283 Start_Video(
dkato 2:e59e938472ac 284 DisplayBase::VIDEO_INPUT_CHANNEL_0, /* Video input channe */
dkato 2:e59e938472ac 285 user_frame_buffer0, /* Output buffer */
dkato 2:e59e938472ac 286 0, /* The x coordinate of the upper-left corner */
dkato 2:e59e938472ac 287 0, /* The y coordinate of the upper-left corner */
dkato 2:e59e938472ac 288 (LCD_PIXEL_WIDTH / 2), /* width (A multiple of 16) */
dkato 2:e59e938472ac 289 LCD_PIXEL_HEIGHT /* height (A multiple of 8) */
dkato 2:e59e938472ac 290 );
dkato 2:e59e938472ac 291
dkato 2:e59e938472ac 292 /* Start of Video ch1 */
dkato 2:e59e938472ac 293 Start_Video(
dkato 2:e59e938472ac 294 DisplayBase::VIDEO_INPUT_CHANNEL_1, /* Video input channe */
dkato 2:e59e938472ac 295 user_frame_buffer0, /* Output buffer */
dkato 2:e59e938472ac 296 (LCD_PIXEL_WIDTH / 2), /* The x coordinate of the upper-left corner */
dkato 2:e59e938472ac 297 0, /* The y coordinate of the upper-left corner */
dkato 2:e59e938472ac 298 (LCD_PIXEL_WIDTH / 2), /* width (A multiple of 16) */
dkato 2:e59e938472ac 299 LCD_PIXEL_HEIGHT /* height (A multiple of 8) */
dkato 2:e59e938472ac 300 );
dkato 0:f8cb87301ad8 301
dkato 0:f8cb87301ad8 302 /* Start of LCD */
dkato 0:f8cb87301ad8 303 Start_LCD_Display(&user_frame_buffer0[0]);
dkato 0:f8cb87301ad8 304
dkato 0:f8cb87301ad8 305 /* Backlight on */
dkato 0:f8cb87301ad8 306 Thread::wait(200);
dkato 0:f8cb87301ad8 307 lcd_cntrst.write(1.0);
dkato 0:f8cb87301ad8 308
dkato 0:f8cb87301ad8 309 while (1) {
digiponta 3:1daadbe91b49 310 DisplayBase::graphics_error_t error;
digiponta 3:1daadbe91b49 311
dkato 0:f8cb87301ad8 312 led_blue = !led_blue;
digiponta 3:1daadbe91b49 313 Thread::wait(100);
digiponta 3:1daadbe91b49 314
digiponta 3:1daadbe91b49 315 if ((mode == 0) && (prev_sw0 != 0) && (sw0 == 0))
digiponta 3:1daadbe91b49 316 {
digiponta 3:1daadbe91b49 317 #if 1
digiponta 3:1daadbe91b49 318 /* Video write process stop */
digiponta 3:1daadbe91b49 319 error = Display.Video_Stop( DisplayBase::VIDEO_INPUT_CHANNEL_0 );
digiponta 3:1daadbe91b49 320 if (error != DisplayBase::GRAPHICS_OK) {
digiponta 3:1daadbe91b49 321 printf("Line %d, error %d\n", __LINE__, error);
digiponta 3:1daadbe91b49 322 mbed_die();
digiponta 3:1daadbe91b49 323 }
digiponta 3:1daadbe91b49 324 error = Display.Video_Stop( DisplayBase::VIDEO_INPUT_CHANNEL_1 );
digiponta 3:1daadbe91b49 325 if (error != DisplayBase::GRAPHICS_OK) {
digiponta 3:1daadbe91b49 326 printf("Line %d, error %d\n", __LINE__, error);
digiponta 3:1daadbe91b49 327 mbed_die();
digiponta 3:1daadbe91b49 328 }
digiponta 3:1daadbe91b49 329
digiponta 3:1daadbe91b49 330
digiponta 3:1daadbe91b49 331 #if 1
digiponta 3:1daadbe91b49 332 JPEG_Converter decoder;
digiponta 3:1daadbe91b49 333 JPEG_Converter::bitmap_buff_info_t aBitmapData;
digiponta 3:1daadbe91b49 334 size_t EncodeSize;
digiponta 3:1daadbe91b49 335
digiponta 3:1daadbe91b49 336 //YCbCr setting
digiponta 3:1daadbe91b49 337 aBitmapData.width = LCD_PIXEL_WIDTH;
digiponta 3:1daadbe91b49 338 aBitmapData.height = LCD_PIXEL_HEIGHT;
digiponta 3:1daadbe91b49 339 aBitmapData.format = JPEG_Converter::WR_RD_YCbCr422; //YCbCr[0] & ARGB8888[1] is 4byte, not RGB565[2] is 2byte
digiponta 3:1daadbe91b49 340 aBitmapData.buffer_address = (void *)user_frame_buffer0;
digiponta 3:1daadbe91b49 341 pc.printf("File encode start\n");
digiponta 3:1daadbe91b49 342 // JPEG_Converter
digiponta 3:1daadbe91b49 343
digiponta 3:1daadbe91b49 344 if (decoder.encode(&aBitmapData, user_frame_buffer1, &EncodeSize) == JPEG_Converter::JPEG_CONV_OK) {
digiponta 3:1daadbe91b49 345 pc.printf("File encode done %dbyte\n", EncodeSize);
digiponta 3:1daadbe91b49 346 pc.printf("File write start\n");
digiponta 3:1daadbe91b49 347 sprintf( fname, "/sd/img_%04d.jpg", imgCnt++ );
digiponta 3:1daadbe91b49 348 FILE *wr_fp = fopen( fname, "w");
digiponta 3:1daadbe91b49 349 fwrite( user_frame_buffer1, sizeof(char), EncodeSize, wr_fp);
digiponta 3:1daadbe91b49 350 fclose(wr_fp);
digiponta 3:1daadbe91b49 351 pc.printf("File write done\n");
digiponta 3:1daadbe91b49 352 led1 = 0;
digiponta 3:1daadbe91b49 353 } else {
digiponta 3:1daadbe91b49 354 pc.printf("Error:JCU encode error\n");
digiponta 3:1daadbe91b49 355 led1 = 0;
digiponta 3:1daadbe91b49 356 }
digiponta 3:1daadbe91b49 357 #endif
digiponta 3:1daadbe91b49 358
digiponta 3:1daadbe91b49 359 Thread::wait(500);
digiponta 3:1daadbe91b49 360
digiponta 3:1daadbe91b49 361 /* Video write process start */
digiponta 3:1daadbe91b49 362 error = Display.Video_Start( DisplayBase::VIDEO_INPUT_CHANNEL_0 );
digiponta 3:1daadbe91b49 363 if (error != DisplayBase::GRAPHICS_OK) {
digiponta 3:1daadbe91b49 364 printf("Line %d, error %d\n", __LINE__, error);
digiponta 3:1daadbe91b49 365 mbed_die();
digiponta 3:1daadbe91b49 366 }
digiponta 3:1daadbe91b49 367 /* Video write process start */
digiponta 3:1daadbe91b49 368 error = Display.Video_Start( DisplayBase::VIDEO_INPUT_CHANNEL_1 );
digiponta 3:1daadbe91b49 369 if (error != DisplayBase::GRAPHICS_OK) {
digiponta 3:1daadbe91b49 370 printf("Line %d, error %d\n", __LINE__, error);
digiponta 3:1daadbe91b49 371 mbed_die();
digiponta 3:1daadbe91b49 372 }
digiponta 3:1daadbe91b49 373 #endif
digiponta 3:1daadbe91b49 374 }
digiponta 3:1daadbe91b49 375
digiponta 3:1daadbe91b49 376 if (((mode == 0) || (mode == 1)) && (prev_sw2 != 0) && (sw2 == 0)) {
digiponta 3:1daadbe91b49 377 if ( mode == 0 ){
digiponta 3:1daadbe91b49 378
digiponta 3:1daadbe91b49 379 for( vfield_count_0=0; vfield_count_0 == 0; ) {
digiponta 3:1daadbe91b49 380 }
digiponta 3:1daadbe91b49 381 /* Video write process stop */
digiponta 3:1daadbe91b49 382 error = Display.Video_Stop( DisplayBase::VIDEO_INPUT_CHANNEL_0 );
digiponta 3:1daadbe91b49 383 if (error != DisplayBase::GRAPHICS_OK) {
digiponta 3:1daadbe91b49 384 printf("Line %d, error %d\n", __LINE__, error);
digiponta 3:1daadbe91b49 385 mbed_die();
digiponta 3:1daadbe91b49 386 }
digiponta 3:1daadbe91b49 387 for( vfield_count_1=0; vfield_count_1 == 0; ) {
digiponta 3:1daadbe91b49 388 }
digiponta 3:1daadbe91b49 389 error = Display.Video_Stop( DisplayBase::VIDEO_INPUT_CHANNEL_1 );
digiponta 3:1daadbe91b49 390 if (error != DisplayBase::GRAPHICS_OK) {
digiponta 3:1daadbe91b49 391 printf("Line %d, error %d\n", __LINE__, error);
digiponta 3:1daadbe91b49 392 mbed_die();
digiponta 3:1daadbe91b49 393 }
digiponta 3:1daadbe91b49 394 }
digiponta 3:1daadbe91b49 395
digiponta 3:1daadbe91b49 396 sprintf( fname, "/sd/img_%04d.jpg", viewCnt++ );
digiponta 3:1daadbe91b49 397 if ( viewCnt >= imgCnt ) viewCnt = 0;
digiponta 3:1daadbe91b49 398 pc.printf("File write start\n");
digiponta 3:1daadbe91b49 399 FILE *rd_fp = fopen( fname, "r" );
digiponta 3:1daadbe91b49 400 for( long i=0; i < sizeof(user_frame_buffer1) ;i++) {
digiponta 3:1daadbe91b49 401 char cc = getc( rd_fp );
digiponta 3:1daadbe91b49 402 if ( cc == EOF ) break;
digiponta 3:1daadbe91b49 403 user_frame_buffer1[i] = (unsigned char)cc;
digiponta 3:1daadbe91b49 404
digiponta 3:1daadbe91b49 405 // size_t len = fread(user_frame_buffer1, sizeof(char), (LCD_PIXEL_WIDTH * LCD_PIXEL_HEIGHT * 4), rd_fp);
digiponta 3:1daadbe91b49 406 }
digiponta 3:1daadbe91b49 407 fclose(rd_fp);
digiponta 3:1daadbe91b49 408 pc.printf("File write done\n");
digiponta 3:1daadbe91b49 409
digiponta 3:1daadbe91b49 410 JPEG_Converter decoder;
digiponta 3:1daadbe91b49 411 JPEG_Converter::bitmap_buff_info_t aBitmapData;
digiponta 3:1daadbe91b49 412 // size_t EncodeSize;
digiponta 3:1daadbe91b49 413
digiponta 3:1daadbe91b49 414 //YCbCr setting
digiponta 3:1daadbe91b49 415 aBitmapData.width = LCD_PIXEL_WIDTH;
digiponta 3:1daadbe91b49 416 aBitmapData.height = LCD_PIXEL_HEIGHT;
digiponta 3:1daadbe91b49 417 aBitmapData.format = JPEG_Converter::WR_RD_YCbCr422; //YCbCr[0] & ARGB8888[1] is 4byte, not RGB565[2] is 2byte
digiponta 3:1daadbe91b49 418 aBitmapData.buffer_address = (void *)user_frame_buffer0;
digiponta 3:1daadbe91b49 419 pc.printf("File decode start\n");
digiponta 3:1daadbe91b49 420 // JPEG_Converter
digiponta 3:1daadbe91b49 421 if (decoder.decode((void *)user_frame_buffer1, &aBitmapData) == JPEG_Converter::JPEG_CONV_OK) {
digiponta 3:1daadbe91b49 422 pc.printf("File decode done %dbyte\n", (LCD_PIXEL_WIDTH * LCD_PIXEL_HEIGHT * 4));
digiponta 3:1daadbe91b49 423 led1 = 0;
digiponta 3:1daadbe91b49 424 } else {
digiponta 3:1daadbe91b49 425 pc.printf("Error:JCU decode error\n");
digiponta 3:1daadbe91b49 426 led1 = 0;
digiponta 3:1daadbe91b49 427 }
digiponta 3:1daadbe91b49 428
digiponta 3:1daadbe91b49 429 mode = 1;
digiponta 3:1daadbe91b49 430 }
digiponta 3:1daadbe91b49 431
digiponta 3:1daadbe91b49 432 if ( (mode == 1) && (prev_sw3 != 0) && (sw3 == 0)) {
digiponta 3:1daadbe91b49 433
digiponta 3:1daadbe91b49 434 /* Video write process start */
digiponta 3:1daadbe91b49 435 error = Display.Video_Start( DisplayBase::VIDEO_INPUT_CHANNEL_0 );
digiponta 3:1daadbe91b49 436 if (error != DisplayBase::GRAPHICS_OK) {
digiponta 3:1daadbe91b49 437 printf("Line %d, error %d\n", __LINE__, error);
digiponta 3:1daadbe91b49 438 mbed_die();
digiponta 3:1daadbe91b49 439 }
digiponta 3:1daadbe91b49 440 /* Video write process start */
digiponta 3:1daadbe91b49 441 error = Display.Video_Start( DisplayBase::VIDEO_INPUT_CHANNEL_1 );
digiponta 3:1daadbe91b49 442 if (error != DisplayBase::GRAPHICS_OK) {
digiponta 3:1daadbe91b49 443 printf("Line %d, error %d\n", __LINE__, error);
digiponta 3:1daadbe91b49 444 mbed_die();
digiponta 3:1daadbe91b49 445 }
digiponta 3:1daadbe91b49 446
digiponta 3:1daadbe91b49 447 mode = 0; //
digiponta 3:1daadbe91b49 448 }
digiponta 3:1daadbe91b49 449
digiponta 3:1daadbe91b49 450
digiponta 3:1daadbe91b49 451
digiponta 3:1daadbe91b49 452 prev_sw0 = sw0;
digiponta 3:1daadbe91b49 453 // prev_sw1 = sw1;
digiponta 3:1daadbe91b49 454 prev_sw2 = sw2;
digiponta 3:1daadbe91b49 455 prev_sw3 = sw3;
dkato 0:f8cb87301ad8 456 }
dkato 0:f8cb87301ad8 457 }