Files
STM32F4-Base/Drivers/BSP/NETCFG/net_cfg.h
T
wandering1 7efa58d9a1
CI / 静态门禁 (pre-commit) (push) Failing after 25s
CI / 主机侧单测 (MSVC) (push) Successful in 48s
network: 台架 IP 迁到 192.168.31.100,并把重复写死的值收进单一真源
分两段(用户裁定 2026-11-02):先做地址迁移,再把同类字面量收敛成
单一真源,以后再改地址只动一处。

一、IP 迁移 192.168.1.100 → 192.168.31.100(gw 同步 → .31.1)
- 工厂默认:Drivers/BSP/NETCFG/net_cfg.c 的 NET_CFG_DEF_IP/_GW
- 注释/文档示例、主机与板级测试、台架 py 脚本、两份 sim_config.ini
- 字节序教学点同步换算 hex:0x6401A8C0 → 0x641FA8C0(内存
  C0 A8 1F 64),旧版示例引文与历史 Trap 记录按冻结纪律不动
- UI 黄金基准:网口设置 4 态 + shot_info 共 5 张 .bin 由
  check_content_pages.py --update 重刷(渲染值 IP 变了,属预期变更)
- 保留判定:客户点表引用(IEC104/继电保护规划)、芯片手册摘录、
  日期冻结的变更记录行、已退役台架档案 MDK-ARM/retracted_bench_*

二、单一真源收口(A+B+C+D,用户批准全做)
- 新建 test/host/bench_defaults.py:台架 py 默认值唯一定义点
  (DEVICE_IP/DEVICE_GW/PC_IP/NET_BCAST),22 个脚本改为引用;
  MDK-ARM 两探针与 scripts/board_ui_nav.py 经 sys.path shim 引入
- test/board/net_test_task.h 新增 TEST_PC_PEER_IP,板测三处
  PHASE*_REMOTE_IP 改引该宏(保留 -D 覆盖);Phase1 断言改
  memcmp 数组比较,数组各只出现一次
- simulator/tests/check_content_pages.py 从 net_cfg.c 正则解析
  NET_CFG_DEF_* 推导期望值(解析失败即报错、不静默兜底),
  脚本内台架 IP 字面量清零
- 装饰性注释去具体值(net_cfg.h/net_socket.h/net_socket.c/
  net_socket_sim.c);字节序教学 hex 对刻意保留为唯一写值点
- 刻意不动:主机单测夹具 IP(逐文件钉住的任意值是正确测试
  实践)、文档正文 IP(那是文档内容本身)

顺带:scripts/gen_task_table.py 规范串清掉「,B5」——编号清退提交
72b4b094 改了受管区没重跑生成器,task-table 门禁因此一直红

验证:产品 @build 0/0;CH395F 套件开关构建 0/0 后还原产品态;
6 套主机单测 rc=0;content_pages(含宏推导路径)/菜单 8 态/
推流位比对全 PASS;bom-drift 99 无漂移;doc-links/coding-standard/
cppcheck 绿;py_compile 23 文件 + --help 冒烟(含 shim 绝对路径)
2026-11-02 14:46:42 +08:00

