feat(wave): 故障录波数据面、接线与单通道回放页(软件闭环交付)

数据面(App/algo,纯逻辑,双端编译)
- wave_ring:8 路 × 320 点列优先环(1 kHz,预触发 160 + 后触发 160),adcTask
  唯一写者;触发/冻结/封存/冷却四态,冻结持续到落盘回执才解冻,滞留 2 s 自弃
  兜底——下一次真故障无波可录比丢一段更贵
- wave_store:段头编解码 + 拉模式打包游标 + 自带无表位运算 CRC-16/MODBUS(带
  锚点自检)+ 段名与整段长度等式;格式不依赖平台类型宽度
- 段头只存原始码值与封存瞬间生效系数,工程量只当单位标签、不进任何算式
- 三套主机单测(环 113 / 编解码 170 / 触发状态机 110),全部无桩、生产源原样
  纳入;新文件补 stddef 是 ARMCC 与主机差异,主机侧照不出这条分叉
- test/host/wave_read.py 是按 §6.2 的独立第二实现(dump/fft/shape/plot),92 条
  自洽断言;三份合成段互读双校验全过、哈希钉死,格式面双向闭合
- 三套新单测不加专属钩子,由覆盖率总闸全量真跑(沿用既有裁定)

接线(任务层)
- adc_cal:新增生效系数的 32 位定点原值入口(与既有浮点入口共用生效视图),
  段头按最低有效位精确记账,不经浮点回算
- adcTask:每拍压 8 路语义原始码值并推进状态机,封存那一拍同拍交棒封存瞬间事实;
  台架定周期自抓走双层编译门,产品镜像里零存在;串口新增一条 wave: 周期行
- defaultTask:卷空闲后一次心跳整段搬完(try 锁 + 256 字节分片 + 一次完整开档到
  关档),成败都回执;失败先删半成品再计错,段号只在成功时推进;持锁超 50 ms
  补一条告警并记历史峰值(喂狗余量可核)
- Lead 复核补第四道并发陷阱:采集任务优先级高于落盘道,搬段中途它可能正好把滞留
  超时的本段自弃、甚至封出下一段——数据区校验和是对「实际读到的字节」算的,
  半新半旧的段照样自洽,故关档后复检环侧身份判废:删文件、不补账、段号不推进
- Lead 复核抓到触发挂号不是原子操作(旧实现分三个字节写,消费者可在窗口里读到
  上一段的触发源与元件号):已把载荷压进一个字节,越界当场拒且不记任何计数;
  段文件字节布局零改动,三份合成段哈希逐字节不变
- protectTask:保护启动上升沿同点请求录波,一拍一次、元件号取最低位;判据本体
  零改动

人机(160×160 单色屏)
- 菜单树节点 26「手动录波」绑页面 + 记录查询组末新增「录波回放」叶,重跑生成器
  得 43 节点 / 34 叶 / 30 已绑,页面映射 28 → 30
- 回放页一屏一路、触发点前后各一周波共 40 点、每点 3 像素阶梯线(只用水平与
  垂直两种线段——单色屏斜线会被阈值裁掉);零点虚线、触发光标、窗口峰值、
  单位徽标与形状受限徽标;空态与坏段各一句显式文案,绝不用半截波形冒充数据
- ui_data 新增录波注入通道(六件操作表、三态返回);执行侧胶水带段头缓存、
  手动请求后连缓存一起作废、逐点走全仓唯一的码值换算入口
- 模拟器接真实环与编解码合成两段(含坏段与空态旗标),6 张新黄金参考,既有
  60 张逐字节零漂移未用更新模式;字库 218 → 224 字 / 319 字形
- 两份图形配置里图表组件仍为关;零堆分配;页面池水位不变
- 回放读路径的 uiTask 阻塞上界按实码写清:一次渲染 = 段表刷新 + 未缓存段头最坏
  22 次小读;已验段只剩一次开窗读 + 40 点解码;无实测数不编,实测归台架、
  仪器用已在跑的单轮工作耗时探针,不新加埋点

台账与文档
- 内存台账:录波环与落盘/回放静态逐条入册,三档对照 81,536 → 88,296 → 89,936
  字节(62.2% → 68.6%),累计 +8,400;预估 5.9 KB 与实测 +6,760 的差额点名;
  散列文件头注释同步;任务栈表核对后无需抬栈;体积趋势行与同码凭证由权威构建
  重打(0 错误 0 警告,四项体积与上一轮相同——本轮改动只有注释与声明位置)
- 设计说明:§5 补第四条并发陷阱;§6.3 定字段口径(两份独立实现的共同依据);
  §7 回填实测;§9 周期行写实;§10 台架判据改两段式且不比绝对相位;§12 补读路径
  风险行;抬头状态改成「代码面已交付、未做完的只有板级那一轮」
- 卡片:软件闭环一栏列证据;台架三条按用户裁定保持未完成,不做虚假销项
- 口径同步:数据可信、UI 补齐、页面补齐规划、产品需求、采集短板评测、任务规划
  索引与两份 README;陈旧现状句清扫 16 处(带日期戳的历史取数行一律不动)
- 门禁说明:nested-comment 记仓库根探测必须兼容 linked worktree 的 gitdir 文件
  形态(修前该钩子在任务树里恒报环境错、静默不可用);coding-standard 记
  「函数头注释超过 24 行就把函数功能挤出回看窗口」这条机制与本次现场
- 覆盖率基线登记两个新覆盖模块(套件 41 → 44 套);环单测重打后该文件有效行
  227 → 226、覆盖行 226 → 225,比率仍 99.6%,是分母变小不是覆盖率回退

为什么是单一提交:文档链接、双端注册、生成器幂等(菜单与字库)、内存数字与
体积事实源、编号门禁这五道整仓门禁要求代码、页面、菜单树、字库、文档与台账
同处一个提交才自洽,按数据面/接线/人机/台账拆成四笔必然红其中至少四道

