353 lines
9.4 KiB
C
353 lines
9.4 KiB
C
|
|
#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
|
|||
|
|
|