server_camera.cpp 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. #include "server_camera.h"
  2. #include <string>
  3. #include "string.h"
  4. #include "esp_camera.h"
  5. #include "ClassControllCamera.h"
  6. #include "MainFlowControl.h"
  7. #include "ClassLogFile.h"
  8. #include "esp_log.h"
  9. #include "../../include/defines.h"
  10. static const char *TAG = "server_cam";
  11. void PowerResetCamera()
  12. {
  13. ESP_LOGD(TAG, "Resetting camera by power down line");
  14. gpio_config_t conf;
  15. conf.intr_type = GPIO_INTR_DISABLE;
  16. conf.pin_bit_mask = 1LL << GPIO_NUM_32;
  17. conf.mode = GPIO_MODE_OUTPUT;
  18. conf.pull_down_en = GPIO_PULLDOWN_DISABLE;
  19. conf.pull_up_en = GPIO_PULLUP_DISABLE;
  20. gpio_config(&conf);
  21. // carefull, logic is inverted compared to reset pin
  22. gpio_set_level(GPIO_NUM_32, 1);
  23. vTaskDelay(1000 / portTICK_PERIOD_MS);
  24. gpio_set_level(GPIO_NUM_32, 0);
  25. vTaskDelay(1000 / portTICK_PERIOD_MS);
  26. }
  27. esp_err_t handler_lightOn(httpd_req_t *req)
  28. {
  29. #ifdef DEBUG_DETAIL_ON
  30. LogFile.WriteHeapInfo("handler_lightOn - Start");
  31. ESP_LOGD(TAG, "handler_lightOn uri: %s", req->uri);
  32. #endif
  33. if (Camera.getCameraInitSuccessful())
  34. {
  35. Camera.LightOnOff(true);
  36. const char *resp_str = (const char *)req->user_ctx;
  37. httpd_resp_send(req, resp_str, strlen(resp_str));
  38. }
  39. else
  40. {
  41. httpd_resp_send_err(req, HTTPD_403_FORBIDDEN, "Camera not initialized: REST API /lighton not available!");
  42. return ESP_ERR_NOT_FOUND;
  43. }
  44. #ifdef DEBUG_DETAIL_ON
  45. LogFile.WriteHeapInfo("handler_lightOn - Done");
  46. #endif
  47. return ESP_OK;
  48. }
  49. esp_err_t handler_lightOff(httpd_req_t *req)
  50. {
  51. #ifdef DEBUG_DETAIL_ON
  52. LogFile.WriteHeapInfo("handler_lightOff - Start");
  53. ESP_LOGD(TAG, "handler_lightOff uri: %s", req->uri);
  54. #endif
  55. if (Camera.getCameraInitSuccessful())
  56. {
  57. Camera.LightOnOff(false);
  58. const char *resp_str = (const char *)req->user_ctx;
  59. httpd_resp_send(req, resp_str, strlen(resp_str));
  60. }
  61. else
  62. {
  63. httpd_resp_send_err(req, HTTPD_403_FORBIDDEN, "Camera not initialized: REST API /lightoff not available!");
  64. return ESP_ERR_NOT_FOUND;
  65. }
  66. #ifdef DEBUG_DETAIL_ON
  67. LogFile.WriteHeapInfo("handler_lightOff - Done");
  68. #endif
  69. return ESP_OK;
  70. }
  71. esp_err_t handler_capture(httpd_req_t *req)
  72. {
  73. #ifdef DEBUG_DETAIL_ON
  74. LogFile.WriteHeapInfo("handler_capture - Start");
  75. #endif
  76. if (Camera.getCameraInitSuccessful())
  77. {
  78. // If the camera settings were changed by creating a new reference image, they must be reset
  79. if (CFstatus.changedCameraSettings)
  80. {
  81. Camera.setSensorDatenFromCCstatus(); // CCstatus >>> Kamera
  82. Camera.SetQualityZoomSize(CCstatus.ImageQuality, CCstatus.ImageFrameSize, CCstatus.ImageZoomEnabled, CCstatus.ImageZoomOffsetX, CCstatus.ImageZoomOffsetY, CCstatus.ImageZoomSize);
  83. CFstatus.changedCameraSettings = false;
  84. }
  85. #ifdef DEBUG_DETAIL_ON
  86. ESP_LOGD(TAG, "Size: %d, Quality: %d", CCstatus.ImageFrameSize, CCstatus.ImageQuality);
  87. #endif
  88. esp_err_t result;
  89. result = Camera.CaptureToHTTP(req);
  90. #ifdef DEBUG_DETAIL_ON
  91. LogFile.WriteHeapInfo("handler_capture - Done");
  92. #endif
  93. return result;
  94. }
  95. else
  96. {
  97. httpd_resp_send_err(req, HTTPD_403_FORBIDDEN, "Camera not initialized: REST API /capture not available!");
  98. return ESP_ERR_NOT_FOUND;
  99. }
  100. }
  101. esp_err_t handler_capture_with_light(httpd_req_t *req)
  102. {
  103. #ifdef DEBUG_DETAIL_ON
  104. LogFile.WriteHeapInfo("handler_capture_with_light - Start");
  105. #endif
  106. if (Camera.getCameraInitSuccessful())
  107. {
  108. char _query[100];
  109. char _delay[10];
  110. int delay = 2500;
  111. if (httpd_req_get_url_query_str(req, _query, 100) == ESP_OK)
  112. {
  113. ESP_LOGD(TAG, "Query: %s", _query);
  114. if (httpd_query_key_value(_query, "delay", _delay, 10) == ESP_OK)
  115. {
  116. #ifdef DEBUG_DETAIL_ON
  117. ESP_LOGD(TAG, "Delay: %s", _delay);
  118. #endif
  119. delay = atoi(_delay);
  120. if (delay < 0)
  121. {
  122. delay = 0;
  123. }
  124. }
  125. }
  126. // If the camera settings were changed by creating a new reference image, they must be reset
  127. if (CFstatus.changedCameraSettings)
  128. {
  129. Camera.setSensorDatenFromCCstatus(); // CCstatus >>> Kamera
  130. Camera.SetQualityZoomSize(CCstatus.ImageQuality, CCstatus.ImageFrameSize, CCstatus.ImageZoomEnabled, CCstatus.ImageZoomOffsetX, CCstatus.ImageZoomOffsetY, CCstatus.ImageZoomSize);
  131. CFstatus.changedCameraSettings = false;
  132. }
  133. #ifdef DEBUG_DETAIL_ON
  134. ESP_LOGD(TAG, "Size: %d, Quality: %d", CCstatus.ImageFrameSize, CCstatus.ImageQuality);
  135. #endif
  136. Camera.LightOnOff(true);
  137. const TickType_t xDelay = delay / portTICK_PERIOD_MS;
  138. vTaskDelay(xDelay);
  139. esp_err_t result;
  140. result = Camera.CaptureToHTTP(req);
  141. Camera.LightOnOff(false);
  142. #ifdef DEBUG_DETAIL_ON
  143. LogFile.WriteHeapInfo("handler_capture_with_light - Done");
  144. #endif
  145. return result;
  146. }
  147. else
  148. {
  149. httpd_resp_send_err(req, HTTPD_403_FORBIDDEN, "Camera not initialized: REST API /capture_with_flashlight not available!");
  150. return ESP_ERR_NOT_FOUND;
  151. }
  152. }
  153. esp_err_t handler_capture_save_to_file(httpd_req_t *req)
  154. {
  155. #ifdef DEBUG_DETAIL_ON
  156. LogFile.WriteHeapInfo("handler_capture_save_to_file - Start");
  157. #endif
  158. if (Camera.getCameraInitSuccessful())
  159. {
  160. char _query[100];
  161. char _delay[10];
  162. int delay = 0;
  163. char filename[100];
  164. std::string fn = "/sdcard/";
  165. if (httpd_req_get_url_query_str(req, _query, 100) == ESP_OK)
  166. {
  167. ESP_LOGD(TAG, "Query: %s", _query);
  168. if (httpd_query_key_value(_query, "filename", filename, 100) == ESP_OK)
  169. {
  170. fn.append(filename);
  171. #ifdef DEBUG_DETAIL_ON
  172. ESP_LOGD(TAG, "Filename: %s", fn.c_str());
  173. #endif
  174. }
  175. else
  176. {
  177. fn.append("noname.jpg");
  178. }
  179. if (httpd_query_key_value(_query, "delay", _delay, 10) == ESP_OK)
  180. {
  181. #ifdef DEBUG_DETAIL_ON
  182. ESP_LOGD(TAG, "Delay: %s", _delay);
  183. #endif
  184. delay = atoi(_delay);
  185. if (delay < 0)
  186. {
  187. delay = 0;
  188. }
  189. }
  190. }
  191. else
  192. {
  193. fn.append("noname.jpg");
  194. }
  195. // If the camera settings were changed by creating a new reference image, they must be reset
  196. if (CFstatus.changedCameraSettings)
  197. {
  198. Camera.setSensorDatenFromCCstatus(); // CCstatus >>> Kamera
  199. Camera.SetQualityZoomSize(CCstatus.ImageQuality, CCstatus.ImageFrameSize, CCstatus.ImageZoomEnabled, CCstatus.ImageZoomOffsetX, CCstatus.ImageZoomOffsetY, CCstatus.ImageZoomSize);
  200. CFstatus.changedCameraSettings = false;
  201. }
  202. #ifdef DEBUG_DETAIL_ON
  203. ESP_LOGD(TAG, "Size: %d, Quality: %d", CCstatus.ImageFrameSize, CCstatus.ImageQuality);
  204. #endif
  205. esp_err_t result;
  206. result = Camera.CaptureToFile(fn, delay);
  207. const char *resp_str = (const char *)fn.c_str();
  208. httpd_resp_send(req, resp_str, strlen(resp_str));
  209. #ifdef DEBUG_DETAIL_ON
  210. LogFile.WriteHeapInfo("handler_capture_save_to_file - Done");
  211. #endif
  212. return result;
  213. }
  214. else
  215. {
  216. httpd_resp_send_err(req, HTTPD_403_FORBIDDEN, "Camera not initialized: REST API /save not available!");
  217. return ESP_ERR_NOT_FOUND;
  218. }
  219. }
  220. void register_server_camera_uri(httpd_handle_t server)
  221. {
  222. #ifdef DEBUG_DETAIL_ON
  223. ESP_LOGI(TAG, "server_part_camera - Registering URI handlers");
  224. #endif
  225. httpd_uri_t camuri = {};
  226. camuri.method = HTTP_GET;
  227. camuri.uri = "/lighton";
  228. camuri.handler = handler_lightOn;
  229. camuri.user_ctx = (void *)"Light On";
  230. httpd_register_uri_handler(server, &camuri);
  231. camuri.uri = "/lightoff";
  232. camuri.handler = handler_lightOff;
  233. camuri.user_ctx = (void *)"Light Off";
  234. httpd_register_uri_handler(server, &camuri);
  235. camuri.uri = "/capture";
  236. camuri.handler = handler_capture;
  237. camuri.user_ctx = NULL;
  238. httpd_register_uri_handler(server, &camuri);
  239. camuri.uri = "/capture_with_flashlight";
  240. camuri.handler = handler_capture_with_light;
  241. camuri.user_ctx = NULL;
  242. httpd_register_uri_handler(server, &camuri);
  243. camuri.uri = "/save";
  244. camuri.handler = handler_capture_save_to_file;
  245. camuri.user_ctx = NULL;
  246. httpd_register_uri_handler(server, &camuri);
  247. }