#ifndef		_FRam_H_
#define		_FRam_H_
/******************************************************************************
* NAME:      fRam.h
*******************************************************************************/
/*_____ M A C R O S __________________________________________________________*/


//端口
#define FM_CS_EN   GPIO_ResetBits(GPIOC, GPIO_Pin_6);
#define FM_CS_DIS  GPIO_SetBits(GPIOC, GPIO_Pin_6);
#define FM_WP_EN   GPIO_ResetBits(GPIOC, GPIO_Pin_7);
#define FM_WP_DIS  GPIO_SetBits(GPIOC, GPIO_Pin_7);
//FM 命令
#define	FM_WREN		 0X06  //读写使能
#define	FM_READ 	 0X03  //读命令
#define	FM_WRITE	 0X02  //写命令

#define CLI()      __set_PRIMASK(1)  
#define SEI()      __set_PRIMASK(0)

/*_____ M A C R O S __________________________________________________________*/
//CONFIG(配置)
#define	FRAM_SPACE_SIZE	(0X800)					///定义铁电最大保存容量 
#define FristStart_Addr 0
//******************************************************************************
// 存储器内容

#define uniGlobal s_uniGlobal.u

//******************************************************************************
// FRAM_DATA_MAP
//******************************************************************************
#define	checkLen_1	0	  	///如果数据组带有校验,增加1byte
//==============================================================================
//单价
///全局缓冲中的值
#define	buf_Price		uniGlobal.Price
///结构体定义
#define	Price_FADR		100
#define	Price_SADR		FRAM_SPACE_SIZE/2+100
#define	Price_LEN		(sizeof(buf_Price) + checkLen_1)
#define	Price_arrayNb 	gunNumber	
//==============================================================================
//班累
///全局缓冲中的值
#define	buf_M_SquadTop		uniGlobal.M_SquadTop
///结构体定义
#define	M_SquadTop_FADR		  (Price_FADR + Price_LEN)
#define	M_SquadTop_SADR		  (Price_SADR + Price_LEN)
#define	M_SquadTop_LEN		  (sizeof(buf_M_SquadTop) + checkLen_1)
#define	M_SquadTop_arrayNb 	gunNumber	
//==============================================================================
//班累
///全局缓冲中的值
#define	buf_V_SquadTop		uniGlobal.V_SquadTop
///结构体定义
#define	V_SquadTop_FADR		  (M_SquadTop_FADR + M_SquadTop_LEN)
#define	V_SquadTop_SADR		  (M_SquadTop_SADR + M_SquadTop_LEN)
#define	V_SquadTop_LEN		  (sizeof(buf_V_SquadTop) + checkLen_1)
#define	V_SquadTop_arrayNb 	gunNumber	
//==============================================================================
//班累
///全局缓冲中的值
#define	buf_S_SquadTop		uniGlobal.S_SquadTop
///结构体定义
#define	S_SquadTop_FADR		  (V_SquadTop_FADR + V_SquadTop_LEN)
#define	S_SquadTop_SADR		  (V_SquadTop_SADR + V_SquadTop_LEN)
#define	S_SquadTop_LEN		  (sizeof(buf_S_SquadTop) + checkLen_1)
#define	S_SquadTop_arrayNb 	gunNumber	
//体积总累
///全局缓冲中的值
#define	buf_MassTop		uniGlobal.MassTop
///结构体定义
#define	MassTop_FADR		  (S_SquadTop_FADR + S_SquadTop_LEN)
#define	MassTop_SADR		  (S_SquadTop_SADR + S_SquadTop_LEN)
#define	MassTop_LEN		  (sizeof(buf_MassTop) + checkLen_1)
#define	MassTop_arrayNb 	gunNumber	
//质量总累
///全局缓冲中的值
#define	buf_VolumeTop		uniGlobal.VolumeTop
///结构体定义
#define	VolumeTop_FADR		  (MassTop_FADR + MassTop_LEN)
#define	VolumeTop_SADR		  (MassTop_SADR + MassTop_LEN)
#define	VolumeTop_LEN		  (sizeof(buf_VolumeTop) + checkLen_1)
#define	VolumeTop_arrayNb 	gunNumber	
//金额总累
///全局缓冲中的值
#define	buf_SaleTop		uniGlobal.SaleTop
///结构体定义
#define	SaleTop_FADR		  (VolumeTop_FADR + VolumeTop_LEN)
#define	SaleTop_SADR		  (VolumeTop_SADR + VolumeTop_LEN)
#define	SaleTop_LEN		  (sizeof(buf_SaleTop) + checkLen_1)
#define	SaleTop_arrayNb 	gunNumber	
//卸车总累
///全局缓冲中的值
#define	buf_StockTop		uniGlobal.StockTop
///结构体定义
#define	StockTop_FADR		  (SaleTop_FADR + SaleTop_LEN)
#define	StockTop_SADR		  (SaleTop_SADR + SaleTop_LEN)
#define	StockTop_LEN		  (sizeof(buf_StockTop) + checkLen_1)
#define	StockTop_arrayNb 	gunNumber	
//小数点
///全局缓冲中的值
#define	buf_Decimal		uniGlobal.Decimal
///结构体定义
#define	Decimal_FADR		  (StockTop_FADR + StockTop_LEN)
#define	Decimal_SADR		  (StockTop_SADR + StockTop_LEN)
#define	Decimal_LEN		  (sizeof(buf_Decimal) + checkLen_1)
#define	Decimal_arrayNb 	gunNumber	
//系统时间
///全局缓冲中的值
#define	buf_SystemTime		uniGlobal.SystemTime
///结构体定义
#define	SystemTime_FADR		  (Decimal_FADR + Decimal_LEN)
#define	SystemTime_SADR		  (Decimal_SADR + Decimal_LEN)
#define	SystemTime_LEN		  (sizeof(buf_SystemTime) + checkLen_1)
#define	SystemTime_arrayNb 	gunNumber	
//流量计模式
///全局缓冲中的值
#define	buf_GasWorkMode		uniGlobal.GasWorkMode
///结构体定义
#define	GasWorkMode_FADR		  (SystemTime_FADR + SystemTime_LEN)
#define	GasWorkMode_SADR		  (SystemTime_SADR + SystemTime_LEN)
#define	GasWorkMode_LEN		  (sizeof(buf_GasWorkMode) + checkLen_1)
#define	GasWorkMode_arrayNb 	gunNumber	
//脉冲当量
///全局缓冲中的值
#define	buf_PulseEqu		uniGlobal.PulseEqu
///结构体定义
#define	PulseEqu_FADR		  (GasWorkMode_FADR + GasWorkMode_LEN)
#define	PulseEqu_SADR		  (GasWorkMode_SADR + GasWorkMode_LEN)
#define	PulseEqu_LEN		  (sizeof(buf_PulseEqu) + checkLen_1)
#define	PulseEqu_arrayNb 	gunNumber	
//密度
///全局缓冲中的值
#define	buf_Density	uniGlobal.Density
///结构体定义
#define	Density_FADR		  (PulseEqu_FADR + PulseEqu_LEN)
#define	Density_SADR		  (PulseEqu_SADR + PulseEqu_LEN)
#define	Density_LEN		  (sizeof(buf_Density) + checkLen_1)
#define	Density_arrayNb 	gunNumber	
//最小显示量
///全局缓冲中的值
#define	buf_MinDisp	uniGlobal.MinDisp
///结构体定义
#define	MinDisp_FADR		  (Density_FADR + Density_LEN)
#define	MinDisp_SADR		  (Density_SADR + Density_LEN)
#define	MinDisp_LEN		  (sizeof(buf_MinDisp) + checkLen_1)
#define	MinDisp_arrayNb 	gunNumber	
//提前关阀量
///全局缓冲中的值
#define	buf_ValueTurnOff	uniGlobal.ValueTurnOff
///结构体定义
#define	ValueTurnOff_FADR		  (MinDisp_FADR + MinDisp_LEN)
#define	ValueTurnOff_SADR		  (MinDisp_SADR + MinDisp_LEN)
#define	ValueTurnOff_LEN		  (sizeof(buf_ValueTurnOff) + checkLen_1)
#define	ValueTurnOff_arrayNb 	gunNumber	
//过冲量
///全局缓冲中的值
#define	buf_ValueOverShoot	uniGlobal.ValueOverShoot
///结构体定义
#define	ValueOverShoot_FADR		  (ValueTurnOff_FADR + ValueTurnOff_LEN)
#define	ValueOverShoot_SADR		  (ValueTurnOff_SADR + ValueTurnOff_LEN)
#define	ValueOverShoot_LEN		  (sizeof(buf_ValueOverShoot) + checkLen_1)
#define	ValueOverShoot_arrayNb 	gunNumber	
//时间计数器
///全局缓冲中的值
#define	buf_TimeCount	uniGlobal.TimeCount
///结构体定义
#define	TimeCount_FADR		  (ValueOverShoot_FADR + ValueOverShoot_LEN)
#define	TimeCount_SADR		  (ValueOverShoot_SADR + ValueOverShoot_LEN)
#define	TimeCount_LEN		  (sizeof(buf_TimeCount) + checkLen_1)
#define	TimeCount_arrayNb 	gunNumber
//当次加油数据
///全局缓冲中的值
#define	buf_FuelRecord0	uniGlobal.FuelRecord0
///结构体定义
#define	FuelRecord0_FADR		  (TimeCount_FADR + TimeCount_LEN)
#define	FuelRecord0_SADR		  (TimeCount_SADR + TimeCount_LEN)
#define	FuelRecord0_LEN		  (sizeof(buf_FuelRecord0) + checkLen_1)
#define	FuelRecord0_arrayNb 	gunNumber
//前次加油数据
///全局缓冲中的值
#define	buf_FuelRecord1	uniGlobal.FuelRecord1
///结构体定义
#define	FuelRecord1_FADR		  (FuelRecord0_FADR + FuelRecord0_LEN)
#define	FuelRecord1_SADR		  (FuelRecord0_SADR + FuelRecord0_LEN)
#define	FuelRecord1_LEN		  (sizeof(buf_FuelRecord1) + checkLen_1)
#define	FuelRecord1_arrayNb 	gunNumber
//限制加油次数
///全局缓冲中的值
#define	buf_TriesLimit	uniGlobal.TriesLimit
///结构体定义
#define	TriesLimit_FADR		  (FuelRecord1_FADR + FuelRecord1_LEN)
#define	TriesLimit_SADR		  (FuelRecord1_SADR + FuelRecord1_LEN)
#define	TriesLimit_LEN		  (sizeof(buf_TriesLimit) + checkLen_1)
#define	TriesLimit_arrayNb 	gunNumber
//流量计地址
///全局缓冲中的值
#define	buf_GasAddr	uniGlobal.GasAddr
///结构体定义
#define	GasAddr_FADR		  (TriesLimit_FADR + TriesLimit_LEN)
#define	GasAddr_SADR		  (TriesLimit_SADR + TriesLimit_LEN)
#define	GasAddr_LEN		  (sizeof(buf_GasAddr) + checkLen_1)
#define	GasAddr_arrayNb 	gunNumber
//流量计地址
///全局缓冲中的值
#define	buf_GasAddr	uniGlobal.GasAddr
///结构体定义
#define	GasAddr_FADR		  (TriesLimit_FADR + TriesLimit_LEN)
#define	GasAddr_SADR		  (TriesLimit_SADR + TriesLimit_LEN)
#define	GasAddr_LEN		  (sizeof(buf_GasAddr) + checkLen_1)
#define	GasAddr_arrayNb 	gunNumber
//比例系数
///全局缓冲中的值
#define	buf_GasScaleCoefficients	uniGlobal.GasScaleCoefficients
///结构体定义
#define	GasScaleCoefficients_FADR		  (GasAddr_FADR + GasAddr_LEN)
#define	GasScaleCoefficients_SADR		  (GasAddr_SADR + GasAddr_LEN)
#define	GasScaleCoefficients_LEN		  (sizeof(buf_GasScaleCoefficients) + checkLen_1)
#define	GasScaleCoefficients_arrayNb 	gunNumber
//密度
///全局缓冲中的值
#define	buf_GasDensity	uniGlobal.GasDensity
///结构体定义
#define	GasDensity_FADR		  (GasScaleCoefficients_FADR + GasScaleCoefficients_LEN)
#define	GasDensity_SADR		  (GasScaleCoefficients_SADR + GasScaleCoefficients_LEN)
#define	GasDensity_LEN		  (sizeof(buf_GasDensity) + checkLen_1)
#define	GasDensity_arrayNb 	gunNumber
///全局缓冲中的值
#define	buf_GasPourTo1	uniGlobal.GasPourTo1
///结构体定义
#define	GasPourTo1_FADR		  (GasDensity_FADR + GasDensity_LEN)
#define	GasPourTo1_SADR		  (GasDensity_SADR + GasDensity_LEN)
#define	GasPourTo1_LEN		  (sizeof(buf_GasPourTo1) + checkLen_1)
#define	GasPourTo1_arrayNb 	gunNumber
//低中到高流速切换
///全局缓冲中的值
#define	buf_GasPour1To2	  uniGlobal.GasPour1To2
///结构体定义
#define	GasPour1To2_FADR		  (GasPourTo1_FADR + GasPourTo1_LEN)
#define	GasPour1To2_SADR		  (GasPourTo1_SADR + GasPourTo1_LEN)
#define	GasPour1To2_LEN		  (sizeof(buf_GasPour1To2) + checkLen_1)
#define	GasPour1To2_arrayNb 	gunNumber
//最大流速
///全局缓冲中的值
#define	buf_GasFlowMax	uniGlobal.GasFlowMax
///结构体定义
#define	GasFlowMax_FADR		  (GasPour1To2_FADR + GasPour1To2_LEN)
#define	GasFlowMax_SADR		  (GasPour1To2_SADR + GasPour1To2_LEN)
#define	GasFlowMax_LEN		  (sizeof(buf_GasFlowMax) + checkLen_1)
#define	GasFlowMax_arrayNb 	gunNumber
//最小流速
///全局缓冲中的值
#define	buf_GasFlowMin	uniGlobal.GasFlowMin
///结构体定义
#define	GasFlowMin_FADR		  (GasFlowMax_FADR + GasFlowMax_LEN)
#define	GasFlowMin_SADR		  (GasFlowMax_SADR + GasFlowMax_LEN)
#define	GasFlowMin_LEN		  (sizeof(buf_GasFlowMin) + checkLen_1)
#define	GasFlowMin_arrayNb 	gunNumber
//最大压力值
///全局缓冲中的值
#define	buf_PressureMax	uniGlobal.PressureMax
///结构体定义
#define	PressureMax_FADR		  (GasFlowMin_FADR + GasFlowMin_LEN)
#define	PressureMax_SADR		  (GasFlowMin_SADR + GasFlowMin_LEN)
#define	PressureMax_LEN		  (sizeof(buf_PressureMax) + checkLen_1)
#define	PressureMax_arrayNb 	gunNumber
//最小压力值
///全局缓冲中的值
#define	buf_PressureMin	uniGlobal.PressureMin
///结构体定义
#define	PressureMin_FADR		  (PressureMax_FADR + PressureMax_LEN)
#define	PressureMin_SADR		  (PressureMax_SADR + PressureMax_LEN)
#define	PressureMin_LEN		  (sizeof(buf_PressureMin) + checkLen_1)
#define	PressureMin_arrayNb 	gunNumber

