/*
 * @Description: 存储模块-svc层
 * @Author: yangsw
 * @Date: 2021-05-20 18:35:04
 * @LastEditTime: 2023-11-14 14:02:57
 * @LastEditors: LiDa
 * @Reference: 
 */
#ifndef H_SVC_FLASH_H
#define H_SVC_FLASH_H

#include "sr_stddef.h"

#include "pulse/svc/svc_pulse.h"


/*flash数据备份使能*/
#define FLASH_BAK_ENABLE      1

#define FLASH_W25X_ENABLE     1   //使用外部w25x spi flash
#define EEPROM_P24C_ENABLE    0

#define Size_Day_Usage        sizeof(S_Flash_Day_Usage)

#define FLASH_PARAM_PART_NAME "spiFlh"   //参数分区名称
   

/*==================== FAL partition table ====================
| name     | flash_dev |   offset   |    length  |
-------------------------------------------------------------
| spiFlh    | w25x      | 0x00000000 |   512*1024 |
=============================================================*/
/*说明：将整个w25 spi flash存储（512K）设置为一个分区,名称为param，
由于w25的实际物理起始地址为0，所以param分区内的偏移地址与实际物理地址一一对应*/


/*参数分区内，各部分的偏移地址，单位为字节*/
#if FLASH_W25X_ENABLE
    #include "sr_bsp_w25x.h"

    #define FLASH_REPEAT_READ_NUM       2
    #define FLASH_REPEAT_WRITE_NUM      2

    #define FLASH_DEVICE_PARA_ADDR              (gw_u32)0x00000000 
    #define FLASH_DEVICE_SECURITY_ADDR          (gw_u32)0x00001000 
    #define FLASH_USAGE_ADDR                    (gw_u32)0x00002000    
    #if FLASH_BAK_ENABLE
        #define FLASH_DEVICE_SECURITY_BAK_ADDR  (gw_u32)0x00003000
        #define FLASH_DEVICE_PARA_BAK_ADDR      (gw_u32)0x00004000
        #define FLASH_USAGE_BAK_ADDR            (gw_u32)0x00005000
    #endif

    #define FLASH_USAGE_DAY_START_ADDR          (gw_u32)0x00006000  


#elif EEPROM_P24C_ENABLE
    #include "bsp_eeprom_p24c.h"

    #define FLASH_DAY_USAGE_SIZE            sizeof(Flash_Day_Usage_Struct)                                      //一天的日用量占用空间大小
    #define FLASH_DAY_USAGE_ADDR            0x00000000                                                          //存储日用量的起始地址
    #define FLASH_DAY_USAGE_TOTAL_SIZE      DAY_USAGE_MAX_NUM*FLASH_DAY_USAGE_SIZE                               //存储日用量的总占用空间大小 
    #define FLASH_DAY_USAGE_END_ADDR        FLASH_DAY_USAGE_ADDR+FLASH_DAY_USAGE_TOTAL_SIZE                     //存储日用量的结束地址
    #define FLASH_MONTH_USAGE_SIZE          sizeof(Flash_Month_Usage_Struct)                                    //每月的月用量占用空间大小
    #define FLASH_MONTH_USAGE_ADDR          FLASH_DAY_USAGE_END_ADDR+1                                           //存储月用量的起始地址
    #define FLASH_MONTH_USAGE_TOTAL_SIZE    MONTH_USAGE_MAX_NUM*FLASH_MONTH_USAGE_SIZE                           //存储月用量的总占用空间大小
    #define FLASH_MONTH_USAGE_END_ADDR      FLASH_MONTH_USAGE_ADDR+FLASH_MONTH_USAGE_TOTAL_SIZE                  //存储月用量的结束地址
    #define FLASH_HISTORY_USAGE_INDEX_ADDR  FLASH_MONTH_USAGE_END_ADDR+1                                         //存储历史日用量和月用量的索引地址
    #define FLASH_DESEN_FLOW_ADDR           FLASH_HISTORY_USAGE_INDEX_ADDR+sizeof(Flash_Usage_Index_Struct)+1    //存储密集流量的起始地址
    #define FLASH_DEVICE_SECURITY_ADDR      FLASH_DESEN_FLOW_ADDR+sizeof(Flash_Dense_Flow_Struct)+1              //设备安全相关参数的存储地址
    #define FLASH_DEVICE_PARA_ADDR          FLASH_DEVICE_SECURITY_ADDR+sizeof(Flash_Device_Security_Struct)+1    //设备其他参数的存储地址
    #define FLASH_DEVICE_USAGE_ADDR         FLASH_DEVICE_PARA_ADDR+sizeof(Flash_Device_Para_Struct)+1            //设备总用量信息的存储地址

