feat: 支持向桌面端发送音量和显示器亮度数据。

This commit is contained in:
Ivan Li 2023-05-06 20:08:45 +08:00
parent a3abff89c5
commit 6e95095db0
2 changed files with 104 additions and 55 deletions

View File

@ -15,3 +15,16 @@
| 起始位置 | 2 | 0~65535 | | 起始位置 | 2 | 0~65535 |
| 长度 | 2 | 0~65535 | | 长度 | 2 | 0~65535 |
| 颜色 | 3 | RGB 顺序,$2^3 * 2^3 * 2^3 = 65535$ 真彩色 | | 颜色 | 3 | RGB 顺序,$2^3 * 2^3 * 2^3 = 65535$ 真彩色 |
### 更新电脑显示器亮度
| 数据 | 长度(字节) | 说明 |
| --- | --- | --- |
| 显示器序号 | 1 | 0~255 |
| 亮度 | 1 | 0~255 |
### 更新电脑音量
| 数据 | 长度(字节) | 说明 |
| --- | --- | --- |
| 音量 | 1 | 0~255 |

View File

@ -24,6 +24,10 @@ static const char *UDP_SERVER_TAG = "UDP_SERVER";
static bool desktop_connected = false; static bool desktop_connected = false;
static uint64_t last_desktop_ping_at = 0; 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 { typedef struct desktop_value {
uint8_t value; uint8_t value;
@ -52,18 +56,15 @@ static void udp_server_task(void *pvParameters) {
char addr_str[128]; char addr_str[128];
int addr_family = (int)pvParameters; int addr_family = (int)pvParameters;
int ip_protocol = 0; int ip_protocol = 0;
struct sockaddr_in6 dest_addr; struct sockaddr_in dest_addr;
while (1) { while (1) {
if (addr_family == AF_INET) { dest_addr.sin_addr.s_addr = htonl(INADDR_ANY);
struct sockaddr_in *dest_addr_ip4 = (struct sockaddr_in *)&dest_addr; dest_addr.sin_family = AF_INET;
dest_addr_ip4->sin_addr.s_addr = htonl(INADDR_ANY); dest_addr.sin_port = htons(UDP_PORT);
dest_addr_ip4->sin_family = AF_INET; ip_protocol = IPPROTO_IP;
dest_addr_ip4->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) { if (sock < 0) {
ESP_LOGE(UDP_SERVER_TAG, "Unable to create socket: errno %d. sock: %d", ESP_LOGE(UDP_SERVER_TAG, "Unable to create socket: errno %d. sock: %d",
errno, sock); errno, sock);
@ -81,16 +82,19 @@ static void udp_server_task(void *pvParameters) {
if (err < 0) { if (err < 0) {
ESP_LOGE(UDP_SERVER_TAG, "Socket unable to bind: errno %d. sock: %d", ESP_LOGE(UDP_SERVER_TAG, "Socket unable to bind: errno %d. sock: %d",
errno, sock); errno, sock);
sock = -1;
vTaskDelay(1000 / portTICK_PERIOD_MS);
continue;
} }
ESP_LOGI(UDP_SERVER_TAG, "Socket bound, port %d", UDP_PORT); 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); socklen_t socklen = sizeof(source_addr);
while (1) { while (1) {
// ESP_LOGI(UDP_SERVER_TAG, "Waiting for data"); // ESP_LOGI(UDP_SERVER_TAG, "Waiting for data");
int len = recvfrom(sock, rx_buffer, sizeof(rx_buffer) - 1, 0, int len = recvfrom(sock, rx_buffer, sizeof(rx_buffer) - 1, 0,
(struct sockaddr *)&source_addr, &socklen); &source_addr, &socklen);
// Error occurred during receiving // Error occurred during receiving
if (len < 0) { if (len < 0) {
if (errno == EAGAIN) { if (errno == EAGAIN) {
@ -102,46 +106,32 @@ static void udp_server_task(void *pvParameters) {
// Data received // Data received
else { else {
// Get the sender's ip address as string // 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,
inet_ntoa_r(((struct sockaddr_in *)&source_addr)->sin_addr, addr_str, sizeof(addr_str) - 1);
sizeof(addr_str) - 1);
rx_buffer[len] = 0; // Null-terminate whatever we received and treat rx_buffer[len] = 0; // Null-terminate whatever we received and treat
// like a string... // like a string...
switch (rx_buffer[0]) { switch (rx_buffer[0]) {
case 1: case 1:
last_desktop_ping_at = esp_timer_get_time(); last_desktop_ping_at = esp_timer_get_time();
sendto(sock, rx_buffer, 1, 0, (struct sockaddr *)&source_addr, ESP_LOGD(UDP_SERVER_TAG, "Received ping from %s", addr_str);
sizeof(source_addr)); sendto(sock, rx_buffer, 1, 0, &source_addr, sizeof(source_addr));
break; desktop_addr = &source_addr;
break;
case 2:
set_display_ambient_light_colors( case 2:
((uint16_t)rx_buffer[1] << 8 | (uint16_t)rx_buffer[2]), set_display_ambient_light_colors(
(uint8_t *)&(rx_buffer[3]), len - 3); ((uint16_t)rx_buffer[1] << 8 | (uint16_t)rx_buffer[2]),
break; (uint8_t *)&(rx_buffer[3]), len - 3);
break;
default:
default:
ESP_LOGI(UDP_SERVER_TAG, "%s", rx_buffer);
break; ESP_LOGI(UDP_SERVER_TAG, "%s", rx_buffer);
}
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);
break; break;
}
} }
ESP_LOGD(UDP_SERVER_TAG, "Received %d bytes from %s:", len, addr_str);
} }
if (sock != -1 && len < 0) { 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) { static uint8_t change_display_brightness(uint8_t display_index, int8_t delta) {
switch (display_index) { if (desktop_addr == NULL) {
case 0: ESP_LOGW(UDP_SERVER_TAG, "No desktop connected");
uint8_t value = desktop_change_value(&display1_brightness, delta); return 0;
gui_change_display_brightness(display_index, value); }
return value;
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); gui_change_display_brightness(display_index, value);
return 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: default:
ESP_LOGE(UDP_SERVER_TAG, "Invalid display index: %d", display_index); ESP_LOGE(UDP_SERVER_TAG, "Invalid display index: %d", display_index);
return 0; return 0;
} }
} }
static uint8_t change_volume(int8_t delta) { 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); 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); gui_change_volume_level(value);
return value; return value;
} }