Skip to content

墨印 MoInk R1.3.4:电量不再「未连接」,删图不再卡 10 秒

Latest

Choose a tag to compare

@atunverse atunverse released this 20 Oct 08:28

墨印 MoInk 版本:R1.3.4

本版修三个实测问题:电量一直显示「未连接」、删除轮播图偶发 400 / 误删、
上传并刷新会白占轮播槽并磨损 flash。
顺手把删除从「搬移数据」改成「改一个标记位」,删除耗时从 10 秒降到毫秒级。
api 保持 2,分区表与帧格式零变动 —— R1.2.0 及之后可直接网页 OTA。
历史 Release 继续累积保留,不删除。


一、电量不再显示「未连接」

真因

旧实现要求跨请求连续 3 次采样有效才返回电压:

if (++s_valid < 3) return -1;   // 调用一次只加一

而 /api/info 每次只调用一次,控制页又只在打开时请求一次(没有任何轮询)
⇒ 计数器最多走到 1~2,永远到不了 3。所以打开设备页必定显示「未连接」,
手动多刷几次页面才偶尔出值 —— 这正是「经常未连接、偶尔正常」的原因,
跟分压电阻阻值无关(100k:100k 与 1M:1M 也都不影响)。

改法

  • 一次请求内连采 12 次取中位数,单次 /api/info 就能出稳定值;
  • 用极差(max - min > 500 mV)判断引脚悬空 —— 悬空时读数乱飘,极差极大;
  • 页面不加轮询:/api/info 会刷新 power_activity(),轮询会让设备永不休眠。
    页面仍只在打开 / 保存设置后各取一次,但这一次就能拿到值。

二、删除轮播图:从 10 秒到毫秒

原来的代价

旧实现删除后要把后面的槽整体前移一位:满 8 张时删第 1 张,要搬 7 个槽 ——

项 数值
擦除 7 × 32 扇区 = 224 扇区 / 896 KB
写入 7 × ~106 KB ≈ 742 KB
持锁时间 约 10 秒(期间按键、上传、图库列表全部排队)

这 10 秒就是「删除卡住 → 用户重复点击 → 携带过期索引 → 400 / 误删相邻照片」的根因。

现在的做法

NVS 里存一个 alive 位图(1 字节,bit i = 物理槽 i 有效),
逻辑序号 = 位图中第 N 个置位的物理槽:

  • 删除 = 清一位 + count-- / cur 修正,一次 nvs_commit、flash 零擦写、<20 ms;
  • 物理槽允许留空洞,不整理、不压缩;对外 slot 仍是逻辑序号(0..count-1),
    页面与既有调用方无需改动;
  • 上传新图优先写「末尾之后」的空位(等价于追加到末尾),末尾满了才回填最早的空洞;
    回填时 cur 用 st_phys2idx() 反查真实逻辑序号,不会指错图。
场景 R1.3.3 及之前 R1.3.4
满 8 张删第 1 张 ~10 秒,擦写 896 KB,全程持锁 <20 ms,flash 零擦写
不满 8 张上传 追加到末尾 追加到末尾(不变)
满 8 张删中间再上传 追加到末尾 回填被删的那个位置
删除途中断电 可能重复 / 丢一张 原子提交,最多「这张没删掉」
上传中断留半写槽 可能被当成有效图 位图未置位 → 自动不可见

删除失败能看懂了

R1.3.3 及之前所有失败都压成 400 bad slot,无法区分原因。现在:

状态码 含义
400 查询串缺失 / slot 非法
404 该序号当前不存在(多为页面索引已过期)
503 设备正忙(取锁超时,有上传或刷屏占用)
500 元数据提交失败 / store 分区不可用

控制页同时在删除 / 清空期间禁用 × 按钮并降透明度,失败后立即重拉图库让索引回正。


三、上传并刷新不再挤占图库(FB-018)

