Files
99_7018_lmx/apps/earphone/ui_manage.c

353 lines
9.4 KiB
C
Raw Normal View History

2025-10-29 13:10:02 +08:00
#include "ui_manage.h"
#include "asm/pwm_led.h"
#include "system/includes.h"
#include "app_config.h"
#include "user_cfg.h"
#include "classic/tws_api.h"
#define LOG_TAG_CONST UI
#define LOG_TAG "[UI]"
#define LOG_ERROR_ENABLE
#define LOG_DEBUG_ENABLE
#define LOG_INFO_ENABLE
/* #define LOG_DUMP_ENABLE */
#define LOG_CLI_ENABLE
#include "debug.h"
#define LED_VDDIO_KEEP 1
#define UI_MANAGE_BUF 8
typedef struct _ui_var {
u8 ui_init_flag;
u8 other_status;
u8 power_status;
u8 current_status;
volatile u8 ui_flash_cnt;
cbuffer_t ui_cbuf;
u8 ui_buf[UI_MANAGE_BUF];
int sys_ui_timer;
} ui_var;
static ui_var sys_ui_var = {.power_status = STATUS_NORMAL_POWER};
extern int get_bt_tws_connect_status();
u8 get_ui_status(u8 *status)
{
return cbuf_read(&(sys_ui_var.ui_cbuf), status, 1);
}
u8 get_ui_status_len(void)
{
return cbuf_get_data_size(&(sys_ui_var.ui_cbuf));
}
u8 get_ui_busy_status()
{
return sys_ui_var.ui_flash_cnt;
}
#if (RCSP_ADV_EN)
u8 adv_get_led_status(void)
{
return sys_ui_var.other_status;
}
#endif
void ui_manage_scan(void *priv)
{
STATUS *p_led = get_led_config();
sys_ui_var.sys_ui_timer = 0;
log_info("ui_flash_cnt:%d cur_ui_status:%d", sys_ui_var.ui_flash_cnt, sys_ui_var.current_status);
if (sys_ui_var.ui_flash_cnt == 0 || sys_ui_var.ui_flash_cnt == 7) { //有特殊的闪烁状态等当前状态执行完再进入下一个状态
if (get_ui_status(&sys_ui_var.current_status)) {
if (sys_ui_var.current_status >= STATUS_CHARGE_START && sys_ui_var.current_status <= STATUS_NORMAL_POWER) {
sys_ui_var.power_status = sys_ui_var.current_status;
} else {
sys_ui_var.other_status = sys_ui_var.current_status;
}
}
}
if (sys_ui_var.ui_flash_cnt) {
sys_ui_var.ui_flash_cnt --;
sys_ui_var.sys_ui_timer = usr_timeout_add(NULL, ui_manage_scan, 300, 1);
} else if (get_ui_status_len()) {
sys_ui_var.sys_ui_timer = usr_timeout_add(NULL, ui_manage_scan, 100, 1);
}
#if ((RCSP_ADV_EN)&&(JL_EARPHONE_APP_EN))
if (tws_api_get_role() == TWS_ROLE_SLAVE) {
pwm_led_mode_set(PWM_LED_ALL_OFF);
return;
}
#endif
if (sys_ui_var.other_status != STATUS_POWEROFF && sys_ui_var.power_status != STATUS_NORMAL_POWER) { //关机的状态优先级要高于电源状态
switch (sys_ui_var.power_status) {
case STATUS_LOWPOWER:
log_info("[STATUS_LOWPOWER]\n");
pwm_led_mode_set(p_led->lowpower);
return;
case STATUS_CHARGE_START:
log_info("[STATUS_CHARGE_START]\n");
pwm_led_mode_set(p_led->charge_start);
return;
case STATUS_CHARGE_FULL:
log_info("[STATUS_CHARGE_FULL]\n");
pwm_led_mode_set(p_led->charge_full);
return;
case STATUS_CHARGE_ERR:
log_info("[STATUS_CHARGE_ERR]\n");
pwm_led_mode_set(PWM_LED0_ON);
pwm_led_mode_set(PWM_LED1_ON);
return;
case STATUS_CHARGE_CLOSE:
log_info("[STATUS_CHARGE_CLOSE]\n");
pwm_led_mode_set(PWM_LED0_OFF);
pwm_led_mode_set(PWM_LED1_OFF);
return;
case STATUS_CHARGE_LDO5V_OFF:
log_info("[STATUS_CHARGE_LDO5V_OFF]\n");
case STATUS_EXIT_LOWPOWER:
case STATUS_NORMAL_POWER:
//pwm_led_mode_set(PWM_LED0_OFF);
//pwm_led_mode_set(PWM_LED1_OFF);
sys_ui_var.power_status = STATUS_NORMAL_POWER;
break;
}
}
switch (sys_ui_var.other_status) {
case STATUS_POWERON:
log_info("[STATUS_POWERON]\n");
if (p_led->power_on != PWM_LED0_FLASH_THREE) {
pwm_led_mode_set(p_led->power_on);
} else {
if (sys_ui_var.ui_flash_cnt) {
if (get_bt_tws_connect_status()) {
sys_ui_var.ui_flash_cnt = 0;
ui_manage_scan(NULL);
return;
}
if (sys_ui_var.ui_flash_cnt % 2) {
pwm_led_mode_set(PWM_LED0_OFF);
} else {
pwm_led_mode_set(PWM_LED0_ON);
}
}
}
break;
case STATUS_POWEROFF:
log_info("[STATUS_POWEROFF]\n");
if (p_led->power_off != PWM_LED1_FLASH_THREE) {
pwm_led_mode_set(p_led->power_off);
} else {
if (sys_ui_var.ui_flash_cnt) {
if (sys_ui_var.ui_flash_cnt % 2) {
pwm_led_mode_set(PWM_LED1_OFF);
} else {
pwm_led_mode_set(PWM_LED1_ON);
}
}
}
break;
case STATUS_BT_INIT_OK:
log_info("[STATUS_BT_INIT_OK]\n");
pwm_led_mode_set(p_led->bt_init_ok);
break;
case STATUS_BT_SLAVE_CONN_MASTER:
pwm_led_mode_set(PWM_LED1_SLOW_FLASH);
break;
case STATUS_BT_CONN:
log_info("[STATUS_BT_CONN]\n");
pwm_led_mode_set(p_led->bt_connect_ok);
break;
case STATUS_BT_MASTER_CONN_ONE:
log_info("[STATUS_BT_MASTER_CONN_ONE]\n");
pwm_led_mode_set(PWM_LED0_LED1_SLOW_FLASH);
break;
case STATUS_BT_DISCONN:
log_info("[STATUS_BT_DISCONN]\n");
pwm_led_mode_set(p_led->bt_disconnect);
break;
case STATUS_PHONE_INCOME:
log_info("[STATUS_PHONE_INCOME]\n");
pwm_led_mode_set(p_led->phone_in);
break;
case STATUS_PHONE_OUT:
log_info("[STATUS_PHONE_OUT]\n");
pwm_led_mode_set(p_led->phone_out);
break;
case STATUS_PHONE_ACTIV:
log_info("[STATUS_PHONE_ACTIV]\n");
pwm_led_mode_set(p_led->phone_activ);
break;
case STATUS_POWERON_LOWPOWER:
log_info("[STATUS_POWERON_LOWPOWER]\n");
pwm_led_mode_set(p_led->lowpower);
break;
case STATUS_BT_TWS_CONN:
log_info("[STATUS_BT_TWS_CONN]\n");
pwm_led_mode_set(p_led->tws_connect_ok);
break;
case STATUS_BT_TWS_DISCONN:
log_info("[STATUS_BT_TWS_DISCONN]\n");
pwm_led_mode_set(p_led->tws_disconnect);
break;
}
}
int ui_manage_init(void)
{
if (!sys_ui_var.ui_init_flag) {
cbuf_init(&(sys_ui_var.ui_cbuf), &(sys_ui_var.ui_buf), UI_MANAGE_BUF);
sys_ui_var.ui_init_flag = 1;
}
return 0;
}
void ui_update_status(u8 status)
{
STATUS *p_led = get_led_config();
if (!sys_ui_var.ui_init_flag) { //更新UI状态之前需先初始化ui_cbuf
ui_manage_init();
}
log_info("update ui status :%d", status);
if ((status == STATUS_POWERON && p_led->power_on == PWM_LED0_FLASH_THREE) || (status == STATUS_POWEROFF && p_led->power_off == PWM_LED1_FLASH_THREE)) {
log_info(">>>set ui_flash_cnt");
sys_ui_var.ui_flash_cnt = 7;
}
cbuf_write(&(sys_ui_var.ui_cbuf), &status, 1);
/* if (!sys_ui_var.sys_ui_timer) { */
/* sys_ui_var.sys_ui_timer = usr_timeout_add(NULL, ui_manage_scan, 10); */
/* } */
if (sys_ui_var.ui_flash_cnt >= 1 && sys_ui_var.ui_flash_cnt <= 6) {
return;
}
ui_manage_scan(NULL);
}
u8 pdown_keep_pw_gate()
{
#if(LED_VDDIO_KEEP == 1) //led 进入powerdown时模块的电源是否降低降低会导致灯抖动不降的话功耗会高100ua
return true;
#else
if ((sys_ui_var.current_status == STATUS_BT_DISCONN) ||
(sys_ui_var.current_status == STATUS_BT_INIT_OK) ||
(sys_ui_var.current_status == STATUS_BT_TWS_DISCONN)) {
return true;
} else {
return false;
}
#endif
}
#if (TCFG_USER_TWS_ENABLE == 1)
__attribute__((weak))
bool is_led_module_on()
{
return 0;
}
__attribute__((weak))
void led_module_on()
{
}
__attribute__((weak))
void led_module_off()
{
}
__attribute__((weak))
void led_timer_del()
{
}
__attribute__((weak))
void led_module_enter_sniff_mode()
{
}
__attribute__((weak))
void led_module_exit_sniff_mode()
{
}
__attribute__((weak))
void led_sniff_mode_double_display(u32 index)
{
}
extern int get_bt_tws_connect_status();
//对耳连接成功之后利用SNIFF的节奏来进行闪灯同步,只是通过开关LED模块来实现同步
void sniff_achor_point_hook(u32 slot)
{
u8 led_mode = pwm_led_display_mode_get();
if (led_mode != PWM_LED0_ONE_FLASH_5S && led_mode != PWM_LED1_ONE_FLASH_5S) {
if (get_bt_tws_connect_status()) {
//交替闪进sniff同步
if (led_mode == PWM_LED0_LED1_FAST_FLASH) {
if ((slot % ((CFG_DOUBLE_FAST_FLASH_FREQ * 1000) / 625)) < 800) {
led_sniff_mode_double_display((slot / ((CFG_DOUBLE_FAST_FLASH_FREQ * 1000) / 625)) & BIT(0));
}
} else if (led_mode == PWM_LED0_LED1_SLOW_FLASH) {
if ((slot % ((CFG_DOUBLE_SLOW_FLASH_FREQ * 1000) / 625)) < 800) {
led_sniff_mode_double_display((slot / ((CFG_DOUBLE_SLOW_FLASH_FREQ * 1000) / 625)) & BIT(0));
}
}
}
return;
}
/* if (get_bt_tws_connect_status()) { */
#if defined CFG_LED_MODE && (CFG_LED_MODE == CFG_LED_SOFT_MODE)
led_timer_del();
#endif
if (is_led_module_on()) {
led_module_off();
}
if ((slot % (1600 * 5)) < 800) { //一个slot = 0.625ms 1600*0.625 = 1s
led_module_on();
}
/* } else { */
/* } */
}
#else
__attribute__((weak))
int get_bt_tws_connect_status()
{
return 0;
}
#endif