PoC wired mode over UVC, add logs over websockets, needs cleanup

This commit is contained in:
Lorow
2024-10-19 14:24:50 +02:00
parent b578bf3d2c
commit 23bb930255
16 changed files with 548 additions and 131 deletions

View File

@@ -0,0 +1,4 @@
idf_component_register(SRCS "WebSocketLogger/WebSocketLogger.cpp"
INCLUDE_DIRS "WebSocketLogger"
REQUIRES esp_http_server
)

View File

@@ -0,0 +1,71 @@
#include "WebSocketLogger.hpp"
WebSocketLogger::WebSocketLogger()
{
this->connected_socket_client = async_resp_arg{
.hd = nullptr,
.fd = -1,
};
this->ws_log_buffer[0] = '\0';
}
void LoggerHelpers::ws_async_send(void *arg)
{
char *log_buffer = webSocketLogger.get_websocket_log_buffer();
struct async_resp_arg *resp_arg = (struct async_resp_arg *)arg;
httpd_handle_t hd = resp_arg->hd;
int fd = resp_arg->fd;
httpd_ws_frame_t websocket_packet = httpd_ws_frame_t{};
websocket_packet.payload = (uint8_t *)log_buffer;
websocket_packet.len = strlen(log_buffer);
websocket_packet.type = HTTPD_WS_TYPE_TEXT;
httpd_ws_send_frame_async(hd, fd, &websocket_packet);
}
esp_err_t WebSocketLogger::log_message(const char *format, va_list args)
{
vsnprintf(this->ws_log_buffer, 100, format, args);
if (connected_socket_client.fd == -1 || connected_socket_client.hd == nullptr)
{
return ESP_FAIL;
}
esp_err_t ret = httpd_queue_work(connected_socket_client.hd, LoggerHelpers::ws_async_send, &connected_socket_client);
if (ret != ESP_OK)
{
connected_socket_client.fd = -1;
connected_socket_client.hd = nullptr;
}
return ret;
}
esp_err_t WebSocketLogger::register_socket_client(httpd_req_t *req)
{
if (connected_socket_client.fd != -1 && connected_socket_client.hd != nullptr)
{
// we're already connected
return ESP_OK;
}
connected_socket_client.hd = req->handle;
connected_socket_client.fd = httpd_req_to_sockfd(req);
return ESP_OK;
}
void WebSocketLogger::unregister_socket_client()
{
connected_socket_client.fd = -1;
connected_socket_client.hd = nullptr;
}
char *WebSocketLogger::get_websocket_log_buffer()
{
return this->ws_log_buffer;
}

View File

@@ -0,0 +1,39 @@
#pragma once
#ifndef WEBSOCKETLOGGER_HPP
#define WEBSOCKETLOGGER_HPP
#include "esp_http_server.h"
#include "esp_log.h"
#define WS_LOG_BUFFER_LEN 1024
struct async_resp_arg
{
httpd_handle_t hd;
int fd;
};
namespace LoggerHelpers
{
void ws_async_send(void *arg);
}
class WebSocketLogger
{
private:
async_resp_arg connected_socket_client;
char ws_log_buffer[WS_LOG_BUFFER_LEN];
public:
WebSocketLogger();
esp_err_t log_message(const char *format, va_list args);
esp_err_t register_socket_client(httpd_req_t *req);
void unregister_socket_client();
bool is_client_connected();
char *get_websocket_log_buffer();
};
extern WebSocketLogger webSocketLogger;
#endif