jiuchuan-s3修改按键定义取消不对话自动关机修复屏幕显示不全 (#997)

* jiuchuan-s3修改按键定义取消不对话自动关机修复屏幕显示不全

* jiuchuan-s3修改按键定义取消不对话自动关机修复屏幕显示不全
This commit is contained in:
jake12355
2025-07-29 17:28:40 +08:00
committed by GitHub
parent e5ac40aac8
commit e0e12450c5

View File

@@ -22,12 +22,35 @@
#include <driver/rtc_io.h> #include <driver/rtc_io.h>
#include <esp_sleep.h> #include <esp_sleep.h>
#define TAG "JiuchuanDevBoard" #define BOARD_TAG "JiuchuanDevBoard"
#define __USER_GPIO_PWRDOWN__ #define __USER_GPIO_PWRDOWN__
LV_FONT_DECLARE(font_puhui_20_4); LV_FONT_DECLARE(font_puhui_20_4);
LV_FONT_DECLARE(font_awesome_20_4); LV_FONT_DECLARE(font_awesome_20_4);
// 自定义LCD显示器类用于圆形屏幕适配
class CustomLcdDisplay : public SpiLcdDisplay
{
public:
CustomLcdDisplay(esp_lcd_panel_io_handle_t io_handle,
esp_lcd_panel_handle_t panel_handle,
int width,
int height,
int offset_x,
int offset_y,
bool mirror_x,
bool mirror_y,
bool swap_xy,
DisplayFonts fonts)
: SpiLcdDisplay(io_handle, panel_handle, width, height, offset_x, offset_y, mirror_x, mirror_y, swap_xy, fonts)
{
DisplayLockGuard lock(this);
lv_obj_set_style_pad_left(status_bar_, LV_HOR_RES * 0.167, 0);
lv_obj_set_style_pad_right(status_bar_, LV_HOR_RES * 0.167, 0);
}
};
class JiuchuanDevBoard : public WifiBoard { class JiuchuanDevBoard : public WifiBoard {
private: private:
i2c_master_bus_handle_t codec_i2c_bus_; i2c_master_bus_handle_t codec_i2c_bus_;
@@ -41,6 +64,17 @@ private:
esp_lcd_panel_io_handle_t panel_io = NULL; esp_lcd_panel_io_handle_t panel_io = NULL;
esp_lcd_panel_handle_t panel = NULL; esp_lcd_panel_handle_t panel = NULL;
// 音量映射函数:将内部音量(0-80)映射为显示音量(0-100%)
int MapVolumeForDisplay(int internal_volume) {
// 确保输入在有效范围内
if (internal_volume < 0) internal_volume = 0;
if (internal_volume > 80) internal_volume = 80;
// 将0-80映射到0-100
// 公式: 显示音量 = (内部音量 / 80) * 100
return (internal_volume * 100) / 80;
}
void InitializePowerManager() { void InitializePowerManager() {
power_manager_ = new PowerManager(PWR_ADC_GPIO); power_manager_ = new PowerManager(PWR_ADC_GPIO);
power_manager_->OnChargingStatusChanged([this](bool is_charging) { power_manager_->OnChargingStatusChanged([this](bool is_charging) {
@@ -81,7 +115,7 @@ private:
} }
#endif #endif
//一分钟进入浅睡眠5分钟进入深睡眠关机 //一分钟进入浅睡眠5分钟进入深睡眠关机
power_save_timer_ = new PowerSaveTimer(-1, (60*10), (60*30)); power_save_timer_ = new PowerSaveTimer(-1, (60*5), -1);
// power_save_timer_ = new PowerSaveTimer(-1, 6, 10);//test // power_save_timer_ = new PowerSaveTimer(-1, 6, 10);//test
power_save_timer_->OnEnterSleepMode([this]() { power_save_timer_->OnEnterSleepMode([this]() {
GetDisplay()->SetPowerSaveMode(true); GetDisplay()->SetPowerSaveMode(true);
@@ -128,6 +162,11 @@ private:
} }
void InitializeButtons() { void InitializeButtons() {
static bool pwrbutton_unreleased = false;
if (gpio_get_level(GPIO_NUM_3) == 1) {
pwrbutton_unreleased = true;
}
// 配置GPIO // 配置GPIO
ESP_LOGI(TAG, "Configuring power button GPIO"); ESP_LOGI(TAG, "Configuring power button GPIO");
GpioManager::Config(GPIO_NUM_3, GpioManager::GpioMode::INPUT_PULLDOWN); GpioManager::Config(GPIO_NUM_3, GpioManager::GpioMode::INPUT_PULLDOWN);
@@ -141,9 +180,18 @@ private:
ESP_LOGI(TAG, "Power button initial state: %d", GpioManager::GetLevel(PWR_BUTTON_GPIO)); ESP_LOGI(TAG, "Power button initial state: %d", GpioManager::GetLevel(PWR_BUTTON_GPIO));
// 高电平有效长按关机逻辑 // 高电平有效长按关机逻辑
pwr_button_.OnLongPress([this]() { pwr_button_.OnPressDown([this]() {
pwrbutton_unreleased = false;
});
pwr_button_.OnLongPress([this]()
{
ESP_LOGI(TAG, "Power button long press detected (high-active)"); ESP_LOGI(TAG, "Power button long press detected (high-active)");
if (pwrbutton_unreleased){
ESP_LOGI(TAG, "开机后电源键未松开,取消关机");
return;
}
// 高电平有效防抖确认 // 高电平有效防抖确认
for (int i = 0; i < 5; i++) { for (int i = 0; i < 5; i++) {
int level = GpioManager::GetLevel(PWR_BUTTON_GPIO); int level = GpioManager::GetLevel(PWR_BUTTON_GPIO);
@@ -157,28 +205,79 @@ private:
} }
ESP_LOGI(TAG, "Confirmed power button pressed - initiating shutdown"); ESP_LOGI(TAG, "Confirmed power button pressed - initiating shutdown");
power_manager_->SetPowerState(PowerState::SHUTDOWN); power_manager_->SetPowerState(PowerState::SHUTDOWN); });
});
wifi_button.OnClick([this]() { //单击切换状态
ESP_LOGI(TAG, "Wifi button clicked"); pwr_button_.OnClick([this]()
{
// 获取当前应用实例和状态
auto &app = Application::GetInstance();
auto current_state = app.GetDeviceState();
ESP_LOGI(TAG, "当前设备状态: %d", current_state);
if (current_state == kDeviceStateIdle) {
// 如果当前是待命状态,切换到聆听状态
ESP_LOGI(TAG, "从待命状态切换到聆听状态");
app.ToggleChatState(); // 切换到聆听状态
} else if (current_state == kDeviceStateListening) {
// 如果当前是聆听状态,切换到待命状态
ESP_LOGI(TAG, "从聆听状态切换到待命状态");
app.ToggleChatState(); // 切换到待命状态
} else if (current_state == kDeviceStateSpeaking) {
// 如果当前是说话状态,终止说话并切换到待命状态
ESP_LOGI(TAG, "从说话状态切换到待命状态");
app.ToggleChatState(); // 终止说话
} else {
// 其他状态下只唤醒设备
ESP_LOGI(TAG, "唤醒设备");
power_save_timer_->WakeUp();
} });
// 电源键三击重置WiFi
pwr_button_.OnMultipleClick([this]()
{
ESP_LOGI(TAG, "Power button triple click: 重置WiFi");
power_save_timer_->WakeUp();
ResetWifiConfiguration(); }, 3);
wifi_button.OnPressDown([this]()
{
ESP_LOGI(TAG, "Volume up button pressed");
power_save_timer_->WakeUp(); power_save_timer_->WakeUp();
auto codec = GetAudioCodec();
int current_vol = codec->output_volume(); // 获取实际当前音量
current_vol = (current_vol + 8 > 80) ? 80 : current_vol + 8;
ESP_LOGI(TAG, "Resetting WiFi configuration"); codec->SetOutputVolume(current_vol);
GpioManager::SetLevel(PWR_EN_GPIO, 1);
ResetWifiConfiguration();
}); ESP_LOGI(TAG, "Current volume: %d", current_vol);
int display_volume = MapVolumeForDisplay(current_vol);
GetDisplay()->ShowNotification(Lang::Strings::VOLUME + std::to_string(display_volume) + "%");});
cmd_button.OnClick([this]() { cmd_button.OnPressDown([this]()
ESP_LOGI(TAG, "Command button clicked"); {
ESP_LOGI(TAG, "Volume down button pressed");
power_save_timer_->WakeUp(); power_save_timer_->WakeUp();
Application::GetInstance().ToggleChatState();
}); auto codec = GetAudioCodec();
int current_vol = codec->output_volume(); // 获取实际当前音量
current_vol = (current_vol - 8 < 0) ? 0 : current_vol - 8;
codec->SetOutputVolume(current_vol);
ESP_LOGI(TAG, "Current volume: %d", current_vol);
if (current_vol == 0) {
GetDisplay()->ShowNotification(Lang::Strings::MUTED);
} else {
int display_volume = MapVolumeForDisplay(current_vol);
GetDisplay()->ShowNotification(Lang::Strings::VOLUME + std::to_string(display_volume) + "%");
}});
} }
void InitializeGC9301isplay() { void InitializeGC9301isplay()
{
// 液晶屏控制IO初始化 // 液晶屏控制IO初始化
ESP_LOGI(TAG, "test Install panel IO"); ESP_LOGI(TAG, "test Install panel IO");
spi_bus_config_t buscfg = {}; spi_bus_config_t buscfg = {};
@@ -215,7 +314,7 @@ private:
esp_lcd_panel_invert_color(panel, false); esp_lcd_panel_invert_color(panel, false);
esp_lcd_panel_swap_xy(panel, DISPLAY_SWAP_XY); esp_lcd_panel_swap_xy(panel, DISPLAY_SWAP_XY);
esp_lcd_panel_mirror(panel, DISPLAY_MIRROR_X, DISPLAY_MIRROR_Y); esp_lcd_panel_mirror(panel, DISPLAY_MIRROR_X, DISPLAY_MIRROR_Y);
display_ = new SpiLcdDisplay(panel_io, panel, display_ = new CustomLcdDisplay(panel_io, panel,
DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_OFFSET_X, DISPLAY_OFFSET_Y, DISPLAY_MIRROR_X, DISPLAY_MIRROR_Y, DISPLAY_SWAP_XY, DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_OFFSET_X, DISPLAY_OFFSET_Y, DISPLAY_MIRROR_X, DISPLAY_MIRROR_Y, DISPLAY_SWAP_XY,
{ {
.text_font = &font_puhui_20_4, .text_font = &font_puhui_20_4,