以前两个上传按钮都带 save=1,差别只是后者多了 noshow:想临时换一张图看看效果,
也会整槽擦写 128 KB、并占掉 8 个轮播位里的一个。攒几次临时图,图库就满了。

现在两条通道彻底分开:

按钮 请求 占轮播槽 刷屏 flash
上传并刷新屏幕 /api/frame(无 save) 否 是 零擦写
上传到图库 /api/frame?save=1&noshow=1 是 否 整槽一次(不可避免)

固件本来就有「无 save = 只显示不存」的语义,所以这是纯页面改动,api 不变;
只刷新的通道也顺手省掉了缩略图的生成与传输。

升级须知

  • R1.2.0 及之后可直接网页 OTA:设备页面「设置 → 系统维护与升级」,
    上传 moink_R1.3.4_app.bin 即可(分区表未变)。
  • R1.1.x 及更早必须线刷:用数据线整包刷 moink_R1.3.4_merged.bin。
  • 升级不重置设置:热点名 / 密码 / 屏型 / GPIO 接法 / 电源管理全部保留。
  • 已有轮播图自动迁移:老设备 NVS 里没有 alive 键,启动时按「前 N 槽有效」生成,
    与旧的物理连续布局逐槽等价,图不会丢也不需要重新上传。
  • 电量换算未变:100k:100k 与 1M:1M 的比值相同(×2.0),固件系数仍是 200/100,
    换电阻不需要改固件。若读数与万用表差得多,需按实测重标 BAT_FULLSCALE_MV。

兼容性

  • api = 2:16 字节帧头与 2bpp 载荷零变动,分区表零变动 → 可与 R1.2.x / R1.3.x 互刷。
  • 算法基线 B2 12/12 MATCH,色彩与几何规格未变。
  • 编译:RAM 39,692 B(12.1%)/ Flash 1,009,216 B(77.0%),0 告警。
  • 产物:firmware.bin 1,009,920 B / merged 1,075,456 B / zip 1,265,223 B。

资产说明

  • MoInk-FlashKit-R1.3.4.zip —— Windows 一键刷机包,解压双击 bat 即可
    (自动选串口、跳过蓝牙虚拟口);包内「使用说明.txt」含 V1~V10 验收清单。
  • moink_R1.3.4_merged.bin —— 固件整包(R1.1.x 及更早线刷用,0x0 写入,控制页已内嵌)。
  • moink_R1.3.4_app.bin —— OTA 升级包(R1.2.0 起网页升级用)。
  • page-R1.3.4.html —— 控制页热更包(网页上传,免刷机)。

版本校验

刷完在「设置 → 设备信息」应显示:版本 R1.3.4 / 接口 2。

真机验收清单(本版重点 V8 / V9 / V10)

  • V8 删除轮播图:图库放满 8 张 → 删第 1 张,应在 1 秒内完成(旧版约 10 秒);
    剩下的图顺序正确前移、不缺张不重张;再传 1 张应落到末尾;断电重启后顺序不变。
  • V9 电量显示:打开控制页,「设备信息 → 电量」应立即显示读数(不必再刷几次);
    连刷几次页面读数稳定,不出现「未连接」。
  • V10 上传通道分离:点「上传并刷新屏幕」→ 屏幕变、图库张数不变;
    点「上传到图库」→ 图库 +1、屏幕不动,双击设备按键能轮到它。
  • V1~V7 见包内说明(排线档引脚 / 电量 / 按键 / 唤醒来源 / 休眠 / 关机 / 定时唤醒切图)。

校验和(SHA-256 前 16 位)

资产 大小 SHA-256
MoInk-FlashKit-R1.3.4.zip 1,265,223 B 6cdab27f7cde5501…
moink_R1.3.4_merged.bin 1,075,456 B ff6d68c153dedde1…
moink_R1.3.4_app.bin 1,009,920 B 3c3943837fffab9f…
page-R1.3.4.html 169,046 B b12c5267d3f3d04d…