/*
 ******************************************************************************
 *
 * @file     VOX_Module.c
 * @brief    VOL/R module
 *                 
 *
 * @version  1.0
 * @date     2022/07/18   09:59:40
 * @author   Alex Xu
 *
 * Copyright (c) 2013-2099,Tkplusemi Technology Co.,Ltd.
 * All Rights Reserved
 *
 * History:
 * Revision          Date           Author            Desc
 * 1.0.0            2022/07/18      Alex          build this file
 ******************************************************************************
 */
#include "vox_module.h"
#include "led.h"
#include "system.h"
#include "discharge_module.h"
#include "sleep.h"
#include "userapp.h"

bit Vor_Vout_Enable = OFF;		//OFF:用于BOOST开启后延时开启VOUT输出；TRUE:用于判断是正常充电还是IOFF充电。
bit Vol_Vout_Enable = OFF;	

#if VOX_ENABLE

/******************************************************************************\
                          Macro definitions
\******************************************************************************/
#define VOX_IOFF_DET_DEBOUNCE		40			//Vox Ioff检测延时4s，为了保证耳机端初始化完成，开始抽电流

#define VOX_LOADON_DET_DEBOUNCE		2

#define T10MIN_DEBOUNCE				150		//10分钟定时，4s一次。150
/******************************************************************************\
                             Variables definitions
\******************************************************************************/
Vox_State_e Vol_State = VOX_NONE_IN_BOX;

//uint8_t Vol_Loadon_Det_Debounce = 0;
uint8_t Vol_Ioff_Det_Debounce = 0;
//uint8_t Vol_LiPro_Det_Debounce = 0;
//bit Vol_LiPro_Flag = 0;

Vox_State_e Vor_State = VOX_NONE_IN_BOX;

//uint8_t Vor_Loadon_Det_Debounce = 0;
uint8_t Vor_Ioff_Det_Debounce = 0;
//uint8_t Vor_LiPro_Det_Debounce = 0;
//bit Vor_LiPro_Flag = 0;	

uint8_t Vol_Output_Short_Debounce = 0;
uint8_t Vor_Output_Short_Debounce = 0;

bit Vol_Bat_Full_Flag = 0;
bit Vor_Bat_Full_Flag = 0;

/******************************************************************************\
                             Functions definitions
\******************************************************************************/

/*
 *******************************************************************************
 *             void Vox_init(void)
 *
 * Description : Vox Initialization :Vox初始化函数
 *
 * Arguments   : NONE

 * Returns     : NONE

 * Notes       : NONE
 *
 *******************************************************************************
 */
 #if 0
void Vox_init(void)
{
	VOX_CTL0 = 0xC3;	   //VOX 负载接入、存在识别功能使能，负载自动识别。打开Vox vds钳压环使能（主要用于VOX 5V输出）。
/*
	SFRADDR = VOX_CON0;    //设置VOX输出500mA，负载识别电流2.5uA。
	SFRDATA &= 0xE0;
	SFRDATA |= (VOX_IOUT_500MA << 3) | VOX_ADT_Cur_2_5UA;
*/	
	Vol_State = VOX_NONE_IN_BOX;

	Vor_State = VOX_NONE_IN_BOX;
}
#endif
#if 0
/*
*******************************************************************************
* 			uint8_t VOL_EN_Type(VOL_Enable_Type_e VOL_Enable_Type)
*
* Description : VOL Open(EN_VO)

* Arguments	:

* Returns 	:

* Notes		:
*
*******************************************************************************
*/
 
void VOL_EN_Type(VOX_Enable_Mode_e VOL_Enable_Mode)
{
	if(VOL_Enable_Mode == VOX_VOUT_Mode )
	{
		VOX_CTL0 &= ~0x10;		//VOL Disable 5V And Enable VOR ADT
		
		VOX_CTL0 |= 0x10;		//VOL Enable 5V   
	}
	else
	{

		VOX_CTL0 &= ~0x10;	//VOL 5v Off	
	}	
}

