From fa959d9f47c922c3fa6b3741a809fc856efc2bba Mon Sep 17 00:00:00 2001 From: btsimonh Date: Tue, 9 Jan 2024 21:06:22 +0000 Subject: [PATCH] Webcam v2 tweaks 2024 (#20451) * suppress compiler warning about 'used' function * don't stop and start cam webserver every time we save to flash. Only stop the actual cam clock. * change cmds WcMenuVideoon and wcmenuvideooff to be wcmenuvideodisable 0/1 to be more TAS like, and save a little. --- .../xdrv_81_esp32_webcam_task.ino | 36 +++++++++---------- .../xdrv_81_esp32_webcam_task_motion.ino | 2 +- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_81_esp32_webcam_task.ino b/tasmota/tasmota_xdrv_driver/xdrv_81_esp32_webcam_task.ino index 77636cf8b..9ec245ce0 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_81_esp32_webcam_task.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_81_esp32_webcam_task.ino @@ -108,8 +108,8 @@ As soon as the screenshare ended, back to 53fps at 30mhz clock. * background(4) * e.g. could be used to read pixels, or change pixels from berry. - * WcMenuvideoon = turn on video in main menu - * WcMenuvideooff = turn off video in main menu + * WcMenuvideodisable 0 = turn on video in main menu + * WcMenuvideodisable 1 = turn off video in main menu * WcSetOptionsNN = call WcSetOptions function with (index, payload). * - can oprate many of the functions above, plus: @@ -701,7 +701,9 @@ void WcInterrupt(uint32_t state) { // Stop camera ISR if active to fix TG1WDT_SYS_RESET if (!Wc.up) { return; } - WcSetStreamserver(state); + // why stop/start the server itself here? + // stopping the cam interrupt should be enough? + //WcSetStreamserver(state); if (state) { // Re-enable interrupts cam_start(); @@ -1589,7 +1591,9 @@ uint32_t WcSetStreamserver(uint32_t flag) { WcEndStream(); return 0; } - +#ifdef WEBCAM_DEV_DEBUG + AddLog(LOG_LEVEL_DEBUG, PSTR("WcSetStreamserver %d"), flag); +#endif if (flag) { if (!Wc.CamServer) { TasAutoMutex localmutex(&WebcamMutex, "HandleWebcamMjpeg", 20000); @@ -2251,7 +2255,7 @@ void WcShowStream(void) { WSContentSend_P(HTTP_WEBCAM_MENUVIDEOCONTROL, "wcinit", "Try WCINIT"); } else { if (Settings->webcam_config.spare15) { - WSContentSend_P(HTTP_WEBCAM_MENUVIDEOCONTROL, "wcmenuvideoon", "Turn On Video"); + WSContentSend_P(HTTP_WEBCAM_MENUVIDEOCONTROL, "wcmenuvideodisable%200", "Turn On Video"); } } } @@ -2260,7 +2264,7 @@ void WcShowStream(void) { if (!Settings->webcam_config.spare15 && Settings->webcam_config.stream && Wc.CamServer && Wc.up!=0) { // Give the webcam webserver some time to prepare the stream - catch error in JS WSContentSend_P(PSTR("

Webcam stream

"),(uint32_t)WiFi.localIP()); - WSContentSend_P(HTTP_WEBCAM_MENUVIDEOCONTROL, "wcmenuvideooff", "Turn Off Video"); + WSContentSend_P(HTTP_WEBCAM_MENUVIDEOCONTROL, "wcmenuvideodisable%201", "Turn Off Video"); } } @@ -2331,8 +2335,7 @@ void WcInit(void) { #define D_CMND_WC_STARTTASK "Starttask" #define D_CMND_WC_STOPTASK "Stoptask" -#define D_CMND_WC_MENUVIDEOOFF "Menuvideooff" -#define D_CMND_WC_MENUVIDEOON "Menuvideoon" +#define D_CMND_WC_MENUVIDEODISABLE "MenuVideoDisable" // for testing to see what happens after cam_stop() #define D_CMND_WC_INTERRUPT "Interrupt" @@ -2363,7 +2366,7 @@ const char kWCCommands[] PROGMEM = D_PRFX_WEBCAM "|" // Prefix 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_FEATURE "|" D_CMND_WC_SETDEFAULTS "|" D_CMND_WC_STATS "|" D_CMND_WC_INIT "|" D_CMND_WC_AUTH "|" D_CMND_WC_CLK "|" - D_CMND_WC_STARTTASK "|" D_CMND_WC_STOPTASK "|" D_CMND_WC_MENUVIDEOOFF "|" D_CMND_WC_MENUVIDEOON "|" + D_CMND_WC_STARTTASK "|" D_CMND_WC_STOPTASK "|" D_CMND_WC_MENUVIDEODISABLE "|" D_CMND_WC_INTERRUPT "|" D_CMND_WC_GETFRAME "|" D_CMND_WC_GETPICSTORE "|" #ifdef USE_WEBCAM_MOTION D_CMND_WC_SETMOTIONDETECT "|" D_CMND_WC_GETMOTIONPIXELS "|" @@ -2385,7 +2388,7 @@ void (* const WCCommand[])(void) PROGMEM = { &CmndWebcamGammaCorrect, &CmndWebcamLensCorrect, &CmndWebcamWPC, &CmndWebcamDCW, &CmndWebcamBPC, &CmndWebcamColorbar, &CmndWebcamFeature, &CmndWebcamSetDefaults, &CmndWebcamStats, &CmndWebcamInit, &CmndWebcamAuth, &CmndWebcamClock, - &CmndWebcamStartTask, &CmndWebcamStopTask, &CmndWebcamMenuVideoOff, &CmndWebcamMenuVideoOn, + &CmndWebcamStartTask, &CmndWebcamStopTask, &CmndWebcamMenuVideoDisable, &CmndWebcamCamStartStop, &CmndWebcamGetFrame, &CmndWebcamGetPicStore, #ifdef USE_WEBCAM_MOTION &CmndWebcamSetMotionDetect, &CmndWebcamGetMotionPixels, @@ -2412,7 +2415,7 @@ void CmndWebcam(void) { 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_COLORBAR "\":%d,\"" D_CMND_WC_FEATURE "\":%d,\"" D_CMND_WC_AUTH "\":%d,\"" D_CMND_WC_CLK "\":%d,\"" - D_CMND_WC_MENUVIDEOOFF "\":%d" + D_CMND_WC_MENUVIDEODISABLE "\":%d" #ifdef ENABLE_RTSPSERVER ",\"" D_CMND_RTSP "\":%d" #endif // ENABLE_RTSPSERVER @@ -2620,13 +2623,10 @@ void CmdWebcamAppendPic(){ WebcamSavePic(1)? ResponseCmndDone(): ResponseCmndError(); } -void CmndWebcamMenuVideoOff(void) { - Settings->webcam_config.spare15 = 1; - ResponseCmndStateText(Settings->webcam_config.spare15); -} - -void CmndWebcamMenuVideoOn(void) { - Settings->webcam_config.spare15 = 0; +void CmndWebcamMenuVideoDisable(void) { + if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 1)) { + Settings->webcam_config.spare15 = XdrvMailbox.payload; + } ResponseCmndStateText(Settings->webcam_config.spare15); } diff --git a/tasmota/tasmota_xdrv_driver/xdrv_81_esp32_webcam_task_motion.ino b/tasmota/tasmota_xdrv_driver/xdrv_81_esp32_webcam_task_motion.ino index 8384a7485..49c112350 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_81_esp32_webcam_task_motion.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_81_esp32_webcam_task_motion.ino @@ -544,7 +544,6 @@ bool wc_jpg2rgb888(const uint8_t *src, size_t src_len, struct PICSTORE * out, in } return true; } -#endif bool wc_jpg2rgb565(const uint8_t *src, size_t src_len, struct PICSTORE * out, int scale) @@ -561,6 +560,7 @@ bool wc_jpg2rgb565(const uint8_t *src, size_t src_len, struct PICSTORE * out, in } return true; } +#endif // general jpeg to pixel conversion