From 6e95095db0575e1eaf3607d54e899fc6360a45e7 Mon Sep 17 00:00:00 2001 From: Ivan Li Date: Sat, 6 May 2023 20:08:45 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=E5=90=91=E6=A1=8C?= =?UTF-8?q?=E9=9D=A2=E7=AB=AF=E5=8F=91=E9=80=81=E9=9F=B3=E9=87=8F=E5=92=8C?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E5=99=A8=E4=BA=AE=E5=BA=A6=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/udp.md | 13 +++++ main/desktop.c | 146 ++++++++++++++++++++++++++++++------------------- 2 files changed, 104 insertions(+), 55 deletions(-) diff --git a/docs/udp.md b/docs/udp.md index 58c23fd..f56f6d1 100644 --- a/docs/udp.md +++ b/docs/udp.md @@ -15,3 +15,16 @@ | 起始位置 | 2 | 0~65535 | | 长度 | 2 | 0~65535 | | 颜色 | 3 | RGB 顺序,$2^3 * 2^3 * 2^3 = 65535$ 真彩色 | + +### 更新电脑显示器亮度 + +| 数据 | 长度(字节) | 说明 | +| --- | --- | --- | +| 显示器序号 | 1 | 0~255 | +| 亮度 | 1 | 0~255 | + +### 更新电脑音量 + +| 数据 | 长度(字节) | 说明 | +| --- | --- | --- | +| 音量 | 1 | 0~255 | diff --git a/main/desktop.c b/main/desktop.c index f588af1..bf75fec 100644 --- a/main/desktop.c +++ b/main/desktop.c @@ -24,6 +24,10 @@ static const char *UDP_SERVER_TAG = "UDP_SERVER"; static bool desktop_connected = false; static uint64_t last_desktop_ping_at = 0; +static struct sockaddr *desktop_addr = NULL; + +static int sock = -1; +static uint8_t tx_buffer[128]; typedef struct desktop_value { uint8_t value; @@ -52,18 +56,15 @@ static void udp_server_task(void *pvParameters) { char addr_str[128]; int addr_family = (int)pvParameters; int ip_protocol = 0; - struct sockaddr_in6 dest_addr; + struct sockaddr_in dest_addr; while (1) { - if (addr_family == AF_INET) { - struct sockaddr_in *dest_addr_ip4 = (struct sockaddr_in *)&dest_addr; - dest_addr_ip4->sin_addr.s_addr = htonl(INADDR_ANY); - dest_addr_ip4->sin_family = AF_INET; - dest_addr_ip4->sin_port = htons(UDP_PORT); - ip_protocol = IPPROTO_IP; - } + dest_addr.sin_addr.s_addr = htonl(INADDR_ANY); + dest_addr.sin_family = AF_INET; + dest_addr.sin_port = htons(UDP_PORT); + ip_protocol = IPPROTO_IP; - int sock = socket(addr_family, SOCK_DGRAM, ip_protocol); + sock = socket(addr_family, SOCK_DGRAM, ip_protocol); if (sock < 0) { ESP_LOGE(UDP_SERVER_TAG, "Unable to create socket: errno %d. sock: %d", errno, sock); @@ -81,16 +82,19 @@ static void udp_server_task(void *pvParameters) { if (err < 0) { ESP_LOGE(UDP_SERVER_TAG, "Socket unable to bind: errno %d. sock: %d", errno, sock); + sock = -1; + vTaskDelay(1000 / portTICK_PERIOD_MS); + continue; } ESP_LOGI(UDP_SERVER_TAG, "Socket bound, port %d", UDP_PORT); - struct sockaddr_storage source_addr; // Large enough for both IPv4 or IPv6 + struct sockaddr source_addr; // Large enough for both IPv4 or IPv6 socklen_t socklen = sizeof(source_addr); while (1) { // ESP_LOGI(UDP_SERVER_TAG, "Waiting for data"); int len = recvfrom(sock, rx_buffer, sizeof(rx_buffer) - 1, 0, - (struct sockaddr *)&source_addr, &socklen); + &source_addr, &socklen); // Error occurred during receiving if (len < 0) { if (errno == EAGAIN) { @@ -102,46 +106,32 @@ static void udp_server_task(void *pvParameters) { // Data received else { // Get the sender's ip address as string - if (source_addr.ss_family == PF_INET) { - inet_ntoa_r(((struct sockaddr_in *)&source_addr)->sin_addr, addr_str, - sizeof(addr_str) - 1); + inet_ntoa_r(((struct sockaddr_in *)&source_addr)->sin_addr, addr_str, + sizeof(addr_str) - 1); - rx_buffer[len] = 0; // Null-terminate whatever we received and treat - // like a string... + rx_buffer[len] = 0; // Null-terminate whatever we received and treat + // like a string... - switch (rx_buffer[0]) { - case 1: - last_desktop_ping_at = esp_timer_get_time(); - sendto(sock, rx_buffer, 1, 0, (struct sockaddr *)&source_addr, - sizeof(source_addr)); - break; - - case 2: - set_display_ambient_light_colors( - ((uint16_t)rx_buffer[1] << 8 | (uint16_t)rx_buffer[2]), - (uint8_t *)&(rx_buffer[3]), len - 3); - break; - - default: - - ESP_LOGI(UDP_SERVER_TAG, "%s", rx_buffer); - break; - } - - int err = - sendto(sock, rx_buffer, len, 0, (struct sockaddr *)&source_addr, - sizeof(source_addr)); - if (err < 0) { - ESP_LOGI(UDP_SERVER_TAG, "Received %d bytes from %s:", len, - addr_str); - ESP_LOGE(UDP_SERVER_TAG, - "Error occurred during sending: errno %d. sock: %d", errno, - sock); - shutdown(sock, 0); - close(sock); + switch (rx_buffer[0]) { + case 1: + last_desktop_ping_at = esp_timer_get_time(); + ESP_LOGD(UDP_SERVER_TAG, "Received ping from %s", addr_str); + sendto(sock, rx_buffer, 1, 0, &source_addr, sizeof(source_addr)); + desktop_addr = &source_addr; + break; + + case 2: + set_display_ambient_light_colors( + ((uint16_t)rx_buffer[1] << 8 | (uint16_t)rx_buffer[2]), + (uint8_t *)&(rx_buffer[3]), len - 3); + break; + + default: + + ESP_LOGI(UDP_SERVER_TAG, "%s", rx_buffer); break; - } } + ESP_LOGD(UDP_SERVER_TAG, "Received %d bytes from %s:", len, addr_str); } if (sock != -1 && len < 0) { @@ -173,25 +163,71 @@ static uint8_t desktop_change_value(desktop_value_t *target, int8_t delta) { } static uint8_t change_display_brightness(uint8_t display_index, int8_t delta) { - switch (display_index) { - case 0: - uint8_t value = desktop_change_value(&display1_brightness, delta); - gui_change_display_brightness(display_index, value); - return value; + if (desktop_addr == NULL) { + ESP_LOGW(UDP_SERVER_TAG, "No desktop connected"); + return 0; + } + + switch (display_index) { + case 0: { + uint8_t value = desktop_change_value(&display1_brightness, delta); + + tx_buffer[0] = 3; + tx_buffer[1] = 0; + tx_buffer[2] = value; + int err = + sendto(sock, tx_buffer, 3, 0, desktop_addr, sizeof(*desktop_addr)); + if (err < 0) { + ESP_LOGE(UDP_SERVER_TAG, "Socket unable to send: errno %d. sock: %d", + errno, sock); + } - case 1: - return desktop_change_value(&display1_brightness, delta); gui_change_display_brightness(display_index, value); return value; + } + + case 1: { + uint8_t value = desktop_change_value(&display1_brightness, delta); + + tx_buffer[0] = 3; + tx_buffer[1] = 1; + tx_buffer[2] = value; + int err = + sendto(sock, tx_buffer, 3, 0, desktop_addr, sizeof(*desktop_addr)); + if (err < 0) { + ESP_LOGE(UDP_SERVER_TAG, "Socket unable to send: errno %d. sock: %d", + errno, sock); + } + + gui_change_display_brightness(display_index, value); + return value; + } default: ESP_LOGE(UDP_SERVER_TAG, "Invalid display index: %d", display_index); return 0; } } - static uint8_t change_volume(int8_t delta) { + if (desktop_addr == NULL) { + ESP_LOGW(UDP_SERVER_TAG, "No desktop connected"); + return 0; + } + uint8_t value = desktop_change_value(&computer_volume, delta); + + tx_buffer[0] = 4; + tx_buffer[1] = value; + int err = sendto(sock, tx_buffer, 2, 0, desktop_addr, sizeof(*desktop_addr)); + if (err < 0) { + char addr_str[128]; + inet_ntoa_r(((struct sockaddr_in *)desktop_addr)->sin_addr, addr_str, + sizeof(addr_str) - 1); + ESP_LOGI(UDP_SERVER_TAG, "addr: %s", addr_str); + ESP_LOGE(UDP_SERVER_TAG, "Socket unable to send: errno %d. sock: %d", errno, + sock); + } + gui_change_volume_level(value); return value; }