123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302 |
- /*
- * Copyright (C) 2021 Alibaba Group Holding Limited
- * Author: LuChongzhi <chongzhi.lcz@alibaba-inc.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
- #include <stdio.h>
- #include <curses.h>
- #include <ctype.h>
- #include <string.h>
- #include <stdlib.h>
- #include <unistd.h>
- #define LOG_LEVEL 3
- #define LOG_PREFIX "camera_demo3"
- #include <syslog.h>
- #include "camera_manager.h"
- #include "param.h"
- #include "app_dialogs.h"
- #include "menu_process.h"
- cams_t *cam_session;
- WINDOW *menubar;
- WINDOW *messagebar;
- WINDOW *win_border;
- WINDOW *win_content;
- void init_curses()
- {
- initscr(); /* init curses */
- FILE *f = fopen("/dev/tty", "r+");
- SCREEN *screen = newterm(NULL, f, f);
- set_term(screen);
- start_color(); /* color init, then init color pair */
- init_pair(1, COLOR_WHITE, COLOR_BLACK);
- init_pair(2, COLOR_BLACK, COLOR_WHITE);
- init_pair(3, COLOR_RED, COLOR_WHITE);
- init_pair(4, COLOR_WHITE, COLOR_BLUE); // menu font
- init_pair(5, COLOR_YELLOW, COLOR_BLACK);
- init_pair(6, COLOR_GREEN, COLOR_WHITE);
- init_pair(7, COLOR_YELLOW, COLOR_WHITE);
- curs_set(0); /* Cursor mode: 0:hide/1:normal/2:hilight */
- noecho(); /* Do not display on screen */
- keypad(stdscr, TRUE); /* allow keypad map */
- }
- void uninit_curses()
- {
- echo();
- endwin();
- }
- void draw_menubar(WINDOW *menubar)
- {
- wbkgd(menubar, COLOR_PAIR(2));
- for (int i = 0; i < atoi(param[0][0]); i++) {
- wattron(menubar, COLOR_PAIR(3));
- mvwprintw(menubar, 0, i * 14 + 2, "%1d.", i + 1);
- wattroff(menubar, COLOR_PAIR(3));
- mvwprintw(menubar, 0, i * 14 + 4, "%-12s", param[0][i + 1]);
- }
- }
- WINDOW **draw_menu(int menu)
- {
- int i, start_col;
- WINDOW **items;
- items = (WINDOW **)malloc((atoi(param[menu][0]) + 1) * sizeof(WINDOW *));
- start_col = (menu - 1) * 14 + 2;
- items[0] = newwin(atoi(param[menu][0]) + 2, MENU_ITEM_MAX_LEN+2, 3, start_col);
- wbkgd(items[0], COLOR_PAIR(2));
- box(items[0], ACS_VLINE, ACS_HLINE);
- for (i = 1; i <= atoi(param[menu][0]); i++) {
- items[i] = subwin(items[0], 1, MENU_ITEM_MAX_LEN, 3 + i, start_col + 1);
- wprintw(items[i], "%s", param[menu][i]);
- }
- wbkgd(items[1], COLOR_PAIR(4));
- wrefresh(items[0]);
- return items;
- }
- void delete_menu(WINDOW **items, int count)
- {
- int i;
- for (i = 0; i < count; i++)
- delwin(items[i]);
- free(items);
- }
- int scroll_menu(WINDOW **items, int menu, int *menu_returned)
- {
- int key, count, selected = 0;
- count = atoi(param[menu][0]);
- LOG_D("Active: menu=%d, item=%d\n", menu, selected);
- while (1) {
- key = getch();
- if (key == KEY_DOWN || key == KEY_UP) {
- wbkgd(items[selected + 1], COLOR_PAIR(2));
- wnoutrefresh(items[selected + 1]);
- if (key == KEY_DOWN)
- selected = (selected + 1) % count;
- else
- selected = (selected + count - 1) % count;
- wbkgd(items[selected + 1], COLOR_PAIR(4));
- wnoutrefresh(items[selected + 1]);
- doupdate();
- } else if (key == KEY_LEFT || key == KEY_RIGHT) {
- delete_menu(items, count + 1);
- touchwin(stdscr);
- refresh();
- if (key == KEY_LEFT) {
- menu -= 1;
- if (menu <= 0) menu = atoi(param[0][0]);
- items = draw_menu(menu);
- *menu_returned = menu;
- LOG_D("Active: menu=%d, item=%d\n", *menu_returned, selected);
- return scroll_menu(items, menu, menu_returned);
- }
- if (key == KEY_RIGHT) {
- menu += 1;
- if (menu > atoi(param[0][0])) menu = 1;
- items = draw_menu(menu);
- *menu_returned = menu;
- LOG_D("Active: menu=%d, item=%d\n", *menu_returned, selected);
- return scroll_menu(items, menu, menu_returned);
- }
- } else if (key == ESCAPE || key == '0' || key == 'q') {
- delete_menu(items, count + 1);
- return -1;
- } else if (key == ENTER) {
- delete_menu(items, count + 1);
- return selected;
- }
- LOG_D("Active: menu=%d, item=%d\n", *menu_returned, selected);
- }
- }
- /* ss: display string,
- * status: 0:Normal, 1:OK, 2:Failed, 3:Warning */
- void message(char *ss, int status)
- {
- int color_pair;
- switch (status) {
- case 1:
- color_pair = 6; // GREEN:WHITE
- break;
- case 2:
- color_pair = 3; // RED:WHITE
- break;
- case 3:
- color_pair = 7; // YELLOW:WHITE
- break;
- default:
- color_pair = 2; // BLACK:WHITE
- break;
- };
- wbkgd(messagebar, COLOR_PAIR(2));
- wattron(messagebar, COLOR_PAIR(color_pair));
- mvwprintw(messagebar, 0, 0, "%80s", " ");
- mvwprintw(messagebar, 0, 1, "%s", ss);
- wattroff(messagebar, COLOR_PAIR(color_pair));
- wrefresh(messagebar);
- }
- void copyright()
- {
- char *str[] = { "Copyright (C) 2021 Alibaba Group Holding Limited",
- "Author: LuChongzhi, T-Head / IOT / OS Team",
- "mailto:[chongzhi.lcz@alibaba-inc.com]"};
- attron(A_UNDERLINE | COLOR_PAIR(1));
- for (int i = 0; i < sizeof(str) / sizeof(char *); i++)
- mvaddstr((WIN_ROWS - 2) / 2 + i, (WIN_COLS - strlen(str[0])) / 2, str[i]);
- attroff(A_UNDERLINE | COLOR_PAIR(1));
- refresh();
- }
- int main(int argc, char **argv)
- {
- int ret = -1;
- int key;
- WINDOW **menu_items;
- if (get_param(argv[0])) {
- LOG_E("\n Open %s.conf failed!\n", argv[0]);
- goto LAB_EXIT;
- }
- if (camera_create_session(&cam_session) != 0 || cam_session == NULL) {
- LOG_E("camera_create_session() failed\n");
- goto LAB_EXIT;
- }
- init_curses();
- if (init_dialog(NULL)) {
- fprintf(stderr, N_("Your display is too small to run Menuconfig!\n"));
- fprintf(stderr, N_("It must be at least 19 lines by 80 columns.\n"));
- goto LAB_EXIT_CURSES_INITED;
- }
- bkgd(COLOR_PAIR(1)); /* COLOR_WHITE, COLOR_BLACK */
- /* set windows postion: (win, lines, cols, begin_y, begin_x) */
- menubar = subwin(stdscr, 1, WIN_COLS, 1, 0); /* Menu bar line */
- messagebar = subwin(stdscr, 1, WIN_COLS, WIN_ROWS - 1, 0); /* Bottom line */
- win_border = subwin(stdscr, WIN_ROWS - 3, WIN_COLS, 2, 0); /* Content win with border */
- win_content = subwin(stdscr, WIN_ROWS - 5, WIN_COLS - 2, 3, 1); /* Content win without border */
- /* Set window title */
- char str_title[81];
- strcpy(str_title, "<<< CSI Camera Test Tool >>>");
- wattron(stdscr, COLOR_PAIR(5));
- mvwprintw(stdscr, 0, (80 - strlen(str_title)) / 2 - 1, "%s", str_title);
- wattroff(stdscr, COLOR_PAIR(5));
- /* Draw menu */
- draw_menubar(menubar);
- message("Use number key to choses menu. 'q' or '0' to Exit", 0);
- /* Draw box border */
- box(win_border, ACS_VLINE, ACS_HLINE);
- /* Show copyright */
- copyright();
- refresh();
- /* menu operate loop */
- do {
- key = wgetch(stdscr);
- if (isdigit(key) && key > '0' && key <= atoi(param[0][0]) + '0') {
- werase(messagebar);
- wrefresh(messagebar);
- int menu_init = key - '0'; // first press menu id
- int menu_final = menu_init; // return from scroll_menu
- menu_items = draw_menu(menu_init);
- int item_selected = scroll_menu(menu_items, menu_init, &menu_final);
- LOG_D("menu_final=%d, selected_item=%d\n",
- menu_final, item_selected);
- switch(menu_final) {
- case MENU_CAMERA:
- menu_camera_process(item_selected);
- break;
- case MENU_CHANNEL:
- menu_channel_process(item_selected);
- break;
- case MENU_EVENT_RUN:
- menu_event_run_process(item_selected);
- break;
- default:
- LOG_W("Not supported menu: %d\n", menu_final);
- break;
- }
- if (item_selected == 13) {
- LOG_D("Test dialog_inputbox\n");
- dialog_inputbox("inputbox", "prompt", 16, 80,
- "const char init");
- }
- touchwin(stdscr);
- refresh();
- } else if (key == KEY_RESIZE) {
- box(win_border, ACS_VLINE, ACS_HLINE);
- wrefresh(messagebar);
- }
- } while (key != 'q' && key != '0');
- ret = 0;
- LAB_EXIT_WIN_CREATED:
- delwin(win_content);
- delwin(win_border);
- delwin(menubar);
- delwin(messagebar);
- LAB_EXIT_CURSES_INITED:
- uninit_curses();
- LAB_EXIT_CAM_MGR_CREATED:
- camera_destory_session(&cam_session);
- LAB_EXIT:
- return ret;
- }
|