dialog_camera_open.c 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. /*
  2. * Copyright (C) 2021 Alibaba Group Holding Limited
  3. * Author: LuChongzhi <chongzhi.lcz@alibaba-inc.com>
  4. *
  5. * This program is free software; you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License version 2 as
  7. * published by the Free Software Foundation.
  8. */
  9. #include <stdio.h>
  10. #include <ctype.h>
  11. #include <string.h>
  12. #include <stdlib.h>
  13. #include <unistd.h>
  14. #include <curses.h>
  15. #define LOG_LEVEL 3
  16. #define LOG_PREFIX "dlg_open_camera"
  17. #include <syslog.h>
  18. #include <camera_manager.h>
  19. #include "param.h"
  20. #include "app_dialogs.h"
  21. extern cams_t *cam_session;
  22. int dialog_camera_open(void)
  23. {
  24. int ret_key = KEY_ESC;
  25. int ret;
  26. if (cam_session == NULL) {
  27. LOG_E("cam_session is NULL\n");
  28. return KEY_ESC;
  29. }
  30. if (cam_session->camera_handle != NULL) {
  31. csi_camera_info_s *info =
  32. &(cam_session->camera_infos.info[cam_session->camera_id]);
  33. char textbox_content[256];
  34. snprintf(textbox_content, sizeof(textbox_content),
  35. "Please close camera below first:\n"
  36. " camera: %s\n device:%s\n bus:%s\n",
  37. info->camera_name, info->device_name, info->bus_info);
  38. dialog_textbox("Error",
  39. textbox_content,
  40. 10, //int initial_height,
  41. 40, //int initial_width,
  42. (int []) {0}, //int *keys,
  43. NULL,
  44. NULL,
  45. NULL, //update_text_fn update_text,
  46. NULL /*void *data*/);
  47. return 0;
  48. }
  49. again:
  50. item_reset();
  51. if (camera_query_list(cam_session) != 0) {
  52. LOG_E("camera_query_list() failed\n");
  53. return KEY_ESC;
  54. }
  55. /* Prepare for checklist nodes */
  56. csi_camera_infos_s *cam_infos = &cam_session->camera_infos;
  57. for (int i = 0; i < cam_infos->count; i++) {
  58. csi_camera_info_s *info = &(cam_infos->info[i]);
  59. item_make("%-16s", info->camera_name);
  60. item_add_str("%-12s %s",
  61. info->device_name,
  62. info->bus_info);
  63. item_set_data(info); // store cam_info pointer
  64. if (i == cam_session->camera_id) {
  65. item_set_tag('X');
  66. item_set_selected(1);
  67. } else {
  68. item_set_tag(' ');
  69. item_set_selected(0);
  70. }
  71. }
  72. ret = dialog_checklist(
  73. "Select Camera to open", /* Title */
  74. "Select the camera to open. "
  75. "Press 'h' to get capabilities details",
  76. CHECKLIST_HEIGTH_MIN + 10,
  77. WIN_COLS - CHECKLIST_WIDTH_MIN - 16,
  78. 8,
  79. NULL, 0);
  80. int cam_id;
  81. int selected = item_activate_selected();
  82. LOG_D("ret=%d, selected=%s\n", ret, selected ? "true" : "false");
  83. char str_buf[256];
  84. switch (ret) {
  85. case 0: // item is selected
  86. if (!selected)
  87. break;
  88. /* Show operation result */
  89. cam_id = item_activate_selected_pos();
  90. //char str_buf[256];
  91. bool opened = (camera_open(cam_session, "/dev/video0") == 0);
  92. snprintf(str_buf, sizeof(str_buf),
  93. "Open the below camera %s:\n"
  94. "\t id=%d \n\t name='%s' \n\t device='%s' \n\t bus='%s'\n",
  95. opened ? "OK" : "Failed",
  96. cam_id,
  97. cam_session->camera_infos.info[cam_id].camera_name,
  98. cam_session->camera_infos.info[cam_id].device_name,
  99. cam_session->camera_infos.info[cam_id].bus_info);
  100. dialog_textbox_simple("Infomation", str_buf, 10, 40);
  101. LOG_I("csi_camera_infos_s.info[%d] is opened %s\n",
  102. cam_id, opened ? "OK" : "Failed");
  103. /* Show message bar */
  104. snprintf(str_buf, sizeof(str_buf),
  105. "The camera open %s: {%d, %s, %s, %s}\n",
  106. opened ? "OK" : "Failed",
  107. cam_id,
  108. cam_session->camera_infos.info[cam_id].camera_name,
  109. cam_session->camera_infos.info[cam_id].device_name,
  110. cam_session->camera_infos.info[cam_id].bus_info);
  111. message(str_buf, opened ? 1 : 2);
  112. break;
  113. case 1: // need help
  114. cam_id = item_n();
  115. //char str_buf[256];
  116. snprintf(str_buf, sizeof(str_buf),
  117. "Camera info:\n"
  118. "\t id=%d \n\t name='%s' \n\t device='%s' \n\t bus='%s'\n",
  119. cam_id,
  120. cam_session->camera_infos.info[cam_id].camera_name,
  121. cam_session->camera_infos.info[cam_id].device_name,
  122. cam_session->camera_infos.info[cam_id].bus_info);
  123. dialog_textbox_simple("Infomation", str_buf, 10, 40);
  124. goto again;
  125. case KEY_ESC: // specific KEY
  126. break;
  127. case -ERRDISPLAYTOOSMALL: // error
  128. default:
  129. LOG_W("Oops? why return ret=%d\n", ret);
  130. break;
  131. }
  132. LOG_D("ret=%d\n", ret);
  133. return 0;
  134. }