#ifndef __GAS_GAUGE_H
#define __GAS_GAUGE_H


#define mAhVALUE		3600


//************容量统计的接口变量，在调用容量计函数前须将系统变量全部赋值给输入类型的接口变量，调用完成后将输出类型的接口变量赋值回系统变量**************
//************也可以直接用接口变量作为系统变量，但数值恒定不变的系统/接口变量须在每次调用容量计前重新赋值一次**************
//************接口变量的名称、类型、所属RAM区块不可改变************
//对外Uart输出显示（若部分参数不需要显示可以不将其赋值给系统的uart输出变量）
extern U16	xdata	Info_uiRSOC;			//对外显示的电量（%），变量类型：U16 xdata（输出）
extern U32	xdata	Info_ulFCC;				//对外显示的满充容量（mAh），变量类型：U32 xdata（输出）
extern U32	xdata	Info_ulRC;				//对外显示的剩余容量（mAh），变量类型：U32 xdata（输出）
extern U16	xdata	Info_uiCycleCount;		//对外显示的放电循环次数（次），变量类型：U16 xdata（输出）

extern U32	xdata	Info_ulDfilterRC;   	//滤波前的剩余容量值对外显示，变量类型：U32（输出）
extern U32	xdata	Info_ulTempDsgFcc;      //计算的可放电容量值对外显示，变量类型：U32（输出）
extern U16	xdata	Info_uiSocDecTime;      //剩余电量百分比（%）的变化率对外显示，变量类型：U16（输出）
extern U16	xdata	Info_uiRsocCnt;			//剩余电量百分比（%）变化计时对外显示，变量类型：U16（输出）

//保护标志
extern BOOL bOCD1;						//放电过流1标志，变量类型：BOOL（输入）
extern BOOL bOCD2;						//放电过流2标志，变量类型：BOOL（输入）
extern BOOL bOCC;						//充电过流标志，变量类型：BOOL（输入）
extern BOOL bAFE_SC;					//短路标志，变量类型：BOOL（输入）
extern BOOL bUV;						//单节电芯欠压标志，变量类型：BOOL（输入）
extern BOOL bOV;						//单节电芯过压标志，变量类型：BOOL（输入）

//存入E2或者赋值为常量的参数
extern U16	xdata	E2uiVOC[10];			//OCV电压数组，分别对应静置时10%容量～100%容量共10个电压点，且E2uiVOC_D[0]对应10%、E2uiVOC_D[9]对应100%，变量类型：U16 xdata（输入）
extern U32	xdata	E2ulDesignCapacity;		//设计容量，变量类型：U32 xdata（输入）
extern U32	xdata	E2ulFCC;				//满充容量，变量类型：U32 xdata（输入\输出存入E2）
extern U32	xdata	E2ulDfRC;				//RSOC滤波前的剩余容量，变量类型：U32 xdata（输入\输出存入E2）
extern U8	xdata	E2ucSOC;				//滤波后用于对外显示的RSOC，变量类型：U8 xdata（输入\输出存入E2）

extern U16	xdata	E2uiChgEndVol;			//充电截止电压，变量类型：U16 xdata（输入）
extern S16	xdata	E2siChgEndCurr;			//充电截止电流，变量类型：S16 xdata（输入）
extern U8	xdata	E2ucChgEndDelay;		//充电截止延时，变量类型：U8 xdata（输入）
extern U16	xdata	E2uiDsgEndVol;			//放电截止电压，变量类型：U16 xdata（输入）
extern S32	xdata	E2slDsgEndCurr;			//放电截止电流，变量类型：S32 xdata（输入）
extern U8	xdata	E2ucDsgEndDelay;		//放电截止延时，变量类型：U8 xdata（输入）
extern U8	xdata	E2ucDsgEndFlg;			//放电截止标志，变量类型：U8 xdata（输入\输出存入E2）
extern U16	xdata	E2uiOVvol;				//单节过压阈值，变量类型：U16 xdata（输入）
extern U16	xdata	E2uiUVvol;				//单节欠压阈值，变量类型：U16 xdata（输入）

extern U32	xdata	E2ulCycleThreshold;		//循环次数更新阈值，变量类型：U32 xdata（输入）
extern U32	xdata	E2ulCycleThresholdCount;//循环电量计数，变量类型：U32 xdata（输入\输出存入E2）
extern U16	xdata	E2uiCycleCount;			//循环次数，变量类型：U16 xdata（输入\输出存入E2）
extern U16	xdata	E2uiLastCCount;			//上次更新容量时的循环次数	，变量类型：U16 xdata（输入\输出存入E2）
extern S16	xdata	E2siDfilterCur;			//零电流窗口，变量类型：S16 xdata（输入）

