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


//端口
#define FM_CS_EN   GPIO_ResetBits(GPIOA, GPIO_Pin_3);GPIO_SetBits(GPIOA, GPIO_Pin_4);
#define FM_CS_DIS  GPIO_SetBits(GPIOA, GPIO_Pin_3);
//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 100
//******************************************************************************
// 存储器内容

#define uniGlobal s_uniGlobal.u

#define	checkLen_1	1	  	///如果数据组带有校验,增加1byte
//******************************************************************************
// FRAM_DATA_MAP
//加密验证数据
///全局缓冲中的值
///结构体定义
#define	Encryption_FADR		  (80)

//存储器完好标致
///全局缓冲中的值
#define	buf_FRam_Flag	uniGlobal.FRam_Flag
///结构体定义
#define	FRam_Flag_FADR		  (FristStart_Addr)
#define	FRam_Flag_LEN		    (sizeof(buf_FRam_Flag) + checkLen_1)
#define	FRam_Flag_Group		     1 //组数

///全局缓冲中的值
#define	buf_ROM_UpData	uniGlobal.ROM_UpData
///结构体定义
#define	ROM_UpData_FADR		  (FRam_Flag_FADR + FRam_Flag_LEN * FRam_Flag_Group)
#define	ROM_UpData_LEN		  (sizeof(buf_ROM_UpData) + checkLen_1)
#define	ROM_UpData_Group		 1 //组数

//员工数据
///全局缓冲中的值
#define	buf_MD_Port_Data	uniGlobal.MD_Port_Data
///结构体定义
#define	MD_Port_Data_FADR		  (ROM_UpData_FADR + ROM_UpData_LEN * ROM_UpData_Group)
#define	MD_Port_Data_LEN		  (sizeof(buf_MD_Port_Data) + checkLen_1)
#define	MD_Port_Data_Group		 4 //组数

//员工数据
///全局缓冲中的值
#define	buf_POSData	uniGlobal.POSData
///结构体定义
#define	POSData_FADR		  (MD_Port_Data_FADR + MD_Port_Data_LEN * MD_Port_Data_Group)
#define	POSData_LEN		  (sizeof(buf_POSData) + checkLen_1)
#define	POSData_Group		 1 //组数

//员工数据
///全局缓冲中的值
#define	buf_MD_Port_Num_Top	uniGlobal.MD_Port_Num_Top
///结构体定义
#define	MD_Port_Num_Top_FADR		  (POSData_FADR + POSData_LEN * POSData_Group)
#define	MD_Port_Num_Top_LEN		  (sizeof(buf_MD_Port_Num_Top) + checkLen_1)
#define	MD_Port_Num_Top_Group		 1 //组数

///全局缓冲中的值
#define	buf_PREXDATA_WaitUpNummber	uniGlobal.PREXDATA_WaitUpNummber
///结构体定义
#define	PREXDATA_WaitUpNummber_FADR		  (MD_Port_Num_Top_FADR + MD_Port_Num_Top_LEN * MD_Port_Num_Top_Group)
#define	PREXDATA_WaitUpNummber_LEN		  (sizeof(buf_PREXDATA_WaitUpNummber) + checkLen_1)
#define	PREXDATA_WaitUpNummber_Group		 1 //组数

///全局缓冲中的值
#define	buf_PREXDATA_TTC	uniGlobal.PREXDATA_TTC
///结构体定义
#define	PREXDATA_TTC_FADR		  (PREXDATA_WaitUpNummber_FADR + PREXDATA_WaitUpNummber_LEN * PREXDATA_WaitUpNummber_Group)
#define	PREXDATA_TTC_LEN		  (sizeof(buf_PREXDATA_TTC) + checkLen_1)
#define	PREXDATA_TTC_Group		 1 //组数

///全局缓冲中的值
#define	buf_PrintInfo	uniGlobal.PrintInfo
///结构体定义
#define	PrintInfo_FADR		  (PREXDATA_TTC_FADR + PREXDATA_TTC_LEN * PREXDATA_TTC_Group)
#define	PrintInfo_LEN		  (sizeof(buf_PrintInfo) + checkLen_1)
#define	PrintInfo_Group		 1 //组数

