Camera sample for GR-Boads

Dependencies:   mbed-os-lychee

このサンプルは 「GR-LYCHEE」ではじめる電子工作 で紹介しています。
出版時と内容が異ならないよう、各ライブラリはアップデートせずに使用してください。

このサンプルの最新バージョンは下記から入手できます。最新バージョンは本の内容と一部処理が異なります。
https://github.com/d-kato/GR-Boards_Camera_sample

Committer:
dkato
Date:
Fri Feb 02 07:40:40 2018 +0000
Revision:
3:50c40b50e7d4
Parent:
1:be0f952b4551
Rename library folder

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dkato 0:a1daffd30b6d 1 #include "mbed.h"
dkato 0:a1daffd30b6d 2 #include "EasyAttach_CameraAndLCD.h"
dkato 0:a1daffd30b6d 3 #include "SdUsbConnect.h"
dkato 0:a1daffd30b6d 4 #include "JPEG_Converter.h"
dkato 0:a1daffd30b6d 5 #include "dcache-control.h"
dkato 0:a1daffd30b6d 6
dkato 0:a1daffd30b6d 7 #define MOUNT_NAME "storage"
dkato 0:a1daffd30b6d 8
dkato 0:a1daffd30b6d 9 /*! Frame buffer stride: Frame buffer stride should be set to a multiple of 32 or 128
dkato 0:a1daffd30b6d 10 in accordance with the frame buffer burst transfer mode. */
dkato 0:a1daffd30b6d 11 #define VIDEO_PIXEL_HW (640u) /* VGA */
dkato 0:a1daffd30b6d 12 #define VIDEO_PIXEL_VW (480u) /* VGA */
dkato 0:a1daffd30b6d 13
dkato 0:a1daffd30b6d 14 #define FRAME_BUFFER_STRIDE (((VIDEO_PIXEL_HW * 2) + 31u) & ~31u)
dkato 0:a1daffd30b6d 15 #define FRAME_BUFFER_HEIGHT (VIDEO_PIXEL_VW)
dkato 0:a1daffd30b6d 16
dkato 0:a1daffd30b6d 17 #if defined(__ICCARM__)
dkato 0:a1daffd30b6d 18 #pragma data_alignment=32
dkato 0:a1daffd30b6d 19 static uint8_t user_frame_buffer0[FRAME_BUFFER_STRIDE * FRAME_BUFFER_HEIGHT]@ ".mirrorram";
dkato 0:a1daffd30b6d 20 #else
dkato 0:a1daffd30b6d 21 static uint8_t user_frame_buffer0[FRAME_BUFFER_STRIDE * FRAME_BUFFER_HEIGHT]__attribute((section("NC_BSS"),aligned(32)));
dkato 0:a1daffd30b6d 22 #endif
dkato 0:a1daffd30b6d 23 static int file_name_index = 1;
dkato 0:a1daffd30b6d 24 static volatile int Vfield_Int_Cnt = 0;
dkato 0:a1daffd30b6d 25 /* jpeg convert */
dkato 0:a1daffd30b6d 26 static JPEG_Converter Jcu;
dkato 0:a1daffd30b6d 27 #if defined(__ICCARM__)
dkato 0:a1daffd30b6d 28 #pragma data_alignment=32
dkato 0:a1daffd30b6d 29 static uint8_t JpegBuffer[1024 * 63];
dkato 0:a1daffd30b6d 30 #else
dkato 0:a1daffd30b6d 31 static uint8_t JpegBuffer[1024 * 63]__attribute((aligned(32)));
dkato 0:a1daffd30b6d 32 #endif
dkato 0:a1daffd30b6d 33
dkato 0:a1daffd30b6d 34 DisplayBase Display;
dkato 0:a1daffd30b6d 35 DigitalIn button0(USER_BUTTON0);
dkato 0:a1daffd30b6d 36 DigitalOut led1(LED1);
dkato 0:a1daffd30b6d 37
dkato 0:a1daffd30b6d 38 static void IntCallbackFunc_Vfield(DisplayBase::int_type_t int_type) {
dkato 0:a1daffd30b6d 39 if (Vfield_Int_Cnt > 0) {
dkato 0:a1daffd30b6d 40 Vfield_Int_Cnt--;
dkato 0:a1daffd30b6d 41 }
dkato 0:a1daffd30b6d 42 }
dkato 0:a1daffd30b6d 43
dkato 0:a1daffd30b6d 44 static void wait_new_image(void) {
dkato 0:a1daffd30b6d 45 Vfield_Int_Cnt = 1;
dkato 0:a1daffd30b6d 46 while (Vfield_Int_Cnt > 0) {
dkato 0:a1daffd30b6d 47 Thread::wait(1);
dkato 0:a1daffd30b6d 48 }
dkato 0:a1daffd30b6d 49 }
dkato 0:a1daffd30b6d 50
dkato 0:a1daffd30b6d 51 static void Start_Video_Camera(void) {
dkato 1:be0f952b4551 52 // Initialize the background to black
dkato 1:be0f952b4551 53 for (uint32_t i = 0; i < sizeof(user_frame_buffer0); i += 2) {
dkato 1:be0f952b4551 54 user_frame_buffer0[i + 0] = 0x10;
dkato 1:be0f952b4551 55 user_frame_buffer0[i + 1] = 0x80;
dkato 1:be0f952b4551 56 }
dkato 1:be0f952b4551 57
dkato 0:a1daffd30b6d 58 // Field end signal for recording function in scaler 0
dkato 0:a1daffd30b6d 59 Display.Graphics_Irq_Handler_Set(DisplayBase::INT_TYPE_S0_VFIELD, 0, IntCallbackFunc_Vfield);
dkato 0:a1daffd30b6d 60
dkato 0:a1daffd30b6d 61 // Video capture setting (progressive form fixed)
dkato 0:a1daffd30b6d 62 Display.Video_Write_Setting(
dkato 0:a1daffd30b6d 63 DisplayBase::VIDEO_INPUT_CHANNEL_0,
dkato 0:a1daffd30b6d 64 DisplayBase::COL_SYS_NTSC_358,
dkato 0:a1daffd30b6d 65 (void *)user_frame_buffer0,
dkato 0:a1daffd30b6d 66 FRAME_BUFFER_STRIDE,
dkato 0:a1daffd30b6d 67 DisplayBase::VIDEO_FORMAT_YCBCR422,
dkato 0:a1daffd30b6d 68 DisplayBase::WR_RD_WRSWA_32_16BIT,
dkato 0:a1daffd30b6d 69 VIDEO_PIXEL_VW,
dkato 0:a1daffd30b6d 70 VIDEO_PIXEL_HW
dkato 0:a1daffd30b6d 71 );
dkato 0:a1daffd30b6d 72 EasyAttach_CameraStart(Display, DisplayBase::VIDEO_INPUT_CHANNEL_0);
dkato 0:a1daffd30b6d 73 }
dkato 0:a1daffd30b6d 74
dkato 1:be0f952b4551 75 #if MBED_CONF_APP_LCD
dkato 1:be0f952b4551 76 static void Start_LCD_Display(void) {
dkato 1:be0f952b4551 77 DisplayBase::rect_t rect;
dkato 1:be0f952b4551 78
dkato 1:be0f952b4551 79 rect.vs = 0;
dkato 1:be0f952b4551 80 rect.vw = VIDEO_PIXEL_VW;
dkato 1:be0f952b4551 81 rect.hs = 0;
dkato 1:be0f952b4551 82 rect.hw = VIDEO_PIXEL_HW;
dkato 1:be0f952b4551 83 Display.Graphics_Read_Setting(
dkato 1:be0f952b4551 84 DisplayBase::GRAPHICS_LAYER_0,
dkato 1:be0f952b4551 85 (void *)user_frame_buffer0,
dkato 1:be0f952b4551 86 FRAME_BUFFER_STRIDE,
dkato 1:be0f952b4551 87 DisplayBase::GRAPHICS_FORMAT_YCBCR422,
dkato 1:be0f952b4551 88 DisplayBase::WR_RD_WRSWA_32_16BIT,
dkato 1:be0f952b4551 89 &rect
dkato 1:be0f952b4551 90 );
dkato 1:be0f952b4551 91 Display.Graphics_Start(DisplayBase::GRAPHICS_LAYER_0);
dkato 1:be0f952b4551 92
dkato 1:be0f952b4551 93 Thread::wait(50);
dkato 1:be0f952b4551 94 EasyAttach_LcdBacklight(true);
dkato 1:be0f952b4551 95 }
dkato 1:be0f952b4551 96 #endif
dkato 1:be0f952b4551 97
dkato 0:a1daffd30b6d 98 static void save_image_jpg(void) {
dkato 1:be0f952b4551 99 size_t jcu_encode_size = 0;
dkato 0:a1daffd30b6d 100 JPEG_Converter::bitmap_buff_info_t bitmap_buff_info;
dkato 0:a1daffd30b6d 101 JPEG_Converter::encode_options_t encode_options;
dkato 0:a1daffd30b6d 102
dkato 0:a1daffd30b6d 103 bitmap_buff_info.width = VIDEO_PIXEL_HW;
dkato 0:a1daffd30b6d 104 bitmap_buff_info.height = VIDEO_PIXEL_VW;
dkato 0:a1daffd30b6d 105 bitmap_buff_info.format = JPEG_Converter::WR_RD_YCbCr422;
dkato 0:a1daffd30b6d 106 bitmap_buff_info.buffer_address = (void *)user_frame_buffer0;
dkato 0:a1daffd30b6d 107
dkato 0:a1daffd30b6d 108 encode_options.encode_buff_size = sizeof(JpegBuffer);
dkato 0:a1daffd30b6d 109 encode_options.p_EncodeCallBackFunc = NULL;
dkato 0:a1daffd30b6d 110 encode_options.input_swapsetting = JPEG_Converter::WR_RD_WRSWA_32_16_8BIT;
dkato 0:a1daffd30b6d 111
dkato 0:a1daffd30b6d 112 dcache_invalid(JpegBuffer, sizeof(JpegBuffer));
dkato 1:be0f952b4551 113 if (Jcu.encode(&bitmap_buff_info, JpegBuffer, &jcu_encode_size, &encode_options) == JPEG_Converter::JPEG_CONV_OK) {
dkato 1:be0f952b4551 114 char file_name[32];
dkato 1:be0f952b4551 115 sprintf(file_name, "/"MOUNT_NAME"/img_%d.jpg", file_name_index++);
dkato 1:be0f952b4551 116 FILE * fp = fopen(file_name, "w");
dkato 1:be0f952b4551 117 fwrite(JpegBuffer, sizeof(char), (int)jcu_encode_size, fp);
dkato 1:be0f952b4551 118 fclose(fp);
dkato 1:be0f952b4551 119 printf("Saved file %s\r\n", file_name);
dkato 0:a1daffd30b6d 120 }
dkato 0:a1daffd30b6d 121 }
dkato 0:a1daffd30b6d 122
dkato 0:a1daffd30b6d 123 int main() {
dkato 0:a1daffd30b6d 124 EasyAttach_Init(Display);
dkato 0:a1daffd30b6d 125 Start_Video_Camera();
dkato 1:be0f952b4551 126 #if MBED_CONF_APP_LCD
dkato 1:be0f952b4551 127 Start_LCD_Display();
dkato 1:be0f952b4551 128 #endif
dkato 0:a1daffd30b6d 129 SdUsbConnect storage(MOUNT_NAME);
dkato 0:a1daffd30b6d 130
dkato 0:a1daffd30b6d 131 while (1) {
dkato 0:a1daffd30b6d 132 storage.wait_connect();
dkato 0:a1daffd30b6d 133 if (button0 == 0) {
dkato 0:a1daffd30b6d 134 wait_new_image(); // wait for image input
dkato 0:a1daffd30b6d 135 led1 = 1;
dkato 0:a1daffd30b6d 136 save_image_jpg(); // save as jpeg
dkato 0:a1daffd30b6d 137 led1 = 0;
dkato 0:a1daffd30b6d 138 }
dkato 0:a1daffd30b6d 139 }
dkato 0:a1daffd30b6d 140 }