liuliu3
发表于 2020-2-24 12:18:49
怎么样解决
黃子衡
发表于 2020-3-5 16:24:17
分享个人对这问题的解法.
1. ruleConnectHandset()
对耳连接失败后不放弃这个rule
/* Peer sync is not complete but not in progress */
#if 0
if (reason == RULE_CONNECT_USER)
{
profiles |= DEVICE_PROFILE_HFP | DEVICE_PROFILE_A2DP;
RULE_LOG("ruleConnectHandset, run as user connect, despite peer sync fail");
return RULE_ACTION_RUN_PARAM(profiles);
}
else
{
RULE_LOG("ruleConnectHandset, ignore as peer sync has failed");
return RULE_ACTION_IGNORE;
}
#else
profiles |= DEVICE_PROFILE_HFP | DEVICE_PROFILE_A2DP;
RULE_LOG("ruleConnectHandset, run as user connect, despite peer sync fail");
return RULE_ACTION_RUN_PARAM(profiles);
#endif
2. appA2dpHandleA2dpSignallingConnectConfirm()
手机连接失败时, 转入pair
/* Play error tone */
appUiAvError(theInst->a2dp.flags & A2DP_CONNECT_SILENT_ERROR);
if (!appDeviceIsPeer(&theInst->bd_addr))
{
appSmPairHandset();
}
zhaopeng2511
发表于 2020-3-5 18:06:58
按着下面两条规则来做就行,规则判定函数需要你自己慢慢去修改调试
RULE(RULE_EVENT_STARTUP, rulePeerPair, CONN_RULES_PEER_PAIR),
RULE(RULE_EVENT_STARTUP, rulePeerSync, CONN_RULES_SEND_PEER_SYNC),
RULE(RULE_EVENT_STARTUP, ruleAutoHandsetPair, CONN_RULES_HANDSET_PAIR),
RULE(RULE_EVENT_STARTUP, ruleOutOfCaseAllowHandsetConnect, CONN_RULES_ALLOW_HANDSET_CONNECT),
RULE(RULE_EVENT_STARTUP, ruleOutOfCaseConnectPeer, CONN_RULES_CONNECT_PEER),
RULE_WITH_FLAGS(RULE_EVENT_STARTUP, ruleOutOfCaseConnectHandset, CONN_RULES_CONNECT_HANDSET, RULE_FLAG_PROGRESS_MATTERS),
RULE(RULE_EVENT_OUT_CASE, rulePeerPair, CONN_RULES_PEER_PAIR),
RULE(RULE_EVENT_OUT_CASE, rulePeerSync, CONN_RULES_SEND_PEER_SYNC),
RULE(RULE_EVENT_OUT_CASE, ruleAutoHandsetPair, CONN_RULES_HANDSET_PAIR),
RULE(RULE_EVENT_OUT_CASE, ruleOutOfCaseAllowHandsetConnect, CONN_RULES_ALLOW_HANDSET_CONNECT),
RULE(RULE_EVENT_OUT_CASE, ruleOutOfCaseConnectPeer, CONN_RULES_CONNECT_PEER),
RULE_WITH_FLAGS(RULE_EVENT_OUT_CASE, ruleOutOfCaseConnectHandset, CONN_RULES_CONNECT_HANDSET, RULE_FLAG_PROGRESS_MATTERS),
RULE(RULE_EVENT_OUT_CASE, ruleOutOfCaseAncTuning, CONN_RULES_ANC_TUNING_STOP),
黃子衡
发表于 2020-3-6 09:53:48
zhaopeng2511 发表于 2020-3-5 18:06
按着下面两条规则来做就行,规则判定函数需要你自己慢慢去修改调试
RULE(RULE_EVENT_STARTUP, ...
试过了, 如果没配对手机纪录, 这样做确实可单耳进入pair, 如果有纪录, headset连线fail不会进到pair, 或许应该在加RULE_EVENT_PEER_SYNC_FAILED这个rule.
改rule的确是此架构的精神, 所以如果rule有办法解决能不改代码就不改
zhaopeng2511
发表于 2020-3-6 16:18:29
黃子衡 发表于 2020-3-6 09:53
试过了, 如果没配对手机纪录, 这样做确实可单耳进入pair, 如果有纪录, headset连线fail不会进到pair, 或 ...
rule不能执行说明被rule判定函数挡掉了,只能改rule判定函数。想做好做稳就得这么干,可以说rule规则判定函数里面其它还有很多不合理的地方,这个必须花时间慢慢去优化。你不遵循rule规则去改,而通过代码强制去实现,很容易和rule则里的操作想冲突,改动越多新bug可能就越多,要么就像你说的尽量不改。你自己看着弄吧
黃子衡
发表于 2020-3-7 10:45:56
zhaopeng2511 发表于 2020-3-6 16:18
rule不能执行说明被rule判定函数挡掉了,只能改rule判定函数。想做好做稳就得这么干,可以说rule规则判定 ...
是的, rule判定函数就会卡到单耳的问题, 但如果片面移除限制, 又会导致未进行配耳就超前运行其他action, 所以说, 这rule说穿了是一个比较有架构的state machine, 但似乎缺乏一些弹性.
以目前我的改法已能满足单耳的需要.
但目前还剩下一个问题.
当耳机无配对纪录时, 又是单耳状态, 不会尝试进行connect headset, 所以小弟还在想办法解决.
bluetooth_hill
发表于 2020-5-7 17:42:36
记录下:)。
herex
发表于 2020-5-11 10:46:25
看高手过招
大哥救救我
发表于 2020-6-8 15:36:47
问一下老兄,appConfigAutoPeerPairingTimeout()是控制对等耳机配对的超时吗,与appConfigPeerPairingTimeout()有什么区别呢,为什么我添加了appSmPairHandset()或者SM_INTERNAL_PAIR_HANDSET的事件,但都不能超时进入手机配对。请问你如何添加的呢
lulu7320198
发表于 2020-6-15 10:02:42
大哥救救我 发表于 2020-6-8 15:36
问一下老兄,appConfigAutoPeerPairingTimeout()是控制对等耳机配对的超时吗,与appConfigPeerPairingTimeo ...
这个配对不能乱加的,会出现一堆乱七八糟的问题,要按流程来