///全局缓冲中的值
#define	buf_PrintLastRecord	uniGlobal.PrintLastRecord
///结构体定义
#define	PrintLastRecord_FADR		  (PrintInfo_FADR + PrintInfo_LEN * PrintInfo_Group)
#define	PrintLastRecord_LEN		  (sizeof(buf_PrintLastRecord) + checkLen_1)
#define	PrintLastRecord_Group		 64 //组数

///全局缓冲中的值
#define	buf_POSNetSetState	uniGlobal.POSNetSetState
///结构体定义
#define	POSNetSetState_FADR		  (PrintLastRecord_FADR + PrintLastRecord_LEN * PrintLastRecord_Group)
#define	POSNetSetState_LEN		  (sizeof(buf_POSNetSetState) + checkLen_1)
#define	POSNetSetState_Group		 1 //组数

///全局缓冲中的值
#define	buf_MD_Multiplex_Port_Data	uniGlobal.MD_Multiplex_Port_Data
///结构体定义
#define	MD_Multiplex_Port_Data_FADR		  (POSNetSetState_FADR + POSNetSetState_LEN * POSNetSetState_Group)
#define	MD_Multiplex_Port_Data_LEN		  (sizeof(buf_MD_Multiplex_Port_Data) + checkLen_1)
#define	MD_Multiplex_Port_Data_Group		 1 //组数

///全局缓冲中的值
#define	buf_WhiteList	uniGlobal.WhiteList
///结构体定义
#define	WhiteList_FADR		  (MD_Multiplex_Port_Data_FADR + MD_Multiplex_Port_Data_LEN * MD_Multiplex_Port_Data_Group)
#define	WhiteList_LEN		  (sizeof(buf_WhiteList) + checkLen_1)
#define	WhiteList_Group		 1 //组数

///全局缓冲中的值
#define	buf_PREXDATA_Upload	uniGlobal.PREXDATA_Upload
///结构体定义
#define	PREXDATA_Upload_FADR		  (WhiteList_FADR + WhiteList_LEN * WhiteList_Group)
#define	PREXDATA_Upload_LEN		  (sizeof(buf_PREXDATA_Upload) + checkLen_1)
#define	PREXDATA_Upload_Group		 1 //组数

typedef struct
{
  union
	{
		u8                          Global[1000]; 		                //全局最大个数
		u8                          FRam_Flag;
    MD_Port_Data_Type           MD_Port_Data;
		POSData_Type                POSData;
		u8                          MD_Port_Num_Top;
		ROM_UpData_Type             ROM_UpData;
		u32                         PREXDATA_WaitUpNummber;
		u32                         PREXDATA_TTC;
		PrintInfo_Type              PrintInfo;
		PREXDATA_Type               PrintLastRecord;//越南打印每把枪最后一笔数据
		POSNetSetState_TypeDef      POSNetSetState;
		MD_Multiplex_Port_Data_Type MD_Multiplex_Port_Data;//端口5，多路复用口
		WhiteList_Type              WhiteList;
		PREXDATA_Upload_Type        PREXDATA_Upload;
	 }u;
  u8  CheckAdd;
}s_uniGlobal_Typedef;   //存储器读写缓存共用体

typedef enum
{
	CF_FRam_Flag,
	CF_ROM_UpData,
	CF_MD_Port_Data,
  CF_POSData,
	CF_MD_Port_Num_Top,
	CF_PREXDATA_WaitUpNummber,
	CF_PREXDATA_TTC,
	CF_PrintInfo,
	CF_PrintLastRecord,
	CF_POSNetSetState,
	CF_MD_Multiplex_Port_Data,
  CF_WhiteList,
	CF_PREXDATA_Upload,
	
	FramItemEnd,
}FramItem;

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

void FM_Init(void);
u8	FMItemWrite(FramItem Type, u16 Group);
u8	FMItemRead(FramItem Type, u16 Group);
void FM_Data_Init(void);
void PCBEncryption(void);
void PCBEncryption_Check(void);
#endif
