修改了菜单按键的逻辑,使菜单可以根据按键动态跳转,但是还没有实现对应的操作逻辑
This commit is contained in:
@@ -8,11 +8,10 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
|
||||
#include "remoteDisplay.h"
|
||||
#include "Drv/lcd.h"
|
||||
#include "TCP/tcp.h"
|
||||
|
||||
#include "Drv/key.h"
|
||||
#include "remoteDisplay.h"
|
||||
|
||||
/* RemoDispBus 协议常量(与 remo_disp_server.py 一致) */
|
||||
#define TAG_CLIENT 0xAAu
|
||||
@@ -81,7 +80,6 @@ static void handle_cmd_lcdmem(int client, const uint8_t* req_data, unsigned int
|
||||
{
|
||||
unsigned int start_addr = 0;
|
||||
|
||||
printf("handle_cmd_lcdmem\n");
|
||||
if (req_len >= 4)
|
||||
start_addr = ((unsigned int)req_data[0] << 24) | ((unsigned int)req_data[1] << 16)
|
||||
| ((unsigned int)req_data[2] << 8) | req_data[3];
|
||||
@@ -94,11 +92,14 @@ static void handle_cmd_lcdmem(int client, const uint8_t* req_data, unsigned int
|
||||
payload[3] = start_addr & 0xFF;
|
||||
|
||||
unsigned int copy_len = LCD_DISPLAYMEMORYSIZE;
|
||||
if (start_addr < LCD_DISPLAYMEMORYSIZE) {
|
||||
if (start_addr < LCD_DISPLAYMEMORYSIZE)
|
||||
{
|
||||
unsigned int offset = start_addr;
|
||||
copy_len = LCD_DISPLAYMEMORYSIZE - offset;
|
||||
memcpy(payload + 4, g_tCVsr.pwbyLCDMemory + offset, copy_len);
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
copy_len = 0;
|
||||
}
|
||||
send_reply(client, CMD_LCDMEM, payload, 4 + copy_len);
|
||||
@@ -122,9 +123,11 @@ static void handle_cmd_init(int client)
|
||||
/* 处理 CMD_KEY:可选转交菜单,此处仅回 ACK */
|
||||
static void handle_cmd_key(int client, const uint8_t* data, unsigned int len)
|
||||
{
|
||||
(void)data;
|
||||
(void)len;
|
||||
send_reply(client, CMD_KEY, (const uint8_t*)NULL, 0);
|
||||
#ifdef DEBUG
|
||||
printf("handle_cmd_key: 0x%02X\n", data[0]);
|
||||
#endif
|
||||
g_tRemoteKey.byKeyValid = EN_KEY_FLAG_NEW;
|
||||
g_tRemoteKey.byKeyValue = data[0];
|
||||
}
|
||||
|
||||
/* 处理 CMD_KEEPLIVE:保活,回空 */
|
||||
@@ -145,14 +148,15 @@ void tcp_server_thread_fn(void* arg)
|
||||
printf("[TCP Server] RemoDispBus 监听端口 %d,等待客户端连接...\n", ctx->port);
|
||||
|
||||
#define REMO_BUF_SIZE 4096
|
||||
uint8_t recv_buf[REMO_BUF_SIZE];
|
||||
uint8_t recv_buf[4096];
|
||||
unsigned int recv_len = 0;
|
||||
|
||||
/* ========== 外层循环:主线程未请求退出时,持续等待并接受新客户端 ========== */
|
||||
while (!*ctx->p_quit) {
|
||||
/* 阻塞等待一个客户端连接;主线程关闭 server_sock 时 Accept 会失败并返回 INVALID */
|
||||
int client = TcpServer_Accept(server_sock);
|
||||
if (client == TCP_INVALID_SOCKET) {
|
||||
if (client == TCP_INVALID_SOCKET)
|
||||
{
|
||||
if (*ctx->p_quit)
|
||||
break;
|
||||
continue;
|
||||
@@ -161,13 +165,16 @@ void tcp_server_thread_fn(void* arg)
|
||||
recv_len = 0; /* 新连接对应新的接收缓冲区,避免混用上一连接的残留数据 */
|
||||
|
||||
/* ========== 内层循环:处理当前连接上的 RemoDispBus 请求,直到断开或退出 ========== */
|
||||
while (!*ctx->p_quit) {
|
||||
while (!*ctx->p_quit)
|
||||
{
|
||||
/* ----- 1. 若缓冲区中已有一条完整且校验通过的帧,则解析并分发处理 ----- */
|
||||
uint8_t cmd;
|
||||
const uint8_t* pdata;
|
||||
unsigned int data_len, consume;
|
||||
if (parse_frame(recv_buf, recv_len, &cmd, &pdata, &data_len, &consume)) {
|
||||
switch (cmd) {
|
||||
if (parse_frame(recv_buf, recv_len, &cmd, &pdata, &data_len, &consume))
|
||||
{
|
||||
switch (cmd)
|
||||
{
|
||||
case CMD_KEEPLIVE:
|
||||
handle_cmd_keeplive(client);
|
||||
break;
|
||||
@@ -191,14 +198,17 @@ void tcp_server_thread_fn(void* arg)
|
||||
}
|
||||
|
||||
/* ----- 2. 缓冲区中尚无完整帧:先防止溢出,再收一批数据 ----- */
|
||||
if (recv_len >= REMO_BUF_SIZE - 256) {
|
||||
if (recv_len >= REMO_BUF_SIZE - 256)
|
||||
{
|
||||
recv_len = 0; /* 异常情况:数据过多且始终不成帧,清空缓冲区防止越界 */
|
||||
}
|
||||
int n = TcpClient_Recv(client, (char*)(recv_buf + recv_len), REMO_BUF_SIZE - recv_len - 1);
|
||||
if (n > 0) {
|
||||
if (n > 0)
|
||||
{
|
||||
recv_len += (unsigned int)n;
|
||||
printf("recv_len = %d\n", recv_len);
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
/* n==0 表示对方正常关闭连接,n<0 表示读取出错;均退出本连接循环 */
|
||||
printf("[TCP Server] 客户端关闭连接\n");
|
||||
break;
|
||||
@@ -212,3 +222,27 @@ void tcp_server_thread_fn(void* arg)
|
||||
*ctx->p_server_sock = TCP_INVALID_SOCKET;
|
||||
printf("[TCP Server] 已退出\n");
|
||||
}
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 启动 TCP 服务与服务器线程(Tcp_Init + 创建线程 + 短暂等待就绪)
|
||||
* port: 监听端口(如 7070)
|
||||
* out_server_sock: 输出监听 socket,供主线程退出时 TcpServer_Close
|
||||
* out_server_quit: 输出退出标志,主线程置 1 通知服务器线程退出
|
||||
* out_server_th: 输出线程句柄,供主线程 Thread_Join
|
||||
* 返回:0 成功,1 失败(已调用 Tcp_Cleanup)
|
||||
* ---------------------------------------------------------------------------- */
|
||||
int StartTcpServerThread(thread_handle_t *out_server_th, server_thread_arg_t *io_server_arg)
|
||||
{
|
||||
if (Tcp_Init() != 0) {
|
||||
fprintf(stderr, "Tcp_Init failed\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (Thread_Create(tcp_server_thread_fn, io_server_arg, out_server_th) != 0) {
|
||||
fprintf(stderr, "Thread_Create(server) failed\n");
|
||||
Tcp_Cleanup();
|
||||
return 1;
|
||||
}
|
||||
Sleep(200);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user