/**************************************************************************** * 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 #include #include #include #include #include #include #include #include #include #include #include #ifdef CONFIG_LIBUV # include # include #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; }