Bui~ (此处省略2000字真诚开场白)
在后面的ADK中都加入了multi point功能,也就是大家熟悉的一拖二功能,这个功能很适合带两个手机的人群。一台手机处理生活中的事情(和家人聊天),另一台则处理工作中的事情(和情人同事讨论),带着一个耳机就能听到两台手机放出来的声音,真是个伟大的发明,要是能一拖N就更好了,这样就能连别人的手机,必要时帮忙处理工作上的事,提高工作效率。୧(๑•̀◡•́๑)૭
但是目前的一拖二有个限制,就是他的回连时间短,且要等一个回连结束才回连下一个。这就不是很友好的体验了,要是耳机开机了,再从口袋掏出手机,再打开手机就发现已经连上了。(我应该先把蓝牙关了先-_-||,重来)
这就不是很友好的体验了,要是耳机开机了,再从口袋掏出手机,再打开手机发现蓝牙没开,再把蓝牙打开,就会发现又自己连上了(我应该用苹果手机,安卓开蓝牙会自己回连-_-||,重来)
这就不是很友好的体验了,要是耳机开机了,再从口袋掏出苹果手机,发现手机不在口袋,在某个地方充电,等我找到它时,回连就超时了,而我又不想多点一下手机去回连。这就很苦恼,所以加长回连时间是有必要的,但是加长了回连时间就会引出一个问题。因为默认要等一个回连结束才回连下一个,那么如果我第一个手机没开蓝牙,那就必须等到超时才会去连我的第二个手机。这就很烦,我机都掏出来了,你却找另一个。所以这就有了本篇博文介绍的交替回连功能。
如上图所示,交替回连就是将每次回连的时间减短,但回连次数增加,且回连设备交替进行。用这种方法既可以加长回连时间,又可以减少原来的等待时间。那么具体怎么实现呢?
首先我们要将每次回连时间减少,在handset_service_multipoint_config这个结构体中的acl_connect_attempt_limit和page_timeout就是配置回连时长,计算公式是(acl_connect_attempt_limit+1)*page_timeout,默认算的是15s,我们修改为5s一次。
因为我们修改了原有的超时设置,并让他在代码中失效了,所以需要我们添加一个总回连时长的设定, 就多加一个宏定义HANDSET_SERVICE_MAX_CONNECT_ATTEMPTS,那么整个回连时间就是HANDSET_SERVICE_MAX_CONNECT_ATTEMPTS * page_timeout秒。
接下来就是重点,我们在handsetServiceSm_HandleInternalConnectAclComplete这个函数里面的acl连接失败部分添加修改。因为第一次回连失败了,我们就需要在这里面进行回连切换。如果我们只有一个配对设备或已经连了一个设备,那就不需要交替回连了,只要一直去重连这个设备就好了。
但如果不是,我们就要将当前的设备用Focus_ExcludeDevice函数移出includelist列表里面,并且这个设备的数值保存到一个全局变量中,这样当下一个设备成功连接或失败的时候,他就可以用Focus_IncludeDevice函数把这个变量重新放进includelist列表里面。
为什么是操作includelist列表呢?因为在代码的后面有个状态机切换HandsetServiceMultipointSm_SetStateToGetNextDevice函数,这个状态切换,会遍历includelist列表,如果里面有设备,就会对这个设备进行回连。所以我们只需要在includelist列表将设备交替放进和移出,就能实现交替回连功能。当然剩下的就是超时控制等一些小问题,大家看看补丁应该就能明白了。
以上是本期博文的全部内容,如有疑问就别在博文下方评论留言了,有什么疑问或想了解的当面和我说(如果你知道我是谁的话ヽ( ̄▽ ̄)و),我会尽量安排上(o´ω`o)و。谢谢大家浏览,我们下期再见。
简单是长期努力的结果,而不是起点
—— 不是我说的
评论
Sam Chiu
2 个月前
zbgg
8 个月前
1111
2022年7月12日