|
@@ -8,13 +8,53 @@
|
|
|
|
|
|
|
|
|
uint8 task_btn_id;
|
|
|
-// GPIO_Pin_e btn_pins[HAL_KEY_NUM] = {
|
|
|
-// GPIO_BTN_PLUS,
|
|
|
-// GPIO_BTN_MINUS
|
|
|
-// };
|
|
|
#define KEY_DEMO_ONCE_TIMER 0x0001
|
|
|
#define KEY_DEMO_CYCLE_TIMER 0x0002
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+// 按钮调节模式,默认为亮度调节
|
|
|
+bool btn_mode = Light_MODE;
|
|
|
+
|
|
|
+// 同时按下的按键数组, 用于判断是否同时按下
|
|
|
+int all_pressed_len = 1;
|
|
|
+
|
|
|
+void btn_mode_switch(){
|
|
|
+ btn_mode = !btn_mode;
|
|
|
+ LOG("btn_mode change to: %s\n",btn_mode?"light":"temp");
|
|
|
+}
|
|
|
+
|
|
|
+btn_all_pressed_t btn_all_pressed[all_pressed_len] = {
|
|
|
+ {
|
|
|
+ .len = 2,
|
|
|
+ .btns = (uint8_t[]){0, 1},
|
|
|
+ .callback = btn_mode_switch,
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+// 判断按键是否同时按下
|
|
|
+bool btn_is_all_pressed(){
|
|
|
+ bool is_all_pressed = false;
|
|
|
+ // 遍历所有的同时按下的按键
|
|
|
+ for (int i = 0; i < all_pressed_len; i++)
|
|
|
+ {
|
|
|
+ // 遍历每个同时按下的按键的按键数组
|
|
|
+ for (int j = 0; j < btn_all_pressed[i].len; j++)
|
|
|
+ {
|
|
|
+ // 如果按键数组中有一个按键不是按下状态,则跳过
|
|
|
+ if(key_state.key[btn_all_pressed[i].btns[j]].state != HAL_KEY_EVT_PRESS){
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ // 如果按键数组中的所有按键都是按下状态,则执行回调函数
|
|
|
+ if(j == btn_all_pressed[i].len - 1){
|
|
|
+ btn_all_pressed[i].callback();
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return is_all_pressed;
|
|
|
+}
|
|
|
+
|
|
|
static void key_press_evt(uint8_t i,key_evt_t key_evt)
|
|
|
{
|
|
|
LOG("\nkey index:%d gpio:%d ",i,key_state.key[i].pin);
|
|
@@ -22,10 +62,10 @@ static void key_press_evt(uint8_t i,key_evt_t key_evt)
|
|
|
{
|
|
|
case HAL_KEY_EVT_PRESS:
|
|
|
LOG("key(press down)\n");
|
|
|
+
|
|
|
#ifdef HAL_KEY_SUPPORT_LONG_PRESS
|
|
|
osal_start_timerEx(task_btn_id, KEY_DEMO_LONG_PRESS_EVT, HAL_KEY_LONG_PRESS_TIME);
|
|
|
#endif
|
|
|
-
|
|
|
break;
|
|
|
|
|
|
case HAL_KEY_EVT_RELEASE:
|
|
@@ -59,7 +99,8 @@ int btn_init(task_id){
|
|
|
key_state.key[i].state = HAL_KEY_EVT_PRESS;
|
|
|
key_state.key[i].idle_level = HAL_HIGH_IDLE;
|
|
|
}
|
|
|
-
|
|
|
+ // 注册同时按下事件
|
|
|
+
|
|
|
key_state.task_id = task_btn_id;
|
|
|
key_state.key_callbank = key_press_evt;
|
|
|
key_init();
|
|
@@ -104,9 +145,11 @@ uint16 Key_ProcessEvent( uint8 task_id, uint16 events )
|
|
|
if(key_state.key[i].state == HAL_KEY_EVT_PRESS){
|
|
|
LOG("key:%d gpio:%d ",i,key_state.key[i].pin);
|
|
|
LOG("key(long press down)\n");
|
|
|
- osal_start_timerEx(task_btn_id,KEY_DEMO_LONG_PRESS_EVT,HAL_KEY_LONG_PRESS_TIME);//2s
|
|
|
-
|
|
|
- //user app code long press down process
|
|
|
+ osal_start_timerEx(task_btn_id, KEY_DEMO_LONG_PRESS_EVT, HAL_KEY_LONG_PRESS_TIME);
|
|
|
+ //user app code long press down process
|
|
|
+
|
|
|
+ // 检测是否有同时按下的按键, 只需要在长按事件中检测即可
|
|
|
+ btn_is_all_pressed();
|
|
|
}
|
|
|
}
|
|
|
return (events ^ KEY_DEMO_LONG_PRESS_EVT);
|