- Updated HTML

- Lookup in separate files
This commit is contained in:
Rene Zeldenthuis
2023-02-09 00:42:32 +01:00
parent c5c4f87d47
commit 2739ed4953
10 changed files with 250 additions and 142 deletions

View File

@@ -122,15 +122,24 @@
{{/NetworkState.OnLine}} {{/NetworkState.OnLine}}
</div> </div>
</div> </div>
<div class="card bg-light mb-3">
<h5 class="card-header">Peripheral</h5>
<div class="card-body">
<div class="row">
<div class="col-4">Board type:</div>
<div class="col-8">{{BoardType}}</div>
</div>
<div class="row">
<div class="col-4">LED intensity:</div>
<div class="col-8">{{LedIntensity}} [0-100]</div>
</div>
</div>
</div>
</div> </div>
<div class="col-sm-6"> <div class="col-sm-6">
<div class="card bg-light mb-3"> <div class="card bg-light mb-3">
<h5 class="card-header">Settings</h5> <h5 class="card-header">Camera</h5>
<div class="card-body"> <div class="card-body">
<div class="row">
<div class="col-4">Camera type:</div>
<div class="col-8">{{CameraType}}</div>
</div>
<div class="row"> <div class="row">
<div class="col-4">Frame rate:</div> <div class="col-4">Frame rate:</div>
<div class="col-8">{{FrameDuration}} ms ({{FrameFrequency}} f/s)</div> <div class="col-8">{{FrameDuration}} ms ({{FrameFrequency}} f/s)</div>
@@ -149,11 +158,95 @@
</div> </div>
<div class="row"> <div class="row">
<div class="col-4">JPEG quality:</div> <div class="col-4">JPEG quality:</div>
<div class="col-8">{{JpegQuality}} (1-100)</div> <div class="col-8">{{JpegQuality}} [1-100]</div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-4">Flash LED intensity:</div> <div class="col-4">Brightness:</div>
<div class="col-8">{{FlashLedIntensity}} (0-100)</div> <div class="col-8">{{Brightness}} [-2,2]</div>
</div>
<div class="row">
<div class="col-4">Contrast:</div>
<div class="col-8">{{Contrast}} [-2,2]</div>
</div>
<div class="row">
<div class="col-4">Saturation:</div>
<div class="col-8">{{Saturation}} [-2,2]</div>
</div>
<div class="row">
<div class="col-4">Special effect:</div>
<div class="col-8">{{SpecialEffect}}</div>
</div>
<div class="row">
<div class="col-4">White balance:</div>
<div class="col-8">{{WhiteBal}}</div>
</div>
<div class="row">
<div class="col-4">AWB gain:</div>
<div class="col-8">{{AwbGain}}</div>
</div>
<div class="row">
<div class="col-4">WB mode:</div>
<div class="col-8">{{WbMode}}</div>
</div>
<div class="row">
<div class="col-4">Exposure control:</div>
<div class="col-8">{{ExposureCtrl}}</div>
</div>
<div class="row">
<div class="col-4">AEC2:</div>
<div class="col-8">{{Aec2}}</div>
</div>
<div class="row">
<div class="col-4">AE level:</div>
<div class="col-8">{{AeLevel}}</div>
</div>
<div class="row">
<div class="col-4">AEC value:</div>
<div class="col-8">{{AecValue}}</div>
</div>
<div class="row">
<div class="col-4">Gain control:</div>
<div class="col-8">{{GainCtrl}}</div>
</div>
<div class="row">
<div class="col-4">AGC gain:</div>
<div class="col-8">{{AgcGain}}</div>
</div>
<div class="row">
<div class="col-4">Gain ceiling:</div>
<div class="col-8">{{GainCeiling}}</div>
</div>
<div class="row">
<div class="col-4">BPC</div>
<div class="col-8">{{Bpc}}</div>
</div>
<div class="row">
<div class="col-4">WPC</div>
<div class="col-8">{{Wpc}}</div>
</div>
<div class="row">
<div class="col-4">Raw gma</div>
<div class="col-8">{{RawGma}}</div>
</div>
<div class="row">
<div class="col-4">LENC</div>
<div class="col-8">{{Lenc}}</div>
</div>
<div class="row">
<div class="col-4">Horizontal mirror</div>
<div class="col-8">{{HMirror}}</div>
</div>
<div class="row">
<div class="col-4">Vertical flip</div>
<div class="col-8">{{VFlip}}</div>
</div>
<div class="row">
<div class="col-4">DCW:</div>
<div class="col-8">{{Dcw}}</div>
</div>
<div class="row">
<div class="col-4">Color bar:</div>
<div class="col-8">{{ColorBar}}</div>
</div> </div>
{{#CameraInitialized}} {{#CameraInitialized}}
<div class="mt-4 alert alert-success" role="alert"> <div class="mt-4 alert alert-success" role="alert">
@@ -181,8 +274,7 @@
<div class="row"> <div class="row">
<span> <span>
The camera RTSP stream can be found at: The camera RTSP stream can be found at:
<a <a href="rtsp://{{IpV4}}:{{RtspPort}}/mjpeg/1">rtsp://{{IpV4}}:{{RtspPort}}/mjpeg/1</a>
href="rtsp://{{IpV4}}:{{RtspPort}}/mjpeg/1">rtsp://{{IpV4}}:{{RtspPort}}/mjpeg/1</a>
</span> </span>
</div> </div>
<div class="row"> <div class="row">

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -152,78 +152,3 @@ const camera_config_t lookup_camera_config(const char *name)
return camera_config_t{}; return camera_config_t{};
} }
typedef char camera_effect_name_t[11];
typedef struct
{
const camera_effect_name_t name;
const int value;
} camera_effect_entry_t;
constexpr const camera_effect_entry_t camera_effects[] = {
{"Normal", 0},
{"Negative", 1},
{"Grayscale", 2},
{"Red tint", 3},
{"Green tint", 4},
{"Blue tint", 5},
{"Sepia", 6}};
const int lookup_camera_effect(const char *name)
{
// Lookup table for the frame name to framesize_t
for (const auto &entry : camera_effects)
if (strncmp(entry.name, name, sizeof(camera_effect_entry_t)) == 0)
return entry.value;
return 0;
}
typedef char camera_white_balance_mode_name_t[7];
typedef struct
{
const camera_white_balance_mode_name_t name;
const int value;
} camera_white_balance_mode_entry_t;
constexpr const camera_white_balance_mode_entry_t camera_white_balance_modes[] = {
{"Auto", 0},
{"Sunny", 1},
{"Cloudy", 2},
{"Office", 3},
{"Home", 4}};
const int lookup_camera_white_balance_mode(const char *name)
{
// Lookup table for the frame name to framesize_t
for (const auto &entry : camera_white_balance_modes)
if (strncmp(entry.name, name, sizeof(camera_white_balance_mode_entry_t)) == 0)
return entry.value;
return 0;
}
typedef char camera_gain_ceiling_name_t[5];
typedef struct
{
const camera_gain_ceiling_name_t name;
const gainceiling_t value;
} camera_gain_ceiling_entry_t;
constexpr const camera_gain_ceiling_entry_t camera_gain_ceilings[] = {
{"2X", GAINCEILING_2X},
{"4X", GAINCEILING_4X},
{"8X", GAINCEILING_8X},
{"16X", GAINCEILING_16X},
{"32X", GAINCEILING_32X},
{"64X", GAINCEILING_64X},
{"128X", GAINCEILING_128X}};
const gainceiling_t lookup_camera_gain_ceiling_mode(const char *name)
{
// Lookup table for the frame name to framesize_t
for (const auto &entry : camera_gain_ceilings)
if (strncmp(entry.name, name, sizeof(camera_gain_ceiling_entry_t)) == 0)
return entry.value;
return GAINCEILING_2X;
}

