/*
 ******************************************************************************
 *
 * @file     charger_module.c
 * @brief    charger module
 *                 
 *
 * @version  1.0
 * @date     2022/07/12   17:35: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/12      Alex          build this file
 ******************************************************************************
 */
/*_____ I N C L U D E S ____________________________________________________*/
#include "charger_module.h"
#include "adc.h"
#include "sys_tim.h"
#include "discharge_module.h"
#include "system.h"
#include "vox_module.h"
#include "led.h"

bit Charger_Done = 0;

#if CHARGER_ENABLE
/******************************************************************************\
                          Macro definitions
\******************************************************************************/
#define NTC_PRO_DEBOUNCE_TIM	10

/******************************************************************************\
                             Variables definitions
\******************************************************************************/

//idata TE_CHG_STA ChgStatus; 	// 系统状态定义


//bit NTC_Low_Pro_Flag = 0;
//bit NTC_High_Pro_Flag = 0;
//bit NTC_CHG_02C_Flag = 0;
//bit NTC_CHG_1C_Flag = 0;


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

/*
 *******************************************************************************
 *             void Charger_init(void)
 *
 * Description : Charger Initialization
 *
 * Arguments   : NONE

 * Returns     : NONE

 * Notes       : NONE
 *
 *******************************************************************************
 */
 #if 0
void Charger_Init(void)
{
	SFRADDR = PMU_CTL1;
	SFRDATA |= 0x07;			//电池低压检测 enable 信号；电池低压检测档位选择：3.3V		
	/* Setting CV */
	REG_CHG2 = 0x00;    //0:4.20V;1:4.35V
	/* Setting CHG Current */
	REG_CHG1 = 0x03;		//000:100mA;001:200mA;010:250mA;011:300mA;100:350mA;101:400mA;110:450mA;111:500mA
	
}
#endif

/*
 *******************************************************************************
 *             void Charger_Current_Set(void)
 *
 * Description : Charger Initialization
 *
 * Arguments   : NONE

 * Returns     : NONE

 * Notes       : NONE
 *
 *******************************************************************************
 */
 #if 0
void Charger_Current_Set(void)
{
	uint16_t Charger_CurADC_Value = 0;
	/* 通过外部电阻ADC1值设置充电电流值 */
	Charger_CurADC_Value = ADC_Chn_Value(ADC_CH1);	

	
	/* Setting CV */
	REG_CHG2 = 0x00;    //0:4.20V;1:4.35V
	/* Setting CHG Current */
	REG_CHG1 = 0x03;		//000:100mA;001:200mA;010:250mA;011:300mA;100:350mA;101:400mA;110:450mA;111:500mA
	
}
#endif

/*
 *******************************************************************************
 *             uint8_t Charger_NTC_Control(uint8_t Charge_sta)
 *
 * Description : Charger NTC Control
 * NTC 支持 103 和 104 电阻，NTC 温度检测由软件通过 ADC 采集 NTC 引脚电压。
 * 如果支持电量计温度检测线性化，支持电量计方案 103 的 NTC 需要并一个 8.2k 
 
 * 电阻（20uA 电流，103 NTC 需要串联 10k 电阻），104 的 NTC 并联 82k 电阻。
 * 在使能充电前，软件先检测NTC 温度，如果 NTC 浮空，屏蔽 NTC 功能，
 * 并锁定；如果 NTC 下拉到 0V，关闭充电和放电。NTC 保护后，软件关闭充电，
 * 温度恢复正常并持续 100ms，再继续充电。
 *
 * Arguments   : NTC_Protect_Type_e NTC_Type:Shield 、JEITA or IEC;Charge_sta:Charge or not

 * Returns     :NTC_Flag (0:Shield;		1:JEITA;	2:IEC)

 * Notes       : NONE
 *
 *******************************************************************************
 */
