/* * 模块名称:SNTP 配置核心 (SNTP Configuration Core) * 模块功能:RAM 配置副本 + 工厂默认 + cfg_file 引擎注册(INI [sntp] 段: * enable/server1/server2/poll_min);加载/保存编排复用 [network] * 段的既有链路(net_cfg_load/save + UI 保存行请求链),本模块 * 只做"段描述符 + 只读出口" * 适用平台:STM32F407ZGTx / PC 模拟器(两端共用) * 作者:王建锋 * 创建日期:2026-11-04 * 修改记录: * v1.0 2026-11-04 王建锋 创建初始版本(SNTP 客户端接入,#57 调研结论: * 出厂默认关闭、服务器 IPv4 字面量、周期 1~1440 分钟) */ /* 头文件包含区 */ #include #include "sntp_cfg.h" #include "cfg_file.h" /* 静态变量定义区 */ /* RAM 配置副本:以工厂默认值静态初始化(落 .data),自启动即有效—— * 不依赖 cfg_file_load 是否成功(与 net_cfg s_cfg 同一口径) */ static sntp_cfg_t s_cfg = { .enable = SNTP_CFG_DEF_ENABLE, .server_pri = SNTP_CFG_DEF_SERVER, .server_bak = SNTP_CFG_DEF_SERVER, .poll_min = SNTP_CFG_DEF_POLL_MIN, }; /* 工厂默认(引擎注册 p_defaults 指向;与 s_cfg 初值共用宏单一来源) */ static const sntp_cfg_t s_defaults = { .enable = SNTP_CFG_DEF_ENABLE, .server_pri = SNTP_CFG_DEF_SERVER, .server_bak = SNTP_CFG_DEF_SERVER, .poll_min = SNTP_CFG_DEF_POLL_MIN, }; /* [sntp] 段键表(sntp_cfg_t 布局内偏移) */ static const cfg_key_def_t s_sntp_keys[] = { { "enable", CFG_VAL_UINT, offsetof(sntp_cfg_t, enable), 1u }, { "server1", CFG_VAL_IP4, offsetof(sntp_cfg_t, server_pri), 4u }, { "server2", CFG_VAL_IP4, offsetof(sntp_cfg_t, server_bak), 4u }, { "poll_min", CFG_VAL_UINT, offsetof(sntp_cfg_t, poll_min), 2u }, }; /* 函数定义区 */ /* * 函数功能:向 cfg_file 引擎注册 [sntp] 段(幂等) * 入口参数:无 * 返回值:无 * 限定条件:load/save 前调用(net_cfg_load 内统一编排) * 函数说明:段数据 = s_cfg RAM 副本;工厂默认 = s_defaults;无变更回调—— * SNTP 客户端每轮直接读 RAM 副本,配置保存后的"立即生效"由 * 既有 SYS_EVT_NET_RECONFIG(网络重建 → 代次变化 → 客户端重开 * Socket)自然达成,无需本模块单独挂接 */ void sntp_cfg_register(void) { static uint8_t s_done; cfg_section_reg_t reg; if (s_done != 0u) { return; } (void)memset(®, 0, sizeof(reg)); reg.name = "sntp"; reg.p_data = &s_cfg; reg.p_defaults = &s_defaults; reg.data_size = sizeof(sntp_cfg_t); reg.p_keys = s_sntp_keys; reg.key_count = 4u; reg.p_cb = NULL; (void)cfg_file_register(®); s_done = 1u; } /* * 函数功能:取 [sntp] 段 RAM 副本(只读) * 入口参数:无 * 返回值:RAM 配置副本指针(恒非空) const sntp_cfg_t * * 限定条件:无 */ const sntp_cfg_t *sntp_cfg_get(void) { return &s_cfg; } /* * 函数功能:更新 RAM 副本(不写盘) * 入口参数:p_new - 新配置(NULL 忽略) const sntp_cfg_t * * 返回值:无 * 限定条件:UI 编辑路径(net_cfg_set 同口径:整结构体一次拷贝, * 写盘走 net_cfg_save_request 整档链,属主 defaultTask) */ void sntp_cfg_set(const sntp_cfg_t *p_new) { if (p_new != NULL) { (void)memcpy(&s_cfg, p_new, sizeof(s_cfg)); } } /* * 函数功能:取轮询周期(带外自愈读出口) * 入口参数:无 * 返回值:合法范围内 = 存储值;0 或 >1440 = 工厂默认 60 uint16_t * 限定条件:无 */ uint16_t sntp_cfg_poll_min(void) { uint16_t v = s_cfg.poll_min; if ((v < SNTP_CFG_POLL_MIN_MIN) || (v > SNTP_CFG_POLL_MIN_MAX)) { return SNTP_CFG_DEF_POLL_MIN; } return v; }