#ifndef __APP_FLASH_H__
#define __APP_FLASH_H__
/*************************************
 *INCLUDES
 */
#include "hal_flash.h"
#include "app_step.h"
#include "exception.h"
#include "app_power.h"
#include "nrf_gpio.h"
#include "nrf_delay.h"
#include "nrf_sdm.h"

/*************************************
 *STRUCTIONS
 */
//__attribute__((packed,aligned(4))) : 先按实际字节占位算，最后才4字节对齐。
//size:20
typedef struct __attribute__((packed,aligned(4))) _FlashBackup{
	uint32_t 	head;	
	uint8_t 	macAddr_L[6];
	uint8_t 	macAddr_R[6];
	uint32_t 	hardVersion;
	uint8_t 	sotfVersion;
	uint8_t 	isConfig;
	uint8_t   ErrorStartFlag;
}FlashBackup_t;
//size:36
typedef struct __attribute__((packed,aligned(4))) _FlashStep{
	uint8_t 	startTime[8];				//记录时间
	uint8_t 	newStartTime[8];		//当前时间
	uint32_t 	stepCur[2];					//当前永久步数
	uint32_t 	step[2];						//每小时记录的左右鞋永久步数0左1右
	uint32_t 	num;								//已经记录的每小时步数数量
}FlashStep_t;
//size:12
typedef struct __attribute__((packed,aligned(4))) _FlashClient{
	uint8_t 	isConfig;
	uint32_t 	hardVersion;
	uint8_t 	sotfVersion;
	uint8_t	 	macAddr[6];
}FlashClient_t;
//size:
typedef struct __attribute__((packed,aligned(4))) _FlashLog{
	uint8_t Errorflag;
	uint8_t logData[50];
}FlashLog;
//size:64
typedef struct __attribute__((packed,aligned(4))) _Flash_Param{					//后期版本修改结构体，不能删除或修改现有成员，只能追加新的成员。																	
	uint32_t 			head;
	uint8_t  			isHost;
	uint8_t 			macHost[6];
	FlashStep_t 	mStep;
	FlashClient_t mClient;
	FlashLog 			mFlashLog;
	uint8_t       Safe_cnt;
	
	uint32_t			m_struct_size;			//结构体自身大小	
	uint32_t			tail_crc16;					//crc16校准只能做成员 head ~ m_struct_size，因为未知的填充字节原因，tail_crc16和未知填充字节（默认为0）都为0好计算。
}Flash_t;


extern Flash_t mFlash;
extern FlashBackup_t mBackup;

/*1.当新API读到旧的数据的时候，新API多的参数用默认值填充，写回的时候按照新API的格式写回。（向后兼容）
  2.当旧API读到新数据，自己不认识的那段buff，要保存起来，写回的时候，将这段buff原样memcpy。（向前兼容，没实现）
*/
 
/********************************************
 *API FUCTIONS
 */
void Flash_Initialize(void);
//存储步数
uint32_t Flash_SaveStep(void);
//获取步数区域首地址
uint32_t Flash_GetStepZoneStartAddr(void);
//获取步数区域数据
uint32_t Flash_GetStep(uint32_t destination_addr, uint32_t *pData, uint32_t dataLen);
//删除所有步数
uint32_t Flash_DeleteAllStep(void);
//删除所有的基本信息
uint32_t Flash_DeleteAllInformation(void);
//存储基本信息
uint32_t Flash_SaveInfomation(void);
//获取基本信息
uint32_t Flash_GetInfomation(Flash_t *pflash);
//存储备份信息
uint32_t Flash_SaveBackup(void);
//获取备份信息
uint32_t Flash_GetBackup(FlashBackup_t *pbackup);
//保存日志信息
uint32_t Flash_SaveLog(uint32_t id, uint32_t pc, uint32_t info);
//返回主机标志位
uint8_t Get_isHost(void);
//测试接口
void TestHalFlashInterface(void);



#endif





























