Removes PsychicHttp dependency

This commit is contained in:
Rune Harlyk
2026-01-22 22:20:13 +01:00
committed by Rune Harlyk
parent 0b8e060063
commit 64199ac1a3
22 changed files with 256 additions and 413 deletions
+33 -50
View File
@@ -1,4 +1,5 @@
#include <peripherals/camera_service.h>
#include <communication/native_server.h>
namespace Camera {
@@ -83,78 +84,60 @@ esp_err_t CameraService::begin() {
return err;
}
esp_err_t CameraService::cameraStill(PsychicRequest *request) {
esp_err_t CameraService::cameraStill(httpd_req_t *request) {
camera_fb_t *fb = safe_camera_fb_get();
if (!fb) {
ESP_LOGE(TAG, "Camera capture failed");
request->reply(500, "text/plain", "Camera capture failed");
return ESP_FAIL;
return NativeServer::sendError(request, 500, "Camera capture failed");
}
PsychicStreamResponse response = PsychicStreamResponse(request, "image/jpeg", "capture.jpg");
response.beginSend();
response.write(fb->buf, fb->len);
httpd_resp_set_type(request, "image/jpeg");
httpd_resp_set_hdr(request, "Content-Disposition", "inline; filename=capture.jpg");
esp_err_t res = httpd_resp_send(request, (const char *)fb->buf, fb->len);
esp_camera_fb_return(fb);
return response.endSend();
return res;
}
void streamTask(void *pv) {
esp_err_t CameraService::cameraStream(httpd_req_t *request) {
httpd_resp_set_type(request, _STREAM_CONTENT_TYPE);
camera_fb_t *fb = NULL;
char part_buf[64];
uint8_t *buf = NULL;
size_t buf_len = 0;
esp_err_t res = ESP_OK;
PsychicRequest *request = static_cast<PsychicRequest *>(pv);
httpd_req_t *copy = nullptr;
res = httpd_req_async_handler_begin(request->request(), &copy);
if (res != ESP_OK) {
return;
}
PsychicHttpServer *server = request->server();
PsychicRequest new_request = PsychicRequest(server, copy);
request = &new_request;
PsychicStreamResponse response = PsychicStreamResponse(request, _STREAM_CONTENT_TYPE);
camera_fb_t *fb = NULL;
char *part_buf[64];
size_t buf_len = 0;
uint8_t *buf = NULL;
int64_t fr_start = esp_timer_get_time();
response.beginSend();
for (;;) {
while (res == ESP_OK) {
fb = safe_camera_fb_get();
if (!fb) {
ESP_LOGE("Stream", "Camera capture failed");
ESP_LOGE(TAG, "Camera capture failed");
break;
}
if (fb->format != PIXFORMAT_JPEG) {
if (!frame2jpg(fb, 80, &buf, &buf_len)) break;
if (!frame2jpg(fb, 80, &buf, &buf_len)) {
esp_camera_fb_return(fb);
break;
}
} else {
buf_len = fb->len;
buf = fb->buf;
}
size_t hlen = snprintf((char *)part_buf, 64, _STREAM_PART, buf_len);
size_t w = response.write((const char *)part_buf, hlen);
w += response.write((const char *)buf, buf_len);
w += response.write((char *)_STREAM_BOUNDARY, strlen(_STREAM_BOUNDARY));
if (w == 62) break;
size_t hlen = snprintf(part_buf, 64, _STREAM_PART, buf_len);
res = httpd_resp_send_chunk(request, part_buf, hlen);
if (res == ESP_OK) res = httpd_resp_send_chunk(request, (const char *)buf, buf_len);
if (res == ESP_OK) res = httpd_resp_send_chunk(request, _STREAM_BOUNDARY, strlen(_STREAM_BOUNDARY));
esp_camera_fb_return(fb);
safe_sensor_return();
buf = NULL;
taskYIELD();
int64_t delay = 30000ll - esp_timer_get_time() - fr_start;
if (delay > 0) vTaskDelay(pdMS_TO_TICKS(delay));
}
ESP_LOGI("Stream", "Stream ended");
response.endSend();
httpd_req_async_handler_complete(copy);
vTaskDelete(NULL);
}
esp_err_t CameraService::cameraStream(PsychicRequest *request) {
xTaskCreate(streamTask, "Stream client task", 4096, request, 4, nullptr);
vTaskDelay(pdMS_TO_TICKS(100));
vTaskDelay(pdMS_TO_TICKS(30));
}
ESP_LOGI(TAG, "Stream ended");
httpd_resp_send_chunk(request, NULL, 0);
return ESP_OK;
}
@@ -193,4 +176,4 @@ void CameraService::updateCamera() {
safe_sensor_return();
}
} // namespace Camera
} // namespace Camera