/*
*******************************************************************************
*			 void VOR_EN_Type(VOR_Enable_Type_e VOR_Enable_Type)
*
* Description : VOL Open(EN_VO)

* Arguments	 :

* Returns	 :

* Notes		 :
*
*******************************************************************************
*/
 void VOR_EN_Type(VOX_Enable_Mode_e VOR_Enable_Mode)
 { 

	if(VOR_Enable_Mode == VOX_VOUT_Mode )
	{
		VOX_CTL0 &= ~0x20;		//VOR Disable 5V And Enable VOR ADT
		
		VOX_CTL0 |= 0x20;		//VOR Enable 5V   
	}
	else
	{

		VOX_CTL0 &= ~0x20;	//VOR 5v Off	
	}
 }
#endif

/*
*******************************************************************************
*			 void Vol_Det_Machine(void)
*
* Description : Vol Detect:耳机识别。 (100ms调用周期)
*
* Arguments	 : NONE

* Returns	 : NONE

* Notes		 : NONE
*
*******************************************************************************
*/
#if DISPLAY_6PIN_188
bit Vol_Outbox_Disp_Flag = 0;
bit Vol_Intobox_Disp_Flag = 0;

#endif
void Vol_Det_Machine(void)
{
	if( gBoost_Prepared_Flag )	
	{
		switch( Vol_State )
		{
			case VOX_GET_INTO_BOX:				//耳机入仓

				if( (VOX_CTL0 & 0x10) != 0x10 )			//1、当前已经开启了VOUT，则无需重复开启；原因：在使能VOUT前需要先关闭VOUT使能，如果连续开，会出现一段时间断开的情况。
				{
					VOX_CTL0 &= ~0x10;		//VOL Disable 5V And Enable VOR ADT
					VOX_CTL0 |= 0x10;		//VOL Enable 5V   
				}

				Vol_State = VOX_STAY_IN_BOX;
			break;
			
			case VOX_STAY_IN_BOX:				//耳机在仓
			
				if( (CHIP_STA1 & 0x24) == 0x24 )						//Vox在充电过程中出现了Loadon和IOFF同时存在的状态，则出现如下三种情况：1、耳机出仓；2、耳机电池充满；3、耳机电池锂保。
				{
#if DISPLAY_6PIN_188				
					if( Vol_Intobox_Disp_Flag )         //拔出左耳，左耳对应的图标闪一次
					{
						Vol_Intobox_Disp_Flag = 0;
						Vol_GetOut_Box_Flag = 1;			//左耳出盒标志置1
						//LED_On_Timer = 0;				
						Vol_Outbox_Disp_Flag = 1;
					}
#endif					
					Vol_Ioff_Det_Debounce++;
					if( Vol_Ioff_Det_Debounce >= VOX_IOFF_DET_DEBOUNCE )			//重载转轻载(耳机出仓后)需延时4s
					{
						Vol_Ioff_Det_Debounce = 0;

						//if( ON == Vol_Vout_Enable ) 					//Vox在正常充电过程中出现了IOFF状态，则说明：1、耳机出仓；2、耳机电池充满；
						{	
							VOX_CTL0 &= ~0x10;		//VOL Disable 5V And Enable VOR ADT
							Vol_Bat_Full_Flag = 1;
#ifdef _DEBUG_VOX
							printf("Vol Get Out\r\n");
#endif	
						
						}							
					}
				}
				else
				if( (CHIP_STA1 & 0x24) == 0x20 )						//观察CHIP_STA1的状态，无IOFF有Loadon，说明：1、耳机出仓后4s内，耳机再次入仓；2、10分钟未满，耳机电池退出锂保状态，进入正常充电；
				{									
					Vol_Ioff_Det_Debounce = 0;
					Vol_Vout_Enable = ON;						//正常充电标志置ON。		
					
#if DISPLAY_6PIN_188		

					if( Vol_Outbox_Disp_Flag )						//左耳4s内再次入盒，左耳对应的图标闪一次
					{
						Vol_Outbox_Disp_Flag = 0;
						Vol_GetOut_Box_Flag = 0;
						Disp_Vol_Lev = Disp_Vor_Lev;
						//LED_On_Timer = 0;							
					}

					Vol_Intobox_Disp_Flag = 1;				
					
#endif
					if( Vol_Bat_Full_Flag )			//耳机充满，在ADT模式下，只有Loadon状态，则说明耳机充满。
					{
						Vol_Vout_Enable = OFF;
						
#if DISPLAY_6PIN_188
						LED_On_Timer = 0;
#endif						
#ifdef _DEBUG_VOX
						printf("Vol Bat Full\r\n");
#endif	
					}
					
				}
				else
				if( !(CHIP_STA1 & 0x24) )		//CHIP_STA1无loadon和ioff状态，则说明耳机出仓了。
				{
					Vol_State = VOX_NONE_IN_BOX; 
#if DISPLAY_6PIN_188					
					Vol_GetInto_Box_Flag = 0;
#endif
					Vol_Bat_Full_Flag = 0;
				}
				
			break;

			case VOX_NONE_IN_BOX:				//空仓
			
				//VOL_EN_Type(VOX_ADT_Mode);
				VOX_CTL0 &= ~0x10;		//VOL Disable 5V And Enable VOR ADT
				
				//Vol_Loadon_Det_Debounce = 0;
				Vol_Ioff_Det_Debounce = 0;
				Vol_Vout_Enable = OFF;
			
				if( CHIP_STA1 & 0x20 )    //ADT模式下出现Loadon信号，则说明有耳机入仓。
				{			
					Vol_State = VOX_GET_INTO_BOX;
					
#if DISCHARGE_ENABLE	
					BST_EN = 1; 		//Boost Enable；异常时由硬件主动关闭。	
#endif

#if DISPLAY_6PIN_188
					Vol_GetInto_Box_Flag = 1;
					Disp_Vol_Lev = Disp_Vor_Lev;

					//LED_On_Timer = 0;	
#endif

#ifdef _DEBUG_VOX
					printf("VO_INTO_BOX\r\n");
#endif					
				}
				
			break;

			default:
			break;
		}	
	}
	else			//Boost保护后，VOX恢复到最初状态。
	{
		Vol_State = VOX_NONE_IN_BOX;
	}

	/*Vol 过流保护，每隔200ms打嗝一次*/
	if( IRQ_FLAG0 & 0x04 )
	{		
		Vol_Output_Short_Debounce++;
		if( Vol_Output_Short_Debounce >= 2 )		//Vor短路保护200ms后，重新开启ADT
		{
			Vol_Output_Short_Debounce = 0;
			IRQ_FLAG0 = 0x04;
			Vol_State = VOX_NONE_IN_BOX;
		}
	}	

}