#if FLASH_BAK_ENABLE
    #define FLASH_DEVICE_SECURITY_BAK_ADDR  FLASH_DEVICE_USAGE_ADDR+sizeof(Flash_Usage_Info_Struct)+10
    #define FLASH_DEVICE_PARA_BAK_ADDR      FLASH_DEVICE_SECURITY_BAK_ADDR+sizeof(Flash_Device_Security_Struct)+1
    #define FLASH_DEVICE_USAGE_BAK_ADDR     FLASH_DEVICE_PARA_BAK_ADDR+sizeof(Flash_Device_Para_Struct)+1
#endif
#endif 


//#define MaxTotalUsage  99999999     //单位L

//flash已被使用标志
#define FLASH_SIG_USED         0x5C     

typedef struct{
//    gw_u8   pu8ServerIp[4];
//    gw_u8   pu8ServerIpSpare[4];
//    gw_u16  pu16ServerPort;
//    gw_u8   pu8Apn[20];
	 /* ASCII 码 xxx.xxx.xxx.xxx,xxxx IP 和端口 用,分开*/
    gw_s8 	IpInfo[32];
    /* APN信息*/
    gw_u8   u8Apn[32];
    /* PLMN*/
    gw_u8   u8Plmn[10];  
    /* Band*/
    gw_u8  	u8Band;	
		/*通讯模组IMEI*/
    gw_u8 	pu8Imei[15];
    /*通讯模组IMSI*/
    gw_u8 	pu8Imsi[15];       
    /*通讯模组iccid*/
    gw_u8 	pu8Iccid[20];
		/*NB 模组版本*/
    gw_u8 	pu8NbVer[32];  
}S_Flash_Nb_Info;

//#pragma(1)

typedef struct{
    gw_u8   u8Sig;
		/*时间校准标志*/
    gw_u8   time_calibrate_flag; 	
    /*设备类型 1：水表， 2：气表， 3：热量表， 4：... */
    gw_u8   pu8MeterType;  
		/*设备子类型 2 无磁远传小表*/
    gw_u8   pu8MeterChildType;
    /*设备计量模式*/
    gw_u8   pu8MeterDetectModel;     
     /*厂家编号*/
    gw_u8   pu8FactoryNum; 
    /*协议版本*/
    gw_u8 	u8ProtocolVer;
    /*表号*/
    gw_u8   pu8MeterNum[7];
    /*产品id*/    
    gw_u8   product_id[16];
    /*运行密钥*/
    gw_u8   pu8RunKey[16];  
    /*软件版本*/
    gw_u8   pu8SoftVer;         
    /*校验和*/     
    gw_u8   u8CheckSum;
}S_Flash_Device_Security;

