DisplayApp-Base
Dependencies: mbed-os-lychee DisplayApp_Base
main.cpp@4:b75d4cd51099, 2018-11-21 (annotated)
- Committer:
- yagyag
- Date:
- Wed Nov 21 02:29:46 2018 +0000
- Revision:
- 4:b75d4cd51099
- Parent:
- 3:6289f0adb6c9
Display Lesson
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
dkato | 0:78f7f7683a42 | 1 | #include "mbed.h" |
dkato | 0:78f7f7683a42 | 2 | #include "EasyAttach_CameraAndLCD.h" |
dkato | 0:78f7f7683a42 | 3 | #include "JPEG_Converter.h" |
dkato | 0:78f7f7683a42 | 4 | #include "dcache-control.h" |
dkato | 0:78f7f7683a42 | 5 | #include "DisplayApp.h" |
yagyag | 2:cd21785b6654 | 6 | #include "FATFileSystem.h" |
dkato | 0:78f7f7683a42 | 7 | |
dkato | 0:78f7f7683a42 | 8 | /**** User Selection *********/ |
dkato | 0:78f7f7683a42 | 9 | /** JPEG out setting **/ |
yagyag | 2:cd21785b6654 | 10 | #define JPEG_ENCODE_QUALITY (55) /* JPEG encode quality (min:1, max:75 (Considering the size of JpegBuffer, about 75 is the upper limit.)) */ |
yagyag | 2:cd21785b6654 | 11 | #define VFIELD_INT_SKIP_CNT (1) /* A guide for GR-LYCHEE. 0:60fps, 1:30fps, 2:20fps, 3:15fps, 4:12fps, 5:10fps */ |
dkato | 0:78f7f7683a42 | 12 | /*****************************/ |
dkato | 0:78f7f7683a42 | 13 | |
dkato | 0:78f7f7683a42 | 14 | /*! Frame buffer stride: Frame buffer stride should be set to a multiple of 32 or 128 |
dkato | 0:78f7f7683a42 | 15 | in accordance with the frame buffer burst transfer mode. */ |
dkato | 0:78f7f7683a42 | 16 | #define VIDEO_PIXEL_HW (640u) /* VGA */ |
dkato | 0:78f7f7683a42 | 17 | #define VIDEO_PIXEL_VW (480u) /* VGA */ |
dkato | 0:78f7f7683a42 | 18 | |
dkato | 0:78f7f7683a42 | 19 | #define FRAME_BUFFER_STRIDE (((VIDEO_PIXEL_HW * 2) + 31u) & ~31u) |
dkato | 0:78f7f7683a42 | 20 | #define FRAME_BUFFER_HEIGHT (VIDEO_PIXEL_VW) |
dkato | 0:78f7f7683a42 | 21 | |
dkato | 0:78f7f7683a42 | 22 | DisplayBase Display; |
dkato | 0:78f7f7683a42 | 23 | |
dkato | 0:78f7f7683a42 | 24 | #if defined(__ICCARM__) |
dkato | 0:78f7f7683a42 | 25 | #pragma data_alignment=32 |
dkato | 0:78f7f7683a42 | 26 | static uint8_t user_frame_buffer0[FRAME_BUFFER_STRIDE * FRAME_BUFFER_HEIGHT]@ ".mirrorram"; |
dkato | 0:78f7f7683a42 | 27 | #pragma data_alignment=32 |
dkato | 0:78f7f7683a42 | 28 | static uint8_t JpegBuffer[2][1024 * 64]; |
yagyag | 2:cd21785b6654 | 29 | static uint8_t JpegBuffer_Send[1024 * 64]; |
dkato | 0:78f7f7683a42 | 30 | #else |
dkato | 0:78f7f7683a42 | 31 | static uint8_t user_frame_buffer0[FRAME_BUFFER_STRIDE * FRAME_BUFFER_HEIGHT]__attribute((section("NC_BSS"),aligned(32))); |
dkato | 0:78f7f7683a42 | 32 | static uint8_t JpegBuffer[2][1024 * 64]__attribute((aligned(32))); |
yagyag | 2:cd21785b6654 | 33 | static uint8_t JpegBuffer_Send[1024 * 64]__attribute((aligned(32))); |
dkato | 0:78f7f7683a42 | 34 | #endif |
dkato | 0:78f7f7683a42 | 35 | static size_t jcu_encode_size[2]; |
dkato | 0:78f7f7683a42 | 36 | static JPEG_Converter Jcu; |
dkato | 0:78f7f7683a42 | 37 | static int jcu_buf_index_write = 0; |
dkato | 0:78f7f7683a42 | 38 | static int jcu_buf_index_write_done = 0; |
dkato | 0:78f7f7683a42 | 39 | static int jcu_buf_index_read = 0; |
dkato | 0:78f7f7683a42 | 40 | static volatile int jcu_encoding = 0; |
dkato | 0:78f7f7683a42 | 41 | static volatile int image_change = 0; |
dkato | 0:78f7f7683a42 | 42 | static DisplayApp display_app; |
dkato | 0:78f7f7683a42 | 43 | static int Vfield_Int_Cnt = 0; |
dkato | 0:78f7f7683a42 | 44 | |
yagyag | 2:cd21785b6654 | 45 | static void JcuEncodeCallBackFunc(JPEG_Converter::jpeg_conv_error_t err_code) |
yagyag | 2:cd21785b6654 | 46 | { |
dkato | 0:78f7f7683a42 | 47 | if (err_code == JPEG_Converter::JPEG_CONV_OK) { |
dkato | 0:78f7f7683a42 | 48 | jcu_buf_index_write_done = jcu_buf_index_write; |
dkato | 0:78f7f7683a42 | 49 | image_change = 1; |
dkato | 0:78f7f7683a42 | 50 | } |
dkato | 0:78f7f7683a42 | 51 | jcu_encoding = 0; |
dkato | 0:78f7f7683a42 | 52 | } |
dkato | 0:78f7f7683a42 | 53 | |
yagyag | 2:cd21785b6654 | 54 | static void snapshot(void) |
yagyag | 2:cd21785b6654 | 55 | { |
yagyag | 4:b75d4cd51099 | 56 | |
dkato | 0:78f7f7683a42 | 57 | while ((jcu_encoding == 1) || (image_change == 0)) { |
dkato | 0:78f7f7683a42 | 58 | Thread::wait(1); |
dkato | 0:78f7f7683a42 | 59 | } |
dkato | 0:78f7f7683a42 | 60 | jcu_buf_index_read = jcu_buf_index_write_done; |
yagyag | 2:cd21785b6654 | 61 | memcpy(JpegBuffer_Send, JpegBuffer[jcu_buf_index_read],1024 * 64); |
dkato | 0:78f7f7683a42 | 62 | image_change = 0; |
yagyag | 2:cd21785b6654 | 63 | |
yagyag | 4:b75d4cd51099 | 64 | display_app.SendJpeg(JpegBuffer_Send, (uint32_t)jcu_encode_size[jcu_buf_index_read]); |
yagyag | 4:b75d4cd51099 | 65 | } |
yagyag | 4:b75d4cd51099 | 66 | |
yagyag | 4:b75d4cd51099 | 67 | static void WaitGetCommand(void) |
yagyag | 4:b75d4cd51099 | 68 | { |
yagyag | 4:b75d4cd51099 | 69 | char command; |
yagyag | 4:b75d4cd51099 | 70 | command = display_app.Getgetc(); |
yagyag | 4:b75d4cd51099 | 71 | |
yagyag | 4:b75d4cd51099 | 72 | if(command=='c'){ |
yagyag | 4:b75d4cd51099 | 73 | snapshot(); |
yagyag | 2:cd21785b6654 | 74 | } |
yagyag | 4:b75d4cd51099 | 75 | |
dkato | 0:78f7f7683a42 | 76 | } |
dkato | 0:78f7f7683a42 | 77 | |
yagyag | 2:cd21785b6654 | 78 | static void IntCallbackFunc_Vfield(DisplayBase::int_type_t int_type) |
yagyag | 2:cd21785b6654 | 79 | { |
dkato | 0:78f7f7683a42 | 80 | if (Vfield_Int_Cnt < VFIELD_INT_SKIP_CNT) { |
dkato | 0:78f7f7683a42 | 81 | Vfield_Int_Cnt++; |
dkato | 0:78f7f7683a42 | 82 | return; |
dkato | 0:78f7f7683a42 | 83 | } |
dkato | 0:78f7f7683a42 | 84 | Vfield_Int_Cnt = 0; |
dkato | 0:78f7f7683a42 | 85 | |
dkato | 0:78f7f7683a42 | 86 | //Interrupt callback function |
dkato | 0:78f7f7683a42 | 87 | if (jcu_encoding == 0) { |
dkato | 0:78f7f7683a42 | 88 | JPEG_Converter::bitmap_buff_info_t bitmap_buff_info; |
dkato | 0:78f7f7683a42 | 89 | JPEG_Converter::encode_options_t encode_options; |
dkato | 0:78f7f7683a42 | 90 | |
dkato | 0:78f7f7683a42 | 91 | bitmap_buff_info.width = VIDEO_PIXEL_HW; |
dkato | 0:78f7f7683a42 | 92 | bitmap_buff_info.height = VIDEO_PIXEL_VW; |
dkato | 0:78f7f7683a42 | 93 | bitmap_buff_info.format = JPEG_Converter::WR_RD_YCbCr422; |
dkato | 0:78f7f7683a42 | 94 | bitmap_buff_info.buffer_address = (void *)user_frame_buffer0; |
dkato | 0:78f7f7683a42 | 95 | |
dkato | 0:78f7f7683a42 | 96 | encode_options.encode_buff_size = sizeof(JpegBuffer[0]); |
dkato | 0:78f7f7683a42 | 97 | encode_options.p_EncodeCallBackFunc = &JcuEncodeCallBackFunc; |
dkato | 0:78f7f7683a42 | 98 | encode_options.input_swapsetting = JPEG_Converter::WR_RD_WRSWA_32_16_8BIT; |
dkato | 0:78f7f7683a42 | 99 | |
dkato | 0:78f7f7683a42 | 100 | jcu_encoding = 1; |
dkato | 0:78f7f7683a42 | 101 | if (jcu_buf_index_read == jcu_buf_index_write) { |
dkato | 0:78f7f7683a42 | 102 | jcu_buf_index_write ^= 1; // toggle |
dkato | 0:78f7f7683a42 | 103 | } |
dkato | 0:78f7f7683a42 | 104 | jcu_encode_size[jcu_buf_index_write] = 0; |
dkato | 0:78f7f7683a42 | 105 | dcache_invalid(JpegBuffer[jcu_buf_index_write], sizeof(JpegBuffer[0])); |
dkato | 0:78f7f7683a42 | 106 | if (Jcu.encode(&bitmap_buff_info, JpegBuffer[jcu_buf_index_write], |
yagyag | 2:cd21785b6654 | 107 | &jcu_encode_size[jcu_buf_index_write], &encode_options) != JPEG_Converter::JPEG_CONV_OK) { |
dkato | 0:78f7f7683a42 | 108 | jcu_encode_size[jcu_buf_index_write] = 0; |
dkato | 0:78f7f7683a42 | 109 | jcu_encoding = 0; |
dkato | 0:78f7f7683a42 | 110 | } |
dkato | 0:78f7f7683a42 | 111 | } |
dkato | 0:78f7f7683a42 | 112 | } |
dkato | 0:78f7f7683a42 | 113 | |
yagyag | 2:cd21785b6654 | 114 | static void Start_Video_Camera(void) |
yagyag | 2:cd21785b6654 | 115 | { |
dkato | 0:78f7f7683a42 | 116 | // Initialize the background to black |
dkato | 0:78f7f7683a42 | 117 | for (uint32_t i = 0; i < sizeof(user_frame_buffer0); i += 2) { |
dkato | 0:78f7f7683a42 | 118 | user_frame_buffer0[i + 0] = 0x10; |
dkato | 0:78f7f7683a42 | 119 | user_frame_buffer0[i + 1] = 0x80; |
dkato | 0:78f7f7683a42 | 120 | } |
dkato | 0:78f7f7683a42 | 121 | |
dkato | 0:78f7f7683a42 | 122 | // Interrupt callback function setting (Field end signal for recording function in scaler 0) |
dkato | 0:78f7f7683a42 | 123 | Display.Graphics_Irq_Handler_Set(DisplayBase::INT_TYPE_S0_VFIELD, 0, IntCallbackFunc_Vfield); |
dkato | 0:78f7f7683a42 | 124 | |
dkato | 0:78f7f7683a42 | 125 | // Video capture setting (progressive form fixed) |
dkato | 0:78f7f7683a42 | 126 | Display.Video_Write_Setting( |
dkato | 0:78f7f7683a42 | 127 | DisplayBase::VIDEO_INPUT_CHANNEL_0, |
dkato | 0:78f7f7683a42 | 128 | DisplayBase::COL_SYS_NTSC_358, |
dkato | 0:78f7f7683a42 | 129 | (void *)user_frame_buffer0, |
dkato | 0:78f7f7683a42 | 130 | FRAME_BUFFER_STRIDE, |
dkato | 0:78f7f7683a42 | 131 | DisplayBase::VIDEO_FORMAT_YCBCR422, |
dkato | 0:78f7f7683a42 | 132 | DisplayBase::WR_RD_WRSWA_32_16BIT, |
dkato | 0:78f7f7683a42 | 133 | VIDEO_PIXEL_VW, |
dkato | 0:78f7f7683a42 | 134 | VIDEO_PIXEL_HW |
dkato | 0:78f7f7683a42 | 135 | ); |
dkato | 0:78f7f7683a42 | 136 | EasyAttach_CameraStart(Display, DisplayBase::VIDEO_INPUT_CHANNEL_0); |
dkato | 0:78f7f7683a42 | 137 | } |
dkato | 0:78f7f7683a42 | 138 | |
yagyag | 2:cd21785b6654 | 139 | int main(void) |
yagyag | 2:cd21785b6654 | 140 | { |
dkato | 0:78f7f7683a42 | 141 | Jcu.SetQuality(JPEG_ENCODE_QUALITY); |
dkato | 0:78f7f7683a42 | 142 | |
dkato | 0:78f7f7683a42 | 143 | EasyAttach_Init(Display); |
dkato | 0:78f7f7683a42 | 144 | Start_Video_Camera(); |
dkato | 0:78f7f7683a42 | 145 | |
dkato | 0:78f7f7683a42 | 146 | while (1) { |
yagyag | 4:b75d4cd51099 | 147 | WaitGetCommand(); |
dkato | 0:78f7f7683a42 | 148 | } |
dkato | 0:78f7f7683a42 | 149 | } |