extern U16	xdata	E2uiDsgAdjLowTemp;		//放电末端调节的最低温度，数值 = 温度（度）×10 + 2731，变量类型：U16 xdata（输入）
extern S32	xdata	E2slDsgAdjMaxCurr;		//放电末端调节的最大放电电流(mA)，变量类型：S32 xdata（输入）
extern U8	xdata	E2ucDsgAdjLowFlg;		//低温或大电流放电欠压时允许SOC跳至1%的标志（1：允许，0：禁止），变量类型：U8 xdata（输入）
extern U8	xdata	E2ucDsgAdjLowSoc;		//低温或大电流放电欠压时允许SOC跳至1%的阈值（%），变量类型：U8 xdata（输入）

extern U8	xdata	E2ucFullDsgDelay;		//静置时判断满放的延时（S），变量类型：U8 xdata（输入）
extern U32	xdata	E2ulLoadEndVol;			//负载或电芯总压截止总电压（mV），变量类型：U32 xdata（输入）
extern U32	xdata	E2ulChgerEndVol;		//充电器或电芯总压截止总电压（mV），变量类型：U32 xdata（输入）
extern U8	xdata	E2ucChgerEndDelay;   	//充电器或电芯总压截止延时（S），变量类型：U8 xdata（输入）
extern U32	xdata	E2ulIdleSocTimes;    	//需要调节SOC的自唤醒次数，变量类型：U32 xdata（输入）

extern U8	xdata	E2ucInitSocDif;			//第一次上电容量条件差值30%，一般不用修改，变量类型：U8 xdata（输入）
extern U8	xdata	E2ucInitUpSoc;				//第一次上电上调容量的OCV容量阈值，变量类型：U8 xdata（输入）
extern U8	xdata	E2ucChgAdjRatio;		//充电末端调节的比例系数，约等于充电时电压从OCV 100%电压~充电截止电压充进的电量百分比(%)(暂定)，变量类型：U8 xdata（输入）
extern U16	xdata	E2uiTempFCC_K1;			//根据温度调节FCC一阶系数，变量类型：U16 xdata（输入）
extern U16	xdata	E2uiTempFCC_K2;			//根据温度调节FCC二阶系数，变量类型：U16 xdata（输入）
extern U16	xdata	E2uiTempFCC_B;			//根据温度调节FCC偏移量，变量类型：U16 xdata（输入）
extern U16	xdata	E2uiDsgCorrectVol;		//开始放电末端修调的电压（mV），变量类型：U16 xdata（输入）
extern U8	xdata	E2ucDsgCorrectSOC;		//开始放电末端修调的容量（%），变量类型：U8 xdata（输入）

extern U8	xdata	E2ucDsgVolDet;			//放电末端电压检测幅度（mV），变量类型：U8 xdata（输入）

extern U16	xdata	E2uiChgCorrectVol;		//开始充电末端修调的电压（mV），变量类型：U16 xdata（输入）
extern U8	xdata	E2ucChgCorrectSOC;		//开始充电末端修调的容量（%），变量类型：U8 xdata（输入）
extern U8	xdata	E2ucChg100Ratio;			//满足满充条件后上调1%间隔时间（S），变量类型：U8 xdata（输入）
extern U8	xdata	E2ucChgCurRatio;			//充电时调节滤波前剩余容量的充电倍率（单位：0.1C），变量类型：U8 xdata（输入）
extern U8	xdata	E2ucChgChangeSocDif;		//充电时修改滤波前剩余容量的容量差值（%），变量类型：U8 xdata（输入）
extern U8	xdata	E2ucChgChangeSocRatio;	//充电时在CHGCUR_RATIO充电倍率下OCV容量上抬的大致幅度(%)，变量类型：U8 xdata（输入）

extern U8	xdata	E2ucFccUpdatePercent;	//单次容量学习更新的最大百分比（%），变量类型：U8 xdata（输入）
extern U16	xdata	E2uiChgEndTemp;			//充电截止温度，数值 = X（度）×10 + 2731，变量类型：U16 xdata（输入）
extern U16	xdata	E2uiDsgEndTemp;          //放电截止温度，数值 = X（度）×10 + 2731，变量类型：U16 xdata（输入）

extern U16	xdata	E2ui_CYCLECOUNTA;			//根据循环次数调节FCC的衰减阶段一：起始循环次数，变量类型：U16 xdata（输入）
extern U16	xdata	E2ui_CYCLECOUNTA_K;		//根据循环次数调节FCC的衰减阶段一：衰减斜率=(CYCLECOUNTB - CYCLECOUNTA)/10，变量类型：U16 xdata（输入）
extern U16	xdata	E2ui_CYCLECOUNTA_B;        //根据循环次数调节FCC的衰减阶段一：衰减截距=(CYCLECOUNTB *100 -CYCLECOUNTA *95) / (CYCLECOUNTB - CYCLECOUNTA)，变量类型：U16 xdata（输入）
extern U16	xdata	E2ui_CYCLECOUNTB;          //调节FCC的衰减阶段二：起始循环次数，变量类型：U16 xdata（输入）
extern U16	xdata	E2ui_CYCLECOUNTB_K;        //调节FCC的衰减阶段二：衰减斜率=(CYCLECOUNTC -CYCLECOUNTB)/10，变量类型：U16 xdata（输入）
extern U16	xdata	E2ui_CYCLECOUNTB_B;        //调节FCC的衰减阶段二：衰减截距=(CYCLECOUNTC *95 -CYCLECOUNTB *85) /(CYCLECOUNTC -CYCLECOUNTB)，变量类型：U16 xdata（输入）
extern U16	xdata	E2ui_CYCLECOUNTC;          //调节FCC的衰减阶段三：起始循环次数，变量类型：U16 xdata（输入）
extern U16	xdata	E2uiUpdateCycleCount;    //上次更新容量后，需再次更新容量的循环次数，变量类型：U16 xdata（输入）