typedef struct{
    gw_u8   u8Sig;   
    /*超大切断流量，（参数可由后台设置）*/   
    gw_u32  u32LargeFlowCutPoint;   
    /*反流切断流量，（参数可由后台设置）*/
    gw_u32  u32NegFlowCutPoint;   
   /*超大流量持续时间,单位：分，*/
    gw_u8  u8LargeFlowDuration;    
    /*反流持续时间,单位：分，断*/
    gw_u8  u8NegFlowDuration; 
    /*电压报警阀值,单位：0.01V*/    
    gw_u16 u16BatAlarmVolt;
    /* 上报重连次数*/
    gw_u8   u8ResendTimes;		
		/*上报周期，单位：秒，*/
    gw_u32   	u32ReportCycle;  	
    /*通讯间隔，单位：小时，*/
		/*上报区间*/
		gw_u16 		u16ReportInterval;		  		
    gw_u8   u8CommCycle;  
    /*周期上报离散起始 时间*/
    gw_u8   u8DiscreteStartTime[6];
    /*周期上报离散结束 时间*/
    gw_u8   u8DiscreteStopTime[6];
    /*周期上报离散估长时间*/
    gw_u8   u8DiscreteStepTime;  
    /*终端启停设置*/
    gw_u8   u8StartStopEnable; 
    /*密集流量开始时间，默认值0,即0点开始*/
    gw_u8   u8DenseStartTime; 
    /*周期采样间隔*/
    gw_u8   u8HourPeriodTime;  
    /*密集采样间隔*/
    gw_u16   u16DensePeriodTime;    
    /*上报重连等待时间 */  
    gw_u8   u8ResendWaiteTime; 
    /*密集流量使能*/
    gw_u8   u8DenseEnable;
    /*PN 脉冲常数 1-1L/P； 2-10L/P； 3-100L/P； 4-1000L/P；*/
    gw_u16  u16PluseEqu; 
    /*设置最大计量数 最大为 8 位*/
    gw_u32  u32MaxTotalUsage; 
    /*设置表底数*/
    gw_u32  u32BaseUsage;    
    /*nb信息*/
    S_Flash_Nb_Info s_nb_info; 
    gw_u8 u8Enable_StaDaySaveTime;
    gw_u8 u8StaDaySaveTime[3];
    gw_u8 u8RstPowerCnt;
    gw_u8 u8NRstCnt; 
    gw_u8 u8LPowerCnt;  
    gw_u16 u16Netcnt;
    gw_u8 u8CheckSum;
}S_Flash_Device_Para;
//24字节
typedef struct{    
	
    gw_u8 u8BatAlarm;         			//电池告警 

    gw_u8 u8MagneticAlarm;    			//磁告警

    gw_u8 u8LargeFlowAlarm;   			//过流告警  

    gw_u8 u8LargeFlowStartTime[6]; 	//过流告警开始时间

    gw_u16 u16LargeFlowUsage;      	//最大流量

    gw_u8 u8NegFlowAlarm;          	//反流告警 

    gw_u8 u8NegFlowStartTime[6];   	//反流选区开始时间

    gw_u16 u16NegFlowUsage;        	//反流最大流量
    
    gw_u8  u8LightAlarm;           	//光报警
    
    gw_u8  u8PulseAlarm;           	//脉冲报警

    gw_u8  u8MechSepar;            	//机电分离报警

    gw_u8  u8Measurement;           //计量报警 lida add code

}S_Flash_Usage_Alarm;
//28
typedef struct{      
    gw_u32       u32TotalUsage;
    gw_u32       u32TotalUsagePosMidnight;
    gw_u32       u32TotalUsageNegMidnight;
    gw_u16       u16MaxUsage;
    gw_u8        u8MaxUseTime[6];   
    gw_u8        u8InfoTime[6];  
    gw_u16       u16BatVol;
}S_Flash_Real_Usage;
//107+96=203
typedef struct{      
		/*密集流量采集开始标志*/
    gw_u8        u8StartFlag;
    /*密集流量采集存储指针*/
    gw_u8        u8Index;
    /*密集流量下个到点时间*/
    gw_u16       u16NextTime;    
    gw_u8        u8StartTime[6];         
    gw_u8        u8RecordNumb;       
    gw_u16       u16RecordUsage[48][2];  
}S_Flash_Dense_Usage;
//98
typedef struct{
		/*小时存储标志*/
    gw_u8         u8HourSaveFlag;     
    gw_u8         u8RecordNumb;       
    gw_u16        u16RecordUse[48];
}S_Flash_Hour_Usage;
//10+98+205+28+24
typedef struct{
    gw_u8   u8Sig;   
    gw_u8   u8SigReport;   			/*天存储标志*/
    gw_u8               				u8DaySaveFlag;   
    gw_u8   										u8StartTime[6];  
    S_Flash_Real_Usage          s_real_usage;
    S_Flash_Hour_Usage          s_hour_usage;
    S_Flash_Dense_Usage         s_Dense_usage;   
    S_Flash_Usage_Alarm         s_usage_alarm;  
    gw_u8   u8CheckSum;  
}S_Flash_Day_Usage;
//48+10+98+205+28+24+24
typedef struct{
    gw_u8               				u8Sig;   
		 /*用量储标志*/
    gw_u8               				u8Usage_Info_SaveFlag;    
    /*当前时间时间戳*/  
    gw_u32              				pu32SystemTime;
    /*上一次系统时间戳 防止时间倒走时数据重复存储*/  
    gw_u32              				u32LastSystemTime;
		/*总使用量*/
    gw_u32              				u32TotalUsage; 
    /*正流总使用量*/
    gw_u32              				u32TotalUsagePos;  
    /*返流总使用量*/
    gw_u32              				u32TotalUsageNeg;  		
		/*上一次记录时总使用量*/
    gw_u32       							 	u32LastHourUsage;	
		/*上一次记录时密集流量总使用量*/
    gw_u32       								u32LastDenseUsagePos;
    /*上一次记录时密集流量返流总使用量*/
    gw_u32       								u32LastDenseUsageNeg;		
    /*NB上报标志*/
    gw_u8               				u8NbReportFlag;       
    /*上一次通讯成功的时间戳*/  
    gw_u8  											u8LastUpdataTime[6];
    /*上一次上报历史通讯成功的时间戳*/
    gw_u8  											u8LastHistoryUpdataTime[6];
    S_Flash_Usage_Alarm         s_usage_alarm;     
    S_Flash_Day_Usage   				s_day_usage;   
    gw_u8               				u8CheckSum;
}S_Flash_Usage_Info;

