Biu~小伙伴们大家好, 续前上回的分解,大家都了解在默认情况下按键执行都在主耳进行。上回解决了本地事件的执行问题,那么现在就来聊聊另外一个问题——左右耳独立功能。一般在TWS耳机上的按键功能是有限的,主要是来着结构体型的限制,一般按键都是只要一个,或者用触摸和敲击。不管用哪些,能识别的动作少之又少。
所以大部分客户设计左右两边不同的按键功能,例如左边上曲右边下曲,左边加音量右边减音量等等。
在新的ADK的逻辑下,如何去设置这样的功能呢?
用上篇说的用本地事件的方法?不可能的,像上下曲,播放暂停这些都是要发控制指令给手机的,而副机是没有直接连接手机,所以这些控制指令都需要主机去发,副机想控制,都需要转发给主机去发。
那是要转发按键消息?
如果直接转发按键消息过去,主机接受后,会按他代码中的按键设定去解析事件,这样解析出来的还是会跟主机触发按键事件的效果一样,无法实现左右独立按键功能。
如上期说的,按键处理里面可以直接处理执行动作(ui_input),那直接转发执行动作呢?
如果转发执行动作,方法是可以,但是这需要得到按键事件处理结果后才能转发。但是要做区分,哪些按键事件需要转发?哪些执行动作需要转发?哪些时候需要转发……
那转发按键事件,让主耳知道这是副耳的事件,然后在主耳分析做对应的处理?
这是一个思路,主耳知道触发事件的是谁,就可以去决定要怎么做。这里小编绑架一个事件来实现这个效果。当然方法不是只有一个,如果你也有新颖高效的方法,也可以在评论区分享。
下面说说如何用绑架按键事件来实现该功能。首先我们知道转发的按键事件到了主机,也只会在主机上执行主机的设定,正所谓“你的是你的,我的还是你的,都是你的,那我的就没意义了,这不公开,我需要瓜分这个权利,挟天子以令诸侯”。利用主机上的一个无用的按键事件,就可以得到部分控制权。例如一个单击按键事件,只能控制一套功能,现在多次一个按键事件抢夺这个权利,也要实现单击控制他自己的一套功能,双方打了一架,达成协议,根据左右各种控制一套功能,就能实现左右按键功能独立了
怎么绑架一个按键事件呢?哪里出生就从哪里绑架。按键事件是在buttonxml中定义的(第二篇博文有解释),所以我们在这里找一个不会用到的按键事件或者制作一个这样的事件,这种事件不能被实际操作触发。
在earbud_ui_config.c的earbud_ui_config_table中给他分配权力
在logical_input_switch.c的logicalInputSwitch_HandleMessage中给他们划分管辖区域
一个按键事件,左边就还是用原来的事件,右边就用绑架的事件,最后不管按键事件是本地执行还是转发,主机都认可这两个按键事件,都会得到对应的处理。
话不多说,上代码:
diff --git a/adk/src/services/peer/logical_input_switch/logical_input_switch.c b/adk/src/services/peer/logical_input_switch/logical_input_switch.c
index 0ad295bc..70fc5b4b 100644
--- a/adk/src/services/peer/logical_input_switch/logical_input_switch.c
+++ b/adk/src/services/peer/logical_input_switch/logical_input_switch.c
@@ -22,6 +22,21 @@
#include
#include
+#if defined(HAVE_9_BUTTONS)
+#include "9_buttons.h"
+#elif defined(HAVE_7_BUTTONS)
+#include "7_buttons.h"
+#elif defined(HAVE_6_BUTTONS)
+#include "6_buttons.h"
+#elif defined(HAVE_4_BUTTONS)
+#include "4_buttons.h"
+#elif defined(HAVE_2_BUTTONS)
+#include "2_button.h"
+#elif defined(HAVE_1_BUTTON)
+#include "1_button.h"
+#endif
+#include "multidevice.h"
+
/* The full range of logical inputs are split across two different message
* groups, one of which is used to identify device specific messages. */
#define MIN_LOGICAL_INPUT_MSG DEVICE_SPECIFIC_LOGICAL_INPUT_MESSAGE_BASE
@@ -139,6 +154,11 @@ static void logicalInputSwitch_HandleMessage(Task task, MessageId id, Message me
{
ui_input_t passthrough_ui_input = logicalInputSwitch_PassthroughUiInput(id, (PASSTHROUGH_LOGICAL_INPUT_MSG_T*)message);
+ if(id == APP_MFB_BUTTON_SINGLE_CLICK
+ && passthrough_ui_input == ui_input_invalid
+ &&!Multidevice_IsLeft())
+ id = APP_MFB_BUTTON_RIGHT_SINGLE_CLICK;
+
if (reroute_logical_inputs_to_peer &&
!logicalInputSwitch_IsDeviceSpecificLogicalInput(id))
{
diff --git a/earbud/src/buttons/9_buttons.buttonxml b/earbud/src/buttons/9_buttons.buttonxml
index e2f736b5..16e5e0b5 100644
--- a/earbud/src/buttons/9_buttons.buttonxml
+++ b/earbud/src/buttons/9_buttons.buttonxml
@@ -5,6 +5,13 @@
+
+ APP_MFB_BUTTON_RIGHT_SINGLE_CLICK
+ HELD_RELEASE
+ VOICE
+ 9000
+
+
APP_ANC_TOGGLE_ON_OFF
SINGLE_CLICK
diff --git a/earbud/src/earbud_ui_config.c b/earbud/src/earbud_ui_config.c
index a085f46c..c91a1f14 100644
--- a/earbud/src/earbud_ui_config.c
+++ b/earbud/src/earbud_ui_config.c
@@ -151,6 +151,7 @@ const ui_config_table_content_t earbud_ui_config_table[] =
{APP_MFB_BUTTON_SINGLE_CLICK, ui_provider_media_player, context_av_is_streaming, ui_input_toggle_play_pause },
{APP_MFB_BUTTON_SINGLE_CLICK, ui_provider_media_player, context_av_connected, ui_input_toggle_play_pause },
{APP_MFB_BUTTON_SINGLE_CLICK, ui_provider_device, context_handset_not_connected, ui_input_connect_handset },
+ {APP_MFB_BUTTON_RIGHT_SINGLE_CLICK, ui_provider_media_player, context_av_is_streaming, ui_input_av_forward },
{APP_MFB_BUTTON_HELD_RELEASE_1SEC, ui_provider_hfp, context_hfp_voice_call_sco_active, ui_input_hfp_transfer_to_ag },
{APP_MFB_BUTTON_HELD_RELEASE_1SEC, ui_provider_hfp, context_hfp_voice_call_sco_inactive, ui_input_hfp_transfer_to_headset },
以上是本期博文的全部内容,如有疑问请在博文下方评论留言,或者有什么想了解的都可以留言,我会挑选一些做后面几期的博文,谢谢大家,我们下期再见。
多看文档,多上官网
多看文档,多上官网
多看文档,多上官网
评论
Rain Zhang
2021年4月9日
linhuan
2021年3月30日