#ifndef _EEPROM_H_
#define _EEPROM_H_
#include "includes.h"
#include "apt32f102.h"

/*地址范围：0x10000000~0x100007FF*/
#define EEPROM_MCUDevInfo_Address			0x10000000				//MCU 设备信息地址固定为0x10000000，大小为0x40 此区域不可改动

#define EEPROM_PARA_SaveAddr				0x10000100

#define EEPROM_ENERGE_PARA_SaveAddr			0x10000180				//电能参数

#define EEPROM_EngSaveCnt_SaveAddr			0x10000200				//保存总电能保存次数

#define EEPROM_EngSave_StartAddr			DROM_PageAdd9				//总电能保存起始地址
#define EEPROM_EngSave_EndAddr				DROM_PageAdd31
#define EEPROM_OFFSET_ADDRSIZE				0x00000040				//偏移地址大小（单扇区大小）


/*	EEPROM 保存数据格式：
 * 		FLAG	- 1Byte		保存标志位
 * 		LEN		- 2Byte		保存数据长度
 * 		CHECK	- 1Byte		保存数据校验
 * 		DATA	- nByte		保存数据内容
 * 
 * */
 
//电能参数保存
#define EEPROM_ENERGY_SAVE_FLAG		0xA6		//电能检测参数保存
#define EEPROM_ENERGY_SIZE			50			//最大长度
#define EEPROM_SAVEADDR_CNT			40000		//单个地址的存储次数	
#define EEPROM_SAVETIME				3600000		//默认自动保存时间,1小时
#define EEPROM_COLLTIME				5000		//默认采集时间,5S
#define EEPROM_REPTIME				60000		//默认主动上报时间,1min

#define EEPROM_SAVE_Flag			0xA5			//EEPROM保存标志位
//#define EEPROM_PARA_Size			50
#define EEPROM_Data_Offset			0x04

/*boot*/
#define EEPROM_Offset_SaveFlag		0x00
#define EEPROM_Offset_Datalen		0x01
#define EEPROM_Offset_Check			0x03
#define EEPROM_Offset_Data			0x04


#define EEPROM_SVAE_FLAG			0xAE
#define EEPROM_DATA_Size_Max		0x40				//目前保存数据内容最长为100Byte
#define EEPROM_PARA_Size			50
#define EEPROM_DEV_NAME_Size		32

typedef struct{
	
	F32_T v_k_val;				//电压系数
	F32_T ia_k_val;				//电流系数A
	F32_T ib_k_val;				//电流系数B
	F32_T pa_k_val;				//功率系数A
	F32_T pb_k_val;				//功率系数B
	F32_T i_OffSetVal;			//电流偏差
	F32_T p_OffSetVal;			//功率偏差
	
	U32_T eng_save_max;			//单扇区存储次数上限
	U32_T eng_save_offset;		//存储扇区编号,从1开始
	
	U32_T collect_tim;			//采集间隔，默认5秒钟
	U32_T report_tim;			//上报间隔，默认10分钟
	U32_T saveFlash_tim;		//保存时间，默认1小时	
	
}ENERGY_SAVE_PARA;

typedef struct{
	
	U32_T eng_total;			//总能耗，单位：w/h
	U32_T eng_save_cnt;			//当前存储总次数
	U32_T U32_EnergyA_RegData;	//A通道有功电能有效值寄存器累计值,单位:
	
}ENERGY_SAVE;

typedef struct{
	
	U8_T dev_addr;									//设备地址
	U8_T dev_type;									//设备类型
	U8_T dev_boot_ver;								//设备Boot的软件版本号
	U8_T dev_app_ver;								//设备APP的软件版本号
	U8_T dev_name_len;								//设备名称的长度
	U8_T dev_name[EEPROM_DEV_NAME_Size];          	//设备名称

}E_MCU_DEV_INFO;

extern E_MCU_DEV_INFO g_mcu_dev;
extern ENERGY_SAVE_PARA e_save;


void EEPROM_Init(void);
U8_T EEPROM_ReadPara(void);
U8_T EEPROM_WritePara(void);
void EEPROM_TouchPara_Printf();
U8_T EEPROM_CheckSum(U8_T *data,U16_T len);
/*boot*/
U8_T EEPROM_ReadMCUDevInfo(E_MCU_DEV_INFO *info);
U8_T EEPROM_WriteMCUDevInfo(E_MCU_DEV_INFO *info);
void EEPROM_Default_MCUDevInfo(E_MCU_DEV_INFO *info);
void EEPROM_Validate_MCUDevInfo(E_MCU_DEV_INFO *info);

/* energy */
U8_T EEOROM_ENERGY_ReadSet(ENERGY_SAVE_PARA *info);
//U8_T EEOROM_ENERGY_WriteSet(ENERGY_SAVE_PARA *info);
void EEPROM_ENERGY_Validate(void);
void EEPROM_Default_ENERGY(ENERGY_SAVE_PARA *info);
U8_T EEPROM_ReadTotalEng(ENERGY_SAVE *info);
U8_T EEPROM_WriteTotalEng(ENERGY_SAVE *info);
#endif
