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