Integrate Nightmode and Reduced FPS into WcFeature

This commit is contained in:
Philipp Richter 2022-04-27 22:37:32 +02:00
parent c8e6e45104
commit 22aeda5a14
2 changed files with 79 additions and 73 deletions

View File

@ -322,8 +322,7 @@ typedef union { // Restricted by MISRA-C Rule 18.4 bu
uint32_t bpc : 1; uint32_t bpc : 1;
uint32_t spare15 : 1; uint32_t spare15 : 1;
uint32_t spare16 : 1; uint32_t spare16 : 1;
uint32_t streamspeed : 1; uint32_t feature : 2;
uint32_t nightmode : 1;
uint32_t contrast : 3; uint32_t contrast : 3;
uint32_t brightness : 3; uint32_t brightness : 3;
uint32_t saturation : 3; uint32_t saturation : 3;

View File

@ -59,8 +59,27 @@
* WcSaturation = Set picture Saturation -2 ... +2 * WcSaturation = Set picture Saturation -2 ... +2
* WcBrightness = Set picture Brightness -2 ... +2 * WcBrightness = Set picture Brightness -2 ... +2
* WcContrast = Set picture Contrast -2 ... +2 * WcContrast = Set picture Contrast -2 ... +2
* WcInit = Init Camera Interface * WcSpecialEffekt = Set Special Picture Effect: 0 = off, 1 = , 2 = , 3 = , 4 = , 5 = , 6 =
* WcRtsp = Control RTSP Server, 0=disable, 1=enable (forces restart) (if defined ENABLE_RTSPSERVER) * WcAWB = Auto White Balance, 0 = no, 1 = yes
* WcWBMode = White Balance Mode, 0 = auto, 1 =
* WcAWBGain = Auto White Balance Gain, 0 = no, 1 = yes
* WcAEC = Auto exposure control (Sensor), 0 = no, 1 = yes
* WcAECDSP = Auto exposure control (DSP), 0 = no, 1 = yes
* WcAECValue = Auto exposure control value, 0 ... 1024
* WcAECLevel = Auto exposure control level, -2 ... +2
* WcAGC = Auto gain control, 0 = no, 1 = yes
* WcAGCGain = Auto gain control gain, 0 .. 30
* WcGainCeiling = Gain ceiling, 0 .. 6 (0 = x2, 1 = x4, 2 = x8, 3 = x16, 4 = x32, 5 = x64, 6 = x128)
* WcGammaCorrect = Auto Gamma Correct, 0 = no, 1 = yes
* WcLensCorrect = Auto Lens Correct, 0 = no, 1 = yes
* WcWPC = White Pixel Correct, 0 = no, 1 = yes
* WcDCW = Downscale, 0 = no, 1 = yes
* WcBPC = Black Pixel Correct, 0 = no, 1 = yes
* WcColorbar = Show Colorbar, 0 = no, 1 = yes
* WcFeature = Set extended Feature, 0 = off, 1 = reduce FPS, 2 = Nightmode
* WcStats = Show Statistics
* WcInit = Init Camera Interface
* WcRtsp = Control RTSP Server, 0=disable, 1=enable (forces restart) (if defined ENABLE_RTSPSERVER)
* *
* Only boards with PSRAM should be used. To enable PSRAM board should be se set to esp32cam in common32 of platform_override.ini * Only boards with PSRAM should be used. To enable PSRAM board should be se set to esp32cam in common32 of platform_override.ini
* board = esp32cam * board = esp32cam
@ -207,36 +226,37 @@ bool WcPinUsed(void) {
return pin_used; return pin_used;
} }
void WcStreamSpeed(int32_t value) { void WcFeature(int32_t value) {
sensor_t *wc_s = esp_camera_sensor_get(); sensor_t * wc_s = esp_camera_sensor_get();
if (!wc_s) { return; } if (!wc_s) { return; }
if (value) { if (value != 1) {
// CLKRC: Set Clock Divider to fullspeed // CLKRC: Set Clock Divider to 0 = fullspeed
wc_s->set_reg(wc_s, 0x111, 0x3f, 0x00); wc_s->set_reg(wc_s, 0x111, 0x3f, 0x00);
} else { vTaskDelay(200 / portTICK_PERIOD_MS);
// CLKRC: Set Clock Divider to 2 }
wc_s->set_reg(wc_s, 0x111, 0x3f, 0x02); if (value != 2) {
// Stop Nightmode
wc_s->set_reg(wc_s, 0x103, 0xff, 0x0a); // COM1: Reset dummy frames
wc_s->set_reg(wc_s, 0x10f, 0xff, 0x43); // Reserved Reg
wc_s->set_reg(wc_s, 0x10f, 0xff, 0x4b); // Reserved Reg
vTaskDelay(1000 / portTICK_PERIOD_MS);
wc_s->set_reg(wc_s, 0x10f, 0xff, 0x43); // Reserved Reg
} }
AddLog(LOG_LEVEL_DEBUG, PSTR("CAM: Streamspeed: %d"), value); switch(value) {
} case 1:
// Reduce FPS
void WcNightMode(int32_t value) { // CLKRC: Set Clock Divider to 2
sensor_t *wc_s = esp_camera_sensor_get(); wc_s->set_reg(wc_s, 0x111, 0x3f, 0x02);
if (!wc_s) { return; } break;
case 2:
if (value) { // Start Nightmode
wc_s->set_reg(wc_s, 0x10f, 0xff, 0x4b); // Reserved Reg wc_s->set_reg(wc_s, 0x10f, 0xff, 0x4b); // Reserved Reg
wc_s->set_reg(wc_s, 0x103, 0xff, 0xcf); // COM1: Allow 7 dummy frames wc_s->set_reg(wc_s, 0x103, 0xff, 0xcf); // COM1: Allow 7 dummy frames
} else { break;
wc_s->set_reg(wc_s, 0x103, 0xff, 0x0a); // COM1: Reset dummy frames
wc_s->set_reg(wc_s, 0x10f, 0xff, 0x43); // Reserved Reg
wc_s->set_reg(wc_s, 0x10f, 0xff, 0x4b); // Reserved Reg
vTaskDelay(1000 / portTICK_PERIOD_MS);
wc_s->set_reg(wc_s, 0x10f, 0xff, 0x43); // Reserved Reg
} }
AddLog(LOG_LEVEL_DEBUG, PSTR("CAM: Nightmode: %d"), value); AddLog(LOG_LEVEL_DEBUG, PSTR("CAM: Feature: %d"), value);
} }
void WcApplySettings() { void WcApplySettings() {
@ -270,9 +290,8 @@ void WcApplySettings() {
wc_s->set_wpc(wc_s, Settings->webcam_config.wpc); wc_s->set_wpc(wc_s, Settings->webcam_config.wpc);
wc_s->set_dcw(wc_s, Settings->webcam_config.dcw); wc_s->set_dcw(wc_s, Settings->webcam_config.dcw);
wc_s->set_bpc(wc_s, Settings->webcam_config.bpc); wc_s->set_bpc(wc_s, Settings->webcam_config.bpc);
WcStreamSpeed(Settings->webcam_config.streamspeed); WcFeature(Settings->webcam_config.feature);
WcNightMode(Settings->webcam_config.nightmode);
AddLog(LOG_LEVEL_DEBUG, PSTR("CAM: Settings updated")); AddLog(LOG_LEVEL_DEBUG, PSTR("CAM: Settings updated"));
} }
@ -294,23 +313,22 @@ void WcSetDefaults(uint32_t upgrade) {
Settings->webcam_config2.wb_mode = 0; // white balance mode Settings->webcam_config2.wb_mode = 0; // white balance mode
Settings->webcam_config.awb_gain = 1; // white blance gain Settings->webcam_config.awb_gain = 1; // white blance gain
Settings->webcam_config.aec = 1; Settings->webcam_config.aec = 1; // autoexposure (sensor)
Settings->webcam_config.aec2 = 1; Settings->webcam_config.aec2 = 1; // autoexposure (dsp)
Settings->webcam_config2.ae_level = 2; // = 0 Settings->webcam_config2.ae_level = 2; // autoexposure level (-2 - +2, default 0)
Settings->webcam_config2.aec_value = 204; Settings->webcam_config2.aec_value = 204; // manual exposure value
Settings->webcam_config.agc = 1; Settings->webcam_config.agc = 1; // auto gain control
Settings->webcam_config2.agc_gain = 5; Settings->webcam_config2.agc_gain = 5; // manual gain control
Settings->webcam_config2.gainceiling = 0; Settings->webcam_config2.gainceiling = 0; // auto gain ceiling
Settings->webcam_config.raw_gma = 1; Settings->webcam_config.raw_gma = 1; // gamma correct
Settings->webcam_config.lenc = 1; // lens correction Settings->webcam_config.lenc = 1; // lens correction
Settings->webcam_config.wpc = 1; // white pixel correct Settings->webcam_config.wpc = 1; // white pixel correct
Settings->webcam_config.dcw = 1; // downsize en Settings->webcam_config.dcw = 1; // downsize en
Settings->webcam_config.bpc = 0; // black pixel correct? Settings->webcam_config.bpc = 0; // black pixel correct?
Settings->webcam_config.streamspeed = 1; Settings->webcam_config.feature = 0;
Settings->webcam_config.nightmode = 0;
AddLog(LOG_LEVEL_DEBUG, PSTR("CAM: Defaults set")); AddLog(LOG_LEVEL_DEBUG, PSTR("CAM: Defaults set"));
@ -555,10 +573,7 @@ int32_t WcSetOptions(uint32_t sel, int32_t value) {
res = s->status.colorbar; res = s->status.colorbar;
break; break;
case 23: case 23:
if (value >= 0) { WcStreamSpeed(value); } if (value >= 0) { WcFeature(value); }
break;
case 24:
if (value >= 0) { WcNightMode(value); }
break; break;
} }
@ -1209,14 +1224,13 @@ void WcInit(void) {
#define D_CMND_WC_COLORBAR "Colorbar" #define D_CMND_WC_COLORBAR "Colorbar"
#define D_CMND_WC_STREAMSPEED "StreamSpeed" #define D_CMND_WC_FEATURE "Feature"
#define D_CMND_WC_NIGHTMODE "Nightmode"
#define D_CMND_WC_SETDEFAULTS "SetDefaults" #define D_CMND_WC_SETDEFAULTS "SetDefaults"
#define D_CMND_WC_APPLYSETTINGS "ApplySettings"
#define D_CMND_WC_STATS "Stats" #define D_CMND_WC_STATS "Stats"
#define D_CMND_WC_INIT "Init" #define D_CMND_WC_INIT "Init"
#define D_CMND_WC_APPLYSETTINGS "ApplySettings"
#define D_CMND_RTSP "Rtsp" #define D_CMND_RTSP "Rtsp"
const char kWCCommands[] PROGMEM = D_PRFX_WEBCAM "|" // Prefix const char kWCCommands[] PROGMEM = D_PRFX_WEBCAM "|" // Prefix
@ -1225,9 +1239,9 @@ const char kWCCommands[] PROGMEM = D_PRFX_WEBCAM "|" // Prefix
D_CMND_WC_AWB "|" D_CMND_WC_WB_MODE "|" D_CMND_WC_AWB_GAIN "|" D_CMND_WC_AEC "|" D_CMND_WC_AWB "|" D_CMND_WC_WB_MODE "|" D_CMND_WC_AWB_GAIN "|" D_CMND_WC_AEC "|"
D_CMND_WC_AEC_VALUE "|" D_CMND_WC_AE_LEVEL "|" D_CMND_WC_AEC2 "|" D_CMND_WC_AGC "|" D_CMND_WC_AEC_VALUE "|" D_CMND_WC_AE_LEVEL "|" D_CMND_WC_AEC2 "|" D_CMND_WC_AGC "|"
D_CMND_WC_AGC_GAIN "|" D_CMND_WC_GAINCEILING "|" D_CMND_WC_RAW_GMA "|" D_CMND_WC_LENC "|" D_CMND_WC_AGC_GAIN "|" D_CMND_WC_GAINCEILING "|" D_CMND_WC_RAW_GMA "|" D_CMND_WC_LENC "|"
D_CMND_WC_WPC "|" D_CMND_WC_DCW "|" D_CMND_WC_BPC "|" D_CMND_WC_COLORBAR "|" D_CMND_WC_WPC "|" D_CMND_WC_DCW "|" D_CMND_WC_BPC "|" D_CMND_WC_COLORBAR "|" D_CMND_WC_FEATURE "|"
D_CMND_WC_STREAMSPEED "|" D_CMND_WC_NIGHTMODE "|" D_CMND_WC_SETDEFAULTS "|" D_CMND_WC_STATS "|" D_CMND_WC_INIT
D_CMND_WC_SETDEFAULTS "|" D_CMND_WC_APPLYSETTINGS "|" D_CMND_WC_STATS "|" D_CMND_WC_INIT "|" D_CMND_WC_APPLYSETTINGS
#ifdef ENABLE_RTSPSERVER #ifdef ENABLE_RTSPSERVER
"|" D_CMND_RTSP "|" D_CMND_RTSP
#endif // ENABLE_RTSPSERVER #endif // ENABLE_RTSPSERVER
@ -1239,8 +1253,9 @@ void (* const WCCommand[])(void) PROGMEM = {
&CmndWebcamAWB, &CmndWebcamWBMode, &CmndWebcamAWBGain, &CmndWebcamAEC, &CmndWebcamAECValue, &CmndWebcamAWB, &CmndWebcamWBMode, &CmndWebcamAWBGain, &CmndWebcamAEC, &CmndWebcamAECValue,
&CmndWebcamAELevel, &CmndWebcamAEC2, &CmndWebcamAGC, &CmndWebcamAGCGain, &CmndWebcamGainCeiling, &CmndWebcamAELevel, &CmndWebcamAEC2, &CmndWebcamAGC, &CmndWebcamAGCGain, &CmndWebcamGainCeiling,
&CmndWebcamGammaCorrect, &CmndWebcamLensCorrect, &CmndWebcamWPC, &CmndWebcamDCW, &CmndWebcamBPC, &CmndWebcamGammaCorrect, &CmndWebcamLensCorrect, &CmndWebcamWPC, &CmndWebcamDCW, &CmndWebcamBPC,
&CmndWebcamColorbar, &CmndWebcamStreamspeed, &CmndWebcamNightmode, &CmndWebcamColorbar, &CmndWebcamFeature, &CmndWebcamSetDefaults,
&CmndWebcamSetDefaults, &CmndWebcamApplySettings, &CmndWebcamStats, &CmndWebcamInit &CmndWebcamStats, &CmndWebcamInit
, &CmndWebcamApplySettings
#ifdef ENABLE_RTSPSERVER #ifdef ENABLE_RTSPSERVER
, &CmndWebRtsp , &CmndWebRtsp
#endif // ENABLE_RTSPSERVER #endif // ENABLE_RTSPSERVER
@ -1255,7 +1270,7 @@ void CmndWebcam(void) {
D_CMND_WC_AE_LEVEL "\":%d,\"" D_CMND_WC_AEC2 "\":%d,\"" D_CMND_WC_AGC "\":%d,\"" D_CMND_WC_AE_LEVEL "\":%d,\"" D_CMND_WC_AEC2 "\":%d,\"" D_CMND_WC_AGC "\":%d,\""
D_CMND_WC_AGC_GAIN "\":%d,\"" D_CMND_WC_GAINCEILING "\":%d,\"" D_CMND_WC_RAW_GMA "\":%d,\"" D_CMND_WC_AGC_GAIN "\":%d,\"" D_CMND_WC_GAINCEILING "\":%d,\"" D_CMND_WC_RAW_GMA "\":%d,\""
D_CMND_WC_LENC "\":%d,\"" D_CMND_WC_WPC "\":%d,\"" D_CMND_WC_DCW "\":%d,\"" D_CMND_WC_BPC "\":%d,\"" D_CMND_WC_LENC "\":%d,\"" D_CMND_WC_WPC "\":%d,\"" D_CMND_WC_DCW "\":%d,\"" D_CMND_WC_BPC "\":%d,\""
D_CMND_WC_COLORBAR "\":%d,\"" D_CMND_WC_STREAMSPEED "\":%d,\"" D_CMND_WC_NIGHTMODE "\":%d" D_CMND_WC_COLORBAR "\":%d,\"" D_CMND_WC_FEATURE "\":%d"
#ifdef ENABLE_RTSPSERVER #ifdef ENABLE_RTSPSERVER
",\"" D_CMND_RTSP "\":%d" ",\"" D_CMND_RTSP "\":%d"
#endif // ENABLE_RTSPSERVER #endif // ENABLE_RTSPSERVER
@ -1268,7 +1283,7 @@ void CmndWebcam(void) {
Settings->webcam_config2.ae_level -2, Settings->webcam_config.aec2, Settings->webcam_config.agc, Settings->webcam_config2.ae_level -2, Settings->webcam_config.aec2, Settings->webcam_config.agc,
Settings->webcam_config2.agc_gain, Settings->webcam_config2.gainceiling, Settings->webcam_config.raw_gma, Settings->webcam_config2.agc_gain, Settings->webcam_config2.gainceiling, Settings->webcam_config.raw_gma,
Settings->webcam_config.lenc, Settings->webcam_config.wpc, Settings->webcam_config.dcw, Settings->webcam_config.bpc, Settings->webcam_config.lenc, Settings->webcam_config.wpc, Settings->webcam_config.dcw, Settings->webcam_config.bpc,
Settings->webcam_config.colorbar, Settings->webcam_config.streamspeed, Settings->webcam_config.nightmode Settings->webcam_config.colorbar, Settings->webcam_config.feature
#ifdef ENABLE_RTSPSERVER #ifdef ENABLE_RTSPSERVER
, Settings->webcam_config.rtsp , Settings->webcam_config.rtsp
#endif // ENABLE_RTSPSERVER #endif // ENABLE_RTSPSERVER
@ -1467,20 +1482,12 @@ void CmndWebcamColorbar(void) {
ResponseCmndStateText(Settings->webcam_config.colorbar); ResponseCmndStateText(Settings->webcam_config.colorbar);
} }
void CmndWebcamStreamspeed(void) { void CmndWebcamFeature(void) {
if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 1)) { if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 2)) {
Settings->webcam_config.streamspeed = XdrvMailbox.payload; Settings->webcam_config.feature = XdrvMailbox.payload;
WcSetOptions(23, Settings->webcam_config.streamspeed); WcSetOptions(23, Settings->webcam_config.feature);
} }
ResponseCmndStateText(Settings->webcam_config.streamspeed); ResponseCmndNumber(Settings->webcam_config.feature);
}
void CmndWebcamNightmode(void) {
if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 1)) {
Settings->webcam_config.nightmode = XdrvMailbox.payload;
WcSetOptions(24, Settings->webcam_config.nightmode);
}
ResponseCmndStateText(Settings->webcam_config.nightmode);
} }
void CmndWebcamInit(void) { void CmndWebcamInit(void) {