/*
*******************************************************************************
*			 void Vor_Det_Machine(void)
*
* Description : Vor Detect:耳机识别。 (100ms调用周期)
*
* Arguments	 : NONE

* Returns	 : NONE

* Notes		 : NONE
*
*******************************************************************************
*/
#if DISPLAY_6PIN_188
bit Vor_Outbox_Disp_Flag = 0;
bit Vor_Intobox_Disp_Flag = 0;
#endif
void Vor_Det_Machine(void)
{	
	if( gBoost_Prepared_Flag )	
	{
		switch( Vor_State )
		{
			case VOX_GET_INTO_BOX:				//耳机入仓

				if( (VOX_CTL0 & 0x20) != 0x20 )			//1、当前已经开启了VOUT，则无需重复开启；原因：在使能VOUT前需要先关闭VOUT使能，如果连续开，会出现一段时间断开的情况。
				{			
					VOX_CTL0 &= ~0x20;		//VOR Disable 5V And Enable VOR ADT
					VOX_CTL0 |= 0x20;		//VOR Enable 5V   
				}
				Vor_State = VOX_STAY_IN_BOX;
				
			break;
			
			case VOX_STAY_IN_BOX:				//耳机在仓
				
				if( (CHIP_STA1 & 0x88) == 0x88 )						//Vox在充电过程中出现了Loadon和IOFF同时存在的状态，则说明：1、耳机出仓；2、耳机电池充满；3、耳机电池锂保。
				{
#if DISPLAY_6PIN_188				
					if( Vor_Intobox_Disp_Flag )     //
					{
						Vor_Intobox_Disp_Flag = 0;
						Vor_GetOut_Box_Flag = 1;						//右耳出盒标志置1
						//LED_On_Timer = 0;		
						Vor_Outbox_Disp_Flag = 1;
					}
#endif									
					Vor_Ioff_Det_Debounce++;
					if( Vor_Ioff_Det_Debounce >= VOX_IOFF_DET_DEBOUNCE )			//重载转轻载(耳机出仓后)需延时4s
					{
						Vor_Ioff_Det_Debounce = 0;
			
						//if( ON == Vor_Vout_Enable )						//Vox在正常充电过程中出现了IOFF状态，则说明：1、耳机出仓；2、耳机电池充满；
						{
							VOX_CTL0 &= ~0x20;		//VOR Disable 5V And Enable VOR ADT

							Vor_Bat_Full_Flag = 1;

#ifdef _DEBUG_VOX
							printf("Vor Get Out\r\n");
#endif						
						}
																							
					}
				}
				else
				if( (CHIP_STA1 & 0x88) == 0x80 )						//观察CHIP_STA1的状态，无IOFF有Loadon，说明：1、耳机出仓后4s内，耳机再次入仓；2、10分钟未满，耳机电池退出锂保状态，进入正常充电；3、耳机锂保满10分钟。
				{				
					Vor_Ioff_Det_Debounce = 0;
					Vor_Vout_Enable = ON;
					
#if DISPLAY_6PIN_188	
					if( Vor_Outbox_Disp_Flag )						//左耳4s内再次入盒，左耳对应的图标闪一次
					{
						Vor_Outbox_Disp_Flag = 0;
						Vor_GetOut_Box_Flag = 0;
						Disp_Vor_Lev = Disp_Vol_Lev;
					}

					Vor_Intobox_Disp_Flag = 1;
#endif
					if( Vor_Bat_Full_Flag )
					{
						Vor_Vout_Enable = OFF;
#if DISPLAY_6PIN_188
						LED_On_Timer = 0;
#endif
						
#ifdef _DEBUG_VOX
						printf("Vor Bat Full\r\n");
#endif
					}
				}
				else
				if( !(CHIP_STA1 & 0x88) )		//CHIP_STA1无loadon和ioff状态，则说明耳机出仓了。
				{
					Vor_State = VOX_NONE_IN_BOX; 
#if DISPLAY_6PIN_188					
					Vor_GetInto_Box_Flag = 0;
#endif
					Vor_Bat_Full_Flag = 0;
				}

			break;

			case VOX_NONE_IN_BOX:				//空仓

				VOX_CTL0 &= ~0x20;		//VOR Disable 5V And Enable VOR ADT
				
				Vor_Ioff_Det_Debounce = 0;
				Vor_Vout_Enable = OFF;
				
				/* Loadon状态位存在，则说明耳机入仓，开启后续充电流程。*/
				if( CHIP_STA1 & 0x80 )
				{			
					Vor_State = VOX_GET_INTO_BOX;
					
#if DISCHARGE_ENABLE	
					BST_EN = 1; 		//Boost Enable；异常时由硬件主动关闭。	
#endif
#if DISPLAY_6PIN_188

					Vor_GetInto_Box_Flag = 1;
					Disp_Vor_Lev = Disp_Vol_Lev;

#endif	

#ifdef _DEBUG_VOX
					printf("VOR_INTO_BOX\r\n");
#endif					
				}
				
			break;

			default:
			break;
		}
	}
	else			//Boost保护后，VOX恢复到最初状态。
	{
		Vol_State = VOX_NONE_IN_BOX;
	}

	/*Vor 过流保护(读中断标志位)，每隔200ms打嗝一次*/
	if( IRQ_FLAG0 & 0x08 )
	{		
		Vor_Output_Short_Debounce++;
		if( Vor_Output_Short_Debounce >= 2 )		//Vor短路保护200ms后，重新开启ADT
		{
			Vor_Output_Short_Debounce = 0;
			IRQ_FLAG0 = 0x08;
			Vor_State = VOX_NONE_IN_BOX;
		}
	}	

}

#endif

