425 lines
9.3 KiB
C
425 lines
9.3 KiB
C
/*
|
||
******************************************************************************
|
||
*
|
||
* @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 LED1_On_Timer = 0; //led1亮时间计时
|
||
|
||
uint8_t Earphone_Chg_LED_On_Timer = 0; //耳机出入仓led亮时间计时
|
||
|
||
bit LED_On_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( Earphone_Chg_Flag ) //耳机出入仓呼吸灯循环3次。
|
||
{
|
||
if( Earphone_Chg_LED_On_Timer < LED_OFF_CNT )
|
||
{
|
||
#ifdef BREATHING_LIGHT
|
||
BL_LED.Breathing_Light_On[LED_R] = 0;
|
||
BL_LED.Breathing_Light_On[LED_G] = 0;
|
||
BL_LED.BL_Timer[LED_R] = BL_DUTY_MAX;
|
||
BL_LED.BL_Timer[LED_G] = BL_DUTY_MAX;
|
||
#endif
|
||
LEDR_OFF();
|
||
LEDG_OFF();
|
||
|
||
Earphone_Chg_LED_On_Timer++;
|
||
}
|
||
else
|
||
if( Earphone_Chg_LED_On_Timer < LED_HUXI_ON_CNT ) //红色LED亮5s后灭。
|
||
{
|
||
Earphone_Chg_LED_On_Timer++;
|
||
|
||
if( F_batlevel_low || ( CHIP_STA4 & 0x80 ) ) //充电过程中,耳机出入仓,橙色呼吸三下。
|
||
{
|
||
#ifdef BREATHING_LIGHT
|
||
BL_LED.Breathing_Light_On[LED_R] = 1;
|
||
BL_LED.Breathing_Light_On[LED_G] = 0;
|
||
#endif
|
||
LEDG_OFF();
|
||
}
|
||
else
|
||
{
|
||
#ifdef BREATHING_LIGHT
|
||
BL_LED.Breathing_Light_On[LED_R] = 0;
|
||
BL_LED.Breathing_Light_On[LED_G] = 1;
|
||
#endif
|
||
LEDR_OFF();
|
||
}
|
||
}
|
||
else
|
||
{
|
||
#ifdef BREATHING_LIGHT
|
||
BL_LED.Breathing_Light_On[LED_R] = 0;
|
||
BL_LED.Breathing_Light_On[LED_G] = 0;
|
||
BL_LED.BL_Timer[LED_R] = BL_DUTY_MAX;
|
||
BL_LED.BL_Timer[LED_G] = BL_DUTY_MAX;
|
||
#endif
|
||
LEDR_OFF();
|
||
LEDG_OFF();
|
||
|
||
Earphone_Chg_Flag = 0;
|
||
CoverEvent_Flg_led = 0;
|
||
Earphone_Chg_LED_On_Timer = 0;
|
||
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if ( CHIP_STA4 & 0x80 ) //充电中
|
||
{
|
||
if ( Charger_Done ) // 充电完成,LED绿灯常亮
|
||
{
|
||
LEDG_ON();
|
||
LEDR_OFF();
|
||
LED_On_Timer = 0;
|
||
}
|
||
else
|
||
{
|
||
if( LED_On_Timer < LED_OFF_CNT )
|
||
{
|
||
LEDR_OFF();
|
||
LEDG_OFF();
|
||
|
||
LED_On_Timer++;
|
||
}
|
||
else
|
||
if( LED_On_Timer < LED_CHG_ON_CNT ) //红色LED亮20s后灭。
|
||
{
|
||
LED_On_Timer++;
|
||
|
||
LEDR_ON();
|
||
}
|
||
else
|
||
{
|
||
LEDR_OFF();
|
||
}
|
||
}
|
||
|
||
CoverEvent_Flg_led = 0;
|
||
|
||
LED_On_Flag = 1;
|
||
}
|
||
else
|
||
{
|
||
if( LED_On_Flag )
|
||
{
|
||
#ifdef BREATHING_LIGHT
|
||
BL_LED.Breathing_Light_On[LED_R] = 0;
|
||
BL_LED.Breathing_Light_On[LED_G] = 0;
|
||
BL_LED.BL_Timer[LED_R] = BL_DUTY_MAX;
|
||
BL_LED.BL_Timer[LED_G] = BL_DUTY_MAX;
|
||
#endif
|
||
LEDR_OFF();
|
||
LEDG_OFF();
|
||
|
||
LED_On_Timer = 0;
|
||
|
||
LED1_On_Timer = 0;
|
||
|
||
LED_On_Flag = 0;
|
||
}
|
||
|
||
if ( CoverEvent_Flg_led || Key_Press_short_irq ) //开关盖、短按按键,低电橙灯亮5s,非低电绿灯亮5s。
|
||
{
|
||
if( F_batlevel_low )
|
||
{
|
||
if( LED_On_Timer < LED_OFF_CNT )
|
||
{
|
||
LEDR_OFF();
|
||
LEDG_OFF();
|
||
|
||
LED_On_Timer++;
|
||
}
|
||
else
|
||
if( LED_On_Timer < LED_ON_CNT ) //开关盖,盒子低电,红色LED亮5s后灭。
|
||
{
|
||
LED_On_Timer++;
|
||
|
||
LEDR_ON();
|
||
}
|
||
else
|
||
{
|
||
LEDR_OFF();
|
||
|
||
CoverEvent_Flg_led = 0;
|
||
|
||
Key_Press_short_irq = 0;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
LEDR_OFF();
|
||
|
||
if( LED_On_Timer < LED_OFF_CNT )
|
||
{
|
||
LEDG_OFF();
|
||
|
||
LED_On_Timer++;
|
||
}
|
||
else
|
||
if( LED_On_Timer < LED_ON_CNT ) //开关盖,盒子非低电,绿色LED亮3s后灭。
|
||
{
|
||
LED_On_Timer++;
|
||
|
||
LEDG_ON();
|
||
}
|
||
else
|
||
{
|
||
LEDG_OFF();
|
||
|
||
CoverEvent_Flg_led = 0;
|
||
|
||
Key_Press_short_irq = 0;
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if( Key_Press_ll_irq1 && ( CoverStatus == OPEN ) ) //开盖状态下按键长按5s,橙灯亮5s后,绿灯
|
||
{
|
||
if( LED_On_Timer < LED_OFF_CNT )
|
||
{
|
||
LEDR_OFF();
|
||
LEDG_OFF();
|
||
|
||
LED_On_Timer++;
|
||
}
|
||
else
|
||
if( LED_On_Timer < LED_ON_CNT ) //开关盖,盒子低电,红色LED亮5s后灭。
|
||
{
|
||
LED_On_Timer++;
|
||
|
||
LEDR_ON();
|
||
}
|
||
else
|
||
{
|
||
LEDR_OFF();
|
||
if( LED1_On_Timer < LED_PAIR_CNT )
|
||
{
|
||
LED1_On_Timer++;
|
||
if( (LED1_On_Timer
|
||
% LED_PAIR_Interval) == 0 )
|
||
{
|
||
LEDG_ON();
|
||
}
|
||
else
|
||
{
|
||
LEDG_OFF();
|
||
}
|
||
}
|
||
else
|
||
{
|
||
LEDG_OFF();
|
||
|
||
LED1_On_Timer = 0;
|
||
Key_Press_ll_irq1 = 0;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
#endif
|
||
/*****************************************************************************
|
||
* Function : UserAPP
|
||
* Description : 5ms调用周期
|
||
* Input : None
|
||
* Output : None
|
||
* Return : None
|
||
* Note : None
|
||
*****************************************************************************/
|
||
void UserAPP(void)
|
||
{
|
||
|
||
if( F_sys_tim_100ms )
|
||
{
|
||
F_sys_tim_100ms = 0;
|
||
#if ADC_ENABLE
|
||
Vbat_Adc = Vbat_Value(); //获取Bat电压
|
||
#endif
|
||
|
||
#if HALL_ENABLE
|
||
Hall_Handler(); //开关盖检测
|
||
#endif
|
||
|
||
#if KEY_ENABLE
|
||
Key_Handler(); //按键检测
|
||
#endif
|
||
|
||
#if DISCHARGE_ENABLE
|
||
DisCharge_Handler(); //放电boost功能
|
||
#endif
|
||
|
||
#if CHARGER_ENABLE
|
||
Charger_Handler(); //充电功能
|
||
#endif
|
||
|
||
#if VOX_ENABLE
|
||
Vox_Det_Machine(); //开关盖盒子功能逻辑。
|
||
#endif
|
||
|
||
#ifdef LED_DISPLAY
|
||
LED_Display_App(); //LED 灯效
|
||
#endif
|
||
|
||
#if BAT_VALUE
|
||
check_bat_level(); //电量计
|
||
#endif
|
||
|
||
}
|
||
|
||
if( F_sys_tim_1s )
|
||
{
|
||
F_sys_tim_1s = 0;
|
||
|
||
#if SLEEP_ENABLE
|
||
|
||
/*1、唤醒后工作Ns后进入Sleep Mode。
|
||
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_EN3; //vox loadon wake up enable
|
||
SFRDATA |= 0x3C;
|
||
/* 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
|
||
|
||
VOX_CTL0 &= ~0x30; //VOX 5v Off
|
||
|
||
#if DISCHARGE_ENABLE
|
||
BST_EN = 0; //Boost Disable
|
||
#endif
|
||
|
||
#if ADC_ENABLE
|
||
SFRADDR = ADC_CTL0;
|
||
SFRDATA &= ~0x80; //ADC Disable.
|
||
|
||
SFRADDR = ADCCS_CTL0; //AD0~AD4 GPIO constant 20uA current source disable.
|
||
SFRDATA = 0x00;
|
||
#endif
|
||
SFRADDR = PMU_CTL0; //芯片硬件需求,固定
|
||
SFRDATA &= ~0x30;
|
||
|
||
PCON |= 0x02; //Enter StandbyMode, Only int0 or int1 can wake up system
|
||
|
||
/* OutSleep Handler */ //Enable IRQ
|
||
|
||
SFRADDR = PMU_CTL0; //芯片硬件需求,固定
|
||
SFRDATA |= 0x30;
|
||
|
||
SFRADDR = ADCCS_CTL0; //AD0~AD4 GPIO constant 20uA current source enable.
|
||
SFRDATA = 0x10;
|
||
|
||
#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
|
||
}
|
||
}
|
||
|