From 0d596d9d3c98785e32bae7c3e8b4b91f92808f10 Mon Sep 17 00:00:00 2001 From: Rune Harlyk Date: Thu, 14 Nov 2024 14:58:47 +0100 Subject: [PATCH] =?UTF-8?q?=F0=9F=93=B7=20Merges=20camera=20setting=20serv?= =?UTF-8?q?ice=20and=20camera=20service?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- esp32/include/spot.h | 2 - .../ESP32-sveltekit/CameraSettingsService.h | 105 ------------------ esp32/lib/ESP32-sveltekit/camera_service.cpp | 52 ++++++++- esp32/lib/ESP32-sveltekit/camera_service.h | 18 ++- esp32/src/spot.cpp | 5 +- 5 files changed, 64 insertions(+), 118 deletions(-) delete mode 100644 esp32/lib/ESP32-sveltekit/CameraSettingsService.h diff --git a/esp32/include/spot.h b/esp32/include/spot.h index 4dc3fee..896d896 100644 --- a/esp32/include/spot.h +++ b/esp32/include/spot.h @@ -16,7 +16,6 @@ #include #include #include -#include #include #include #include @@ -97,7 +96,6 @@ class Spot { #endif #if FT_ENABLED(USE_CAMERA) Camera::CameraService _cameraService; - Camera::CameraSettingsService _cameraSettingsService; #endif Peripherals _peripherals; ServoController _servoController; diff --git a/esp32/lib/ESP32-sveltekit/CameraSettingsService.h b/esp32/lib/ESP32-sveltekit/CameraSettingsService.h deleted file mode 100644 index 23ab586..0000000 --- a/esp32/lib/ESP32-sveltekit/CameraSettingsService.h +++ /dev/null @@ -1,105 +0,0 @@ -#ifndef CameraSettingsService_h -#define CameraSettingsService_h - -#include - -namespace Camera { - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define EVENT_CAMERA_SETTINGS "CameraSettings" - -class CameraSettingsService : public StatefulService { - public: - CameraSettingsService() - : endpoint(CameraSettings::read, CameraSettings::update, this), - _eventEndpoint(CameraSettings::read, CameraSettings::update, this, EVENT_CAMERA_SETTINGS), - _persistence(CameraSettings::read, CameraSettings::update, this, CAMERA_SETTINGS_FILE) { - addUpdateHandler([&](const String &originId) { updateCamera(); }, false); - } - - void begin() { - _eventEndpoint.begin(); - _persistence.readFromFS(); - sensor_t *s = safe_sensor_get(); - _state.pixformat = s->pixformat; - _state.framesize = s->status.framesize; - _state.brightness = s->status.brightness; - _state.contrast = s->status.contrast; - _state.saturation = s->status.saturation; - _state.sharpness = s->status.sharpness; - _state.denoise = s->status.denoise; - _state.gainceiling = (gainceiling_t)s->status.gainceiling; - _state.quality = s->status.quality; - _state.colorbar = s->status.colorbar; - _state.awb_gain = s->status.awb_gain; - _state.wb_mode = s->status.wb_mode; - _state.aec2 = s->status.aec2; - _state.ae_level = s->status.ae_level; - _state.aec_value = s->status.aec_value; - _state.agc_gain = s->status.agc_gain; - _state.bpc = s->status.bpc; - _state.wpc = s->status.wpc; - _state.special_effect = s->status.special_effect; - _state.raw_gma = s->status.raw_gma; - _state.lenc = s->status.lenc; - _state.hmirror = s->status.hmirror; - _state.vflip = s->status.vflip; - _state.dcw = s->status.dcw; - safe_sensor_return(); - } - - void updateCamera() { - ESP_LOGI("CameraSettings", "Updating camera settings"); - sensor_t *s = safe_sensor_get(); - if (!s) { - ESP_LOGE("CameraSettings", "Failed to update camera settings"); - safe_sensor_return(); - return; - } - s->set_pixformat(s, _state.pixformat); - s->set_framesize(s, _state.framesize); - s->set_brightness(s, _state.brightness); - s->set_contrast(s, _state.contrast); - s->set_saturation(s, _state.saturation); - s->set_sharpness(s, _state.sharpness); - s->set_denoise(s, _state.denoise); - s->set_gainceiling(s, _state.gainceiling); - s->set_quality(s, _state.quality); - s->set_colorbar(s, _state.colorbar); - s->set_awb_gain(s, _state.awb_gain); - s->set_wb_mode(s, _state.wb_mode); - s->set_aec2(s, _state.aec2); - s->set_ae_level(s, _state.ae_level); - s->set_aec_value(s, _state.aec_value); - s->set_agc_gain(s, _state.agc_gain); - s->set_bpc(s, _state.bpc); - s->set_wpc(s, _state.wpc); - s->set_special_effect(s, _state.special_effect); - s->set_raw_gma(s, _state.raw_gma); - s->set_lenc(s, _state.lenc); - s->set_hmirror(s, _state.hmirror); - s->set_vflip(s, _state.vflip); - s->set_dcw(s, _state.dcw); - safe_sensor_return(); - } - - StatefulHttpEndpoint endpoint; - - private: - EventEndpoint _eventEndpoint; - FSPersistence _persistence; -}; - -} // namespace Camera - -#endif // end CameraSettingsService_h diff --git a/esp32/lib/ESP32-sveltekit/camera_service.cpp b/esp32/lib/ESP32-sveltekit/camera_service.cpp index 4f3e309..3148284 100644 --- a/esp32/lib/ESP32-sveltekit/camera_service.cpp +++ b/esp32/lib/ESP32-sveltekit/camera_service.cpp @@ -12,26 +12,33 @@ SemaphoreHandle_t cameraMutex = xSemaphoreCreateMutex(); camera_fb_t *safe_camera_fb_get() { camera_fb_t *fb = NULL; - if (xSemaphoreTake(cameraMutex, portMAX_DELAY) == pdTRUE) { + if (xSemaphoreTakeRecursive(cameraMutex, portMAX_DELAY) == pdTRUE) { fb = esp_camera_fb_get(); - xSemaphoreGive(cameraMutex); + xSemaphoreGiveRecursive(cameraMutex); } return fb; } sensor_t *safe_sensor_get() { sensor_t *s = NULL; - if (xSemaphoreTake(cameraMutex, portMAX_DELAY) == pdTRUE) { + if (xSemaphoreTakeRecursive(cameraMutex, portMAX_DELAY) == pdTRUE) { s = esp_camera_sensor_get(); } return s; } -void safe_sensor_return() { xSemaphoreGive(cameraMutex); } +void safe_sensor_return() { xSemaphoreGiveRecursive(cameraMutex); } -CameraService::CameraService() {} +CameraService::CameraService() + : endpoint(CameraSettings::read, CameraSettings::update, this), + _eventEndpoint(CameraSettings::read, CameraSettings::update, this, EVENT_CAMERA_SETTINGS), + _persistence(CameraSettings::read, CameraSettings::update, this, CAMERA_SETTINGS_FILE) { + addUpdateHandler([&](const String &originId) { updateCamera(); }, false); +} esp_err_t CameraService::begin() { + _eventEndpoint.begin(); + _persistence.readFromFS(); camera_config_t camera_config; camera_config.ledc_channel = LEDC_CHANNEL_0; camera_config.ledc_timer = LEDC_TIMER_0; @@ -153,4 +160,39 @@ esp_err_t CameraService::cameraStream(PsychicRequest *request) { return ESP_OK; } +void CameraService::updateCamera() { + ESP_LOGI("CameraSettings", "Updating camera settings"); + sensor_t *s = safe_sensor_get(); + if (!s) { + ESP_LOGE("CameraSettings", "Failed to update camera settings"); + safe_sensor_return(); + return; + } + s->set_pixformat(s, _state.pixformat); + s->set_framesize(s, _state.framesize); + s->set_brightness(s, _state.brightness); + s->set_contrast(s, _state.contrast); + s->set_saturation(s, _state.saturation); + s->set_sharpness(s, _state.sharpness); + s->set_denoise(s, _state.denoise); + s->set_gainceiling(s, _state.gainceiling); + s->set_quality(s, _state.quality); + s->set_colorbar(s, _state.colorbar); + s->set_awb_gain(s, _state.awb_gain); + s->set_wb_mode(s, _state.wb_mode); + s->set_aec2(s, _state.aec2); + s->set_ae_level(s, _state.ae_level); + s->set_aec_value(s, _state.aec_value); + s->set_agc_gain(s, _state.agc_gain); + s->set_bpc(s, _state.bpc); + s->set_wpc(s, _state.wpc); + s->set_special_effect(s, _state.special_effect); + s->set_raw_gma(s, _state.raw_gma); + s->set_lenc(s, _state.lenc); + s->set_hmirror(s, _state.hmirror); + s->set_vflip(s, _state.vflip); + s->set_dcw(s, _state.dcw); + safe_sensor_return(); +} + } // namespace Camera \ No newline at end of file diff --git a/esp32/lib/ESP32-sveltekit/camera_service.h b/esp32/lib/ESP32-sveltekit/camera_service.h index 3908859..f47993b 100644 --- a/esp32/lib/ESP32-sveltekit/camera_service.h +++ b/esp32/lib/ESP32-sveltekit/camera_service.h @@ -3,10 +3,16 @@ #include #include -#include #include #include + #include +#include +#include +#include +#include + +#include namespace Camera { @@ -18,11 +24,13 @@ namespace Camera { #define PART_BOUNDARY "frame" +#define EVENT_CAMERA_SETTINGS "CameraSettings" + camera_fb_t *safe_camera_fb_get(); sensor_t *safe_sensor_get(); void safe_sensor_return(); -class CameraService { +class CameraService : public StatefulService { public: CameraService(); @@ -31,8 +39,12 @@ class CameraService { esp_err_t cameraStill(PsychicRequest *request); esp_err_t cameraStream(PsychicRequest *request); + StatefulHttpEndpoint endpoint; + private: - PsychicHttpServer *_server; + EventEndpoint _eventEndpoint; + FSPersistence _persistence; + void updateCamera(); }; } // namespace Camera diff --git a/esp32/src/spot.cpp b/esp32/src/spot.cpp index a9b0db7..c8530eb 100644 --- a/esp32/src/spot.cpp +++ b/esp32/src/spot.cpp @@ -77,9 +77,9 @@ void Spot::setupServer() { _server->on("/api/camera/stream", HTTP_GET, [this](PsychicRequest *request) { return _cameraService.cameraStream(request); }); _server->on("/api/camera/settings", HTTP_GET, - [this](PsychicRequest *request) { return _cameraSettingsService.endpoint.getState(request); }); + [this](PsychicRequest *request) { return _cameraService.endpoint.getState(request); }); _server->on("/api/camera/settings", HTTP_POST, [this](PsychicRequest *request, JsonVariant &json) { - return _cameraSettingsService.endpoint.handleStateUpdate(request, json); + return _cameraService.endpoint.handleStateUpdate(request, json); }); // SYSTEM @@ -198,7 +198,6 @@ void Spot::startServices() { #endif #if FT_ENABLED(USE_CAMERA) _cameraService.begin(); - _cameraSettingsService.begin(); #endif }