//其他输入的系统全局变量
extern S32	xdata	Info_slCurr;			//经零电流窗口过滤后用于判断充放电状态的主控回路电流（mA），变量类型：S32 xdata（输入）
extern U16	xdata	Info_uiTemp;			//对外显示的电芯温度，数值 = X（度）×10 + 2731，变量类型：U16 xdata（输入）
extern U32	xdata	Info_ulVoltage;			//电芯总电压：U32 xdata（输入）

extern U16	data	uiCellVmaxG;			//当前电压最高的电芯电压，变量类型：U16 data（输入）
extern U16	data	uiCellVminG;			//当前电压最低的电芯电压，变量类型：U16 data（输入）
extern U8	data	ucCellNum;				//电芯串数，变量类型：U8 data（输入）
//extern S32	xdata	slCadcCurAverage;		//用于库伦积分的平均电流（主控充放电回路），变量类型：S32 xdata（输入）
extern S32	xdata	slAdcCur2;				//用于库伦积分的平均电流（辅控放电回路，如没有可以恒为0），变量类型：S32 xdata（输入）
extern S16	xdata	siCurCompens;			//系统功耗电流补偿（预留），可以恒为0，变量类型：U16 xdata（输入）
//*****************************************************************

//************************容量统计的接口函数，每次调用功能函数时，就会分别调用一次接口函数输入、输出容量计相关的变量值*********************************
//**********************根据开发的需求不同，可直接使用容量计的变量作为系统全局变量**********************
//**********************或者重新自定义全局变量，并编写接口函数将自定义的数值输入给容量计变量**********************
extern void GasGaugeVarIn(void);			//变量值输入容量计，每个容量计功能函数执行时均在第一步调用该接口函数
extern void GasGaugeVarOut(void);			//容量计变量值输出，每个容量计功能函数执行时均在最后一步调用该接口函数
//*******************************************************************************

//************************容量统计的功能实现函数*********************************
extern void GasGaugeInit(void);				//上电/开机初始化和欠压低功耗（MCU不断电）下唤醒时调用
extern void GasGaugeIdle(void);				//静置低功耗（MCU不断电）下自唤醒时调用
extern void GasGaugeWkUp(void);				//静置低功耗（MCU不断电）下唤醒准备正常工作前调用
extern void GasGaugeManage(void);			//工作功耗状态下的容量管理
//*******************************************************************************

//**********************容量统计的内部变量，仅作参考，无需作任何处理***********************
extern BOOL	bCHGEndFlg;						//充电截止标志
extern BOOL bCHG100Flg;			//充电显示100标志
extern BOOL	bVDQFlg;						//容量学习标志
extern BOOL	bFCCUpdateFlg;					//容量更新标志
extern U16	idata	uiRCCharge;						//充电容量统计
extern U16	idata	uiRCDischarge;					//放电容量统计
extern U16	idata	uiTempBK;						//温度备份
//extern U16	idata	uiChgVolBK;						//充电电压备份
extern U16	idata	uiDsgVolBK;						//放电电压备份
extern U32	idata	ulTotalVolBK;					//总电压备份
extern U16	xdata	uiVolSpeedCnt;					//充放电末端电压变化率
extern U16	xdata	uiDfRSOC;						//滤波前RSOC    
extern U8	xdata   ucDSGEndDelay1;
extern U8	xdata   ucDSGEndDelay2;
extern U8	xdata   ucCHG100Delay;
extern U8	xdata   ucCHGEndDelay;
extern U16	xdata	uiDfRSOCBK;						//滤波前RSOC的上一秒备份
extern U16	xdata   uiFullDSGDelay;
extern U16	xdata   uiRSOCCnt;
extern S32	xdata 	slCur;							//充/放电总电流
extern S32	xdata 	slCurBK;						//充/放电总电流的上一秒备份
extern U32	xdata	ulFccCount;						//累计充电电量
extern U32	xdata	ulCurAdjSpeed;
extern U32	xdata	ultempfcc;
extern BOOL bCHGFlg;
extern U8	xdata   ucCHGFlgCounter;
extern U8 	xdata	flashcode[6];
extern U8	code	flashcheck[6];
extern BOOL bCHGRcVolFlg;
extern U8	xdata   ucCHGRcVolFlgCounter;
extern U32 	xdata	ulIdleCnt;
//*****************************************************************************************

#endif