#include "includes.h"
#include "TankPrediction.h"

typedef struct TankPara TankPara;
typedef struct MonitoringData MonitoringData;

#pragma pack(push, 1)

typedef struct				// size = 1350
{
	uint16_t	check;		// 标志，固定为0x55AA
	union
	{
		TankPara tank;		// size = 1298
		uint8_t tankBuff[1346];
	};
	uint16_t	crc;		// 本记录的crc
} ccs_tank_t;

#pragma pack(pop)

// 储罐参数
ccs_tank_t ccsTank;
// 采集参数
MonitoringData ccsMData;

// 初始化
void CCS_Init()
{
	// 从铁电读取tank值
	FRAM_LoadInfo(FRAM_CCS_TANK_BASE, (uint8_t *)&ccsTank, sizeof(ccsTank));

//	// 测试代码
//	memset(&ccsTank, 0, sizeof(ccsTank));
}

#if 1
// 调用预测函数
void CCS_Predict()
{
    S_RTC_TIME_DATA_T sRTC;
	uint32_t totoalSeconds;

	// 先检查关键参数是否有效
	if(dcBuff.sampleData.staExtTempr[0].notConnect || dcBuff.sampleData.staExtTempr[0].overFlow || dcBuff.sampleData.staExtTempr[0].underFlow)
		return;
	if(dcBuff.sampleData.staPress.notConnect || dcBuff.sampleData.staPress.overFlow || dcBuff.sampleData.staPress.underFlow)
		return;
	if(dcBuff.sampleData.staDPress.notConnect || dcBuff.sampleData.staDPress.overFlow || dcBuff.sampleData.staDPress.underFlow)
		return;
	
	// 初始化MData
	memset(&ccsMData, 0, sizeof(ccsMData));
	
	// MData赋值
//	ccsMData.Record_ID;//存储每次从传感器读的数据，ID
//	//unsigned char  Record_Date[12]; //存储每次从传感器读的数据，日期时间
	// 获取当前时间
	RTC_GetDateAndTime(&sRTC);
	// 计算自上次gps定位以来的时间
	totoalSeconds = Calc_SecondsFromYear(INITIAL_YEAR, sRTC.u32Year, sRTC.u32Month, sRTC.u32Day,
			sRTC.u32Hour, sRTC.u32Minute, sRTC.u32Second);
	Wakeup_CalcUTCTime(totoalSeconds + RTC_offsetSeconds, &sRTC);
	ccsMData.Record_Date = sRTC.u32Year;
	ccsMData.Record_Date = ccsMData.Record_Date * 100 + sRTC.u32Month;
	ccsMData.Record_Date = ccsMData.Record_Date * 100 + sRTC.u32Day;
	ccsMData.Record_Date = ccsMData.Record_Date * 100 + sRTC.u32Hour;
	ccsMData.Record_Date = ccsMData.Record_Date * 100 + sRTC.u32Minute;
	ccsMData.Record_Date = ccsMData.Record_Date * 100;
	ccsMData.Record_T = dcBuff.sampleData.extTempr[0];//存储每次从传感器读的数据，温度（℃）
	ccsMData.Record_P = dcBuff.sampleData.pressure * 0.001;//存储每次从传感器读的数据，压力（KPa-MPa）
	ccsMData.Record_L = dcBuff.sampleData.volumePct * 0.01;//存储每次从传感器读的数据，充装率（0.01%->1%）
//	ccsMData.Record_Amp_x;//运动幅度
//	ccsMData.Record_Amp_y;//运动幅度
//	ccsMData.Record_Amp_z;//运动幅度

//	ccsMData.Record_fr_x;//运动频率
//	ccsMData.Record_fr_y;//运动频率
//	ccsMData.Record_fr_z;//运动频率
//	ccsMData.Record_OutT;//环境温度

	//20220506增加变量
	if(dcBuff.dtuData.recentPosState)
		ccsMData.WE = dcBuff.dtuData.longitude * 0.000001;//经度（°）
	if(dcBuff.dtuData.recentPosState)
		ccsMData.SN = dcBuff.dtuData.latitude * 0.000001;//纬度（°）

	ccsMData.Record_Tg = ccsMData.Record_T;//存储每次从传感器读的数据，气体温度
	ccsMData.Record_Tl = ccsMData.Record_T;//存储每次从传感器读的数据，气体温度

//	ccsMData.Yewei = dcBuff.sampleData.height * 0.001;//液位（mm->m）
//	if(dcBuff.sampleData.vacuum[0].staVacuum == VACUUM_STATUS_OK)
//		ccsMData.zkd = dcBuff.sampleData.vacuum[0].vacuum;// 真空度（Pa）
//	ccsMData.dP = dcBuff.sampleData.diff; //压差（KPa）

//	ccsMData.mdY2;// 预留变量
//	ccsMData.mdY3;
//	ccsMData.mdY4;
//	ccsMData.mdY5;
//	ccsMData.mdY6;
//	ccsMData.mdY7;
//	ccsMData.mdY8;
//	ccsMData.mdY9;
//	ccsMData.mdY10;

	// 调用维持时间算法
	PredictTime(&ccsMData, &ccsTank.tank);
	
	// 保存tank值到铁电
	FRAM_SaveInfo(FRAM_CCS_TANK_BASE, (uint8_t *)&ccsTank, sizeof(ccsTank));
	
	// 获取结果
	dcBuff.sampleData.ccsRemainDay = (uint16_t) ccsTank.tank.MaintainTime;
	dcBuff.sampleData.ccsVer = ccsTank.tank.sfbm;
	
	PRINTF("\r\n*** MaintainTime: %d, sfbm: %06d ***\r\n", dcBuff.sampleData.ccsRemainDay, dcBuff.sampleData.ccsVer);
}
#else
// 调用预测函数
void CCS_Predict()
{
	static uint32_t idx = 0;
	
	double Record_Date[2] = {20161228060000, 20161228120000};
	float extTempr[2] = {-158.96, -158.89};
	float pressure[2] = {0.01, 0.01125};
	float volumePct[2] = {81.4965821058808, 81.5329064771208};
	float longitude[2] = {114.297203, 114.297203};
	float latitude[2] = {30.579869, 30.579869};
	float Record_OutT[2] = {2.4, 7.3};
	
	if(idx >= 2)
		return;
	
	// 初始化MData
	memset(&ccsMData, 0, sizeof(ccsMData));
	
	// MData赋值
//	ccsMData.Record_ID;//存储每次从传感器读的数据，ID
//	//unsigned char  Record_Date[12]; //存储每次从传感器读的数据，日期时间
	ccsMData.Record_Date = Record_Date[idx];
	ccsMData.Record_T = extTempr[idx];//存储每次从传感器读的数据，温度（℃）
	ccsMData.Record_P = pressure[idx];//存储每次从传感器读的数据，压力（KPa-MPa）
	ccsMData.Record_L = volumePct[idx];//存储每次从传感器读的数据，充装率（0.01%->1%）
//	ccsMData.Record_Amp_x;//运动幅度
//	ccsMData.Record_Amp_y;//运动幅度
//	ccsMData.Record_Amp_z;//运动幅度

//	ccsMData.Record_fr_x;//运动频率
//	ccsMData.Record_fr_y;//运动频率
//	ccsMData.Record_fr_z;//运动频率
	ccsMData. Record_OutT = Record_OutT[idx];//环境温度

	//20220506增加变量
	ccsMData.WE = longitude[idx];//经度（°）
	ccsMData.SN = latitude[idx];//纬度（°）

	ccsMData.Record_Tg = ccsMData.Record_T;//存储每次从传感器读的数据，气体温度
	ccsMData.Record_Tl = ccsMData.Record_T;//存储每次从传感器读的数据，气体温度

//	ccsMData.Yewei;//液位（mm->m）
//	ccsMData.zkd;// 真空度（Pa）
//	ccsMData.dP; //压差（KPa）

//	ccsMData.mdY2;// 预留变量
//	ccsMData.mdY3;
//	ccsMData.mdY4;
//	ccsMData.mdY5;
//	ccsMData.mdY6;
//	ccsMData.mdY7;
//	ccsMData.mdY8;
//	ccsMData.mdY9;
//	ccsMData.mdY10;

	// 调用维持时间算法
	PredictTime(&ccsMData, &ccsTank.tank);
	
	// 保存tank值到铁电
	FRAM_SaveInfo(FRAM_CCS_TANK_BASE, (uint8_t *)&ccsTank, sizeof(ccsTank));
	
	// 获取结果
	dcBuff.sampleData.ccsRemainDay = (uint16_t) ccsTank.tank.MaintainTime;
	dcBuff.sampleData.ccsVer = ccsTank.tank.sfbm;
	
	PRINTF("\r\n*** MaintainTime: %d, sfbm: %06d ***\r\n", dcBuff.sampleData.ccsRemainDay, dcBuff.sampleData.ccsVer);

	idx++;
}
#endif
