mirror of
https://github.com/MrUnknownDE/OpenIris-ESPIDF.git
synced 2026-04-21 07:23:44 +02:00
PoC wired mode over UVC, add logs over websockets, needs cleanup
This commit is contained in:
4
components/WebSocketLogger/CMakeLists.txt
Normal file
4
components/WebSocketLogger/CMakeLists.txt
Normal file
@@ -0,0 +1,4 @@
|
||||
idf_component_register(SRCS "WebSocketLogger/WebSocketLogger.cpp"
|
||||
INCLUDE_DIRS "WebSocketLogger"
|
||||
REQUIRES esp_http_server
|
||||
)
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user