Skip to content

Commit faef491

Browse files
authored
Merge pull request #27 from m-RNA/update-stream_state-events
Unify stream state events across HTTP and UVC for LED feedback
2 parents f1acb5d + b6c5e79 commit faef491

4 files changed

Lines changed: 39 additions & 7 deletions

File tree

components/StateManager/StateManager/StateManager.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,9 @@ void StateManager::HandleUpdateState()
6363
ledStreamState = LEDStates_e::LedStateStreaming;
6464
xQueueSend(this->ledStateQueue, &ledStreamState, 10);
6565
}
66-
if (this->stream_state == StreamState_e::Stream_ON)
66+
else if (this->stream_state == StreamState_e::Stream_OFF)
6767
{
68-
ledStreamState = LEDStates_e::LedStateStreaming;
68+
ledStreamState = LEDStates_e::LedStateStoppedStreaming;
6969
xQueueSend(this->ledStateQueue, &ledStreamState, 10);
7070
}
7171
break;
@@ -87,6 +87,11 @@ CameraState_e StateManager::GetCameraState()
8787
return this->camera_state;
8888
}
8989

90+
QueueHandle_t StateManager::GetEventQueue() const
91+
{
92+
return this->eventQueue;
93+
}
94+
9095
void HandleStateManagerTask(void *pvParameters)
9196
{
9297
auto *stateManager = static_cast<StateManager *>(pvParameters);

components/StateManager/StateManager/StateManager.hpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ class StateManager
7676
void HandleUpdateState();
7777
WiFiState_e GetWifiState();
7878
CameraState_e GetCameraState();
79+
QueueHandle_t GetEventQueue() const;
7980

8081
private:
8182
QueueHandle_t eventQueue;
@@ -87,6 +88,15 @@ class StateManager
8788
StreamState_e stream_state;
8889
};
8990

91+
// Lightweight helper to publish stream state changes to the shared event queue.
92+
static inline bool SendStreamEvent(QueueHandle_t queue, StreamState_e state)
93+
{
94+
if (!queue)
95+
return false;
96+
SystemEvent evt{EventSource::STREAM, state};
97+
return xQueueSend(queue, &evt, 0) == pdTRUE;
98+
}
99+
90100
void HandleStateManagerTask(void *pvParameters);
91101

92102
#endif // STATEMANAGER_HPP

components/StreamServer/StreamServer/StreamServer.cpp

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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;

components/UVCStream/UVCStream/UVCStream.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,7 @@ static esp_err_t UVCStreamHelpers::camera_start_cb(uvc_format_t format, int widt
6767

6868
cameraHandler->setCameraResolution(frame_size);
6969

70-
constexpr SystemEvent event = {EventSource::STREAM, StreamState_e::Stream_ON};
71-
xQueueSend(eventQueue, &event, 10);
70+
SendStreamEvent(eventQueue, StreamState_e::Stream_ON);
7271

7372
return ESP_OK;
7473
}
@@ -82,8 +81,7 @@ static void UVCStreamHelpers::camera_stop_cb(void *cb_ctx)
8281
s_fb.cam_fb_p = nullptr;
8382
}
8483

85-
constexpr SystemEvent event = {EventSource::STREAM, StreamState_e::Stream_OFF};
86-
xQueueSend(eventQueue, &event, 10);
84+
SendStreamEvent(eventQueue, StreamState_e::Stream_OFF);
8785
}
8886

8987
static uvc_fb_t *UVCStreamHelpers::camera_fb_get_cb(void *cb_ctx)
@@ -205,6 +203,9 @@ esp_err_t UVCStreamManager::setup()
205203
}
206204
ESP_LOGI(UVC_STREAM_TAG, "Initialized UVC Device");
207205

206+
// Initial state is OFF
207+
SendStreamEvent(eventQueue, StreamState_e::Stream_OFF);
208+
208209
return ESP_OK;
209210
}
210211

0 commit comments

Comments
 (0)