按键
authorljy <291517002@qq.com>
Wed, 16 Apr 2025 08:03:09 +0000 (16:03 +0800)
committerljy <291517002@qq.com>
Wed, 16 Apr 2025 08:03:09 +0000 (16:03 +0800)
2.code/aicos/app/AI_AMP_2_5/bk_key.c

index cfa4773..de2522e 100644 (file)
@@ -1,6 +1,233 @@
-void bk_key_init(void)
+#include "bk_key.h"
+#include "AI_AMP_2_5.h"
+#include "kpc.h"
+// #include "aic_gpio_pin.h"
+// #include "gpio_inc.h"
+// #include "eipu.h"
+#include "aic_osa.h"
+#include <stdio.h>
+#include <stdint.h>
+#include "alog_api.h"  
+
+// /******************** 硬件配置 ********************/
+// #define KEY_GPIO_PIN     GPIO_1      // 使用TOP GPIO1
+// #define DEBOUNCE_MS      20         // 去抖时间
+// #define LONG_PRESS_MS    1500       // 长按判定时间
+// #define POLLING_INTERVAL 10         // 检测周期(ms)
+
+// /******************** 状态机定义 ********************/
+// typedef enum {
+//     KEY_STATE_RELEASED,
+//     KEY_STATE_PRESSED,
+//     KEY_STATE_DEBOUNCE_DOWN,
+//     KEY_STATE_DEBOUNCE_UP
+// } KeyState;
+
+// /******************** 全局变量 ********************/
+// static struct {
+//     KeyState state;
+//     uint32_t press_start;
+//     uint8_t debounce_cnt;
+//     uint8_t last_level;
+// } key_ctrl;
+
+// static aos_timer_ptr key_timer;
+
+// /******************** 定时器回调 ********************/
+// static void key_scan_cb(void *arg)
+// {
+//     static uint32_t cnt = 0;
+//     u32 current = aic_gpio_level_get(KEY_GPIO_PIN);
+
+//     if(cnt++ % 10 == 0){ // 每10次打印一次其他信息
+//         bk_printf("[System] Free heap: %d\n", aos_get_heap_size());
+//     }
+
+//     if (current == 0) {
+//         bk_printf("key_scan_cb: LOW level\n");
+//     } else {
+//         bk_printf("key_scan_cb: HIGH level\n");
+//     }
+//    // bk_printf("key_scan_cb:current=%d",current);
+
+//     // switch(key_ctrl.state){
+//     // case KEY_STATE_RELEASED:
+//     //     if(current == 0){ // 低电平表示按下
+//     //         key_ctrl.state = KEY_STATE_DEBOUNCE_DOWN;
+//     //         key_ctrl.debounce_cnt = 0;
+//     //     }
+//     //     break;
+        
+//     // case KEY_STATE_DEBOUNCE_DOWN:
+//     //     if(current == 0){
+//     //         if(++key_ctrl.debounce_cnt >= (DEBOUNCE_MS/POLLING_INTERVAL)){
+//     //             key_ctrl.state = KEY_STATE_PRESSED;
+//     //             key_ctrl.press_start = aos_now_ms();
+//     //             AI_AMP_MSG_put(NULL, 0, AI_KEY_PRESS);
+//     //         }
+//     //     }else{
+//     //         key_ctrl.state = KEY_STATE_RELEASED;
+//     //     }
+//     //     break;
+        
+//     // case KEY_STATE_PRESSED:
+//     //     if(current != 0){ // 高电平表示释放
+//     //         key_ctrl.state = KEY_STATE_DEBOUNCE_UP;
+//     //         key_ctrl.debounce_cnt = 0;
+//     //     } else if((aos_now_ms() - key_ctrl.press_start) >= LONG_PRESS_MS){
+//     //         AI_AMP_MSG_put(NULL, 0, AI_KEY_LONG_PRESS);
+//     //         key_ctrl.press_start = aos_now_ms(); // 重置计时
+//     //     }
+//     //     break;
+        
+//     // case KEY_STATE_DEBOUNCE_UP:
+//     //     if(current != 0){
+//     //         if(++key_ctrl.debounce_cnt >= (DEBOUNCE_MS/POLLING_INTERVAL)){
+//     //             key_ctrl.state = KEY_STATE_RELEASED;
+//     //             AI_AMP_MSG_put(NULL, 0, AI_KEY_RELEASE);
+//     //         }
+//     //     }else{
+//     //         key_ctrl.state = KEY_STATE_PRESSED;
+//     //     }
+//     //     break;
+//     // }
+// }
+
+// /******************** 初始化函数 ********************/
+// void bk_key_init(void)
+// {
+//     // 配置GPIO为输入模式(无中断回调)
+//     aic_gpio_input(KEY_GPIO_PIN, 
+//                   GPIO_TRIGGER_LVL_LOW, // 低电平触发
+//                   NULL,                // 不使用中断回调
+//                   NULL);
+    
+//     // 初始化状态机
+//     key_ctrl.state = KEY_STATE_RELEASED;
+//     key_ctrl.press_start = 0;
+//     key_ctrl.debounce_cnt = 0;
+//     key_ctrl.last_level = aic_gpio_level_get(KEY_GPIO_PIN);
+    
+//     // 创建周期定时器
+//     key_timer = aos_create_timer(
+//         "key_detect",
+//         key_scan_cb
+//         NULL,
+//         100,
+//         AOS_AUTO_ACTIVATE, AOS_BE_PERIOD
+//     );
+// }
+
+// /******************** 反初始化函数 ********************/
+// void bk_key_deinit(void)
+// {
+//     if(key_timer){
+//         aos_delete_timer(key_timer);
+//         key_timer = NULL;
+//     }
+//     aic_gpio_output(KEY_GPIO_PIN, GPIO_OUTPUT_LVL_LOW); // 恢复默认输出
+// }
+
+
+#define KEY_GPIO_PIN_ID GPIO_1
+#define LOG_MODULE    AMOD_KPC
+
+
+static srv_func_callback g_kpc_callback = NULL;
+static int32_t g_kpc_handle = 0;
+
+
+
+
+// int32_t aic_srv_kpc_register(char *client_name, srv_func_callback _srv_callback)
+// {
+//     g_kpc_callback = _srv_callback;
+//     g_kpc_handle++;
+//     aicx_info(0x0202e8, "d", "g_kpc_handle = %d \n", g_kpc_handle);
+//     return g_kpc_handle;
+// }
+
+static int32_t bk_kpc_callback(void *p_param, uint32_t size)
 {
+    kpc_key_array_t *key_arr = (kpc_key_array_t *)p_param;
+    if (key_arr == NULL) {
+        alog_error("kpc_callback: p_param is NULL\n");  // 使用 alog_error 输出错误信息
+        return -1;
+    }
+
+    for (int i = 0; i < 5; i++) {
+        switch (key_arr->key[i].key_event) {
+            case KPC_KEY_EVENT_PRESS:
+                // bk_printf("[%d]AI_key_press",key_arr->key[i].key_value);
+
+                if (key_arr->key[i].key_value == 0) {
+                    bk_printf("[0]AI_key_press");
+                    AI_AMP_MSG_put(0, 0, VC_START);
+                }
+                break;
+            case KPC_KEY_EVENT_RELEASE:
+                if (key_arr->key[i].key_value == 1) {
+                    bk_printf("[1]AI_key_release");
+                }
+
+
+                // bk_printf("[%d]AI_key_release",key_arr->key[i].key_value);
+
+                
+                break;
+            case KPC_KEY_EVENT_LONGKEY:
+                if (key_arr->key[i].key_value == 4) {
+                    bk_printf("[4]pwk_key_press");
+                    AI_AMP_MSG_put(0, 0, VC_CLOSE);
+                    AI_AMP_MSG_put(0,0,PWK_KEY_RELEASE);
+                }
+                // bk_printf("[%d]AI_key_long_press",key_arr->key[i].key_value);
+                
+                
+                break;
+
+            case KPC_KEY_EVENT_LONGKEY_RELEASE:
+                if (key_arr->key[i].key_value == 2) {
+                    bk_printf("[2]AI_key_long_press");
+                } 
+
+
+                // bk_printf("[%d]AI_key_long_press",key_arr->key[i].key_value);
+                
+                break;
+            default:
+                // bk_printf("power key");
+                break;
+        }
+    }
+    bk_printf("\n");
+ 
+    return 0;
+
 
 }
 
 
+
+void bk_key_init(void)
+{
+    // bk_printf("开始初始化按键模块\n"); 不注释掉就卡住没日志
+    
+    int32_t handle = aic_srv_kpc_register("app", bk_kpc_callback);
+    if (handle < 0) {
+        alog_error("Failed to register KPC callback\n");  // 使用 alog_error 输出错误信息
+    } else {
+        aicx_info(0x0202e8, "d", "g_kpc_handle = %d \n", handle);  // 
+    }
+    
+}
+
+// 按键处理函数
+void bk_key_process(void) {
+    kpc_key_array_t key_arr;
+    int valid_key_num = kpc_read_key(&key_arr);
+    if (valid_key_num > 0) {
+        // 调用回调函数处理按键事件
+        bk_kpc_callback(&key_arr, sizeof(key_arr));
+    }
+}
\ No newline at end of file