#if NTC_ENABLE
uint8_t PMU_NTC_Control(void)
{
	uint16_t NTC_Adc = 0;	
	uint8_t nNTC_Pro_Flag = 0;
	
	static bit NTC_Low_Pro_Flag;
	static bit NTC_High_Pro_Flag;
	
#if NTC_ENABLE	

	NTC_Adc = ADC_NTC_Value();

#endif

	if(NTC_Adc >= 2000)		////屏蔽NTC功能，NTC浮空，屏蔽 NTC 功能，并锁定。
	{
		return 1;
	}

	if(NTC_Adc <= T_0C && NTC_Adc > T_45C)		//NTC正常
	{
		if(NTC_Low_Pro_Flag)
		{
			if( NTC_Adc < T_3C )
			{
				NTC_Low_Pro_Flag = 0;
				nNTC_Pro_Flag = 0;
			}
			else
			{
				nNTC_Pro_Flag = 1;
			}
		}
					
		if(NTC_High_Pro_Flag)
		{
			if( NTC_Adc > T_42C )
			{
				NTC_High_Pro_Flag = 0;
				nNTC_Pro_Flag = 0;
			}
			else
			{
				nNTC_Pro_Flag = 1;
			}
		}		
	}
	else			//异常不充电
	{					
			
		if(NTC_Adc > T_0C)
		{
			NTC_Low_Pro_Flag = 1;
		}
		else
		if(NTC_Adc < T_45C)
		{
			NTC_High_Pro_Flag = 1;
		}
																	
		nNTC_Pro_Flag = 1;		
	}

	return nNTC_Pro_Flag;	
}
#endif
/*
 *******************************************************************************
 *             void Charger_Handler(void)
 *
 * Description : Charger Handle. ---- 充电过程除了根据 NTC 动态调节充电电流和截止电压外，其他由硬件控制。充电过程
				发生异常，硬件进行相应处理，并发送标志位，软件可以进行相应处理。
 *
 * Arguments   : NONE

 * Returns     : NONE

 * Notes       : NONE
 *
 *******************************************************************************
 */
 /*
1、充电超时：充电超时后，软件关闭充电使能，等待VIN拔出。
*/
void Charger_Handler(void)
{	
	if( !(CHIP_STA4 & 0x80) )				//未检测到Power good,则关闭Charger使能后返回。
	{
		CHG_CTL &= ~0x01;					//Disable Charger	
		IRQ_FLAG9 = 0x10;					//未充电，需清Charg complete interrupt中断
		Charger_Done = 0;
		return;
	}	
	
	/*各项保护都无需软件处理，只处理充电超时，超时后需要等VBUS重新插拔后才重新开始Charger流程。*/
	if ( IRQ_FLAG9 & 0x0C )			//充电超时,Tricle charg and Fast charge timeout
	{
		CHG_CTL &= ~0x01;					//Disable Charger	
		if ( IRQ_FLAG10 & 0xC0 )    //Plugin\Plugout interrupt
		{
			IRQ_FLAG9 = 0x0C;
			IRQ_FLAG10 = 0xC0;		//Clear Plugin\Plugout interrupt
		}
		return;
	}
	else					/*充电未超时，存在Plug则清Plugin\Plugout int*/
	{
		if( IRQ_FLAG10 & 0xC0 )
		{
			IRQ_FLAG10 = 0xC0;		//Clear Plugin\Plugout interrupt
		}
	}
	
#if NTC_ENABLE	
	/*NTC Handle*/	 				//使能Charger前先检测NTC温度，异常就不开充电。(CHIP_STA4 & 0x80):PG
	if( PMU_NTC_Control() )						//NTC保护，不充电。
	{		
		CHG_CTL &= ~0x01;	//Disable Charger.
		return;
	}
#endif

	if( IRQ_FLAG9 & 0x10 )			//Charg complete interrupt
	{
#if ADC_ENABLE
		
#ifdef _DEBUG_CHARGER					
		printf("Chg Done\r\n");
#endif	
		if( Vbat_Adc < BAT_RECHARG )
		{
			//CHG_CTL |= 0x01;				//Enable Charger
			IRQ_FLAG9 = 0x10;		
#ifdef _DEBUG_CHARGER					
			printf("En Chg\r\n");
#endif						
		}
		else
		{
			CHG_CTL &= ~0x01;				//Disable Charger
#ifdef _DEBUG_CHARGER					
			printf("Dis Chg\r\n");
#endif						
		}
		Charger_Done = 1;
		
#endif
	}
	else
	{
		CHG_CTL |= 0x01;					//Enable Charger	
		Charger_Done = 0;
	}
}

#endif

