From: ljy <291517002@qq.com> Date: Wed, 16 Apr 2025 08:03:09 +0000 (+0800) Subject: 按键 X-Git-Url: http://git.snicker.com.cn/?a=commitdiff_plain;h=50b2a2d22b9979bc26ebc9c0eea9b00c4138d103;p=mirrors%2FFX01.git 按键 --- diff --git a/2.code/aicos/app/AI_AMP_2_5/bk_key.c b/2.code/aicos/app/AI_AMP_2_5/bk_key.c index cfa4773..de2522e 100644 --- a/2.code/aicos/app/AI_AMP_2_5/bk_key.c +++ b/2.code/aicos/app/AI_AMP_2_5/bk_key.c @@ -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 +#include +#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