View File

@@ -0,0 +1,29 @@
#pragma once
#include <string.h>
typedef char camera_effect_name_t[11];
typedef struct
{
const camera_effect_name_t name;
const int value;
} camera_effect_entry_t;
constexpr const camera_effect_entry_t camera_effects[] = {
{"Normal", 0},
{"Negative", 1},
{"Grayscale", 2},
{"Red tint", 3},
{"Green tint", 4},
{"Blue tint", 5},
{"Sepia", 6}};
const int lookup_camera_effect(const char *name)
{
// Lookup table for the frame name to framesize_t
for (const auto &entry : camera_effects)
if (strncmp(entry.name, name, sizeof(camera_effect_entry_t)) == 0)
return entry.value;
return 0;
}

View File

@@ -0,0 +1,30 @@
#pragma once
#include <string.h>
#include <esp_camera.h>
typedef char camera_gainceiling_name_t[5];
typedef struct
{
const camera_gainceiling_name_t name;
const gainceiling_t value;
} camera_gainceiling_entry_t;
constexpr const camera_gainceiling_entry_t camera_gain_ceilings[] = {
{"2X", GAINCEILING_2X},
{"4X", GAINCEILING_4X},
{"8X", GAINCEILING_8X},
{"16X", GAINCEILING_16X},
{"32X", GAINCEILING_32X},
{"64X", GAINCEILING_64X},
{"128X", GAINCEILING_128X}};
const gainceiling_t lookup_camera_gainceiling(const char *name)
{
// Lookup table for the frame name to framesize_t
for (const auto &entry : camera_gain_ceilings)
if (strncmp(entry.name, name, sizeof(camera_gainceiling_entry_t)) == 0)
return entry.value;
return GAINCEILING_2X;
}

