server_camera.cpp 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. #include "server_camera.h"
  2. #include <string>
  3. #include "string.h"
  4. #include "esp_camera.h"
  5. #include "ClassControllCamera.h"
  6. #include "ClassLogFile.h"
  7. #define SCRATCH_BUFSIZE2 8192
  8. char scratch2[SCRATCH_BUFSIZE2];
  9. // #define DEBUG_DETAIL_ON
  10. void PowerResetCamera(){
  11. ESP_LOGD(TAGPARTCAMERA, "Resetting camera by power down line");
  12. gpio_config_t conf = { 0 };
  13. conf.pin_bit_mask = 1LL << GPIO_NUM_32;
  14. conf.mode = GPIO_MODE_OUTPUT;
  15. gpio_config(&conf);
  16. // carefull, logic is inverted compared to reset pin
  17. gpio_set_level(GPIO_NUM_32, 1);
  18. vTaskDelay(1000 / portTICK_PERIOD_MS);
  19. gpio_set_level(GPIO_NUM_32, 0);
  20. vTaskDelay(1000 / portTICK_PERIOD_MS);
  21. }
  22. esp_err_t handler_lightOn(httpd_req_t *req)
  23. {
  24. #ifdef DEBUG_DETAIL_ON
  25. if (debug_detail_heap) LogFile.WriteHeapInfo("handler_lightOn - Start");
  26. LogFile.WriteToFile("handler_lightOn");
  27. printf("handler_lightOn uri:\n"); printf(req->uri); printf("\n");
  28. #endif
  29. Camera.LightOnOff(true);
  30. const char* resp_str = (const char*) req->user_ctx;
  31. httpd_resp_send(req, resp_str, strlen(resp_str));
  32. #ifdef DEBUG_DETAIL_ON
  33. if (debug_detail_heap) LogFile.WriteHeapInfo("handler_lightOn - Done");
  34. #endif
  35. return ESP_OK;
  36. };
  37. esp_err_t handler_lightOff(httpd_req_t *req)
  38. {
  39. #ifdef DEBUG_DETAIL_ON
  40. if (debug_detail_heap) LogFile.WriteHeapInfo("handler_lightOff - Start");
  41. LogFile.WriteToFile("handler_lightOff");
  42. printf("handler_lightOff uri:\n"); printf(req->uri); printf("\n");
  43. #endif
  44. Camera.LightOnOff(false);
  45. const char* resp_str = (const char*) req->user_ctx;
  46. httpd_resp_send(req, resp_str, strlen(resp_str));
  47. #ifdef DEBUG_DETAIL_ON
  48. if (debug_detail_heap) LogFile.WriteHeapInfo("handler_lightOff - Done");
  49. #endif
  50. return ESP_OK;
  51. };
  52. esp_err_t handler_capture(httpd_req_t *req)
  53. {
  54. #ifdef DEBUG_DETAIL_ON
  55. if (debug_detail_heap) LogFile.WriteHeapInfo("handler_capture - Start");
  56. LogFile.WriteToFile("handler_capture");
  57. #endif
  58. int quality;
  59. framesize_t res;
  60. Camera.GetCameraParameter(req, quality, res);
  61. #ifdef DEBUG_DETAIL_ON
  62. printf("Size: %d", res); printf(" Quality: %d\n", quality);
  63. #endif
  64. Camera.SetQualitySize(quality, res);
  65. esp_err_t ressult;
  66. ressult = Camera.CaptureToHTTP(req);
  67. #ifdef DEBUG_DETAIL_ON
  68. if (debug_detail_heap) LogFile.WriteHeapInfo("handler_capture - Done");
  69. #endif
  70. return ressult;
  71. };
  72. esp_err_t handler_capture_with_ligth(httpd_req_t *req)
  73. {
  74. if (debug_detail_heap) LogFile.WriteHeapInfo("handler_capture_with_ligth - Start");
  75. LogFile.WriteToFile("handler_capture_with_ligth");
  76. char _query[100];
  77. char _delay[10];
  78. int quality;
  79. framesize_t res;
  80. int delay = 2500;
  81. if (httpd_req_get_url_query_str(req, _query, 100) == ESP_OK)
  82. {
  83. printf("Query: "); printf(_query); printf("\n");
  84. if (httpd_query_key_value(_query, "delay", _delay, 10) == ESP_OK)
  85. {
  86. #ifdef DEBUG_DETAIL_ON
  87. printf("Delay: "); printf(_delay); printf("\n");
  88. #endif
  89. delay = atoi(_delay);
  90. if (delay < 0)
  91. delay = 0;
  92. }
  93. };
  94. Camera.GetCameraParameter(req, quality, res);
  95. #ifdef DEBUG_DETAIL_ON
  96. printf("Size: %d", res); printf(" Quality: %d\n", quality);
  97. #endif
  98. Camera.SetQualitySize(quality, res);
  99. Camera.LightOnOff(true);
  100. const TickType_t xDelay = delay / portTICK_PERIOD_MS;
  101. vTaskDelay( xDelay );
  102. esp_err_t ressult;
  103. ressult = Camera.CaptureToHTTP(req);
  104. Camera.LightOnOff(false);
  105. #ifdef DEBUG_DETAIL_ON
  106. if (debug_detail_heap) LogFile.WriteHeapInfo("handler_capture_with_ligth - Done");
  107. #endif
  108. return ressult;
  109. };
  110. esp_err_t handler_capture_save_to_file(httpd_req_t *req)
  111. {
  112. #ifdef DEBUG_DETAIL_ON
  113. if (debug_detail_heap) LogFile.WriteHeapInfo("handler_capture_save_to_file - Start");
  114. LogFile.WriteToFile("handler_capture_save_to_file");
  115. #endif
  116. char _query[100];
  117. char _delay[10];
  118. int delay = 0;
  119. char filename[100];
  120. std::string fn = "/sdcard/";
  121. int quality;
  122. framesize_t res;
  123. if (httpd_req_get_url_query_str(req, _query, 100) == ESP_OK)
  124. {
  125. printf("Query: "); printf(_query); printf("\n");
  126. if (httpd_query_key_value(_query, "filename", filename, 100) == ESP_OK)
  127. {
  128. fn.append(filename);
  129. #ifdef DEBUG_DETAIL_ON
  130. printf("Filename: "); printf(fn.c_str()); printf("\n");
  131. #endif
  132. }
  133. else
  134. fn.append("noname.jpg");
  135. if (httpd_query_key_value(_query, "delay", _delay, 10) == ESP_OK)
  136. {
  137. #ifdef DEBUG_DETAIL_ON
  138. printf("Delay: "); printf(_delay); printf("\n");
  139. #endif
  140. delay = atoi(_delay);
  141. if (delay < 0)
  142. delay = 0;
  143. }
  144. }
  145. else
  146. fn.append("noname.jpg");
  147. Camera.GetCameraParameter(req, quality, res);
  148. #ifdef DEBUG_DETAIL_ON
  149. printf("Size: %d", res); printf(" Quality: %d\n", quality);
  150. #endif
  151. Camera.SetQualitySize(quality, res);
  152. esp_err_t ressult;
  153. ressult = Camera.CaptureToFile(fn, delay);
  154. const char* resp_str = (const char*) fn.c_str();
  155. httpd_resp_send(req, resp_str, strlen(resp_str));
  156. #ifdef DEBUG_DETAIL_ON
  157. if (debug_detail_heap) LogFile.WriteHeapInfo("handler_capture_save_to_file - Done");
  158. #endif
  159. return ressult;
  160. };
  161. void register_server_camera_uri(httpd_handle_t server)
  162. {
  163. #ifdef DEBUG_DETAIL_ON
  164. ESP_LOGI(TAGPARTCAMERA, "server_part_camera - Registering URI handlers");
  165. #endif
  166. httpd_uri_t camuri = { };
  167. camuri.method = HTTP_GET;
  168. camuri.uri = "/lighton";
  169. camuri.handler = handler_lightOn;
  170. camuri.user_ctx = (void*) "Light On";
  171. httpd_register_uri_handler(server, &camuri);
  172. camuri.uri = "/lightoff";
  173. camuri.handler = handler_lightOff;
  174. camuri.user_ctx = (void*) "Light Off";
  175. httpd_register_uri_handler(server, &camuri);
  176. camuri.uri = "/capture";
  177. camuri.handler = handler_capture;
  178. camuri.user_ctx = NULL;
  179. httpd_register_uri_handler(server, &camuri);
  180. camuri.uri = "/capture_with_flashlight";
  181. camuri.handler = handler_capture_with_ligth;
  182. camuri.user_ctx = NULL;
  183. httpd_register_uri_handler(server, &camuri);
  184. camuri.uri = "/save";
  185. camuri.handler = handler_capture_save_to_file;
  186. camuri.user_ctx = NULL;
  187. httpd_register_uri_handler(server, &camuri);
  188. }