//卡介质
///全局缓冲中的值
#define	buf_Medium	uniGlobal.Medium
///结构体定义
#define	Medium_FADR		  (PressureMin_FADR + PressureMin_LEN)
#define	Medium_SADR		  (PressureMin_SADR + PressureMin_LEN)
#define	Medium_LEN		  (sizeof(buf_Medium) + checkLen_1)
#define	Medium_arrayNb 	gunNumber
//显示类型设置
///全局缓冲中的值
#define	buf_DispSet	uniGlobal.DispSet
///结构体定义
#define	DispSet_FADR		  (Medium_FADR + Medium_LEN)
#define	DispSet_SADR		  (Medium_SADR + Medium_LEN)
#define	DispSet_LEN		  (sizeof(buf_DispSet) + checkLen_1)
#define	DispSet_arrayNb 	gunNumber

//补偿
///全局缓冲中的值
#define	buf_Compensation	uniGlobal.Compensation
///结构体定义
#define	Compensation_FADR		  (DispSet_FADR + DispSet_LEN)
#define	Compensation_SADR		  (DispSet_SADR + DispSet_LEN)
#define	Compensation_LEN		  (sizeof(buf_Compensation) + checkLen_1)
#define	Compensation_arrayNb 	gunNumber

//RTC时钟第一次开机标志
///全局缓冲中的值
#define	buf_RTCTimer_Flag	uniGlobal.RTCTimer_Flag
///结构体定义
#define	RTCTimer_Flag_FADR		  (Compensation_FADR + Compensation_LEN)
#define	RTCTimer_Flag_SADR		  (Compensation_SADR + Compensation_LEN)
#define	RTCTimer_Flag_LEN		  (sizeof(buf_RTCTimer_Flag) + checkLen_1)
#define	RTCTimer_Flag_arrayNb 	gunNumber

