【中科蓝讯】TWS 按键问题单复盘

一、写在开始 我参与的是一款基于中科蓝讯 BT8910 的 TWS 耳机品牌项目,目前这个项目已经完成。 项目结束后,我想把开发过程中接触到的 Jira 问题单重新梳理一遍。其中既有我参与处理的内容,也有同事负责的模块。 现在查一个函数、一个配置项并不难,真正值得记录的是:面对一个问题现象时,应该先判断哪一层,为什么往这个方向查,以及怎么通过日志一步步缩小范围。 所以这次复盘不是给出一套标准答案,而是站在我目前对应用层的理解上,把问题现象、判断过程和排查思路整理下来,供遇到类似问题的同学参考。 整理过程中我还发现,很多反馈看起来不一样,根因却有重复。按根因归类后,下次遇到类似现象时,就可以先判断问题属于哪个环节,再沿对应链路往下查。 后续我会继续按模块整理项目中的问题单,包括按键、提示音、机盒通信、ANC、音量控制、功耗管理、出入盒、双耳同步、蓝牙问题和连接问题等内容。这一篇先从按键开始,归纳其中比较常见的 4 类问题。 阅读提示 全文约 2 300 字,预计 10 分钟读完。 本文包含 4 类按键问题:完全无响应、场景功能错误、误触,以及复杂手势互相干扰。重点不是讲基础原理,而是遇到类似反馈时,应该先查哪里、再往哪里查。 本文只讨论按键链路本身。如果按键已经触发正确功能,只是提示音没有播放或播放不对,就归到后续的提示音问题中。 二、所有手势都没有反应 客户反馈 其中一只耳机的触控按键完全无效,双击、三击、长按都没有反应。 排查思路 第一步:确认触控输入 先看这只耳机的触控按键是否有按下、松开的日志。 没有日志:先查这个触控按键的输入本身,例如触控是否启用、耳机是否在盒内、是否正处于禁键时间、触控阈值或通道是否正常。 有日志:说明这个触控按键已经有输入,继续往下查。 第二步:确认手势识别 再看目标手势有没有识别出来。 没有识别出来:重点查双击间隔、长按时间、松手后状态是否复位,以及组合手势是否把普通手势挡住了。 识别出来:说明手势已经产生,继续看功能。 第三步:确认功能消息 最后看手势有没有转换成正确的功能消息。 没有、为空或错误:查按键定义、场景切换和配置更新。 有正确消息:再确认功能处理是否执行;如果功能已经执行,后面只是没有提示音,就属于提示音问题,不再按按键问题处理。 判断与处理 “完全无效”不一定是触控硬件问题,也可能是手势已经产生、但后面没有正确链接到功能。处理时不要一开始就调灵敏度或改功能定义,先通过日志确认问题停在哪一层。 三、同一手势,功能却错了 客户反馈 听歌时双击正常,来电时双击却不能接听或挂断。 长按在听歌时能切换功能,到响铃或通话时却失效。 App 改完触控后,耳机执行的功能不对。 排查思路 第一步:固定一个场景复现 只测听歌、只测来电响铃,或只测通话,避免混在一起判断。 第二步:确认手势已经识别 如果手势都没出来,回到第一类问题排查。 第三步:核对当前场景的功能 手势正常后,直接看耳机最后想执行的是什么功能。 同样是“双击”:听歌时可能是切歌,来电时应该是接听或拒接,通话中又可能是其他操作。 来电时双击却去切歌:说明双击识别没有问题,只是耳机还在按“听歌时的规则”处理。 只有通话异常:重点检查进入通话后,双击和长按是否已经改成通话时该做的功能。 App 改完才异常:重点检查新设置是否把听歌、来电或通话时的功能改错了。 判断与处理 听歌、来电响铃、通话时都可以识别同一个“双击”或“长按”,但后续要执行的功能并不相同。 这类问题通常是耳机没有按当前使用状态执行对应功能。处理重点是把每种状态下的功能对应关系确认清楚。 四、不该响应时仍然响应 客户反馈 耳机放在盒内还能切歌;刚出盒或拿取耳机时,容易误触切换功能。 排查思路 第一步:确认误触发生的时机 ...

【中科蓝讯】TWS 耳机按键处理流程

上一篇已经把 SDK 的几个核心概念过了一遍,包括模式状态机、process/message/display 和消息分层。 这一篇就拿按键功能做一次具体分析,从一个按键事件出发,一直追到最终执行的位置。 以我接触到的 TWS 项目来看,按键是应用层里相对好理解、也比较容易上手的一部分:改单击功能、加长按、加多击,或者调整不同模式下的按键行为。这些需求在 SDK 里都对应到同一套机制,弄懂之后,定位修改位置会更快。 一、先跑一遍完整链路 一个按键从手指按下到功能执行,在 SDK 里走了这几步: %%{init: {"flowchart": {"htmlLabels": true, "wrappingWidth": 1000, "rankSpacing": 30}, "themeVariables": {"lineColor": "#71829a"}}}%% flowchart TB subgraph R0["① 输入与识别"] direction LR R0N0["手指按下<br/>用户触发按键"] R0N1["硬件扫描<br/>读取按键编号"] R0N2["消抖 / 识别<br/>判断短按、长按、多击"] R0N0 --> R0N1 --> R0N2 end class R0N0,R0N1,R0N2 blue; style R0 fill:#f1f6fd,stroke:#b8cfe8,color:#23456b subgraph R1["② 消息与业务"] direction LR R1N0["查按键表<br/>找到对应消息"] R1N1["消息入队<br/>放入消息队列"] R1N2["模式分发<br/>按当前模式处理"] R1N3["功能执行<br/>播放、切歌、接听等"] R1N0 --> R1N1 --> R1N2 --> R1N3 end class R1N0,R1N1,R1N2,R1N3 green; style R1 fill:#f0f8f3,stroke:#b9d7c4,color:#24563a R0 --> R1 classDef blue fill:#e8f2ff,stroke:#7ba4d8,color:#23456b,stroke-width:1.5px; classDef green fill:#e7f4ec,stroke:#78aa8b,color:#24563a,stroke-width:1.5px; classDef amber fill:#fff3df,stroke:#d5a25b,color:#72501e,stroke-width:1.5px; 前两步主要回答“这个按键物理上发生了什么”。从第 3 步开始,软件才把按键行为转换成功能。 ...