修复了网络参数的保存逻辑

This commit is contained in:
2026-09-10 14:21:07 +08:00
parent 8e1fd3b2b8
commit ca1dc980d1
24 changed files with 1457 additions and 72 deletions
+16
View File
@@ -35,6 +35,8 @@ static uint8_t g_rx[64];
static int g_listen = -1;
static int g_client = -1;
static uint16_t g_port; /* 监听端口(网络重建后重监听用) */
static uint32_t g_gen; /* 建立监听时的网络代次号(变化 = 网络已重建) */
/*
* 函数功能:计算 RemoDispBus 数据段异或校验值
@@ -204,6 +206,7 @@ static void remo_handle(const uint8_t *f, int n)
*/
int ui_net_sink_start(uint16_t port)
{
g_port = port;
g_listen = net_socket(NET_AF_INET, NET_SOCK_STREAM);
if (g_listen < 0) {
return -1;
@@ -225,6 +228,7 @@ int ui_net_sink_start(uint16_t port)
return -1;
}
g_client = -1;
g_gen = net_get_generation(); /* 成功才记录代次;失败保持旧值以便下轮重试 */
return 0;
}
@@ -236,9 +240,21 @@ int ui_net_sink_start(uint16_t port)
* 函数说明:1. 无客户端时尝试接受连接(不主动上报 INIT,由客户端按需请求)
* 2. 有客户端时非阻塞收帧并解析
* 3. 连接关闭或异常时复位,等待重监听,不阻塞界面刷新
* 4. 网络重建(net_init 代次变化)时关闭旧监听并重建(IP 变更后自愈)
*/
void ui_net_sink_poll(void)
{
/* 网络重建(net_init 代次变化):旧监听/客户端已随芯片复位失效,重建监听 */
if (net_get_generation() != g_gen) {
if (g_listen >= 0) {
net_close(g_listen);
g_listen = -1;
}
g_client = -1;
(void)ui_net_sink_start(g_port); /* 失败则下轮再试(g_gen 未更新) */
return;
}
if (g_listen < 0) {
return;
}
+22 -10
View File
@@ -2,13 +2,14 @@
* 模块名称:UI Page Net Cfg (网口设置内容页)
* 模块功能:网口设置叶子节点的内容页数据 + 行为——5 行地址列表(IP 地址/子网
* 掩码/默认网关/MAC 地址 + 保存行,5 行每页共 1 页);
* 行槽顶 = 24+14i、选中白带 x=2..156 高 13、名 x=6 / 值 x=60;
* 行槽顶 = 24+14i、选中白带 x=2..156 高 13、名 x=4 / 值 x=54;
* 值取自 net_cfg RAM 副本(netTask 上电自 Flash 加载并回写实际 MAC);
* 编辑模式:ENTER 进选中地址行(字节光标 = 活动字节,反显标记),
* ↑↓调字节 0..255(环绕、值列实时刷新)、←→移字节光标(首↔末环绕)、
* ENTER 确认退出编辑;
* 权限:edit_capable=1——查看密码 → 只读(编辑/保存键无效),
* 修改密码 → 可编辑;保存行 ENTER → net_cfg_save()(下次上电生效);
* 修改密码 → 可编辑;保存行 ENTER → net_cfg_save() 写盘 +
* net_cfg_request_apply() 通知 netTask 立即重建网络(无需重启);
* 向框架 ui_content_page 提供页面描述符(零 LVGL 对象)
* 适用平台:STM32F407ZGTx / PC 模拟器(两端共用)
* 作者:王建锋
@@ -29,8 +30,9 @@
/*
* 布局常量(设备像素;1bpp 屏 160x160):
* 5 行共 1 页(行槽顶 y = 24+14i,末行止于 y=93,与页脚 y=143 无冲突);
* 名 x=6 / 值 x=60(值列须 ≥60:4 汉字名占 48px + 间隙;值列宽——
* IP/掩码/网关 11 ASCII 字符 = 66px 止于 126,MAC 12 hex 字符 = 72px 止于 132)
* 名 x=4 / 值 x=54(值列须 ≥54:4 汉字名占 48px + 间隙;值列宽——
* IP/掩码/网关 11 ASCII 字符 = 66px 止于 119,MAC 17 字符(冒号分隔)= 102px 止于 155,
* 均在选中白带 x=2..156 内)
*/
#define NC_ROW_COUNT 5u /* 4 地址行 + 1 保存行 */
#define NC_ADDR_ROW_MAX 4u /* 地址行范围 0..3(IP/掩码/网关/MAC) */
@@ -38,8 +40,8 @@
#define NC_TOP_Y 24 /* 首行槽顶 y */
#define NC_PITCH 14 /* 行距 */
#define NC_BAND_H 13 /* 选中白带高 */
#define NC_LEFT_X 6 /* 左列 x(名) */
#define NC_RIGHT_X 60 /* 右列 x(值) */
#define NC_LEFT_X 4 /* 左列 x(名) */
#define NC_RIGHT_X 54 /* 右列 x(值) */
#define NC_ROW_BUF_LEN 32u /* 行缓冲长度(与框架 CP_ROW_BUF_LEN 一致) */
/* 静态变量定义区 */
@@ -84,7 +86,7 @@ static uint8_t nc_octet_count(uint16_t row) {
* 返回值:无
* 限定条件:p_buf 非空
* 函数说明:IP/掩码/网关 = "192.168.001.100"(每段 3 位补零定长,字节 i 恒在
* 字符 4i 起);MAC = "A494B6123456"(无分隔 hex,字节 i 恒在字符 2i 起)
* 字符 4i 起);MAC = "A4:94:B6:12:34:56"(冒号分隔,字节 i 恒在字符 3i 起)
*/
static void nc_fmt_value(uint16_t row, char *p_buf) {
const net_cfg_t *cfg = net_cfg_get();
@@ -93,7 +95,7 @@ static void nc_fmt_value(uint16_t row, char *p_buf) {
uint8_t mac[6];
net_cfg_get_mac(mac);
(void)lv_snprintf(p_buf, NC_ROW_BUF_LEN, "%02X%02X%02X%02X%02X%02X",
(void)lv_snprintf(p_buf, NC_ROW_BUF_LEN, "%02X:%02X:%02X:%02X:%02X:%02X",
(unsigned)mac[0], (unsigned)mac[1], (unsigned)mac[2],
(unsigned)mac[3], (unsigned)mac[4], (unsigned)mac[5]);
return;
@@ -196,7 +198,7 @@ static void nc_draw_cb(lv_layer_t *layer, const lv_area_t *clip) {
}
nc_fmt_value(sel, value);
start = (uint32_t)s_cursor * ((sel == 3u) ? 2u : 4u);
start = (uint32_t)s_cursor * ((sel == 3u) ? 3u : 4u); /* 字节 i 字符偏移:IP/掩码/网关 4i,MAC 3i(冒号分隔) */
seg_len = (sel == 3u) ? 2u : 3u;
slot_y = NC_TOP_Y + (int32_t)sel * NC_PITCH;
@@ -223,10 +225,17 @@ static void nc_draw_cb(lv_layer_t *layer, const lv_area_t *clip) {
{
lv_draw_label_dsc_t ld;
char seg[4]; /* 段文本:IP/掩码/网关 3 字符、MAC 2 字符,+ '\0' */
/* 只绘制"段文本"本身:若传整串(value + start),LVGL 在未置 EXPAND 标志时
* 按 coords 宽度(此处为段宽)折行,会逐行向盒下方绘制、溢出到其它行/空白区。
* 传段文本(宽度 ≤ 盒宽)则单行绘制,恰好落在光标盒内。 */
memcpy(seg, value + start, seg_len);
seg[seg_len] = '\0';
lv_draw_label_dsc_init(&ld);
ld.base.layer = layer;
ld.text = value + start;
ld.text = seg;
ld.text_static = 0u; /* 栈缓冲(同帧有效) */
ld.color = lv_color_white();
ld.ofs_x = 1; /* box.x1 = x0-1,+1 = x0(与框架行文本原点一致) */
@@ -295,6 +304,9 @@ static bool nc_key_cb(lv_key_t key) {
}
if (sel == NC_SAVE_ROW) {
s_saved = (net_cfg_save() == 0) ? 1u : 2u;
if (s_saved == 1u) {
net_cfg_request_apply(); /* 立即应用:通知 netTask 重建网络(无需重启) */
}
ui_content_page_invalidate();
return true;
}