fix(panel): M64 r1 P2-1 连续/批量按键被异步注入合并 — 改单 worker 串行队列
/api/key 改异步后每个请求起一个 detached 线程,N 次 press 全部落在同一段里;launcher 用
EVIOCGKEY 10ms 状态采样读键,重叠 press 只产生 1 个 DOWN 边沿 → 滑动调音量 5 步变 1 步、
batch 顺序语义失效。
- 新增 src/mp_keyq.{c,h}:常驻 worker + FIFO 队列。请求线程只 open + 入队后立即返回
(8080 仍不被阻塞);worker 按提交顺序逐个「按下→等待→抬起」,两次按键之间留
MP_KEYQ_GAP_MS(20ms)=2× 采样周期,保证每次按下都被采样到。
- 批次 = 一个作业:批次内顺序、批次间顺序都保证;payload 上限 MP_KEYQ_JOB_MAX=32。
- 有界等待:队列总时长预算 2000ms(含执行中作业),超预算/队列满立即回 503 BUSY,
无界等待(单核即挂死)被排除。
- mp_key.c:inject_key_seq() 统一 open+clamp+入队(-1 设备 / -2 队列忙),
api_key_single / api_key_batch 都走它;设备打不开仍同步报 500(原语义不变)。
- 测试 test_mp_keyq.c(宿主,不碰 /dev/input、不发 /api/key)反向控制:修复前的并发注入
5 连击被 10ms 采样器数成 1 次按下;修复后同一 5 连击数成 5 次且顺序一致;批次 3 个同键
tap + 紧随一个单键 = 4 次按下不丢步;超预算立即被拒、释放后可继续提交。
安全三条(P1-1/P1-2/P1-3)本轮一行未动。
This commit is contained in:
1 parent
7b32d775c0
commit
008e177307
6 files changed
+409
-40
No files matched your search
@@ -143,7 +143,7 @@ http://<host>.local:8080/
|
||||
| GET | `/api/apps/:pkg/export` | `nyai export` 下载流 | ✅ |
|
||||
| DELETE | `/api/apps/:pkg` | `nyai remove [--purge]` | ✅ |
|
||||
| POST | `/api/key/:code` | 按键注入(tap/long;`ms` clamp 0..1000;电源 116 已下线) | ✅(物理键红线内) |
|
||||
| POST | `/api/key` | 批量/顺序注入 | ✅ |
|
||||
| POST | `/api/key` | 批量/顺序注入(一个批次=一个串行作业) | ✅ |
|
||||
| GET | `/api/logs` | `MeowOS/logs` 文件列表(每文件含 `group` 来源分组) | ✅(无卡→503) |
|
||||
| GET | `/api/logs/crash` | **崩溃汇总**:解析最新 `crash_<bootts>.log`(meow_crash 落盘格式)→ 每实体崩溃数 + 最近崩溃时间/信号 + dmesg 计数 | ✅(无卡→503;无 crash 日志→空汇总) |
|
||||
| GET | `/api/logs/read?file=&lines=` | 读日志(上限 1000 行;`..`/绝对→403;敏感名→403) | ✅ |
|
||||
@@ -238,8 +238,12 @@ http://<host>.local:8080/
|
||||
(一条 `{"press":"long","ms":8000}` 即强制关机)。电源/关机只走 `/api/system/shutdown`(前端有确认弹窗)。
|
||||
- `tap`(默认,抬起间隔 80ms)、`long`(按住 ms,缺省 1000);`hold` → 501。
|
||||
**`ms` 全局 clamp 到 0..1000**(`mp_key_clamp_ms`),单键与批量同一上限。
|
||||
- 注入在**独立线程**里做按下→等待→抬起(`inject_key_async`):修复前是在请求线程 `usleep(ms)`,
|
||||
一个键请求就把单线程 8080 服务整段阻塞。设备 fd 仍由请求线程同步 open,打不开 → 500。
|
||||
- 注入在**串行队列**里执行(`mp_keyq.c` 单 worker + FIFO):请求线程只 open 设备 + 入队后立即返回,
|
||||
一个键请求不会阻塞单线程 8080 服务;worker 按提交顺序逐个「按下→等待→抬起」,两次按键之间留
|
||||
`MP_KEYQ_GAP_MS`(20ms) 间隔——launcher 读键是 10ms 的 EVIOCGKEY 状态采样,release 后立刻 press
|
||||
会被采样合并(连续 tap 退化成 1 次)。批次 = 一个作业,批次内顺序与批次间顺序都保证。
|
||||
队列总时长预算 2000ms:超预算/队列满立即 **503 `BUSY`**(不做无界等待,单核无界等=挂死)。
|
||||
设备 fd 仍由请求线程同步 open,打不开 → 500。
|
||||
- 局限:若 `/dev/input/event0/event2` 在设备上不可写(权限/路径差异),注入失败 → 500;注入为**即时性注入**,
|
||||
不在 launcher 内维护长按状态机(与实体按键的 `longpressed` 语义近似,见 README 已知边界)。
|
||||
|
||||
|
||||
Reference in new issue
Block a user