diff --git a/examples/camera/Make.defs b/examples/camera/Make.defs index 94ad598d2..d2507a9db 100644 --- a/examples/camera/Make.defs +++ b/examples/camera/Make.defs @@ -1,35 +1,20 @@ ############################################################################ -# examples/camera/Make.defs +# apps/examples/camera/Make.defs # -# Copyright 2018 Sony Semiconductor Solutions Corporation +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. The +# ASF licenses this file to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance with the +# License. You may obtain a copy of the License at # -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: +# http://www.apache.org/licenses/LICENSE-2.0 # -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in -# the documentation and/or other materials provided with the -# distribution. -# 3. Neither the name of Sony Semiconductor Solutions Corporation nor -# the names of its contributors may be used to endorse or promote -# products derived from this software without specific prior written -# permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS -# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED -# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. # ############################################################################ diff --git a/examples/camera/Makefile b/examples/camera/Makefile index a3110bd1f..946f3049b 100644 --- a/examples/camera/Makefile +++ b/examples/camera/Makefile @@ -1,35 +1,20 @@ ############################################################################ -# examples/camera/Makefile +# apps/examples/camera/Makefile # -# Copyright 2018, 2020 Sony Semiconductor Solutions Corporation +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. The +# ASF licenses this file to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance with the +# License. You may obtain a copy of the License at # -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: +# http://www.apache.org/licenses/LICENSE-2.0 # -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in -# the documentation and/or other materials provided with the -# distribution. -# 3. Neither the name of Sony Semiconductor Solutions Corporation nor -# the names of its contributors may be used to endorse or promote -# products derived from this software without specific prior written -# permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS -# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED -# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. # ############################################################################ @@ -44,6 +29,10 @@ MODULE = $(CONFIG_EXAMPLES_CAMERA) # camera Example +ifeq ($(CONFIG_EXAMPLES_CAMERA_OUTPUT_LCD),y) +CSRCS += camera_bkgd.c +endif + CSRCS += camera_fileutil.c MAINSRC = camera_main.c diff --git a/examples/camera/README.md b/examples/camera/README.md index 42909dae8..309f6ccb0 100644 --- a/examples/camera/README.md +++ b/examples/camera/README.md @@ -7,8 +7,8 @@ the command is as below. nsh> camera ([-jpg]) ([capture num]) -jpg : this option is set for storing JPEG file into a strage. - : If this option isn't set capturing raw YUV422 data in a file. - : raw YUV422 is default. + : If this option isn't set capturing raw RGB565 data in a file. + : raw RGB565 is default. capture num : this option instructs number of taking pictures. : 10 is default. @@ -22,20 +22,20 @@ Execution example: nsh> camera nximage_listener: Connected nximage_initialize: Screen resolution (320,240) -Take 10 pictures as YUV file in /mnt/sd0 after 5000 mili-seconds. -After finishing taking pictures, this app will be finished after 10000 mili-seconds. +Take 10 pictures as RGB file in /mnt/sd0 after 5 seconds. +After finishing taking pictures, this app will be finished after 10 seconds. Expier time is pasted. Start capturing... -FILENAME:/mnt/sd0/VIDEO001.YUV -FILENAME:/mnt/sd0/VIDEO002.YUV -FILENAME:/mnt/sd0/VIDEO003.YUV -FILENAME:/mnt/sd0/VIDEO004.YUV -FILENAME:/mnt/sd0/VIDEO005.YUV -FILENAME:/mnt/sd0/VIDEO006.YUV -FILENAME:/mnt/sd0/VIDEO007.YUV -FILENAME:/mnt/sd0/VIDEO008.YUV -FILENAME:/mnt/sd0/VIDEO009.YUV -FILENAME:/mnt/sd0/VIDEO010.YUV +FILENAME:/mnt/sd0/VIDEO001.RGB +FILENAME:/mnt/sd0/VIDEO002.RGB +FILENAME:/mnt/sd0/VIDEO003.RGB +FILENAME:/mnt/sd0/VIDEO004.RGB +FILENAME:/mnt/sd0/VIDEO005.RGB +FILENAME:/mnt/sd0/VIDEO006.RGB +FILENAME:/mnt/sd0/VIDEO007.RGB +FILENAME:/mnt/sd0/VIDEO008.RGB +FILENAME:/mnt/sd0/VIDEO009.RGB +FILENAME:/mnt/sd0/VIDEO010.RGB Finished capturing... Expier time is pasted. nximage_listener: Lost server connection: 117 diff --git a/examples/camera/camera_bkgd.c b/examples/camera/camera_bkgd.c new file mode 100644 index 000000000..3fa80f380 --- /dev/null +++ b/examples/camera/camera_bkgd.c @@ -0,0 +1,339 @@ +/**************************************************************************** + * apps/examples/camera/camera_bkgd.c + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "camera_bkgd.h" + +/**************************************************************************** + * Private Types + ****************************************************************************/ + +struct nximage_data_s +{ + /* The NX handles */ + + NXHANDLE hnx; + NXHANDLE hbkgd; + bool connected; + + /* The screen resolution */ + + nxgl_coord_t xres; + nxgl_coord_t yres; + + volatile bool havepos; + sem_t sem; +}; + +/**************************************************************************** + * Private Function Prototypes + ****************************************************************************/ + +static void nximage_redraw(NXWINDOW hwnd, + FAR const struct nxgl_rect_s *rect, + bool more, + FAR void *arg); +static void nximage_position(NXWINDOW hwnd, + FAR const struct nxgl_size_s *size, + FAR const struct nxgl_point_s *pos, + FAR const struct nxgl_rect_s *bounds, + FAR void *arg); + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +/* Background window call table */ + +static const struct nx_callback_s g_nximagecb = +{ + nximage_redraw, /* redraw */ + nximage_position /* position */ +#ifdef CONFIG_NX_XYINPUT + , NULL /* mousein */ +#endif +#ifdef CONFIG_NX_KBD + , NULL /* my kbdin */ +#endif +}; + +/* To handle nx context, below variable is defined for this application. */ + +static struct nximage_data_s g_nximage = +{ + NULL, /* hnx */ + NULL, /* hbkgd */ + false, /* connected */ + 0, /* xres */ + 0, /* yres */ + false, /* havpos */ + { 0 }, /* sem */ +}; + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: nximage_listener() + * + * Description: + * NX event listener for an event from NX server. + ****************************************************************************/ + +FAR void *nximage_listener(FAR void *arg) +{ + int ret; + + /* Process events forever */ + + for (; ; ) + { + /* Handle the next event. If we were configured blocking, then + * we will stay right here until the next event is received. Since + * we have dedicated a while thread to servicing events, it would + * be most natural to also select CONFIG_NX_BLOCKING -- if not, the + * following would be a tight infinite loop (unless we added addition + * logic with nx_eventnotify and sigwait to pace it). + */ + + ret = nx_eventhandler(g_nximage.hnx); + if (ret < 0) + { + /* An error occurred... assume that we have lost connection with + * the server. + */ + + printf("nximage_listener: Lost server connection: %d\n", errno); + exit(EXIT_FAILURE); + } + + /* If we received a message, we must be connected */ + + if (!g_nximage.connected) + { + g_nximage.connected = true; + sem_post(&g_nximage.sem); + printf("nximage_listener: Connected\n"); + } + } +} + +/**************************************************************************** + * Name: nximage_redraw + * + * Description: + * NX re-draw handler + * + ****************************************************************************/ + +static void nximage_redraw(NXWINDOW hwnd, FAR const struct nxgl_rect_s *rect, + bool more, FAR void *arg) +{ + ginfo("hwnd=%p rect={(%d,%d),(%d,%d)} more=%s\n", + hwnd, rect->pt1.x, rect->pt1.y, rect->pt2.x, rect->pt2.y, + more ? "true" : "false"); +} + +/**************************************************************************** + * Name: nximage_position + * + * Description: + * NX position change handler + * + ****************************************************************************/ + +static void nximage_position(NXWINDOW hwnd, + FAR const struct nxgl_size_s *size, + FAR const struct nxgl_point_s *pos, + FAR const struct nxgl_rect_s *bounds, + FAR void *arg) +{ + /* Report the position */ + + ginfo("hwnd=%p size=(%d,%d) pos=(%d,%d) bounds={(%d,%d),(%d,%d)}\n", + hwnd, size->w, size->h, pos->x, pos->y, + bounds->pt1.x, bounds->pt1.y, bounds->pt2.x, bounds->pt2.y); + + /* Have we picked off the window bounds yet? */ + + if (!g_nximage.havepos) + { + /* Save the background window handle */ + + g_nximage.hbkgd = hwnd; + + /* Save the window limits */ + + g_nximage.xres = bounds->pt2.x + 1; + g_nximage.yres = bounds->pt2.y + 1; + + g_nximage.havepos = true; + sem_post(&g_nximage.sem); + ginfo("Have xres=%d yres=%d\n", g_nximage.xres, g_nximage.yres); + } +} + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: nximage_initialize + * + * Description: + * Initialize NX graphics subsystem. + * + ****************************************************************************/ + +int nximage_initialize(void) +{ + nxgl_mxpixel_t color; + pthread_t thread; + int ret; + + /* Start the NX server kernel thread */ + + ret = boardctl(BOARDIOC_NX_START, 0); + if (ret < 0) + { + printf("nximage_initialize: Failed to start the NX server: %d\n", + errno); + return ERROR; + } + + /* Connect to the server */ + + g_nximage.hnx = nx_connect(); + if (!g_nximage.hnx) + { + printf("nximage_initialize: nx_connect failed: %d\n", errno); + return ERROR; + } + + /* Start a separate thread to listen for server events. + * For simplicity, use defaul thread attribute. + */ + + ret = pthread_create(&thread, NULL, nximage_listener, NULL); + if (ret != 0) + { + printf("nximage_initialize: pthread_create failed: %d\n", ret); + return ERROR; + } + + /* Don't return until we are connected to the server */ + + while (!g_nximage.connected) + { + /* Wait for the listener thread to wake us up when we really + * are connected. + */ + + (void)sem_wait(&g_nximage.sem); + } + + /* Set background color to black */ + + color = 0; + nx_setbgcolor(g_nximage.hnx, &color); + ret = nx_requestbkgd(g_nximage.hnx, &g_nximagecb, NULL); + if (ret < 0) + { + printf("nximage_initialize: nx_requestbkgd failed: %d\n", errno); + nx_disconnect(g_nximage.hnx); + return ERROR; + } + + while (!g_nximage.havepos) + { + (void) sem_wait(&g_nximage.sem); + } + + printf("nximage_initialize: Screen resolution (%d,%d)\n", + g_nximage.xres, g_nximage.yres); + + return 0; +} + +/**************************************************************************** + * Name: nximage_image + * + * Description: + * Put the NuttX logo in the center of the display. + * + ****************************************************************************/ + +void nximage_draw(FAR void *image, int w, int h) +{ + FAR struct nxgl_point_s origin; + FAR struct nxgl_rect_s dest; + FAR const void *src[CONFIG_NX_NPLANES]; + int ret; + + origin.x = 0; + origin.y = 0; + + /* Set up the destination to whole LCD screen */ + + dest.pt1.x = 0; + dest.pt1.y = 0; + dest.pt2.x = g_nximage.xres - 1; + dest.pt2.y = g_nximage.yres - 1; + + src[0] = image; + + ret = nx_bitmap((NXWINDOW)g_nximage.hbkgd, &dest, src, &origin, + g_nximage.xres * sizeof(nxgl_mxpixel_t)); + if (ret < 0) + { + printf("nximage_image: nx_bitmapwindow failed: %d\n", errno); + } +} + +/**************************************************************************** + * Name: nximage_finalize() + * + * Description: + * Finalize NX server. + ****************************************************************************/ + +void nximage_finalize(void) +{ + nx_disconnect(g_nximage.hnx); +} + diff --git a/examples/camera/camera_bkgd.h b/examples/camera/camera_bkgd.h new file mode 100644 index 000000000..7d56aadde --- /dev/null +++ b/examples/camera/camera_bkgd.h @@ -0,0 +1,38 @@ +/**************************************************************************** + * apps/examples/camera/camera_bkgd.h + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __APPS_EXAMPLES_CAMERA_CAMERA_BKGD_H +#define __APPS_EXAMPLES_CAMERA_CAMERA_BKGD_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +int nximage_initialize(void); /* Initialize NX graphics subsystem */ +void nximage_draw(FAR void *image, int w, int h); /* Draw image onto Background window */ +void nximage_finalize(void); /* Finalize NX graphics subsystem */ + +#endif /* __APPS_EXAMPLES_CAMERA_CAMERA_BKGD_H */ diff --git a/examples/camera/camera_fileutil.c b/examples/camera/camera_fileutil.c index 0698e2dbf..743b0c7b3 100644 --- a/examples/camera/camera_fileutil.c +++ b/examples/camera/camera_fileutil.c @@ -1,35 +1,20 @@ /**************************************************************************** - * camera/camera_fileutil.c + * apps/examples/camera/camera_fileutil.c * - * Copyright 2020 Sony Semiconductor Solutions Corporation + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: + * http://www.apache.org/licenses/LICENSE-2.0 * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Neither the name of Sony Semiconductor Solutions Corporation nor - * the names of its contributors may be used to endorse or promote - * products derived from this software without specific prior written - * permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. * ****************************************************************************/ diff --git a/examples/camera/camera_fileutil.h b/examples/camera/camera_fileutil.h index 8dd029323..0340f9552 100644 --- a/examples/camera/camera_fileutil.h +++ b/examples/camera/camera_fileutil.h @@ -1,35 +1,20 @@ /**************************************************************************** - * camera/camera_fileutil.h + * apps/examples/camera/camera_fileutil.h * - * Copyright 2020 Sony Semiconductor Solutions Corporation + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: + * http://www.apache.org/licenses/LICENSE-2.0 * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Neither the name of Sony Semiconductor Solutions Corporation nor - * the names of its contributors may be used to endorse or promote - * products derived from this software without specific prior written - * permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. * ****************************************************************************/ diff --git a/examples/camera/camera_main.c b/examples/camera/camera_main.c index 0da36deae..288f6170c 100644 --- a/examples/camera/camera_main.c +++ b/examples/camera/camera_main.c @@ -1,35 +1,20 @@ /**************************************************************************** - * camera/camera_main.c + * apps/examples/camera/camera_main.c * - * Copyright 2018, 2020 Sony Semiconductor Solutions Corporation + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: + * http://www.apache.org/licenses/LICENSE-2.0 * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Neither the name of Sony Semiconductor Solutions Corporation nor - * the names of its contributors may be used to endorse or promote - * products derived from this software without specific prior written - * permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. * ****************************************************************************/ @@ -52,12 +37,18 @@ #include "camera_fileutil.h" +#ifdef CONFIG_EXAMPLES_CAMERA_OUTPUT_LCD +#include +#include +#include "camera_bkgd.h" +#endif + /**************************************************************************** * Pre-processor Definitions ****************************************************************************/ #define IMAGE_JPG_SIZE (512*1024) /* 512kB for FullHD Jpeg file. */ -#define IMAGE_YUV_SIZE (320*240*2) /* QVGA YUV422 */ +#define IMAGE_RGB_SIZE (320*240*2) /* QVGA RGB565 */ #define VIDEO_BUFNUM (3) #define STILL_BUFNUM (1) @@ -65,16 +56,8 @@ #define MAX_CAPTURE_NUM (100) #define DEFAULT_CAPTURE_NUM (10) -#define START_CAPTURE_TIME (5000) /* mili-seconds */ -#define KEEP_VIDEO_TIME (10000) /* mili-seconds */ - -#define RESET_INITIAL_TIME(t) gettimeofday(&(t), NULL) -#define UPDATE_DIFF_TIME(d, then, now) \ - { \ - gettimeofday(&(now), NULL); \ - (d) = ((((now).tv_sec - (then).tv_sec) * 1000) \ - + (((now).tv_usec - (then).tv_usec) / 1000)); \ - } +#define START_CAPTURE_TIME (5) /* seconds */ +#define KEEP_VIDEO_TIME (10) /* seconds */ #define APP_STATE_BEFORE_CAPTURE (0) #define APP_STATE_UNDER_CAPTURE (1) @@ -463,8 +446,13 @@ int main(int argc, FAR char *argv[]) enum v4l2_buf_type capture_type = V4L2_BUF_TYPE_STILL_CAPTURE; struct v4l2_buffer v4l2_buf; const char *save_dir; + int is_eternal; + int app_state; - struct timeval then; + struct timeval start; + struct timeval now; + struct timeval delta; + struct timeval wait; struct v_buffer *buffers_video = NULL; struct v_buffer *buffers_still = NULL; @@ -480,10 +468,30 @@ int main(int argc, FAR char *argv[]) /* ===== Initialization Code ===== */ + /* Initialize NX graphics subsystem to use LCD */ + +#ifdef CONFIG_EXAMPLES_CAMERA_OUTPUT_LCD + ret = nximage_initialize(); + if (ret < 0) + { + printf("camera_main: Failed to get NX handle: %d\n", errno); + return ERROR; + } +#endif + /* Select storage to save image files */ save_dir = futil_initialize(); + /* Initialize video driver to create a device file */ + + ret = video_initialize("/dev/video"); + if (ret != 0) + { + printf("ERROR: Failed to initialize video: errno = %d\n", errno); + goto exit_without_cleaning_videodriver; + } + /* Open the device file. */ v_fd = open("/dev/video", 0); @@ -507,13 +515,16 @@ int main(int argc, FAR char *argv[]) * And all allocated memorys are VIDIOC_QBUFed. */ - ret = camera_prepare(v_fd, V4L2_BUF_TYPE_STILL_CAPTURE, - V4L2_BUF_MODE_FIFO, V4L2_PIX_FMT_JPEG, - VIDEO_HSIZE_FULLHD, VIDEO_VSIZE_FULLHD, - &buffers_still, STILL_BUFNUM, IMAGE_JPG_SIZE); - if (ret != OK) + if (capture_num != 0) { - goto exit_this_app; + ret = camera_prepare(v_fd, V4L2_BUF_TYPE_STILL_CAPTURE, + V4L2_BUF_MODE_FIFO, V4L2_PIX_FMT_JPEG, + VIDEO_HSIZE_FULLHD, VIDEO_VSIZE_FULLHD, + &buffers_still, STILL_BUFNUM, IMAGE_JPG_SIZE); + if (ret != OK) + { + goto exit_this_app; + } } /* Prepare for VIDEO_CAPTURE stream. @@ -525,74 +536,182 @@ int main(int argc, FAR char *argv[]) * order from the captured frame buffer and a new camera image is * recaptured. * - * Allocate freame buffers for QVGA YUV422 size (320x240x2=150KB). + * Allocate freame buffers for QVGA RGB565 size (320x240x2=150KB). * Number of frame buffers is defined as VIDEO_BUFNUM(3). * And all allocated memorys are VIDIOC_QBUFed. */ ret = camera_prepare(v_fd, V4L2_BUF_TYPE_VIDEO_CAPTURE, - V4L2_BUF_MODE_RING, V4L2_PIX_FMT_UYVY, + V4L2_BUF_MODE_RING, V4L2_PIX_FMT_RGB565, VIDEO_HSIZE_QVGA, VIDEO_VSIZE_QVGA, - &buffers_video, VIDEO_BUFNUM, IMAGE_YUV_SIZE); + &buffers_video, VIDEO_BUFNUM, IMAGE_RGB_SIZE); if (ret != OK) { goto exit_this_app; } - printf("Take %d pictures as %s file in %s after %d mili-seconds.\n", - capture_num, - (capture_type == V4L2_BUF_TYPE_STILL_CAPTURE) ? "JPEG" : "YUV", - save_dir, START_CAPTURE_TIME); - printf(" After taking pictures, the app will be exit after %d ms.\n", - KEEP_VIDEO_TIME); + /* This application has 3 states. + * + * APP_STATE_BEFORE_CAPTURE: + * This state waits 5 seconds (definded START_CAPTURE_TIME) + * with displaying preview (VIDEO_CAPTURE stream image) on LCD. + * After 5 seconds, state will be changed to APP_STATE_UNDER_CAPTURE. + * + * APP_STATE_UNDER_CAPTURE: + * This state will start taking picture and store the image into files. + * Number of taking pictures is set capture_num valiable. + * It can be changed by command line argument. + * After finishing taking pictures, the state will be changed to + * APP_STATE_AFTER_CAPTURE. + * + * APP_STATE_AFTER_CAPTURE: + * This state waits 10 seconds (definded KEEP_VIDEO_TIME) + * with displaying preview (VIDEO_CAPTURE stream image) on LCD. + * After 10 seconds, this application will be finished. + * + * Notice: + * If capture_num is set '0', state will stay APP_STATE_BEFORE_CAPTURE. + */ - RESET_INITIAL_TIME(then); + app_state = APP_STATE_BEFORE_CAPTURE; + + /* Show this application behavior. */ + + if (capture_num == 0) + { + is_eternal = 1; + printf("Start video this mode is eternal." + " (Non stop, non save files.)\n"); +#ifndef CONFIG_EXAMPLES_CAMERA_OUTPUT_LCD + printf("This mode should be run with LCD display\n"); +#endif + } + else + { + is_eternal = 0; + wait.tv_sec = START_CAPTURE_TIME; + wait.tv_usec = 0; + printf("Take %d pictures as %s file in %s after %d seconds.\n", + capture_num, + (capture_type == V4L2_BUF_TYPE_STILL_CAPTURE) ? "JPEG" : "RGB", + save_dir, START_CAPTURE_TIME); + printf(" After finishing taking pictures," + " this app will be finished after %d seconds.\n", + KEEP_VIDEO_TIME); + } + + gettimeofday(&start, NULL); /* ===== Main Loop ===== */ while (1) { - printf("Start capturing...\n"); - ret = start_stillcapture(v_fd, capture_type); - if (ret != OK) + switch (app_state) { - goto exit_this_app; + /* BEFORE_CAPTURE and AFTER_CAPTURE is waiting for expiring the + * time. + * In the meantime, Captureing VIDEO image to show pre-view on LCD. + */ + + case APP_STATE_BEFORE_CAPTURE: + case APP_STATE_AFTER_CAPTURE: + ret = get_camimage(v_fd, &v4l2_buf, V4L2_BUF_TYPE_VIDEO_CAPTURE); + if (ret != OK) + { + goto exit_this_app; + } + +#ifdef CONFIG_EXAMPLES_CAMERA_OUTPUT_LCD + nximage_draw((void *)v4l2_buf.m.userptr, + VIDEO_HSIZE_QVGA, VIDEO_VSIZE_QVGA); +#endif + + ret = release_camimage(v_fd, &v4l2_buf); + if (ret != OK) + { + goto exit_this_app; + } + + if (!is_eternal) + { + gettimeofday(&now, NULL); + timersub(&now, &start, &delta); + if (timercmp(&delta, &wait, >)) + { + printf("Expire time is pasted. GoTo next state.\n"); + if (app_state == APP_STATE_BEFORE_CAPTURE) + { + app_state = APP_STATE_UNDER_CAPTURE; + } + else + { + ret = OK; + goto exit_this_app; + } + } + } + + break; /* Finish APP_STATE_BEFORE_CAPTURE or APP_STATE_AFTER_CAPTURE */ + + /* UNDER_CAPTURE is taking pictures until number of capture_num + * value. + * This state stays until finishing all pictures. + */ + + case APP_STATE_UNDER_CAPTURE: + printf("Start captureing...\n"); + ret = start_stillcapture(v_fd, capture_type); + if (ret != OK) + { + goto exit_this_app; + } + + while (capture_num) + { + ret = get_camimage(v_fd, &v4l2_buf, capture_type); + if (ret != OK) + { + goto exit_this_app; + } + + futil_writeimage( + (uint8_t *)v4l2_buf.m.userptr, + (size_t)v4l2_buf.bytesused, + (capture_type == V4L2_BUF_TYPE_VIDEO_CAPTURE) ? + "RGB" : "JPG"); + + ret = release_camimage(v_fd, &v4l2_buf); + if (ret != OK) + { + goto exit_this_app; + } + + capture_num--; + } + + ret = stop_stillcapture(v_fd, capture_type); + if (ret != OK) + { + goto exit_this_app; + } + + app_state = APP_STATE_AFTER_CAPTURE; + wait.tv_sec = KEEP_VIDEO_TIME; + wait.tv_usec = 0; + gettimeofday(&start, NULL); + printf("Finished captureing...\n"); + break; /* Finish APP_STATE_UNDER_CAPTURE */ + + default: + printf("Unknown error is occured.. state=%d\n", app_state); + goto exit_this_app; + break; } - - while (capture_num) - { - ret = get_camimage(v_fd, &v4l2_buf, capture_type); - if (ret != OK) - { - goto exit_this_app; - } - - futil_writeimage((uint8_t *)v4l2_buf.m.userptr, - (size_t)v4l2_buf.bytesused, - (capture_type == V4L2_BUF_TYPE_VIDEO_CAPTURE) ? "YUV" : "JPG"); - - ret = release_camimage(v_fd, &v4l2_buf); - if (ret != OK) - { - goto exit_this_app; - } - - capture_num--; - } - - ret = stop_stillcapture(v_fd, capture_type); - if (ret != OK) - { - goto exit_this_app; - } - - RESET_INITIAL_TIME(then); - printf("Finished capturing...\n"); } exit_this_app: - /* Close video device file makes dequqe all buffers */ + /* Close video device file makes dequeue all buffers */ close(v_fd); @@ -603,5 +722,12 @@ exit_without_cleaning_buffer: video_uninitialize(); +exit_without_cleaning_videodriver: + +#ifdef CONFIG_EXAMPLES_CAMERA_OUTPUT_LCD + nximage_finalize(); +#endif + return ret; } +