From ffc5dd8572fadce674a04d02260855450bbe5adc Mon Sep 17 00:00:00 2001 From: Bond Keevil Date: Thu, 22 Aug 2019 14:17:57 -0400 Subject: [PATCH 1/4] Feat: persistent storage of sensor settings in nvs --- CMakeLists.txt | 2 +- driver/camera.c | 75 +++++++++++++++++++++++++++++++++++++ driver/include/esp_camera.h | 13 +++++++ 3 files changed, 89 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 385c6dc..49d5c1a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -26,6 +26,6 @@ set(COMPONENT_PRIV_INCLUDEDIRS ) set(COMPONENT_REQUIRES driver) -set(COMPONENT_PRIV_REQUIRES freertos) +set(COMPONENT_PRIV_REQUIRES freertos nvs_flash) register_component() diff --git a/driver/camera.c b/driver/camera.c index d4c5696..7b043b1 100755 --- a/driver/camera.c +++ b/driver/camera.c @@ -29,6 +29,8 @@ #include "driver/rtc_io.h" #include "driver/periph_ctrl.h" #include "esp_intr_alloc.h" +#include "nvs_flash.h" +#include "nvs.h" #include "sensor.h" #include "sccb.h" #include "esp_camera.h" @@ -67,6 +69,7 @@ typedef enum { #include "esp_log.h" static const char* TAG = "camera"; #endif +static const char* CAMERA_SENSOR_NVS_KEY = "sensor"; typedef void (*dma_filter_t)(const dma_elem_t* src, lldesc_t* dma_desc, uint8_t* dst); @@ -1354,3 +1357,75 @@ sensor_t * esp_camera_sensor_get() } return &s_state->sensor; } + +esp_err_t esp_camera_save_to_nvs(const char *key) +{ + nvs_handle_t handle; + + esp_err_t ret = nvs_open(key,NVS_READWRITE,&handle); + + if (ret == ESP_OK) { + sensor_t *s = esp_camera_sensor_get(); + if (s != NULL) { + ret = nvs_set_blob(handle,CAMERA_SENSOR_NVS_KEY,&s->status,sizeof(camera_status_t)); + return ret; + } else { + return ESP_ERR_CAMERA_NOT_DETECTED; + } + nvs_close(handle); + return ret; + } else { + return ret; + } +} + +esp_err_t esp_camera_load_from_nvs(const char *key) +{ + nvs_handle_t handle; + + esp_err_t ret = nvs_open(key,NVS_READWRITE,&handle); + + if (ret == ESP_OK) { + sensor_t *s = esp_camera_sensor_get(); + camera_status_t st; + if (s != NULL) { + size_t size = sizeof(camera_status_t); + ret = nvs_get_blob(handle,CAMERA_SENSOR_NVS_KEY,&st,&size); + if (ret = ESP_OK) { + s->set_ae_level(s,st.ae_level); + s->set_aec2(s,st.aec2); + s->set_aec_value(s,st.aec_value); + s->set_agc_gain(s,st.agc_gain); + s->set_awb_gain(s,st.awb_gain); + s->set_bpc(s,st.bpc); + s->set_brightness(s,st.brightness); + s->set_colorbar(s,st.colorbar); + s->set_contrast(s,st.contrast); + s->set_dcw(s,st.dcw); + s->set_denoise(s,st.denoise); + s->set_exposure_ctrl(s,st.aec); + s->set_framesize(s,st.framesize); + s->set_gain_ctrl(s,st.agc); + s->set_gainceiling(s,st.gainceiling); + s->set_hmirror(s,st.hmirror); + s->set_lenc(s,st.lenc); + s->set_quality(s,st.quality); + s->set_raw_gma(s,st.raw_gma); + s->set_saturation(s,st.saturation); + s->set_sharpness(s,st.sharpness); + s->set_special_effect(s,st.special_effect); + s->set_vflip(s,st.vflip); + s->set_wb_mode(s,st.wb_mode); + s->set_whitebal(s,st.awb); + s->set_wpc(s,st.wpc); + } + } else { + return ESP_ERR_CAMERA_NOT_DETECTED; + } + nvs_close(handle); + return ret; + } else { + ESP_LOGW(TAG,"Error (%d) opening nvs key \"%s\"",ret,key); + return ret; + } +} \ No newline at end of file diff --git a/driver/include/esp_camera.h b/driver/include/esp_camera.h index 071b986..2753520 100755 --- a/driver/include/esp_camera.h +++ b/driver/include/esp_camera.h @@ -171,6 +171,19 @@ void esp_camera_fb_return(camera_fb_t * fb); */ sensor_t * esp_camera_sensor_get(); +/** + * @brief Save camera settings to non-volatile-storage (NVS) + * + * @param key A unique nvs key name for the camera settings + */ +esp_err_t esp_camera_save_to_nvs(const char *key); + +/** + * @brief Save camera settings to non-volatile-storage (NVS) + * + * @param key A unique nvs key name for the camera settings + */ +esp_err_t esp_camera_load_from_nvs(const char *key); #ifdef __cplusplus } From 8c64b7afb259e56f8010436c18171f14e40219d6 Mon Sep 17 00:00:00 2001 From: Bond Keevil Date: Thu, 22 Aug 2019 17:51:30 -0400 Subject: [PATCH 2/4] Fix: description of esp_camera_save_to_nvs() --- driver/include/esp_camera.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/driver/include/esp_camera.h b/driver/include/esp_camera.h index 2753520..d7034f4 100755 --- a/driver/include/esp_camera.h +++ b/driver/include/esp_camera.h @@ -179,7 +179,7 @@ sensor_t * esp_camera_sensor_get(); esp_err_t esp_camera_save_to_nvs(const char *key); /** - * @brief Save camera settings to non-volatile-storage (NVS) + * @brief Load camera settings from non-volatile-storage (NVS) * * @param key A unique nvs key name for the camera settings */ From 32507f29d0c4fde11a4483f9e9626ded16b403fa Mon Sep 17 00:00:00 2001 From: Bond Keevil Date: Thu, 22 Aug 2019 18:52:43 -0400 Subject: [PATCH 3/4] == instead of = --- driver/camera.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/driver/camera.c b/driver/camera.c index 7b043b1..ba0da12 100755 --- a/driver/camera.c +++ b/driver/camera.c @@ -1391,7 +1391,7 @@ esp_err_t esp_camera_load_from_nvs(const char *key) if (s != NULL) { size_t size = sizeof(camera_status_t); ret = nvs_get_blob(handle,CAMERA_SENSOR_NVS_KEY,&st,&size); - if (ret = ESP_OK) { + if (ret == ESP_OK) { s->set_ae_level(s,st.ae_level); s->set_aec2(s,st.aec2); s->set_aec_value(s,st.aec_value); From dac5f673f25597b34c4933e258b046de1c24bb9a Mon Sep 17 00:00:00 2001 From: Bond Keevil Date: Thu, 29 Aug 2019 10:15:45 -0400 Subject: [PATCH 4/4] Store/Retrieve pixformat to/from NVS --- driver/camera.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/driver/camera.c b/driver/camera.c index ba0da12..c5114ae 100755 --- a/driver/camera.c +++ b/driver/camera.c @@ -70,6 +70,7 @@ typedef enum { static const char* TAG = "camera"; #endif static const char* CAMERA_SENSOR_NVS_KEY = "sensor"; +static const char* CAMERA_PIXFORMAT_NVS_KEY = "pixformat"; typedef void (*dma_filter_t)(const dma_elem_t* src, lldesc_t* dma_desc, uint8_t* dst); @@ -1368,6 +1369,10 @@ esp_err_t esp_camera_save_to_nvs(const char *key) sensor_t *s = esp_camera_sensor_get(); if (s != NULL) { ret = nvs_set_blob(handle,CAMERA_SENSOR_NVS_KEY,&s->status,sizeof(camera_status_t)); + if (ret == ESP_OK) { + uint8_t pf = s->pixformat; + ret = nvs_set_u8(handle,CAMERA_PIXFORMAT_NVS_KEY,pf); + } return ret; } else { return ESP_ERR_CAMERA_NOT_DETECTED; @@ -1382,16 +1387,17 @@ esp_err_t esp_camera_save_to_nvs(const char *key) esp_err_t esp_camera_load_from_nvs(const char *key) { nvs_handle_t handle; - + uint8_t pf; + esp_err_t ret = nvs_open(key,NVS_READWRITE,&handle); if (ret == ESP_OK) { sensor_t *s = esp_camera_sensor_get(); camera_status_t st; if (s != NULL) { - size_t size = sizeof(camera_status_t); - ret = nvs_get_blob(handle,CAMERA_SENSOR_NVS_KEY,&st,&size); - if (ret == ESP_OK) { + size_t size = sizeof(camera_status_t); + ret = nvs_get_blob(handle,CAMERA_SENSOR_NVS_KEY,&st,&size); + if (ret == ESP_OK) { s->set_ae_level(s,st.ae_level); s->set_aec2(s,st.aec2); s->set_aec_value(s,st.aec_value); @@ -1418,7 +1424,11 @@ esp_err_t esp_camera_load_from_nvs(const char *key) s->set_wb_mode(s,st.wb_mode); s->set_whitebal(s,st.awb); s->set_wpc(s,st.wpc); - } + } + ret = nvs_get_u8(handle,CAMERA_PIXFORMAT_NVS_KEY,&pf); + if (ret == ESP_OK) { + s->set_pixformat(s,pf); + } } else { return ESP_ERR_CAMERA_NOT_DETECTED; }