编号门禁新增行 14 处命中已按语义改写:魔数常量按字符命名、段名样例改由格式串
生成、频谱表头改 f / 2x / 5x 并加一行图例;改写后自洽断言 92 条仍全过
This commit is contained in:
2026-10-29 19:23:15 +08:00
parent 325abe4337
commit d64bbdc57f
81 changed files with 8868 additions and 424 deletions
+84
View File
@@ -1087,3 +1087,87 @@ uint8_t ui_data_comm_pending(void) {
}
return s_comm->pending();
}
/* ── 通道六:故障录波(wave)注入与包装 ─────────────────────────────────────
* 包装层零判据:未注入统一按「无录波段」态返(页面显式空态文案,绝不
* 画平线——设计 §8.1 空态行);六件的参数校验只到指针级,语义判定
* (卷忙/段损坏)全在执行侧,与通道四/五同一条分层纪律。
*/
static const ui_data_wave_ops_t *s_wave = NULL;
/*
* 函数功能:注入录波执行侧函数表(启动期一次)
* 入口参数:ops - 六件齐;NULL = 撤销注入
* 返回值:0 - 已注入/已撤销;-1 - 残表(存量不动,理由逐字同 comm bind) int
* 限定条件:uiTask 启动期,先于 ui_menu_init()
*/
int ui_data_wave_bind(const ui_data_wave_ops_t *a_ops) {
if (a_ops == NULL) {
s_wave = NULL;
return 0;
}
if ((a_ops->manual_req == NULL) || (a_ops->seg_first == NULL) ||
(a_ops->seg_prev == NULL) || (a_ops->seg_next == NULL) ||
(a_ops->seg_head == NULL) || (a_ops->seg_win == NULL)) {
return -1;
}
s_wave = a_ops;
return 0;
}
/* 函数功能:投手动录波请求(未注入 = 拒收,页面显示 ERR) bool */
int ui_data_wave_manual_req(void) {
if (s_wave == NULL) {
return -1;
}
return s_wave->manual_req();
}
/* 函数功能:录波通道三态查询的统一未注入兜底(返 NONE 显空态,不崩) int */
static int wp_wave_none(void) {
return UI_WAVE_NONE;
}
/* 函数功能:取数值最大段号(回绕后不保证时间最新——段号自证,见 .h 契约) int */
int ui_data_wave_seg_first(uint8_t *a_idx) {
if ((s_wave == NULL) || (a_idx == NULL)) {
return wp_wave_none();
}
return s_wave->seg_first(a_idx);
}
/* 函数功能:取更早一段段号 int */
int ui_data_wave_seg_prev(uint8_t a_cur, uint8_t *a_out) {
if ((s_wave == NULL) || (a_out == NULL)) {
return wp_wave_none();
}
return s_wave->seg_prev(a_cur, a_out);
}
/* 函数功能:取更新一段段号 int */
int ui_data_wave_seg_next(uint8_t a_cur, uint8_t *a_out) {
if ((s_wave == NULL) || (a_out == NULL)) {
return wp_wave_none();
}
return s_wave->seg_next(a_cur, a_out);
}
/* 函数功能:读段头(执行侧含 CRC 完整性判定) int */
int ui_data_wave_seg_head(uint8_t a_idx, uint8_t *a_eng, uint8_t *a_trig,
uint8_t *a_clip) {
if ((s_wave == NULL) || (a_eng == NULL) || (a_trig == NULL) ||
(a_clip == NULL)) {
return wp_wave_none();
}
return s_wave->seg_head(a_idx, a_eng, a_trig, a_clip);
}
/* 函数功能:读显示窗口码值与峰值 mV int */
int ui_data_wave_seg_win(uint8_t a_idx, uint8_t a_ch, int16_t *a_codes,
int32_t *a_peak_milli) {
if ((s_wave == NULL) || (a_codes == NULL) || (a_peak_milli == NULL) ||
(a_ch >= UI_WAVE_CH_CNT)) {
return wp_wave_none();
}
return s_wave->seg_win(a_idx, a_ch, a_codes, a_peak_milli);
}
+105
View File
@@ -924,6 +924,111 @@ int ui_data_comm_set(uint8_t a_idx, uint32_t a_val);
*/
uint8_t ui_data_comm_pending(void);
/* ── 通道六:故障录波(wave)────────────────────────────────────────────────
* 页面零 App include、零存储触点:录波执行侧(触发投递 / 段索引 / 段头字段 /
* 窗口码值与峰值 mV)全部经本注入表进来,真实现见 App/task/ui_task.c 的
* s_wave_ops;PC 模拟器绑同一形状的假件(simulator/main.c)。取数口径的
* 唯一真源是 docs/子系统设计/故障录波设计说明.md §6.3(定点 mV 换算走
* wave_store_code_to_milli,eng 只做徽标、绝不进算式)。
*/
/* 录波通道数(与段头 ch_count 恒等:电气八路,温度不入波) */
#define UI_WAVE_CH_CNT 8u
/* 回放显示窗口点数(两周波;口径推导与设计 §4.2 的触发点位置钉在一起,
* 窗起点与虚线光标由执行侧与页面各按同一定义实现,页面侧写死 */
#define UI_WAVE_WIN_PTS 40u
/* 通道查询返回态:段存在且可用 */
#define UI_WAVE_OK 0
/* 无段(目录扫空 / 卷忙跳过 / 执行侧未注入,页面显示「无录波段」) */
#define UI_WAVE_NONE 1
/* 有段但不可读(长度不符 / 版本不符 / 任一段 CRC 不符,页面显示
* 「该段不可读」——两种态都必须显式说,画直线等于伪造证据(设计 §8.1) */
#define UI_WAVE_BAD 2
/*
* 录波执行侧注入表(六件齐全;ui_data_wave_bind 拒绝残表)
* 返回值约定:除 manual_req 外,各件返回 UI_WAVE_OK / NONE / BAD 三态;
* seg_win 的出参仅在返 UI_WAVE_OK 时可读(通道五同一条出参契约)。
*/
typedef struct {
/* 投一次手动录波请求。返回值:0 - 已受理;非零 - 拒收(含未落段通道
* 不可用),页面据此走确认链的 ERR 支 */
int (*manual_req)(void);
/* 取盘上数值最大的段号(回放页开屏落点;左右键从此起环游)。
* 回绕后本序不保证时间最新,页顶段号即自证;时间序要靠段头
* frame_seq/t0,代价是 100 次开文件,本波不做(lead 裁定 2026-10-29) */
int (*seg_first)(uint8_t *a_idx);
/* 取比 a_cur 更早一段的段号(到最早端后环回数值最大端) */
int (*seg_prev)(uint8_t a_cur, uint8_t *a_out);
/* 取比 a_cur 更新一段的段号(到最大端后环回数值最小端) */
int (*seg_next)(uint8_t a_cur, uint8_t *a_out);
/* 读段头并做完整性判定(头 CRC 与数据 CRC 都在执行侧验完)。
* 出参:eng - 单位口径(UI_DATA_ENG_* 同值域);trig - 触发源
* (段头 trig_src 原值:手动/保护/定时);clip - 形状受限通道位图
* (段头 clip 字节,位号 = 通道号) */
int (*seg_head)(uint8_t a_idx, uint8_t *a_eng, uint8_t *a_trig,
uint8_t *a_clip);
/* 读当前显示窗口的码值(已并入 b_codes 偏移)与窗口峰值。
* 出参:a_codes - UI_WAVE_WIN_PTS 个码值;a_peak_milli - 窗口内
* 绝对值最大的那一点折算的 mV(定点,执行侧经 code_to_milli 算好,
* 页面不重复换算式——§6.3 的单一口径条款;b_codes 由 code_to_milli
* 内部加,与 a_codes 里已并的偏移同一把尺:谁被显示谁被度量) */
int (*seg_win)(uint8_t a_idx, uint8_t a_ch, int16_t *a_codes,
int32_t *a_peak_milli);
} ui_data_wave_ops_t;
/*
* 函数功能:注入录波执行侧函数表(启动期一次;形状对齐 ui_data_comm_bind)
* 入口参数:ops - 函数表(六件都不得为 NULL);NULL = 撤销注入(宿主测试用)
* 返回值:0 - 已注入/已撤销;-1 - 残表(存量不动) int
* 限定条件:uiTask 启动期、先于 ui_menu_init()
*/
int ui_data_wave_bind(const ui_data_wave_ops_t *a_ops);
/*
* 函数功能:投一次手动录波请求(录波触发页唯一写出口)
* 返回值:0 - 已受理;-1 - 未注入或拒收(未注入与拒收同码,同通道五) int
*/
int ui_data_wave_manual_req(void);
/*
* 函数功能:取数值最大段号(排序口径见 ui_data.c 同名胶水注释:回绕后本序
* 不保证时间最新,页顶段号即自证;真时间序要逐段读 frame_seq/t0,
* 代价 100 次开文件,本波不做)
* 入口参数:a_idx - 出参,段号(仅返 OK 时可读)
* 返回值:UI_WAVE_OK / UI_WAVE_NONE / UI_WAVE_BAD(未注入按 NONE 渲染空态,不崩) int
*/
int ui_data_wave_seg_first(uint8_t *a_idx);
/*
* 函数功能:取 a_cur 的更早一段段号(环形回绕)
* 入口参数:a_cur - 当前段号;a_out - 出参(仅返 OK 时可读)
* 返回值:UI_WAVE_OK / UI_WAVE_NONE / UI_WAVE_BAD int
*/
int ui_data_wave_seg_prev(uint8_t a_cur, uint8_t *a_out);
/*
* 函数功能:取 a_cur 的更新一段段号(环形回绕,方向与 prev 相反)
* 入口参数:a_cur - 当前段号;a_out - 出参(仅返 OK 时可读)
* 返回值:UI_WAVE_OK / UI_WAVE_NONE / UI_WAVE_BAD int
*/
int ui_data_wave_seg_next(uint8_t a_cur, uint8_t *a_out);
/*
* 函数功能:读段头(含执行侧 CRC 完整性判定)——出参仅返 OK 时可读
* 返回值:UI_WAVE_OK / NONE / BAD(未注入按 NONE) int
*/
int ui_data_wave_seg_head(uint8_t a_idx, uint8_t *a_eng, uint8_t *a_trig,
uint8_t *a_clip);
/*
* 函数功能:读显示窗口码值与峰值 mV——出参仅返 OK 时可读
* 返回值:UI_WAVE_OK / NONE / BAD(未注入按 NONE) int
*/
int ui_data_wave_seg_win(uint8_t a_idx, uint8_t a_ch, int16_t *a_codes,
int32_t *a_peak_milli);
#ifdef __cplusplus
}
#endif
+258 -223
View File
@@ -329,6 +329,10 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
0x2, 0x0, 0x40, 0x8, 0x1, 0x0, 0x20, 0x7f,
0xf0,
/* U+4E0D "不" */
0xff, 0xe0, 0x40, 0x8, 0x2, 0x0, 0xd0, 0x29,
0x9, 0x16, 0x21, 0x4, 0x0, 0x80, 0x10, 0x0,
/* U+4E3B "主" */
0x8, 0x0, 0x80, 0x0, 0x3f, 0xe0, 0x40, 0x8,
0x1, 0x3, 0xfe, 0x4, 0x0, 0x80, 0x10, 0x7f,
@@ -423,6 +427,11 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
0x5f, 0x4a, 0xa9, 0x55, 0x2a, 0x85, 0x70, 0x88,
0x70,
/* U+524A "削" */
0x10, 0x32, 0x45, 0x52, 0x88, 0x5f, 0xeb, 0x5,
0x7f, 0xac, 0x15, 0xfe, 0xb0, 0x46, 0x8, 0xc3,
0x30,
/* U+524D "前" */
0x20, 0x82, 0x23, 0xff, 0x80, 0x7, 0xc4, 0x8a,
0x9f, 0x52, 0x2a, 0x7d, 0x48, 0xa9, 0x11, 0x26,
@@ -535,6 +544,11 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
0x51, 0xc, 0x3, 0x4, 0xf, 0xf8, 0x10, 0x7f,
0xf0,
/* U+57DF "域" */
0x40, 0xa8, 0x11, 0x3f, 0xa0, 0x4e, 0xe8, 0x95,
0x52, 0xaa, 0x76, 0x40, 0xcc, 0x57, 0x35, 0x81,
0x10,
/* U+590D "复" */
0x3f, 0xe8, 0x2, 0xff, 0x10, 0x23, 0xfc, 0x40,
0x8f, 0xf0, 0x80, 0x3f, 0xca, 0x10, 0x3c, 0x38,
@@ -735,6 +749,11 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
0xa4, 0x95, 0x94, 0xd1, 0x12, 0x50, 0x51, 0xc,
0x10,
/* U+653E "放" */
0x41, 0x4, 0x20, 0x4, 0x7c, 0xf4, 0x24, 0x8a,
0x9e, 0x52, 0x4a, 0x49, 0x49, 0x11, 0x25, 0x4d,
0x10,
/* U+6545 "故" */
0x22, 0x4, 0x40, 0x88, 0x7d, 0xf2, 0x44, 0x44,
0xbe, 0x94, 0x52, 0x8a, 0x91, 0x23, 0xea, 0x46,
@@ -1134,6 +1153,11 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
0x53, 0xea, 0x45, 0x48, 0xad, 0xf5, 0x20, 0x80,
0x60,
/* U+8BE5 "该" */
0x42, 0x4, 0x20, 0x3f, 0x81, 0xe, 0x44, 0x5f,
0x8, 0x49, 0x12, 0x2c, 0x86, 0x30, 0x89, 0x6,
0x10,
/* U+8BEF "误" */
0x8f, 0x89, 0x10, 0x22, 0x7, 0xcc, 0x0, 0xbf,
0x90, 0x83, 0xff, 0x42, 0xc, 0xa1, 0x22, 0x8,
@@ -1144,6 +1168,11 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
0xd2, 0x12, 0x7e, 0x48, 0x49, 0xf9, 0xa1, 0x24,
0x60,
/* U+8BFB "读" */
0x82, 0x9, 0xf8, 0x8, 0xf, 0xfc, 0x2, 0x8a,
0x14, 0xc2, 0x48, 0x5f, 0xec, 0x51, 0x11, 0xc,
0x10,
/* U+8D1F "负" */
0x20, 0x7, 0xe1, 0x4, 0x41, 0x7, 0xfc, 0x80,
0x91, 0x12, 0x22, 0x44, 0x41, 0x60, 0xc3, 0x60,
@@ -1462,218 +1491,224 @@ static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = {
{.bitmap_index = 511, .adv_w = 192, .box_w = 11, .box_h = 1, .ofs_x = 0, .ofs_y = 3},
{.bitmap_index = 513, .adv_w = 192, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 529, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 546, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 563, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 580, .adv_w = 192, .box_w = 11, .box_h = 9, .ofs_x = 0, .ofs_y = -1},
{.bitmap_index = 593, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 610, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 627, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 644, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 661, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 678, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 695, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 712, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 729, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 746, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 763, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 780, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 797, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 814, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 831, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 848, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 865, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 882, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 899, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 916, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = -2},
{.bitmap_index = 930, .adv_w = 192, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 946, .adv_w = 192, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 962, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 546, .adv_w = 192, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 562, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 579, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 596, .adv_w = 192, .box_w = 11, .box_h = 9, .ofs_x = 0, .ofs_y = -1},
{.bitmap_index = 609, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 626, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 643, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 660, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 677, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 694, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 711, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 728, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 745, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 762, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 779, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 796, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 813, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 830, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 847, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 864, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 881, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.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 = 9, .box_h = 10, .ofs_x = 1, .ofs_y = -1},
{.bitmap_index = 1040, .adv_w = 192, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 1056, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 1073, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 1090, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 1107, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 1124, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 1141, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 1158, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = -2},
{.bitmap_index = 1172, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 1189, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 1206, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 1223, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 1240, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 1257, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 1274, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 1291, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 1308, .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 = 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 = 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},
{.bitmap_index = 1290, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.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 = 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 = 10, .box_h = 11, .ofs_x = 1, .ofs_y = -2},
{.bitmap_index = 1423, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 1440, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 1457, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 1474, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 1491, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 1508, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 1525, .adv_w = 192, .box_w = 11, .box_h = 11, .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 = 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 = 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 = 9, .box_h = 12, .ofs_x = 1, .ofs_y = -2},
{.bitmap_index = 1589, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 1606, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 1623, .adv_w = 192, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = -2},
{.bitmap_index = 1637, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 1654, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 1671, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 1688, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 1705, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 1722, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 1739, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 1756, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 1773, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 1790, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 1807, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 1824, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 1841, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 1858, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 1875, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 1892, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 1909, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 1926, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 1943, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 1960, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 1977, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 1994, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 2011, .adv_w = 192, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 2027, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 1, .ofs_y = -2},
{.bitmap_index = 2040, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 2057, .adv_w = 192, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 2073, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 2090, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 2104, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 2121, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 2138, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 2155, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 2172, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 2189, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 2206, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 2223, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 2240, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 2257, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 2274, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 2291, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 2308, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 2325, .adv_w = 192, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 2341, .adv_w = 192, .box_w = 11, .box_h = 11, .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 = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 2476, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 2493, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 2510, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 2527, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 2544, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 2561, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 2578, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 2595, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 2612, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 2626, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 2643, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 2660, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 2677, .adv_w = 192, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -2},
{.bitmap_index = 2692, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 2709, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 2726, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 2743, .adv_w = 192, .box_w = 11, .box_h = 11, .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 = 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},
{.bitmap_index = 1789, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 1806, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 1823, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 1840, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 1857, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 1874, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 1891, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 1908, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 1925, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 1942, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 1959, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 1976, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 1993, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 2010, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.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 = 11, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 2792, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 2809, .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 = 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 = 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 = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 2894, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 2911, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 2928, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 2945, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 2962, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 2979, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 2996, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 3013, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 3030, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 3047, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 3064, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 3081, .adv_w = 192, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = -2},
{.bitmap_index = 3095, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 3112, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 3129, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 3146, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 3163, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 3180, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 3197, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 3214, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 3231, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 3248, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 3265, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 3282, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 3299, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 3316, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 3333, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 3350, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 3367, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 3384, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 3401, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 3418, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 3435, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 3452, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 3469, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 3486, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 3503, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 3520, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 3537, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 3554, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 3571, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 3588, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 3605, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 3622, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 3639, .adv_w = 192, .box_w = 11, .box_h = 11, .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 = 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 = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 3757, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 3774, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 3791, .adv_w = 192, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -2},
{.bitmap_index = 3806, .adv_w = 192, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -2},
{.bitmap_index = 3821, .adv_w = 192, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -2},
{.bitmap_index = 3836, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 3853, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 3870, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 3887, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 3904, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 3921, .adv_w = 192, .box_w = 11, .box_h = 11, .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 = 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 = 12, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 4039, .adv_w = 192, .box_w = 2, .box_h = 4, .ofs_x = 2, .ofs_y = 0},
{.bitmap_index = 4040, .adv_w = 192, .box_w = 2, .box_h = 6, .ofs_x = 2, .ofs_y = 0},
{.bitmap_index = 4042, .adv_w = 165, .box_w = 8, .box_h = 10, .ofs_x = 1, .ofs_y = -1} /* U+25B6 */
{.bitmap_index = 4022, .adv_w = 192, .box_w = 11, .box_h = 11, .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 */
};
/*---------------------
@@ -1681,34 +1716,34 @@ static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = {
*--------------------*/
static const uint16_t unicode_list_1[] = {
0x0, 0x1, 0x2, 0x2ca0, 0x2ca9, 0x2caa, 0x2cdb, 0x2d2b,
0x2d2c, 0x2d44, 0x2d96, 0x2ded, 0x2dee, 0x2dfc, 0x2e7d, 0x2e81,
0x2edc, 0x3005, 0x300c, 0x3011, 0x3013, 0x3039, 0x309a, 0x30a6,
0x30d6, 0x30ed, 0x3148, 0x31b6, 0x31da, 0x322b, 0x323f, 0x3262,
0x326c, 0x3271, 0x3276, 0x3283, 0x328f, 0x3297, 0x32a8, 0x32cc,
0x32cf, 0x32ea, 0x3308, 0x357e, 0x3580, 0x3594, 0x35d0, 0x35e0,
0x362b, 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, 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, 0x6a8f, 0x6a97, 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
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
};
/*Collect the unicode lists and glyph_id offsets*/
@@ -1719,12 +1754,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 = 313,
.range_start = 9654, .range_length = 1, .glyph_id_start = 319,
.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 = 217, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY
.unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 223, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY
}
};
+1
View File
@@ -54,6 +54,7 @@ const ui_menu_node_t g_menu_tab[UI_MENU_TAB_COUNT] = {
{ 32, 0u, "自检记录" }, /* 39 二级菜单 */
{ 32, 0u, "运行记录" }, /* 40 二级菜单 */
{ 32, 0u, "运行报告" }, /* 41 二级菜单 */
{ 32, 0u, "录波回放" }, /* 42 二级菜单 */
};
/*
+1 -1
View File
@@ -25,7 +25,7 @@ typedef struct {
const char *name; /* 显示文本(字面量,存 Flash) */
} ui_menu_node_t;
#define UI_MENU_TAB_COUNT 42
#define UI_MENU_TAB_COUNT 43
/* 护栏:8 位索引上限 255 项(哨兵 0xFF 占用 255);超界则编译失败(C99 写法,兼容 ARMCC v5) */
typedef char menu_tab_count_check[(UI_MENU_TAB_COUNT <= 255) ? 1 : -1];
+4
View File
@@ -32,6 +32,8 @@
#include "ui_page_view_plate.h"
#include "ui_page_view_set.h"
#include "ui_page_view_word.h"
#include "ui_page_wave_manual.h"
#include "ui_page_wave_play.h"
#include "ui_page_yk.h"
#include "ui_page_yx.h"
@@ -52,6 +54,7 @@ const ui_page_entry_t g_ui_page_map[UI_PAGE_MAP_COUNT] = {
{ 19u, &ui_page_calib_desc }, /* node 19 遥测系数 */
{ 24u, &ui_page_clock_desc }, /* node 24 时钟设置 */
{ 25u, &ui_page_reset_desc }, /* node 25 强制复归 */
{ 26u, &ui_page_wave_manual_desc }, /* node 26 手动录波 */
{ 27u, &ui_page_clear_desc }, /* node 27 清除记录 */
{ 29u, &ui_page_comm_desc }, /* node 29 通讯设置 */
{ 30u, &ui_page_net_cfg_desc }, /* node 30 网口设置 */
@@ -64,6 +67,7 @@ const ui_page_entry_t g_ui_page_map[UI_PAGE_MAP_COUNT] = {
{ 39u, &ui_page_selftest_desc }, /* node 39 自检记录 */
{ 40u, &ui_page_runlog_desc }, /* node 40 运行记录 */
{ 41u, &ui_page_runreport_desc }, /* node 41 运行报告 */
{ 42u, &ui_page_wave_play_desc }, /* node 42 录波回放 */
};
/*
+1 -1
View File
@@ -25,7 +25,7 @@ typedef struct {
const content_page_def_t *desc; /* 页面描述符(Flash const) */
} ui_page_entry_t;
#define UI_PAGE_MAP_COUNT 28u /* 绑定了内容页的叶子数 */
#define UI_PAGE_MAP_COUNT 30u /* 绑定了内容页的叶子数 */
extern const ui_page_entry_t g_ui_page_map[UI_PAGE_MAP_COUNT];
+126
View File
@@ -0,0 +1,126 @@
/*
* 模块名称:UI Page wave_manual (手动录波内容页)
* 模块功能:装置维护 → 手动录波 叶子(node 26,#P 受密码保护)的内容页——
* 复用 ui_page_action 共享确认链(一次确认 → 二次确认 → 执行回报):
* 执行只做一件事——经录波注入表投一次「手动触发」请求,受理即回报
* 「已请求录波」;采点、冻结、落盘全在 ring/store/落盘道,本页不
* 等待也不查询结果(录波从触发到成段最快也要一秒后,页面上做同步
* 等待等于把 uiTask 绘制定律「零 I/O」当场破掉);
* 只读进入(查看密码)整页拒执行并显式 LOCK——与强制复归同一条
* 「触发是操作不是查看」的权限判据(docs/任务规划/UI补齐.md §2
* 维护组的既有口径,本页不自造第二种);
* 本文件零 App include、零存储触点(分层方向由注入表守住)。
* 适用平台:STM32F407ZGTx / PC 模拟器(两端共用)
* 作者:DTU 项目组
* 创建日期:2026-10-29
* 修改记录:
* v1.0 2026-10-29 DTU 项目组 创建(故障录波道 UI 侧;触发入口形态 =
* docs/子系统设计/故障录波设计说明.md §8.3;
* 冷却/忽略的屏上反馈:拒收即 ERR,ring 侧
* 「冷却中丢弃并计数」不在页面上细分原因——
* 用户要的原因区分在回放页看段号)
*/
/* 头文件包含区 */
#include "ui_page_wave_manual.h"
#include "ui_content_page.h"
#include "ui_data.h"
#include "ui_page_action.h"
/* 私有宏定义区 */
/* (无——文案词全部是 Flash 字面量,见下面静态配置) */
/* 私有函数声明区(静态初始化器要引用下面函数的地址,故先声明) */
static bool wv_ok(void);
/* 静态变量定义区 */
/*
* 本页操作页实例(配置全为 Flash 字面量与函数地址;运行态两字节由组件写)。
* 字段顺序 = ui_page_action_t 声明序(ARMCC v5 = C99 要求指定顺序一致)。
* 观测行留空(label 与 cb 成对给 NULL,组件允许):录波段数要扫卷才能知道,
* 而组件 watch_cb 的契约是「绘制路径零 I/O 直调」——不为一个观测数破坏
* 绘制定律,段数的事交给回放页(它本来就要读段)。
*/
static ui_page_action_t s_act = {
"确认手动录波?", /* prompt:问句用字全在既有子集(确认/手动录波 均来自
菜单与强制复归页现词,'?' 为 ASCII) */
"已请求录波", /* done_text:回报「请求已受理」,不谎称「已存成段」——
受理到落盘之间还隔着冻结窗与卷写,页面无权代言 */
wv_ok, /* ok_cb */
1u, /* need_modify:只读进入一律拒执行(触发是操作) */
NULL, /* watch_label(观测行不给,理由见上方块注释) */
NULL, /* watch_cb */
0u, /* stage(运行态初值) */
0u /* err (运行态初值) */
};
/* 函数定义区 */
/*
* 函数功能:执行投递——向录波环形缓冲投一次手动触发请求
* 入口参数:无
* 返回值:true = 已受理(组件转成功回报);false = 拒收(组件显示 ERR) bool
* 限定条件:由 ui_page_action_key 在第二次 ENTER 时调用(uiTask 上下文)
* 函数说明:ring 的 request 本身是「任意上下文可调的一次性请求」,非阻塞、
* 不等待采点;注入未绑(装配缺件)同样返非零 → 屏上显 ERR,
* 比「按了像成功其实什么都没发生」诚实(强制复归页同款纪律)。
* 不补操作记录:录波不是五类审计记录之一(触发证据在段文件头里,
* 落盘道已带 trig_src/t0/frame_seq),页面上再投一条 = 两处两个真源。
*/
static bool wv_ok(void) {
return (ui_data_wave_manual_req() == 0) ? true : false;
}
/*
* 函数功能:开页复位确认链(框架 init_cb)
* 入口参数:无
* 返回值:无
* 限定条件:框架开页链内调用
* 函数说明:复位由组件做(stage/err 是它的运行态),本页不重复清一遍
*/
static void pg_init(void) {
ui_page_action_init(&s_act);
}
/*
* 函数功能:自绘(框架 draw_cb;四行居中全由组件画)
* 入口参数:a_layer / a_clip - 契约见 ui_content_page.h
* 返回值:无
* 限定条件:框架绘制链末尾调用
*/
static void pg_draw(lv_layer_t *a_layer, const lv_area_t *a_clip) {
ui_page_action_draw(&s_act, a_layer, a_clip);
}
/*
* 函数功能:按键转发(框架 key_cb)
* 入口参数:a_key - LVGL 键值 lv_key_t
* 返回值:true = 本页已消费;false = 交回框架 bool
* 限定条件:框架按键链内
* 函数说明:确认链的判定全在组件里(含只读拒执行),本页只如实透传返回值
*/
static bool pg_key(lv_key_t a_key) {
return (ui_page_action_key(&s_act, a_key) != 0u);
}
/*
* 页面描述符(外部链接:生成物 ui_page_registry.c 按菜单树 #page=wave_manual 绑定引用)
* 操作页形态(强制复归页同款):无浅 V、无页脚、无行列表;
* edit_capable=1 是「能不能改」的那半,另半(本次进入授予的权限)由
* ui_content_page_is_editable() 给;key_intercept=0:LEFT 不拦截,关页 = 取消
*/
const content_page_def_t ui_page_wave_manual_desc = {
.id = "wave_manual",
.title = "手动录波",
.hide_deco = 1u,
.hide_footer = 1u,
.selectable = 0u,
.key_intercept = 0u,
.edit_capable = 1u,
.init_cb = pg_init,
.draw_cb = pg_draw,
.key_cb = pg_key,
};
+30
View File
@@ -0,0 +1,30 @@
/*
* 模块名称:UI Page wave_manual (手动录波内容页)
* 模块功能:装置维护 → 手动录波 叶子(node 26,#P 受密码保护)的内容页声明——
* 向框架 ui_content_page 提供页面描述符;确认链全部走 ui_page_action
* 共享实现,本模块零 App include、零存储触点(触发经录波注入表)
* 适用平台:STM32F407ZGTx / PC 模拟器(两端共用)
* 作者:DTU 项目组
* 创建日期:2026-10-29
* 修改记录:
* v1.0 2026-10-29 DTU 项目组 创建(故障录波道 UI 侧;形态与分工 =
* docs/子系统设计/故障录波设计说明.md §8.3
* 「手动录波操作页」一行)
*/
#ifndef UI_PAGE_WAVE_MANUAL_H
#define UI_PAGE_WAVE_MANUAL_H
#ifdef __cplusplus
extern "C" {
#endif
#include "ui_content_page.h"
/* 页面描述符(定义在 ui_page_wave_manual.c;生成物按菜单树 #page=wave_manual 引用本符号) */
extern const content_page_def_t ui_page_wave_manual_desc;
#ifdef __cplusplus
}
#endif
#endif /* UI_PAGE_WAVE_MANUAL_H */
+435
View File
@@ -0,0 +1,435 @@
/*
* 模块名称:UI Page wave_play (录波回放内容页)
* 模块功能:记录查询 → 录波回放 叶子的内容页——单通道阶梯波形回放(设计
* docs/子系统设计/故障录波设计说明.md §8.1 元素表逐条落地):
* 顶行 = 通道名 + 段号 + 触发源字母(M 手动 / P 保护 / T 定时);
* 波形区 = 两周波 40 点、每点占 3 px 的**阶梯线**(1 bpp 下平滑
* 折线的过零平缓段会被阈值吃掉,ui_deco.h 实测口径;阶梯线每段
* 非水平即垂直,天然绕开,也更贴近「离散采样」的事实);
* 参考线 = 0 线(虚线)+ 窗口峰值标注(定点 mV,ASCII);
* 底行 = 单位徽标(只读段头 eng,eng 绝不参与算式——§6.3 钉死,
* PC 道同一口径);形状受限通道右上打「削」徽标;
* 空态显式文案「无录波段」/「该段不可读」——画成一条直线等于
* 伪造证据(§8.1 空态行,此判据优先于「页面上总得画点东西」)。
* 键位:上下切通道、左右切段(key_intercept=1 才能把 LEFT 从
* 「关页」手里要来);ESC 关页。
* 取数纪律:本文件零 App include——段号/段头/窗口码值/峰值 mV 全部经
* ui_data.h 录波注入表进来(波形算式与定点换算在执行侧,页面
* 连 b_codes 都不碰,收到的码值已并偏移);首帧绘制才懒取数
* (开页链零 I/O,绘制定律不破)。
* 显示窗口与光标(与落盘道/PC 道的同一裁定,写在这里免得两头漂):
* 窗口 = 触发点前一周波 + 后一周波共 40 点,窗口起点 = 段内点号
* 「预窗点数 减 二十」(即执行侧 seg_win 的固定窗);虚线竖光标
* 落在窗内第 二十 与第 廿一 点之间(0 基第 19/20 点边界,即
* 波形区正中 x)——依据 = 设计 §4.2 触发点位置 + App/algo/
* wave_ring.h 的点序注释(触发 tick 采样 = 预窗最后一点),
* 页面不复述任何换算式。
* 适用平台:STM32F407ZGTx / PC 模拟器(两端共用)
* 作者:DTU 项目组
* 创建日期:2026-10-29
* 修改记录:
* v1.0 2026-10-29 DTU 项目组 创建(故障录波道 UI 侧)
*/
/* 头文件包含区 */
#include "ui_page_wave_play.h"
#include <string.h>
#include "ui_content_page.h"
#include "ui_data.h"
#include "ui_tokens.h"
/* 私有宏定义区 */
/* 绘制区几何(屏宽 160:波形区左右各留 20 px 边;高 90 px) */
#define WP_WX0 20 /* 波形区左边界 x */
#define WP_PX_PER_PT 3 /* 每点占宽(§8.1 阶梯线口径) */
#define WP_WTOP 34 /* 波形区顶 y(信息行下方) */
#define WP_WBOT 124 /* 波形区底 y(0 线最多贴到这里) */
#define WP_WSPANS 90 /* 纵向可用像素 = WP_WBOT - WP_WTOP */
#define WP_CUR_X (WP_WX0 + (UI_WAVE_WIN_PTS / 2u) * WP_PX_PER_PT)
/* 触发虚线光标 x(窗口正中,理由见文件头) */
#define WP_INFO_Y 20 /* 顶行(通道/段号/触发 + 削徽标)条带 y */
#define WP_HINT_Y 128 /* 倒数第二行(峰值/键位提示)条带 y */
#define WP_ENG_Y 143 /* 底行(单位徽标)条带 y(页脚已隐藏) */
#define WP_EMPTY_Y 60 /* 空态文案条带 y(近屏中部) */
/* 页面数据态:未取数前不画任何波形元素 */
#define WP_ST_IDLE 0u /* 未取数/无段(空态文案) */
#define WP_ST_OK 1u /* 段完整,可画波形 */
#define WP_ST_BAD 2u /* 段不可读(显式文案,绝不画线) */
/* 私有函数声明区 */
static void wp_load_seg(void);
static void wp_ensure(void);
static void wp_draw_text(lv_layer_t *a_layer, const char *a_text,
int32_t a_x, int32_t a_y, uint8_t a_align,
const lv_area_t *a_clip);
static int32_t wp_map_y(int32_t a_v, int32_t a_dmin, int32_t a_span);
/* 私有变量定义区 */
/*
* 通道名(ASCII 段名 = 语义取数层的通道语义名,页面自带表避免为了
* 六个字母再开一条注入边;与段头通道表的语义顺序一致:三相电压/零序/
* 三相电流在前,形状受限路按段头 conv 位区分——名字本身两端一致)
*/
static const char *const s_ch_names[UI_WAVE_CH_CNT] = {
"UA", "UB", "UC", "UN", "IA", "IB", "IC", "IN"
};
/* 触发源字母(值域 = 段头 trig_src;未识别给 '?' 不给猜) */
static const char s_trig_letters[] = { '?', 'M', 'P', 'T' };
#define WP_TRIG_MAX ((uint8_t)(sizeof(s_trig_letters) - 1u))
static uint8_t s_state; /* WP_ST_* 三态 */
static uint8_t s_idx; /* 当前段号(盘上编号,0..99) */
static uint8_t s_ch; /* 当前通道(上下键切) */
static uint8_t s_eng; /* 段头单位口径(只读徽标) */
static uint8_t s_trig; /* 段头触发源 */
static uint8_t s_clip; /* 段头形状受限位图(位号=通道) */
static int16_t s_codes[UI_WAVE_WIN_PTS]; /* 当前窗码值(执行侧已并偏移) */
static int32_t s_peak_milli; /* 窗口峰值 mV(执行侧算好) */
/* 函数定义区 */
/*
* 函数功能:取当前段的头与窗口(三态落到 s_state,坏态一律显式文案)
* 入口参数:无(读 s_idx / s_ch)
* 返回值:无
* 限定条件:仅在 uiTask 绘制/按键链内调用(经注入表触到执行侧)
* 函数说明:头都读不成时连顶行都不画——通道名以外的字段全来自段头,
* 缺一半字段还硬凑顶行等于把「读不到」伪装成「读到了」
*/
static void wp_load_seg(void) {
int rc = ui_data_wave_seg_head(s_idx, &s_eng, &s_trig, &s_clip);
if (rc != UI_WAVE_OK) {
s_state = (rc == UI_WAVE_BAD) ? WP_ST_BAD : WP_ST_IDLE;
return;
}
rc = ui_data_wave_seg_win(s_idx, s_ch, s_codes, &s_peak_milli);
if (rc != UI_WAVE_OK) {
s_state = (rc == UI_WAVE_BAD) ? WP_ST_BAD : WP_ST_IDLE;
return;
}
s_state = WP_ST_OK;
}
/*
* 函数功能:首帧懒取数(开页链零 I/O 的落地方式:真正的卷读取推迟到
* 第一次绘制——模拟器截图与真机重绘走同一条链,行为一致)
* 入口参数:无
* 返回值:无
* 限定条件:draw_cb 开头调用
* 函数说明:取不到段就停在空态;此后再按左右键仍会重试(手动录波从
* 触发到成段有一秒级延迟,页开着等段出现是回放页的正常用法,
* 不做「试过就没有了」的缓存)
*/
static void wp_ensure(void) {
uint8_t idx = 0u;
int rc;
if (s_state != WP_ST_IDLE) {
return;
}
rc = ui_data_wave_seg_first(&idx);
if (rc == UI_WAVE_OK) {
s_idx = idx;
wp_load_seg();
}
}
/*
* 函数功能:单行文本绘制(对齐可选;ui_page_action 私有拷贝同法,此处
* 多一个左/右对齐是因为顶行要把「削」徽标钉到右上角)
* 入口参数:a_layer - 绘制层;a_text - Flash 字面量;a_x - 锚点 x(对齐
* 含义:左=起点 中=屏宽轴 右=终点);a_y - 条带顶;
* a_align - 0 左 / 1 中 / 2 右;a_clip - 重绘区
* 返回值:无
* 限定条件:a_text 非空;条带与 clip 不相交即返回(culling)
* 函数说明:lv_text_get_width 必须传 strlen(传 0 不测量、传 -1 死循环,
* 框架同款警示);本 LVGL 版条带矩形给 lv_draw_label 做底色无关
* 文本定位用,字模颜色固定 UI_COL_FG
*/
static void wp_draw_text(lv_layer_t *a_layer, const char *a_text,
int32_t a_x, int32_t a_y, uint8_t a_align,
const lv_area_t *a_clip) {
lv_area_t band;
lv_draw_label_dsc_t ld;
int32_t w = (int32_t)lv_text_get_width(a_text, (uint32_t)strlen(a_text),
LV_FONT_DEFAULT, 0);
band.x1 = 0;
band.x2 = UI_SCREEN_W - 1;
band.y1 = a_y;
band.y2 = a_y + UI_TEXT_BAND_H - 1;
if ((band.x1 > a_clip->x2) || (band.x2 < a_clip->x1) ||
(band.y1 > a_clip->y2) || (band.y2 < a_clip->y1)) {
return;
}
lv_draw_label_dsc_init(&ld);
ld.base.layer = a_layer;
ld.text = a_text;
ld.text_static = 1u;
ld.color = UI_COL_FG;
ld.ofs_x = (a_align == 1u) ? (a_x - (w / 2))
: ((a_align == 2u) ? (a_x - w) : a_x);
ld.ofs_y = 0;
lv_draw_label(a_layer, &ld, &band);
}
/*
* 函数功能:顶行触发字母(越界值给 '?' 不猜)
* 入口参数:a_trig - 段头 trig_src 原值
* 返回值:字母 ASCII char
* 限定条件:仅绘制路径
*/
static char wp_trig_letter(uint8_t a_trig) {
return (a_trig <= WP_TRIG_MAX) ? s_trig_letters[a_trig] : '?';
}
/*
* 函数功能:码值域到屏幕 y 的线性映射(0 基线必在域内:域取
* 「min(0, 窗最小) .. max(0, 窗最大)」,削顶钉下轨的通道也能
* 一眼看出贴的是 0 线还是别的什么)
* 入口参数:a_v - 码值;a_dmin - 域底;a_span - 域高(域宽,恒 >0)
* 返回值:波形区内 y 像素(WP_WBOT = 域底,WP_WTOP = 域顶) int32_t
* 限定条件:绘制路径纯算术,零除由调用侧钳 span 保证
* 函数说明:整数乘除即可——域高不超过 65534,先乘后除无溢出风险
*/
static int32_t wp_map_y(int32_t a_v, int32_t a_dmin, int32_t a_span) {
return WP_WBOT - (((a_v - a_dmin) * WP_WSPANS) / a_span);
}
/*
* 函数功能:波形区自绘——阶梯线 + 0 线(虚线)+ 触发点虚线竖光标
* 入口参数:a_layer / a_clip - 契约见 ui_content_page.h
* 返回值:无
* 限定条件:仅 s_state == WP_ST_OK 时被调用;s_codes 已备
* 函数说明:阶梯 = 每点先画 3 px 水平段、再在点边界补一段垂直连线,
* 全程只有水平与垂直两种线段(1 bpp 抗阈值裁定的直接落地);
* 0 线与光标用 dash(ui_deco 先例只画过实线,dash 字段是 LVGL
* 线段 dsc 自带的,单色层同样按位落墨);整区一次 cull,区内
* 不再逐线判交——波形区就 120x90,逐线判交省不了多少,判错
* 反而留下半截线
*/
static void wp_draw_wave(lv_layer_t *a_layer, const lv_area_t *a_clip) {
lv_area_t band;
lv_draw_line_dsc_t ld;
int32_t vmin = s_codes[0];
int32_t vmax = s_codes[0];
int32_t dmin;
int32_t dmax;
int32_t span;
int32_t i;
int32_t y;
int32_t y_prev = 0;
band.x1 = 0;
band.x2 = UI_SCREEN_W - 1;
band.y1 = WP_WTOP;
band.y2 = WP_WBOT;
if ((band.x1 > a_clip->x2) || (band.x2 < a_clip->x1) ||
(band.y1 > a_clip->y2) || (band.y2 < a_clip->y1)) {
return;
}
for (i = 1; i < (int32_t)UI_WAVE_WIN_PTS; i++) {
int32_t v = s_codes[i];
if (v < vmin) {
vmin = v;
}
if (v > vmax) {
vmax = v;
}
}
dmin = (vmin < 0) ? vmin : 0;
dmax = (vmax > 0) ? vmax : 0;
span = dmax - dmin;
if (span < 1) {
span = 1; /* 全零窗:0 线与波形线重合贴在区底,诚实且无除零 */
}
lv_draw_line_dsc_init(&ld);
ld.base.layer = a_layer;
ld.color = UI_COL_FG;
ld.width = 1;
/* 0 线(虚线):恒在域内,永远画得出来 */
ld.dash_width = 2;
ld.dash_gap = 2;
y = wp_map_y(0, dmin, span);
ld.p1.x = WP_WX0 - 2;
ld.p1.y = y;
ld.p2.x = WP_WX0 + ((int32_t)UI_WAVE_WIN_PTS * WP_PX_PER_PT) + 1;
ld.p2.y = y;
lv_draw_line(a_layer, &ld);
/* 触发点竖光标(虚线):第 二十/廿一 点之间的点边界(见文件头裁定) */
ld.p1.x = WP_CUR_X;
ld.p1.y = WP_WTOP;
ld.p2.x = WP_CUR_X;
ld.p2.y = WP_WBOT;
lv_draw_line(a_layer, &ld);
/* 阶梯线(实线) */
ld.dash_width = 0;
ld.dash_gap = 0;
for (i = 0; i < (int32_t)UI_WAVE_WIN_PTS; i++) {
int32_t x;
x = WP_WX0 + (i * WP_PX_PER_PT);
y = wp_map_y((int32_t)s_codes[i], dmin, span);
ld.p1.x = x;
ld.p1.y = y;
ld.p2.x = x + WP_PX_PER_PT - 1;
ld.p2.y = y;
lv_draw_line(a_layer, &ld);
if ((i > 0) && (y != y_prev)) {
ld.p1.x = x;
ld.p1.y = y_prev;
ld.p2.x = x;
ld.p2.y = y;
lv_draw_line(a_layer, &ld);
}
y_prev = y;
}
}
/*
* 函数功能:单位徽标取词(只读 eng 选词,eng 不进任何算式——§6.3 口径;
* 未识别值按最保守的「引脚域」渲染,不猜高口径)
* 入口参数:a_eng - 段头 eng 原值
* 返回值:徽标文案(Flash 字面量) const char *
* 限定条件:仅绘制路径
*/
static const char *wp_eng_word(uint8_t a_eng) {
if (a_eng == (uint8_t)UI_DATA_ENG_SEC) {
return "二次值";
}
if (a_eng == (uint8_t)UI_DATA_ENG_PRI) {
return "一次值";
}
return "引脚域";
}
/*
* 函数功能:开页复位(框架 init_cb)——通道回到 UA、数据回到未取态
* 入口参数:无
* 返回值:无
* 限定条件:框架开页链内;只清状态零 I/O(懒取数在首帧绘制)
*/
static void pg_init(void) {
s_state = WP_ST_IDLE;
s_ch = 0u;
}
/*
* 函数功能:自绘(框架 draw_cb)
* 入口参数:a_layer / a_clip - 契约见 ui_content_page.h
* 返回值:无
* 限定条件:框架绘制链末尾调用
*/
static void pg_draw(lv_layer_t *a_layer, const lv_area_t *a_clip) {
char buf[UI_BUF_STRLEN];
wp_ensure();
if (s_state == WP_ST_BAD) {
wp_draw_text(a_layer, "该段不可读", UI_SCREEN_W / 2, WP_EMPTY_Y, 1u,
a_clip);
return;
}
if (s_state != WP_ST_OK) {
wp_draw_text(a_layer, "无录波段", UI_SCREEN_W / 2, WP_EMPTY_Y, 1u,
a_clip);
return;
}
/* 顶行:左 = 通道 + 段号 + 触发字母;右 = 形状受限「削」徽标 */
(void)lv_snprintf(buf, sizeof(buf), "%s SEG%u %c", s_ch_names[s_ch],
(unsigned int)s_idx, wp_trig_letter(s_trig));
wp_draw_text(a_layer, buf, UI_LIST_LEFT_X, WP_INFO_Y, 0u, a_clip);
if ((s_clip & (uint8_t)(1u << s_ch)) != 0u) {
wp_draw_text(a_layer, "削", UI_SCREEN_W - 1, WP_INFO_Y, 2u, a_clip);
}
wp_draw_wave(a_layer, a_clip);
/* 倒数第二行:左 = 键位提示(ASCII);右 = 窗口峰值 mV(定点,ASCII) */
wp_draw_text(a_layer, "UD=CH LR=SEG", UI_LIST_LEFT_X, WP_HINT_Y, 0u,
a_clip);
(void)lv_snprintf(buf, sizeof(buf), "PK%dmV", (int)s_peak_milli);
wp_draw_text(a_layer, buf, UI_SCREEN_W - 1, WP_HINT_Y, 2u, a_clip);
/* 底行:单位徽标(eng) */
wp_draw_text(a_layer, wp_eng_word(s_eng), UI_SCREEN_W / 2, WP_ENG_Y, 1u,
a_clip);
}
/*
* 函数功能:按键处理(框架 key_cb)——上下切通道、左右切段
* 入口参数:a_key - LVGL 键值 lv_key_t
* 返回值:true = 本页已消费;false = 交回框架 bool
* 限定条件:框架按键链内(ESC 不到这里;LEFT 因 key_intercept=1 先到这里)
* 函数说明:环游语义 = 上下在八路间绕回、左右在现存段间绕回;切段失败
* (卷忙/无邻段)保持当前画面不动——「按了没动」比「画面被
* 忙态清成空」诚实,忙不忙在回放页本来就不是用户要的答案
*/
static bool pg_key(lv_key_t a_key) {
uint8_t next;
int rc;
switch (a_key) {
case LV_KEY_UP:
case LV_KEY_DOWN:
next = (a_key == LV_KEY_UP)
? (uint8_t)((s_ch + UI_WAVE_CH_CNT - 1u) % UI_WAVE_CH_CNT)
: (uint8_t)((s_ch + 1u) % UI_WAVE_CH_CNT);
s_ch = next;
if (s_state == WP_ST_OK) {
rc = ui_data_wave_seg_win(s_idx, s_ch, s_codes, &s_peak_milli);
if (rc != UI_WAVE_OK) {
s_state = (rc == UI_WAVE_BAD) ? WP_ST_BAD : WP_ST_IDLE;
}
}
return true;
case LV_KEY_LEFT:
case LV_KEY_RIGHT:
if (s_state == WP_ST_IDLE) {
wp_ensure(); /* 空态下按左右 = 再探一次盘(新段可能已落) */
return true;
}
rc = (a_key == LV_KEY_RIGHT) ? ui_data_wave_seg_next(s_idx, &next)
: ui_data_wave_seg_prev(s_idx, &next);
if (rc == UI_WAVE_OK) {
s_idx = next;
s_state = WP_ST_IDLE; /* 先回空态再载,坏段不会留着旧画面 */
wp_load_seg();
}
return true;
default:
return false;
}
}
/*
* 页面描述符(外部链接:生成物 ui_page_registry.c 按菜单树 #page=wave_play 绑定引用)
* 查看页形态:无浅 V、无页脚(段号在顶行,页脚「共 N 页」与段号两套计数
* 反而打架)、不可选(单元素自绘页)、可编辑位 0(本页零写动作);
* key_intercept=1 是本页存在的理由级配置:LEFT 要拿来切上一段,不能让
* 框架默认的「LEFT 关页」吃掉
*/
const content_page_def_t ui_page_wave_play_desc = {
.id = "wave_play",
.title = "录波回放",
.hide_deco = 1u,
.hide_footer = 1u,
.selectable = 0u,
.key_intercept = 1u,
.edit_capable = 0u,
.init_cb = pg_init,
.draw_cb = pg_draw,
.key_cb = pg_key,
};
+29
View File
@@ -0,0 +1,29 @@
/*
* 模块名称:UI Page wave_play (录波回放内容页)
* 模块功能:记录查询 → 录波回放 叶子的内容页声明——向框架 ui_content_page
* 提供页面描述符;单通道阶梯波形回放,数据全走录波注入表
* (本模块零 App include、零存储触点、零波形算式)
* 适用平台:STM32F407ZGTx / PC 模拟器(两端共用)
* 作者:DTU 项目组
* 创建日期:2026-10-29
* 修改记录:
* v1.0 2026-10-29 DTU 项目组 创建(故障录波道 UI 侧;元素表 =
* docs/子系统设计/故障录波设计说明.md §8.1)
*/
#ifndef UI_PAGE_WAVE_PLAY_H
#define UI_PAGE_WAVE_PLAY_H
#ifdef __cplusplus
extern "C" {
#endif
#include "ui_content_page.h"
/* 页面描述符(定义在 ui_page_wave_play.c;生成物按菜单树 #page=wave_play 引用本符号) */
extern const content_page_def_t ui_page_wave_play_desc;
#ifdef __cplusplus
}
#endif
#endif /* UI_PAGE_WAVE_PLAY_H */