1、按键驱动重构:从GPIO中断改为iot_button组件,支持BOOT/KEY2的单击/双击/长按6种事件; 2、新增按键导航管理器(key_nav):9种上下文状态机,统一分发按键事件到对应界面业务逻辑; 3、BLE模块改造:广播默认关闭由按键触发,新增设备间图片传输(GATT Client),支持扫描配对→MTU协商→分包发送; 4、新增6个UI界面:配对(Peiwang)、更新(Update)、发送等待(ImageShar)、接收等待(ImageReception)、发送中(Sharing)、接收中(Receiving); 5、新增电池指示器组件(battery_ui):支持多界面真实电量显示,3秒渐隐效果; 6、Home界面重构:移除手势事件,改为airhub背景图+电池指示器; 7、Img界面重构:移除触摸事件,新增删除二次确认边框机制; 8、禁用ScreenSet/ScreenChar界面(保留文件),禁用触摸初始化(保留代码可恢复); 9、sleep_mgr简化:移除ScreenSet亮度UI依赖,按键唤醒由key_nav统一处理; 10、新增9张图片资源(airhub背景、配对、传输状态、电池图标等); Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
84 lines
2.6 KiB
C
84 lines
2.6 KiB
C
// 按键驱动模块(基于iot_button组件)
|
||
// 支持BOOT和KEY2两个按键的单击/双击/长按事件
|
||
|
||
#include "button.h"
|
||
#include "iot_button.h"
|
||
#include "button_gpio.h"
|
||
#include "esp_log.h"
|
||
|
||
static const char *TAG = "BTN";
|
||
|
||
// 按键句柄
|
||
static button_handle_t boot_handle = NULL;
|
||
static button_handle_t key2_handle = NULL;
|
||
|
||
esp_err_t button_init(void)
|
||
{
|
||
// BOOT按键配置
|
||
button_config_t boot_cfg = {
|
||
.long_press_time = 1200, // 长按阈值1.2秒 // 长按阈值2秒
|
||
.short_press_time = 300, // 双击检测窗口300ms // 双击窗口180ms
|
||
};
|
||
button_gpio_config_t boot_gpio_cfg = {
|
||
.gpio_num = PIN_BTN_BOOT,
|
||
.active_level = 0, // 低电平有效
|
||
};
|
||
esp_err_t ret = iot_button_new_gpio_device(&boot_cfg, &boot_gpio_cfg, &boot_handle);
|
||
if (ret != ESP_OK) {
|
||
ESP_LOGE(TAG, "BOOT按键创建失败: %s", esp_err_to_name(ret));
|
||
return ret;
|
||
}
|
||
|
||
// KEY2按键配置
|
||
button_config_t key2_cfg = {
|
||
.long_press_time = 1200, // 长按阈值1.2秒
|
||
.short_press_time = 300, // 双击检测窗口300ms
|
||
};
|
||
button_gpio_config_t key2_gpio_cfg = {
|
||
.gpio_num = PIN_BTN_KEY2,
|
||
.active_level = 0,
|
||
};
|
||
ret = iot_button_new_gpio_device(&key2_cfg, &key2_gpio_cfg, &key2_handle);
|
||
if (ret != ESP_OK) {
|
||
ESP_LOGE(TAG, "KEY2按键创建失败: %s", esp_err_to_name(ret));
|
||
return ret;
|
||
}
|
||
|
||
ESP_LOGI(TAG, "按键初始化完成 (BOOT=GPIO%d, KEY2=GPIO%d)", PIN_BTN_BOOT, PIN_BTN_KEY2);
|
||
return ESP_OK;
|
||
}
|
||
|
||
// === BOOT按键回调注册 ===
|
||
|
||
void button_on_boot_click(btn_event_cb_t cb, void *usr_data)
|
||
{
|
||
iot_button_register_cb(boot_handle, BUTTON_SINGLE_CLICK, NULL, (button_cb_t)cb, usr_data);
|
||
}
|
||
|
||
void button_on_boot_double_click(btn_event_cb_t cb, void *usr_data)
|
||
{
|
||
iot_button_register_cb(boot_handle, BUTTON_DOUBLE_CLICK, NULL, (button_cb_t)cb, usr_data);
|
||
}
|
||
|
||
void button_on_boot_long_press(btn_event_cb_t cb, void *usr_data)
|
||
{
|
||
iot_button_register_cb(boot_handle, BUTTON_LONG_PRESS_START, NULL, (button_cb_t)cb, usr_data);
|
||
}
|
||
|
||
// === KEY2按键回调注册 ===
|
||
|
||
void button_on_key2_click(btn_event_cb_t cb, void *usr_data)
|
||
{
|
||
iot_button_register_cb(key2_handle, BUTTON_SINGLE_CLICK, NULL, (button_cb_t)cb, usr_data);
|
||
}
|
||
|
||
void button_on_key2_double_click(btn_event_cb_t cb, void *usr_data)
|
||
{
|
||
iot_button_register_cb(key2_handle, BUTTON_DOUBLE_CLICK, NULL, (button_cb_t)cb, usr_data);
|
||
}
|
||
|
||
void button_on_key2_long_press(btn_event_cb_t cb, void *usr_data)
|
||
{
|
||
iot_button_register_cb(key2_handle, BUTTON_LONG_PRESS_START, NULL, (button_cb_t)cb, usr_data);
|
||
}
|