typedef struct{   
    /*电压低导致的flash无法操作，1：读写失败，0：正常*/
    gw_u8   u8flashCheckFail;
    S_Flash_Device_Security         s_security;
    S_Flash_Device_Para             s_para; 
    S_Flash_Usage_Info              s_usage_info;    
}S_Flash_Data;

// void Svc_Flash_Lp(void);
void Svc_Flash_Init(void);
void Svc_Flash_Read_User_Data(void);
void Svc_Flash_User_Data_Reload(void);

void Svc_Flash_Power_On(void);
void Svc_Flash_Power_Off(void);

S_Flash_Data* Svc_Flash_Get_Data(void);
S_Flash_Day_Usage* Svc_Flash_Get_Updata_Day_Usage(void);
E_Result_State Read_Day_Usage(S_Flash_Day_Usage *day_usage,gw_u8 *ReadTime);
void Svc_Flash_Read(gw_u8 *out_buff,gw_u32 read_addr,gw_u16 read_num);
E_Result_State Svc_Flash_Write(gw_u8* data,gw_u32 write_addr,gw_u16 write_num);
E_Result_State Svc_Flash_Write_Ota(gw_u8* data,gw_u32 write_addr,gw_u16 write_num);
E_Result_State Svc_Flash_Write_Device_Security(S_Flash_Device_Security *security);
E_Result_State Svc_Flash_Write_Device_Para(S_Flash_Device_Para *para);
E_Result_State Svc_Flash_Write_Usage(S_Flash_Usage_Info *usage_info);
E_Result_State Svc_Flash_Write_Day_Usage(S_Flash_Day_Usage *day_usage);
E_Result_State Write_Day_Usage(S_Flash_Day_Usage *day_usage);
void Svc_Flash_Update_Usage(SR_PULSE_FLOW_T *FlowData);
void Svc_Flash_Check_Save_Dense_Usage(void);
void Svc_Flash_Check_Save_30Min_Usage(void);
void Svc_Flash_Check_Save_Day_Usage(void);
void Svc_Flash_Check_Save_Usage(void);
void Svc_Flash_Dense_Timer_Callback(void);
void Svc_Flash_Base_Usage_Calibrate(gw_u32 BaseUsage);
void Svc_Flash_Check_Save_30Min_Usage_Time_Calibrate(gw_u32 u32CurTime,gw_u32 CaliTime);
void Save_Hour_Usage(gw_s16 s16Usage,gw_u32 u32StartTime,gw_u32 u32StopTime);
void Svc_Flash_Upload_Para_Printf(void);
#endif
