Repository navigation
Releases: autumnc/YanReader-pico
Release list
Yan Reader 1.9.4(研读 · 研墨 · 研行)
Yan Reader 1.9.4 · 硬件 E0470A01(684×1216)· ESP-IDF v6.1
承接 v1.9.3:修掉输入法「单字编码下词组抢位」和短码误学的问题。
一、单音节完整码下,词组不再抢单字
- 输入单音节完整码(如
fan)时,最近上屏的多字词不再插到单字候选前面,改为在单字之后追加。 - 单字占满候选预算(如
fan的 129 个单字)时,词组不会再抢首屏。 - 多音节输入(如
fan gai)的候选顺序不受影响。
二、短码命中的长码词条不再误学
- 候选完整码比已输入码长的多字词(例如打
shuru选输入体验),上屏后不再以shuru这个短码学习,也不计入「最近上屏」,避免下次输入时被顶上来。 - 通过模糊音别名整码命中的词条(如开了
sh→s时的suru)仍按整码正常学习。
应用镜像 0xa97080 字节,12M 分区余 12%。
Firmware:
pjournal_pico.bin: app imageyanreader-1.9.4-full.bin: merged image for flashing at offset 0x0
Yan Reader 1.9.3(研读 · 研墨 · 研行)
Yan Reader 1.9.3 · 硬件 E0470A01(684×1216)· ESP-IDF v6.1
承接 v1.9.2:修蓝牙自动重连“阅读模式下不重连”,以及 M1 小键盘键位与 SD 卡真实拔插加固。
本版随后又修了写作模式的 WebDAV / Flomo 同步与阅读模式的 Tab 切标签,并重新出包。
不需要清 SD,设置、阅读记录、书架缓存都照常使用。
一、蓝牙自动重连:改成“盯广播窗口”
现象是“蓝牙重连只在写作模式有效,阅读模式下不会自动重连”。查下来的病根不是内存:
阅读中发起重连时内部 RAM 完全够用,失败点在 BLE 层——每趟空等 30 秒后超时。
真正的原因是键盘那一头的节电行为:BLE 键盘掉线后不再广播,直到按键才重新广播
几十秒。旧版只有“盲连”(对不在场的设备同步阻塞 30 秒),三台配对设备轮着试,轮到
目标键盘要一两分钟,那几十秒的广播窗口多半整段错过。写作模式下人一直在打字,广播
窗口被不断续上——所以看起来只有写作模式能重连。
- 断连时改用在场扫描:低占空比(100ms 里开 20ms 窗)扫已配对设备,看到键盘在
广播就立刻连接,不再等退避。配对后改用随机地址(RPA)广播的键盘靠名字识别。 - 盲连退成每 3 分钟一趟的安全网(扫描正常时它每趟要占 30 秒射频,反而会错过窗口);
扫描起不来时仍按原退避节奏重连。 - 阅读模式、书架、写作模式都一样:键盘开机或按键后 1~2 秒内自动连上。
二、阅读模式 Tab 切标签
- 根标签界面(书架/应用/笔记/设置/统计)按 Tab 循环切换页签,一按就重画。
- 阅读页上 Tab 什么都不做(不会再把书页切走);浮动阅读菜单开着时切它的 4 张卡仍用 ←→。
- 被输入法当成「字母选字」键吃掉的 Tab 不再抢;目录、搜索等子界面与设置弹层不受影响。
三、M1 小键盘键位
- 方向键旁的「返回」键(AC Back)→ 阅读页无浮层时回书架,有菜单/脚注浮层先退一层;
其余模式退一层。 - 语音键 → Tab。
- 锁定键 → 大写锁存:按一下字母键持续大写,再按一下解除。
四、SD 卡真实拔插后不用再重启
- 卡检测(CD)改成三态采样并连续 3 次确认才认拔卡;一次 I²C 读失败不再被当成“无卡”
而触发退出书本 + 卸载存储。 - 重新挂载从“一次定终身”改成退避重试(立即、1/2/4/8/15 秒,之后每 30 秒封顶)。
- 挂载恢复后自动重开内容字体,卡回来后缺字不用重启。
五、写作模式 WebDAV / Flomo 同步不再“系统繁忙,请重试”
- 根因与网络无关:同步任务要 8~12KB 的内部 RAM 栈,WiFi/蓝牙起来后内部最大连续块
只剩 4~8KB,任务每次都创建失败。 - 内部栈建不起时改用 PSRAM 出栈(与 AI 对话同一套办法),收工后由界面那一拍释放;
实机验证同步能完成,PSRAM 回收干净、不泄漏。
刷机
网页刷机台(浏览器直接刷,无需安装工具):
https://autumnc.github.io/YanReader-pico/
整包 yanreader-1.9.3-full.bin 与仅应用 pjournal_pico.bin 都在本 Release 附件里。
刷机不清 SD 卡;本次没有改动任何缓存格式,不需要清缓存。
Yan Reader 1.9.2(研读 · 研墨 · 研行)
Yan Reader 1.9.2 · 硬件 E0470A01(684×1216)· ESP-IDF v6.1
承接 v1.9.1(3 笔提交):词典/AI 对话横屏排布、连蓝牙键盘默认不弹屏幕键盘、
M1 小键盘功能键映射,以及修 DeepSeek 对话“总是系统繁忙,请重试”。不需要清 SD,
设置、阅读记录、书架缓存都照常使用。
一、词典 / AI 对话横屏
横屏判定直接比较逻辑宽高(横屏 1216×684 / 竖屏 684×1216),不看方向字符串。
- 词典版式不变:查询框在上、词条内容在下,单栏整行。
- AI 对话改成聊天软件式单栏:对话内容在上、输入框在底部单行显示,状态行夹在
两者之间。输入框显示输入的尾部(光标在末尾),长问题打到后半句也看得见
自己在写什么;超宽时前加省略号。竖屏保持原版式。 - 横屏 AI 对话标题行右端多一个列表图标(三条横线):点开后从左侧弹出 1/3 屏宽
的抽屉,按编号列出本次对话的每一轮问题;点某一条跳到那一轮开头。Esc 先收
抽屉,点抽屉外面也收起;实体键盘上下键/翻页键翻列表,右上角带页码。
二、连蓝牙键盘默认不弹屏幕键盘(仅词典 / AI 对话)
- 没连蓝牙键盘:行为照旧,进屏直接弹出。
- 连着:进屏不弹;从上一屏带过来的展开状态会收起并整块全刷;屏幕浮提示一次
“屏幕键盘默认收起,点右下角键盘图标可展开”。 - 点输入框不会强行收起用户手动展开的面板;右下角键盘图标仍可随时手动展开
(“默认”而非“禁止”)。其余输入框(笔记、搜索、WiFi、OPDS…)未改动。
三、DeepSeek 对话:修“总是系统繁忙,请重试”
根因不是网络:AI 请求的 worker 任务要用 7680 字节的内部 RAM 栈,而固件是先连上
WiFi 才起任务的——连着蓝牙键盘时,WiFi 握手后内部 RAM 的最大连续块会塌到 1.5KB
那档,任务永远建不起来,界面上就是每问一次都“系统繁忙,请重试”。
- 内部栈建不起来时改用 PSRAM 出栈(xTaskCreateWithCaps),任务结束时由主任务
安全回收;worker 只做网络、不碰 SD/flash,可以安全使用外部栈。 - 建不起时串口会打一行内部 RAM 余量/最大块的警告,两条路都失败才显示错误。
四、M1 小键盘功能键
- 音量 + / 音量 − → PageUp / PageDown。
- 搜索键 → 模式切换(等同长按中间电容键,在阅读/写作/计划之间轮换)。
- 地球键 → 开关输入法(等同 Ctrl+Space)。
- 只对 M1 生效:遥控器/翻页器的音量键仍走用户在「按键映射」里的绑定,不会被写死
盖掉。M1 上认不出来的功能键会在串口打一行 usage 日志,方便后续补映射。
五、升级
整包刷 yanreader-1.9.2-full.bin(0x0 起),或只刷应用 pjournal_pico.bin
(0x10000)。网页刷机台:https://autumnc.github.io/YanReader-pico/
Yan Reader 1.9.1(研读 · 研墨 · 研行)
Yan Reader 1.9.1 · 硬件 E0470A01(684×1216)· ESP-IDF v6.1
承接 v1.9.0(1 笔提交):修蓝牙键盘“连上就断”。不需要清 SD,设置、阅读记录、
书架缓存都照常使用。
一、蓝牙键盘连接
根因不在信号:旧代码在每次连接前都异步删除本机的配对记录(LTK)。删除命令经常
正好落在“连上以后开始加密”的那一两秒里,协议栈认为密钥不存在,SMP 以
PAIR_AUTH_FAIL(0x50) 失败并断开链路——表现就是连上约 2~3 秒后又断开。更麻烦的是
它只删本机这一份,键盘那头还记着配过对,于是之后会拒绝重新配对,时好时坏。
- 连接前不再删配对记录;正常重连直接复用 LTK;真不匹配时由协议栈在认证失败时
自己清掉本机这份,下一次尝试走全新配对。 - 去掉上一版“配对失败就切 MITM”的兜底(实测这台键盘 SC + Just Works 即可;
MITM 需要用户输入配对码,而提示只在串口日志里,用户看不到)。 - 修一个保存设备名的 bug:加密失败时也会收到 HID 打开事件且名字为空,旧代码会
把扫描时存下的名称覆盖成 “BLE-xxxxxx”。 - 如果日志里仍反复出现 0x50,说明键盘里还留着旧主机记录,需在键盘上重新进入
配对模式(或删掉已配对设备)后再连。
二、扫描
- 扫描窗口结束时显式停扫(控制器到期本来也会停);进入扫描时防御性停一次,
收工后射频确保空闲,不干扰紧接着的连接。 - “添加设备”连点时不再先把已收集的列表清空;扫描未结束前重复点击直接忽略。
- 拆除蓝牙栈前先停扫。
三、升级
整包刷 yanreader-1.9.1-full.bin(0x0 起),或只刷应用 pjournal_pico.bin
(0x10000)。
Yan Reader 1.9.0(研读 · 研墨 · 研行)
Yan Reader 1.9.0 · 硬件 E0470A01(684×1216)· ESP-IDF v6.1
承接 v1.8.5:这一版给阅读器加了「应用」。阅读器「应用」页多出第五枚图标
应用商店,能装、更、卸 Lua 写的应用;第一个官方应用 AirPage 走原生服务
实现(电脑/手机网页上传图片,墨水屏上显示)。另外修好了从网络拿到的 BMP
上下颠倒的问题。不需要清 SD,旧的设置、阅读记录、书架缓存都照常使用。
一、应用商店(CrossStore)
阅读器 →「应用」→ 应用商店(第二排单独居中那一枚)。
- 商店列表 / 应用详情 / 已安装三页,触屏与实体键盘都能操作;下载、安装、
更新、卸载,安装包带 SHA-256 校验,版本号比较后才提示更新。 - 应用跑在 Lua 5.4 沙箱里(components/lua54),每个回调有 CPU 与宿主 I/O
预算:单回调 Lua 跑满 100 ms、宿主 I/O 累计 1.5 s 就关掉运行时并上屏报错,
不会把主循环卡死。画布、列表、触摸/按键、文字与图标渲染由宿主提供。 - 权限按应用清单在安装时写入授权文件;应用数据放在自己的 appdata 目录。
商店没有"改权限"的界面,所以每次进应用会检查一次授权文件,缺了按清单补写,
不会卡在"请允许…"那一页。 - 应用可以
reading.*查书与进度、reading.open(index)直接跳到阅读器、
打开书库/文件传输/OPDS、keep_awake(应用开着时不进待机,退出或崩溃时
无条件清掉)。
二、AirPage(第一个应用,原生服务)
- 在应用里显示设备专属上传网址(带屏尺寸与 gray16);浏览器打开后上传图片,
设备收到后整屏显示。历史每页 20 条,可回看、重设为当前、设为休眠壁纸。 - 没有消息推送通道,实时接收退化为"应用打开时每 20 秒拉一次";开关打开时
进应用立刻拉一次。下载、归档、重建历史都在后台任务里做,界面只读内存。 - 修 "application I/O budget exceeded":原来状态查询在 Lua 回调里顺手收
下载结果、重建历史、起轮询,第一次连 WiFi 能把主任务顶住一两秒,单回调
1.5 s 的宿主预算直接爆掉、应用被关。现在轮询由宿主在派发回调之前跑,
状态查询只返回内存里的值;权限查询也在进应用时缓存一次(原来一个历史页
要重复打开几十次 SD 权限文件)。 - 壁纸直接指向下载的 BMP,解码路径与阅读器封面相同。
三、BMP 行序:网络图不再上下颠倒
浏览器上传的是标准 BMP——正 biHeight 表示像素行从下往上存;本仓自己写的
BMP(封面转换、缓存)全是负高度的 top-down,所以解码器以前没处理这个标志。
从网络拿到的图会整幅上下颠倒(文字倒过来,看着也像左右镜像)。
现在 bottom-up 文件按行号逐行定位,调用方拿到的永远是 top-down 行序。
AirPage 的图片与休眠壁纸一起修好;书架、封面缓存不受影响。
四、诊断与周边
- Lua 运行时错误不再只上屏:串口日志会打"回调 xxx 报错: main.lua:45: …";
单个回调宿主 I/O 超过 500 ms、单条 airpage 命令超过 100 ms 时会点名。 - 编辑器保存确认框增加 C = 取消(只关对话框,留在编辑器继续改)。
- 异步任务可建在 PSRAM 栈上:拉图要连 WiFi,连上后内部 RAM 的大块只剩
1~2 KB,内部栈根本建不出来。 - WiFi 启动失败时日志带上内部 RAM 余量与最大块;
esp_wifi_connect的
"sta is connecting" 不再当失败,继续等 IP。
五、已知 / 待办
- 应用商店与 AirPage 都需要联网;AirPage 依赖 airpage.crossmux.cn 可达。
- 商店里的 weread / pixel 两个应用仍是空壳,打开只提示。
app.input目前只弹提示,应用还不能自己弹输入框。- 阅读中家族字体面的字形位图缓存被挤小的问题、SD 写积压导致的欠载,均不在本版。
Yan Reader 1.8.5(研读 · 研墨 · 研行)
Yan Reader 1.8.5 · 硬件 E0470A01(684×1216)· ESP-IDF v6.1
两处实体键盘相关的改进和一处蓝牙管理页的触摸修正。设置项只增不改:老机器上
没有的新键按默认值走,不需要清 SD,也不影响阅读记录。
一、设置 → 输入法 → 「字母选字按键」(原「Win键字母选字」开关,改为选择器)
有候选时按一下选定的键,候选序号从 1..9 换成 q..o,直接按字母选字上屏。
- 可选:Win(左右均可,默认)/ 左Win / 右Win / 左Ctrl / 右Ctrl / 左Alt /
右Alt / 左Shift / 右Shift / Esc / Tab / 关闭。 - 修饰键只认单击(按下又抬手、中间没按别的键):Win+字母这类系统组合键
不会误触发。没被选中的左 Shift(单独设了别的键时)保留原来的"单击中英切换"。 - Esc/Tab 是普通按键:输入法有候选时才接住进入待选;没有候选时保持原义
(Esc 关闭/返回、Tab 换字段),不会把正在打的编码清掉。 - 旧设置值自动兼容:原来的开 = Win(左右均可),关 = 关闭。
二、设置 → 输入法 → 「长按输入符号」(新,默认开)
长按 = 按住 sym(Shift)再按这个键,输入键帽上印的符号;短按仍是原字符。
- 标准键盘:数字行与标点键走上档(1→!、,→<、/→? …);字母长按仍是自动重复。
- Mospace M1 Keyboard 这类手机式小键盘(BLE 名 "M1 Keyboard"):没有数字排,
数字/符号印在字母键帽上,长按字母键也生效:
Q1 W2 E3 R4 T5 Y6 U7 I8 O9 P0 / A- S/ D: F; G( H) J$ K' L" / Z% X& C* V? B! N, M.
这张表只在该设备名连接时生效,普通键盘完全不受影响。 - 实现上先挂起、抬手才发:按下即发再"退格改掉"在墨水屏上要刷两次,而且输入法
把键吃进编码/选词后退格会误删别的内容。按住超过 3 秒的丢键兜底会补发符号,
不会让这一键凭空消失。 - 空格 / 回车 / 退格 / Tab / 方向键不受影响。
三、M1 小键盘特殊键修正(仅对 "M1 Keyboard" 生效)
M1 在 Windows 模式下发的是系统快捷键,以前会漏成字母:
- Esc 键实际发 Win+D → 重映射为 Esc(返回/关闭),不再往正文里塞 d。
- ⇧(大小写切换)键实际发 Caps Lock → 按本机左 Shift 单击的老语义处理,
编辑器内切换中英。 - 屏幕锁定(Win+L)、语音输入(Win+H):本机没有对应动作,吞掉,
不再输出 l / h。
四、蓝牙管理:点扫描列表里的设备不再误关蓝牙
扫描页没有开关行,但扫描列表第一行的位置与已配对页的开关行重合,所以"点第一台
设备"会被开关行截走、变成关蓝牙(之前用中间确认键才能连上)。现在:
- 开关行只在已配对页响应。
- 扫描页点哪台连哪台;点在标题/空白上不再拿旧选中项去连一台没点中的设备。
键盘 Enter 没有落点,照旧连当前选中项。
五、已知 / 待办
- M1 的映射按它 Windows 模式下的 HID 报告写死;若切到其它系统模式,键值可能不同。
- M1 的 ⇧ 键当前是「中英切换」。若更希望它真的输入大写字母,需要另行调整。
- 阅读中家族字体面的字形位图缓存被挤小的问题、SD 写积压导致的欠载,均不在本版。
Yan Reader 1.8.4(研读 · 研墨 · 研行)
Yan Reader 1.8.4 · 硬件 E0470A01(684×1216)· ESP-IDF v6.1
一处提交、两处界面字号微调:书架列表行与阅读页状态栏都小一号。纯版面调整,
行为、设置项、缓存格式一个字都没动 —— 刷机不需要清 SD,也不影响任何阅读记录。
一、书架列表:字号小 6px,书名只显示一行
- 列表样式(设置 → 阅读 → 样式 → 列表)行内文字(书名 + EPUB/TXT/XTC 后缀)比其它
外壳界面小 6px:默认字号下 42→36。 - 书名从最多两行改成单行,超宽按字宽截断。长短书名混排时折成两截一屏节奏很乱,
单行扫起来更齐。 - 行高与左侧封面缩略图大小不变:行高同时决定缩略图高度,往下收会让封面先糊。
- 「书内嵌字体」模式下字号不缩(内嵌字面按本书正文子集化,书名里的字它多半没有),
但单行书名照旧生效。
二、阅读页状态栏:字号小 4px
- 时钟 / 书名 / 章节名 / 页码 / 百分比 / 电量都比外壳小 4px:默认字号下 42→38。
- 基线按新的行盒在状态带内垂直居中,整体落点几乎不动(只高 1px)。
- 状态带高度没有变:footerH/statusTop 是正文排版基准,缩带子会重排每页行数、
连带页码与书签;这里只缩字,所以翻页位置、书签、阅读进度全部原样。 - 同样,书内嵌字体模式下状态栏不缩。
三、已知 / 待办
- 字号三档跟随「设置 → 通用 → 字号」(46/42/38)整体缩放,未新增设置项。
- 阅读中家族字体面的字形位图缓存仍可能被挤到几 KB(每页 2 秒级),仍在排查,不在本版。
- 欠载的根因(SD 写积压)仍未治;「打字残影」相数旋钮同上版,默认 8 相不变。
Yan Reader 1.8.3(研读 · 研墨 · 研行)
Yan Reader 1.8.3 · 硬件 E0470A01(684×1216)· ESP-IDF v6.1
承接 v1.8.2(4 笔提交):主线是输入法逐键那一拍(编码区/候选区)的残影,做法换了一次
——上一版试的"高推力大表"效果对但每键 330/410ms,这一版改成只买推力、不买废相的专用表;
另外把上一版已提交但没上机的三件事一起带上:阅读线逐行画(空行也有线)、
实体键盘按一下 Win 键用字母选字、以及两个设定调整(阅读模式默认竖屏、
输入法回车只上屏编码)。
本版没有改动任何缓存格式 —— 书架封面 / 待机封面 / 书内插图缓存 / book.bin 的版本字节
一个字都没动,刷机不需要清 SD。
一、打字残影:编码区/候选区那一拍改成"擦白满推 = 相数"的专用表
症状是手不停的时候就能看见的那层旧字痕:候选栏每敲一键整排换字、编码行跟着变,
而那一拍走的是 8 相跟随表 DU —— 它的 to=15 行对 from<15(旧黑字变白)只推 8 次,
够不到白轨,擦不干净就留在那儿。
- 先试过换 GL16 大表(8 灰阶 + 擦除加强借满 21 次 / 37 相默认表 18 次):效果确实好,
但每键 330/410ms,判定"响应太慢,没有实用性",两档已下线。 - 根因:本机剂量 ∝ 面板时间 —— 每相就是一张整帧(11090µs 的标定行周期 × 701 行),
像素只在 CKV 高时被充、而 CKV 时长 ∝ 帧周期;区域刷也不省时间(整个面板照扫)。
所以"加多少擦除推力"和"花多久"是同一个旋钮,没有第二条路。 - 而且它必须一次到位:旧字那块像素在它变白的那一帧吃 n 次推白,下一帧它在参考帧里
已经是白、差分编成"不变",而跟随表这一格是全保持 —— 那一拍起它不再被驱动。
攒着分几次推没有意义。 - 新表
E0470_IME_WAVEFORM:和跟随表同一条公式,只把擦白那一侧的满推从 8 抬到 n
(相数)。压黑那一侧仍是 7 —— 新字的黑与现状逐位一致,所以屏幕上唯一会变的就是旧字痕。
表里没有一个空相,也没有一相是白花的。 - 设置 → 输入法 → 「打字残影」:
现状(跟随表8相)/12相(≈133ms/键)/
16相(≈177ms/键),默认 8 = 本版之前的行为了,逐字节一致。 - 8 是地板,不是保守值:8 相就是跟随表本身(也就是改动前一直在用的那张),再往下只是
"擦得更不干净、只快几十毫秒"。上限停在 16。
代价是按每一键付的(12 相 ≈133ms、16 相 ≈177ms 的刷屏时间)——这是拿延迟换擦除干净,
不是免费的提速;不想付就别动这一项。
二、阅读线:每行一条、按本行基线画(空行也有线)
上一版从词表反推行位置,把"下一行基线 − 本行基线"当本行行距用 —— 那个差值里还混着
下一行的位置(段距补出来的空行、段末、图片都会让它凭空变大),于是线忽高忽低;而空行没有
任何词,直接被跳过,段距那一格连一条线都没有。
- 排版那一刻本行的基线 y 本来就是现成的(EPUB 走
yPos + ascender,TXT 是逐行推进),
现在把它按行记下来,阅读线逐行走这个 y,空行照样占一条。 - 偏移一律按正文字体算 —— 整页一个偏移才是"均匀"的前提。行距 1.0 时线正好压在行盒底,
与上一版在正常行距下的落点完全一致,改的只是它不再被下一行的位置带跑。 - 虚线线型与灰度没动;XTC(整页位图)本来就没有"行",不受影响。
三、实体键盘:按一下 Win 键,候选序号变成 q..o,字母直接选字上屏
- 有候选时按一下 Win/Cmd,候选条序号从
1. 2. 3.变成q. w. e.,直接按字母选中并
上屏那一条。一次性:下一个字母选完就结束;再按 Win / 退格 / 回车 / Esc 取消。 - 只在实体键盘输入时生效:屏幕上的虚拟键盘一切照旧(序号仍是数字、键面不带这个行为)。
这条是结构性成立的,不靠判据维持 —— 虚拟键盘那三条入口各撤一次旗。 - 实现上不是"输入法多了一个模式",只是把这一次按键重解释一下:待选期间 q..o 当 1..9,
于是原有每一处数字选字分支一行都不用改。不在 q..o 里的字母(a/z 等)照常当拼音码接着打。 - 覆盖所有实体键盘能打字的地方:编辑器、计划/润色、灵感、阅读模式的笔记/词典/搜索/WiFi/
OPDS/AI 对话、设置里的输入框。 - 可在 设置 → 输入法 → 「Win键字母选字」 关掉。
四、两个设定调整
- 阅读模式默认竖屏(原来是横屏)。改之前存过这项的机器不受影响,存的还是自己挑的那档;
阅读器菜单里照旧可切,退出时恢复全局方向。 - 输入法回车 = 上屏编码,不再"候选高亮开着时回车选高亮那条"。原来回车的语义跟着一个
显示开关走,用户侧就是"有时候回车把字选了、有时候把拼音送上去了",同一个键在同一句话里
语义会变,记不住。现在选字只剩两条路:空格与数字键(含上面的 Win 键字母选字)。
五、已知 / 待办
- 「打字残影」的 12/16 相是按每一键加 133/177ms 的刷屏时间,是否值得按各人手感定,
默认不动(8 相)。要量的话:设置 → 显示 → 打开「界面性能日志」,看串口的
打字帧: 输入法条 … 刷屏 Nms(相=N 跳相=M …),刷屏应 ≈ 相 × 11.09ms。 - 阅读中家族字体面的字形位图缓存仍可能被挤到几 KB(每页 2 秒级),仍在排查,不在本版。
- 残影的另一条机制(推屏欠载连着两次之后"永不退",只有整屏全刷能清)v1.8.2 已让它自动重锚;
欠载的根因(SD 写积压)这一版仍未治。
Yan Reader 1.8.2(研读 · 研墨 · 研行)
Yan Reader 1.8.2 · 硬件 E0470A01(684×1216)· ESP-IDF v6.1
承接 v1.8.1:两件事 —— 书签变成阅读页里的第一等动作(右上角一枚实心书签就是"这一页
有书签",下滑一划加上、上滑一划删掉),以及局刷残影"永不退"的真机制修掉(欠载连着
两次之后,面板与参考帧悄悄错开,而差分刷的驱动范围每趟现算 —— 那些像素从此不进任何一趟
的驱动范围,只有手动整屏全刷能清。这一版让它自己重锚)。
本版没有改动任何缓存格式 —— 书架封面 / 待机封面 / 书内插图缓存 / book.bin 的版本字节
一个字都没动,刷机不需要清 SD。
一、书签:下滑加、上滑删,右上角那枚图标就是反馈
原来在阅读页加/删书签只有一条路:点中间 1/3 出浮动菜单 → 进「书签」页 → 加/删;更糟的是
加完屏上什么都不变,读者无从确认"这一页到底加没加过"。
- 阅读页右上角一枚实心书签 = 这一页有书签。它是加/删的实时反馈:下滑一划加上、
上滑一划删掉;图标当场出现/消失,不弹提示、不整屏闪。 - 一次上滑直接删,不二次确认(误删的代价就是同一页下滑一次补回来);"没得可做"时
(已经加过还下滑 / 本来没有还上滑)静默不做 —— 一个像素都不动,也不翻页。 - 触屏竖滑从此不翻页。触屏翻页仍有:点按左/右 1/3、左右横滑、两侧电容键、
BLE 翻页器。翻页器与蓝牙键盘的 PageUp/PageDown 照旧翻页(手势只认触屏,靠"有没有
按下点"区分)。 - 「书签」页重做成"本书书签 + 工具"一屏:一条可折叠的「书签 (N)」分组行,展开挂着
本书的书签(两行一条:章名 / 位置读数),下面是添加/删除书签、脚注、目录、排版设定
这些工具项。别的书的书签在这屏任何状态下都不出现。 - 顺手修掉一个真 bug:书签身份原来用"页内可见文本偏移",而那一格在该页没有记录时是
UINT32_MAX这个哨兵(不是身份)—— 同一章里所有这样的页会塌成同一个身份,第 5 页
的书签在第 9 页也亮图标、在第 9 页上滑删掉的是第 5 页那条。现在两边都有真偏移才比
偏移,否则退回比页号。
二、残影"永不退":推屏双欠载之后,下一趟整屏全像素 GC16 重锚
现象是"局刷隔一阵子就出现叠影,像前一页还没清、后页直接叠上去了,后续再翻页仍然是这样,
手动全刷一次就好了"。它与四档「残影治理」(擦除 / 白推 / 压黑)无关 —— 那条是整页
均匀浅影、还会慢慢退;这条是成条带状的整片旧页内容、永不退。
- 推屏欠载那一趟供数断了,被饿死的行喂"保持"、屏上留上一帧像素;而 epdiy 只在成功时把
新帧抄进参考帧 → 面板实际内容已经不等于参考帧,且没人知道差在哪。 - 本该下一趟整屏重驱动自愈,但差分刷的驱动范围不是从"面板实际状态"算的,而是每趟重新
按"新帧 ≠ 参考帧"标一遍 —— 于是"面板留着旧像素、参考帧却和新帧一致"的像素从此进不了
任何一趟的驱动范围,波形表上编成"全保持",屏上那点像素一动不动。只有整屏全像素 GC16
能清,这就是"手动全刷一次就好"。 - 触发条件是欠载连着两次(欠载那趟 + 兜底的那记整屏 GC16 自己也欠载;兜底原来只试
一次、不成就算了)。现在:兜底亦欠载就挂账,下一趟阅读页推屏不问档位直接整屏
全像素 GC16 重锚,并顺手把白底那笔账取掉。重锚若又欠载,账继续挂着、下一拍接着试
(退开一拍正好让 SD 积压排空)。 - 欠载的根因这一版没治(日志点名的仍是
reader_progress.txt那条 SD 写):双欠载的
概率没变,变的是后果 —— 从"只能手动全刷"变成"下一趟自动重锚"。 - 这条没法主动触发,只能在正常阅读时看日志里那两行标记(兜底那句尾部的"兜底亦欠载"与
消费点的"参考帧可疑…整屏 GC16 重锚")。
三、已知 / 待办
- 书签那套的 12 条上机验收还没在真机上跑过;已知待观察的是右上角图标会不会压住第一行
行末的注音(注音墨迹可升到 y≈14~30,与图标所在的 [6,47] 条带叠)—— 真机上若碍眼,
把图标收小或改画右下角。 - 阅读中家族字体面的字形位图缓存仍可能被挤到几 KB(每页 2 秒级),已在排查,不在本版。
Yan Reader 1.8.1(研读 · 研墨 · 研行)
Yan Reader 1.8.1 · 硬件 E0470A01(684×1216)· ESP-IDF v6.1
承接 v1.8.0:内嵌多字体的书翻页慢 —— 一记翻页 3.44.4 秒,而"指定字体"的书只要1.9s**。
1 秒出头。这一版把根因掐掉,《修订版晋书》epub_307925051 实测 **3.4s → 1.3
本版没有改动任何缓存格式 —— 书架封面 / 待机封面 / 书内插图缓存 / book.bin 的版本字节
一个字都没动,刷机不需要清 SD。
根因:位图缓存被阅读器自己的帧缓冲挤成"棘轮"
- 字形位图缓存的天花板是
min(缓存 + (空闲 − 1536K 留量线), 静态上限)。空闲掉到留量线
以下时额度正好等于当前占用,于是"腾地方"变成每次插入都要做的事:判据实际做的是
每插一个字形就淘汰掉同等字节。 - 要命的是条目(1.8KB/CJK)常比新插入的字形(标点/拉丁 ~200B)大:每插一个净缩水
v − extra,一页就啃掉一两百 KB,最后只剩一个格子。实测塌陷 275K→210→66→2→0K,
位图命中 0%,单帧绘制 1380ms。 - 推它下去的不是别人,是阅读器自己的帧缓冲:常驻首帧 2×415872 + 预渲染备用帧缓冲
415872 = 1.24MB,落在 free≈1.5MB 的窗口里就把 free 压到留量线以下 —— 所以冷开第一本
书最容易中招(书架上待过一会儿、多一个封面缓冲就正好差那 380KB)。这就是"重启才快"。
修法
- 零余量时按字节腾:新增 best-fit 挑牺牲品 —— 腾出来的字节数最接近还差多少,同样接近
时先淘汰老的(同尺寸条目上退化成原来的 LRU,而正文绝大多数条目尺寸相近)。缓存保住大小
并且继续轮换,新页的字形照样进得来。 - 装不下一页就不做栅格化预热:设一页 N 个字形、缓存装得下 K 个,热身+绘制 = 2N−K,
不热身 = N —— K < N 时热身是净亏,亏 N−K 次栅格化。判据是"缓存还剩多少能装",低于
一整页(640K)就跳过。IO 预热一个字不动:块缓存不受留量线影响,96~99% 命中率原样保留。 - 关掉书内家族字体时把它的块缓存真还回去:以前关掉也攥着不放(
unload只清表不放块),
"开书那一刻的余量"就只够让位图缓存长到一半。实测第二次开书缓存从 142K 变成 418K。 - 家族字体的块缓存槽位按实测缩(48→24 / 新增 16 槽),省的 256KB 全落进"开书那一刻的
余量"里。 - 块缓存分配失败改成 2 秒退避:原来是"给了就永远不再试",一次临时的 PSRAM 碎片化会把
整本书锁死在"逐块直读"上,每页多几十~几百毫秒且毫无提示。
实测(《修订版晋书》epub_307925051,冷开 + 前后翻页,两场采集)
| 修前 | 修后 | |
|---|---|---|
| 位图缓存 | 275K→210→66→2→0(塌) | 285→271K / 222→213K(稳住) |
| 位图命中 | 0% | 36–70% |
| 单帧绘制 | 668–1380 ms | 642–1087 ms |
| 备页 | 1965–2208 ms | 1172–1941 ms |
| 本帧 | 3440–4412 ms | 1226–1995 ms |
护栏全绿:预渲染块命中率 98–100%、正文面轮峰 44–87(槽位 128)、常驻首帧恒 2 格、
无 PSRAM 还拿不到、无 line buffer underrun。
已知(下一版处理)
- 一次开书连续读几百页之后,位图缓存会缓慢缩小(实测约 1KB/页),翻页会慢慢退回偏慢
那一档。退出书名再进、或换一本书,即恢复 —— 帧缓冲释放后余量回到正常水位。
根因还没解:零余量下每次插入腾出来的字节总是不小于要插的那一个,所以缓存只减不增;
要给它一个硬地板,得同时降留量线与持帧闸门,那是一次内存水位改动,单独做。