通过同时双击左右耳恢复出厂设置

通过同时双击左右耳恢复出厂设置,单个耳机双击的时候响应按键处理,原理就是:通过按键传递消息,在多长的时间内满足条件就执行恢复出厂设置,不满足就响应按键处理。具体实现如下:

首先就是创建变量:
bsp_sys.h下sys_cb1_t结构体中:

	u8 double_mun_flag;//双击之后的清除标志
	u8 fuer_doubleflag;//副耳双击的标志位
	u8 zhuer_doubleflag;//主耳双击的标志位

创建消息定义:
bsp_key.h中:

#define EVT_DOUBLE_MSG_EN     0x7d7//清除配对信息
#define EVT_DOUBLE_SIRI_EN      0x7d6//双击超时的时候响应按键处理

之后就到按键消息处理中:
msg_bt.c下func_bt_message()中:

case KD_PLAY_PWR_USER_DEF:
	if(bt_tws_is_connected())
	{//对耳的时候控制是不是要恢复出厂设置
		if(bt_tws_is_slave())//副耳按下的时候给主耳发送标志
		{
			sys_cb1.double_mun_flag = 1;//开启清理标志位的计时
			bt_tws_user_key(0x16);//副耳已按下,给主耳传递消息
		}
		else 
		{
			sys_cb1.double_mun_flag = 1;//开启清理标志位的计时
			if(sys_cb1.zhuer_doubleflag == 0)//如果主耳双击标志位为0,则置1
				sys_cb1.zhuer_doubleflag = 1;
		}
	}
	else//单耳时直接唤醒siri
	{
		bt_siri_switch();
	}
	break;

之后就是主副机之间传递的消息处理:
bsp_bt.c下bt_emit_notice()中:

case BT_NOTICE_TWS_USER_KEY:
	if(param == 0x16)
	{//主耳接收的处理
		sys_cb1.fuer_doubleflag = 1;//副耳标志位置1
	}
	else if(param == 0x17)
	{//清理动作,主机给副机发送
		func_message(EVT_DOUBLE_MSG_EN);
	}
	break;

之后就是计时处理,计时时间内满足条件就恢复出厂设置,不满足就执行双击按键处理:
bsp_sys.c下usr_tmr5ms_isr()中

	if((sys_cb1.zhuer_doubleflag==1)||(sys_cb1.fuer_doubleflag== 1)||(sys_cb1.double_mun_flag >= 1))
	{//检测到了双击信号或者清理标志位的计时已开启,开始计时
		sys_cb1.double_mun_flag++;//计时
	}
	if(sys_cb1.double_mun_flag >= 100)
	{//500ms内条件不满足就不执行清除动作,标志位清0,唤醒siri
		sys_cb1.zhuer_doubleflag = 0;
		sys_cb1.fuer_doubleflag = 0;
		sys_cb1.double_mun_flag = 0;
		func_bt_message(EVT_DOUBLE_SIRI_EN);//双击超时的时候响应按键处理
	}

之后就是检测到条件满足,执行清理动作:
fun_bt.c下func_bt_process()中:

	if((sys_cb1.zhuer_doubleflag==1)&&(sys_cb1.fuer_doubleflag== 1)&&(sys_cb1.double_mun_flag <= 100))
	{
		bt_tws_user_key(0x17);//给副耳发送消息,执行清理消息
		func_message(EVT_DOUBLE_MSG_EN);//清理消息传输
	}

之后就是执行动作的消息处理:
fun.c下func_message()中:

	case EVT_DOUBLE_MSG_EN:
		bt_clr_all_link_info();//清理函数处理
		func_cb.sta = FUNC_NULL;//模式清空
		break;

清理函数处理实现:(底层已写好)
bsp_uart.c下:

void clear_bt_auto_switch_maddr(void)
{
    u8 addr[7];
    memset(addr,0,7);
    cm_write(addr, PARAM_MASTER_ADDR_VALID, 7);
    cm_sync();
}
void bt_clr_all_link_info(void)
{
    clear_bt_auto_switch_maddr();//地址是否有效及地址数据清0
    bt_nor_delete_link_info(); //删除手机配对信息
    bt_tws_delete_link_info();//删除tws配对信息
}

一些底层的定义:(底层已写好)
bsp_param.h下:

#define PARAM_BT                  108            //前面108byte存放蓝牙信息
#define PARAM_MASTER_ADDR_VALID   PARAM_BT + 8   //用于记录主耳的地址是否有效
#define PARAM_MASTER_ADDR         PARAM_BT + 9        //6BYTE
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值