新增 usr_app 产品逻辑:手动>定时>条件仲裁、条件控温湿、定时任务、数码管显示、 按键/LED、风扇档位、NVM 掉电恢复、配对与开关机,上电按规格恢复上次状态。 新增 usr_periph:AHT20、CT1642、板级引脚与硬件封装;见宝协议 cond_config 改为 7 字节编解码,并接入产品 DP。 补充《温湿度风扇_固件需求规格书》,工程加入对应源文件。 .gitignore 忽略 WorkBuddy/Cursor 本地会话
101 lines
2.5 KiB
C
101 lines
2.5 KiB
C
/******************************************************************************
|
|
* @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();
|
|
}
|
|
}
|