|
|
@@ -0,0 +1,246 @@
|
|
|
+#include "server_camera.h"
|
|
|
+
|
|
|
+#include <string>
|
|
|
+#include "string.h"
|
|
|
+
|
|
|
+#include "esp_camera.h"
|
|
|
+#include "ClassControllCamera.h"
|
|
|
+
|
|
|
+#include "ClassLogFile.h"
|
|
|
+
|
|
|
+#define SCRATCH_BUFSIZE2 8192
|
|
|
+char scratch2[SCRATCH_BUFSIZE2];
|
|
|
+
|
|
|
+//#define DEBUG_DETAIL_ON
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+void PowerResetCamera(){
|
|
|
+ ESP_LOGD(TAGPARTCAMERA, "Resetting camera by power down line");
|
|
|
+ gpio_config_t conf = { 0 };
|
|
|
+ conf.pin_bit_mask = 1LL << GPIO_NUM_32;
|
|
|
+ conf.mode = GPIO_MODE_OUTPUT;
|
|
|
+ gpio_config(&conf);
|
|
|
+
|
|
|
+ // carefull, logic is inverted compared to reset pin
|
|
|
+ gpio_set_level(GPIO_NUM_32, 1);
|
|
|
+ vTaskDelay(1000 / portTICK_PERIOD_MS);
|
|
|
+ gpio_set_level(GPIO_NUM_32, 0);
|
|
|
+ vTaskDelay(1000 / portTICK_PERIOD_MS);
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+esp_err_t handler_lightOn(httpd_req_t *req)
|
|
|
+{
|
|
|
+#ifdef DEBUG_DETAIL_ON
|
|
|
+ LogFile.WriteHeapInfo("handler_lightOn - Start");
|
|
|
+ printf("handler_lightOn uri:\n"); printf(req->uri); printf("\n");
|
|
|
+#endif
|
|
|
+
|
|
|
+ Camera.LightOnOff(true);
|
|
|
+ const char* resp_str = (const char*) req->user_ctx;
|
|
|
+ httpd_resp_send(req, resp_str, strlen(resp_str));
|
|
|
+
|
|
|
+#ifdef DEBUG_DETAIL_ON
|
|
|
+ LogFile.WriteHeapInfo("handler_lightOn - Done");
|
|
|
+#endif
|
|
|
+
|
|
|
+ return ESP_OK;
|
|
|
+};
|
|
|
+
|
|
|
+esp_err_t handler_lightOff(httpd_req_t *req)
|
|
|
+{
|
|
|
+#ifdef DEBUG_DETAIL_ON
|
|
|
+ LogFile.WriteHeapInfo("handler_lightOff - Start");
|
|
|
+ printf("handler_lightOff uri:\n"); printf(req->uri); printf("\n");
|
|
|
+#endif
|
|
|
+ Camera.LightOnOff(false);
|
|
|
+ const char* resp_str = (const char*) req->user_ctx;
|
|
|
+ httpd_resp_send(req, resp_str, strlen(resp_str));
|
|
|
+
|
|
|
+#ifdef DEBUG_DETAIL_ON
|
|
|
+ LogFile.WriteHeapInfo("handler_lightOff - Done");
|
|
|
+#endif
|
|
|
+
|
|
|
+ return ESP_OK;
|
|
|
+};
|
|
|
+
|
|
|
+esp_err_t handler_capture(httpd_req_t *req)
|
|
|
+{
|
|
|
+#ifdef DEBUG_DETAIL_ON
|
|
|
+ LogFile.WriteHeapInfo("handler_capture - Start");
|
|
|
+#endif
|
|
|
+
|
|
|
+ int quality;
|
|
|
+ framesize_t res;
|
|
|
+
|
|
|
+ Camera.GetCameraParameter(req, quality, res);
|
|
|
+
|
|
|
+#ifdef DEBUG_DETAIL_ON
|
|
|
+ printf("Size: %d", res); printf(" Quality: %d\n", quality);
|
|
|
+#endif
|
|
|
+
|
|
|
+ Camera.SetQualitySize(quality, res);
|
|
|
+
|
|
|
+ esp_err_t ressult;
|
|
|
+ ressult = Camera.CaptureToHTTP(req);
|
|
|
+
|
|
|
+#ifdef DEBUG_DETAIL_ON
|
|
|
+ LogFile.WriteHeapInfo("handler_capture - Done");
|
|
|
+#endif
|
|
|
+
|
|
|
+ return ressult;
|
|
|
+};
|
|
|
+
|
|
|
+
|
|
|
+esp_err_t handler_capture_with_ligth(httpd_req_t *req)
|
|
|
+{
|
|
|
+#ifdef DEBUG_DETAIL_ON
|
|
|
+ LogFile.WriteHeapInfo("handler_capture_with_ligth - Start");
|
|
|
+#endif
|
|
|
+ char _query[100];
|
|
|
+ char _delay[10];
|
|
|
+
|
|
|
+ int quality;
|
|
|
+ framesize_t res;
|
|
|
+ int delay = 2500;
|
|
|
+
|
|
|
+ if (httpd_req_get_url_query_str(req, _query, 100) == ESP_OK)
|
|
|
+ {
|
|
|
+ printf("Query: "); printf(_query); printf("\n");
|
|
|
+ if (httpd_query_key_value(_query, "delay", _delay, 10) == ESP_OK)
|
|
|
+ {
|
|
|
+#ifdef DEBUG_DETAIL_ON
|
|
|
+ printf("Delay: "); printf(_delay); printf("\n");
|
|
|
+#endif
|
|
|
+ delay = atoi(_delay);
|
|
|
+
|
|
|
+ if (delay < 0)
|
|
|
+ delay = 0;
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ Camera.GetCameraParameter(req, quality, res);
|
|
|
+
|
|
|
+#ifdef DEBUG_DETAIL_ON
|
|
|
+ printf("Size: %d", res); printf(" Quality: %d\n", quality);
|
|
|
+#endif
|
|
|
+
|
|
|
+ Camera.SetQualitySize(quality, res);
|
|
|
+ Camera.LightOnOff(true);
|
|
|
+ const TickType_t xDelay = delay / portTICK_PERIOD_MS;
|
|
|
+ vTaskDelay( xDelay );
|
|
|
+
|
|
|
+ esp_err_t ressult;
|
|
|
+ ressult = Camera.CaptureToHTTP(req);
|
|
|
+
|
|
|
+ Camera.LightOnOff(false);
|
|
|
+
|
|
|
+#ifdef DEBUG_DETAIL_ON
|
|
|
+ LogFile.WriteHeapInfo("handler_capture_with_ligth - Done");
|
|
|
+#endif
|
|
|
+
|
|
|
+ return ressult;
|
|
|
+};
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+esp_err_t handler_capture_save_to_file(httpd_req_t *req)
|
|
|
+{
|
|
|
+#ifdef DEBUG_DETAIL_ON
|
|
|
+ LogFile.WriteHeapInfo("handler_capture_save_to_file - Start");
|
|
|
+#endif
|
|
|
+
|
|
|
+ char _query[100];
|
|
|
+ char _delay[10];
|
|
|
+ int delay = 0;
|
|
|
+ char filename[100];
|
|
|
+ std::string fn = "/sdcard/";
|
|
|
+
|
|
|
+
|
|
|
+ int quality;
|
|
|
+ framesize_t res;
|
|
|
+
|
|
|
+ if (httpd_req_get_url_query_str(req, _query, 100) == ESP_OK)
|
|
|
+ {
|
|
|
+ printf("Query: "); printf(_query); printf("\n");
|
|
|
+ if (httpd_query_key_value(_query, "filename", filename, 100) == ESP_OK)
|
|
|
+ {
|
|
|
+ fn.append(filename);
|
|
|
+#ifdef DEBUG_DETAIL_ON
|
|
|
+ printf("Filename: "); printf(fn.c_str()); printf("\n");
|
|
|
+#endif
|
|
|
+ }
|
|
|
+ else
|
|
|
+ fn.append("noname.jpg");
|
|
|
+
|
|
|
+ if (httpd_query_key_value(_query, "delay", _delay, 10) == ESP_OK)
|
|
|
+ {
|
|
|
+#ifdef DEBUG_DETAIL_ON
|
|
|
+ printf("Delay: "); printf(_delay); printf("\n");
|
|
|
+#endif
|
|
|
+ delay = atoi(_delay);
|
|
|
+
|
|
|
+ if (delay < 0)
|
|
|
+ delay = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ else
|
|
|
+ fn.append("noname.jpg");
|
|
|
+
|
|
|
+ Camera.GetCameraParameter(req, quality, res);
|
|
|
+#ifdef DEBUG_DETAIL_ON
|
|
|
+ printf("Size: %d", res); printf(" Quality: %d\n", quality);
|
|
|
+#endif
|
|
|
+ Camera.SetQualitySize(quality, res);
|
|
|
+
|
|
|
+ esp_err_t ressult;
|
|
|
+ ressult = Camera.CaptureToFile(fn, delay);
|
|
|
+
|
|
|
+ const char* resp_str = (const char*) fn.c_str();
|
|
|
+ httpd_resp_send(req, resp_str, strlen(resp_str));
|
|
|
+
|
|
|
+#ifdef DEBUG_DETAIL_ON
|
|
|
+ LogFile.WriteHeapInfo("handler_capture_save_to_file - Done");
|
|
|
+#endif
|
|
|
+
|
|
|
+ return ressult;
|
|
|
+};
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+void register_server_camera_uri(httpd_handle_t server)
|
|
|
+{
|
|
|
+#ifdef DEBUG_DETAIL_ON
|
|
|
+ ESP_LOGI(TAGPARTCAMERA, "server_part_camera - Registering URI handlers");
|
|
|
+#endif
|
|
|
+
|
|
|
+ httpd_uri_t camuri = { };
|
|
|
+ camuri.method = HTTP_GET;
|
|
|
+
|
|
|
+ camuri.uri = "/lighton";
|
|
|
+ camuri.handler = handler_lightOn;
|
|
|
+ camuri.user_ctx = (void*) "Light On";
|
|
|
+ httpd_register_uri_handler(server, &camuri);
|
|
|
+
|
|
|
+ camuri.uri = "/lightoff";
|
|
|
+ camuri.handler = handler_lightOff;
|
|
|
+ camuri.user_ctx = (void*) "Light Off";
|
|
|
+ httpd_register_uri_handler(server, &camuri);
|
|
|
+
|
|
|
+ camuri.uri = "/capture";
|
|
|
+ camuri.handler = handler_capture;
|
|
|
+ camuri.user_ctx = NULL;
|
|
|
+ httpd_register_uri_handler(server, &camuri);
|
|
|
+
|
|
|
+ camuri.uri = "/capture_with_flashlight";
|
|
|
+ camuri.handler = handler_capture_with_ligth;
|
|
|
+ camuri.user_ctx = NULL;
|
|
|
+ httpd_register_uri_handler(server, &camuri);
|
|
|
+
|
|
|
+ camuri.uri = "/save";
|
|
|
+ camuri.handler = handler_capture_save_to_file;
|
|
|
+ camuri.user_ctx = NULL;
|
|
|
+ httpd_register_uri_handler(server, &camuri);
|
|
|
+}
|