1 · 这块屏能显示什么
屏幕是 3.7 吋、240 × 416 的黑白快刷面板。设备内的帧缓冲是 1 bit: 每个像素只有「墨」和「纸」两种状态,没有中间灰。
面板本身有四组波形,驱动层也保留了灰阶接口,但本站的设备图与产品口径 都按黑白二值呈现——每张图只有 0 和 255 两个像素值, 这一点在构建流程里有断言守着。
这带来一条贯穿整套界面的设计约束:没有动画可用。 一次刷新就是一次决策,用户看得见自己「花掉」了一次刷新。 于是界面里没有转场、没有渐显、没有滑动惯性,所有反馈都得是静态的、 一眼看懂的——比如选中态画成描边框,而不是让它闪一下。
字号只有四档
固件在 12 / 16 / 20 / 24 四个像素尺寸上做了真实光栅化。传入不在表上的字号会 向下吸附到最近的可用档。这不是偷懒,是为了让「字号写错」的结果 始终是「最接近的意图尺寸」,而不是一屏空白。
12 px 的中文在这块屏上是糊的——四档都是真光栅化字体,但 12 px 时汉字的笔画 会落在同一批行上。所以界面底部没有任何低于 16 px 的字。
2 · 六块主界面
桌面是唯一的一级页,六个入口排在两行:阅读、漫画、音乐、有声书、日历、设置。 顶部常驻一张播放卡,底部常驻待办提醒。
播放卡为什么常驻
它曾经在底部,而且是条件显示的——没在播的时候就不见。这两件事错在同一处: 一个控件在某些时候换位置、某些时候消失,用户就得去找它。 现在它固定在顶部,静止状态下显示书库里停在哪里并标注「已停止」, 永远有东西可说。位置固定之后它从底部挪到顶部,腾出来的空间让图标网格 整体下移,而不是压缩图标。
待办只显示一条
底部显示的是优先级最高的未完成项,不是数量,也不是「有 3 项待办」 这种无法就地处理的措辞。下面那行提示只在待办超过一条时才出现, 它的职责是告诉读者「还有别的」,而不是把它们藏起来。 没有任何未完成项时什么都不画——常驻的「没有待办」和常驻的提醒是同一种骚扰。
3 · 触摸与按键
触摸手势
| 手势 | 含义 |
|---|---|
| 左滑 / 右滑 | 返回上一级。这是唯一的返回手势。 |
| 单击 | 确认、选择,或当前页面的播放 / 暂停。 |
| 长按 | 当前页面的上下文操作。 |
| 阅读页双击 | 打开目录。 |
| 阅读页上滑 / 下滑 | 下一页 / 上一页。 |
| 阅读页左半 / 右半单击 | 上一页 / 下一页。 |
触摸的命中区与高亮矩形是同一个矩形。曾经高亮画一个、判定用另一个, 结果出现了一个看不见的控件。
实体按键
| 按键 | 短按 | 长按 |
|---|---|---|
| 电源 | 屏幕休眠 | 深度休眠 |
| 音量 + / − | 音量增减 | 连续调整 |
| 播放 / 暂停 | 播放 / 暂停 | 停止 |
4 · 阅读器
支持 TXT 与 EPUB。目录、章节跳转、翻页、断电后回到上次位置。 字号四档可选,排版会按当前字号的实际步进重新分页——分页索引是在这套字上量的, 换字号就重新算,不复用旧的。
中文走国标扩展码表,所以非 UTF-8 的老文件不会乱码。英文与数字来自同一套字库。
分页不是按字符数算的
分页是按每行实际排完后的偏移量切出来的,而不是「一行放多少个字」。 中文标点有禁则处理——行首不能出现的字和行尾不能出现的字都会被挡住。 这就是为什么翻页时偶尔会有一行看起来偏短。
5 · 音乐与有声书
解码器按文件扩展名分发,音乐与有声书共用同一条播放路径,没有分叉。 书库里能选到的是 MP3 / FLAC / WAV。
局部刷新
播放中每 5 秒做一次受控的局部刷新,只重画进度与时间那几行。 整屏重刷会造成可见的闪烁,在墨水屏上尤其难受。
有声书按章记忆
有声书以「书 → 章节」两级组织,每一章独立记录进度。 回到一本听过的书时,设备知道你是「从上次那章继续」还是「从头开始」—— 因为「听完」和「没听过」在进度数字上是同一个值,必须另外记录。
6 · 漫画
两种格式:MOBI(内嵌图片,按页遍历)与 EPD(单页帧缓冲,大小须等于整屏)。 逐页栅格化之后重采样为 1-bit。
重采样用的是纯 box 平均。早期版本会把每块往该块最暗的像素拉 1/4, 结果是笔画变粗、白间隙消失,输出墨量虚高约 39%——在一块本来就是黑白的屏上, 「更黑」等于「更糊」。
7 · 日历与待办
月历带农历与节气,全部本地计算,不联网。
待办是一等公民,存在 TF 卡上,设备与网页控制台共用同一份数据。 归属规则有四个分支,缺任何一支都会出问题:
| 有日期 | 是否完成 | 出现在哪一天 |
|---|---|---|
| 无 | 未完成 | 每一天(常驻提醒) |
| 无 | 已完成且有完成戳 | 只在戳的那一天(归档进日历) |
| 无 | 已完成但无完成戳 | 不出现 |
| 有 | 无论完成与否 | 只在它自己那天 |
另有两条规则:
- 自动过期:1 星过期 1 天自动完成,2 星过期 3 天,3 星不过期。
- 完成的待办不删除,只归档。唯一的清理入口在网页端的「清除已完成」。
日历里待办只认小方块,点整行不算——整行的可触范围太大,容易误触。
8 · 电量与休眠
两级休眠,语义不同
- 屏幕休眠:关闭屏幕与音频,保留当前页面和选中状态。 任何触摸或按键只唤醒屏幕——强制一次全屏快刷,并清空刷新期间 积累的输入;之后的输入才执行页面操作。
- 自动关机:切断电源域,屏幕停在关机画面。
休眠时长可选 10 至 60 分钟;自动关机可选 20 至 60 分钟或「永不」。 「永不」存 0,是一个真选项而不是缺失值——三道闸门都显式放行它, 守卫写在分支上而不是把 0 钳到休眠时长,因为钳位会把「永不」悄悄变成一个真实截止时间。
电量是自学习估算,不是查表
设备没有电流传感器,只有 ADC。所以电量不是查一张表得来的,而是同时跟踪三个量: 本周期真正到过的峰值电压、开路电压包络、以及带迟滞的已报电量。 曲线用的是有出处的公开放电数据,60% 到 90% 段的误差从 −21 个百分点收敛到 −2 个百分点。
正因为是估算,设备不显示剩余毫安时——那会是一个看起来精确、 实际没有依据的数字。
9 · 网页控制台
设备内置 HTTP 服务,浏览器连上热点后打开一个单页应用。整个界面只嵌入两个文件, 没有前端框架。五个分区:概览、阅读、音频、网络、系统。
| 分区 | 能力 |
|---|---|
| 概览 | 设备状态、电量、TF 卡、版本、当前阅读与播放 |
| 阅读 | 书库列表、书籍上传、整本删除、封面、阅读器设置 |
| 音频 | 音频库、按类型筛选、上传、上传封面、整本删除、播放控制 |
| 网络 | 热点开关、连接路由器、扫描、清除保存、屏幕诊断、蓝牙 |
| 系统 | 电源、备份导出与恢复、在线更新、日历、待办面板 |
一个结构性约束
控件的颜色只由两个变量决定,每个主题各声明一次。 曾经待办行自己写了背景色,而夜猫子主题只覆盖了输入框的底色, 待办行挂在列表容器里根本不在那个范围内——结果深色页面上出现白底浅字, 文字和三个输入框糊成一片。
教训是:写死在选择器旁边的颜色,是主题永远改不动的颜色。 这条现在由一条遍历基础样式的测试守着,而不是手写清单。
10 · 无线与在线升级
热点与蓝牙互斥
开热点就关蓝牙,开蓝牙就关热点。这块板子装不下两个同时工作的电台: 试过提高 WiFi 发送缓冲,WiFi 不再失败,但蓝牙改用同一片内存后直接 malloc 失败。 所以这是一条硬件约束,被做成了显式的互斥而不是一个待修的 bug。
在线升级走公开仓库,匿名下载
固件不烧任何令牌。发布清单是一份四行的纯文本,包含版本号、下载地址、 SHA-256 与文件大小。下载后先校验,哈希对不上就绝不写入。 TLS 走证书校验,没有关闭校验的开关。
版本号按数字段比较:v1.11 比 v1.2 新,v1.9 比 v1.11 旧。 按字符串比较这两个都会判错。
11 · 数据与隐私
这台设备联网只做三件事:对时、检查更新、连你自己的 WebDAV。 除此之外它不主动请求任何地址。
| 什么时候联网 | 连到哪里 | 发出去什么 |
|---|---|---|
| 对时 | ntp.aliyun.com | 一次时间请求,不带设备标识 |
| 检查更新 | Gitee 上一个存放版本号的文本文件 | 一次 GET,不带任何本机信息 |
| 同步文件 | 你自己填的 WebDAV 地址 | 你自己指定要同步的目录 |
书、音乐、有声书、漫画都在 TF 卡上的四个目录里——
/阅读、/音乐、/有声书、/漫画——
不上传、不建账号、不做推荐。拔掉网络它照常用。
设备本身是一个 WebDAV 服务器:连上之后整张卡都能浏览和传输。 同步到哪里是你的 WebDAV 账号,设备不替你选,文件也不经过它。
WiFi 热点有口令。网页控制台只在设备自己开出的那个热点或局域网地址上工作, 不是一个暴露在公网上的服务。
12 · 已知限制
如实列出,包括设备本身还没修好的地方。
| 项目 | 现状 |
|---|---|
| 深度休眠后无法用电源键唤醒 | 电源键信号在这块板上无输出,必须断电重上电。这是硬件限制。 |
| 英文界面局部漏译 | 音乐播放页标题未走翻译,英文界面下仍显示中文;有声书页四个键的英文标签偏长,会互相压住。中文界面不受影响。 |
| 音频格式三处规则不一致 | 整理、列举、解码各自认一组扩展名,导致部分格式被整理进目录却在界面上看不到。 |
| 扬声器出声 | 尚未完全闭环,播放路径可用,功放链路仍在验证。 |





