Files
Calendink/Provider/main/udp_logger.cpp
2026-03-14 17:27:24 -04:00

72 lines
1.7 KiB
C++

#include <string.h>
#include "esp_log.h"
#include "freertos/FreeRTOS.h"
#include "lwip/sockets.h"
#include "types.hpp"
internal constexpr char kTagUdpLogger[] = "UDP_LOG";
internal int s_udp_log_socket = -1;
internal struct sockaddr_in s_udp_dest_addr;
internal vprintf_like_t s_original_vprintf = NULL;
internal int udp_logging_vprintf(const char *fmt, va_list ap)
{
char buf[512];
va_list ap_copy;
va_copy(ap_copy, ap);
int len = vsnprintf(buf, sizeof(buf) - 1, fmt, ap_copy);
va_end(ap_copy);
if (len > 0)
{
if (len >= sizeof(buf))
{
len = sizeof(buf) - 1;
}
buf[len] = '\0';
if (s_udp_log_socket >= 0)
{
sendto(s_udp_log_socket, buf, len, 0, (struct sockaddr *)&s_udp_dest_addr,
sizeof(s_udp_dest_addr));
}
}
return s_original_vprintf(fmt, ap);
}
internal void start_udp_logging(int port)
{
s_udp_log_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
if (s_udp_log_socket < 0)
{
ESP_LOGE(kTagUdpLogger, "Unable to create socket: errno %d", errno);
return;
}
int opt_val = 1;
setsockopt(s_udp_log_socket, SOL_SOCKET, SO_BROADCAST, &opt_val,
sizeof(opt_val));
s_udp_dest_addr.sin_family = AF_INET;
s_udp_dest_addr.sin_port = htons(port);
#ifdef CONFIG_CALENDINK_UDP_LOG_TARGET_IP
if (strlen(CONFIG_CALENDINK_UDP_LOG_TARGET_IP) > 1)
{
s_udp_dest_addr.sin_addr.s_addr =
inet_addr(CONFIG_CALENDINK_UDP_LOG_TARGET_IP);
}
else
{
s_udp_dest_addr.sin_addr.s_addr = inet_addr("255.255.255.255");
}
#else
s_udp_dest_addr.sin_addr.s_addr = inet_addr("255.255.255.255");
#endif
s_original_vprintf = esp_log_set_vprintf(&udp_logging_vprintf);
ESP_LOGI(kTagUdpLogger, "UDP logging broadcast started on port %d", port);
}