@@ -25,13 +25,21 @@ esp_err_t StreamHelpers::stream(httpd_req_t *req)
2525 if (!last_frame)
2626 last_frame = esp_timer_get_time ();
2727
28+ // Pull event queue from user_ctx to send STREAM on/off notifications
29+ auto *stateManager = static_cast <StateManager *>(req->user_ctx );
30+ QueueHandle_t eventQueue = stateManager ? stateManager->GetEventQueue () : nullptr ;
31+ bool stream_on_sent = false ;
32+
2833 response = httpd_resp_set_type (req, STREAM_CONTENT_TYPE );
2934 if (response != ESP_OK )
3035 return response;
3136
3237 httpd_resp_set_hdr (req, " Access-Control-Allow-Origin" , " *" );
3338 httpd_resp_set_hdr (req, " X-Framerate" , " 60" );
3439
40+ if (SendStreamEvent (eventQueue, StreamState_e::Stream_ON))
41+ stream_on_sent = true ;
42+
3543 while (true )
3644 {
3745 fb = esp_camera_fb_get ();
@@ -100,6 +108,10 @@ esp_err_t StreamHelpers::stream(httpd_req_t *req)
100108 }
101109 }
102110 last_frame = 0 ;
111+
112+ if (stream_on_sent)
113+ SendStreamEvent (eventQueue, StreamState_e::Stream_OFF);
114+
103115 return response;
104116}
105117
@@ -124,7 +136,7 @@ esp_err_t StreamServer::startStreamServer()
124136 .uri = " /" ,
125137 .method = HTTP_GET ,
126138 .handler = &StreamHelpers::stream,
127- .user_ctx = nullptr ,
139+ .user_ctx = this -> stateManager ,
128140 };
129141
130142 httpd_uri_t logs_ws = {
@@ -152,6 +164,10 @@ esp_err_t StreamServer::startStreamServer()
152164
153165 httpd_register_uri_handler (camera_stream, &stream_page);
154166
167+ // Initial state is OFF
168+ if (this ->stateManager )
169+ SendStreamEvent (this ->stateManager ->GetEventQueue (), StreamState_e::Stream_OFF);
170+
155171 ESP_LOGI (STREAM_SERVER_TAG , " Stream server started on port %d" , STREAM_SERVER_PORT );
156172
157173 return ESP_OK ;
0 commit comments