#ifndef RW_LOGGING_H_
#define RW_LOGGING_H_

#include "stdint.h"

/*OLD*/
#define	Log_Type_Device_Change			0x04		//设备动作
#define Log_Type_Global_Parameters		0x05		//全局参数变化


//SRAM中日志相关地址
/*
2022-05-09 将SRAM日志数据地址 SRAM_LOG_DATA_Address 将0x090020改为0x090100
	原因：增加Launcher启动输出调试信息 - 给APP使用，如果需要设置是通过PC下发命令设置，本次启动APP有效
*/
#define SRAM_LOG_Start_Address			0x090000		//日志空间起始地址 - 当前SRAM中日志数据的写入地址 - 4Byte
#define SRAM_TFTP_LOG_READ_Address		0x090004		//TFTP日志上报读取地址	- 4Byte
#define SRAM_FLASH_LOG_READ_Address		0x090008		//Flash日志写入读取地址	- 4Byte
#define SRAM_SD_LOG_READ_Start_Address	0x09000C		//SD读取起始地址 - 当TFTP开始传输文件时，同时将当前的起始地址与结束地址赋值该变量，用于向SD写入LOG使用 - 4Byte 
#define SRAM_SD_LOG_READ_End_Address	0x090010		//SD读取结束地址 - 4Byte
#define SRAM_Flash_Serial_Number		0x090014		//日志序号保存地址 - 1Byte
#define SRAM_LOGFlag_Reset_Source		0x090018		//Launcher启动源标记 - 给APP使用
#define SRAM_LOGFlag_Addr_INIT			0x090019		//Launcher记录地址SRAM初始化状态标志位 - 给APP使用
#define SRAM_LOGFlag_Debug_Switch		0x09001A		//Launcher启动输出调试信息 4Byte - 给APP使用
#define SRAM_APPFlag_Reset_Source		0x09001E		//App串口升级标志位 2Byte - 给Launcher调试输出信息使用 0xBBC1
#define SRAM_LOG_DATA_Address			0x090100		//日志数据地址	
#define SRAM_LOG_End_Address			0x2FFFFF		//日志空间结束地址 - 0x0AFFFF

#define APPFlag_UartUpgrade_Reset		0xBBC1			//APP串口升级标志位
//Flash中日志相关地址
/*
2022-04-17 将Flash日志地址从0x090000改为0x100000 ~ 0x1FFFFF
*/
#define LOG_Flash_Start_Address		0x100000		//Flash日志空间写入地址
#define LOG_Flash_Overflow_Address	0x100004		//Flash日志空间是否已存满标志位
//#define LOG_Flash_Serial_Number		0x090005		//日志序号保存地址
#define LOG_Flash_DATA_Address		0x100020		//Flash日志数据地址
#define LOG_Flash_End_Address		0x1FFFFF		//Flash日志空间结束地址
//日志数据相关定义
#define LOG_Data_Hand				0xA5			//LOG数据头
#define Log_Data_End				0x5A			//LOG数据尾
#define Log_Data_Len_MAX			512				//日志数据最长512Byte

/*日志保存的数据格式
2021-04-02 ；加个校验位
2021_11_29：将数据长度改为2Byte
*/
typedef enum{
	S_Log_Hand,
	S_Log_SN,			//日志每条数据增加序列号
	S_Log_Len,
	S_Log_Len_8,
	S_Log_Check,
	S_Log_Date_H,		//年：5bit 月：5bit 日：5bit
	S_Log_Date_L,		
	S_Log_Type,
	S_Log_Time8B,		//小时时间戳
	S_Log_Time16B,
	S_Log_Time24B,
	S_Log_Time32B,
	S_Log_Data,
}Sram_Log_Data_Format;

/************************************************************/

uint8_t Log_write_sram(uint8_t data_type,uint8_t *buff,uint16_t len);
uint8_t Log_read_sram(void);
uint32_t Get_Log_Current_Address(void);
void Set_Log_Current_Address(uint32_t W_addr);
void SRAM_Set_TFTP_READ_LOG_Address(uint32_t r_addr);
uint32_t SRAM_Get_TFTP_READ_Log_Address(void);
void SRAM_Set_FLASH_READ_LOG_Address(uint32_t r_addr);
uint32_t SRAM_Get_FLASH_READ_LOG_Address(void);
void SRAM_Set_SD_LOG_READ_Start_Address(uint32_t r_addr);
uint32_t SRAM_Get_SD_LOG_READ_Start_Address(void);
void SRAM_Set_SD_LOG_READ_End_Address(uint32_t r_addr);
uint32_t SRAM_Get_SD_LOG_READ_End_Address(void);

uint32_t Log_Get_Flash_Current_Address(void);
void Log_Set_Flash_Current_Address(uint32_t w_addr);
void Log_set_Flash_overflow_flag(uint8_t overflow_state);
void Log_Write_Flash(void);
void Log_Read_Flash(void);
void LOG_Preserve_Flash_Task(void);
void LOG_Save_Device_Action(uint8_t type,uint8_t addr,uint16_t loop,uint16_t state);
void LOG_Save_Device_Change(uint32_t data_addr, uint16_t data_len);
void LOG_Save_Global_Parameters(void);
uint8_t SRAM_PowerOn_Restore_ParaInfo(void);

void Retain_Flash_Register_Data(void);
void Read_Flash_Register_Data(void);

#endif
