dialog_camera_set_mode.c 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  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_set_mode"
  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_set_mode(void)
  23. {
  24. int ret_key = KEY_ESC;
  25. int ret;
  26. LOG_D("Test dialog_checklist\n");
  27. if (cam_session == NULL) {
  28. LOG_E("cam_session is NULL\n");
  29. return KEY_ESC;
  30. }
  31. if (cam_session->camera_handle == NULL) {
  32. LOG_I("The camera has not been opened yet\n");
  33. dialog_textbox_simple("Infomation", "There's No camera opened yet", 10, 40);
  34. return -1;
  35. }
  36. again:
  37. item_reset();
  38. if (camera_get_modes(cam_session) != 0) {
  39. LOG_E("camera_query_list() failed\n");
  40. return KEY_ESC;
  41. }
  42. /* Prepare for checklist nodes */
  43. csi_camera_modes_s *modes = &(cam_session->camera_modes);
  44. for (int i = 0; i < modes->count; i++) {
  45. char mode_desc[256];
  46. item_make("mode-%02d: ", modes->modes[i].mode_id);
  47. strncpy(mode_desc, modes->modes[i].description, sizeof(mode_desc));
  48. mode_desc[60] = '\0';
  49. item_add_str(mode_desc);
  50. item_set_data(&modes->modes[i]); // store cam_info pointer
  51. if (cam_session->camera_mode_id == modes->modes[i].mode_id) {
  52. item_set_tag('X');
  53. item_set_selected(1);
  54. } else {
  55. item_set_tag(' ');
  56. item_set_selected(0);
  57. }
  58. }
  59. ret = dialog_checklist(
  60. "Set Camera mode", /* Title */
  61. "Select the camera working mode."
  62. "Press 'h' to get details",
  63. CHECKLIST_HEIGTH_MIN + 10,
  64. WIN_COLS - CHECKLIST_WIDTH_MIN - 16,
  65. 8,
  66. NULL, 0);
  67. int item_id;
  68. int cam_id;
  69. int mode_id;
  70. int selected = item_activate_selected();
  71. LOG_D("ret=%d, selected=%d\n", ret, selected);
  72. char str_buf[256];
  73. switch (ret) {
  74. case 0: // item is selected
  75. if (!selected)
  76. break;
  77. /* Set camera mode */
  78. item_id = item_n(); // selected item: modes->modes[item_id]
  79. cam_id = cam_session->camera_id;
  80. mode_id = modes->modes[item_id].mode_id;
  81. ret = camera_set_mode(cam_session, mode_id);
  82. if (ret != 0) {
  83. LOG_E("camera_set_mode() failed\n");
  84. }
  85. //char str_buf[256];
  86. snprintf(str_buf, sizeof(str_buf),
  87. "Set the below camera:\n"
  88. "\t id=%d \n\t name='%s' \n\t device='%s' \n\t bus='%s'\n"
  89. "to be working mode:%d %s",
  90. cam_id,
  91. cam_session->camera_infos.info[cam_id].camera_name,
  92. cam_session->camera_infos.info[cam_id].device_name,
  93. cam_session->camera_infos.info[cam_id].bus_info,
  94. mode_id,
  95. (ret == 0) ? "OK" : "Failed");
  96. dialog_textbox_simple("Infomation", str_buf, 10, 40);
  97. LOG_I("csi_camera_infos_s.info[%d] is opened %s\n",
  98. cam_id, (ret == 0) ? "OK" : "Failed");
  99. cam_session->camera_mode_id = mode_id;
  100. /* Show message bar */
  101. snprintf(str_buf, sizeof(str_buf),
  102. "Set camera(%d) to be mode: %d %s\n",
  103. cam_id, mode_id, (ret == 0) ? "OK" : "Failed");
  104. message(str_buf, (ret == 0) ? 1 : 2);
  105. break;
  106. case 1: // need help
  107. cam_id = item_n();
  108. //char str_buf[256];
  109. snprintf(str_buf, sizeof(str_buf),
  110. "Camera info:\n"
  111. "\t id=%d \n\t name='%s' \n\t device='%s' \n\t bus='%s'\n",
  112. cam_id,
  113. cam_session->camera_infos.info[cam_id].camera_name,
  114. cam_session->camera_infos.info[cam_id].device_name,
  115. cam_session->camera_infos.info[cam_id].bus_info);
  116. dialog_textbox_simple("Infomation", str_buf, 10, 40);
  117. goto again;
  118. case KEY_ESC: // specific KEY
  119. break;
  120. case -ERRDISPLAYTOOSMALL: // error
  121. default:
  122. LOG_W("Oops? why return ret=%d\n", ret);
  123. break;
  124. }
  125. LOG_D("dialog_checklist() ret=%d\n", ret);
  126. return 0;
  127. }