first
This commit is contained in:
743
apps/earphone/power_manage/app_charge.c
Normal file
743
apps/earphone/power_manage/app_charge.c
Normal file
@ -0,0 +1,743 @@
|
||||
#include "app_config.h"
|
||||
#include "asm/charge.h"
|
||||
#include "asm/pwm_led.h"
|
||||
#include "asm/power_interface.h"
|
||||
#include "ui_manage.h"
|
||||
#include "system/event.h"
|
||||
#include "system/app_core.h"
|
||||
#include "system/includes.h"
|
||||
#include "app_action.h"
|
||||
#include "asm/wdt.h"
|
||||
#include "app_power_manage.h"
|
||||
#include "app_chargestore.h"
|
||||
#include "app_testbox.h"
|
||||
#include "btstack/avctp_user.h"
|
||||
#include "app_action.h"
|
||||
#include "app_main.h"
|
||||
#include "bt_tws.h"
|
||||
#include "usb/otg.h"
|
||||
#include "bt_common.h"
|
||||
|
||||
#if TCFG_AUDIO_ANC_ENABLE
|
||||
#include "audio_anc.h"
|
||||
#endif
|
||||
|
||||
#if NTC_DET_EN
|
||||
#include "ntc_det_api.h"
|
||||
#endif
|
||||
|
||||
#if TCFG_ANC_BOX_ENABLE
|
||||
#include "app_ancbox.h"
|
||||
#endif
|
||||
|
||||
#define LOG_TAG_CONST APP_CHARGE
|
||||
#define LOG_TAG "[APP_CHARGE]"
|
||||
#define LOG_ERROR_ENABLE
|
||||
#define LOG_DEBUG_ENABLE
|
||||
#define LOG_INFO_ENABLE
|
||||
/* #define LOG_DUMP_ENABLE */
|
||||
#define LOG_CLI_ENABLE
|
||||
#include "debug.h"
|
||||
|
||||
extern void sys_enter_soft_poweroff(void *priv);
|
||||
extern void gSensor_wkupup_enable(void);
|
||||
extern void gSensor_wkupup_disable(void);
|
||||
extern u32 dual_bank_update_exist_flag_get(void);
|
||||
extern u32 classic_update_task_exist_flag_get(void);
|
||||
extern void lp_touch_key_disable(void);
|
||||
extern void linein_det_disable(void);
|
||||
extern void linein_det_enable(void);
|
||||
|
||||
#if TCFG_CHARGE_ENABLE
|
||||
|
||||
static u8 charge_full_flag = 0;
|
||||
#if TCFG_TEST_BOX_ENABLE || TCFG_ANC_BOX_ENABLE
|
||||
static int ldo5v_keep_timer = 0;
|
||||
#endif
|
||||
static u8 delay_timeout = 20;
|
||||
static int ldo5v_in_reset_timer = 0;
|
||||
static void ldo5v_in_reset_delay(void)
|
||||
{
|
||||
int deal_state = tws_api_get_tws_state();
|
||||
u8 cpu_reset_flag = 1;
|
||||
if (delay_timeout) {
|
||||
delay_timeout--;
|
||||
}
|
||||
if (deal_state & TWS_STA_SIBLING_CONNECTED && deal_state & TWS_STA_PHONE_CONNECTED && !(deal_state & TWS_STA_MONITOR_START)) {
|
||||
//tws已连接 手机已连接 从机未监听手机
|
||||
cpu_reset_flag = 0;
|
||||
} else {
|
||||
if (deal_state & TWS_STA_SIBLING_CONNECTED && deal_state & TWS_STA_ESCO_OPEN && !get_esco_coder_busy_flag()) {
|
||||
//手机有请求但没建立ESCO链路
|
||||
cpu_reset_flag = 0;
|
||||
}
|
||||
}
|
||||
printf("----------------ldo5v_in_reset_delay tws state:%x, delay_timeout:%d, cpu_reset_flag:%d\n", deal_state, delay_timeout, cpu_reset_flag);
|
||||
if (delay_timeout == 0 || cpu_reset_flag == 1) {
|
||||
if (ldo5v_in_reset_timer) {
|
||||
sys_timer_del(ldo5v_in_reset_timer);
|
||||
ldo5v_in_reset_timer = 0;
|
||||
}
|
||||
sys_enter_soft_poweroff((void *)1);
|
||||
}
|
||||
}
|
||||
|
||||
extern void power_event_to_user(u8 event);
|
||||
|
||||
u8 get_charge_full_flag(void)
|
||||
{
|
||||
return charge_full_flag;
|
||||
}
|
||||
|
||||
void charge_start_deal(void)
|
||||
{
|
||||
log_info("%s\n", __FUNCTION__);
|
||||
|
||||
power_set_mode(PWR_LDO15);
|
||||
|
||||
struct application *app;
|
||||
app = get_current_app();
|
||||
//在IDLE时才开启充电UI
|
||||
if (app && (!strcmp(app->name, APP_NAME_IDLE))) {
|
||||
ui_update_status(STATUS_CHARGE_START);
|
||||
}
|
||||
}
|
||||
|
||||
static void ldo5v_keep_delay_deal(void *priv)
|
||||
{
|
||||
log_info("%s\n", __func__);
|
||||
|
||||
#if TCFG_TEST_BOX_ENABLE
|
||||
ldo5v_keep_timer = 0;
|
||||
if (testbox_get_status()) {
|
||||
log_info("testbox online!\n");
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if TCFG_ANC_BOX_ENABLE
|
||||
ldo5v_keep_timer = 0;
|
||||
if (ancbox_get_status()) {
|
||||
log_info("ancbox online!\n");
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
struct application *app;
|
||||
app = get_current_app();
|
||||
if (app) {
|
||||
if (strcmp(app->name, APP_NAME_IDLE)) {
|
||||
sys_enter_soft_poweroff((void *)2);
|
||||
}
|
||||
}
|
||||
|
||||
pwm_led_mode_set(PWM_LED_ALL_OFF);
|
||||
os_time_dly(30);
|
||||
pwm_led_mode_set(PWM_LED1_ON);
|
||||
os_time_dly(40);
|
||||
|
||||
//兼容一些充电仓5v输出慢的时候会导致无法充电的问题
|
||||
if (get_lvcmp_det()) {
|
||||
log_info("...charge ing...\n");
|
||||
cpu_reset();
|
||||
}
|
||||
|
||||
log_info("get_charge_online_flag:%d %d\n", get_charge_online_flag(), get_ldo5v_online_hw());
|
||||
if (get_ldo5v_online_hw() && get_charge_online_flag()) {
|
||||
power_set_soft_poweroff();
|
||||
} else {
|
||||
#if TCFG_CHARGE_OFF_POWERON_NE
|
||||
cpu_reset();
|
||||
#else
|
||||
charge_check_and_set_pinr(1);
|
||||
power_set_soft_poweroff();
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*ldoin电压大于拔出电压(0.6V左右)且小于VBat电压时调用该函数进行一些错误提示或其他处理*/
|
||||
void ldo5v_keep_deal(void)
|
||||
{
|
||||
|
||||
log_info("%s\n", __func__);
|
||||
|
||||
//插入交换
|
||||
power_event_to_user(POWER_EVENT_POWER_CHANGE);
|
||||
|
||||
#if TCFG_GSENSOR_ENABLE
|
||||
//在舱关闭gSensor
|
||||
gSensor_wkupup_disable();
|
||||
#endif
|
||||
|
||||
#if TCFG_LINEIN_ENABLE
|
||||
//入舱关闭linein
|
||||
linein_det_disable();
|
||||
#endif
|
||||
|
||||
#if TCFG_LP_TOUCH_KEY_ENABLE
|
||||
extern void lp_touch_key_charge_mode_enter();
|
||||
lp_touch_key_charge_mode_enter();
|
||||
#endif /* #if TCFG_LP_TOUCH_KEY_ENABLE */
|
||||
|
||||
#if TCFG_GX8002_NPU_ENABLE
|
||||
extern void gx8002_module_suspend(u8 keep_vddio);
|
||||
gx8002_module_suspend(0);
|
||||
#endif /* #if TCFG_GX8002_NPU_ENABLE */
|
||||
|
||||
|
||||
charge_check_and_set_pinr(0);
|
||||
|
||||
#if TCFG_AUDIO_ANC_ENABLE
|
||||
#if TCFG_ANC_BOX_ENABLE
|
||||
if (!ancbox_get_status())
|
||||
#endif
|
||||
{
|
||||
anc_suspend();
|
||||
}
|
||||
#endif
|
||||
|
||||
if (get_charge_poweron_en() == 0) {
|
||||
#if TCFG_CHARGESTORE_ENABLE
|
||||
//智能充电舱不处理充电err
|
||||
struct application *app;
|
||||
app = get_current_app();
|
||||
if (app && (!strcmp(app->name, APP_NAME_IDLE))) {
|
||||
ui_update_status(STATUS_CHARGE_LDO5V_OFF);
|
||||
}
|
||||
|
||||
#else //TCFG_CHARGESTORE_ENABLE
|
||||
|
||||
#if defined(TCFG_CHARGE_KEEP_UPDATA) && TCFG_CHARGE_KEEP_UPDATA
|
||||
if (dual_bank_update_exist_flag_get() || classic_update_task_exist_flag_get()) {
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if TCFG_TEST_BOX_ENABLE || TCFG_ANC_BOX_ENABLE
|
||||
if (testbox_get_ex_enter_dut_flag()) {
|
||||
putchar('D');
|
||||
return;
|
||||
}
|
||||
|
||||
if (testbox_get_ex_enter_storage_mode_flag()) {
|
||||
putchar('S');
|
||||
return;
|
||||
}
|
||||
|
||||
if (ldo5v_keep_timer == 0) {
|
||||
//延时执行避免测试盒通信不上
|
||||
ldo5v_keep_timer = sys_timeout_add(NULL, ldo5v_keep_delay_deal, 250);
|
||||
}
|
||||
#else
|
||||
ldo5v_keep_delay_deal(NULL);
|
||||
#endif//TCFG_TEST_BOX_ENABLE || TCFG_ANC_BOX_ENABLE
|
||||
#endif//TCFG_CHARGESTORE_ENABLE
|
||||
} else {
|
||||
ui_update_status(STATUS_CHARGE_ERR);
|
||||
}
|
||||
}
|
||||
|
||||
extern u8 umidigi_chargestore_get_cover_status(void);
|
||||
void charge_full_deal(void)
|
||||
{
|
||||
log_info("%s\n", __func__);
|
||||
|
||||
charge_full_flag = 1;
|
||||
|
||||
charge_close();
|
||||
if (get_charge_poweron_en() == 0) {
|
||||
|
||||
#if (TCFG_LP_TOUCH_KEY_ENABLE && CHARGING_CLEAN_PHONE_INFO)
|
||||
extern void lp_touch_key_charge_mode_enter();
|
||||
lp_touch_key_charge_mode_enter();
|
||||
#endif
|
||||
/* power_set_soft_poweroff(); */
|
||||
#if TCFG_USER_TWS_ENABLE
|
||||
|
||||
#else
|
||||
ui_update_status(STATUS_CHARGE_FULL);
|
||||
#endif
|
||||
#if (!TCFG_CHARGESTORE_ENABLE)
|
||||
#if TCFG_UMIDIGI_BOX_ENABLE
|
||||
//当前为开盖
|
||||
if (umidigi_chargestore_get_cover_status() == 1) {
|
||||
vbat_timer_delete();
|
||||
}
|
||||
#else
|
||||
vbat_timer_delete();
|
||||
#endif
|
||||
#endif
|
||||
} else {
|
||||
ui_update_status(STATUS_CHARGE_FULL);
|
||||
}
|
||||
}
|
||||
|
||||
void charge_close_deal(void)
|
||||
{
|
||||
log_info("%s\n", __FUNCTION__);
|
||||
|
||||
power_set_mode(TCFG_LOWPOWER_POWER_SEL);
|
||||
|
||||
#if TCFG_USER_TWS_ENABLE
|
||||
//在idle的时候才执行充电关闭的UI
|
||||
struct application *app;
|
||||
app = get_current_app();
|
||||
if (app && (!strcmp(app->name, APP_NAME_IDLE))) {
|
||||
ui_update_status(STATUS_CHARGE_CLOSE);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
void charge_ldo5v_in_deal(void)
|
||||
{
|
||||
log_info("%s\n", __FUNCTION__);
|
||||
|
||||
|
||||
#if TCFG_IRSENSOR_ENABLE
|
||||
if (get_bt_tws_connect_status()) {
|
||||
tws_api_sync_call_by_uuid('T', SYNC_CMD_EARPHONE_CHAREG_START, 300);
|
||||
}
|
||||
#endif
|
||||
|
||||
//插入交换
|
||||
power_event_to_user(POWER_EVENT_POWER_CHANGE);
|
||||
|
||||
charge_full_flag = 0;
|
||||
|
||||
#if TCFG_GSENSOR_ENABLE
|
||||
//入舱关闭gSensor
|
||||
gSensor_wkupup_disable();
|
||||
#endif
|
||||
|
||||
#if TCFG_LINEIN_ENABLE
|
||||
//入舱关闭linein
|
||||
linein_det_disable();
|
||||
#endif
|
||||
|
||||
#if (TCFG_LP_TOUCH_KEY_ENABLE && !CHARGING_CLEAN_PHONE_INFO)
|
||||
extern void lp_touch_key_charge_mode_enter();
|
||||
lp_touch_key_charge_mode_enter();
|
||||
#endif /* #if TCFG_LP_TOUCH_KEY_ENABLE */
|
||||
|
||||
#if TCFG_GX8002_NPU_ENABLE
|
||||
extern void gx8002_module_suspend(u8 keep_vddio);
|
||||
gx8002_module_suspend(0);
|
||||
#endif /* #if TCFG_GX8002_NPU_ENABLE */
|
||||
|
||||
charge_check_and_set_pinr(0);
|
||||
|
||||
#if TCFG_AUDIO_ANC_ENABLE
|
||||
anc_suspend();
|
||||
#endif
|
||||
|
||||
#if TCFG_TEST_BOX_ENABLE
|
||||
testbox_clear_status();
|
||||
if (ldo5v_keep_timer) {
|
||||
sys_timeout_del(ldo5v_keep_timer);
|
||||
ldo5v_keep_timer = 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if TCFG_ANC_BOX_ENABLE
|
||||
ancbox_clear_status();
|
||||
if (ldo5v_keep_timer) {
|
||||
sys_timeout_del(ldo5v_keep_timer);
|
||||
ldo5v_keep_timer = 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if TCFG_CHARGESTORE_ENABLE
|
||||
chargestore_shutdown_reset();
|
||||
#endif
|
||||
|
||||
if (get_charge_poweron_en() == 0) {
|
||||
#if defined(TCFG_CHARGE_KEEP_UPDATA) && TCFG_CHARGE_KEEP_UPDATA
|
||||
if (dual_bank_update_exist_flag_get() || classic_update_task_exist_flag_get()) {
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
struct application *app;
|
||||
app = get_current_app();
|
||||
|
||||
#if TCFG_WIRELESS_MIC_ENABLE
|
||||
if (strcmp(app->name, APP_NAME_IDLE) != 0) {
|
||||
sys_enter_soft_poweroff((void *)1);
|
||||
}
|
||||
#endif
|
||||
if (app && strcmp(app->name, APP_NAME_IDLE)) {
|
||||
#if (TCFG_CHARGESTORE_ENABLE && TCFG_BLE_DEMO_SELECT == DEF_BLE_DEMO_ADV)
|
||||
if (!chargestore_check_going_to_poweroff()) {
|
||||
#endif
|
||||
#if TCFG_USER_TWS_ENABLE
|
||||
printf("----------------tws_api_get_tws_state %x\n", tws_api_get_tws_state());
|
||||
int deal_state = tws_api_get_tws_state();
|
||||
if (tws_api_get_role() == TWS_ROLE_MASTER && deal_state & TWS_STA_SIBLING_CONNECTED && deal_state & TWS_STA_PHONE_CONNECTED && !(deal_state & TWS_STA_MONITOR_START)) {
|
||||
if (ldo5v_in_reset_timer == 0) {
|
||||
delay_timeout = 30;
|
||||
ldo5v_in_reset_timer = sys_timer_add(NULL, ldo5v_in_reset_delay, 100);
|
||||
}
|
||||
} else {
|
||||
if (ldo5v_in_reset_timer) {
|
||||
sys_timer_del(ldo5v_in_reset_timer);
|
||||
ldo5v_in_reset_timer = 0;
|
||||
}
|
||||
sys_enter_soft_poweroff((void *)1);
|
||||
}
|
||||
#else
|
||||
sys_enter_soft_poweroff((void *)1);
|
||||
#endif
|
||||
#if (TCFG_CHARGESTORE_ENABLE && TCFG_BLE_DEMO_SELECT == DEF_BLE_DEMO_ADV)
|
||||
} else {
|
||||
log_info("chargestore do poweroff!\n");
|
||||
}
|
||||
#endif
|
||||
} else {
|
||||
charge_start();
|
||||
wdt_init(WDT_32S);
|
||||
log_info("set wdt to 32s!\n");
|
||||
goto _check_reset;
|
||||
}
|
||||
} else {
|
||||
charge_start();
|
||||
goto _check_reset;
|
||||
}
|
||||
return;
|
||||
|
||||
_check_reset:
|
||||
//防止耳机低电时,插拔充电有几率出现关机不充电问题
|
||||
if (app_var.goto_poweroff_flag) {
|
||||
cpu_reset();
|
||||
}
|
||||
}
|
||||
|
||||
#if TCFG_EARTCH_EVENT_HANDLE_ENABLE
|
||||
static u8 _enter_softoff_flag = 0;
|
||||
extern lp_touch_key_testbox_inear_trim(u8 flag);
|
||||
void exit_lp_touch_eartch_trim(void *priv)
|
||||
{
|
||||
log_info("<<<<<<<<<< exit_lp_touch_eartch_trim!\n");
|
||||
lp_touch_key_testbox_inear_trim(0);
|
||||
#if TCFG_PWMLED_ENABLE
|
||||
gpio_set_direction(TCFG_PWMLED_PIN, 1);
|
||||
#endif
|
||||
if (_enter_softoff_flag) {
|
||||
log_info("<<<<<<<<<<< sys_enter_soft_poweroff after eartch_trim!\n");
|
||||
sys_enter_soft_poweroff(NULL);
|
||||
} else {
|
||||
cpu_reset();
|
||||
}
|
||||
}
|
||||
void enter_lp_touch_eartch_trim(void *priv)
|
||||
{
|
||||
log_info(">>>>>>>>>> enter_lp_touch_eartch_trim!\n");
|
||||
lp_touch_key_testbox_inear_trim(1);
|
||||
sys_timeout_add(NULL, exit_lp_touch_eartch_trim, 1000);
|
||||
}
|
||||
#endif
|
||||
|
||||
//外置触摸断电
|
||||
void __attribute__((weak)) external_touch_key_disable(void)
|
||||
{
|
||||
|
||||
}
|
||||
//使能外置电源控制芯片对耳机进行断电
|
||||
void __attribute__((weak)) external_storage_io_disable(void)
|
||||
{
|
||||
|
||||
}
|
||||
//关闭vddio keep
|
||||
u8 __attribute__((weak)) power_set_vddio_keep(u8 en)
|
||||
{
|
||||
|
||||
}
|
||||
void charge_ldo5v_off_deal(void)
|
||||
{
|
||||
log_info("%s\n", __FUNCTION__);
|
||||
|
||||
//拨出交换
|
||||
power_event_to_user(POWER_EVENT_POWER_CHANGE);
|
||||
#if (TCFG_CHARGESTORE_ENABLE && TCFG_USER_TWS_ENABLE)
|
||||
if (TWS_ROLE_SLAVE == tws_api_get_role()) {
|
||||
chargestore_set_power_level(0xFF);
|
||||
}
|
||||
#endif
|
||||
charge_full_flag = 0;
|
||||
|
||||
charge_close();
|
||||
|
||||
struct application *app;
|
||||
app = get_current_app();
|
||||
//在idle的时候才执行充电拔出的UI
|
||||
if (app && (!strcmp(app->name, APP_NAME_IDLE))) {
|
||||
ui_update_status(STATUS_CHARGE_LDO5V_OFF);
|
||||
}
|
||||
|
||||
charge_check_and_set_pinr(1);
|
||||
|
||||
#if TCFG_TEST_BOX_ENABLE
|
||||
|
||||
#if TCFG_EARTCH_EVENT_HANDLE_ENABLE
|
||||
u8 sec = 0;
|
||||
u8 eartch_trim_en = testbox_get_touch_trim_en(&sec);
|
||||
if (eartch_trim_en) {
|
||||
log_info("******* testbox_get_touch_trim_en : %ds\n", sec);
|
||||
sys_timeout_add(NULL, enter_lp_touch_eartch_trim, sec * 1000);
|
||||
#if TCFG_PWMLED_ENABLE
|
||||
gpio_set_pull_up(TCFG_PWMLED_PIN, 0);
|
||||
gpio_set_pull_down(TCFG_PWMLED_PIN, 0);
|
||||
gpio_set_die(TCFG_PWMLED_PIN, 0);
|
||||
gpio_set_direction(TCFG_PWMLED_PIN, 0);
|
||||
gpio_write(TCFG_PWMLED_PIN, 1);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
if (testbox_get_status() && !get_total_connect_dev()) {
|
||||
if (!testbox_get_keep_tws_conn_flag()) {
|
||||
log_info("<<<<<<<<<<<<<<testbox out and bt noconn reset>>>>>>>>>>>>>>>\n");
|
||||
if (testbox_get_testbox_tws_paired() && testbox_get_softpwroff_after_paired()) {
|
||||
#if TCFG_EARTCH_EVENT_HANDLE_ENABLE
|
||||
if (eartch_trim_en) {
|
||||
_enter_softoff_flag = 1;
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
sys_enter_soft_poweroff(NULL);
|
||||
}
|
||||
} else {
|
||||
#if TCFG_EARTCH_EVENT_HANDLE_ENABLE
|
||||
if (eartch_trim_en) {
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
cpu_reset();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
log_info("testbox out ret\n");
|
||||
}
|
||||
}
|
||||
testbox_clear_status();
|
||||
if (ldo5v_keep_timer) {
|
||||
sys_timeout_del(ldo5v_keep_timer);
|
||||
ldo5v_keep_timer = 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if TCFG_CHARGESTORE_ENABLE
|
||||
chargestore_shutdown_reset();
|
||||
#endif
|
||||
|
||||
#if TCFG_AUDIO_ANC_ENABLE
|
||||
#if TCFG_ANC_BOX_ENABLE
|
||||
if (ldo5v_keep_timer) {
|
||||
sys_timeout_del(ldo5v_keep_timer);
|
||||
ldo5v_keep_timer = 0;
|
||||
}
|
||||
if (ancbox_get_status()) {
|
||||
return;
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
anc_resume();
|
||||
}
|
||||
#endif
|
||||
|
||||
#if TCFG_TEST_BOX_ENABLE
|
||||
if (testbox_get_ex_enter_storage_mode_flag()) {
|
||||
power_set_vddio_keep(0);//关VDDIO KEEP
|
||||
#if TCFG_LP_TOUCH_KEY_ENABLE
|
||||
lp_touch_key_disable();//仓储模式关内置触摸
|
||||
#else
|
||||
external_touch_key_disable(); //仓储模式关外置触摸供电
|
||||
#endif /* #if TCFG_LP_TOUCH_KEY_ENABLE */
|
||||
#if TCFG_EXTERN_STORAGE_MODE_ENABLE
|
||||
external_storage_io_disable();
|
||||
#endif/* TCFG_EXTERN_STORAGE_MODE_ENABLE */
|
||||
power_set_soft_poweroff();
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
if ((get_charge_poweron_en() == 0)) {
|
||||
|
||||
wdt_init(WDT_4S);
|
||||
log_info("set wdt to 4s!\n");
|
||||
#if TCFG_CHARGESTORE_ENABLE
|
||||
if (chargestore_get_power_status()) {
|
||||
#endif
|
||||
#if TCFG_CHARGE_OFF_POWERON_NE
|
||||
log_info("ldo5v off,task switch to BT\n");
|
||||
app_var.play_poweron_tone = 0;
|
||||
#if TCFG_SYS_LVD_EN
|
||||
vbat_check_init();
|
||||
#endif
|
||||
if (app && (app_var.goto_poweroff_flag == 0)) {
|
||||
if (strcmp(app->name, APP_NAME_BT)) {
|
||||
#if TCFG_SYS_LVD_EN
|
||||
if (get_vbat_need_shutdown() == FALSE) {
|
||||
#if TCFG_WIRELESS_MIC_ENABLE
|
||||
cpu_reset();
|
||||
#endif
|
||||
task_switch_to_bt();
|
||||
} else {
|
||||
log_info("ldo5v off,lowpower,need enter softpoweroff\n");
|
||||
power_set_soft_poweroff();
|
||||
}
|
||||
#else
|
||||
task_switch_to_bt();
|
||||
#endif
|
||||
}
|
||||
}
|
||||
#else //TCFG_CHARGE_OFF_POWERON_NE
|
||||
log_info("ldo5v off,enter softpoweroff\n");
|
||||
#if TCFG_LP_TOUCH_KEY_ENABLE
|
||||
extern void lp_touch_key_charge_mode_exit();
|
||||
lp_touch_key_charge_mode_exit();
|
||||
#endif /* #if TCFG_LP_TOUCH_KEY_ENABLE */
|
||||
power_set_soft_poweroff();
|
||||
#endif //TCFG_CHARGE_OFF_POWERON_NE
|
||||
#if TCFG_CHARGESTORE_ENABLE
|
||||
} else {
|
||||
log_info("ldo5v off,enter softpoweroff\n");
|
||||
if (app && (!strcmp(app->name, APP_NAME_BT))) { //软关机
|
||||
sys_enter_soft_poweroff(NULL);
|
||||
} else {
|
||||
power_set_soft_poweroff();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
} else {
|
||||
if (app && (!strcmp(app->name, APP_NAME_IDLE)) && (app_var.goto_poweroff_flag == 0)) {
|
||||
#if TCFG_CHARGE_OFF_POWERON_NE
|
||||
log_info("ldo5v off,task switch to BT\n");
|
||||
app_var.play_poweron_tone = 0;
|
||||
#if TCFG_SYS_LVD_EN
|
||||
vbat_check_init();
|
||||
#endif
|
||||
#if TCFG_SYS_LVD_EN
|
||||
if (get_vbat_need_shutdown() == FALSE) {
|
||||
task_switch_to_bt();
|
||||
} else {
|
||||
log_info("ldo5v off,lowpower,need enter softpoweroff\n");
|
||||
power_set_soft_poweroff();
|
||||
}
|
||||
#else
|
||||
task_switch_to_bt();
|
||||
#endif
|
||||
#else
|
||||
power_set_soft_poweroff();
|
||||
#endif
|
||||
}
|
||||
}
|
||||
#if TCFG_GSENSOR_ENABLE
|
||||
//出舱使能gSensor
|
||||
gSensor_wkupup_enable();
|
||||
#endif
|
||||
|
||||
#if TCFG_LINEIN_ENABLE
|
||||
//出舱开启linein检测
|
||||
linein_det_enable();
|
||||
#endif
|
||||
|
||||
#if TCFG_LP_TOUCH_KEY_ENABLE
|
||||
extern void lp_touch_key_charge_mode_exit();
|
||||
lp_touch_key_charge_mode_exit();
|
||||
#endif /* #if TCFG_LP_TOUCH_KEY_ENABLE */
|
||||
|
||||
#if TCFG_TEST_BOX_ENABLE
|
||||
if (testbox_get_ex_enter_storage_mode_flag()) {
|
||||
power_set_vddio_keep(0);//关VDDIO KEEP
|
||||
#if TCFG_LP_TOUCH_KEY_ENABLE
|
||||
lp_touch_key_disable();//仓储模式关内置触摸
|
||||
#else
|
||||
external_touch_key_disable(); //仓储模式关外置触摸供电
|
||||
#endif /* #if TCFG_LP_TOUCH_KEY_ENABLE */
|
||||
//测试盒仓储模式使能后,断开测试盒直接关机
|
||||
power_set_soft_poweroff();
|
||||
}
|
||||
#endif
|
||||
|
||||
#if TCFG_GX8002_NPU_ENABLE
|
||||
extern void gx8002_module_resumed();
|
||||
gx8002_module_resumed();
|
||||
#endif /* #if TCFG_GX8002_NPU_ENABLE */
|
||||
}
|
||||
|
||||
int app_charge_event_handler(struct device_event *dev)
|
||||
{
|
||||
int ret = false;
|
||||
u8 otg_status = 0;
|
||||
|
||||
switch (dev->event) {
|
||||
case CHARGE_EVENT_CHARGE_START:
|
||||
#if NTC_DET_EN
|
||||
ntc_det_start();
|
||||
#endif
|
||||
charge_start_deal();
|
||||
break;
|
||||
case CHARGE_EVENT_CHARGE_CLOSE:
|
||||
#if NTC_DET_EN
|
||||
ntc_det_stop();
|
||||
#endif
|
||||
charge_close_deal();
|
||||
break;
|
||||
case CHARGE_EVENT_CHARGE_FULL:
|
||||
charge_full_deal();
|
||||
break;
|
||||
case CHARGE_EVENT_LDO5V_KEEP:
|
||||
#if NTC_DET_EN
|
||||
ntc_det_stop();
|
||||
#endif
|
||||
ldo5v_keep_deal();
|
||||
break;
|
||||
case CHARGE_EVENT_LDO5V_IN:
|
||||
#if ((TCFG_OTG_MODE & OTG_SLAVE_MODE) && (TCFG_OTG_MODE & OTG_CHARGE_MODE))
|
||||
while (1) {
|
||||
otg_status = usb_otg_online(0);
|
||||
if (otg_status != IDLE_MODE) {
|
||||
break;
|
||||
}
|
||||
os_time_dly(2);
|
||||
}
|
||||
if (otg_status == SLAVE_MODE) {
|
||||
set_charge_poweron_en(1);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (get_charge_poweron_en() || (otg_status != SLAVE_MODE)) {
|
||||
charge_ldo5v_in_deal();
|
||||
}
|
||||
break;
|
||||
case CHARGE_EVENT_LDO5V_OFF:
|
||||
#if ((TCFG_OTG_MODE & OTG_SLAVE_MODE) && (TCFG_OTG_MODE & OTG_CHARGE_MODE))
|
||||
while (1) {
|
||||
otg_status = usb_otg_online(0);
|
||||
if (otg_status != IDLE_MODE) {
|
||||
break;
|
||||
}
|
||||
os_time_dly(2);
|
||||
}
|
||||
#endif
|
||||
if (get_charge_poweron_en() || (otg_status != SLAVE_MODE)) {
|
||||
charge_ldo5v_off_deal();
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
u8 get_charge_full_flag(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
859
apps/earphone/power_manage/app_chargestore.c
Normal file
859
apps/earphone/power_manage/app_chargestore.c
Normal file
@ -0,0 +1,859 @@
|
||||
#include "init.h"
|
||||
#include "app_config.h"
|
||||
#include "system/includes.h"
|
||||
#include "asm/charge.h"
|
||||
#include "asm/chargestore.h"
|
||||
#include "user_cfg.h"
|
||||
#include "app_chargestore.h"
|
||||
#include "device/vm.h"
|
||||
#include "btstack/avctp_user.h"
|
||||
#include "app_power_manage.h"
|
||||
#include "app_action.h"
|
||||
#include "app_main.h"
|
||||
#include "app_charge.h"
|
||||
#include "app_testbox.h"
|
||||
#include "classic/tws_api.h"
|
||||
#include "update.h"
|
||||
#include "bt_ble.h"
|
||||
#include "bt_tws.h"
|
||||
#include "app_action.h"
|
||||
#include "bt_common.h"
|
||||
#include "le_rcsp_adv_module.h"
|
||||
|
||||
#define LOG_TAG_CONST APP_CHARGESTORE
|
||||
#define LOG_TAG "[APP_CHARGESTORE]"
|
||||
#define LOG_ERROR_ENABLE
|
||||
#define LOG_DEBUG_ENABLE
|
||||
#define LOG_INFO_ENABLE
|
||||
/* #define LOG_DUMP_ENABLE */
|
||||
#define LOG_CLI_ENABLE
|
||||
#include "debug.h"
|
||||
|
||||
extern void sys_enter_soft_poweroff(void *priv);
|
||||
extern void tws_api_set_connect_aa_allways(u32 connect_aa);
|
||||
extern u32 tws_le_get_pair_aa(void);
|
||||
extern u32 tws_le_get_connect_aa(void);
|
||||
extern u32 tws_le_get_search_aa(void);
|
||||
extern void bt_get_vm_mac_addr(u8 *addr);
|
||||
extern bool get_tws_sibling_connect_state(void);
|
||||
extern bool get_tws_phone_connect_state(void);
|
||||
extern void cpu_reset();
|
||||
extern u32 dual_bank_update_exist_flag_get(void);
|
||||
extern u32 classic_update_task_exist_flag_get(void);
|
||||
extern char tws_api_get_local_channel();
|
||||
extern u16 bt_get_tws_device_indicate(u8 *tws_device_indicate);
|
||||
extern void bt_tws_remove_pairs();
|
||||
extern const u8 *bt_get_mac_addr();
|
||||
|
||||
//-----------------------------------------------------------------------------------
|
||||
//-----------以下配对相关的接口,提供充电舱和蓝牙测试盒-------------------------------
|
||||
//-----------------------------------------------------------------------------------
|
||||
#if (TCFG_CHARGESTORE_ENABLE || TCFG_TEST_BOX_ENABLE)
|
||||
#if TCFG_USER_TWS_ENABLE
|
||||
static void new_addr_generating_for_pair(u8 *addr)
|
||||
{
|
||||
u8 i;
|
||||
for (i = 0; i < 6; i++) {
|
||||
addr[i] = addr[i] + 1;
|
||||
}
|
||||
}
|
||||
|
||||
void chargestore_set_tws_channel_info(u8 channel)
|
||||
{
|
||||
if ((channel == 'L') || (channel == 'R')) {
|
||||
syscfg_write(CFG_CHARGESTORE_TWS_CHANNEL, &channel, 1);
|
||||
}
|
||||
}
|
||||
|
||||
u8 chargestore_get_tws_channel_info(void)
|
||||
{
|
||||
u8 channel = 'U';
|
||||
syscfg_read(CFG_CHARGESTORE_TWS_CHANNEL, &channel, 1);
|
||||
return channel;
|
||||
}
|
||||
|
||||
static u8 tws_paired_flag;
|
||||
bool chargestore_set_tws_remote_info(u8 *data, u8 len)
|
||||
{
|
||||
u8 i;
|
||||
bool ret = true;
|
||||
int w_ret = 0;
|
||||
u8 remote_addr[6];
|
||||
u8 common_addr[6];
|
||||
u8 local_addr[6];
|
||||
CHARGE_STORE_INFO *charge_store_info = (CHARGE_STORE_INFO *)data;
|
||||
if (len > sizeof(CHARGE_STORE_INFO)) {
|
||||
log_error("len err\n");
|
||||
return false;
|
||||
}
|
||||
//set remote addr
|
||||
syscfg_read(CFG_TWS_REMOTE_ADDR, remote_addr, sizeof(remote_addr));
|
||||
if (memcmp(remote_addr, charge_store_info->tws_local_addr, sizeof(remote_addr))) {
|
||||
ret = false;
|
||||
}
|
||||
|
||||
#if TCFG_TEST_BOX_ENABLE
|
||||
if (testbox_get_status()) {
|
||||
//using new remote addr generating;
|
||||
new_addr_generating_for_pair(charge_store_info->tws_local_addr);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (sizeof(remote_addr) != syscfg_write(CFG_TWS_REMOTE_ADDR, charge_store_info->tws_local_addr, sizeof(remote_addr))) {
|
||||
w_ret = -1;
|
||||
}
|
||||
|
||||
bt_get_tws_local_addr(local_addr);
|
||||
|
||||
#if TCFG_TEST_BOX_ENABLE
|
||||
if (testbox_get_status()) {
|
||||
new_addr_generating_for_pair(local_addr);
|
||||
if (sizeof(local_addr) != syscfg_write(CFG_TWS_LOCAL_ADDR, local_addr, sizeof(local_addr))) {
|
||||
w_ret = -2;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if (CONFIG_TWS_COMMON_ADDR_SELECT != CONFIG_TWS_COMMON_ADDR_USED_LEFT)
|
||||
//set common addr
|
||||
syscfg_read(CFG_TWS_COMMON_ADDR, common_addr, sizeof(common_addr));
|
||||
|
||||
for (i = 0; i < sizeof(common_addr); i++) {
|
||||
if (common_addr[i] != (u8)(local_addr[i] + charge_store_info->tws_local_addr[i])) {
|
||||
ret = false;
|
||||
}
|
||||
common_addr[i] = local_addr[i] + charge_store_info->tws_local_addr[i];
|
||||
}
|
||||
|
||||
if (sizeof(common_addr) != syscfg_write(CFG_TWS_COMMON_ADDR, common_addr, sizeof(common_addr))) {
|
||||
w_ret = -3;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef CONFIG_NEW_BREDR_ENABLE
|
||||
if (chargestore_get_tws_channel_info() == 'L') {
|
||||
if (tws_le_get_connect_aa() != tws_le_get_pair_aa()) {
|
||||
ret = false;
|
||||
}
|
||||
tws_api_set_connect_aa_allways(tws_le_get_pair_aa());
|
||||
} else {
|
||||
if (tws_le_get_connect_aa() != charge_store_info->pair_aa) {
|
||||
ret = false;
|
||||
}
|
||||
tws_api_set_connect_aa_allways(charge_store_info->pair_aa);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if TCFG_TEST_BOX_ENABLE
|
||||
if (testbox_get_status() && (0 == w_ret)) {
|
||||
u8 cmd = CMD_BOX_TWS_REMOTE_ADDR;
|
||||
chargestore_api_write(&cmd, 1);
|
||||
testbox_set_testbox_tws_paired(1);
|
||||
}
|
||||
#endif
|
||||
return ret;
|
||||
}
|
||||
|
||||
void chargestore_clean_tws_conn_info(u8 type)
|
||||
{
|
||||
CHARGE_STORE_INFO charge_store_info;
|
||||
log_info("chargestore_clean_tws_conn_info=%d\n", type);
|
||||
if (type == TWS_DEL_TWS_ADDR) {
|
||||
log_info("TWS_DEL_TWS_ADDR\n");
|
||||
} else if (type == TWS_DEL_PHONE_ADDR) {
|
||||
log_info("TWS_DEL_PHONE_ADDR\n");
|
||||
} else if (type == TWS_DEL_ALL_ADDR) {
|
||||
log_info("TWS_DEL_ALL_ADDR\n");
|
||||
}
|
||||
memset(&charge_store_info, 0xff, sizeof(CHARGE_STORE_INFO));
|
||||
syscfg_write(CFG_TWS_REMOTE_ADDR, charge_store_info.tws_remote_addr, sizeof(charge_store_info.tws_remote_addr));
|
||||
}
|
||||
|
||||
#endif //TCFG_USER_TWS_ENABLE
|
||||
|
||||
u16 chargestore_get_tws_remote_info(u8 *data)
|
||||
{
|
||||
u16 ret_len = 0;
|
||||
u16 device_ind;
|
||||
CHARGE_STORE_INFO *charge_store_info = (CHARGE_STORE_INFO *)data;
|
||||
#if TCFG_USER_TWS_ENABLE
|
||||
bt_get_tws_local_addr(charge_store_info->tws_local_addr);
|
||||
bt_get_vm_mac_addr(charge_store_info->tws_mac_addr);
|
||||
#if TCFG_TEST_BOX_ENABLE
|
||||
if (testbox_get_keep_tws_conn_flag()) {
|
||||
memcpy(charge_store_info->tws_mac_addr, bt_get_mac_addr(), 6);
|
||||
}
|
||||
#endif
|
||||
#ifndef CONFIG_NEW_BREDR_ENABLE
|
||||
charge_store_info->search_aa = tws_le_get_search_aa();
|
||||
charge_store_info->pair_aa = tws_le_get_pair_aa();
|
||||
#endif
|
||||
|
||||
#if (CONFIG_TWS_CHANNEL_SELECT == CONFIG_TWS_AS_LEFT_CHANNEL) \
|
||||
||(CONFIG_TWS_CHANNEL_SELECT == CONFIG_TWS_AS_RIGHT_CHANNEL) \
|
||||
||(CONFIG_TWS_CHANNEL_SELECT == CONFIG_TWS_EXTERN_DOWN_AS_LEFT) \
|
||||
||(CONFIG_TWS_CHANNEL_SELECT == CONFIG_TWS_EXTERN_UP_AS_LEFT)
|
||||
charge_store_info->local_channel = tws_api_get_local_channel();
|
||||
#else
|
||||
charge_store_info->local_channel = 'U';
|
||||
#endif
|
||||
charge_store_info->device_ind = bt_get_tws_device_indicate(NULL);
|
||||
charge_store_info->reserved_data = chargestore_api_crc8(data, sizeof(CHARGE_STORE_INFO) - 2);
|
||||
#if TCFG_TEST_BOX_ENABLE
|
||||
if (testbox_get_status()) {
|
||||
charge_store_info->reserved_data = 0;
|
||||
}
|
||||
#endif
|
||||
#else
|
||||
bt_get_vm_mac_addr(charge_store_info->tws_mac_addr);
|
||||
#endif
|
||||
ret_len = sizeof(CHARGE_STORE_INFO);
|
||||
return ret_len;
|
||||
}
|
||||
|
||||
#endif //TCFG_CHARGESTORE_ENABLE || TCFG_TEST_BOX_ENABLE
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------------
|
||||
//-----------分割线---------以下是充电舱流程实现-------------------------------------
|
||||
//-----------------------------------------------------------------------------------
|
||||
#if TCFG_CHARGESTORE_ENABLE
|
||||
|
||||
struct chargestore_info {
|
||||
int timer;
|
||||
int shutdown_timer;
|
||||
u8 version;
|
||||
u8 chip_type;
|
||||
u8 max_packet_size;//充电舱端一包的最大值
|
||||
u8 bt_init_ok;//蓝牙协议栈初始化成功
|
||||
u8 power_level;//本机记录的充电舱电量百分比
|
||||
u8 pre_power_lvl;
|
||||
u8 sibling_chg_lev;//对耳同步的充电舱电量
|
||||
u8 power_status;//充电舱供电状态 0:断电 5V不在线 1:升压 5V在线
|
||||
u8 cover_status;//充电舱盖子状态 0:合盖 1:开盖
|
||||
u8 connect_status;//通信成功
|
||||
u8 ear_number;//盒盖时耳机在线数
|
||||
u8 channel;//左右
|
||||
u8 tws_power;//对耳的电量
|
||||
u8 power_sync;//第一次获取到充电舱电量时,同步到对耳
|
||||
u8 pair_flag;//配对标记
|
||||
u8 close_ing;//等待合窗超时
|
||||
u8 active_disconnect;//主动断开连接
|
||||
u8 switch2bt;
|
||||
};
|
||||
|
||||
static struct chargestore_info info = {
|
||||
.power_status = 1,
|
||||
.ear_number = 1,
|
||||
.tws_power = 0xff,
|
||||
.power_level = 0xff,
|
||||
.sibling_chg_lev = 0xff,
|
||||
.max_packet_size = 32,
|
||||
.channel = 'U',
|
||||
};
|
||||
|
||||
#define __this (&info)
|
||||
static u8 local_packet[36];
|
||||
static CHARGE_STORE_INFO read_info, write_info;
|
||||
static u8 read_index, write_index;
|
||||
|
||||
u8 chargestore_get_power_level(void)
|
||||
{
|
||||
if ((__this->power_level == 0xff) ||
|
||||
((!get_charge_online_flag()) &&
|
||||
(__this->sibling_chg_lev != 0xff))) {
|
||||
return __this->sibling_chg_lev;
|
||||
}
|
||||
return __this->power_level;
|
||||
}
|
||||
|
||||
u8 chargestore_get_power_status(void)
|
||||
{
|
||||
return __this->power_status;
|
||||
}
|
||||
|
||||
u8 chargestore_get_cover_status(void)
|
||||
{
|
||||
return __this->cover_status;
|
||||
}
|
||||
|
||||
u8 chargestore_get_earphone_online(void)
|
||||
{
|
||||
return __this->ear_number;
|
||||
}
|
||||
|
||||
void chargestore_set_earphone_online(u8 ear_number)
|
||||
{
|
||||
__this->ear_number = ear_number;
|
||||
}
|
||||
|
||||
void chargestore_set_pair_flag(u8 pair_flag)
|
||||
{
|
||||
__this->pair_flag = pair_flag;
|
||||
}
|
||||
|
||||
void chargestore_set_active_disconnect(u8 active_disconnect)
|
||||
{
|
||||
__this->active_disconnect = active_disconnect;
|
||||
}
|
||||
|
||||
u8 chargestore_get_earphone_pos(void)
|
||||
{
|
||||
u8 channel = 'U';
|
||||
#if TCFG_USER_TWS_ENABLE
|
||||
channel = chargestore_get_tws_channel_info();
|
||||
#endif
|
||||
log_info("get_ear_channel = %c\n", channel);
|
||||
return channel;
|
||||
}
|
||||
|
||||
u8 chargestore_get_sibling_power_level(void)
|
||||
{
|
||||
return __this->tws_power;
|
||||
}
|
||||
|
||||
#if TCFG_USER_TWS_ENABLE
|
||||
static void set_tws_sibling_charge_level(void *_data, u16 len, bool rx)
|
||||
{
|
||||
if (rx) {
|
||||
u8 *data = (u8 *)_data;
|
||||
chargestore_set_sibling_chg_lev(data[0]);
|
||||
}
|
||||
}
|
||||
|
||||
REGISTER_TWS_FUNC_STUB(charge_level_stub) = {
|
||||
.func_id = TWS_FUNC_ID_CHARGE_SYNC,
|
||||
.func = set_tws_sibling_charge_level,
|
||||
};
|
||||
|
||||
#endif //TCFG_USER_TWS_ENABLE
|
||||
|
||||
int chargestore_sync_chg_level(void)
|
||||
{
|
||||
#if TCFG_USER_TWS_ENABLE
|
||||
int err = -1;
|
||||
struct application *app = get_current_app();
|
||||
if (app && (!strcmp(app->name, "earphone")) && (!app_var.goto_poweroff_flag)) {
|
||||
err = tws_api_send_data_to_sibling((u8 *)&__this->power_level, 1,
|
||||
TWS_FUNC_ID_CHARGE_SYNC);
|
||||
}
|
||||
return err;
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
void chargestore_set_sibling_chg_lev(u8 chg_lev)
|
||||
{
|
||||
__this->sibling_chg_lev = chg_lev;
|
||||
}
|
||||
|
||||
void chargestore_set_power_level(u8 power)
|
||||
{
|
||||
__this->power_level = power;
|
||||
}
|
||||
|
||||
u8 chargestore_check_going_to_poweroff(void)
|
||||
{
|
||||
return __this->close_ing;
|
||||
}
|
||||
|
||||
void chargestore_shutdown_reset(void)
|
||||
{
|
||||
if (__this->shutdown_timer) {
|
||||
sys_timer_del(__this->shutdown_timer);
|
||||
__this->shutdown_timer = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void chargestore_set_bt_init_ok(u8 flag)
|
||||
{
|
||||
__this->bt_init_ok = flag;
|
||||
}
|
||||
|
||||
void chargestore_shutdown_do(void *priv)
|
||||
{
|
||||
log_info("chargestore shutdown!\n");
|
||||
power_set_soft_poweroff();
|
||||
}
|
||||
|
||||
void chargestore_event_to_user(u8 *packet, u32 type, u8 event, u8 size)
|
||||
{
|
||||
struct sys_event e;
|
||||
e.type = SYS_DEVICE_EVENT;
|
||||
if (packet != NULL) {
|
||||
if (size > sizeof(local_packet)) {
|
||||
return;
|
||||
}
|
||||
e.u.chargestore.packet = local_packet;
|
||||
memcpy(e.u.chargestore.packet, packet, size);
|
||||
}
|
||||
e.arg = (void *)type;
|
||||
e.u.chargestore.event = event;
|
||||
e.u.chargestore.size = size;
|
||||
sys_event_notify(&e);
|
||||
}
|
||||
|
||||
#if TCFG_USER_TWS_ENABLE
|
||||
bool chargestore_check_data_succ(u8 *data, u8 len)
|
||||
{
|
||||
u16 crc;
|
||||
u16 device_ind;
|
||||
CHARGE_STORE_INFO *charge_store_info = (CHARGE_STORE_INFO *)data;
|
||||
if (len > sizeof(CHARGE_STORE_INFO)) {
|
||||
log_error("len err\n");
|
||||
return false;
|
||||
}
|
||||
crc = chargestore_api_crc8(data, len - 2);
|
||||
if (crc != charge_store_info->reserved_data) {
|
||||
log_error("crc err\n");
|
||||
return false;
|
||||
}
|
||||
device_ind = bt_get_tws_device_indicate(NULL);
|
||||
if (device_ind != charge_store_info->device_ind) {
|
||||
log_error("device_ind err\n");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
u16 chargestore_f95_read_tws_remote_info(u8 *data, u8 flag)
|
||||
{
|
||||
u8 read_len;
|
||||
u8 *pbuf = (u8 *)&read_info;
|
||||
if (flag) {//first packet
|
||||
read_index = 0;
|
||||
chargestore_get_tws_remote_info((u8 *)&read_info);
|
||||
}
|
||||
read_len = sizeof(read_info) - read_index;
|
||||
read_len = (read_len > (__this->max_packet_size - 1)) ? (__this->max_packet_size - 1) : read_len;
|
||||
memcpy(data, pbuf + read_index, read_len);
|
||||
read_index += read_len;
|
||||
return read_len;
|
||||
}
|
||||
|
||||
u16 chargestore_f95_write_tws_remote_info(u8 *data, u8 len, u8 flag)
|
||||
{
|
||||
u8 write_len;
|
||||
u8 *pbuf = (u8 *)&write_info;
|
||||
if (flag) {
|
||||
write_index = 0;
|
||||
memset(&write_info, 0, sizeof(write_info));
|
||||
}
|
||||
write_len = sizeof(write_info) - write_index;
|
||||
write_len = (write_len >= len) ? len : write_len;
|
||||
memcpy(pbuf + write_index, data, write_len);
|
||||
write_index += write_len;
|
||||
return write_len;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
void chargestore_timeout_deal(void *priv)
|
||||
{
|
||||
__this->timer = 0;
|
||||
__this->close_ing = 0;
|
||||
if ((!__this->cover_status) || __this->active_disconnect) {//当前为合盖或者主动断开连接
|
||||
struct application *app = get_current_app();
|
||||
if (app && strcmp(app->name, "idle")) {
|
||||
sys_enter_soft_poweroff((void *)1);
|
||||
}
|
||||
} else {
|
||||
|
||||
#if (TCFG_BLE_DEMO_SELECT == DEF_BLE_DEMO_ADV)
|
||||
|
||||
/* if ((!get_total_connect_dev()) && (tws_api_get_role() == TWS_ROLE_MASTER) && (get_bt_tws_connect_status())) { */
|
||||
if (tws_api_get_role() == TWS_ROLE_MASTER) {
|
||||
printf("charge_icon_ctl...\n");
|
||||
bt_ble_icon_reset();
|
||||
#if CONFIG_NO_DISPLAY_BUTTON_ICON
|
||||
if (get_total_connect_dev()) {
|
||||
//蓝牙未真正断开;重新广播
|
||||
bt_ble_icon_open(ICON_TYPE_RECONNECT);
|
||||
} else {
|
||||
//蓝牙未连接,重新开可见性
|
||||
bt_ble_icon_open(ICON_TYPE_INQUIRY);
|
||||
}
|
||||
#else
|
||||
//不管蓝牙是否连接,默认打开
|
||||
bt_ble_icon_open(ICON_TYPE_RECONNECT);
|
||||
#endif
|
||||
|
||||
}
|
||||
#elif (TCFG_BLE_DEMO_SELECT == DEF_BLE_DEMO_ADV_RCSP)
|
||||
if (tws_api_get_role() == TWS_ROLE_MASTER) {
|
||||
printf("charge_icon_ctl...\n");
|
||||
#if CONFIG_NO_DISPLAY_BUTTON_ICON
|
||||
if (get_total_connect_dev()) {
|
||||
//蓝牙未真正断开;重新广播
|
||||
bt_ble_adv_ioctl(BT_ADV_SET_EDR_CON_FLAG, SECNE_CONNECTED, 1);
|
||||
} else {
|
||||
//蓝牙未连接,重新开可见性
|
||||
bt_ble_adv_ioctl(BT_ADV_SET_EDR_CON_FLAG, SECNE_UNCONNECTED, 1);
|
||||
}
|
||||
#else
|
||||
//不管蓝牙是否连接,默认打开
|
||||
bt_ble_adv_ioctl(BT_ADV_SET_EDR_CON_FLAG, SECNE_CONNECTED, 1);
|
||||
#endif
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
}
|
||||
__this->ear_number = 1;
|
||||
}
|
||||
|
||||
void chargestore_set_phone_disconnect(void)
|
||||
{
|
||||
#if (TCFG_BLE_DEMO_SELECT == DEF_BLE_DEMO_ADV)
|
||||
#if (!CONFIG_NO_DISPLAY_BUTTON_ICON)
|
||||
if (__this->pair_flag && get_tws_sibling_connect_state()) {
|
||||
//check ble inquiry
|
||||
//printf("get box log_key...con_dev=%d\n",get_tws_phone_connect_state());
|
||||
if ((bt_ble_icon_get_adv_state() == ADV_ST_RECONN)
|
||||
|| (bt_ble_icon_get_adv_state() == ADV_ST_DISMISS)
|
||||
|| (bt_ble_icon_get_adv_state() == ADV_ST_END)) {
|
||||
bt_ble_icon_reset();
|
||||
bt_ble_icon_open(ICON_TYPE_INQUIRY);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
__this->pair_flag = 0;
|
||||
#elif (TCFG_BLE_DEMO_SELECT == DEF_BLE_DEMO_ADV_RCSP)
|
||||
#if (!CONFIG_NO_DISPLAY_BUTTON_ICON)
|
||||
if (__this->pair_flag && get_tws_sibling_connect_state()) {
|
||||
//check ble inquiry
|
||||
bt_ble_adv_ioctl(BT_ADV_SET_EDR_CON_FLAG, SECNE_UNCONNECTED, 1);
|
||||
}
|
||||
#endif
|
||||
__this->pair_flag = 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
void chargestore_set_phone_connect(void)
|
||||
{
|
||||
__this->active_disconnect = 0;
|
||||
}
|
||||
|
||||
int app_chargestore_event_handler(struct chargestore_event *chargestore_dev)
|
||||
{
|
||||
int ret = false;
|
||||
struct application *app = get_current_app();
|
||||
#if defined(TCFG_CHARGE_KEEP_UPDATA) && TCFG_CHARGE_KEEP_UPDATA
|
||||
//在升级过程中,不响应智能充电舱app层消息
|
||||
if (dual_bank_update_exist_flag_get() || classic_update_task_exist_flag_get()) {
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
switch (chargestore_dev->event) {
|
||||
case CMD_RESTORE_SYS:
|
||||
#if TCFG_USER_TWS_ENABLE
|
||||
bt_tws_remove_pairs();
|
||||
#endif
|
||||
user_send_cmd_prepare(USER_CTRL_DEL_ALL_REMOTE_INFO, 0, NULL);
|
||||
cpu_reset();
|
||||
break;
|
||||
case CMD_TWS_CHANNEL_SET:
|
||||
#if TCFG_USER_TWS_ENABLE
|
||||
chargestore_set_tws_channel_info(__this->channel);
|
||||
#endif
|
||||
break;
|
||||
#if TCFG_USER_TWS_ENABLE
|
||||
case CMD_TWS_REMOTE_ADDR:
|
||||
log_info("event_CMD_TWS_REMOTE_ADDR\n");
|
||||
if (chargestore_set_tws_remote_info(chargestore_dev->packet, chargestore_dev->size) == false) {
|
||||
//交换地址后,断开与手机连接,并删除所有连过的手机地址
|
||||
user_send_cmd_prepare(USER_CTRL_DEL_ALL_REMOTE_INFO, 0, NULL);
|
||||
__this->ear_number = 2;
|
||||
sys_enter_soft_poweroff((void *)1);
|
||||
} else {
|
||||
__this->pair_flag = 1;
|
||||
if (get_tws_phone_connect_state() == TRUE) {
|
||||
__this->active_disconnect = 1;
|
||||
user_send_cmd_prepare(USER_CTRL_DISCONNECTION_HCI, 0, NULL);
|
||||
} else {
|
||||
chargestore_set_phone_disconnect();
|
||||
}
|
||||
}
|
||||
break;
|
||||
case CMD_TWS_ADDR_DELETE:
|
||||
log_info("event_CMD_TWS_ADDR_DELETE\n");
|
||||
chargestore_clean_tws_conn_info(chargestore_dev->packet[0]);
|
||||
break;
|
||||
#endif
|
||||
case CMD_POWER_LEVEL_OPEN:
|
||||
log_info("event_CMD_POWER_LEVEL_OPEN\n");
|
||||
|
||||
//电压过低,不进响应开盖命令
|
||||
#if TCFG_SYS_LVD_EN
|
||||
if (get_vbat_need_shutdown() == TRUE) {
|
||||
log_info(" lowpower deal!\n");
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (__this->cover_status) {//当前为开盖
|
||||
if (__this->power_sync) {
|
||||
if (chargestore_sync_chg_level() == 0) {
|
||||
__this->power_sync = 0;
|
||||
}
|
||||
}
|
||||
if (app && strcmp(app->name, APP_NAME_BT) && (app_var.goto_poweroff_flag == 0)) {
|
||||
/* app_var.play_poweron_tone = 1; */
|
||||
app_var.play_poweron_tone = 0;
|
||||
power_set_mode(TCFG_LOWPOWER_POWER_SEL);
|
||||
__this->switch2bt = 1;
|
||||
task_switch_to_bt();
|
||||
__this->switch2bt = 0;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case CMD_POWER_LEVEL_CLOSE:
|
||||
log_info("event_CMD_POWER_LEVEL_CLOSE\n");
|
||||
if (!__this->cover_status) {//当前为合盖
|
||||
if (app && strcmp(app->name, "idle")) {
|
||||
sys_enter_soft_poweroff((void *)1);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case CMD_CLOSE_CID:
|
||||
log_info("event_CMD_CLOSE_CID\n");
|
||||
if (!__this->cover_status) {//当前为合盖
|
||||
#if (TCFG_BLE_DEMO_SELECT == DEF_BLE_DEMO_ADV)
|
||||
if ((__this->bt_init_ok) && (tws_api_get_role() == TWS_ROLE_MASTER)) {
|
||||
bt_ble_icon_close(1);
|
||||
}
|
||||
#elif (TCFG_BLE_DEMO_SELECT == DEF_BLE_DEMO_ADV_RCSP)
|
||||
if ((__this->bt_init_ok) && (tws_api_get_role() == TWS_ROLE_MASTER)) {
|
||||
bt_ble_adv_ioctl(BT_ADV_SET_EDR_CON_FLAG, SECNE_DISMISS, 1);
|
||||
}
|
||||
#endif
|
||||
if (!__this->timer) {
|
||||
__this->timer = sys_timeout_add(NULL, chargestore_timeout_deal, 2000);
|
||||
if (!__this->timer) {
|
||||
log_error("timer alloc err!\n");
|
||||
} else {
|
||||
__this->close_ing = 1;
|
||||
}
|
||||
} else {
|
||||
sys_timer_modify(__this->timer, 2000);
|
||||
__this->close_ing = 1;
|
||||
}
|
||||
} else {
|
||||
__this->ear_number = 1;
|
||||
__this->close_ing = 0;
|
||||
}
|
||||
break;
|
||||
case CMD_SHUT_DOWN:
|
||||
log_info("event_CMD_SHUT_DOWN\n");
|
||||
if (!__this->shutdown_timer) {
|
||||
__this->shutdown_timer = sys_timer_add(NULL, chargestore_shutdown_do, 1000);
|
||||
} else {
|
||||
sys_timer_modify(__this->shutdown_timer, 1000);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
u8 chargestore_get_vbat_percent(void)
|
||||
{
|
||||
u8 power;
|
||||
#if CONFIG_DISPLAY_DETAIL_BAT
|
||||
power = get_vbat_percent();//显示个位数的电量
|
||||
#else
|
||||
power = get_self_battery_level() * 10 + 10; //显示10%~100%
|
||||
#endif
|
||||
|
||||
#if TCFG_CHARGE_ENABLE
|
||||
if (get_charge_full_flag()) {
|
||||
power = 100;
|
||||
} else if (power == 100) {
|
||||
power = 99;
|
||||
}
|
||||
if (get_charge_online_flag()) {
|
||||
power |= BIT(7);
|
||||
}
|
||||
#endif
|
||||
return power;
|
||||
}
|
||||
|
||||
void chargestore_set_power_status(u8 *buf, u8 len)
|
||||
{
|
||||
__this->version = buf[0] & 0x0f;
|
||||
__this->chip_type = (buf[0] >> 4) & 0x0f;
|
||||
//f95可能传一个大于100的电量
|
||||
if ((buf[1] & 0x7f) > 100) {
|
||||
__this->power_level = (buf[1] & 0x80) | 100;
|
||||
} else {
|
||||
__this->power_level = buf[1];
|
||||
}
|
||||
if (len > 2) {
|
||||
__this->max_packet_size = buf[2];
|
||||
if (len > 3) {
|
||||
__this->tws_power = buf[3];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static int app_chargestore_data_handler(u8 *buf, u8 len)
|
||||
{
|
||||
u8 send_buf[36];
|
||||
/* log_info_hexdump(buf, len); */
|
||||
chargestore_shutdown_reset();
|
||||
send_buf[0] = buf[0];
|
||||
#ifdef CONFIG_CHARGESTORE_REMAP_ENABLE
|
||||
if (remap_app_chargestore_data_deal(buf, len)) {
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
switch (buf[0]) {
|
||||
case CMD_TWS_CHANNEL_SET:
|
||||
__this->channel = (buf[1] == TWS_CHANNEL_LEFT) ? 'L' : 'R';
|
||||
chargestore_event_to_user(NULL, DEVICE_EVENT_CHARGE_STORE, buf[0], 0);
|
||||
if (__this->bt_init_ok) {
|
||||
len = chargestore_get_tws_remote_info(&send_buf[1]);
|
||||
chargestore_api_write(send_buf, len + 1);
|
||||
} else {
|
||||
send_buf[0] = CMD_UNDEFINE;
|
||||
chargestore_api_write(send_buf, 1);
|
||||
}
|
||||
break;
|
||||
case CMD_TWS_SET_CHANNEL:
|
||||
__this->channel = (buf[1] == TWS_CHANNEL_LEFT) ? 'L' : 'R';
|
||||
log_info("f95 set channel = %c\n", __this->channel);
|
||||
chargestore_event_to_user(NULL, DEVICE_EVENT_CHARGE_STORE, CMD_TWS_CHANNEL_SET, 0);
|
||||
if (__this->bt_init_ok) {
|
||||
chargestore_api_write(send_buf, 1);
|
||||
} else {
|
||||
send_buf[0] = CMD_UNDEFINE;
|
||||
chargestore_api_write(send_buf, 1);
|
||||
}
|
||||
break;
|
||||
|
||||
#if TCFG_USER_TWS_ENABLE
|
||||
case CMD_TWS_REMOTE_ADDR:
|
||||
__this->close_ing = 0;
|
||||
if (chargestore_check_data_succ((u8 *)&buf[1], len - 1) == true) {
|
||||
chargestore_event_to_user((u8 *)&buf[1], DEVICE_EVENT_CHARGE_STORE, buf[0], len - 1);
|
||||
} else {
|
||||
send_buf[0] = CMD_FAIL;
|
||||
}
|
||||
chargestore_api_write(send_buf, 1);
|
||||
break;
|
||||
case CMD_EX_FIRST_READ_INFO:
|
||||
log_info("read first!\n");
|
||||
__this->close_ing = 0;
|
||||
len = chargestore_f95_read_tws_remote_info(&send_buf[1], 1);
|
||||
chargestore_api_write(send_buf, len + 1);
|
||||
break;
|
||||
case CMD_EX_CONTINUE_READ_INFO:
|
||||
log_info("read continue!\n");
|
||||
__this->close_ing = 0;
|
||||
len = chargestore_f95_read_tws_remote_info(&send_buf[1], 0);
|
||||
chargestore_api_write(send_buf, len + 1);
|
||||
break;
|
||||
case CMD_EX_FIRST_WRITE_INFO:
|
||||
log_info("write first!\n");
|
||||
__this->close_ing = 0;
|
||||
chargestore_f95_write_tws_remote_info(&buf[1], len - 1, 1);
|
||||
chargestore_api_write(send_buf, 1);
|
||||
break;
|
||||
case CMD_EX_CONTINUE_WRITE_INFO:
|
||||
log_info("write continue!\n");
|
||||
__this->close_ing = 0;
|
||||
chargestore_f95_write_tws_remote_info(&buf[1], len - 1, 0);
|
||||
chargestore_api_write(send_buf, 1);
|
||||
break;
|
||||
case CMD_EX_INFO_COMPLETE:
|
||||
log_info("ex complete!\n");
|
||||
if (chargestore_check_data_succ((u8 *)&write_info, sizeof(write_info)) == true) {
|
||||
chargestore_event_to_user((u8 *)&write_info, DEVICE_EVENT_CHARGE_STORE, CMD_TWS_REMOTE_ADDR, sizeof(write_info));
|
||||
} else {
|
||||
send_buf[0] = CMD_FAIL;
|
||||
}
|
||||
chargestore_api_write(send_buf, 1);
|
||||
break;
|
||||
#endif
|
||||
|
||||
case CMD_TWS_ADDR_DELETE:
|
||||
__this->close_ing = 0;
|
||||
chargestore_event_to_user(&buf[1], DEVICE_EVENT_CHARGE_STORE, CMD_TWS_ADDR_DELETE, len - 1);
|
||||
chargestore_api_write(send_buf, 1);
|
||||
break;
|
||||
case CMD_POWER_LEVEL_OPEN:
|
||||
__this->power_status = 1;
|
||||
__this->cover_status = 1;
|
||||
__this->close_ing = 0;
|
||||
if (__this->power_level == 0xff) {
|
||||
__this->power_sync = 1;
|
||||
}
|
||||
chargestore_set_power_status(&buf[1], len - 1);
|
||||
if (__this->power_level != __this->pre_power_lvl) {
|
||||
__this->power_sync = 1;
|
||||
}
|
||||
__this->pre_power_lvl = __this->power_level;
|
||||
send_buf[1] = chargestore_get_vbat_percent();
|
||||
send_buf[2] = chargestore_get_det_level(__this->chip_type);
|
||||
chargestore_api_write(send_buf, 3);
|
||||
//切模式过程中不发送消息,防止堆满消息
|
||||
if (__this->switch2bt == 0) {
|
||||
chargestore_event_to_user(NULL, DEVICE_EVENT_CHARGE_STORE, CMD_POWER_LEVEL_OPEN, 0);
|
||||
}
|
||||
break;
|
||||
case CMD_POWER_LEVEL_CLOSE:
|
||||
__this->power_status = 1;
|
||||
__this->cover_status = 0;
|
||||
__this->close_ing = 0;
|
||||
chargestore_set_power_status(&buf[1], len - 1);
|
||||
send_buf[1] = chargestore_get_vbat_percent();
|
||||
send_buf[2] = chargestore_get_det_level(__this->chip_type);
|
||||
chargestore_api_write(send_buf, 3);
|
||||
chargestore_event_to_user(NULL, DEVICE_EVENT_CHARGE_STORE, CMD_POWER_LEVEL_CLOSE, 0);
|
||||
break;
|
||||
case CMD_SHUT_DOWN:
|
||||
log_info("shut down\n");
|
||||
__this->power_status = 0;
|
||||
__this->cover_status = 0;
|
||||
__this->close_ing = 0;
|
||||
chargestore_api_write(send_buf, 1);
|
||||
chargestore_event_to_user(NULL, DEVICE_EVENT_CHARGE_STORE, CMD_SHUT_DOWN, 0);
|
||||
break;
|
||||
case CMD_CLOSE_CID:
|
||||
log_info("close cid\n");
|
||||
__this->power_status = 1;
|
||||
__this->cover_status = 0;
|
||||
__this->ear_number = buf[1];
|
||||
chargestore_api_write(send_buf, 1);
|
||||
chargestore_event_to_user(NULL, DEVICE_EVENT_CHARGE_STORE, CMD_CLOSE_CID, 0);
|
||||
break;
|
||||
|
||||
case CMD_RESTORE_SYS:
|
||||
r_printf("restore sys\n");
|
||||
__this->power_status = 1;
|
||||
__this->cover_status = 1;
|
||||
__this->close_ing = 0;
|
||||
chargestore_api_write(send_buf, 1);
|
||||
chargestore_event_to_user(NULL, DEVICE_EVENT_CHARGE_STORE, CMD_RESTORE_SYS, 0);
|
||||
break;
|
||||
//不是充电舱的指令,返回0
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
CHARGESTORE_HANDLE_REG(chargestore, app_chargestore_data_handler);
|
||||
|
||||
#endif //TCFG_CHARGESTORE_ENABLE
|
||||
|
||||
475
apps/earphone/power_manage/app_power_manage.c
Normal file
475
apps/earphone/power_manage/app_power_manage.c
Normal file
@ -0,0 +1,475 @@
|
||||
#include "system/includes.h"
|
||||
#include "app_power_manage.h"
|
||||
#include "app_main.h"
|
||||
#include "app_config.h"
|
||||
#include "app_action.h"
|
||||
#include "asm/charge.h"
|
||||
#include "ui_manage.h"
|
||||
#include "tone_player.h"
|
||||
#include "asm/adc_api.h"
|
||||
#include "btstack/avctp_user.h"
|
||||
#include "user_cfg.h"
|
||||
#include "asm/charge.h"
|
||||
|
||||
#if TCFG_USER_TWS_ENABLE
|
||||
#include "bt_tws.h"
|
||||
#endif
|
||||
|
||||
#define LOG_TAG_CONST APP_POWER
|
||||
#define LOG_TAG "[APP_POWER]"
|
||||
#define LOG_ERROR_ENABLE
|
||||
#define LOG_DEBUG_ENABLE
|
||||
#define LOG_INFO_ENABLE
|
||||
/* #define LOG_DUMP_ENABLE */
|
||||
#define LOG_CLI_ENABLE
|
||||
#include "debug.h"
|
||||
|
||||
enum {
|
||||
VBAT_NORMAL = 0,
|
||||
VBAT_WARNING,
|
||||
VBAT_LOWPOWER,
|
||||
} VBAT_STATUS;
|
||||
|
||||
#define VBAT_DETECT_CNT 6
|
||||
static int vbat_slow_timer = 0;
|
||||
static int vbat_fast_timer = 0;
|
||||
static int lowpower_timer = 0;
|
||||
static u8 old_battery_level = 9;
|
||||
static u16 bat_val = 0;
|
||||
static volatile u8 cur_battery_level = 0;
|
||||
static u16 battery_full_value = 0;
|
||||
static u8 tws_sibling_bat_level = 0xff;
|
||||
static u8 tws_sibling_bat_percent_level = 0xff;
|
||||
static u8 cur_bat_st = VBAT_NORMAL;
|
||||
|
||||
void vbat_check(void *priv);
|
||||
void sys_enter_soft_poweroff(void *priv);
|
||||
void clr_wdt(void);
|
||||
void power_event_to_user(u8 event);
|
||||
|
||||
|
||||
u8 get_tws_sibling_bat_level(void)
|
||||
{
|
||||
#if TCFG_USER_TWS_ENABLE
|
||||
/* log_info("***********get_tws_sibling_bat_level: %2x", tws_sibling_bat_percent_level); */
|
||||
return tws_sibling_bat_level & 0x7f;
|
||||
#endif
|
||||
return 0xff;
|
||||
}
|
||||
|
||||
u8 get_tws_sibling_bat_persent(void)
|
||||
{
|
||||
#if TCFG_USER_TWS_ENABLE
|
||||
/* log_info("***********get_tws_sibling_bat_level: %2x", tws_sibling_bat_percent_level); */
|
||||
return tws_sibling_bat_percent_level;
|
||||
#endif
|
||||
return 0xff;
|
||||
}
|
||||
|
||||
void app_power_set_tws_sibling_bat_level(u8 vbat, u8 percent)
|
||||
{
|
||||
#if TCFG_USER_TWS_ENABLE
|
||||
tws_sibling_bat_level = vbat;
|
||||
tws_sibling_bat_percent_level = percent;
|
||||
/*
|
||||
** 发出电量同步事件进行进一步处理
|
||||
**/
|
||||
power_event_to_user(POWER_EVENT_SYNC_TWS_VBAT_LEVEL);
|
||||
|
||||
log_info("set_sibling_bat_level: %d, %d\n", vbat, percent);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
static void set_tws_sibling_bat_level(void *_data, u16 len, bool rx)
|
||||
{
|
||||
u8 *data = (u8 *)_data;
|
||||
|
||||
if (rx) {
|
||||
app_power_set_tws_sibling_bat_level(data[0], data[1]);
|
||||
}
|
||||
}
|
||||
|
||||
#if TCFG_USER_TWS_ENABLE
|
||||
REGISTER_TWS_FUNC_STUB(vbat_sync_stub) = {
|
||||
.func_id = TWS_FUNC_ID_VBAT_SYNC,
|
||||
.func = set_tws_sibling_bat_level,
|
||||
};
|
||||
#endif
|
||||
|
||||
void tws_sync_bat_level(void)
|
||||
{
|
||||
#if (TCFG_USER_TWS_ENABLE && BT_SUPPORT_DISPLAY_BAT)
|
||||
u8 battery_level = cur_battery_level;
|
||||
#if CONFIG_DISPLAY_DETAIL_BAT
|
||||
u8 percent_level = get_vbat_percent();
|
||||
#else
|
||||
u8 percent_level = get_self_battery_level() * 10 + 10;
|
||||
#endif
|
||||
if (get_charge_online_flag()) {
|
||||
percent_level |= BIT(7);
|
||||
}
|
||||
|
||||
u8 data[2];
|
||||
data[0] = battery_level;
|
||||
data[1] = percent_level;
|
||||
tws_api_send_data_to_sibling(data, 2, TWS_FUNC_ID_VBAT_SYNC);
|
||||
|
||||
log_info("tws_sync_bat_level: %d,%d\n", battery_level, percent_level);
|
||||
#endif
|
||||
}
|
||||
|
||||
void power_event_to_user(u8 event)
|
||||
{
|
||||
struct sys_event e;
|
||||
e.type = SYS_DEVICE_EVENT;
|
||||
e.arg = (void *)DEVICE_EVENT_FROM_POWER;
|
||||
e.u.dev.event = event;
|
||||
e.u.dev.value = 0;
|
||||
sys_event_notify(&e);
|
||||
}
|
||||
|
||||
int app_power_event_handler(struct device_event *dev)
|
||||
{
|
||||
int ret = false;
|
||||
|
||||
#if(TCFG_SYS_LVD_EN == 1)
|
||||
switch (dev->event) {
|
||||
case POWER_EVENT_POWER_NORMAL:
|
||||
ui_update_status(STATUS_EXIT_LOWPOWER);
|
||||
break;
|
||||
case POWER_EVENT_POWER_WARNING:
|
||||
ui_update_status(STATUS_LOWPOWER);
|
||||
/* tone_play(TONE_LOW_POWER); */
|
||||
STATUS *p_tone = get_tone_config();
|
||||
tone_play_index(p_tone->lowpower, 0);
|
||||
if (lowpower_timer == 0) {
|
||||
lowpower_timer = sys_timer_add((void *)POWER_EVENT_POWER_WARNING, (void (*)(void *))power_event_to_user, LOW_POWER_WARN_TIME);
|
||||
}
|
||||
break;
|
||||
case POWER_EVENT_POWER_LOW:
|
||||
r_printf(" POWER_EVENT_POWER_LOW");
|
||||
vbat_timer_delete();
|
||||
if (lowpower_timer) {
|
||||
sys_timer_del(lowpower_timer);
|
||||
lowpower_timer = 0 ;
|
||||
}
|
||||
#if TCFG_APP_BT_EN
|
||||
#if (RCSP_ADV_EN)
|
||||
extern u8 adv_tws_both_in_charge_box(u8 type);
|
||||
adv_tws_both_in_charge_box(1);
|
||||
#endif
|
||||
sys_enter_soft_poweroff(NULL);
|
||||
#else
|
||||
void app_entry_idle() ;
|
||||
app_entry_idle() ;
|
||||
#endif
|
||||
break;
|
||||
#if TCFG_APP_BT_EN
|
||||
#if TCFG_USER_TWS_ENABLE
|
||||
case POWER_EVENT_SYNC_TWS_VBAT_LEVEL:
|
||||
if (tws_api_get_role() == TWS_ROLE_MASTER) {
|
||||
user_send_cmd_prepare(USER_CTRL_HFP_CMD_UPDATE_BATTARY, 0, NULL);
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
|
||||
case POWER_EVENT_POWER_CHANGE:
|
||||
/* log_info("POWER_EVENT_POWER_CHANGE\n"); */
|
||||
#if TCFG_USER_TWS_ENABLE
|
||||
if (tws_api_get_tws_state() & TWS_STA_SIBLING_CONNECTED) {
|
||||
if (tws_api_get_tws_state()&TWS_STA_ESCO_OPEN) {
|
||||
break;
|
||||
}
|
||||
tws_sync_bat_level();
|
||||
}
|
||||
#endif
|
||||
user_send_cmd_prepare(USER_CTRL_HFP_CMD_UPDATE_BATTARY, 0, NULL);
|
||||
#endif
|
||||
break;
|
||||
case POWER_EVENT_POWER_CHARGE:
|
||||
if (lowpower_timer) {
|
||||
sys_timer_del(lowpower_timer);
|
||||
lowpower_timer = 0 ;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
u16 get_vbat_level(void)
|
||||
{
|
||||
//return 370; //debug
|
||||
return (adc_get_voltage(AD_CH_VBAT) * 4 / 10);
|
||||
}
|
||||
|
||||
__attribute__((weak)) u8 remap_calculate_vbat_percent(u16 bat_val)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
u16 get_vbat_value(void)
|
||||
{
|
||||
return bat_val;
|
||||
}
|
||||
|
||||
u8 get_vbat_percent(void)
|
||||
{
|
||||
u16 tmp_bat_val;
|
||||
u16 bat_val = get_vbat_level();
|
||||
if (battery_full_value == 0) {
|
||||
#if TCFG_CHARGE_ENABLE
|
||||
battery_full_value = (get_charge_full_value() - 100) / 10; //防止部分电池充不了这么高电量,充满显示未满的情况
|
||||
#else
|
||||
battery_full_value = 420;
|
||||
#endif
|
||||
}
|
||||
|
||||
if (bat_val <= app_var.poweroff_tone_v) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
tmp_bat_val = remap_calculate_vbat_percent(bat_val);
|
||||
if (!tmp_bat_val) {
|
||||
tmp_bat_val = ((u32)bat_val - app_var.poweroff_tone_v) * 100 / (battery_full_value - app_var.poweroff_tone_v);
|
||||
if (tmp_bat_val > 100) {
|
||||
tmp_bat_val = 100;
|
||||
}
|
||||
}
|
||||
return (u8)tmp_bat_val;
|
||||
}
|
||||
|
||||
bool get_vbat_need_shutdown(void)
|
||||
{
|
||||
if ((bat_val <= LOW_POWER_SHUTDOWN) || adc_check_vbat_lowpower()) {
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
//将当前电量转换为1~9级发送给手机同步电量
|
||||
u8 battery_value_to_phone_level(u16 bat_val)
|
||||
{
|
||||
u8 battery_level = 0;
|
||||
u8 vbat_percent = get_vbat_percent();
|
||||
|
||||
if (vbat_percent < 5) { //小于5%电量等级为0,显示10%
|
||||
return 0;
|
||||
}
|
||||
|
||||
battery_level = (vbat_percent - 5) / 10;
|
||||
|
||||
return battery_level;
|
||||
}
|
||||
|
||||
//获取自身的电量
|
||||
u8 get_self_battery_level(void)
|
||||
{
|
||||
return cur_battery_level;
|
||||
}
|
||||
|
||||
u8 get_cur_battery_level(void)
|
||||
{
|
||||
u8 bat_lev = tws_sibling_bat_level & (~BIT(7));
|
||||
#if TCFG_USER_TWS_ENABLE
|
||||
if (bat_lev == 0x7f) {
|
||||
return cur_battery_level;
|
||||
}
|
||||
|
||||
#if (CONFIG_DISPLAY_TWS_BAT_TYPE == CONFIG_DISPLAY_TWS_BAT_LOWER)
|
||||
return cur_battery_level < bat_lev ? cur_battery_level : bat_lev;
|
||||
#elif (CONFIG_DISPLAY_TWS_BAT_TYPE == CONFIG_DISPLAY_TWS_BAT_HIGHER)
|
||||
return cur_battery_level < bat_lev ? bat_lev : cur_battery_level;
|
||||
#elif (CONFIG_DISPLAY_TWS_BAT_TYPE == CONFIG_DISPLAY_TWS_BAT_LEFT)
|
||||
return tws_api_get_local_channel() == 'L' ? cur_battery_level : bat_lev;
|
||||
#elif (CONFIG_DISPLAY_TWS_BAT_TYPE == CONFIG_DISPLAY_TWS_BAT_RIGHT)
|
||||
return tws_api_get_local_channel() == 'R' ? cur_battery_level : bat_lev;
|
||||
#else
|
||||
return cur_battery_level;
|
||||
#endif //END CONFIG_DISPLAY_TWS_BAT_TYPE
|
||||
|
||||
#else //TCFG_USER_TWS_ENABLE == 0
|
||||
return cur_battery_level;
|
||||
#endif
|
||||
}
|
||||
|
||||
void vbat_check_slow(void *priv)
|
||||
{
|
||||
if (vbat_fast_timer == 0) {
|
||||
vbat_fast_timer = usr_timer_add(NULL, vbat_check, 10, 1);
|
||||
}
|
||||
if (get_charge_online_flag()) {
|
||||
sys_timer_modify(vbat_slow_timer, 60 * 1000);
|
||||
} else {
|
||||
sys_timer_modify(vbat_slow_timer, 10 * 1000);
|
||||
}
|
||||
}
|
||||
|
||||
void vbat_check_init(void)
|
||||
{
|
||||
if (vbat_slow_timer == 0) {
|
||||
vbat_slow_timer = sys_timer_add(NULL, vbat_check_slow, 10 * 1000);
|
||||
} else {
|
||||
sys_timer_modify(vbat_slow_timer, 10 * 1000);
|
||||
}
|
||||
|
||||
if (vbat_fast_timer == 0) {
|
||||
vbat_fast_timer = usr_timer_add(NULL, vbat_check, 10, 1);
|
||||
}
|
||||
}
|
||||
|
||||
void vbat_timer_delete(void)
|
||||
{
|
||||
if (vbat_slow_timer) {
|
||||
sys_timer_del(vbat_slow_timer);
|
||||
vbat_slow_timer = 0;
|
||||
}
|
||||
if (vbat_fast_timer) {
|
||||
usr_timer_del(vbat_fast_timer);
|
||||
vbat_fast_timer = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void vbat_check(void *priv)
|
||||
{
|
||||
static u8 unit_cnt = 0;
|
||||
static u8 low_warn_cnt = 0;
|
||||
static u8 low_off_cnt = 0;
|
||||
static u8 low_voice_cnt = 0;
|
||||
static u8 low_power_cnt = 0;
|
||||
static u8 power_normal_cnt = 0;
|
||||
static u8 charge_online_flag = 0;
|
||||
static u8 low_voice_first_flag = 1;//进入低电后先提醒一次
|
||||
|
||||
if (!bat_val) {
|
||||
bat_val = get_vbat_level();
|
||||
} else {
|
||||
bat_val = (get_vbat_level() + bat_val) / 2;
|
||||
}
|
||||
|
||||
cur_battery_level = battery_value_to_phone_level(bat_val);
|
||||
|
||||
/* printf("bv:%d, bl:%d , check_vbat:%d\n", bat_val, cur_battery_level, adc_check_vbat_lowpower()); */
|
||||
|
||||
unit_cnt++;
|
||||
|
||||
/* if (bat_val < LOW_POWER_OFF_VAL) { */
|
||||
if (adc_check_vbat_lowpower() || (bat_val <= app_var.poweroff_tone_v)) {
|
||||
low_off_cnt++;
|
||||
}
|
||||
/* if (bat_val < LOW_POWER_WARN_VAL) { */
|
||||
if (bat_val <= app_var.warning_tone_v) {
|
||||
low_warn_cnt++;
|
||||
}
|
||||
|
||||
/* log_info("unit_cnt:%d\n", unit_cnt); */
|
||||
|
||||
if (unit_cnt >= VBAT_DETECT_CNT) {
|
||||
|
||||
if (get_charge_online_flag() == 0) {
|
||||
if (low_off_cnt > (VBAT_DETECT_CNT / 2)) { //低电关机
|
||||
low_power_cnt++;
|
||||
low_voice_cnt = 0;
|
||||
power_normal_cnt = 0;
|
||||
cur_bat_st = VBAT_LOWPOWER;
|
||||
if (low_power_cnt > 6) {
|
||||
log_info("\n*******Low Power,enter softpoweroff********\n");
|
||||
low_power_cnt = 0;
|
||||
power_event_to_user(POWER_EVENT_POWER_LOW);
|
||||
usr_timer_del(vbat_fast_timer);
|
||||
vbat_fast_timer = 0;
|
||||
}
|
||||
} else if (low_warn_cnt > (VBAT_DETECT_CNT / 2)) { //低电提醒
|
||||
low_voice_cnt ++;
|
||||
low_power_cnt = 0;
|
||||
power_normal_cnt = 0;
|
||||
cur_bat_st = VBAT_WARNING;
|
||||
if ((low_voice_first_flag && low_voice_cnt > 1) || //第一次进低电10s后报一次
|
||||
(!low_voice_first_flag && low_voice_cnt >= 5)) {
|
||||
low_voice_first_flag = 0;
|
||||
low_voice_cnt = 0;
|
||||
if (!lowpower_timer) {
|
||||
log_info("\n**Low Power,Please Charge Soon!!!**\n");
|
||||
power_event_to_user(POWER_EVENT_POWER_WARNING);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
power_normal_cnt++;
|
||||
low_voice_cnt = 0;
|
||||
low_power_cnt = 0;
|
||||
if (power_normal_cnt > 2) {
|
||||
if (cur_bat_st != VBAT_NORMAL) {
|
||||
log_info("[Noraml power]\n");
|
||||
cur_bat_st = VBAT_NORMAL;
|
||||
power_event_to_user(POWER_EVENT_POWER_NORMAL);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
power_event_to_user(POWER_EVENT_POWER_CHARGE);
|
||||
}
|
||||
|
||||
unit_cnt = 0;
|
||||
low_off_cnt = 0;
|
||||
low_warn_cnt = 0;
|
||||
|
||||
if (cur_bat_st != VBAT_LOWPOWER) {
|
||||
usr_timer_del(vbat_fast_timer);
|
||||
vbat_fast_timer = 0;
|
||||
cur_battery_level = battery_value_to_phone_level(bat_val);
|
||||
if (cur_battery_level != old_battery_level) {
|
||||
power_event_to_user(POWER_EVENT_POWER_CHANGE);
|
||||
} else {
|
||||
if (charge_online_flag != get_charge_online_flag()) {
|
||||
//充电变化也要交换,确定是否在充电仓
|
||||
power_event_to_user(POWER_EVENT_POWER_CHANGE);
|
||||
}
|
||||
}
|
||||
charge_online_flag = get_charge_online_flag();
|
||||
old_battery_level = cur_battery_level;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool vbat_is_low_power(void)
|
||||
{
|
||||
return (cur_bat_st != VBAT_NORMAL);
|
||||
}
|
||||
|
||||
void check_power_on_voltage(void)
|
||||
{
|
||||
#if(TCFG_SYS_LVD_EN == 1)
|
||||
|
||||
u16 val = 0;
|
||||
u8 normal_power_cnt = 0;
|
||||
u8 low_power_cnt = 0;
|
||||
|
||||
while (1) {
|
||||
clr_wdt();
|
||||
val = get_vbat_level();
|
||||
printf("vbat: %d\n", val);
|
||||
if ((val < app_var.poweroff_tone_v) || adc_check_vbat_lowpower()) {
|
||||
low_power_cnt++;
|
||||
normal_power_cnt = 0;
|
||||
if (low_power_cnt > 10) {
|
||||
ui_update_status(STATUS_POWERON_LOWPOWER);
|
||||
os_time_dly(100);
|
||||
log_info("power on low power , enter softpoweroff!\n");
|
||||
power_set_soft_poweroff();
|
||||
}
|
||||
} else {
|
||||
normal_power_cnt++;
|
||||
low_power_cnt = 0;
|
||||
if (normal_power_cnt > 10) {
|
||||
vbat_check_init();
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
549
apps/earphone/power_manage/app_umidigi_chargestore.c
Normal file
549
apps/earphone/power_manage/app_umidigi_chargestore.c
Normal file
@ -0,0 +1,549 @@
|
||||
#include "app_umidigi_chargestore.h"
|
||||
#include "init.h"
|
||||
#include "app_config.h"
|
||||
#include "system/includes.h"
|
||||
#include "asm/charge.h"
|
||||
#include "user_cfg.h"
|
||||
#include "app_chargestore.h"
|
||||
#include "device/vm.h"
|
||||
#include "btstack/avctp_user.h"
|
||||
#include "app_power_manage.h"
|
||||
#include "app_action.h"
|
||||
#include "app_main.h"
|
||||
#include "app_charge.h"
|
||||
#include "app_testbox.h"
|
||||
#include "classic/tws_api.h"
|
||||
#include "update.h"
|
||||
#include "bt_ble.h"
|
||||
#include "bt_tws.h"
|
||||
#include "app_action.h"
|
||||
#include "bt_common.h"
|
||||
#include "le_rcsp_adv_module.h"
|
||||
#include "tone_player.h"
|
||||
#include "app_msg.h"
|
||||
#include "key_event_deal.h"
|
||||
|
||||
#define LOG_TAG_CONST APP_UMIDIGI_CHARGESTORE
|
||||
#define LOG_TAG "[APP_UMIDIGI_CHARGESTORE]"
|
||||
#define LOG_ERROR_ENABLE
|
||||
#define LOG_DEBUG_ENABLE
|
||||
#define LOG_INFO_ENABLE
|
||||
/* #define LOG_DUMP_ENABLE */
|
||||
#define LOG_CLI_ENABLE
|
||||
#include "debug.h"
|
||||
|
||||
extern void bt_tws_remove_pairs();
|
||||
extern void cpu_reset();
|
||||
|
||||
|
||||
#if TCFG_UMIDIGI_BOX_ENABLE
|
||||
|
||||
struct umidigi_chargestore_info {
|
||||
int timer; //合盖之后定时进入休眠的句柄
|
||||
u8 cover_status; //充电舱盖子状态 0: 合盖 1:开盖
|
||||
u8 ear_number; //合盖时耳机在线数
|
||||
u8 close_ing; //等待合窗超时
|
||||
u8 bt_init_ok; //蓝牙协议栈初始化成功
|
||||
u8 active_disconnect; //主动断开连接
|
||||
u8 sibling_chg_lev; //对耳同步的充电舱电量
|
||||
u8 pair_flag; //配对标记
|
||||
u8 power_sync; //第一次获取到充电舱电量时,同步到对耳
|
||||
u8 switch2bt; //开盖切换到蓝牙的标记位
|
||||
u8 pre_power_lvl;
|
||||
|
||||
/*以下为充电舱发送CMD时携带的信息*/
|
||||
u8 case_charger_state; //充电舱自身充电状态 0: 不在充电 1: 充电中
|
||||
u8 case_battery_level; //充电舱电量百分比
|
||||
u8 l_ear_whether_in_box; //左耳是否在舱 0: 左耳不在仓 1:左耳在仓
|
||||
u8 r_ear_whether_in_box; //右耳是否在舱 0: 右耳不在仓 1:右耳在仓
|
||||
u8 usb_state; //usb插入/拔出标志(本地播放专用) 0: USB OUT 1: USB IN
|
||||
u16 open_case_timer; //延迟处理开盖命令定时器
|
||||
u16 pair_timer; //延迟处理配对命令定时器
|
||||
};
|
||||
|
||||
static struct umidigi_chargestore_info info = {
|
||||
.case_charger_state = 1,
|
||||
.ear_number = 1,
|
||||
.case_battery_level = 0xff,
|
||||
.sibling_chg_lev = 0xff,
|
||||
};
|
||||
|
||||
#define __this (&info)
|
||||
|
||||
/*获取充电舱电池电量*/
|
||||
u8 umidigi_chargestore_get_power_level(void)
|
||||
{
|
||||
if ((__this->case_battery_level == 0xff) ||
|
||||
((!get_charge_online_flag()) &&
|
||||
(__this->sibling_chg_lev != 0xff))) {
|
||||
return __this->sibling_chg_lev;
|
||||
}
|
||||
return __this->case_battery_level;
|
||||
}
|
||||
|
||||
/*获取充电舱充电状态*/
|
||||
u8 umidigi_chargestore_get_power_status(void)
|
||||
{
|
||||
return __this->case_charger_state;
|
||||
}
|
||||
|
||||
/*获取充电舱合盖或开盖状态*/
|
||||
u8 umidigi_chargestore_get_cover_status(void)
|
||||
{
|
||||
return __this->cover_status;
|
||||
}
|
||||
|
||||
/*获取合盖状态时耳机在仓数量*/
|
||||
u8 umidigi_chargestore_get_earphone_online(void)
|
||||
{
|
||||
return __this->ear_number;
|
||||
}
|
||||
|
||||
/*获取蓝牙初始化成功标志位*/
|
||||
void umidigi_chargestore_set_bt_init_ok(u8 flag)
|
||||
{
|
||||
__this->bt_init_ok = flag;
|
||||
}
|
||||
|
||||
#if TCFG_USER_TWS_ENABLE
|
||||
static void umidigi_set_tws_sibling_charge_level(void *_data, u16 len, bool rx)
|
||||
{
|
||||
if (rx) {
|
||||
u8 *data = (u8 *)_data;
|
||||
umidigi_chargestore_set_sibling_chg_lev(data[0]);
|
||||
}
|
||||
}
|
||||
|
||||
REGISTER_TWS_FUNC_STUB(charge_level_stub) = {
|
||||
.func_id = TWS_FUNC_ID_CHARGE_SYNC,
|
||||
.func = umidigi_set_tws_sibling_charge_level,
|
||||
};
|
||||
|
||||
#endif //TCFG_USER_TWS_ENABLE
|
||||
|
||||
int umidigi_chargestore_sync_chg_level(void)
|
||||
{
|
||||
#if TCFG_USER_TWS_ENABLE
|
||||
int err = -1;
|
||||
struct application *app = get_current_app();
|
||||
if (app && (!strcmp(app->name, "earphone")) && (!app_var.goto_poweroff_flag)) {
|
||||
err = tws_api_send_data_to_sibling((u8 *)&__this->case_battery_level, 1,
|
||||
TWS_FUNC_ID_CHARGE_SYNC);
|
||||
}
|
||||
return err;
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
/*设置对耳同步的充电舱电量*/
|
||||
void umidigi_chargestore_set_sibling_chg_lev(u8 chg_lev)
|
||||
{
|
||||
__this->sibling_chg_lev = chg_lev;
|
||||
}
|
||||
|
||||
/*设置充电舱电池电量*/
|
||||
void umidigi_chargestore_set_power_level(u8 power)
|
||||
{
|
||||
__this->case_battery_level = power;
|
||||
}
|
||||
|
||||
/*获取允许poweroff标志位*/
|
||||
u8 umidigi_chargestore_check_going_to_poweroff(void)
|
||||
{
|
||||
return __this->close_ing;
|
||||
}
|
||||
|
||||
void umidigi_chargestore_set_phone_disconnect(void)
|
||||
{
|
||||
#if (TCFG_BLE_DEMO_SELECT == DEF_BLE_DEMO_ADV)
|
||||
#if (!CONFIG_NO_DISPLAY_BUTTON_ICON)
|
||||
if (__this->pair_flag && get_tws_sibling_connect_state()) {
|
||||
//check ble inquiry
|
||||
//printf("get box log_key...con_dev=%d\n",get_tws_phone_connect_state());
|
||||
if ((bt_ble_icon_get_adv_state() == ADV_ST_RECONN)
|
||||
|| (bt_ble_icon_get_adv_state() == ADV_ST_DISMISS)
|
||||
|| (bt_ble_icon_get_adv_state() == ADV_ST_END)) {
|
||||
bt_ble_icon_reset();
|
||||
bt_ble_icon_open(ICON_TYPE_INQUIRY);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
__this->pair_flag = 0;
|
||||
#elif (TCFG_BLE_DEMO_SELECT == DEF_BLE_DEMO_ADV_RCSP)
|
||||
#if (!CONFIG_NO_DISPLAY_BUTTON_ICON)
|
||||
if (__this->pair_flag && get_tws_sibling_connect_state()) {
|
||||
//check ble inquiry
|
||||
bt_ble_adv_ioctl(BT_ADV_SET_EDR_CON_FLAG, SECNE_UNCONNECTED, 1);
|
||||
}
|
||||
#endif
|
||||
__this->pair_flag = 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
void umidigi_chargestore_set_phone_connect(void)
|
||||
{
|
||||
__this->active_disconnect = 0;
|
||||
}
|
||||
|
||||
extern void sys_enter_soft_poweroff(void *priv);
|
||||
void umidigi_chargestore_timeout_deal(void *priv)
|
||||
{
|
||||
__this->timer = 0;
|
||||
__this->close_ing = 0;
|
||||
|
||||
//该类型的充电仓获取不到充电在线状态时,认为出仓了。
|
||||
//避免盒盖马上开盖迅速拔出,收不到开盖消息,导致连上又复位系统。
|
||||
if (get_charge_online_flag() == 0) {
|
||||
__this->cover_status = 1;
|
||||
}
|
||||
|
||||
if ((!__this->cover_status) || __this->active_disconnect) {//当前为合盖或者主动断开连接
|
||||
struct application *app = get_current_app();
|
||||
if (app && strcmp(app->name, "idle")) {
|
||||
sys_enter_soft_poweroff((void *)1);
|
||||
}
|
||||
} else {
|
||||
#if (TCFG_BLE_DEMO_SELECT == DEF_BLE_DEMO_ADV)
|
||||
|
||||
/* if ((!get_total_connect_dev()) && (tws_api_get_role() == TWS_ROLE_MASTER) && (get_bt_tws_connect_status())) { */
|
||||
if (tws_api_get_role() == TWS_ROLE_MASTER) {
|
||||
printf("charge_icon_ctl...\n");
|
||||
bt_ble_icon_reset();
|
||||
#if CONFIG_NO_DISPLAY_BUTTON_ICON
|
||||
if (get_total_connect_dev()) {
|
||||
//蓝牙未真正断开;重新广播
|
||||
bt_ble_icon_open(ICON_TYPE_RECONNECT);
|
||||
} else {
|
||||
//蓝牙未连接,重新开可见性
|
||||
bt_ble_icon_open(ICON_TYPE_INQUIRY);
|
||||
}
|
||||
#else
|
||||
//不管蓝牙是否连接,默认打开
|
||||
bt_ble_icon_open(ICON_TYPE_RECONNECT);
|
||||
#endif
|
||||
|
||||
}
|
||||
#elif (TCFG_BLE_DEMO_SELECT == DEF_BLE_DEMO_ADV_RCSP)
|
||||
if (tws_api_get_role() == TWS_ROLE_MASTER) {
|
||||
printf("charge_icon_ctl...\n");
|
||||
#if CONFIG_NO_DISPLAY_BUTTON_ICON
|
||||
if (get_total_connect_dev()) {
|
||||
//蓝牙未真正断开;重新广播
|
||||
bt_ble_adv_ioctl(BT_ADV_SET_EDR_CON_FLAG, SECNE_CONNECTED, 1);
|
||||
} else {
|
||||
//蓝牙未连接,重新开可见性
|
||||
bt_ble_adv_ioctl(BT_ADV_SET_EDR_CON_FLAG, SECNE_UNCONNECTED, 1);
|
||||
}
|
||||
#else
|
||||
//不管蓝牙是否连接,默认打开
|
||||
bt_ble_adv_ioctl(BT_ADV_SET_EDR_CON_FLAG, SECNE_CONNECTED, 1);
|
||||
#endif
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
}
|
||||
__this->ear_number = 1;
|
||||
}
|
||||
|
||||
/*开盖命令处理函数*/
|
||||
static void open_case_callback(void *priv)
|
||||
{
|
||||
struct application *app = get_current_app();
|
||||
if (__this->cover_status) {
|
||||
//电压过低,不进响应开盖命令
|
||||
#if TCFG_SYS_LVD_EN
|
||||
if (get_vbat_need_shutdown() == TRUE) {
|
||||
log_info(" lowpower deal!\n");
|
||||
__this->open_case_timer = 0;
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
if (__this->cover_status) {//当前为开盖
|
||||
if (__this->power_sync) {
|
||||
if (umidigi_chargestore_sync_chg_level() == 0) {
|
||||
__this->power_sync = 0;
|
||||
}
|
||||
}
|
||||
if (app && strcmp(app->name, APP_NAME_BT) && (app_var.goto_poweroff_flag == 0)) {
|
||||
/* app_var.play_poweron_tone = 1; */
|
||||
app_var.play_poweron_tone = 0;
|
||||
power_set_mode(TCFG_LOWPOWER_POWER_SEL);
|
||||
r_printf("switch to bt\n");
|
||||
__this->switch2bt = 1;
|
||||
#if TCFG_SYS_LVD_EN
|
||||
vbat_check_init();
|
||||
#endif
|
||||
task_switch_to_bt();
|
||||
__this->switch2bt = 0;
|
||||
}
|
||||
}
|
||||
__this->open_case_timer = 0;
|
||||
} else {
|
||||
__this->open_case_timer = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*等待蓝牙初始化完成再进行对耳*/
|
||||
static void tws_pair_wait_bt_init_callback(void *priv)
|
||||
{
|
||||
#if TCFG_USER_TWS_ENABLE
|
||||
if (bt_tws_get_local_channel() == 'L') {
|
||||
r_printf("L channel\n");
|
||||
//充电仓不支持 双击回播电话,也不支持 双击配对和取消配对
|
||||
#if (!TCFG_CHARGESTORE_ENABLE)
|
||||
#if TCFG_USER_TWS_ENABLE
|
||||
if (bt_tws_start_search_sibling()) {
|
||||
tone_play_index(IDEX_TONE_NORMAL, 1);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
if (bt_user_priv_var.last_call_type == BT_STATUS_PHONE_INCOME) {
|
||||
user_send_cmd_prepare(USER_CTRL_DIAL_NUMBER, bt_user_priv_var.income_phone_len, bt_user_priv_var.income_phone_num);
|
||||
} else {
|
||||
user_send_cmd_prepare(USER_CTRL_HFP_CALL_LAST_NO, 0, NULL);
|
||||
}
|
||||
} else if (bt_tws_get_local_channel() == 'R') {
|
||||
r_printf("R channel\n");
|
||||
} else if (bt_tws_get_local_channel() == 'U') {
|
||||
r_printf("U channel\n");
|
||||
}
|
||||
#endif
|
||||
__this->pair_timer = 0;
|
||||
}
|
||||
|
||||
/*配对命令处理函数*/
|
||||
static void tws_pair_callback(void *priv)
|
||||
{
|
||||
struct application *app = get_current_app();
|
||||
#if CONFIG_TWS_PAIR_MODE == CONFIG_TWS_PAIR_BY_CLICK
|
||||
if (app && strcmp(app->name, APP_NAME_BT) && (app_var.goto_poweroff_flag == 0)) {
|
||||
/* app_var.play_poweron_tone = 1; */
|
||||
app_var.play_poweron_tone = 0;
|
||||
power_set_mode(TCFG_LOWPOWER_POWER_SEL);
|
||||
r_printf("switch to bt\n");
|
||||
task_switch_to_bt();
|
||||
}
|
||||
sys_timeout_add(NULL, tws_pair_wait_bt_init_callback, 1000);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*充电舱命令处理函数,所有命令携带8bit有效数据*/
|
||||
int app_umidigi_chargestore_event_handler(struct umidigi_chargestore_event *umidigi_chargestore_dev)
|
||||
{
|
||||
int ret = false;
|
||||
struct application *app = get_current_app();
|
||||
#if defined(TCFG_CHARGE_KEEP_UPDATA) && TCFG_CHARGE_KEEP_UPDATA
|
||||
//在升级过程中,不响应智能充电舱app层消息
|
||||
if (dual_bank_update_exist_flag_get() || classic_update_task_exist_flag_get()) {
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
switch (umidigi_chargestore_dev->event) {
|
||||
case CMD_RESERVED_0:
|
||||
log_info("event_CMD_RESERVED_0\n");
|
||||
break;
|
||||
|
||||
case CMD_FACTORY_RESET:
|
||||
log_info("event_CMD_FACTORY_RESET\n");
|
||||
/*该命令携带固定数据0x55*/
|
||||
if (umidigi_chargestore_dev->value != 0x55) {
|
||||
break;
|
||||
}
|
||||
#if TCFG_USER_TWS_ENABLE
|
||||
bt_tws_remove_pairs();
|
||||
#endif
|
||||
user_send_cmd_prepare(USER_CTRL_DEL_ALL_REMOTE_INFO, 0, NULL);
|
||||
cpu_reset();
|
||||
break;
|
||||
|
||||
case CMD_RESERVED_2:
|
||||
log_info("event_CMD_RESERVED_2\n");
|
||||
break;
|
||||
|
||||
case CMD_OPEN_CASE:
|
||||
log_info("event_CMD_OPEN_CASE\n");
|
||||
/*在收到其中一个开盖命令后,延迟2s进行耳机端开盖的相关操作*/
|
||||
/*防止被其他开盖命令导致的通讯口电平变化所影响*/
|
||||
if (!__this->open_case_timer) {
|
||||
__this->open_case_timer = sys_timeout_add(NULL, open_case_callback, 2000);
|
||||
}
|
||||
if (__this->case_battery_level == 0xff) {
|
||||
__this->power_sync = 1;
|
||||
}
|
||||
/*该命令携带的8bit data,BIT[7]为充电舱状态 BIT[6:0]为充电舱电量*/
|
||||
__this->case_charger_state = umidigi_chargestore_dev->value >> 7;
|
||||
__this->case_battery_level = umidigi_chargestore_dev->value & 0x7f;
|
||||
if (__this->case_battery_level != __this->pre_power_lvl) {
|
||||
__this->power_sync = 1;
|
||||
}
|
||||
__this->pre_power_lvl = __this->case_battery_level;
|
||||
break;
|
||||
|
||||
case CMD_CLOSE_CASE:
|
||||
log_info("event_CMD_CLOSE_CASE\n");
|
||||
/*该命令携带的8bit data,BIT[7:2]为固定数据0x15*/
|
||||
/*BIT[1]:1:右耳在仓 0:右耳不在仓, BIT[0]:1:左耳在仓 0:左耳不在仓*/
|
||||
if ((umidigi_chargestore_dev->value >> 2) != 0x15) {
|
||||
break;
|
||||
}
|
||||
__this->r_ear_whether_in_box = (umidigi_chargestore_dev->value & 0x02) >> 1;
|
||||
__this->l_ear_whether_in_box = umidigi_chargestore_dev->value & 0x01;
|
||||
__this->ear_number = __this->r_ear_whether_in_box + __this->l_ear_whether_in_box;
|
||||
/* r_printf("r=%d l=%d\n", __this->r_ear_whether_in_box, __this->l_ear_whether_in_box); */
|
||||
/* r_printf("ear_number = %d\n", __this->ear_number); */
|
||||
|
||||
if (!__this->cover_status) {//当前为合盖
|
||||
#if (TCFG_BLE_DEMO_SELECT == DEF_BLE_DEMO_ADV)
|
||||
if ((__this->bt_init_ok) && (tws_api_get_role() == TWS_ROLE_MASTER)) {
|
||||
bt_ble_icon_close(1);
|
||||
}
|
||||
#elif (TCFG_BLE_DEMO_SELECT == DEF_BLE_DEMO_ADV_RCSP)
|
||||
if ((__this->bt_init_ok) && (tws_api_get_role() == TWS_ROLE_MASTER)) {
|
||||
bt_ble_adv_ioctl(BT_ADV_SET_EDR_CON_FLAG, SECNE_DISMISS, 1);
|
||||
}
|
||||
#endif
|
||||
if (!__this->timer) {
|
||||
__this->timer = sys_timeout_add(NULL, umidigi_chargestore_timeout_deal, 2000);
|
||||
if (!__this->timer) {
|
||||
log_error("timer alloc err!\n");
|
||||
} else {
|
||||
__this->close_ing = 1;
|
||||
}
|
||||
} else {
|
||||
sys_timer_modify(__this->timer, 2000);
|
||||
__this->close_ing = 1;
|
||||
}
|
||||
} else {
|
||||
__this->ear_number = 1;
|
||||
__this->close_ing = 0;
|
||||
}
|
||||
break;
|
||||
|
||||
case CMD_ENTER_PAIRING_MODE:
|
||||
log_info("event_CMD_ENTER_PAIRING_MODE\n");
|
||||
/*该命令携带固定数据0x55*/
|
||||
if (umidigi_chargestore_dev->value != 0x55) {
|
||||
break;
|
||||
}
|
||||
if (!__this->pair_timer) {
|
||||
__this->pair_timer = sys_timeout_add(NULL, tws_pair_callback, 2000);
|
||||
}
|
||||
break;
|
||||
|
||||
case CMD_DUT_MODE_CMD:
|
||||
log_info("event_CMD_DUT_MODE_CMD\n");
|
||||
break;
|
||||
|
||||
case CMD_USB_STATE:
|
||||
log_info("event_CMD_USB_STATE\n");
|
||||
/*该命令携带固定数据0x05或0x70 0x05: USB IN, 0x70: USB OUT*/
|
||||
if (umidigi_chargestore_dev->value == 0x05) {
|
||||
__this->usb_state = 1;
|
||||
} else if (umidigi_chargestore_dev->value == 0x70) {
|
||||
__this->usb_state = 0;
|
||||
}
|
||||
break;
|
||||
|
||||
case CMD_RESERVED_B:
|
||||
log_info("event_CMD_RESERVED_B\n");
|
||||
break;
|
||||
|
||||
case CMD_SEND_CASE_BATTERY:
|
||||
log_info("event_CMD_SEND_CASE_BATTERY\n");
|
||||
/*该命令携带的8bit data,BIT[7]为充电舱状态 BIT[6:0]为充电舱电量*/
|
||||
__this->case_charger_state = umidigi_chargestore_dev->value >> 7;
|
||||
__this->case_battery_level = umidigi_chargestore_dev->value & 0x7f;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void umidigi_chargestore_event_to_user(u32 type, u8 event, u8 data)
|
||||
{
|
||||
struct sys_event e;
|
||||
e.type = SYS_DEVICE_EVENT;
|
||||
e.arg = (void *)type;
|
||||
e.u.umidigi_chargestore.event = event;
|
||||
e.u.umidigi_chargestore.value = data;
|
||||
sys_event_notify(&e);
|
||||
}
|
||||
|
||||
/*umidigi充电舱消息处理*/
|
||||
void app_umidigi_chargetore_message_deal(u16 message)
|
||||
{
|
||||
u8 cmd, data;
|
||||
cmd = (message & CMD_IN_MESSAGE) >> 10;
|
||||
data = (message & DATA_IN_MESSAGE) >> 2;
|
||||
|
||||
#if TCFG_TEST_BOX_ENABLE
|
||||
//测试盒在线时,不解码数据
|
||||
if (testbox_get_status()) {
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
switch (cmd) {
|
||||
case CMD_RESERVED_0:
|
||||
log_info("reserved0\n");
|
||||
umidigi_chargestore_event_to_user(DEVICE_EVENT_UMIDIGI_CHARGE_STORE, CMD_RESERVED_0, data);
|
||||
break;
|
||||
case CMD_FACTORY_RESET:
|
||||
//充电仓不删除配对信息
|
||||
break;
|
||||
__this->cover_status = 1;
|
||||
__this->close_ing = 0;
|
||||
r_printf("factory reset\n");
|
||||
umidigi_chargestore_event_to_user(DEVICE_EVENT_UMIDIGI_CHARGE_STORE, CMD_FACTORY_RESET, data);
|
||||
break;
|
||||
case CMD_RESERVED_2:
|
||||
log_info("reserved2\n");
|
||||
umidigi_chargestore_event_to_user(DEVICE_EVENT_UMIDIGI_CHARGE_STORE, CMD_RESERVED_2, data);
|
||||
break;
|
||||
case CMD_OPEN_CASE:
|
||||
__this->cover_status = 1;
|
||||
__this->close_ing = 0;
|
||||
log_info("open case\n");
|
||||
//切模式过程中不发送消息,防止堆满消息
|
||||
if (__this->switch2bt == 0) {
|
||||
umidigi_chargestore_event_to_user(DEVICE_EVENT_UMIDIGI_CHARGE_STORE, CMD_OPEN_CASE, data);
|
||||
}
|
||||
break;
|
||||
case CMD_CLOSE_CASE:
|
||||
__this->cover_status = 0;
|
||||
log_info("close case\n");
|
||||
umidigi_chargestore_event_to_user(DEVICE_EVENT_UMIDIGI_CHARGE_STORE, CMD_CLOSE_CASE, data);
|
||||
break;
|
||||
case CMD_ENTER_PAIRING_MODE:
|
||||
__this->cover_status = 1;
|
||||
log_info("enter pairing mode\n");
|
||||
umidigi_chargestore_event_to_user(DEVICE_EVENT_UMIDIGI_CHARGE_STORE, CMD_ENTER_PAIRING_MODE, data);
|
||||
break;
|
||||
case CMD_DUT_MODE_CMD:
|
||||
log_info("dut mode\n");
|
||||
umidigi_chargestore_event_to_user(DEVICE_EVENT_UMIDIGI_CHARGE_STORE, CMD_DUT_MODE_CMD, data);
|
||||
break;
|
||||
case CMD_USB_STATE:
|
||||
log_info("usb state\n");
|
||||
umidigi_chargestore_event_to_user(DEVICE_EVENT_UMIDIGI_CHARGE_STORE, CMD_USB_STATE, data);
|
||||
break;
|
||||
case CMD_RESERVED_B:
|
||||
log_info("reservedB\n");
|
||||
umidigi_chargestore_event_to_user(DEVICE_EVENT_UMIDIGI_CHARGE_STORE, CMD_RESERVED_B, data);
|
||||
break;
|
||||
case CMD_SEND_CASE_BATTERY:
|
||||
log_info("received case battery\n");
|
||||
umidigi_chargestore_event_to_user(DEVICE_EVENT_UMIDIGI_CHARGE_STORE, CMD_SEND_CASE_BATTERY, data);
|
||||
break;
|
||||
default:
|
||||
log_info("received an invalid message!\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user