/****************************************************************************** * @file app_power.c * @brief CBR3 软关机生命周期实现:无电池、无充电 * @author cyWu <1917507415@qq.com> * @date 2026.08.29 * @version V1.0.0 * @history * - V1.0.0, 2026.08.29, cyWu, 首次发布(移植门夹精简:删 USB/充电/电量/低电) ******************************************************************************/ #include "app_power.h" #include "system/includes.h" #define LOG_TAG_CONST APP #define LOG_TAG "[APP_PWR]" #define LOG_INFO_ENABLE #include "debug.h" /** 电源模块总状态 */ typedef struct { uint8_t req_poweroff; AppPowerHook_t on_request; AppPowerHook_t on_finalize; } AppPowerCtx_t; static AppPowerCtx_t s_power; static void power_do_poweroff(void *priv); /** * @brief 初始化电源模块状态 * @return 无 */ void app_power_init(void) { s_power.req_poweroff = 0; s_power.on_request = NULL; s_power.on_finalize = NULL; } /** * @brief 注册深睡请求的两段式回调 * @param on_request 刚请求深睡时调用(停风扇;灯由调用方按关机类型决定) * @param on_finalize 延时到点后调用(真正进深睡,不会返回) * @return 无 */ void app_power_set_hooks(AppPowerHook_t on_request, AppPowerHook_t on_finalize) { s_power.on_request = on_request; s_power.on_finalize = on_finalize; } /** * @brief 请求深睡(按键 3s 等):立即触发 on_request 钩子,50ms 后触发 on_finalize * @return 无 */ void app_power_request_poweroff(void) { if (s_power.req_poweroff) { return; /* 已经在关机流程里,不要重复挂定时器 */ } s_power.req_poweroff = 1; log_info("request deep off\n"); if (s_power.on_request) { s_power.on_request(); /* 立刻停风扇、灯全灭 */ } sys_timeout_add(NULL, power_do_poweroff, 50); /* 给 GPIO 落稳一点再真正掉电 */ } /** * @brief 查询深睡请求是否已发起 * @return 1=已发起,0=未发起 */ uint8_t app_power_poweroff_pending(void) { return s_power.req_poweroff; } /** * @brief 当前这次关机是否为空电路径(本产品无电池,恒 0) * @return 0 */ uint8_t app_power_empty_off_pending(void) { return 0; } /** * @brief 50ms 延时到点:真正进入深睡 * @param priv 未使用 * @return 无 */ static void power_do_poweroff(void *priv) { (void)priv; log_info("enter deep off\n"); if (s_power.on_finalize) { s_power.on_finalize(); } }