魔盒最新版本,更新了充电检测,鸟叫,dp4对声音的控制,声音模块由于硬件问题暂未实测
This commit is contained in:
+71
-30
@@ -36,14 +36,21 @@
|
||||
#define BAT_BOOT_MS 3000 /* 上电 3s 内不因低电深睡 */
|
||||
#define BAT_LOG_MS 10000
|
||||
#define BAT_PERIODIC_LOG_ENABLE 0 /* Production standby must not wake UART periodically. */
|
||||
#define CHG_ON_CONFIRM_MS 50u
|
||||
#define CHG_OFF_CONFIRM_MS 150u
|
||||
#define CHG_FULL_RECHECK_MS 1000u
|
||||
#define BAT_LOW_WIN 3 /* 连续约 2.4s 才进低电告警(仅闪灯,不关机) */
|
||||
|
||||
/** 充电检测:CHG/VPWR 消抖后的结果 */
|
||||
/** TP4056 CHRG/STDBY debounced charging state. */
|
||||
typedef struct {
|
||||
uint8_t usb_online;
|
||||
uint8_t charge_led; /**< 0=无 1=充电红 2=充满绿 */
|
||||
uint8_t charge_led_last; /**< 仅用于变化时打日志 */
|
||||
uint16_t full_ms; /**< 拔电瞬间 CHG 先变高,需等满 1s 才当充满 */
|
||||
uint8_t charge_led;
|
||||
uint8_t charge_led_last;
|
||||
uint16_t charging_ms;
|
||||
uint16_t unplugged_ms;
|
||||
uint16_t full_ms;
|
||||
uint16_t full_recheck_ms;
|
||||
uint8_t full_latched;
|
||||
} AppChargeState_t;
|
||||
|
||||
/** 电量采样:滑动平均 + 百分比 */
|
||||
@@ -221,7 +228,7 @@ static void power_do_poweroff(void *priv)
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 充电检测:CHG 低=充电中;VPWR 在且 CHG 高满 1s=充满;拔电报 USB_OUT
|
||||
* @brief TP4056 CHRG/STDBY 组合检测,稳定状态变化后报告 USB 事件
|
||||
* @param dt 距上次调用的毫秒数
|
||||
* @return USB 插拔边沿事件
|
||||
*/
|
||||
@@ -229,37 +236,71 @@ static AppPowerEvt_t power_charge_tick(uint16_t dt)
|
||||
{
|
||||
AppChargeState_t *c = &s_power.charge;
|
||||
uint8_t chg_low = bsp_chg_is_low();
|
||||
uint8_t vpwr = bsp_vpwr_is_online();
|
||||
uint8_t usb;
|
||||
uint8_t stby_low = bsp_stby_is_low();
|
||||
uint8_t usb = c->usb_online;
|
||||
AppPowerEvt_t evt = APP_POWER_EVT_NONE;
|
||||
|
||||
if (chg_low) {
|
||||
/* CHG 拉低:正在充电,红灯 */
|
||||
if (chg_low && stby_low) {
|
||||
/* 00 is invalid: keep the previous stable state. */
|
||||
c->charging_ms = 0;
|
||||
c->unplugged_ms = 0;
|
||||
c->full_ms = 0;
|
||||
c->charge_led = 1;
|
||||
gDevData.charge = CHARGE_1;
|
||||
usb = 1;
|
||||
} else if (vpwr) {
|
||||
/* VPWR 在但 CHG 已高:可能是充满,也可能是拔电瞬间 CHG 先变高。
|
||||
* 等满 BOARD_CHG_FULL_MS 才当真充满,避免拔电误报绿灯 */
|
||||
c->full_ms = app_add_ms(c->full_ms, dt);
|
||||
if (c->full_ms >= BOARD_CHG_FULL_MS) {
|
||||
c->charge_led = 2;
|
||||
c->full_recheck_ms = 0;
|
||||
} else if (!chg_low && !stby_low) {
|
||||
/* 11: charger absent. */
|
||||
c->charging_ms = 0;
|
||||
c->full_ms = 0;
|
||||
c->full_recheck_ms = 0;
|
||||
c->unplugged_ms = app_add_ms(c->unplugged_ms, dt);
|
||||
if (c->unplugged_ms >= CHG_OFF_CONFIRM_MS) {
|
||||
c->charge_led = 0;
|
||||
c->full_latched = 0;
|
||||
usb = 0;
|
||||
}
|
||||
gDevData.charge = (c->charge_led == 1) ? CHARGE_1 : CHARGE_2;
|
||||
usb = 1;
|
||||
} else {
|
||||
/* USB 不在位:充电灯灭 */
|
||||
} else if (chg_low) {
|
||||
/* 01: charging. */
|
||||
c->unplugged_ms = 0;
|
||||
c->full_ms = 0;
|
||||
c->charge_led = 0;
|
||||
gDevData.charge = CHARGE_2;
|
||||
usb = 0;
|
||||
if (c->full_latched) {
|
||||
c->charging_ms = 0;
|
||||
c->full_recheck_ms = app_add_ms(c->full_recheck_ms, dt);
|
||||
if (c->full_recheck_ms >= CHG_FULL_RECHECK_MS) {
|
||||
c->full_latched = 0;
|
||||
c->charge_led = 1;
|
||||
}
|
||||
usb = 1;
|
||||
} else {
|
||||
c->full_recheck_ms = 0;
|
||||
c->charging_ms = app_add_ms(c->charging_ms, dt);
|
||||
if (c->charging_ms >= CHG_ON_CONFIRM_MS) {
|
||||
c->charge_led = 1;
|
||||
usb = 1;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
/* 10: charge complete. */
|
||||
c->charging_ms = 0;
|
||||
c->unplugged_ms = 0;
|
||||
c->full_recheck_ms = 0;
|
||||
if (c->full_latched) {
|
||||
c->charge_led = 2;
|
||||
usb = 1;
|
||||
} else {
|
||||
c->full_ms = app_add_ms(c->full_ms, dt);
|
||||
if (c->full_ms >= BOARD_CHG_FULL_MS) {
|
||||
c->charge_led = 2;
|
||||
c->full_latched = 1;
|
||||
usb = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
gDevData.charge = (c->charge_led == 1) ? CHARGE_1 : CHARGE_2;
|
||||
|
||||
if (usb != c->usb_online) {
|
||||
c->usb_online = usb;
|
||||
log_info("usb %s vpwr=%d chg=%d mv=%d pair=%d goto=%d\n",
|
||||
usb ? "in" : "out", vpwr, chg_low, bsp_vpwr_mv(),
|
||||
log_info("charge input %s chg_low=%d stby_low=%d pair=%d goto=%d\n",
|
||||
usb ? "in" : "out", chg_low, stby_low,
|
||||
usr_get_pair_flag(), usr_var.usr_goto_pair);
|
||||
usr_var.usr_power_charge_flag = usb ? 1 : 2;
|
||||
if (usb) {
|
||||
@@ -272,10 +313,10 @@ static AppPowerEvt_t power_charge_tick(uint16_t dt)
|
||||
|
||||
if (c->charge_led != c->charge_led_last) {
|
||||
c->charge_led_last = c->charge_led;
|
||||
log_info("charge_led=%d chg=%d vpwr=%d mv=%d\n",
|
||||
c->charge_led, chg_low, vpwr, bsp_vpwr_mv());
|
||||
log_info("charge_led=%d chg_low=%d stby_low=%d\n",
|
||||
c->charge_led, chg_low, stby_low);
|
||||
if (c->charge_led == 2) {
|
||||
/* 硬件(CHG+VPWR 满 BOARD_CHG_FULL_MS)判定充满,电量强制收尾到
|
||||
/* STDBY 持续为低满 BOARD_CHG_FULL_MS 后判定充满,电量强制收尾到
|
||||
* 100%,避免电压拟合曲线因基准/温漂等原因走不到 100% 就卡住 */
|
||||
app_battery_set_percent(100);
|
||||
s_power.sample.pct = 100;
|
||||
|
||||
Reference in New Issue
Block a user