//RTC时钟备份
///全局缓冲中的值
#define	buf_RTCTimer_BKB	uniGlobal.RTCTimer_BKB
///结构体定义
#define	RTCTimer_BKB_FADR		  (RTCTimer_Flag_FADR + RTCTimer_Flag_LEN)
#define	RTCTimer_BKB_SADR		  (RTCTimer_Flag_SADR + RTCTimer_Flag_LEN)
#define	RTCTimer_BKB_LEN		  (sizeof(buf_RTCTimer_BKB) + checkLen_1)
#define	RTCTimer_BKB_arrayNb 	gunNumber

//存储器完好标致
///全局缓冲中的值
#define	buf_FRam_Flag	uniGlobal.FRam_Flag
///结构体定义
#define	FRam_Flag_FADR		  (RTCTimer_BKB_FADR + RTCTimer_BKB_LEN)
#define	FRam_Flag_SADR		  (RTCTimer_BKB_SADR + RTCTimer_BKB_LEN)
#define	FRam_Flag_LEN		  (sizeof(buf_FRam_Flag) + checkLen_1)
#define	FRam_Flag_arrayNb 	gunNumber

typedef struct
{ 
	u32 volume;		  		  //volume与sale 必须连续,符个字符对齐首地址
	u32 sale;             //金额
	u32 price;            //单价
}s_FuelRecord_Typedef;

