DisplayApp-Base

Dependencies:   mbed-os-lychee DisplayApp_Base

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?

UserRevisionLine numberNew 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 }