中科蓝汛 长按10s开关机
-
长按触控5秒唤醒智能语音助手
-
事件定义和长按四秒逻辑函数定义:
在config.h定义:
#define FUNC_HOLD_5S_SIRI 1 //长按五秒打开siri
bsp_sys.h:
sys_cb1_t
结构体中定义变量:#if FUNC_HOLD_5S_SIRI bool hold_flag;//按住标志 u8 hold_count;//按住1S的次数统计 #endif //结尾处定义函数 #if FUNC_HOLD_5S_SIRI void key_5s_siri(void); #endif
bsp_sys.c的bsp_var_init:
#if FUNC_HOLD_5S_SIRI sys_cb1.hold_flag = false; sys_cb1.hold_count = 0; #endif // FUNC_HOLD_5S_SIRI
bsp_sys.c的函数实现:
#if FUNC_HOLD_5S_SIRI void key_5s_siri(void) { if(sys_cb1.hold_flag){ sys_cb1.hold_count++;//统计长按1S的次数 printf("LONG PRESS ONE TIMES=%d\n",sys_cb1.hold_count); if(sys_cb1.hold_count == 5){ user_def_key_msg(UDK_SIRI); } } } #endif // FUNC_HOLD_5S_SIRI
-
长按5秒逻辑实现:
msg_bt.c的func_bt_message_do:记录是否长按状态
//长按调音量 case KH_PLAY_PWR_USER_DEF: printf("KH_PLAY_PWR_USER_DEF\n"); #if FUNC_HOLD_5S_SIRI sys_cb1.hold_flag = true; #endif if (!xcfg_cb.kl_pwrdwn_dis) { break; } case KH_PLAY_USER_DEF: printf("KH_PLAY_USER_DEF\n"); #if FUNC_HOLD_5S_SIRI sys_cb1.hold_flag = true; #endif func_message(get_user_def_vol_msg(xcfg_cb.user_def_kl_sel)); break;
注意不同芯片长按按键可能定义不一样,x工给我的板子是KH_PLAY_PWR_USER_DEF,我实测的调试板子出来长按是KH_PLAY_USER_DEF。
msg_bt.c的func_bt_message:每隔一秒发送一个消息MSG_SYS_1S,在这里进行定时处理。
void func_bt_message(u16 msg) { if (msg == NO_MSG || msg == MSG_SYS_1S) { //减少flash缺页 func_bt_message_m(msg); if (msg == MSG_SYS_1S) { #if FUNC_HOLD_5S_SIRI key_5s_siri(); #endif // FUNC_HOLD_5S_SIRI }
如果松开按键重新统计:
//SIRI, NEXT, PREV在长按抬键的时候响应,避免关机前切歌或呼SIRI了 case KLU_PLAY_PWR_USER_DEF: #if FUNC_HOLD_5S_SIRI printf("CLEAR 5S SIRI\n"); sys_cb1.hold_flag = false; //松开清除按键 sys_cb1.hold_count=0;
-
-
长按触控10秒关机开机(会有提示音)
- 长按10s开机:
downloader软开机最长只有3.5秒的选项,需要自己实现代码:
* 开关时间定义:
```c
u32 pwron_press_time : 3; //软开机长按时间选择: 0.1秒: 0, 0.5秒: 1, 1秒: 2, 1.5秒: 3, 2秒: 4, 2.5秒: 5, 3秒: 6, 3.5秒: 7
#define PWRON_PRESS_TIME (500*xcfg_cb.pwron_press_time) //长按PWRKEY多长时间开机?
#define PWROFF_PRESS_TIME (3+3*xcfg_cb.pwroff_press_time) //长按PWRKEY多长时间关机?
```
可以推出pwron_press_time为20时是10s。
* 修改宏定义为:
```c
#define PWRON_PRESS_TIME (500*20) //长按PWRKEY多长时间开机?
```
-
长按10s关机:
在长按5s的逻辑函数key_5s_siri下实现关机:(因为懒得改函数名了,姑且这样看着)
#if FUNC_HOLD_5S_SIRI void key_5s_siri(void) { if(sys_cb1.hold_flag){ sys_cb1.hold_count++;//统计长按1S的次数 printf("LONG PRESS ONE TIMES=%d\n",sys_cb1.hold_count); if(sys_cb1.hold_count == 10){ sys_cb.discon_reason = !xcfg_cb.bt_tswi_kpwr_en; //按键关机是否主从切换 sys_cb.pwrdwn_tone_en = 1; func_cb.sta = FUNC_PWROFF; } if(sys_cb1.hold_count == 5){ user_def_key_msg(UDK_SIRI); } } } #endif // FUNC_HOLD_5S_SIRI
-
相关设置: