DisplayApp-Base

Dependencies:   mbed-os-lychee DisplayApp_Base

Committer:
yagyag
Date:
Fri Nov 16 08:16:08 2018 +0000
Revision:
3:6289f0adb6c9
Parent:
2:cd21785b6654
Child:
4:b75d4cd51099
???

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 Ticker flipper;
yagyag 2:cd21785b6654 46 static int interCnt = 0; //割り込み発生回数
yagyag 2:cd21785b6654 47 static int sendCnt = 0; //画像データを送信した回数
yagyag 2:cd21785b6654 48 DigitalOut led1(LED1);
yagyag 2:cd21785b6654 49 DigitalOut led2(LED2);
yagyag 2:cd21785b6654 50
yagyag 2:cd21785b6654 51
yagyag 2:cd21785b6654 52 static void incrementInterCnt()
yagyag 2:cd21785b6654 53 {
yagyag 2:cd21785b6654 54 interCnt++;
yagyag 2:cd21785b6654 55 }
yagyag 2:cd21785b6654 56
yagyag 2:cd21785b6654 57 static void JcuEncodeCallBackFunc(JPEG_Converter::jpeg_conv_error_t err_code)
yagyag 2:cd21785b6654 58 {
dkato 0:78f7f7683a42 59 if (err_code == JPEG_Converter::JPEG_CONV_OK) {
dkato 0:78f7f7683a42 60 jcu_buf_index_write_done = jcu_buf_index_write;
dkato 0:78f7f7683a42 61 image_change = 1;
dkato 0:78f7f7683a42 62 }
dkato 0:78f7f7683a42 63 jcu_encoding = 0;
dkato 0:78f7f7683a42 64 }
dkato 0:78f7f7683a42 65
yagyag 2:cd21785b6654 66 static void snapshot(void)
yagyag 2:cd21785b6654 67 {
yagyag 2:cd21785b6654 68 //JPEGにエンコード中 or エンコード未完了
dkato 0:78f7f7683a42 69 while ((jcu_encoding == 1) || (image_change == 0)) {
dkato 0:78f7f7683a42 70 Thread::wait(1);
dkato 0:78f7f7683a42 71 }
dkato 0:78f7f7683a42 72 jcu_buf_index_read = jcu_buf_index_write_done;
yagyag 2:cd21785b6654 73 //画像データをコピー(JpegBufferは他から書き換えられる可能性があるため)
yagyag 2:cd21785b6654 74 memcpy(JpegBuffer_Send, JpegBuffer[jcu_buf_index_read],1024 * 64);
dkato 0:78f7f7683a42 75 image_change = 0;
yagyag 2:cd21785b6654 76
yagyag 2:cd21785b6654 77 if(interCnt != sendCnt) {
yagyag 2:cd21785b6654 78 led2 = !led2;
yagyag 2:cd21785b6654 79 sendCnt = interCnt;
yagyag 2:cd21785b6654 80 //撮影した画像データ(JPEG)をPCにUSBシリアル通信で転送
yagyag 2:cd21785b6654 81 display_app.SendJpeg(JpegBuffer_Send, (uint32_t)jcu_encode_size[jcu_buf_index_read]);
yagyag 2:cd21785b6654 82 led2 = !led2;
yagyag 2:cd21785b6654 83 }
dkato 0:78f7f7683a42 84 }
dkato 0:78f7f7683a42 85
yagyag 2:cd21785b6654 86 static void IntCallbackFunc_Vfield(DisplayBase::int_type_t int_type)
yagyag 2:cd21785b6654 87 {
dkato 0:78f7f7683a42 88 if (Vfield_Int_Cnt < VFIELD_INT_SKIP_CNT) {
dkato 0:78f7f7683a42 89 Vfield_Int_Cnt++;
dkato 0:78f7f7683a42 90 return;
dkato 0:78f7f7683a42 91 }
dkato 0:78f7f7683a42 92 Vfield_Int_Cnt = 0;
dkato 0:78f7f7683a42 93
dkato 0:78f7f7683a42 94 //Interrupt callback function
dkato 0:78f7f7683a42 95 if (jcu_encoding == 0) {
dkato 0:78f7f7683a42 96 JPEG_Converter::bitmap_buff_info_t bitmap_buff_info;
dkato 0:78f7f7683a42 97 JPEG_Converter::encode_options_t encode_options;
dkato 0:78f7f7683a42 98
dkato 0:78f7f7683a42 99 bitmap_buff_info.width = VIDEO_PIXEL_HW;
dkato 0:78f7f7683a42 100 bitmap_buff_info.height = VIDEO_PIXEL_VW;
dkato 0:78f7f7683a42 101 bitmap_buff_info.format = JPEG_Converter::WR_RD_YCbCr422;
dkato 0:78f7f7683a42 102 bitmap_buff_info.buffer_address = (void *)user_frame_buffer0;
dkato 0:78f7f7683a42 103
dkato 0:78f7f7683a42 104 encode_options.encode_buff_size = sizeof(JpegBuffer[0]);
dkato 0:78f7f7683a42 105 encode_options.p_EncodeCallBackFunc = &JcuEncodeCallBackFunc;
dkato 0:78f7f7683a42 106 encode_options.input_swapsetting = JPEG_Converter::WR_RD_WRSWA_32_16_8BIT;
dkato 0:78f7f7683a42 107
dkato 0:78f7f7683a42 108 jcu_encoding = 1;
dkato 0:78f7f7683a42 109 if (jcu_buf_index_read == jcu_buf_index_write) {
dkato 0:78f7f7683a42 110 jcu_buf_index_write ^= 1; // toggle
dkato 0:78f7f7683a42 111 }
dkato 0:78f7f7683a42 112 jcu_encode_size[jcu_buf_index_write] = 0;
dkato 0:78f7f7683a42 113 dcache_invalid(JpegBuffer[jcu_buf_index_write], sizeof(JpegBuffer[0]));
dkato 0:78f7f7683a42 114 if (Jcu.encode(&bitmap_buff_info, JpegBuffer[jcu_buf_index_write],
yagyag 2:cd21785b6654 115 &jcu_encode_size[jcu_buf_index_write], &encode_options) != JPEG_Converter::JPEG_CONV_OK) {
dkato 0:78f7f7683a42 116 jcu_encode_size[jcu_buf_index_write] = 0;
dkato 0:78f7f7683a42 117 jcu_encoding = 0;
dkato 0:78f7f7683a42 118 }
dkato 0:78f7f7683a42 119 }
dkato 0:78f7f7683a42 120 }
dkato 0:78f7f7683a42 121
yagyag 2:cd21785b6654 122 static void Start_Video_Camera(void)
yagyag 2:cd21785b6654 123 {
dkato 0:78f7f7683a42 124 // Initialize the background to black
dkato 0:78f7f7683a42 125 for (uint32_t i = 0; i < sizeof(user_frame_buffer0); i += 2) {
dkato 0:78f7f7683a42 126 user_frame_buffer0[i + 0] = 0x10;
dkato 0:78f7f7683a42 127 user_frame_buffer0[i + 1] = 0x80;
dkato 0:78f7f7683a42 128 }
dkato 0:78f7f7683a42 129
dkato 0:78f7f7683a42 130 // Interrupt callback function setting (Field end signal for recording function in scaler 0)
dkato 0:78f7f7683a42 131 Display.Graphics_Irq_Handler_Set(DisplayBase::INT_TYPE_S0_VFIELD, 0, IntCallbackFunc_Vfield);
dkato 0:78f7f7683a42 132
dkato 0:78f7f7683a42 133 // Video capture setting (progressive form fixed)
dkato 0:78f7f7683a42 134 Display.Video_Write_Setting(
dkato 0:78f7f7683a42 135 DisplayBase::VIDEO_INPUT_CHANNEL_0,
dkato 0:78f7f7683a42 136 DisplayBase::COL_SYS_NTSC_358,
dkato 0:78f7f7683a42 137 (void *)user_frame_buffer0,
dkato 0:78f7f7683a42 138 FRAME_BUFFER_STRIDE,
dkato 0:78f7f7683a42 139 DisplayBase::VIDEO_FORMAT_YCBCR422,
dkato 0:78f7f7683a42 140 DisplayBase::WR_RD_WRSWA_32_16BIT,
dkato 0:78f7f7683a42 141 VIDEO_PIXEL_VW,
dkato 0:78f7f7683a42 142 VIDEO_PIXEL_HW
dkato 0:78f7f7683a42 143 );
dkato 0:78f7f7683a42 144 EasyAttach_CameraStart(Display, DisplayBase::VIDEO_INPUT_CHANNEL_0);
dkato 0:78f7f7683a42 145 }
dkato 0:78f7f7683a42 146
yagyag 2:cd21785b6654 147 int main(void)
yagyag 2:cd21785b6654 148 {
yagyag 2:cd21785b6654 149 led1 = !led1;
yagyag 2:cd21785b6654 150 //JPEGのエンコード設定
dkato 0:78f7f7683a42 151 Jcu.SetQuality(JPEG_ENCODE_QUALITY);
dkato 0:78f7f7683a42 152
yagyag 2:cd21785b6654 153 //カメラの初期化処理
dkato 0:78f7f7683a42 154 EasyAttach_Init(Display);
yagyag 2:cd21785b6654 155 //カメラ画像 取得開始
dkato 0:78f7f7683a42 156 Start_Video_Camera();
yagyag 2:cd21785b6654 157 //割り込み処理※デバッグの為、5秒
yagyag 2:cd21785b6654 158 flipper.attach(&incrementInterCnt, 5.0);
dkato 0:78f7f7683a42 159
dkato 0:78f7f7683a42 160 while (1) {
dkato 0:78f7f7683a42 161 snapshot();
dkato 0:78f7f7683a42 162 }
dkato 0:78f7f7683a42 163 }