nuttx-apps/examples/lvgldemo/lvgldemo.c
pengyiqiang e86745b9a2 lvgldemo: use nitems instead of sizeof
Signed-off-by: pengyiqiang <pengyiqiang@xiaomi.com>
2023-02-22 23:09:42 +08:00

254 lines
6.4 KiB
C

/****************************************************************************
* apps/examples/lvgldemo/lvgldemo.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 <nuttx/config.h>
#include <sys/boardctl.h>
#include <sys/param.h>
#include <unistd.h>
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <debug.h>
#include <lvgl/lvgl.h>
#include <port/lv_port.h>
#include <lvgl/demos/lv_demos.h>
#ifdef CONFIG_LIBUV
# include <uv.h>
# include <port/lv_port_libuv.h>
#endif
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
/* Should we perform board-specific driver initialization? There are two
* ways that board initialization can occur: 1) automatically via
* board_late_initialize() during bootupif CONFIG_BOARD_LATE_INITIALIZE
* or 2).
* via a call to boardctl() if the interface is enabled
* (CONFIG_BOARDCTL=y).
* If this task is running as an NSH built-in application, then that
* initialization has probably already been performed otherwise we do it
* here.
*/
#undef NEED_BOARDINIT
#if defined(CONFIG_BOARDCTL) && !defined(CONFIG_NSH_ARCHINIT)
# define NEED_BOARDINIT 1
#endif
/****************************************************************************
* Private Type Declarations
****************************************************************************/
typedef CODE void (*demo_create_func_t)(void);
struct func_key_pair_s
{
FAR const char *name;
demo_create_func_t func;
};
/****************************************************************************
* Private Data
****************************************************************************/
static const struct func_key_pair_s func_key_pair[] =
{
#ifdef CONFIG_LV_USE_DEMO_WIDGETS
{ "widgets", lv_demo_widgets },
#endif
#ifdef CONFIG_LV_USE_DEMO_KEYPAD_AND_ENCODER
{ "keypad_encoder", lv_demo_keypad_encoder },
#endif
#ifdef CONFIG_LV_USE_DEMO_BENCHMARK
{ "benchmark", lv_demo_benchmark },
#endif
#ifdef CONFIG_LV_USE_DEMO_STRESS
{ "stress", lv_demo_stress },
#endif
#ifdef CONFIG_LV_USE_DEMO_MUSIC
{ "music", lv_demo_music },
#endif
{ "", NULL }
};
/****************************************************************************
* Private Functions
****************************************************************************/
/****************************************************************************
* Name: show_usage
****************************************************************************/
static void show_usage(void)
{
int i;
const int len = nitems(func_key_pair) - 1;
if (len == 0)
{
printf("lvgldemo: no demo available!\n");
exit(EXIT_FAILURE);
return;
}
printf("\nUsage: lvgldemo demo_name\n");
printf("\ndemo_name:\n");
for (i = 0; i < len; i++)
{
printf(" %s\n", func_key_pair[i].name);
}
exit(EXIT_FAILURE);
}
/****************************************************************************
* Name: find_demo_create_func
****************************************************************************/
static demo_create_func_t find_demo_create_func(FAR const char *name)
{
int i;
const int len = nitems(func_key_pair) - 1;
for (i = 0; i < len; i++)
{
if (strcmp(name, func_key_pair[i].name) == 0)
{
return func_key_pair[i].func;
}
}
printf("lvgldemo: '%s' not found.\n", name);
return NULL;
}
/****************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
* Name: main or lvgldemo_main
*
* Description:
*
* Input Parameters:
* Standard argc and argv
*
* Returned Value:
* Zero on success; a positive, non-zero value on failure.
*
****************************************************************************/
int main(int argc, FAR char *argv[])
{
demo_create_func_t demo_create_func;
FAR const char *demo = NULL;
const int func_key_pair_len = nitems(func_key_pair);
#ifdef CONFIG_LIBUV
uv_loop_t ui_loop;
#endif
/* If no arguments are specified and only 1 demo exists, select the demo */
if (argc == 1 && func_key_pair_len == 2) /* 2 because of NULL sentinel */
{
demo = func_key_pair[0].name;
}
else if (argc != 2)
{
show_usage();
return EXIT_FAILURE;
}
else
{
demo = argv[1];
}
demo_create_func = find_demo_create_func(demo);
if (demo_create_func == NULL)
{
show_usage();
return EXIT_FAILURE;
}
#ifdef NEED_BOARDINIT
/* Perform board-specific driver initialization */
boardctl(BOARDIOC_INIT, 0);
#ifdef CONFIG_BOARDCTL_FINALINIT
/* Perform architecture-specific final-initialization (if configured) */
boardctl(BOARDIOC_FINALINIT, 0);
#endif
#endif
/* LVGL initialization */
lv_init();
/* LVGL port initialization */
lv_port_init();
/* LVGL demo creation */
demo_create_func();
/* Handle LVGL tasks */
#ifdef CONFIG_LIBUV
uv_loop_init(&ui_loop);
lv_port_libuv_init(&ui_loop);
uv_run(&ui_loop, UV_RUN_DEFAULT);
#else
while (1)
{
uint32_t idle;
idle = lv_timer_handler();
/* Minimum sleep of 1ms */
idle = idle ? idle : 1;
usleep(idle * 1000);
}
#endif
return EXIT_SUCCESS;
}