kindring 1 рік тому
батько
коміт
082c68da91
2 змінених файлів з 69 додано та 12 видалено
  1. 52 9
      src/control/btn.c
  2. 17 3
      src/control/btn.h

+ 52 - 9
src/control/btn.c

@@ -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);

+ 17 - 3
src/control/btn.h

@@ -6,10 +6,22 @@
 
 #include "gpio_key.h"
 
+#define Light_MODE TRUE
+#define Temp_MODE FALSE
 extern uint8 task_btn_id;
+// 按钮调整模式  true: 亮度调节  false: 色温调节
+extern bool btn_mode;
 
+typedef void (*CallbackFunc)(void);
+// 同时按下的按钮结构体
+typedef struct {
+    uint8_t len;
+    uint8_t *btns;// 按钮数组,目前用于匹配 btn_pins 的下标
+    CallbackFunc callback;
+} btn_all_pressed_t;
 
-
+// 同时按下的按键数组, 用于判断是否同时按下
+extern btn_all_pressed_t btn_all_pressed[];
 
 // 按钮状态
 extern int btn_init();
@@ -17,7 +29,9 @@ extern int btn_init();
 
 uint16 Key_ProcessEvent( uint8 task_id, uint16 events );
 
-// 按钮表格
-// extern GPIO_Pin_e btn_pins[];
+// 判断按键是否同时按下
+bool btn_is_all_pressed();
 
+// 模式切换
+void btn_mode_switch();
 #endif