219 lines
9.3 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* 模块名称:Network Configuration (NET CFG)
* 模块功能:网络参数配置(IP/掩码/网关/MAC)——双端共享核心:RAM 配置副本 +
* 工厂默认 + 加载/保存编排 + 实际 MAC 影子 + 跨任务保存请求交接;
* 存储经 cfg_file 通用配置文件引擎(INI [network] 段:ip/mask/gw/mac;
* MCU = NAND 上 /config.ini,模拟器 = sim_config.ini);MAC 全零哨兵
* = 不覆盖芯片内置 MAC。cfg_file 引擎为静态单任务设计,调用收敛于
* 单一属主任务(MCU = defaultTask:就绪屏障前加载 / 保存执行 / 2s
* poll;模拟器 = 主循环);UI 保存只投递请求,netTask 只读 RAM 副本
* 函数说明:旧版 NCFG 二进制格式(magic+ver+CRC-16+18B 字段)的迁移路径
* (net_cfg_legacy)**已于 2026-10-10 删除** → 旧档 /cfg/netcfg.bin
* 不再读取/迁移,携带旧档的设备升级后回落工厂默认(理由见 net_cfg.c v1.3)
* 适用平台:STM32F407ZGTx / PC 模拟器(两端共用)
* 作者:王建锋
* 创建日期:2026-09-10
* 修改记录:
* v1.0 2026-09-10 王建锋 创建初始版本
* v1.1 2026-09-14 王建锋 存储迁移至 cfg_file 引擎(INI [network] 段)
* v1.2 2026-09-15 王建锋 保存改跨任务交接(request/state/run + 通知回调);
* 引擎属主明确为 defaultTask(竞态修复)
*/
#ifndef NET_CFG_H
#define NET_CFG_H
#include <stdint.h>
#include <stddef.h>
#ifdef __cplusplus
extern "C" {
#endif
/*
* 网络参数配置(RAM 副本)
* mac 全零哨兵:不设置芯片 MAC(用芯片内置值,存于芯片 EEPROM)
*/
typedef struct {
uint8_t ip[4]; /* IP 地址(工厂默认 = net_cfg.c 的 NET_CFG_DEF_IP) */
uint8_t mask[4]; /* 子网掩码(工厂默认 = net_cfg.c 的 NET_CFG_DEF_MASK) */
uint8_t gw[4]; /* 默认网关(工厂默认 = net_cfg.c 的 NET_CFG_DEF_GW) */
uint8_t mac[6]; /* MAC 地址(全零 = 芯片内置 MAC) */
} net_cfg_t;
/*
* 函数功能:从存储加载网络配置到 RAM 副本
* 入口参数:无
* 返回值:恒 0(RAM 恒有效:文件缺失/损坏回退工厂默认) int
* 限定条件:由配置引擎属主任务调用(MCU = defaultTask,置位
* SYS_EVT_STORAGE_READY 前;模拟器 = 主循环启动期);文件读失败
* 自动回退工厂默认(不阻塞网络启动)
* 函数说明: 1. 注册 [network] 段(幂等)
* 2. 文件缺失 → 先迁旧档 NCFG(有效 → 旧值物化进新文件),否则
* 生成出厂模板
* 3. 解析文件:有效键 → RAM 副本;无效/缺失键 → 工厂默认并留痕
* 4. 严重错误 → RAM 副本 = 工厂默认(不让坏配置带崩网络)
*/
int net_cfg_load(void);
/*
* 函数功能:保存当前 RAM 配置到存储(Flash 持久化)
* 入口参数:无
* 返回值:0 - 成功;-1 - 写失败 int
* 限定条件:仅配置引擎属主任务上下文调用(MCU = defaultTask;模拟器 = 主循环);
* 跨任务保存请用 net_cfg_save_request 投递
* 函数说明:经 cfg_file 引擎写盘(外科手术式保存:保留注释/未知内容,
* 临时文件 + 原子改名);属主任务执行,成功后触发"立即应用"
*/
int net_cfg_save(void);
/*
* "立即应用"回调类型:平台挂钩(可选)
* 入口参数:无
* 返回值:无
* 函数说明:MCU 端由 netTask 注册——置 SYS_EVT_NET_RECONFIG 事件,由 netTask
* 重建网络;模拟器无网络栈,不注册(空操作)。经回调而非直接调用,
* 避免 NETCFG(驱动层)反向依赖 App 层。
*/
typedef void (*net_cfg_apply_cb_t)(void);
/*
* 函数功能:注册"立即应用"回调
* 入口参数:cb - 回调函数(NULL = 注销) net_cfg_apply_cb_t
* 返回值:无
* 限定条件:应用启动早期注册一次即可
* 函数说明:见 net_cfg_apply_cb_t
*/
void net_cfg_set_apply_cb(net_cfg_apply_cb_t cb);
/*
* 函数功能:请求立即应用当前 RAM 配置
* 入口参数:无
* 返回值:无
* 限定条件:无(未注册回调时空操作)
* 函数说明:保存写盘成功后由属主任务调用(MCU:defaultTask);真正生效
* 由平台回调完成(MCU:netTask 重建网络,无需重启)
*/
void net_cfg_request_apply(void);
/*
* 保存请求交接状态(UI 保存行显示)
* IDLE - 尚无保存(显示 ENTER)
* WAIT - 保存进行中:请求已投递未执行 / 属主任务写盘中(显示 WAIT)
* OK - 最近一次保存成功(显示 OK)
* FAIL - 最近一次保存失败(显示 ERR)
*/
#define NET_CFG_SAVE_ST_IDLE 0u
#define NET_CFG_SAVE_ST_WAIT 1u
#define NET_CFG_SAVE_ST_OK 2u
#define NET_CFG_SAVE_ST_FAIL 3u
/*
* 函数功能:投递"保存网络配置"请求(跨任务交接的投递端)
* 入口参数:无
* 返回值:恒 0 int
* 限定条件:任意任务上下文(UI 保存行);新值须已落 RAM 副本(net_cfg_set)
* 函数说明:只置"待保存"标志 + 经平台回调唤醒属主任务(MCU:置
* SYS_EVT_CFG_SAVE 事件);写盘与"立即应用"由属主任务执行
* (net_cfg_save_run),UI 不直接触碰配置文件引擎
*/
int net_cfg_save_request(void);
/*
* 函数功能:取保存请求交接状态(供 UI 保存行显示)
* 入口参数:无
* 返回值:NET_CFG_SAVE_ST_IDLE / _WAIT / _OK / _FAIL int
* 限定条件:任意任务上下文(单字节读取,无撕裂)
*/
int net_cfg_save_state(void);
/*
* 函数功能:执行待处理的保存请求(配置文件引擎属主任务)
* 入口参数:无
* 返回值:0 - 无待处理请求或保存成功;-1 - 写盘失败 int
* 限定条件:仅配置引擎属主任务上下文(MCU = defaultTask;模拟器 = 主循环)
* 函数说明:有待处理请求 → 先清标志(写盘期间的新请求重位置位,下轮再
* 执行,不丢失)→ net_cfg_save() 写盘 → 成功置 OK 并触发"立即
* 应用"(netTask 重建网络);失败置 FAIL(不触发应用,网络保持
* 原配置)
*/
int net_cfg_save_run(void);
/*
* "保存请求"通知回调类型:平台挂钩(可选)
* 入口参数:无
* 返回值:无
* 函数说明:MCU 端由 defaultTask 注册——置 SYS_EVT_CFG_SAVE 事件立即唤醒
* 属主任务执行写盘;模拟器单线程无需唤醒,不注册(空操作)。
* 经回调而非直接调用,避免 NETCFG(驱动层)反向依赖 App 层。
*/
typedef void (*net_cfg_save_req_cb_t)(void);
/*
* 函数功能:注册"保存请求"通知回调
* 入口参数:cb - 回调函数(NULL = 注销) net_cfg_save_req_cb_t
* 返回值:无
* 限定条件:应用启动早期注册一次即可
* 函数说明:见 net_cfg_save_req_cb_t
*/
void net_cfg_set_save_req_cb(net_cfg_save_req_cb_t cb);
/*
* 函数功能:取 RAM 配置副本(只读指针)
* 入口参数:无
* 返回值:RAM 配置副本指针(恒非空) const net_cfg_t *
* 限定条件:无
* 函数说明:netTask(启动期读取组网)与 UI 页(显示/编辑)共用
*/
const net_cfg_t *net_cfg_get(void);
/*
* 函数功能:更新 RAM 配置副本(不写盘)
* 入口参数:p_cfg - 新配置指针(不可为 NULL) const net_cfg_t *
* 返回值:无
* 限定条件:p_cfg 非空;写盘须另行调 net_cfg_save
* 函数说明:UI 编辑页调整字段后经此落 RAM 副本
*/
void net_cfg_set(const net_cfg_t *p_cfg);
/*
* 函数功能:回写芯片实际 MAC(影子区,供 UI 显示)
* 入口参数:p_mac - 芯片读回的实际 MAC(不可为 NULL) const uint8_t *
* 返回值:无
* 限定条件:net_init 成功后由 netTask 上下文调用
* 函数说明:CH395F SPI 归 netTask 独占(中断/轮询集中处理);UI 页不可直接
* 调 SPI 读命令,故 netTask 初始化后读回实际 MAC 存于此供
* "网口设置"页显示(存储 MAC 全零时显示芯片内置 MAC)
*/
void net_cfg_set_active_mac(const uint8_t *p_mac);
/*
* 函数功能:取显示用 MAC
* 入口参数:p_out - 6 字节输出缓冲(不可为 NULL) uint8_t *
* 返回值:无
* 限定条件:p_out 非空
* 函数说明:存储 MAC 非全零 → 存储值;否则芯片实际(已回写时);
* 否则全零(网络未初始化/芯片内置未知)
*/
void net_cfg_get_mac(uint8_t *p_out);
/*
* 函数功能:4 字节 IPv4 格式化为点分十进制字符串(每段 3 位补零)
* 入口参数:p_ip - 4 字节 IP(不可为 NULL) const uint8_t *
* p_buf - 输出缓冲(不可为 NULL) char *
* len - 缓冲长度 size_t
* 返回值:无
* 限定条件:p_ip/p_buf 非空;len ≥ 16(输出 15 字符 + '\0')
* 函数说明:"192.168.001.100"——每段 3 位补零使字符串定长,UI 编辑光标
* 可按固定偏移(4i/3i 起始)定位字节;net_init 的 parse_ip_string
* 对前导零兼容(十进制逐段解析)
*/
void net_cfg_fmt_ipv4(const uint8_t *p_ip, char *p_buf, size_t len);
#ifdef __cplusplus
}
#endif
#endif /* NET_CFG_H */