魔盒最新版本,更新了充电检测,鸟叫,dp4对声音的控制,声音模块由于硬件问题暂未实测

This commit is contained in:
2026-09-09 15:32:50 +08:00
parent 3ab37b7845
commit b576f31113
22 changed files with 871 additions and 528 deletions
+71 -30
View File
@@ -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;