/********************************************************************************
Copyright (C), Sinowealth Electronic. Ltd.
Author: 	Sino
Version: 	V0.0
Date: 		2022/12/08
History:
	V0.0		2022/12/08		 Preliminary
********************************************************************************/
#include "Main.h"


//***************************容量计部分相关变量，可直接移动至其他.c文件，其他容量计变量也可以定义在此处，也可以在其他文件中定义**************************************


U16	xdata	Info_uiRSOC;			//对外显示的电量（%），变量类型：U16 xdata（输出）
U32	xdata	Info_ulFCC;				//对外显示的满充容量（mAh），变量类型：U32 xdata（输出）
U32	xdata	Info_ulRC;				//对外显示的剩余容量（mAh），变量类型：U32 xdata（输出）
U16	xdata	Info_uiCycleCount;		//对外显示的放电循环次数（次），变量类型：U16 xdata（输出）

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

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

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

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

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

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

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

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

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

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

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

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

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

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

/*************************************************************************************************
* 函数名: GasGaugeVarIn
* 参  数: 无
* 返回值: 无
* 描  述: 外部值赋给容量计相关变量，每个容量计功能函数执行时均在第一步调用该接口函数
*************************************************************************************************/
void GasGaugeVarIn(void)
{
	BOOL eabak;
	
	eabak = EA;
	IrqDis();
	Info_uiRSOC = Info.uiRSOC;
	Info_ulFCC = Info.ulFCC;
	Info_ulRC = Info.ulRC;
	Info_uiCycleCount = Info.uiCycleCount;
	Info_slCurr = Info.slCurr;
	Info_uiTemp = Info.uiTS[0];
	Info_ulVoltage = Info.ulVoltage;
	uiCellVmaxG = uiCellVmax;
	uiCellVminG = uiCellVmin;
	
	slAdcCur2 = 0;
	siCurCompens = 0;
	
	EA = eabak;
	
	E2ucInitSocDif = 30;
	E2ucInitUpSoc = 90;
	E2uiDsgAdjLowTemp = (10*10 + 2731);
	E2slDsgAdjMaxCurr = -35000;
	E2ucDsgAdjLowFlg = 0;
	E2ucDsgAdjLowSoc = 1;
	E2ucChgAdjRatio = 20;
	E2uiTempFCC_K1 = 16000;
	E2uiTempFCC_K2 = 17;
	E2uiTempFCC_B = 1570;
	E2ucFullDsgDelay = 60;
	E2uiDsgCorrectVol = E2uiVOC[0] - 200;
	E2ucDsgCorrectSOC = 15;
	E2ucDsgVolDet = 10;
	
	E2uiChgCorrectVol = E2uiVOC[9];
	E2ucChgCorrectSOC = 90;
	E2ulChgerEndVol = 4500 * ucCellNum;
	E2ulLoadEndVol = 3000 * ucCellNum;
	E2ucChgerEndDelay = 60;
	E2ucChg100Ratio = 20;
	
	E2ucChgCurRatio = 15;
	E2ucChgChangeSocDif = 20;
	E2ucChgChangeSocRatio = 10;
	
	E2ulIdleSocTimes = 40;
	
	E2ucFccUpdatePercent = 30;
	E2uiChgEndTemp = (15*10 + 2731);
	E2uiDsgEndTemp = (15*10 + 2731);
	
	E2ui_CYCLECOUNTA = 50;
	E2ui_CYCLECOUNTA_K = 5;
	E2ui_CYCLECOUNTA_B = 105;
	E2ui_CYCLECOUNTB = 100;
	E2ui_CYCLECOUNTB_K = 30;
	E2ui_CYCLECOUNTB_B = 98;	
	E2ui_CYCLECOUNTC = 400;
	E2uiUpdateCycleCount = 75;
	
	
	if( bOV )
	{
		E2ucSOC = 100; 
		E2ulDfRC = E2ulFCC; 
		
		Info_uiRSOC = 100;
		Info_ulRC = E2ulFCC;
		
		Info.uiRSOC = 100;
		Info.ulRC = E2ulFCC;
	}
 
 
	if( bUV )
	{
		E2ucSOC = 0; 
		E2ulDfRC = 0; 
		
		Info_uiRSOC = 0;
		Info_ulRC = 0;
		
		Info.uiRSOC = 0;
		Info.ulRC = 0;
	}
//}
//    bAFE_SC = bSC;
}

/*************************************************************************************************
* 函数名: GasGaugeVarOut
* 参  数: 无
* 返回值: 无
* 描  述: 容量计相关变量赋给外部值，每个容量计功能函数执行时均在最后一步调用该接口函数
*************************************************************************************************/
void GasGaugeVarOut(void)
{
	BOOL eabak;
	
	eabak = EA;
	IrqDis();
	Info.uiRSOC = Info_uiRSOC;
	Info.ulFCC = Info_ulFCC;
	Info.ulRC = Info_ulRC;
	Info.uiCycleCount = Info_uiCycleCount;
	bVDQ = bVDQFlg;
	bFC	= bCHGEndFlg;
	bFD	= E2ucDsgEndFlg;
	EA = eabak;
	
	if( bOV )
	{
		E2ucSOC = 100; 
		E2ulDfRC = E2ulFCC; 
		
		Info_uiRSOC = 100;
		Info_ulRC = E2ulFCC;
		
		Info.uiRSOC = 100;
		Info.ulRC = E2ulFCC;
	}
 
 
	if( bUV )
	{
		E2ucSOC = 0; 
		E2ulDfRC = 0; 
		
		Info_uiRSOC = 0;
		Info_ulRC = 0;
		
		Info.uiRSOC = 0;
		Info.ulRC = 0;
	}
//}
//    bAFE_SC = bSC;
}
