feat(power): switch to physical power-key shutdown control
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user