Merge pull request #161 from espressif/camera-updates
Update camera driver and add BMP download to HTTPDpull/165/head
commit
73d4e2dc05
|
@ -1 +1 @@
|
||||||
Subproject commit af931850f4a32566f51403758c3a49032327225c
|
Subproject commit 010709376a131c12c14bb074b6c5be82d2241338
|
|
@ -289,6 +289,44 @@ void enable_led(bool en)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static esp_err_t bmp_handler(httpd_req_t *req)
|
||||||
|
{
|
||||||
|
camera_fb_t *fb = NULL;
|
||||||
|
esp_err_t res = ESP_OK;
|
||||||
|
uint64_t fr_start = esp_timer_get_time();
|
||||||
|
fb = esp_camera_fb_get();
|
||||||
|
if (!fb)
|
||||||
|
{
|
||||||
|
ESP_LOGE(TAG, "Camera capture failed");
|
||||||
|
httpd_resp_send_500(req);
|
||||||
|
return ESP_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
httpd_resp_set_type(req, "image/x-windows-bmp");
|
||||||
|
httpd_resp_set_hdr(req, "Content-Disposition", "inline; filename=capture.bmp");
|
||||||
|
httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*");
|
||||||
|
|
||||||
|
char ts[32];
|
||||||
|
snprintf(ts, 32, "%ld.%06ld", fb->timestamp.tv_sec, fb->timestamp.tv_usec);
|
||||||
|
httpd_resp_set_hdr(req, "X-Timestamp", (const char *)ts);
|
||||||
|
|
||||||
|
|
||||||
|
uint8_t * buf = NULL;
|
||||||
|
size_t buf_len = 0;
|
||||||
|
bool converted = frame2bmp(fb, &buf, &buf_len);
|
||||||
|
esp_camera_fb_return(fb);
|
||||||
|
if(!converted){
|
||||||
|
ESP_LOGE(TAG, "BMP Conversion failed");
|
||||||
|
httpd_resp_send_500(req);
|
||||||
|
return ESP_FAIL;
|
||||||
|
}
|
||||||
|
res = httpd_resp_send(req, (const char *)buf, buf_len);
|
||||||
|
free(buf);
|
||||||
|
uint64_t fr_end = esp_timer_get_time();
|
||||||
|
ESP_LOGI(TAG, "BMP: %llums, %uB", (uint64_t)((fr_end - fr_start) / 1000), buf_len);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
static size_t jpg_encode_stream(void *arg, size_t index, const void *data, size_t len)
|
static size_t jpg_encode_stream(void *arg, size_t index, const void *data, size_t len)
|
||||||
{
|
{
|
||||||
jpg_chunking_t *j = (jpg_chunking_t *)arg;
|
jpg_chunking_t *j = (jpg_chunking_t *)arg;
|
||||||
|
@ -763,10 +801,11 @@ static esp_err_t cmd_handler(httpd_req_t *req)
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
else {
|
else {
|
||||||
|
ESP_LOGI(TAG, "Unknown command: %s", variable);
|
||||||
res = -1;
|
res = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (res) {
|
if (res < 0) {
|
||||||
return httpd_resp_send_500(req);
|
return httpd_resp_send_500(req);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -809,7 +848,7 @@ static esp_err_t status_handler(httpd_req_t *req)
|
||||||
p+=print_reg(p, s, reg, 0xFF);
|
p+=print_reg(p, s, reg, 0xFF);
|
||||||
}
|
}
|
||||||
p+=print_reg(p, s, 0x558a, 0x1FF);//9 bit
|
p+=print_reg(p, s, 0x558a, 0x1FF);//9 bit
|
||||||
} else {
|
} else if(s->id.PID == OV2640_PID){
|
||||||
p+=print_reg(p, s, 0xd3, 0xFF);
|
p+=print_reg(p, s, 0xd3, 0xFF);
|
||||||
p+=print_reg(p, s, 0x111, 0xFF);
|
p+=print_reg(p, s, 0x111, 0xFF);
|
||||||
p+=print_reg(p, s, 0x132, 0xFF);
|
p+=print_reg(p, s, 0x132, 0xFF);
|
||||||
|
@ -1079,7 +1118,7 @@ static esp_err_t monitor_handler(httpd_req_t *req)
|
||||||
void app_httpd_main()
|
void app_httpd_main()
|
||||||
{
|
{
|
||||||
httpd_config_t config = HTTPD_DEFAULT_CONFIG();
|
httpd_config_t config = HTTPD_DEFAULT_CONFIG();
|
||||||
config.max_uri_handlers = 12;
|
config.max_uri_handlers = 16;
|
||||||
|
|
||||||
httpd_uri_t index_uri = {
|
httpd_uri_t index_uri = {
|
||||||
.uri = "/",
|
.uri = "/",
|
||||||
|
@ -1111,6 +1150,12 @@ void app_httpd_main()
|
||||||
.handler = stream_handler,
|
.handler = stream_handler,
|
||||||
.user_ctx = NULL};
|
.user_ctx = NULL};
|
||||||
|
|
||||||
|
httpd_uri_t bmp_uri = {
|
||||||
|
.uri = "/bmp",
|
||||||
|
.method = HTTP_GET,
|
||||||
|
.handler = bmp_handler,
|
||||||
|
.user_ctx = NULL};
|
||||||
|
|
||||||
httpd_uri_t xclk_uri = {
|
httpd_uri_t xclk_uri = {
|
||||||
.uri = "/xclk",
|
.uri = "/xclk",
|
||||||
.method = HTTP_GET,
|
.method = HTTP_GET,
|
||||||
|
@ -1183,6 +1228,7 @@ void app_httpd_main()
|
||||||
httpd_register_uri_handler(camera_httpd, &cmd_uri);
|
httpd_register_uri_handler(camera_httpd, &cmd_uri);
|
||||||
httpd_register_uri_handler(camera_httpd, &status_uri);
|
httpd_register_uri_handler(camera_httpd, &status_uri);
|
||||||
httpd_register_uri_handler(camera_httpd, &capture_uri);
|
httpd_register_uri_handler(camera_httpd, &capture_uri);
|
||||||
|
httpd_register_uri_handler(camera_httpd, &bmp_uri);
|
||||||
|
|
||||||
httpd_register_uri_handler(camera_httpd, &xclk_uri);
|
httpd_register_uri_handler(camera_httpd, &xclk_uri);
|
||||||
httpd_register_uri_handler(camera_httpd, ®_uri);
|
httpd_register_uri_handler(camera_httpd, ®_uri);
|
||||||
|
|
|
@ -45,6 +45,9 @@
|
||||||
#define PCLK_GPIO_NUM 22
|
#define PCLK_GPIO_NUM 22
|
||||||
|
|
||||||
#elif CONFIG_CAMERA_MODEL_ESP32_CAM_BOARD
|
#elif CONFIG_CAMERA_MODEL_ESP32_CAM_BOARD
|
||||||
|
// The 18 pin header on the board has Y5 and Y3 swapped
|
||||||
|
#define USE_BOARD_HEADER 0
|
||||||
|
|
||||||
#define CAM_BOARD "ESP-DEVCAM"
|
#define CAM_BOARD "ESP-DEVCAM"
|
||||||
#define PWDN_GPIO_NUM 32
|
#define PWDN_GPIO_NUM 32
|
||||||
#define RESET_GPIO_NUM 33
|
#define RESET_GPIO_NUM 33
|
||||||
|
@ -56,9 +59,17 @@
|
||||||
#define Y8_GPIO_NUM 19
|
#define Y8_GPIO_NUM 19
|
||||||
#define Y7_GPIO_NUM 21
|
#define Y7_GPIO_NUM 21
|
||||||
#define Y6_GPIO_NUM 39
|
#define Y6_GPIO_NUM 39
|
||||||
|
#if USE_BOARD_HEADER
|
||||||
|
#define Y5_GPIO_NUM 13
|
||||||
|
#else
|
||||||
#define Y5_GPIO_NUM 35
|
#define Y5_GPIO_NUM 35
|
||||||
|
#endif
|
||||||
#define Y4_GPIO_NUM 14
|
#define Y4_GPIO_NUM 14
|
||||||
|
#if USE_BOARD_HEADER
|
||||||
|
#define Y3_GPIO_NUM 35
|
||||||
|
#else
|
||||||
#define Y3_GPIO_NUM 13
|
#define Y3_GPIO_NUM 13
|
||||||
|
#endif
|
||||||
#define Y2_GPIO_NUM 34
|
#define Y2_GPIO_NUM 34
|
||||||
#define VSYNC_GPIO_NUM 5
|
#define VSYNC_GPIO_NUM 5
|
||||||
#define HREF_GPIO_NUM 27
|
#define HREF_GPIO_NUM 27
|
||||||
|
|
Loading…
Reference in New Issue