feat(power): switch to physical power-key shutdown control

This commit is contained in:
admin
2026-03-02 15:16:23 +08:00
parent 673b257c4f
commit 67922d37b9
8 changed files with 396 additions and 23 deletions

View File

@@ -4,12 +4,60 @@
#include <stdio.h>
#include "esp_log.h"
#include "freertos/FreeRTOS.h"
static const char *TAG = "system_runtime";
#define SYSTEM_RUNTIME_WIFI_HINT_TIMEOUT_MS 220
static bool s_wifi_hint_shown;
static bool s_power_key_ready;
static domain_power_event_cb_t s_power_event_cb;
static void *s_power_event_user_data;
static portMUX_TYPE s_power_event_lock = portMUX_INITIALIZER_UNLOCKED;
static void system_runtime_dispatch_power_event(domain_power_event_t event) {
domain_power_event_cb_t cb = NULL;
void *user_data = NULL;
portENTER_CRITICAL(&s_power_event_lock);
cb = s_power_event_cb;
user_data = s_power_event_user_data;
portEXIT_CRITICAL(&s_power_event_lock);
if (cb != NULL) {
cb(event, user_data);
}
}
static void system_runtime_power_key_platform_cb(platform_power_key_event_t event, void *user_data) {
(void)user_data;
if (event == PLATFORM_POWER_KEY_EVENT_LONG_PRESS) {
system_runtime_dispatch_power_event(DOMAIN_POWER_EVENT_SHUTDOWN_REQUEST);
}
}
static esp_err_t system_runtime_power_key_init(void) {
if (s_power_key_ready) {
return ESP_OK;
}
esp_err_t err = platform_power_key_init();
if (err != ESP_OK) {
ESP_LOGE(TAG, "platform_power_key_init failed: %s", esp_err_to_name(err));
return err;
}
err = platform_power_key_set_event_callback(system_runtime_power_key_platform_cb, NULL);
if (err != ESP_OK) {
ESP_LOGE(TAG, "platform_power_key_set_event_callback failed: %s", esp_err_to_name(err));
platform_power_key_deinit();
return err;
}
s_power_key_ready = true;
return ESP_OK;
}
static void system_runtime_show_wifi_hint(void) {
if (s_wifi_hint_shown) {
@@ -60,6 +108,11 @@ esp_err_t system_runtime_start(void) {
return err;
}
err = system_runtime_power_key_init();
if (err != ESP_OK) {
return err;
}
s_wifi_hint_shown = false;
(void)wifi_manager_set_event_callback(system_runtime_wifi_event_handler, NULL);
system_runtime_try_show_wifi_hint_for_unprovisioned();
@@ -75,10 +128,28 @@ esp_err_t system_runtime_start(void) {
}
esp_err_t system_runtime_shutdown(void) {
if (s_power_key_ready) {
platform_power_key_deinit();
s_power_key_ready = false;
}
(void)wifi_manager_set_event_callback(NULL, NULL);
return wifi_manager_stop();
}
esp_err_t system_runtime_set_power_event_callback(domain_power_event_cb_t cb, void *user_data) {
portENTER_CRITICAL(&s_power_event_lock);
s_power_event_cb = cb;
s_power_event_user_data = user_data;
portEXIT_CRITICAL(&s_power_event_lock);
return ESP_OK;
}
esp_err_t system_runtime_power_off(void) {
ESP_LOGW(TAG, "system power-off requested: releasing POWER_HOLD");
return platform_power_hold_set(false);
}
esp_err_t system_runtime_bootstrap(void) {
return system_runtime_start();
}