typedef struct
{
  union
	{
		u8    Global[100]; 		                //全局最大个数
		u16   Price[gunNumber];               //单价
		
		u64   M_SquadTop[gunNumber];		        //班累
		u64   V_SquadTop[gunNumber];		        //班累
		u64   S_SquadTop[gunNumber];		        //班累
		u64   MassTop[gunNumber];             //质量总累
		u64   VolumeTop[gunNumber];           //体积总累
	  u64   SaleTop[gunNumber];             //金额总累
		u64   StockTop[gunNumber];			      //卸车总累
		u8    Decimal[3];			                //小数点 金额 体积 单价
		u8    SystemTime[7];                  //系统时间 年年 月 日 时 分 秒
		u8    GasWorkMode[gunNumber];		      //加气模式	
		u32   PulseEqu[gunNumber];			      //脉冲当量
		u32	  Density[gunNumber];				      //密度
		u16   MinDisp[gunNumber];		          //最小显示量
		u8  ValueTurnOff[gunNumber][50];	  //提前关阀量
		int8_t  ValueOverShoot[gunNumber][2];      //过冲量
		u32   TimeCount;						          //时间计数器
		s_FuelRecord_Typedef  FuelRecord0[gunNumber];//当次加油数据
		s_FuelRecord_Typedef  FuelRecord1[gunNumber];//前次加油数据
		u32 TriesLimit;       //限制加油次数
		
	  /******************流量计相关*******************/
	  u8    GasAddr[gunNumber];				           //当前地址0开始，按顺序，与抢号对应
	  u16   GasScaleCoefficients[gunNumber];     //比例系数
	  u16   GasDensity[gunNumber];               //密度
	  u8    GasPourTo1[gunNumber];               //低到中流速切换阀值0-5 默认 2  Kg/Min
	  u8    GasPour1To2[gunNumber];               //中到高流速切换阀值0-5 默认 1.5Kg/Min
	  u8    GasFlowMax[gunNumber];              //最大流速值0-90 默认 50Kg/Min
		u8    GasFlowMin[gunNumber];              //最小流速值0-90 默认 50Kg/Min
		
		/******************压力检测相关******************/
	  u16   PressureMax[gunNumber];         //最大允许压力0-40 默认20MPa
	  u16   PressureMin[gunNumber];         //最小允许压力	
		u16   Medium;              //卡介质
		u16   DispSet;             //显示类型设置
		float Compensation[gunNumber];//补偿
		
		u8    RTCTimer_Flag;   //RTC初次启动标志
		u32   RTCTimer_BKB;   //RTC计数备份
		u8    FRam_Flag;
	 }u;
  u8  CheckAdd;
}s_uniGlobal_Typedef;   //存储器读写缓存共用体

