/* ****************************************************************************** * * @file UserApp.c * @brief UserApp module * * * @version 1.0 * @date 2023/03/27 15:00:40 * @author Alex Xu * * Copyright (c) 2013-2099,Tkplusemi Technology Co.,Ltd. * All Rights Reserved * * History: * Revision Date Author Desc * 1.0.0 2023/03/27 Alex build this file ******************************************************************************/ /*_____ I N C L U D E S ____________________________________________________*/ #include "userapp.h" #include "gpio.h" #include "adc.h" #include "hall.h" #include "key.h" #include "sleep.h" #include "system.h" #include "bat.h" #include "sys_tim.h" #include "charger_module.h" #include "discharge_module.h" #include "led.h" #include "vox_module.h" /******************************************************************************\ Macro definitions \******************************************************************************/ /******************************************************************************\ Variables definitions \******************************************************************************/ uint8_t LED_On_Timer = 0; //led亮时间计时 //uint8_t LED_On_Timer1 = 0; //led亮时间计时 bit led_blink_1time_flag = 0; /******************************************************************************\ Functions definitions \******************************************************************************/ /***************************************************************************** * Function : void LED_Display_App(void) * Description : 5ms调用周期 * Input : None * Output : None * Return : None * Note : None *****************************************************************************/ /* 充电: 1、充电中,无其它行为打断时,开关盒状态下都显示充电常亮灯效(1Hz闪烁); 2、充满,常亮;可被其它灯效打断; 非充电: 1、首次使用开盖灯效:①高电:亮4s后灭;②低电:1Hz闪4s后灭; 2、非首次使用开盖灯效:①耳机在盒:亮4s后灭;②耳机不在盒:???? ③充电中,开盖闪一下,如何闪?亮多久后灭? 3、关盖灯效,高电:亮4s后灭;低电:1Hz闪4s后灭; 4、关盒状态下无灯效显示; */ #ifdef LED_DISPLAY void LED_Display_App(void) { if( CoverEvent_Flg_led ) //Hall开关盒状态发送改变,非充电(高电)LED亮4s灭、(低电)闪4次(1Hz);充电LED闪一下后进入1Hz闪烁。 { if( F_batlevel_low ) //盒子电池低电,闪4次后灭。说明:在系统上电期间,由于Bat_level初始化为0,Bat_level要等于ADC对应的电量值,需要5s的debounce;因此在上电期间,开关盖灯效会不正确。 { LED_R_FLASH(100,4); CoverEvent_Flg_led = 0; } else { /*配对状态灯效显示*/ if( Cover_Open_Flag && ( CHIP_STA1 & 0xA0 ) ) /* 开盖状态,有耳机在仓。显示配对灯效 */ { if( (Vox_Pairing_State[VOL_CHAN] == VOX_PAIR_ING) || (Vox_Pairing_State[VOR_CHAN] == VOX_PAIR_ING) ) /*配对中,LED闪,频率2Hz*/ { if (Display_Sta != LED_KEEP_FLASHING) { LED_R_KEEP_FLASHING(50); } LED_On_Timer = 0; } else if( (Vox_Pairing_State[VOL_CHAN] == VOX_PAIR_NONE) && (Vox_Pairing_State[VOR_CHAN] == VOX_PAIR_NONE) ) /*配对无效,LED闪10次,频率4Hz*/ { if( Boost_Open_Atleast_Tim_Cnt >= TIM_SHUTDOWN_DEBOUNCE ) { LED_R_FLASH(25,10); } } else if( (Vox_Pairing_State[VOL_CHAN] == VOX_PAIR_OK) && (Vox_Pairing_State[VOR_CHAN] == VOX_PAIR_OK) ) /*配对成功*/ { if( LED_On_Timer < LED_ON_CNT ) //配对成功,LED亮4s后灭。 { LED_On_Timer++; LED_R_ON(); } else { LED_R_OFF(); CoverEvent_Flg_led = 0; } } } else { #if 1 if ( (CHIP_STA4 & 0x80) && (CoverStatus == OPEN) ) //盒子充电中开盖,灯闪一下,无论当前灯是什么状态,灭100ms后恢复原来的灯效。 { if( !led_blink_1time_flag ) //问题:充电中,LED灯效为1Hz闪烁,如果这个灭100ms在闪的高电平中有效果,如果在闪的低电平中,没效果。 { led_blink_1time_flag = 1; LED_R_OFF(); CoverEvent_Flg_led = 0; return; } } #endif if( LED_On_Timer < LED_ON_CNT ) //开关盖,盒子非低电,LED亮4s后灭。 { LED_On_Timer++; LED_R_ON(); } else { LED_R_OFF(); CoverEvent_Flg_led = 0; } } } } else { // 有充电时, LED闪烁 // 充电LED指示 if (CHIP_STA4 & 0x80) { if (Display_Sta != LED_KEEP_FLASHING) // 充电中,LED闪烁 { LED_R_KEEP_FLASHING(100); } } else if ( Charger_Done ) // 充电完成,LED常亮 { LED_R_ON(); } else // 未充电, 则将其熄灭 { LED_R_OFF(); } } } #endif /***************************************************************************** * Function : UserAPP * Description : 5ms调用周期 * Input : None * Output : None * Return : None * Note : None *****************************************************************************/ void UserAPP(void) { if( F_sys_tim_5ms ) { F_sys_tim_5ms = 0; #if KEY_HALL_ENABLE //Key_Handler(); //按键检测 Hall_Handler(); //开关盖检测 #endif #if DISCHARGE_ENABLE DisCharge_Handler(); //放电boost功能 #endif } #ifdef LED_DISPLAY if(F_sys_tim_10ms) { F_sys_tim_10ms = 0; LED_Drv(); } #endif if( F_sys_tim_100ms ) { F_sys_tim_100ms = 0; #if CHARGER_ENABLE Charger_Handler(); //充电功能 #endif #if ADC_ENABLE Vbat_Adc = Vbat_Value(); //获取Bat电压 #endif #if VOX_ENABLE Vox_Det_Machine(); //开关盖盒子功能逻辑。 #endif #ifdef LED_DISPLAY LED_Display_App(); //LED 灯效 #endif #if BAT_VALUE check_bat_level(); //电量计 #endif #ifdef VOX_RX HandleVoxCommMsg(); #endif } if( F_sys_tim_1s ) { F_sys_tim_1s = 0; #if SLEEP_ENABLE /*1、唤醒后工作Ns后进入Sleep Mode,N需要大于100ms。 2、有VIN存在的情况下,系不会进入sleep mode。 */ if( Decnt_SleepDelay > 0 ) /*能否在数字中实现此功能?*/ { Decnt_SleepDelay--; /*倒数进Sleep Mode过程中出现了KEY\HALL\Loadon\IOFF中断,则重新计时。*/ if( Enter_Sleep_Cnt_Restart_Flag ) { Enter_Sleep_Cnt_Restart_Flag = 0; Decnt_SleepDelay = ENTER_STANDBYMODE_CNT; } return; } if( Check_Require_Sleep() ) { /* 唤醒中断使能设置 */ //SFRADDR = WKUP_EN0; //SFRDATA = 0xE6; //wake0 up enable. //SFRADDR = WKUP_EN3; //SFRDATA = 0xFF; //wake3 up enable.VOX loadon wake up. /* Enter Sleep */ /* InSleep Handler */ //Disable All IRQ #if UART0_ENABLE ES0 = 0; //UART0 IRQ Disable #endif EX4 = 0; EX2 = 0; ET0 = 0; //timer0 IRQ Disable #if TIMER1_ENABLE ET1 = 0; //timer1 IRQ Disable #endif SFRADDR = ADC_CTL0; SFRDATA &= ~0x80; //ADC Disable. PCON |= 0x02; //Enter StandbyMode, Only int0 or int1 can wake up system /* OutSleep Handler */ //Enable IRQ #if UART0_ENABLE ES0 = 1; //UART0 IRQ #endif EX4 = 1; EX2 = 1; ET0 = 1; //timer0 IRQ #if TIMER1_ENABLE ET1 = 1; //timer1 IRQ #endif Decnt_SleepDelay = ENTER_STANDBYMODE_CNT; } else { Decnt_SleepDelay = ENTER_STANDBYMODE_CNT; } #endif } }