97 lines
3.2 KiB
C
97 lines
3.2 KiB
C
/******************************************************************************
|
|
* @file app_power.h
|
|
* @brief USB / 充电检测、电量采样与低电策略、深睡请求生命周期
|
|
* @author cyWu <1917507415@qq.com>
|
|
* @date 2026.08.27
|
|
* @version V1.2.0
|
|
* @history
|
|
* - V1.0.0, 2026.08.25, cyWu, 首次发布,实现 USB/充电检测、电量采样与深睡请求
|
|
* - V1.2.0, 2026.08.27, cyWu, 显示电量到 5% 立即走空电关机(停电机、红灯闪 5 下再掉电)
|
|
*
|
|
* @note 本模块只管“电从哪来、还剩多少、要不要关机”,不认识电机/灯/按键。
|
|
* 需要在 USB 插拔 / 深睡时联动其它模块的地方,一律走 app_power_set_hooks
|
|
* 注册的回调,调用方(usr_jb_main)负责接线,避免本模块反过来依赖别的模块。
|
|
******************************************************************************/
|
|
|
|
#ifndef __APP_POWER_H__
|
|
#define __APP_POWER_H__
|
|
|
|
#include <stdint.h>
|
|
|
|
/** USB 插拔的边沿事件,仅在状态变化那一次返回一次 */
|
|
typedef enum {
|
|
APP_POWER_EVT_NONE = 0,
|
|
APP_POWER_EVT_USB_IN,
|
|
APP_POWER_EVT_USB_OUT
|
|
} AppPowerEvt_t;
|
|
|
|
/** 深睡请求的钩子:on_request 立刻停电机并按关机类型处理灯;on_finalize 真正掉电 */
|
|
typedef void (*AppPowerHook_t)(void);
|
|
|
|
/**
|
|
* @brief 初始化电源模块状态
|
|
* @return 无
|
|
*/
|
|
void app_power_init(void);
|
|
|
|
/**
|
|
* @brief 注册深睡请求的两段式回调
|
|
* @param on_request 刚请求深睡时调用(停电机;灯效由调用方按关机类型决定)
|
|
* @param on_finalize 延时到点后调用(真正进深睡,不会返回)
|
|
* @return 无
|
|
*/
|
|
void app_power_set_hooks(AppPowerHook_t on_request, AppPowerHook_t on_finalize);
|
|
|
|
/**
|
|
* @brief 充电检测 + 电量采样,每个业务 tick 调用一次
|
|
* @param dt 距上次调用的毫秒数
|
|
* @return USB 插拔边沿事件,多数时候是 APP_POWER_EVT_NONE
|
|
*/
|
|
AppPowerEvt_t app_power_tick_1ms(uint16_t dt);
|
|
|
|
/**
|
|
* @brief 查询 USB 是否在位(含正在充电)
|
|
* @return 1=在位,0=未接
|
|
*/
|
|
uint8_t app_power_usb_online(void);
|
|
|
|
/**
|
|
* @brief 查询充电灯状态
|
|
* @return 0=无 1=充电中红灯 2=已充满绿灯
|
|
*/
|
|
uint8_t app_power_charge_led(void);
|
|
|
|
/**
|
|
* @brief 查询是否处于低电告警
|
|
* @return 1=低电,0=正常
|
|
*/
|
|
uint8_t app_power_low_bat(void);
|
|
|
|
/**
|
|
* @brief 请求深睡(按键 3s 等):立即触发 on_request 钩子,50ms 后触发 on_finalize
|
|
* @return 无
|
|
*/
|
|
void app_power_request_poweroff(void);
|
|
|
|
/**
|
|
* @brief 空电关机:立刻停电机,等红灯闪完 5 下后再真正掉电
|
|
* @note 调用方在 on_request 里根据 app_power_empty_off_pending() 挂空电灯效,
|
|
* 不要立刻灭灯。延时为 BOARD_LED_EMPTY_OFF_WAIT_MS。
|
|
* @return 无
|
|
*/
|
|
void app_power_request_empty_poweroff(void);
|
|
|
|
/**
|
|
* @brief 查询深睡请求是否已发起(发起后其它模块应停止响应新操作)
|
|
* @return 1=已发起,0=未发起
|
|
*/
|
|
uint8_t app_power_poweroff_pending(void);
|
|
|
|
/**
|
|
* @brief 当前这次关机是否为空电路径(红灯闪 5 下再掉电)
|
|
* @return 1=空电关机,0=普通关机
|
|
*/
|
|
uint8_t app_power_empty_off_pending(void);
|
|
|
|
#endif /* __APP_POWER_H__ */
|