View File

@@ -0,0 +1,27 @@
#pragma once
#include <string.h>
typedef char camera_wb_mode_name_t[7];
typedef struct
{
const camera_wb_mode_name_t name;
const int value;
} camera_wb_mode_entry_t;
constexpr const camera_wb_mode_entry_t camera_wb_modes[] = {
{"Auto", 0},
{"Sunny", 1},
{"Cloudy", 2},
{"Office", 3},
{"Home", 4}};
const int lookup_camera_wb_mode(const char *name)
{
// Lookup table for the frame name to framesize_t
for (const auto &entry : camera_wb_modes)
if (strncmp(entry.name, name, sizeof(camera_wb_mode_entry_t)) == 0)
return entry.value;
return 0;
}

View File

@@ -5,7 +5,7 @@
#define WIFI_SSID "ESP32CAM-RTSP" #define WIFI_SSID "ESP32CAM-RTSP"
#define WIFI_PASSWORD nullptr #define WIFI_PASSWORD nullptr
#define CONFIG_VERSION "1._4" #define CONFIG_VERSION "1.4"
#define OTA_PASSWORD "ESP32CAM-RTSP" #define OTA_PASSWORD "ESP32CAM-RTSP"

View File

@@ -6,8 +6,11 @@
#include <OV2640.h> #include <OV2640.h>
#include <ESPmDNS.h> #include <ESPmDNS.h>
#include <rtsp_server.h> #include <rtsp_server.h>
#include <frame_size.h> #include <lookup_camera_config.h>
#include <camera_config.h> #include <lookup_camera_effect.h>
#include <lookup_camera_frame_size.h>
#include <lookup_camera_gainceiling.h>
#include <lookup_camera_wb_mode.h>
#include <format_duration.h> #include <format_duration.h>
#include <format_number.h> #include <format_number.h>
#include <moustache.h> #include <moustache.h>
@@ -27,22 +30,22 @@ auto param_brightness = iotwebconf::Builder<iotwebconf::IntTParameter<int>>("b")
auto param_contrast = iotwebconf::Builder<iotwebconf::IntTParameter<int>>("c").label("Contrast").defaultValue(DEFAULT_CONTRAST).min(-2).max(2).build(); auto param_contrast = iotwebconf::Builder<iotwebconf::IntTParameter<int>>("c").label("Contrast").defaultValue(DEFAULT_CONTRAST).min(-2).max(2).build();
auto param_saturation = iotwebconf::Builder<iotwebconf::IntTParameter<int>>("s").label("Saturation").defaultValue(DEFAULT_SATURATION).min(-2).max(2).build(); auto param_saturation = iotwebconf::Builder<iotwebconf::IntTParameter<int>>("s").label("Saturation").defaultValue(DEFAULT_SATURATION).min(-2).max(2).build();
auto param_special_effect = iotwebconf::Builder<iotwebconf::SelectTParameter<sizeof(camera_effects[0])>>("e").label("Effect").optionValues((const char *)&camera_effects).optionNames((const char *)&camera_effects).optionCount(sizeof(camera_effects) / sizeof(camera_effects[0])).nameLength(sizeof(camera_effects[0])).defaultValue(DEFAULT_EFFECT).build(); auto param_special_effect = iotwebconf::Builder<iotwebconf::SelectTParameter<sizeof(camera_effects[0])>>("e").label("Effect").optionValues((const char *)&camera_effects).optionNames((const char *)&camera_effects).optionCount(sizeof(camera_effects) / sizeof(camera_effects[0])).nameLength(sizeof(camera_effects[0])).defaultValue(DEFAULT_EFFECT).build();
auto param_white_balance = iotwebconf::Builder<iotwebconf::CheckboxTParameter>("wb").label("White balance").defaultValue(DEFAULT_WHITE_BALANCE).build(); auto param_whitebal = iotwebconf::Builder<iotwebconf::CheckboxTParameter>("wb").label("White balance").defaultValue(DEFAULT_WHITE_BALANCE).build();
auto param_automatic_white_balance_gain = iotwebconf::Builder<iotwebconf::CheckboxTParameter>("awbg").label("Automatic white balance gain").defaultValue(DEFAULT_WHITE_BALANCE_GAIN).build(); auto param_awb_gain = iotwebconf::Builder<iotwebconf::CheckboxTParameter>("awbg").label("Automatic white balance gain").defaultValue(DEFAULT_WHITE_BALANCE_GAIN).build();
auto param_white_balance_mode = iotwebconf::Builder<iotwebconf::SelectTParameter<sizeof(camera_white_balance_modes[0])>>("wbm").label("White balance mode").optionValues((const char *)&camera_white_balance_modes).optionNames((const char *)&camera_white_balance_modes).optionCount(sizeof(camera_white_balance_modes) / sizeof(camera_white_balance_modes[0])).nameLength(sizeof(camera_white_balance_modes[0])).defaultValue(DEFAULT_WHITE_BALANCE_MODE).build(); auto param_wb_mode = iotwebconf::Builder<iotwebconf::SelectTParameter<sizeof(camera_wb_modes[0])>>("wbm").label("White balance mode").optionValues((const char *)&camera_wb_modes).optionNames((const char *)&camera_wb_modes).optionCount(sizeof(camera_wb_modes) / sizeof(camera_wb_modes[0])).nameLength(sizeof(camera_wb_modes[0])).defaultValue(DEFAULT_WHITE_BALANCE_MODE).build();
auto param_exposure_control = iotwebconf::Builder<iotwebconf::CheckboxTParameter>("ec").label("Exposure control").defaultValue(DEFAULT_EXPOSURE_CONTROL).build(); auto param_exposure_ctrl = iotwebconf::Builder<iotwebconf::CheckboxTParameter>("ec").label("Exposure control").defaultValue(DEFAULT_EXPOSURE_CONTROL).build();
auto param_aec2 = iotwebconf::Builder<iotwebconf::CheckboxTParameter>("aec2").label("AEC2").defaultValue(DEFAULT_AEC2).build(); auto param_aec2 = iotwebconf::Builder<iotwebconf::CheckboxTParameter>("aec2").label("AEC2").defaultValue(DEFAULT_AEC2).build();
auto param_ae_level = iotwebconf::Builder<iotwebconf::IntTParameter<int>>("ael").label("AE level").defaultValue(DEFAULT_AE_LEVEL).min(-2).max(2).build(); auto param_ae_level = iotwebconf::Builder<iotwebconf::IntTParameter<int>>("ael").label("AE level").defaultValue(DEFAULT_AE_LEVEL).min(-2).max(2).build();
auto param_aec_value = iotwebconf::Builder<iotwebconf::IntTParameter<int>>("aecv").label("AEC value").defaultValue(DEFAULT_AEC_VALUE).min(9).max(1200).build(); auto param_aec_value = iotwebconf::Builder<iotwebconf::IntTParameter<int>>("aecv").label("AEC value").defaultValue(DEFAULT_AEC_VALUE).min(9).max(1200).build();
auto param_gain_control = iotwebconf::Builder<iotwebconf::CheckboxTParameter>("gc").label("Gain control").defaultValue(DEFAULT_GAIN_CONTROL).build(); auto param_gain_ctrl = iotwebconf::Builder<iotwebconf::CheckboxTParameter>("gc").label("Gain control").defaultValue(DEFAULT_GAIN_CONTROL).build();
auto param_agc_gain = iotwebconf::Builder<iotwebconf::IntTParameter<int>>("agcg").label("AGC gain").defaultValue(DEFAULT_AGC_GAIN).min(0).max(30).build(); auto param_agc_gain = iotwebconf::Builder<iotwebconf::IntTParameter<int>>("agcg").label("AGC gain").defaultValue(DEFAULT_AGC_GAIN).min(0).max(30).build();
auto param_gain_ceiling = iotwebconf::Builder<iotwebconf::SelectTParameter<sizeof(camera_gain_ceilings[0])>>("gcl").label("Gain ceilings").optionValues((const char *)&camera_gain_ceilings).optionNames((const char *)&camera_gain_ceilings).optionCount(sizeof(camera_gain_ceilings) / sizeof(camera_gain_ceilings[0])).nameLength(sizeof(camera_gain_ceilings[0])).defaultValue(DEFAULT_GAIN_CEILING).build(); auto param_gain_ceiling = iotwebconf::Builder<iotwebconf::SelectTParameter<sizeof(camera_gain_ceilings[0])>>("gcl").label("Gain ceilings").optionValues((const char *)&camera_gain_ceilings).optionNames((const char *)&camera_gain_ceilings).optionCount(sizeof(camera_gain_ceilings) / sizeof(camera_gain_ceilings[0])).nameLength(sizeof(camera_gain_ceilings[0])).defaultValue(DEFAULT_GAIN_CEILING).build();
auto param_bpc = iotwebconf::Builder<iotwebconf::CheckboxTParameter>("bpc").label("BPC").defaultValue(DEFAULT_BPC).build(); auto param_bpc = iotwebconf::Builder<iotwebconf::CheckboxTParameter>("bpc").label("BPC").defaultValue(DEFAULT_BPC).build();
auto param_wpc = iotwebconf::Builder<iotwebconf::CheckboxTParameter>("wpc").label("WPC").defaultValue(DEFAULT_WPC).build(); auto param_wpc = iotwebconf::Builder<iotwebconf::CheckboxTParameter>("wpc").label("WPC").defaultValue(DEFAULT_WPC).build();
auto param_raw_gamma = iotwebconf::Builder<iotwebconf::CheckboxTParameter>("rg").label("Raw gamma").defaultValue(DEFAULT_RAW_GAMMA).build(); auto param_raw_gma = iotwebconf::Builder<iotwebconf::CheckboxTParameter>("rg").label("Raw gamma").defaultValue(DEFAULT_RAW_GAMMA).build();
auto param_lenc = iotwebconf::Builder<iotwebconf::CheckboxTParameter>("lenc").label("LENC").defaultValue(DEFAULT_LENC).build(); auto param_lenc = iotwebconf::Builder<iotwebconf::CheckboxTParameter>("lenc").label("LENC").defaultValue(DEFAULT_LENC).build();
auto param_horizontal_mirror = iotwebconf::Builder<iotwebconf::CheckboxTParameter>("hm").label("Horizontal mirror").defaultValue(DEFAULT_HORIZONTAL_MIRROR).build(); auto param_hmirror = iotwebconf::Builder<iotwebconf::CheckboxTParameter>("hm").label("Horizontal mirror").defaultValue(DEFAULT_HORIZONTAL_MIRROR).build();
auto param_vertical_flip = iotwebconf::Builder<iotwebconf::CheckboxTParameter>("vm").label("Vertical mirror").defaultValue(DEFAULT_VERTICAL_MIRROR).build(); auto param_vflip = iotwebconf::Builder<iotwebconf::CheckboxTParameter>("vm").label("Vertical mirror").defaultValue(DEFAULT_VERTICAL_MIRROR).build();
auto param_dcw = iotwebconf::Builder<iotwebconf::CheckboxTParameter>("dcw").label("DCW").defaultValue(DEFAULT_DCW).build(); auto param_dcw = iotwebconf::Builder<iotwebconf::CheckboxTParameter>("dcw").label("DCW").defaultValue(DEFAULT_DCW).build();
auto param_colorbar = iotwebconf::Builder<iotwebconf::CheckboxTParameter>("cb").label("Colorbar").defaultValue(DEFAULT_COLORBAR).build(); auto param_colorbar = iotwebconf::Builder<iotwebconf::CheckboxTParameter>("cb").label("Colorbar").defaultValue(DEFAULT_COLORBAR).build();
@@ -119,7 +122,7 @@ void handle_root()
{"NetworkState.ApMode", String(iotWebConf.getState() == iotwebconf::NetworkState::ApMode)}, {"NetworkState.ApMode", String(iotWebConf.getState() == iotwebconf::NetworkState::ApMode)},
{"NetworkState.OnLine", String(iotWebConf.getState() == iotwebconf::NetworkState::OnLine)}, {"NetworkState.OnLine", String(iotWebConf.getState() == iotwebconf::NetworkState::OnLine)},
// Camera // Camera
{"CameraType", String(param_board.value())}, {"BoardType", String(param_board.value())},
{"FrameSize", String(param_frame_size.value())}, {"FrameSize", String(param_frame_size.value())},
{"FrameDuration", String(param_frame_duration.value())}, {"FrameDuration", String(param_frame_duration.value())},
{"FrameFrequency", String(1000.0 / param_frame_duration.value(), 1)}, {"FrameFrequency", String(1000.0 / param_frame_duration.value(), 1)},
@@ -132,27 +135,27 @@ void handle_root()
{"Brightness", String(param_brightness.value())}, {"Brightness", String(param_brightness.value())},
{"Contrast", String(param_contrast.value())}, {"Contrast", String(param_contrast.value())},
{"Saturation", String(param_saturation.value())}, {"Saturation", String(param_saturation.value())},
{"Effect", String(param_special_effect.value())}, {"SpecialEffect", String(param_special_effect.value())},
{"WhiteBalance", String(param_white_balance.value())}, {"WhiteBal", String(param_whitebal.value())},
{"AutomaticWhiteBalancebGain", String(param_automatic_white_balance_gain.value())}, {"AwbGain", String(param_awb_gain.value())},
{"WhiteBalanceMode", String(param_white_balance_mode.value())}, {"WbMode", String(param_wb_mode.value())},
{"ExposureControl", String(param_exposure_control.value())}, {"ExposureCtrl", String(param_exposure_ctrl.value())},
{"AEC2", String(param_aec2.value())}, {"Aec2", String(param_aec2.value())},
{"AELevel", String(param_ae_level.value())}, {"AeLevel", String(param_ae_level.value())},
{"AECValue", String(param_aec_value.value())}, {"AecValue", String(param_aec_value.value())},
{"GainControl", String(param_gain_control.value())}, {"GainCtrl", String(param_gain_ctrl.value())},
{"AGCGain", String(param_agc_gain.value())}, {"AgcGain", String(param_agc_gain.value())},
{"GainCeiling", String(param_gain_ceiling.value())}, {"GainCeiling", String(param_gain_ceiling.value())},
{"BPC", String(param_bpc.value())}, {"Bpc", String(param_bpc.value())},
{"WPC", String(param_wpc.value())}, {"Wpc", String(param_wpc.value())},
{"RawGamma", String(param_raw_gamma.value())}, {"RawGma", String(param_raw_gma.value())},
{"LENC", String(param_lenc.value())}, {"Lenc", String(param_lenc.value())},
{"HorizontalMirror", String(param_horizontal_mirror.value())}, {"HMirror", String(param_hmirror.value())},
{"VericalFlip", String(param_vertical_flip.value())}, {"VFlip", String(param_vflip.value())},
{"WCW", String(param_dcw.value())}, {"Dcw", String(param_dcw.value())},
{"ColorBar", String(param_colorbar.value())}, {"ColorBar", String(param_colorbar.value())},
// LED // LED
{"FlashLedIntensity", String(param_led_intensity.value())}, {"LedIntensity", String(param_led_intensity.value())},
// RTSP // RTSP
{"RtspPort", String(RTSP_PORT)}}; {"RtspPort", String(RTSP_PORT)}};
@@ -237,14 +240,6 @@ void handle_flash()
web_server.send(200); web_server.send(200);
} }
void on_config_saved()
{
log_v("on_config_saved");
// Set flash led intensity
analogWrite(LED_FLASH, param_led_intensity.value());
config_changed = true;
}
esp_err_t initialize_camera() esp_err_t initialize_camera()
{ {
log_v("initialize_camera"); log_v("initialize_camera");
@@ -272,22 +267,22 @@ void update_camera_settings()
camera->set_contrast(camera, param_contrast.value()); camera->set_contrast(camera, param_contrast.value());
camera->set_saturation(camera, param_saturation.value()); camera->set_saturation(camera, param_saturation.value());
camera->set_special_effect(camera, lookup_camera_effect(param_special_effect.value())); camera->set_special_effect(camera, lookup_camera_effect(param_special_effect.value()));
camera->set_whitebal(camera, param_white_balance.value()); camera->set_whitebal(camera, param_whitebal.value());
camera->set_awb_gain(camera, param_automatic_white_balance_gain.value()); camera->set_awb_gain(camera, param_awb_gain.value());
camera->set_wb_mode(camera, lookup_camera_white_balance_mode(param_white_balance_mode.value())); camera->set_wb_mode(camera, lookup_camera_wb_mode(param_wb_mode.value()));
camera->set_exposure_ctrl(camera, param_exposure_control.value()); camera->set_exposure_ctrl(camera, param_exposure_ctrl.value());
camera->set_aec2(camera, param_aec2.value()); camera->set_aec2(camera, param_aec2.value());
camera->set_ae_level(camera, param_ae_level.value()); camera->set_ae_level(camera, param_ae_level.value());
camera->set_aec_value(camera, param_aec_value.value()); camera->set_aec_value(camera, param_aec_value.value());
camera->set_gain_ctrl(camera, param_gain_control.value()); camera->set_gain_ctrl(camera, param_gain_ctrl.value());
camera->set_agc_gain(camera, param_agc_gain.value()); camera->set_agc_gain(camera, param_agc_gain.value());
camera->set_gainceiling(camera, lookup_camera_gain_ceiling_mode(param_gain_ceiling.value())); camera->set_gainceiling(camera, lookup_camera_gainceiling(param_gain_ceiling.value()));
camera->set_bpc(camera, param_bpc.value()); camera->set_bpc(camera, param_bpc.value());
camera->set_wpc(camera, param_wpc.value()); camera->set_wpc(camera, param_wpc.value());
camera->set_raw_gma(camera, param_raw_gamma.value()); camera->set_raw_gma(camera, param_raw_gma.value());
camera->set_lenc(camera, param_lenc.value()); camera->set_lenc(camera, param_lenc.value());
camera->set_hmirror(camera, param_horizontal_mirror.value()); camera->set_hmirror(camera, param_hmirror.value());
camera->set_vflip(camera, param_vertical_flip.value()); camera->set_vflip(camera, param_vflip.value());
camera->set_dcw(camera, param_dcw.value()); camera->set_dcw(camera, param_dcw.value());
camera->set_colorbar(camera, param_colorbar.value()); camera->set_colorbar(camera, param_colorbar.value());
} }
@@ -325,6 +320,16 @@ void on_connected()
start_rtsp_server(); start_rtsp_server();
} }
void on_config_saved()
{
log_v("on_config_saved");
// Set flash led intensity
analogWrite(LED_FLASH, param_led_intensity.value());
// Update camera setting
update_camera_settings();
config_changed = true;
}
void setup() void setup()
{ {
// Disable brownout // Disable brownout
@@ -358,22 +363,22 @@ void setup()
param_group_camera.addItem(&param_contrast); param_group_camera.addItem(&param_contrast);
param_group_camera.addItem(&param_saturation); param_group_camera.addItem(&param_saturation);
param_group_camera.addItem(&param_special_effect); param_group_camera.addItem(&param_special_effect);
param_group_camera.addItem(&param_white_balance); param_group_camera.addItem(&param_whitebal);
param_group_camera.addItem(&param_automatic_white_balance_gain); param_group_camera.addItem(&param_awb_gain);
param_group_camera.addItem(&param_white_balance_mode); param_group_camera.addItem(&param_wb_mode);
param_group_camera.addItem(&param_exposure_control); param_group_camera.addItem(&param_exposure_ctrl);
param_group_camera.addItem(&param_aec2); param_group_camera.addItem(&param_aec2);
param_group_camera.addItem(&param_ae_level); param_group_camera.addItem(&param_ae_level);
param_group_camera.addItem(&param_aec_value); param_group_camera.addItem(&param_aec_value);
param_group_camera.addItem(&param_gain_control); param_group_camera.addItem(&param_gain_ctrl);
param_group_camera.addItem(&param_agc_gain); param_group_camera.addItem(&param_agc_gain);
param_group_camera.addItem(&param_gain_ceiling); param_group_camera.addItem(&param_gain_ceiling);
param_group_camera.addItem(&param_bpc); param_group_camera.addItem(&param_bpc);
param_group_camera.addItem(&param_wpc); param_group_camera.addItem(&param_wpc);
param_group_camera.addItem(&param_raw_gamma); param_group_camera.addItem(&param_raw_gma);
param_group_camera.addItem(&param_lenc); param_group_camera.addItem(&param_lenc);
param_group_camera.addItem(&param_horizontal_mirror); param_group_camera.addItem(&param_hmirror);
param_group_camera.addItem(&param_vertical_flip); param_group_camera.addItem(&param_vflip);
param_group_camera.addItem(&param_dcw); param_group_camera.addItem(&param_dcw);
param_group_camera.addItem(&param_colorbar); param_group_camera.addItem(&param_colorbar);
iotWebConf.addParameterGroup(&param_group_camera); iotWebConf.addParameterGroup(&param_group_camera);