typedef enum
{
	CF_Price,                //单价
	CF_M_SquadTop,           //质量班累
	CF_V_SquadTop,           //体积班累
	CF_S_SquadTop,           //金额班累
	CF_MassTop,              //质量总累
	CF_VolumeTop,            //体积总累
	CF_SaleTop,              //金额总累
	CF_StockTop,             //卸车总累
	CF_Decimal,              //小数点
	CF_SystemTime,           //系统时间
	CF_GasWorkMode,          //流量计模式
	CF_PulseEqu,             //脉冲当量
	CF_Density,              //密度
	CF_MinDisp,              //最小显示量
	CF_ValueTurnOff,         //提前关阀量
	CF_ValueOverShoot,       //过冲量
	CF_TimeCount,            //时间计数器
	CF_FuelRecord0,          //当次加油记录
	CF_FuelRecord1,          //前次加油记录
	CF_TriesLimit,           //限制加油次数
	CF_GasAddr,              //流量计地址
	CF_GasScaleCoefficients, //流量计比例系数
	CF_GasDensity,           //流量计密度
	CF_GasPourTo1,           //低到中流速切换阀值0-5 默认 2  Kg/Min
	CF_GasPour1To2,          //低到中流速切换阀值0-5 默认 2  Kg/Min
	CF_GasFlowMax,           //最大流速值0-90 默认 50Kg/Min
	CF_GasFlowMin,           //最大流速值0-90 默认 50Kg/Min
	CF_PressureMax,          //最大允许压力0-40 默认20MPa
	CF_Medium,               //卡介质
	CF_DispSet,              //显示类型设置
  CF_Compensation,         //补偿
	CF_RTCTimer_Flag,
	CF_RTCTimer_BKB,
	
	CF_FRam_Flag,    //存储器出错标志
	FramItemEnd,
}FramItem;

//********************************************************************************
typedef	struct
{
	u8* pInitData;//初始化指针
	u8* upData;		//共用体数据缓存区指针
	u8* pData;    //pGun数据指针
	u16 firstAdr;	//第一地址		
	u16 secondAdr;//第二地址		
	u8  len;			//长度		
	u8  Tpye;	//类型			
}framDataIndex;

void FM_Init(void);
u8	FMItemWrite(FramItem Type);
u8	FMItemRead(FramItem Type);
void FM_Data_Init(void);
#endif
