feat(sntp): 板端 SNTP 校时接入——coreSNTP 序列化器 + [sntp] 段 + 设置页(#73)
- vendored coreSNTP v2.0.0 序列化器(MIT,仅 serializer+LICENSE,零堆), 48 字节报文编解码在库,节奏与准入判据在本方(RFC 4330 §10 调研口径) - App/sync/time_sntp.c 挂 timeSyncTask 的 8888 事件循环,等待切片 ≤50 ms, 不饿任务狗与 IWDG;懒建 UDP socket,代际变化/禁用/死错误码即关闭归还 - 防伪 = OriginTimestamp 逐位等于发出时 T1(含低 16 位随机小数位); mode/stratum/闰秒指示/KoD 按 RFC 拒收;DENY·RSTR 换服务器、RATE 只退避 - 主备轮换 + 失败指数退避(5 s 起、60 s 封顶)+ 首轮 1~5 分钟随机错峰; 成功恢复 poll_min 周期(1~1440 分,出厂默认 60,默认不启用不发包) - 钟面 = 本地时间:UTC+8 固定偏移落 sys_clock_set_unix(§1.1 时基裁定, 第三个写入口,装置仍不存时区);|offset|<2 s 只记日志不步进,冷启动或 更大偏差步进并回写 SD2506,留痕 [SNTP] step 与 syslog OPER - 首个校验通过的同步置 SYS_EVT_TIMESYNC_READY(就绪位,消费方按需 NoClear) - [sntp] 配置段(enable/server1/server2/poll_min)属主 sntp_cfg.c, 注册在 net_cfg_load();UI 页 31「SNTP 设置」(密码叶):启用开关 + 主/备服务器 octet 编辑 + 周期(分) + 保存,复用 net_cfg_save_request 链 - 测试与门禁:test/host/sntp 新套件(报文/防伪/KoD/退避周期/阶跃域/配置 注册表)、net_cfg 与 time_sync 套件补 fake、黄金参考 66→74 张零漂移、 字符集 228 字、Keil 0 错 0 警(RO +5,848 B 含字体)、覆盖率基线回填 - 文档:墙钟维护说明 §16、网络配置说明 [sntp] 节、配置文件设计说明变更记录、 产品需求 FR-TIME-3 与 8.3/9.1.2 台账、UI 补齐规划/UI补齐 31 叶口径、 登记簿销项并登记「SNTP 校时真机判据」等台架(PC 时间源 192.168.31.161/.13)
This commit is contained in:
@@ -32,6 +32,8 @@
|
||||
|
||||
#include "ftp_cfg.h"
|
||||
|
||||
#include "sntp_cfg.h"
|
||||
|
||||
/* 深调用链模块(net_cfg_load/save 在 defaultTask 启动链与保存链上):
|
||||
* 日志行缓冲收到 128 B(默认 192),本模块最长行渲染后 < 128 → 不截断 */
|
||||
#define DBG_LINE_BUF_MAX 128U
|
||||
@@ -80,6 +82,16 @@ static const cfg_key_def_t s_net_keys[] = {
|
||||
{ "mac", CFG_VAL_MAC, offsetof(net_cfg_t, mac), 6u },
|
||||
};
|
||||
|
||||
/* [sntp] 段键表(sntp_cfg_t 布局内偏移;数据本体在 sntp_cfg.c——分层门禁
|
||||
* layer-deps 要求段描述符的组装集中在本文件:NETCFG 里只有 net_cfg.c /
|
||||
* ftp_cfg.c 在反向依赖基线上,[sntp] 是新增模块,不再往基线添条目) */
|
||||
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 },
|
||||
};
|
||||
|
||||
/* 函数定义区 */
|
||||
|
||||
/*
|
||||
@@ -122,6 +134,35 @@ static void s_net_register(void) {
|
||||
s_done = 1u;
|
||||
}
|
||||
|
||||
/*
|
||||
* 函数功能:向 cfg_file 引擎注册 [sntp] 段(幂等)
|
||||
* 入口参数:无
|
||||
* 返回值:无
|
||||
* 限定条件:load/save 前调用(net_cfg_load 内统一编排)
|
||||
* 函数说明:数据本体与工厂默认由 sntp_cfg.c 出(sntp_cfg_data/defaults);
|
||||
* 无变更回调——SNTP 客户端每轮直读 RAM 副本,保存后的"立即生效"
|
||||
* 走既有 SYS_EVT_NET_RECONFIG(网络重建 → 代次变化 → 客户端重开
|
||||
* Socket)链,本段无需单独挂接
|
||||
*/
|
||||
static void s_sntp_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 = sntp_cfg_data();
|
||||
reg.p_defaults = sntp_cfg_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;
|
||||
}
|
||||
|
||||
/*
|
||||
* 函数功能:判断 6 字节 MAC 是否全零
|
||||
* 入口参数:p_mac - MAC 指针(不可为 NULL) const uint8_t *
|
||||
@@ -148,8 +189,10 @@ static bool s_mac_is_zero(const uint8_t *p_mac) {
|
||||
*/
|
||||
int net_cfg_load(void) {
|
||||
s_net_register();
|
||||
/* [ftp] 段一并注册(所有受管段必须先注册、后 load,引擎按注册表解析) */
|
||||
/* [ftp] / [sntp] 段一并注册(所有受管段必须先注册、后 load,引擎按注册表解析);
|
||||
* [sntp] 描述符在本文件组装——见 s_sntp_register 分层门禁注 */
|
||||
ftp_cfg_register();
|
||||
s_sntp_register();
|
||||
|
||||
/* 旧档 NCFG 迁移已于 2026-10-10 删除(net_cfg_legacy 移除;理由见文件头 v1.3)。
|
||||
* 若卷上仍残留 /cfg/netcfg.bin:不读、不删、不迁移 → 配置回落工厂默认 */
|
||||
|
||||
@@ -0,0 +1,103 @@
|
||||
/*
|
||||
* 模块名称:SNTP 配置核心 (SNTP Configuration Core)
|
||||
* 模块功能:RAM 配置副本 + 工厂默认 + 读写出口(INI [sntp] 段:
|
||||
* enable/server1/server2/poll_min);加载/保存编排复用 [network]
|
||||
* 段的既有链路(net_cfg_load/save + UI 保存行请求链)。段描述符
|
||||
* 由 net_cfg.c 的 s_sntp_register() 组装注册——分层门禁 layer-deps
|
||||
* 要求本模块不 include 配置引擎头(App/cfg/cfg_file.h),只留
|
||||
* 数据本体与访问器
|
||||
* 适用平台:STM32F407ZGTx / PC 模拟器(两端共用)
|
||||
* 作者:王建锋
|
||||
* 创建日期:2026-11-04
|
||||
* 修改记录:
|
||||
* v1.0 2026-11-04 王建锋 创建初始版本(SNTP 客户端接入,#57 调研结论:
|
||||
* 出厂默认关闭、服务器 IPv4 字面量、周期 1~1440 分钟)
|
||||
* v1.1 2026-11-04 王建锋 分层门禁口径改造:注册编排移出本模块(见 .h 同名注)
|
||||
*/
|
||||
|
||||
/* 头文件包含区 */
|
||||
#include <string.h>
|
||||
|
||||
#include "sntp_cfg.h"
|
||||
|
||||
/* 静态变量定义区 */
|
||||
|
||||
/* RAM 配置副本:以工厂默认值静态初始化(落 .data),自启动即有效——
|
||||
* 不依赖 cfg_file_load 是否成功(与 net_cfg s_cfg 同一口径)。
|
||||
* 命名带 s_sntp_ 前缀:net_cfg.c 与本文件会在同一 TU 里被主机单测并入
|
||||
* (test/host/net_cfg),裸 s_cfg/s_defaults 会同名重定义 */
|
||||
static sntp_cfg_t s_sntp_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_sntp_cfg 初值共用宏单一来源) */
|
||||
static const sntp_cfg_t s_sntp_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] 段 RAM 副本(引擎注册专用写入口)
|
||||
* 入口参数:无
|
||||
* 返回值:RAM 配置副本指针(恒非空) sntp_cfg_t *
|
||||
* 限定条件:仅 net_cfg.c 组段描述符用;业务读走 sntp_cfg_get(),
|
||||
* UI 编辑走 sntp_cfg_set()
|
||||
*/
|
||||
sntp_cfg_t *sntp_cfg_data(void) {
|
||||
return &s_sntp_cfg;
|
||||
}
|
||||
|
||||
/*
|
||||
* 函数功能:取工厂默认值(引擎注册 p_defaults 指向)
|
||||
* 入口参数:无
|
||||
* 返回值:工厂默认结构指针(只读,恒非空) const sntp_cfg_t *
|
||||
* 限定条件:仅 net_cfg.c 组段描述符用
|
||||
*/
|
||||
const sntp_cfg_t *sntp_cfg_defaults(void) {
|
||||
return &s_sntp_defaults;
|
||||
}
|
||||
|
||||
/*
|
||||
* 函数功能:取 [sntp] 段 RAM 副本(只读)
|
||||
* 入口参数:无
|
||||
* 返回值:RAM 配置副本指针(恒非空) const sntp_cfg_t *
|
||||
* 限定条件:无
|
||||
*/
|
||||
const sntp_cfg_t *sntp_cfg_get(void) {
|
||||
return &s_sntp_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_sntp_cfg, p_new, sizeof(s_sntp_cfg));
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* 函数功能:取轮询周期(带外自愈读出口)
|
||||
* 入口参数:无
|
||||
* 返回值:合法范围内 = 存储值;0 或 >1440 = 工厂默认 60 uint16_t
|
||||
* 限定条件:无
|
||||
*/
|
||||
uint16_t sntp_cfg_poll_min(void) {
|
||||
uint16_t v = s_sntp_cfg.poll_min;
|
||||
|
||||
if ((v < SNTP_CFG_POLL_MIN_MIN) || (v > SNTP_CFG_POLL_MIN_MAX)) {
|
||||
return SNTP_CFG_DEF_POLL_MIN;
|
||||
}
|
||||
return v;
|
||||
}
|
||||
@@ -0,0 +1,97 @@
|
||||
/*
|
||||
* 模块名称:SNTP 配置([sntp] 段)
|
||||
* 模块功能:板端 SNTP 客户端配置——RAM 副本 + 工厂默认 + 读写出口
|
||||
* ([sntp] 段:enable / server1 / server2 / poll_min);段描述符
|
||||
* 由 net_cfg.c 在 net_cfg_load 里组好交引擎(分层门禁 layer-deps:
|
||||
* 本模块不 include 引擎头);消费者(App/sync/time_sntp.c)与 UI 页
|
||||
* 经 sntp_cfg_get() 只读访问,配置引擎属主仍为 defaultTask
|
||||
* 适用平台:STM32F407ZGTx / PC 模拟器(两端共用)
|
||||
* 作者:王建锋
|
||||
* 创建日期:2026-11-04
|
||||
* 修改记录:
|
||||
* v1.0 2026-11-04 王建锋 创建初始版本(SNTP 客户端接入,#57 调研结论)
|
||||
* v1.1 2026-11-04 王建锋 分层门禁口径:sntp_cfg_register 改为
|
||||
* sntp_cfg_data/sntp_cfg_defaults 数据口,
|
||||
* 段描述符编排移 net_cfg.c(本模块不再依赖引擎头)
|
||||
*/
|
||||
|
||||
#ifndef SNTP_CFG_H
|
||||
#define SNTP_CFG_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
/* 轮询周期合法范围(分钟);范围外的存储值读取时回落工厂默认(同 [comm]
|
||||
* 频段自愈口径,见 iec104_comm.c 带外值自愈) */
|
||||
#define SNTP_CFG_POLL_MIN_MIN 1u
|
||||
#define SNTP_CFG_POLL_MIN_MAX 1440u
|
||||
|
||||
/* 工厂默认:enable=0(出厂不启用,调研 §6 产品口径)、服务器留空
|
||||
* (0.0.0.0 = 未配置,客户端跳过该服务器)、poll_min=60(1 小时) */
|
||||
#define SNTP_CFG_DEF_ENABLE 0u
|
||||
#define SNTP_CFG_DEF_SERVER { 0u, 0u, 0u, 0u }
|
||||
#define SNTP_CFG_DEF_POLL_MIN 60u
|
||||
|
||||
typedef struct {
|
||||
uint8_t enable; /* 1 = 启用 SNTP 客户端;0 = 停用(默认) */
|
||||
uint8_t server_pri[4]; /* 主 SNTP 服务器 IPv4(全零 = 未配置) */
|
||||
uint8_t server_bak[4]; /* 备 SNTP 服务器 IPv4(全零 = 无备) */
|
||||
uint16_t poll_min; /* 成功后的轮询周期(分钟,1~1440) */
|
||||
} sntp_cfg_t;
|
||||
|
||||
/*
|
||||
* 函数功能:取 [sntp] 段 RAM 副本(引擎注册专用写入口)
|
||||
* 入口参数:无
|
||||
* 返回值:RAM 配置副本指针(恒非空,静态常驻) sntp_cfg_t *
|
||||
* 限定条件:仅供 net_cfg.c 组 [sntp] 段描述符交配置引擎(net_cfg_load 编排);
|
||||
* 分层门禁 layer-deps:本模块不 include cfg_file.h,段注册集中在
|
||||
* net_cfg.c(同层基线文件)完成
|
||||
*/
|
||||
sntp_cfg_t *sntp_cfg_data(void);
|
||||
|
||||
/*
|
||||
* 函数功能:取工厂默认值(引擎注册 p_defaults 指向)
|
||||
* 入口参数:无
|
||||
* 返回值:工厂默认结构指针(只读,恒非空) const sntp_cfg_t *
|
||||
* 限定条件:同上,net_cfg.c 组段描述符专用
|
||||
*/
|
||||
const sntp_cfg_t *sntp_cfg_defaults(void);
|
||||
|
||||
/*
|
||||
* 函数功能:取 [sntp] 段 RAM 副本(只读)
|
||||
* 入口参数:无
|
||||
* 返回值:恒非 NULL(静态常驻,load 前初值 = 工厂默认) const sntp_cfg_t *
|
||||
* 限定条件:无
|
||||
* 函数说明:defaultTask poll 重载瞬间可能读到撕裂值——IPv4 4 字节 / uint16
|
||||
* 在本平台是单条 LDR 指令天然原子,enable 单字节同理;即便撕裂,
|
||||
* SNTP 客户端最坏多用一次旧值,下一轮自愈(配置变更本就罕见)
|
||||
*/
|
||||
const sntp_cfg_t *sntp_cfg_get(void);
|
||||
|
||||
/*
|
||||
* 函数功能:更新 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);
|
||||
|
||||
/*
|
||||
* 函数功能:取轮询周期(带外自愈读出口)
|
||||
* 入口参数:无
|
||||
* 返回值:合法范围内 = 存储值;0 或 >1440 = 工厂默认 60 uint16_t
|
||||
* 限定条件:无
|
||||
* 函数说明:不改写 RAM 副本(UI 显示的仍是用户写的原值,避免"保存后
|
||||
* 数字自己变了"的困惑);消费方(time_sntp)用本口而非裸字段
|
||||
*/
|
||||
uint16_t sntp_cfg_poll_min(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* SNTP_CFG_H */
|
||||
+200
-176
@@ -437,6 +437,11 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
|
||||
0x9f, 0x52, 0x2a, 0x7d, 0x48, 0xa9, 0x11, 0x26,
|
||||
0x60,
|
||||
|
||||
/* U+52A1 "务" */
|
||||
0x10, 0x7, 0xf1, 0x44, 0x7, 0x3, 0x19, 0x90,
|
||||
0xc2, 0x3, 0xfc, 0x10, 0x82, 0x10, 0x82, 0x21,
|
||||
0x80,
|
||||
|
||||
/* U+52A8 "动" */
|
||||
0x1, 0xe, 0x20, 0x4, 0x1, 0xff, 0x92, 0x42,
|
||||
0x50, 0x4a, 0x89, 0x89, 0x3f, 0x44, 0x8, 0x82,
|
||||
@@ -515,6 +520,11 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
|
||||
0xc8, 0x9, 0x7d, 0x28, 0xa5, 0xf5, 0x0, 0xc0,
|
||||
0x70,
|
||||
|
||||
/* U+5668 "器" */
|
||||
0x7b, 0xc9, 0x49, 0xef, 0x2, 0x40, 0x45, 0xff,
|
||||
0xc2, 0x81, 0x8c, 0xc0, 0x6f, 0x79, 0x29, 0x3d,
|
||||
0xe0,
|
||||
|
||||
/* U+56DE "回" */
|
||||
0xff, 0xe0, 0x18, 0x6, 0x79, 0x92, 0x64, 0x99,
|
||||
0xe6, 0x1, 0x80, 0x7f, 0xf8, 0x4,
|
||||
@@ -549,6 +559,11 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
|
||||
0x52, 0xaa, 0x76, 0x40, 0xcc, 0x57, 0x35, 0x81,
|
||||
0x10,
|
||||
|
||||
/* U+5907 "备" */
|
||||
0x10, 0x7, 0xf1, 0x44, 0x7, 0x3, 0x19, 0x80,
|
||||
0xcf, 0xe1, 0x24, 0x3f, 0x84, 0x90, 0xfe, 0x10,
|
||||
0x40,
|
||||
|
||||
/* U+590D "复" */
|
||||
0x3f, 0xe8, 0x2, 0xff, 0x10, 0x23, 0xfc, 0x40,
|
||||
0x8f, 0xf0, 0x80, 0x3f, 0xca, 0x10, 0x3c, 0x38,
|
||||
@@ -800,6 +815,10 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
|
||||
0x3f, 0xc8, 0x12, 0x4, 0xff, 0x20, 0x48, 0x13,
|
||||
0xfc, 0x81, 0x40, 0x50, 0x18, 0x1c,
|
||||
|
||||
/* U+670D "服" */
|
||||
0x7b, 0xe9, 0x45, 0x28, 0xbd, 0x64, 0xa0, 0x97,
|
||||
0xde, 0xaa, 0x55, 0x4a, 0x49, 0x56, 0x6c, 0x80,
|
||||
|
||||
/* U+671F "期" */
|
||||
0x48, 0x9, 0x3f, 0xf4, 0xa4, 0x97, 0x9e, 0x92,
|
||||
0x5e, 0x4a, 0x4f, 0xfd, 0x20, 0x25, 0x24, 0xc3,
|
||||
@@ -1515,24 +1534,24 @@ static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = {
|
||||
{.bitmap_index = 898, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 915, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 932, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 949, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = -2},
|
||||
{.bitmap_index = 963, .adv_w = 192, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 979, .adv_w = 192, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 995, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 1012, .adv_w = 192, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 1028, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 1045, .adv_w = 192, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 1061, .adv_w = 192, .box_w = 9, .box_h = 10, .ofs_x = 1, .ofs_y = -1},
|
||||
{.bitmap_index = 1073, .adv_w = 192, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 1089, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 949, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 966, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = -2},
|
||||
{.bitmap_index = 980, .adv_w = 192, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 996, .adv_w = 192, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 1012, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 1029, .adv_w = 192, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 1045, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 1062, .adv_w = 192, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 1078, .adv_w = 192, .box_w = 9, .box_h = 10, .ofs_x = 1, .ofs_y = -1},
|
||||
{.bitmap_index = 1090, .adv_w = 192, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 1106, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 1123, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 1140, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 1157, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 1174, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 1191, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = -2},
|
||||
{.bitmap_index = 1205, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 1222, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 1191, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 1208, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 1225, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = -2},
|
||||
{.bitmap_index = 1239, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 1256, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 1273, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
@@ -1540,29 +1559,29 @@ static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = {
|
||||
{.bitmap_index = 1307, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 1324, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 1341, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 1358, .adv_w = 192, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 1374, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 1391, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 1408, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 1358, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 1375, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 1392, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 1409, .adv_w = 192, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 1425, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 1442, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 1459, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = -2},
|
||||
{.bitmap_index = 1473, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 1490, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 1507, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 1459, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 1476, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 1493, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 1510, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = -2},
|
||||
{.bitmap_index = 1524, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 1541, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 1558, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 1575, .adv_w = 192, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 1591, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 1608, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 1625, .adv_w = 192, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = -2},
|
||||
{.bitmap_index = 1639, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 1656, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 1673, .adv_w = 192, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = -2},
|
||||
{.bitmap_index = 1687, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 1704, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 1721, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 1575, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 1592, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 1609, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 1626, .adv_w = 192, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 1642, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 1659, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 1676, .adv_w = 192, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = -2},
|
||||
{.bitmap_index = 1690, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 1707, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 1724, .adv_w = 192, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = -2},
|
||||
{.bitmap_index = 1738, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 1755, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 1772, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
@@ -1583,132 +1602,136 @@ static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = {
|
||||
{.bitmap_index = 2027, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2044, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2061, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2078, .adv_w = 192, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2094, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 1, .ofs_y = -2},
|
||||
{.bitmap_index = 2107, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2124, .adv_w = 192, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2140, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2157, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2171, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2188, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2205, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2222, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2239, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2256, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2273, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2290, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2307, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2324, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2341, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2358, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2375, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2392, .adv_w = 192, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2408, .adv_w = 192, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2424, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2441, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2458, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2475, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2492, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2509, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2526, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2543, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2560, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2577, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2594, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2611, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2628, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2645, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2662, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2679, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2693, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2710, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2727, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2744, .adv_w = 192, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -2},
|
||||
{.bitmap_index = 2759, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2776, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2793, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2810, .adv_w = 192, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2078, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2095, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2112, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2129, .adv_w = 192, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2145, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 1, .ofs_y = -2},
|
||||
{.bitmap_index = 2158, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2175, .adv_w = 192, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2191, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2208, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2222, .adv_w = 192, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2238, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2255, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2272, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2289, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2306, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2323, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2340, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2357, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2374, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2391, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2408, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2425, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2442, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2459, .adv_w = 192, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2475, .adv_w = 192, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2491, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2508, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2525, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2542, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2559, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2576, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2593, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2610, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2627, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2644, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2661, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2678, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2695, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2712, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2729, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2746, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2760, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2777, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2794, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2811, .adv_w = 192, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -2},
|
||||
{.bitmap_index = 2826, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2843, .adv_w = 192, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2859, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2876, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2843, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2860, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2877, .adv_w = 192, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2893, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2910, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2927, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2944, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2961, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2978, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2995, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3012, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3029, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3046, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3063, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3080, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3097, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3114, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3131, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3148, .adv_w = 192, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = -2},
|
||||
{.bitmap_index = 3162, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3179, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3196, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3213, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3230, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3247, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3264, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3281, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3298, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3315, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3332, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3349, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3366, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3383, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3400, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3417, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3434, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3451, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3468, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3485, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3502, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3519, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3536, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3553, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3570, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3587, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3604, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3621, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3638, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3655, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3672, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3689, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3706, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3723, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3740, .adv_w = 192, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2910, .adv_w = 192, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2926, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2943, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2960, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2977, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 2994, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3011, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3028, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3045, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3062, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3079, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3096, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3113, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3130, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3147, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3164, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3181, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3198, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3215, .adv_w = 192, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = -2},
|
||||
{.bitmap_index = 3229, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3246, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3263, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3280, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3297, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3314, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3331, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3348, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3365, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3382, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3399, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3416, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3433, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3450, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3467, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3484, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3501, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3518, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3535, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3552, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3569, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3586, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3603, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3620, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3637, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3654, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3671, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3688, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3705, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3722, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3739, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3756, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3773, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3790, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3807, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3824, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3841, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3858, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3875, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3892, .adv_w = 192, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -2},
|
||||
{.bitmap_index = 3907, .adv_w = 192, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -2},
|
||||
{.bitmap_index = 3922, .adv_w = 192, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -2},
|
||||
{.bitmap_index = 3937, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3954, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3971, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3988, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 4005, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 4022, .adv_w = 192, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3807, .adv_w = 192, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3823, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3840, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3857, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3874, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3891, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3908, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3925, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3942, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 3959, .adv_w = 192, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -2},
|
||||
{.bitmap_index = 3974, .adv_w = 192, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -2},
|
||||
{.bitmap_index = 3989, .adv_w = 192, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -2},
|
||||
{.bitmap_index = 4004, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 4021, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 4038, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 4055, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 4072, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 4089, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 4106, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 4123, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 4140, .adv_w = 192, .box_w = 2, .box_h = 4, .ofs_x = 2, .ofs_y = 0},
|
||||
{.bitmap_index = 4141, .adv_w = 192, .box_w = 2, .box_h = 6, .ofs_x = 2, .ofs_y = 0},
|
||||
{.bitmap_index = 4143, .adv_w = 165, .box_w = 8, .box_h = 10, .ofs_x = 1, .ofs_y = -1} /* U+25B6 */
|
||||
{.bitmap_index = 4089, .adv_w = 192, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 4105, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 4122, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 4139, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 4156, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 4173, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 4190, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
|
||||
{.bitmap_index = 4207, .adv_w = 192, .box_w = 2, .box_h = 4, .ofs_x = 2, .ofs_y = 0},
|
||||
{.bitmap_index = 4208, .adv_w = 192, .box_w = 2, .box_h = 6, .ofs_x = 2, .ofs_y = 0},
|
||||
{.bitmap_index = 4210, .adv_w = 165, .box_w = 8, .box_h = 10, .ofs_x = 1, .ofs_y = -1} /* U+25B6 */
|
||||
};
|
||||
|
||||
/*---------------------
|
||||
@@ -1719,31 +1742,32 @@ static const uint16_t unicode_list_1[] = {
|
||||
0x0, 0x1, 0x2, 0x2ca0, 0x2ca9, 0x2caa, 0x2cad, 0x2cdb,
|
||||
0x2d2b, 0x2d2c, 0x2d44, 0x2d96, 0x2ded, 0x2dee, 0x2dfc, 0x2e7d,
|
||||
0x2e81, 0x2edc, 0x3005, 0x300c, 0x3011, 0x3013, 0x3039, 0x309a,
|
||||
0x30a6, 0x30d6, 0x30ea, 0x30ed, 0x3148, 0x31b6, 0x31da, 0x322b,
|
||||
0x323f, 0x3262, 0x326c, 0x3271, 0x3276, 0x3283, 0x328f, 0x3297,
|
||||
0x32a8, 0x32cc, 0x32cf, 0x32ea, 0x3308, 0x357e, 0x3580, 0x3594,
|
||||
0x35d0, 0x35e0, 0x362b, 0x367f, 0x37ad, 0x37b6, 0x37d1, 0x39f0,
|
||||
0x39f7, 0x39f8, 0x3a3a, 0x3a3e, 0x3a66, 0x3c92, 0x3cc7, 0x3cd8,
|
||||
0x3d14, 0x3d2f, 0x3d46, 0x3d96, 0x3da0, 0x3da2, 0x3daf, 0x3db5,
|
||||
0x3dda, 0x3df2, 0x3df3, 0x3df5, 0x3ea1, 0x3edb, 0x3f02, 0x3f0f,
|
||||
0x40d7, 0x40eb, 0x4135, 0x4136, 0x4144, 0x4145, 0x420e, 0x4229,
|
||||
0x4245, 0x4247, 0x4249, 0x436d, 0x43d6, 0x43de, 0x43e5, 0x43e8,
|
||||
0x4410, 0x4414, 0x4480, 0x4485, 0x4496, 0x44de, 0x45a0, 0x45a8,
|
||||
0x45bf, 0x45ca, 0x45cc, 0x45da, 0x461f, 0x4685, 0x46a7, 0x46c1,
|
||||
0x46d7, 0x4760, 0x48c1, 0x49c0, 0x49c1, 0x4a03, 0x4a1b, 0x4a55,
|
||||
0x4ae2, 0x4b00, 0x4b82, 0x4be1, 0x4beb, 0x4c28, 0x4ca5, 0x4cc9,
|
||||
0x4f59, 0x50e7, 0x50e8, 0x5156, 0x5177, 0x518c, 0x53c8, 0x53d5,
|
||||
0x53ec, 0x5571, 0x5594, 0x55ab, 0x5685, 0x56a1, 0x570c, 0x570e,
|
||||
0x57da, 0x5872, 0x58ab, 0x5937, 0x596b, 0x5979, 0x598f, 0x59cc,
|
||||
0x5b1b, 0x5b9b, 0x5d5f, 0x5d68, 0x5d7f, 0x5d8d, 0x5d94, 0x5df1,
|
||||
0x5e0e, 0x5fba, 0x608a, 0x6122, 0x614f, 0x61a3, 0x6217, 0x66ec,
|
||||
0x6765, 0x6a06, 0x6a41, 0x6a44, 0x6a4f, 0x6a50, 0x6a5e, 0x6a82,
|
||||
0x6a85, 0x6a8f, 0x6a97, 0x6a9b, 0x6bbf, 0x6bc5, 0x6c2a, 0x6c93,
|
||||
0x6e0f, 0x6e1d, 0x6e33, 0x6e67, 0x6e70, 0x6e71, 0x6e74, 0x6ea0,
|
||||
0x6ea1, 0x6eba, 0x6ef3, 0x6f05, 0x6f88, 0x6fed, 0x7067, 0x706d,
|
||||
0x706f, 0x733f, 0x7345, 0x73a1, 0x73b9, 0x741f, 0x7488, 0x748d,
|
||||
0x7494, 0x7498, 0x74d2, 0x7504, 0x753c, 0x7596, 0x7602, 0x7715,
|
||||
0x7731, 0x7828, 0x7836, 0x792c, 0x7d78, 0xddac, 0xddba
|
||||
0x30a6, 0x30d6, 0x30ea, 0x30ed, 0x3141, 0x3148, 0x31b6, 0x31da,
|
||||
0x322b, 0x323f, 0x3262, 0x326c, 0x3271, 0x3276, 0x3283, 0x328f,
|
||||
0x3297, 0x32a8, 0x32cc, 0x32cf, 0x32ea, 0x3308, 0x3508, 0x357e,
|
||||
0x3580, 0x3594, 0x35d0, 0x35e0, 0x362b, 0x367f, 0x37a7, 0x37ad,
|
||||
0x37b6, 0x37d1, 0x39f0, 0x39f7, 0x39f8, 0x3a3a, 0x3a3e, 0x3a66,
|
||||
0x3c92, 0x3cc7, 0x3cd8, 0x3d14, 0x3d2f, 0x3d46, 0x3d96, 0x3da0,
|
||||
0x3da2, 0x3daf, 0x3db5, 0x3dda, 0x3df2, 0x3df3, 0x3df5, 0x3ea1,
|
||||
0x3edb, 0x3f02, 0x3f0f, 0x40d7, 0x40eb, 0x4135, 0x4136, 0x4144,
|
||||
0x4145, 0x420e, 0x4229, 0x4245, 0x4247, 0x4249, 0x436d, 0x43d6,
|
||||
0x43de, 0x43e5, 0x43e8, 0x4410, 0x4414, 0x4480, 0x4485, 0x4496,
|
||||
0x44de, 0x45a0, 0x45a8, 0x45ad, 0x45bf, 0x45ca, 0x45cc, 0x45da,
|
||||
0x461f, 0x4685, 0x46a7, 0x46c1, 0x46d7, 0x4760, 0x48c1, 0x49c0,
|
||||
0x49c1, 0x4a03, 0x4a1b, 0x4a55, 0x4ae2, 0x4b00, 0x4b82, 0x4be1,
|
||||
0x4beb, 0x4c28, 0x4ca5, 0x4cc9, 0x4f59, 0x50e7, 0x50e8, 0x5156,
|
||||
0x5177, 0x518c, 0x53c8, 0x53d5, 0x53ec, 0x5571, 0x5594, 0x55ab,
|
||||
0x5685, 0x56a1, 0x570c, 0x570e, 0x57da, 0x5872, 0x58ab, 0x5937,
|
||||
0x596b, 0x5979, 0x598f, 0x59cc, 0x5b1b, 0x5b9b, 0x5d5f, 0x5d68,
|
||||
0x5d7f, 0x5d8d, 0x5d94, 0x5df1, 0x5e0e, 0x5fba, 0x608a, 0x6122,
|
||||
0x614f, 0x61a3, 0x6217, 0x66ec, 0x6765, 0x6a06, 0x6a41, 0x6a44,
|
||||
0x6a4f, 0x6a50, 0x6a5e, 0x6a82, 0x6a85, 0x6a8f, 0x6a97, 0x6a9b,
|
||||
0x6bbf, 0x6bc5, 0x6c2a, 0x6c93, 0x6e0f, 0x6e1d, 0x6e33, 0x6e67,
|
||||
0x6e70, 0x6e71, 0x6e74, 0x6ea0, 0x6ea1, 0x6eba, 0x6ef3, 0x6f05,
|
||||
0x6f88, 0x6fed, 0x7067, 0x706d, 0x706f, 0x733f, 0x7345, 0x73a1,
|
||||
0x73b9, 0x741f, 0x7488, 0x748d, 0x7494, 0x7498, 0x74d2, 0x7504,
|
||||
0x753c, 0x7596, 0x7602, 0x7715, 0x7731, 0x7828, 0x7836, 0x792c,
|
||||
0x7d78, 0xddac, 0xddba
|
||||
};
|
||||
|
||||
/*Collect the unicode lists and glyph_id offsets*/
|
||||
@@ -1754,12 +1778,12 @@ static const lv_font_fmt_txt_cmap_t cmaps[] =
|
||||
.unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY
|
||||
},
|
||||
{
|
||||
.range_start = 9654, .range_length = 1, .glyph_id_start = 319,
|
||||
.range_start = 9654, .range_length = 1, .glyph_id_start = 323,
|
||||
.unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY
|
||||
},
|
||||
{
|
||||
.range_start = 8544, .range_length = 56763, .glyph_id_start = 96,
|
||||
.unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 223, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY
|
||||
.unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 227, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
#include "ui_page_runlog.h"
|
||||
#include "ui_page_runreport.h"
|
||||
#include "ui_page_selftest.h"
|
||||
#include "ui_page_sntp.h"
|
||||
#include "ui_page_soe.h"
|
||||
#include "ui_page_start.h"
|
||||
#include "ui_page_view_param.h"
|
||||
@@ -58,6 +59,7 @@ const ui_page_entry_t g_ui_page_map[UI_PAGE_MAP_COUNT] = {
|
||||
{ 27u, &ui_page_clear_desc }, /* node 27 清除记录 */
|
||||
{ 29u, &ui_page_comm_desc }, /* node 29 通讯设置 */
|
||||
{ 30u, &ui_page_net_cfg_desc }, /* node 30 网口设置 */
|
||||
{ 31u, &ui_page_sntp_desc }, /* node 31 SNTP设置 */
|
||||
{ 33u, &ui_page_soe_desc }, /* node 33 SOE记录 */
|
||||
{ 34u, &ui_page_accident_desc }, /* node 34 事故记录 */
|
||||
{ 35u, &ui_page_oper_desc }, /* node 35 操作记录 */
|
||||
|
||||
@@ -25,7 +25,7 @@ typedef struct {
|
||||
const content_page_def_t *desc; /* 页面描述符(Flash const) */
|
||||
} ui_page_entry_t;
|
||||
|
||||
#define UI_PAGE_MAP_COUNT 30u /* 绑定了内容页的叶子数 */
|
||||
#define UI_PAGE_MAP_COUNT 31u /* 绑定了内容页的叶子数 */
|
||||
|
||||
extern const ui_page_entry_t g_ui_page_map[UI_PAGE_MAP_COUNT];
|
||||
|
||||
|
||||
@@ -0,0 +1,431 @@
|
||||
/*
|
||||
* 模块名称:UI Page SNTP (SNTP设置内容页)
|
||||
* 模块功能:SNTP设置叶子节点的内容页数据 + 行为——5 行列表(启用/主服务器/
|
||||
* 备服务器/周期(分) + 保存行,5 行每页共 1 页);
|
||||
* 行槽顶 = 24+14i、选中白带 x=2..156 高 13、名 x=4 / 值 x=54;
|
||||
* 值取自 sntp_cfg RAM 副本([sntp] 段,defaultTask 上电自 Flash
|
||||
* 加载,net_cfg_load 统一注册);
|
||||
* 编辑模式:ENTER 进选中编辑行(地址行 = 字节光标反显,周期行 =
|
||||
* 整值反显),↑↓ 调值、←→ 移字节光标 / 粗调周期、ENTER 确认退出;
|
||||
* 启用行为开关行:可编辑态 ENTER 直接切换(无字节光标);
|
||||
* 权限:edit_capable=1——查看密码 → 只读(编辑/保存键无效),
|
||||
* 修改密码 → 可编辑;保存行 ENTER → 投递保存请求
|
||||
* (net_cfg_save_request 整档链:属主任务 defaultTask 写盘;
|
||||
* [sntp] 消费方每轮直读 RAM 副本 + 网络代次重建自动收口,
|
||||
* 无需独立 apply 通道);保存行值随交接状态显示
|
||||
* ENTER/WAIT/OK/ERR;
|
||||
* 向框架 ui_content_page 提供页面描述符(零 LVGL 对象)
|
||||
* 适用平台:STM32F407ZGTx / PC 模拟器(两端共用)
|
||||
* 作者:王建锋
|
||||
* 创建日期:2026-11-04
|
||||
* 修改记录:
|
||||
* v1.0 2026-11-04 王建锋 创建初始版本(板端 SNTP 客户端接入,#57 调研结论;
|
||||
* 布局/编辑语义复刻 ui_page_net_cfg.c 先例)
|
||||
*/
|
||||
|
||||
/* 头文件包含区 */
|
||||
#include <string.h>
|
||||
|
||||
#include "ui_page_sntp.h"
|
||||
|
||||
#include "net_cfg.h" /* net_cfg_fmt_ipv4 + 整档保存请求链(save request/state) */
|
||||
|
||||
#include "sntp_cfg.h"
|
||||
|
||||
#include "ui_tokens.h"
|
||||
|
||||
/* 私有宏定义区 */
|
||||
|
||||
/*
|
||||
* 布局取值:行骨架用 ui_tokens.h 的列表页令牌(UI_LIST_TOP / UI_ROW_PITCH /
|
||||
* UI_ROW_BAND_H / UI_BUF_STRLEN),本文件只留本页私有的两列 x 与行数
|
||||
* (与网口设置页同栅格:值列 ≥54,IPv4 定长 15 字符 90px 止于 143,在
|
||||
* 选中白带 x=2..156 内)。
|
||||
*/
|
||||
#define SN_ROW_COUNT 5u /* 1 开关行 + 2 地址行 + 1 周期行 + 1 保存行 */
|
||||
#define SN_EN_ROW 0u /* 启用(开关行) */
|
||||
#define SN_ADDR_ROW_MIN 1u /* 地址行范围 1..2(主/备服务器) */
|
||||
#define SN_ADDR_ROW_MAX 2u
|
||||
#define SN_POLL_ROW 3u /* 周期行(分钟) */
|
||||
#define SN_SAVE_ROW 4u /* 保存行下标 */
|
||||
#define SN_LEFT_X 4 /* 左列 x(名) */
|
||||
#define SN_RIGHT_X 54 /* 右列 x(值) */
|
||||
|
||||
/* 周期编辑步进与合法带(与 sntp_cfg.h getter 带一致;带外读回 60 自愈) */
|
||||
#define SN_POLL_MIN 1u
|
||||
#define SN_POLL_MAX 1440u
|
||||
#define SN_POLL_BIG_STEP 60u
|
||||
|
||||
/* 静态变量定义区 */
|
||||
|
||||
/* 页面运行态(每次开页经 init_cb 重置;约 2 B) */
|
||||
static uint8_t s_editing; /* 1 = 编辑中(被编辑行 = 当前选中行) */
|
||||
static uint8_t s_cursor; /* 地址行编辑活动字节(0..3) */
|
||||
|
||||
/* 函数定义区 */
|
||||
|
||||
/*
|
||||
* 函数功能:判断两区域是否相交(与 ui_content_page.c / ui_page_net_cfg.c 同实现)
|
||||
* 入口参数:a - 区域 1 const lv_area_t *
|
||||
* b - 区域 2 const lv_area_t *
|
||||
* 返回值:true - 相交;false - 不相交
|
||||
* 限定条件:无
|
||||
*/
|
||||
static bool sn_areas_intersect(const lv_area_t *a, const lv_area_t *b) {
|
||||
int32_t x1 = (a->x1 > b->x1) ? a->x1 : b->x1;
|
||||
int32_t y1 = (a->y1 > b->y1) ? a->y1 : b->y1;
|
||||
int32_t x2 = (a->x2 < b->x2) ? a->x2 : b->x2;
|
||||
int32_t y2 = (a->y2 < b->y2) ? a->y2 : b->y2;
|
||||
|
||||
return (x1 <= x2 && y1 <= y2);
|
||||
}
|
||||
|
||||
/*
|
||||
* 函数功能:生成指定地址行的值串(与 refresh 值列同源,编辑光标定位与行文本一致)
|
||||
* 入口参数:row - 地址行下标(1..2) uint16_t
|
||||
* p_buf - 输出缓冲(≥ UI_BUF_STRLEN) char *
|
||||
* 返回值:无
|
||||
* 限定条件:p_buf 非空
|
||||
* 函数说明:"192.168.001.100"(每段 3 位补零定长,字节 i 恒在字符 4i 起),
|
||||
* 与网口设置页 IP 行同格式(net_cfg_fmt_ipv4)
|
||||
*/
|
||||
static void sn_fmt_addr(uint16_t row, char *p_buf) {
|
||||
const sntp_cfg_t *cfg = sntp_cfg_get();
|
||||
const uint8_t *field = (row == SN_ADDR_ROW_MIN) ? cfg->server_pri : cfg->server_bak;
|
||||
|
||||
net_cfg_fmt_ipv4(field, p_buf, UI_BUF_STRLEN);
|
||||
}
|
||||
|
||||
/*
|
||||
* 函数功能:动态行刷新(逐行取名/值)
|
||||
* 入口参数:row - 行下标(0..4) uint16_t
|
||||
* name - 名缓冲(≥ UI_BUF_STRLEN,框架栈缓冲) char *
|
||||
* value - 值缓冲(≥ UI_BUF_STRLEN,框架栈缓冲) char *
|
||||
* 返回值:无
|
||||
* 限定条件:页面打开(框架绘制链内逐行调用)
|
||||
* 函数说明:周期行显示 RAM 副本原值(不做带外回显换算——带外值经
|
||||
* sntp_cfg_poll_min() 读回 60 属消费侧自愈口径,UI 忠实显示
|
||||
* 用户写入值,避免"保存后数字自己变了");
|
||||
* 保存行值随保存交接状态(net_cfg_save_state)显示 ENTER/WAIT/OK/ERR
|
||||
*/
|
||||
static void sn_refresh(uint16_t row, char *name, char *value) {
|
||||
const sntp_cfg_t *cfg = sntp_cfg_get();
|
||||
|
||||
name[0] = '\0';
|
||||
value[0] = '\0';
|
||||
|
||||
switch (row) {
|
||||
case SN_EN_ROW:
|
||||
(void)memcpy(name, "启用", sizeof("启用"));
|
||||
if (cfg->enable != 0u) {
|
||||
(void)memcpy(value, "开启", sizeof("开启"));
|
||||
}
|
||||
else {
|
||||
(void)memcpy(value, "关闭", sizeof("关闭"));
|
||||
}
|
||||
break;
|
||||
case SN_ADDR_ROW_MIN:
|
||||
(void)memcpy(name, "主服务器", sizeof("主服务器"));
|
||||
sn_fmt_addr(SN_ADDR_ROW_MIN, value);
|
||||
break;
|
||||
case SN_ADDR_ROW_MAX:
|
||||
(void)memcpy(name, "备服务器", sizeof("备服务器"));
|
||||
sn_fmt_addr(SN_ADDR_ROW_MAX, value);
|
||||
break;
|
||||
case SN_POLL_ROW:
|
||||
(void)memcpy(name, "周期(分)", sizeof("周期(分)"));
|
||||
(void)lv_snprintf(value, UI_BUF_STRLEN, "%u", (unsigned)cfg->poll_min);
|
||||
break;
|
||||
case SN_SAVE_ROW:
|
||||
(void)memcpy(name, "保存", sizeof("保存"));
|
||||
switch (net_cfg_save_state()) {
|
||||
case NET_CFG_SAVE_ST_WAIT:
|
||||
(void)memcpy(value, "WAIT", sizeof("WAIT"));
|
||||
break;
|
||||
case NET_CFG_SAVE_ST_OK:
|
||||
(void)memcpy(value, "OK", sizeof("OK"));
|
||||
break;
|
||||
case NET_CFG_SAVE_ST_FAIL:
|
||||
(void)memcpy(value, "ERR", sizeof("ERR"));
|
||||
break;
|
||||
default:
|
||||
(void)memcpy(value, "ENTER", sizeof("ENTER"));
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* 函数功能:切换启用开关(只改 RAM 副本)
|
||||
* 入口参数:无
|
||||
* 返回值:无
|
||||
* 限定条件:可编辑权限(key_cb 已把门)
|
||||
*/
|
||||
static void sn_toggle_enable(void) {
|
||||
sntp_cfg_t cfg = *sntp_cfg_get();
|
||||
|
||||
cfg.enable = (cfg.enable != 0u) ? 0u : 1u;
|
||||
sntp_cfg_set(&cfg);
|
||||
}
|
||||
|
||||
/*
|
||||
* 函数功能:调整被编辑地址行的活动字节(0..255 环绕,实时落 RAM 副本)
|
||||
* 入口参数:row - 地址行下标(1..2) uint16_t
|
||||
* delta - 调整方向(>0 = +1,<0 = -1) int8_t
|
||||
* 返回值:无
|
||||
* 限定条件:编辑模式(s_cursor 有效)
|
||||
* 函数说明:只改 RAM 副本;写盘须显式经保存行投递 net_cfg_save_request
|
||||
* (net_cfg_adjust_octet 同口径)
|
||||
*/
|
||||
static void sn_adjust_octet(uint16_t row, int8_t delta) {
|
||||
sntp_cfg_t cfg = *sntp_cfg_get();
|
||||
uint8_t *field = (row == SN_ADDR_ROW_MIN) ? cfg.server_pri : cfg.server_bak;
|
||||
|
||||
field[s_cursor] = (uint8_t)((field[s_cursor] + ((delta > 0) ? 1u : 255u)) % 256u);
|
||||
sntp_cfg_set(&cfg);
|
||||
}
|
||||
|
||||
/*
|
||||
* 函数功能:调整周期(分钟)值(实时落 RAM 副本)
|
||||
* 入口参数:step - 步长(有符号;±1 在 1..1440 带内环绕,±60 触带钳位) int16_t
|
||||
* 返回值:无
|
||||
* 限定条件:编辑模式(选中周期行)
|
||||
*/
|
||||
static void sn_adjust_poll(int16_t step) {
|
||||
sntp_cfg_t cfg = *sntp_cfg_get();
|
||||
int32_t v = (int32_t)cfg.poll_min;
|
||||
|
||||
if (v < (int32_t)SN_POLL_MIN || v > (int32_t)SN_POLL_MAX) {
|
||||
v = (int32_t)SNTP_CFG_DEF_POLL_MIN; /* 带外起点先落回默认再步进 */
|
||||
}
|
||||
if (step == 1) {
|
||||
v = (v >= (int32_t)SN_POLL_MAX) ? (int32_t)SN_POLL_MIN : (v + 1);
|
||||
}
|
||||
else if (step == -1) {
|
||||
v = (v <= (int32_t)SN_POLL_MIN) ? (int32_t)SN_POLL_MAX : (v - 1);
|
||||
}
|
||||
else {
|
||||
v += step; /* ±60 粗调:钳带不环绕(大步进环绕会跨带跳变,失序) */
|
||||
if (v < (int32_t)SN_POLL_MIN) {
|
||||
v = (int32_t)SN_POLL_MIN;
|
||||
}
|
||||
if (v > (int32_t)SN_POLL_MAX) {
|
||||
v = (int32_t)SN_POLL_MAX;
|
||||
}
|
||||
}
|
||||
cfg.poll_min = (uint16_t)v;
|
||||
sntp_cfg_set(&cfg);
|
||||
}
|
||||
|
||||
/*
|
||||
* 函数功能:页面自绘(编辑模式:选中行值内活动区域反显)
|
||||
* 入口参数:layer - 绘制层 lv_layer_t *
|
||||
* clip - 重绘区 const lv_area_t *
|
||||
* 返回值:无
|
||||
* 限定条件:页面打开(框架绘制链末尾调用)
|
||||
* 函数说明:非编辑模式无附加绘制(行/带/页脚全由框架);地址行编辑 = 活动
|
||||
* 字节反显(同网口设置页),周期行编辑 = 整值反显;
|
||||
* 1bpp:black=暗底 white=亮字
|
||||
*/
|
||||
static void sn_draw_cb(lv_layer_t *layer, const lv_area_t *clip) {
|
||||
char value[UI_BUF_STRLEN];
|
||||
lv_area_t box;
|
||||
uint32_t start;
|
||||
uint32_t seg_len;
|
||||
int32_t slot_y;
|
||||
int32_t x0;
|
||||
int32_t w;
|
||||
uint16_t sel;
|
||||
|
||||
if (s_editing == 0u || ui_content_page_is_editable() == false) {
|
||||
return;
|
||||
}
|
||||
|
||||
sel = ui_content_page_selected_row();
|
||||
if (sel == SN_ADDR_ROW_MIN || sel == SN_ADDR_ROW_MAX) {
|
||||
sn_fmt_addr(sel, value);
|
||||
start = (uint32_t)s_cursor * 4u; /* 字节 i 字符偏移 4i(%03u + 点) */
|
||||
seg_len = 3u;
|
||||
}
|
||||
else if (sel == SN_POLL_ROW) {
|
||||
(void)lv_snprintf(value, UI_BUF_STRLEN, "%u",
|
||||
(unsigned)sntp_cfg_get()->poll_min);
|
||||
start = 0u;
|
||||
seg_len = (uint32_t)strlen(value); /* 周期行:整值反显 */
|
||||
}
|
||||
else {
|
||||
return; /* 防御:开关行/保存行不进编辑态,无光标可画 */
|
||||
}
|
||||
|
||||
slot_y = UI_LIST_TOP + (int32_t)sel * UI_ROW_PITCH;
|
||||
x0 = SN_RIGHT_X + (int32_t)lv_text_get_width(value, start, LV_FONT_DEFAULT, 0);
|
||||
w = (int32_t)lv_text_get_width(value + start, seg_len, LV_FONT_DEFAULT, 0);
|
||||
|
||||
box.x1 = x0 - 1;
|
||||
box.x2 = x0 + w;
|
||||
box.y1 = slot_y;
|
||||
box.y2 = slot_y + UI_ROW_BAND_H - 1;
|
||||
if (!sn_areas_intersect(&box, clip)) {
|
||||
return; /* 编辑光标不在重绘区:跳过(culling) */
|
||||
}
|
||||
|
||||
/* 反显:黑底白字(与选中行白带黑字相反,方能在带内凸显活动段) */
|
||||
lv_draw_rect_dsc_t fd;
|
||||
|
||||
lv_draw_rect_dsc_init(&fd);
|
||||
fd.base.layer = layer;
|
||||
fd.bg_color = UI_COL_BG;
|
||||
fd.bg_opa = LV_OPA_COVER;
|
||||
lv_draw_rect(layer, &fd, &box);
|
||||
|
||||
{
|
||||
lv_draw_label_dsc_t ld;
|
||||
char seg[8]; /* 段文本:地址 3 字符 / 周期 ≤4 字符,+ '\0' */
|
||||
|
||||
/* 只绘制"段文本"本身(防 LVGL 按 coords 宽折行溢出,见网口设置页同注释) */
|
||||
memcpy(seg, value + start, seg_len);
|
||||
seg[seg_len] = '\0';
|
||||
|
||||
lv_draw_label_dsc_init(&ld);
|
||||
ld.base.layer = layer;
|
||||
ld.text = seg;
|
||||
ld.text_static = 0u; /* 栈缓冲(同帧有效) */
|
||||
ld.color = UI_COL_FG;
|
||||
ld.ofs_x = 1; /* box.x1 = x0-1,+1 = x0(与框架行文本原点一致) */
|
||||
ld.ofs_y = 0; /* 与行文本垂直对齐(text_dy = 0) */
|
||||
lv_draw_label(layer, &ld, &box);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* 函数功能:页面按键处理(列表页 + 编辑模式)
|
||||
* 入口参数:key - LVGL 键值 lv_key_t
|
||||
* 返回值:true - 页已处理(框架跳过内置语义);false - 未处理
|
||||
* 限定条件:页面打开;经框架键分发调用(uiTask 上下文)
|
||||
* 函数说明: 1. 编辑模式(地址行/周期行):地址行 ↑↓ 调活动字节(0..255
|
||||
* 环绕)、←→ 移字节光标(首↔末环绕);周期行 ↑↓ ±1 分带内环绕、
|
||||
* ←→ ±60 分钳带;ENTER 确认退出编辑(值已实时落 RAM 副本);
|
||||
* ESC 恒关页(框架保证,未保存调整留在 RAM,下次开页重显、
|
||||
* 不写盘、重启失效——网口设置页同口径)
|
||||
* 2. 正常模式:ENTER 启用行 → 直接切换开关;ENTER 地址行/周期行 →
|
||||
* 进编辑模式;ENTER 保存行 → 投递整档保存请求
|
||||
* net_cfg_save_request(属主任务 defaultTask 写盘,[sntp] 段
|
||||
* 随档落盘;消费方每轮直读 RAM 副本,网络代次重建自动收口);
|
||||
* ↑↓ 落框架移选、← 落框架关页;只读态 ENTER 一律忽略
|
||||
*/
|
||||
static bool sn_key_cb(lv_key_t key) {
|
||||
uint16_t sel = ui_content_page_selected_row();
|
||||
|
||||
if (s_editing != 0u) {
|
||||
if (sel < SN_ADDR_ROW_MIN || sel > SN_POLL_ROW) {
|
||||
s_editing = 0u; /* 防御:编辑中选中行越界(编辑态移选被拦截,不应发生) */
|
||||
return false;
|
||||
}
|
||||
|
||||
switch (key) {
|
||||
case LV_KEY_UP:
|
||||
if (sel == SN_POLL_ROW) {
|
||||
sn_adjust_poll(1);
|
||||
}
|
||||
else {
|
||||
sn_adjust_octet(sel, 1);
|
||||
}
|
||||
ui_content_page_invalidate();
|
||||
return true;
|
||||
case LV_KEY_DOWN:
|
||||
if (sel == SN_POLL_ROW) {
|
||||
sn_adjust_poll(-1);
|
||||
}
|
||||
else {
|
||||
sn_adjust_octet(sel, -1);
|
||||
}
|
||||
ui_content_page_invalidate();
|
||||
return true;
|
||||
case LV_KEY_LEFT:
|
||||
if (sel == SN_POLL_ROW) {
|
||||
sn_adjust_poll(-(int16_t)SN_POLL_BIG_STEP);
|
||||
}
|
||||
else {
|
||||
s_cursor = (uint8_t)((s_cursor + 3u) % 4u); /* 光标左移,首绕末 */
|
||||
}
|
||||
ui_content_page_invalidate();
|
||||
return true;
|
||||
case LV_KEY_RIGHT:
|
||||
if (sel == SN_POLL_ROW) {
|
||||
sn_adjust_poll((int16_t)SN_POLL_BIG_STEP);
|
||||
}
|
||||
else {
|
||||
s_cursor = (uint8_t)((s_cursor + 1u) % 4u); /* 光标右移,末绕首 */
|
||||
}
|
||||
ui_content_page_invalidate();
|
||||
return true;
|
||||
case LV_KEY_ENTER:
|
||||
s_editing = 0u; /* 确认(值已在 RAM 副本);退出编辑 */
|
||||
ui_content_page_invalidate();
|
||||
return true;
|
||||
default:
|
||||
return false; /* ESC 框架恒关页;其余键落内置忽略 */
|
||||
}
|
||||
}
|
||||
|
||||
if (key == LV_KEY_ENTER && ui_content_page_is_editable() != false) {
|
||||
if (sel == SN_EN_ROW) {
|
||||
sn_toggle_enable();
|
||||
ui_content_page_invalidate();
|
||||
return true;
|
||||
}
|
||||
if (sel >= SN_ADDR_ROW_MIN && sel <= SN_POLL_ROW) {
|
||||
s_editing = 1u;
|
||||
s_cursor = 0u;
|
||||
ui_content_page_invalidate();
|
||||
return true;
|
||||
}
|
||||
if (sel == SN_SAVE_ROW) {
|
||||
(void)net_cfg_save_request(); /* 投递整档保存请求:属主任务写盘 */
|
||||
ui_content_page_invalidate();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* 函数功能:重置页面运行态
|
||||
* 入口参数:无
|
||||
* 返回值:无
|
||||
* 限定条件:框架 ui_content_page_open 内调用(开页后一次)
|
||||
* 函数说明:页面模块静态态不随屏/容器建毁自动复位,须自重置(编辑态/光标)
|
||||
*/
|
||||
static void sn_init_cb(void) {
|
||||
s_editing = 0u;
|
||||
s_cursor = 0u;
|
||||
}
|
||||
|
||||
/*
|
||||
* 页面描述符(外部链接:生成物 ui_page_registry.c 按菜单树 #page=sntp 绑定引用):
|
||||
* 列表页(5 行 1 页,动态值)+ 可编辑(edit_capable,还须修改权限)
|
||||
* + ← 拦截(编辑模式移字节光标/粗调周期;ESC 恒不可拦截)
|
||||
*/
|
||||
const content_page_def_t ui_page_sntp_desc = {
|
||||
.id = "sntp",
|
||||
.title = "SNTP设置",
|
||||
.selectable = 1u,
|
||||
.key_intercept = 1u,
|
||||
.edit_capable = 1u,
|
||||
.top_y = UI_LIST_TOP,
|
||||
.pitch = UI_ROW_PITCH,
|
||||
.band_h = UI_ROW_BAND_H,
|
||||
.text_dy = 0,
|
||||
.left_x = SN_LEFT_X,
|
||||
.right_x = SN_RIGHT_X,
|
||||
.rows_per_page = SN_ROW_COUNT,
|
||||
.row_count = SN_ROW_COUNT,
|
||||
.refresh = sn_refresh,
|
||||
.init_cb = sn_init_cb,
|
||||
.draw_cb = sn_draw_cb,
|
||||
.key_cb = sn_key_cb,
|
||||
};
|
||||
@@ -0,0 +1,30 @@
|
||||
/*
|
||||
* 模块名称:UI Page SNTP (SNTP设置内容页)
|
||||
* 模块功能:SNTP设置叶子节点的内容页描述符(5 行列表:启用/主服务器/
|
||||
* 备服务器/周期(分) + 保存行;可编辑页:修改权限下 ENTER 进编辑、
|
||||
* 地址行 ↑↓ 调字节 ←→ 移光标、周期行 ↑↓ ±1 ←→ ±60、
|
||||
* 保存行 ENTER 投递整档保存请求,属主任务写盘)
|
||||
* 适用平台:STM32F407ZGTx / PC 模拟器(两端共用)
|
||||
* 作者:王建锋
|
||||
* 创建日期:2026-11-04
|
||||
* 修改记录:
|
||||
* v1.0 2026-11-04 王建锋 创建初始版本(板端 SNTP 客户端接入)
|
||||
*/
|
||||
|
||||
#ifndef UI_PAGE_SNTP_H
|
||||
#define UI_PAGE_SNTP_H
|
||||
|
||||
#include "ui_content_page.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* 页面描述符(生成物 ui_page_registry.c 按菜单树 #page=sntp 注记绑定引用;.id = "sntp") */
|
||||
extern const content_page_def_t ui_page_sntp_desc;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* UI_PAGE_SNTP_H */
|
||||
Reference in New Issue
Block a user