/*
 * @Description: 存储模块-svc层
 * @Author: yangsw
 * @Date: 2021-05-20 18:35:04
 * @LastEditTime: 2022-06-11 10:50:28
 * @LastEditors: yangsw
 * @Reference:
 */

#ifndef H_SVC_FLASH_H
#define H_SVC_FLASH_H

#define FLASH_SAVE_USAGE_METHOD_CALENDAR // 此定义生效时，采用日历比较方式触发存储日用量事件，否则采用时间差方式触发存储日用量事件
/*flash数据备份使能*/
#define FLASH_BAK_ENABLE 1

#define FLASH_W25X_ENABLE 1
#define EEPROM_P24C_ENABLE 0

#define POWERDOWN_EN 0

#if FLASH_W25X_ENABLE
#include "../bsp/bsp_flash_w25x.h"

#define FLASH_USAGE_SECTOR_NUM 10 // 每个扇区存储的天数

#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

#if FLASH_BAK_ENABLE
#define FLASH_DEVICE_PARA_BAK_ADDR (gw_u32)0x00002000
#define FLASH_DEVICE_SECURITY_BAK_ADDR (gw_u32)0x00003000
#endif

#define FLASH_MONTH_USAGE_ADDR (gw_u32)0x00004000
#define Size_Month_Usage sizeof(S_Flash_Month_Usage)

#define FLASH_USAGE_START_ADDR (gw_u32)0x00006000
#define FLASH_DAY_USAGE_SIZE sizeof(S_Flash_Day_Usage) // 一天的日用量占用空间大小

#define FLASH_DAY_USAGE_SECTOR_NUM 10 // 每个扇区存10天
#define FLASH_DAY_USAGE_SECTOR_SUM 19 // 19个扇区存储

#define FLASH_POWERDOWN_SAVE_ADDR (gw_u32)0x0001F000 // 掉电时，将数据存储到此扇区

#define FLASH_Meter_Event_ADDR (gw_u32)0x00020000    // 事件存储地址，两个扇区，因为256条数据存满后，存新数据需擦除扇区，
#define Size_Meter_Event sizeof(S_Flash_Meter_Event) // 所以新数据从第二个开始存储，直至存满，然后新数据在第一个扇区存储

#define Meter_Event_Entry_Len_Max 20 // 表端事件的上报最大条目数（单次）

#define FLASH_No_Data_ADDR (gw_u32)0x00020000

#define FLASH_SIG_USED 0x5C

#elif EEPROM_P24C_ENABLE
#include "../bsp/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

/* 附录A 设备运行开关定义*/

#define SWITCH_INFRARED_COM ((gw_u16)1 << 0)          // 红外通讯开关
#define SWITCH_WIRELESS_COM ((gw_u16)1 << 1)          // 无线通讯开关
#define SWITCH_MOMENT_OVERSIZED_FLOW ((gw_u16)1 << 2) // 过流检测
#define SWITCH_MOMENT_TINY_FLOW ((gw_u16)1 << 3)      // 小流检测开关
#define SWITCH_ONE_SIDED_CALCULAT ((gw_u16)1 << 4)    // 单边计算
#define SWITCH_MAGNET_ATTACK ((gw_u16)1 << 5)         // 强磁检测
#define SWITCH_MOMENT_REVERSE_FLOW ((gw_u16)1 << 6)   // 反流检测-新添加
#define SWITCH_PULSE_USM ((gw_u16)1 << 7)             // 计量开关-新添加
#define SWITCH_DEBUG_LOG ((gw_u16)1 << 15)            // 调试日志

/* 附录B 设备运行开关定义*/

#define b0Pwoer1 ((gw_u32)1 << 0)         // 主电一级低压
#define b1Power2 ((gw_u32)1 << 1)         // 主电二级低压
#define b2Res ((gw_u32)1 << 2)            // 保留
#define b3Power1Back ((gw_u32)1 << 3)     // 备电一级低压
#define b4Power2Back ((gw_u32)1 << 4)     // 备电二级低压
#define b5Res ((gw_u32)1 << 5)            // 保留
#define b6Dismantle ((gw_u32)1 << 6)      // 拆表/安装异常
#define b7Mag_Interf ((gw_u32)1 << 7)     // 强磁干扰
#define b8Res ((gw_u32)1 << 8)            // 保留
#define b9Leakage ((gw_u32)1 << 9)        // 阀门泄露
#define b10Valve ((gw_u32)1 << 10)        // 阀门开关异常
#define b11Unilateral ((gw_u32)1 << 11)   // 单边传感器异常
#define b12Res ((gw_u32)1 << 12)          // 保留
#define b13Reverse_Flow ((gw_u32)1 << 13) // 反流
#define b14Res ((gw_u32)1 << 14)          // 保留
#define b15Save_Abn ((gw_u32)1 << 15)     // 外部存储
#define b16Key_Abn ((gw_u32)1 << 16)      // 按键异常
#define b17Large_Flow ((gw_u32)1 << 17)   // 过流
#define b18Small_Flow ((gw_u32)1 << 18)   // 小流
#define b19NbPsm ((gw_u32)1 << 19)        // nbPSM异常
#define b20Temp_Hig ((gw_u32)1 << 20)     // 高温
#define b21Temp_Low ((gw_u32)1 << 21)     // 低温
#define b22Press_Hig ((gw_u32)1 << 22)    // 高压
#define b23Press_Low ((gw_u32)1 << 23)    // 低压
#define b24Angle ((gw_u32)1 << 24)        // 角度异常
#define b25Power_Down ((gw_u32)1 << 25)   // 掉电
#define b26Blank_Pipe ((gw_u32)1 << 26)   // 空管、换能器异常
#define b27Weak_Signal ((gw_u32)1 << 27)  // 换能器信号弱
#define b28Crystal ((gw_u32)1 << 28)      // 晶振异常
#define b29Time_Chip ((gw_u32)1 << 29)    // 时间芯片通讯异常
#define b30Temp_Sensor ((gw_u32)1 << 30)  // 温度传感器异常

typedef enum
{
    E_Event_Power_Alarm_1 = 0x0001, // 电量低
    E_Event_Power_Alarm_2 = 0x0002, // 电量不足
    E_Event_Reverse_Flow = 0x0003,  // 反向流量
    E_Event_Save_Abn = 0x0004,      // 存储异常
    E_Event_Super_Flow = 0x0005,    // 超流异常
    E_Event_Small_Flow = 0x0006,    // 微小流量
//    E_Event_Net_Work = 0x0007,      // 联网
    E_Event_Temp_Hight = 0x0008,    // 高温
    E_Event_Temp_Low = 0x0009,      // 低温
    E_Event_Power_Down = 0x000A,    // 掉电
    E_Event_Reset = 0x000B,         // 重新启动
    E_Event_Blank_Pipe = 0x000C,    // 空管
    E_Event_Time_Chip = 0x000D,     // 时间芯片异常
    E_Event_Temp_Sensor = 0x000E,   // 温度传感器异常
//    E_Event_Mod_Save = 0x000F,      // 模组存储异常
    E_Event_Key_Abn = 0x0010,       // 按键异常
    E_Event_All = 0xFFFF,           // 所有类型
} E_Flash_Meter_Event;              // 表端事件

typedef enum
{
    E_UR_Cycle = 0,       // 周期上报
    E_UR_Key = 1,         // 按键上报
    E_UR_Lowpower = 2,    // 电压低
    E_UR_PowerUp = 3,     // 上电上报
    E_UR_LargeFlow = 4,   // 大流
    E_UR_SmallFlow = 5,   // 小流
    E_Lcd_ReveFlow = 6,   // 反流
    E_UR_Blank_Pipe = 7,  // 空管
    E_UR_Time_Chip = 8,   // 时间芯片异常
    E_UR_Temp_Sensor = 9, // 温度传感器异常
    E_UR_Save_Abn = 10,   // 外部存储异常
//    E_UR_Mod_Save = 11,   // 模组存储异常
    E_UR_Key_Abn = 12,    // 按键异常
    E_UR_HIGHT_TEMP = 13, // 高温
    E_UR_LOW_TEMP = 14,   // 低温
    E_UR_Null             = 0xff, //未上报
} E_Upload_Reason;

typedef struct
{
    gw_u8 u8Sig;
    gw_u16 e_event;     // 事件类型
    gw_u8 u8BCDTime[6]; // 时间BCD码
    gw_u8 u8Retain;     // 保留
    gw_u8 u8CheckSum;   // 校验
} S_Flash_Meter_Event;

typedef enum
{
    COMM_CLOUD_00_NORMAL = 0x00,
    COMM_CLOUD_01_ERROR_AUTH_EXPIRE = 0x01,
    COMM_CLOUD_02_ERROR_PARA = 0x02,
    COMM_CLOUD_03_ERROR_PARA_FORMAT = 0x03,
    COMM_CLOUD_04_ERROR_CMD_NO_SUPPORT = 0x04,
    COMM_CLOUD_FF_ERROR_SYS = 0xFF
} E_Cloud_Comm_Result;

typedef struct
{
    gw_u8 send_times;
    gw_u8 has_more;
    gw_u8 has_more_cnt;
    gw_u8 dir;
    E_Cloud_Comm_Result result;
} Comm_Info;

typedef struct
{
    /*Rsrp*/
    gw_u8 Rsrp;
    /*通讯模组版本号长度*/
    gw_u8 Comm_Model_Ver_len;
    /*通讯模组版本号*/
    gw_u8 Comm_Model_Ver[20];
    /*通讯模组IMEI长度*/
    gw_u8 Comm_Model_Imei_len;
    /*通讯模组IMEI*/
    gw_u8 Comm_Model_Imei[15];
    /*通讯模组IMSI长度*/
    gw_u8 Comm_Model_Imsi_len;
    /*通讯模组IMSI*/
    gw_u8 Comm_Model_Imsi[15];
    /*通讯模组ICCID长度*/
    gw_u8 Comm_Model_Iccid_len;
    /*通讯模组ICCID*/
    gw_u8 Comm_Model_Iccid[20];
    /*服务器地址,ASCII码,xxx.xxx.xxx.xxx,xxxx?IP和端口用,分开 */
    gw_u8 pu8ServerIp[32];
    /*APN信息,运营商APN ASCII*/
    gw_u8 pu8Apn[32];
    gw_u8 apn_len;
    /*云平台服务器数据*/
    Comm_Info comm_info;
} S_Flash_Nb_Info;

/*所有报警项都是随周期上报数据一起上报(本周期内产生的所有告警数据，在本周期时间结束后，均自动清除)。*/
// #pragma(1)
typedef struct
{
    /*过流开始时间,时间格式为YYMMDDHHMMSS,不报警时，过流开始时间填0*/
    gw_u8 pu8LargeFlowStartTime[6];
    /*日最高流量*/
    gw_u16 u16MaxLargeFlow;
    /*反流开始时间,时间格式为YYMMDDHHMMSS,不报警时，反流开始时间填0*/
    gw_u8 pu8ReverseFlowStartTime[6];
    /*反流最大流量,单位L/H*/
    gw_u16 u16MaxReverseFlow;
    /*小流开始时间,时间格式为YYMMDDHHMMSS,不报警时，开始时间填0*/
    gw_u8 pu8SmallFlowStartTime[6];
    /*小流最小流量,单位L/H,不报警时，填0*/
    gw_u16 u16MinSmallFlow;
    /*设备运行开关*/
    gw_u16 u16device_switch;
    /*设备运行状态*/
    gw_u32 u32device_alarm;
} S_Flash_Device_State;

typedef struct
{
    /*第一天数据日期，YYMMDD*/
    gw_u8 pu8StartDate[3];
    /*最新数据日期，YYMMDD*/
    gw_u8 pu8CurDate[3];
    /*月存储开始时间*/
    gw_u8 u8StartMonth[2];
    /*月存储时间*/
    gw_u8 pu8MonthSaveTime[2];
} S_Flash_Usage_Index;

typedef enum
{
    /*正常模式*/
    E_Mode_Normal = 0x00,
    /*交付模式*/
    E_Mode_Delivery = 0x01,
    /*检定模式*/
    E_Mode_Calibration = 0x02,
} E_MASTER_WORK_Mode;

// #pragma(1)
typedef struct
{
    gw_u8 u8Sig;
    /*表号，BCD*/
    gw_u8 pu8MeterNum[16];
    /*产品ID*/
    gw_u8 product_id[16];
    /*运行密钥*/
    gw_u8 pu8Key[16];
    /*厂家批号*/
    gw_u16 u16FactoryBatchNum;
    /*首次上电标志*/
    gw_u8 first_poweron; 
    /*软件主版本号*/
    gw_u8 main_version;
    /*软件子版本号*/  
    gw_u8 sub_version;   
    /*模组波特率*/
    gw_u16 u16PulseBaud;
    /*事件存储位置记录，用于事件存储*/
    gw_u16 u16EventCount;
    /*EventCount使能位：1-使能*/
    gw_u8 u8Enable_EventCount;
    /*存储事件的数量是否超过256条：0-未超过*/ 
    gw_u8 u8Exceed256;   
    /*设备状态*/
    S_Flash_Device_State s_state;      
    /*校验和*/
    gw_u8 u8CheckSum;
} S_Flash_Device_Security;

// #pragma(1)
typedef struct
{
    gw_u8 u8Sig;
    /*人为设置上报时间标志位 0：默认上报时间 1：*/
    gw_u8 upload_timeflag;
    /*脉冲当量*/
    gw_u16 pulse_equivalent;
    /*过流告警阀值，单位L/h，默认为水表口径对应Q4值，可设置。*/
    gw_u16 u16LargeFlowThreshold;
    /*持续过流告警持续流量，单位L，可设置。*/
    gw_u16 u16LargeFlowContinue;
    /*反流告警阀值,单位L/h，默认DN15mm：40L/h、DN20mm：64 L/h、DN25mm：126L/h，可设置。*/
    gw_u16 u16ReverseFlowThreshold;
    /*持续反流告警持续流量，单位L，可设置。*/
    gw_u16 u16ReverseFlowDuration;
    /*小流告警阀值,单位L/h，可设置。*/
    gw_u16 u16SmallFlowThreshold;
    /*持续小流告警持续流量，单位L，可设置。*/
    gw_u16 u16SmallFlowContinue;
    /*一级电压告警阀值,0.01V*/
    gw_u16 battery1_first_low_voltage_threshold;
    /*二级电压告警阀值,0.01V*/
    gw_u16 battery1_second_low_voltage_threshold;
    /*上报重连次数,默认2次，可设置0-4次。*/
    gw_u8 u8ReSendCnt;
    /*周期上报离散起始时间,时间格式为YYMMDDHHMMSS*/
    gw_u16 u16ReportStart;
    /*周期上报离散结束时间,时间格式为YYMMDDHHMMSS*/
    gw_u16 u16ReportInterval;
    /*周期上报估长,估长默认10秒，可设置T（1-6）×10秒*/
    gw_u8 u8UploadDuration;
    /*日上报时间*/
    gw_u8 pu8DayUploadTime[3];
    /*日上报启用，0：不启用，1：启用，2：不上报*/
    gw_u8 u8DayUptimeEnable;
    /*周期上报频率,可设置为24的约数。例：1、2、3、4、6、8、12、24；当小于24时，周期上报离散起始时间、结束时间无意义*/
    gw_u32 u32CommCycle;
    /*密集上报采样起始时间,设置起始整点，当天有效*/
    gw_u8 u8DenseDataUploadStartTime;
    /*周期采样间隔,30分钟（固化，不可修改）*/
    gw_u8 u8CollectCycle;
    /*上报重连等待时间,20分钟（固化，不可修改）*/
    gw_u16 u16ReConnectTime;
    /*密集采样间隔,5分钟（固化，不可修改）*/
    gw_u8 u8DenseDataCollectCycle;
    /*月用量统计日*/
    gw_u8 u8MonthUsageStatisticsDay;
    /*上一次结算的总用量*/
    gw_u32 u32LastTotalUsage;
    /*上一次结算的正流量,单位L*/
    gw_u32 u32LastForwardTotalUsage;
    /*上一次结算的逆流量,单位L*/
    gw_u32 u32LastReverseTotalUsage;
    /*上一次统计时的总用量*/
    gw_u32 u32LastMonthTotalUsage;
    gw_u8 device_workmode;
    /*最近一次上报成功日期*/
    gw_u8 u8LastUpdataTime[6];
    /*最近一次上报成功日期*/
    gw_u8 u8LastHistoryUpdataTime[6];
    gw_u32 u32NextUploadTime; // 下一次周期上报的时间戳
    gw_u32 u32MaxTotalUsage;
    /*nb信息*/
    S_Flash_Nb_Info s_nb_info;
    /*用量信息索引*/
    S_Flash_Usage_Index s_usage_index;
    /*表类型*/
    gw_u8 pu8MeterType;
    gw_u8 u8CheckSum;
} S_Flash_Device_Para;



typedef struct
{
    /*存储标志，防止同一分钟重复存储*/
    gw_u8 u8SaveFlag;
    /*当前累计流量,单位mL,上报周期为24小时,则当前累计流量为0点的当前累计流量；上报周期小于24小时,则当前累计流量为最后采集数据整点的当前累积流量（无符号）*/
    gw_u32 u32CurTotalUsage;
    /*累计正流量,单位mL，每日0时累计正流量（无符号）*/
    gw_u32 u32ForwardTotalUsage;
    /*累计逆流量,单位mL，每日0时累计逆流量（无符号）*/
    gw_u32 u32ReverseTotalUsage;
    /*日最高流量,单位1L/h，单日最高瞬间流量 */
    gw_u16 u16DayMaxFlow;
    /*日最高流量时间，格式为YYMMDDHHMMSS*/
    gw_u8 pu8DayMaxFlowTime[6];
    /*水表采集时间，格式为YYMMDDHHMMSS,为当前累计流量采集时的时间*/
    gw_u8 pu8UsageCollectTime[6];
    /*电池电压，0.01V为单位*/
    gw_u16 u16BatVoltage;
} S_Flash_RealTime_Usage;

typedef struct
{
    /*存储标志*/
    gw_u8 u8SaveFlag;
    /*密集采集起始标志*/
    gw_u8 u8StartFlag;
    /*起始时间,格式为YYMMDDHHMMSS*/
    gw_u8 pu8StartTime[6];
    /*数据记录间隔,5分钟*/
    gw_u8 u8TimeInterval;
    /*记录个数*/
    gw_u8 u8DataNum;
    /*间隔5分钟正累计流量(2字节)和间隔5分钟逆累计流量（2字节）。*/
    gw_u16 pu16ForwardUsage[48];
    /*间隔5分钟正累计流量(2字节)和间隔5分钟逆累计流量（2字节）。*/
    gw_u16 pu16ReverseUsage[48];
    /*上一次的累计正流*/
    gw_u32 u32LastForwardTotalUsage;
    /*上一次的累计反流*/
    gw_u32 u32LastReverseTotalUsage;
} S_Flash_Dense_Usage;

typedef struct
{
    gw_u8 u8Sig;
    /*存储标志*/
    gw_u8 u8SaveFlag; 
    /*NB上报标志*/
    gw_u8 u8NbReportFlag; 
    /*起始时间,格式为YYMMDDHHMMSS*/
    gw_u8 pu8StartTime[6];
    /*记录个数*/
    gw_u8 u8DataNum;
    /*上一次累计用量*/
    gw_u32 u32LastTotalUsage;
    /*记录值,时间周期内区间流量。*/
    gw_u16 pu16Data[24];
    /*密集用量*/
    S_Flash_Dense_Usage s_dense_usage;
    /*累积量*/
    S_Flash_RealTime_Usage s_realtime_usage;
    gw_u8 u8CheckSum;
} S_Flash_Day_Usage;

// 保存二十年
// 1+1+5*12*2*10+4+1=607字节
typedef struct
{
    gw_u8 u8Sig;
    /*月存储标志，防止同一月份数据重复保存*/
    gw_u8 u8SaveFlag;
    /*用量信息*/
    gw_u32 u32monthusage;
    gw_u8 u8CheckSum;
} S_Flash_Month_Usage;

typedef struct
{
    S_Flash_Day_Usage s_day_usage;
    S_Flash_Month_Usage s_month_usage;
} S_Flash_Usage_Info;

typedef struct
{
    gw_u32 u32RstTimeStamp; // 重新启动时间戳
    /*时间校准标志*/
    gw_u8 time_manegeinit_flag;
    gw_u8 u8RstReason;     // 复位原因
    gw_u32 u32UploadAlarm; //  报警上报标志
    gw_u8 u8RstTS_En;      // 0-重新启动时间戳使能

    gw_u8 u8para_fail;
    gw_u8 u8security_fail;
    E_Upload_Reason e_up_reason;
    E_MASTER_WORK_Mode e_work_mode;
    /*表计当前状态*/
} S_Flash_Other;           // 其他数据

typedef struct
{
    /*日按键上报次数*/
    gw_u8 u8DayKeyTimes;
    /*电压低导致的flash无法操作，1：读写失败，0：正常*/
    gw_u8 u8flashCheckFail;
    S_Flash_Meter_Event s_meter_event;
    S_Flash_Device_Security s_security;
    S_Flash_Device_Para s_para;
    S_Flash_Usage_Info s_usage_info;
    S_Flash_Other s_other;
} S_Flash_Data;

void Svc_Flash_Init(void);
void Svc_Flash_Wakeup_Init(void);
void Svc_Flash_Power_On(void);
void Svc_Flash_Power_Off(void);
void Svc_Flash_Reset(void);

S_Flash_Data *Svc_Flash_Get_Data(void);
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_Erase_Sector(gw_u32 erase_addr);

E_Result_State Svc_Flash_Write_Ota(gw_u8 *data, gw_u32 write_addr, gw_u16 write_num);
E_Result_State Svc_Flash_Erase_Para(void);
E_Result_State Svc_Flash_Write_Device_Para(S_Flash_Device_Para *para);
E_Result_State Read_Device_Para_Repeat(S_Flash_Device_Para *para);
E_Result_State Svc_Flash_Write_Device_Security(S_Flash_Device_Security *security);
E_Result_State Read_Device_Security_Repeat(S_Flash_Device_Security *security);

void Svc_Flash_Check_Save_Dense_Usage(gw_u8 pu8CurTime[6]);
void Svc_Flash_Check_Save_Hour_Usage(gw_u8 pu8CurTime[6]);
E_Result_State Svc_Flash_Write_Day_Usage(S_Flash_Day_Usage *ps_day_usage);
E_Result_State Svc_Flash_Read_Day_Usage(uint8_t pu8Time[3], S_Flash_Day_Usage *ps_day_data);
E_Result_State Svc_Flash_Read_Month_Usage(gw_u8 ppu8MonthSaveTime[2], S_Flash_Month_Usage *ps_month_usage);
E_Result_State Svc_Flash_Write_Month_Usage(S_Flash_Month_Usage *ps_month_usage);
void Svc_Flash_Check_Save_Month_Usage(gw_u8 pu8CurTime[6]);

void Svc_Flash_Get_UploadTime(gw_u8 *upload_time);

void Svc_Flash_Save_Meter_Event(E_Flash_Meter_Event e_event);
gw_u32 Svc_Flash_BCD_To_TimeStamp(gw_u8 u8BCDTime[]);
gw_u8 Svc_Flash_Time_Quantum_Meter_Event(E_Flash_Meter_Event e_event, gw_u8 u8BCDStart[], gw_u8 u8BCDEnd[], gw_u8 u8Len, gw_u8 u8EventData[]);
gw_u8 Svc_Flash_New_Meter_Event(E_Flash_Meter_Event e_event, gw_u8 u8Len, gw_u8 u8EventData[]);

void Svc_Flash_Set_Device_Alarm(gw_u32 u32State_Bit);
void Svc_Flash_Clear_Device_Alarm(gw_u32 u32State_Bit);
gw_u32 Svc_Flash_IsDevice_Alarm(gw_u32 u32State_Bit);
void Svc_Flash_Set_Upload_Alarm(gw_u32 u32State_Bit);
void Svc_Flash_Clear_Upload_Alarm(gw_u32 u32State_Bit);
void Svc_Flash_Clear_AllUpload_Alarm(void);
gw_u32 Svc_Flash_IsUpload_Alarm(gw_u32 u32State_Bit);
void Svc_Flash_Time_Calibrate_Deal(gw_s32 s32DiffTime);

#if POWERDOWN_EN
E_Result_State Svc_Flash_Write_Powerdown_Usage(S_Flash_Day_Data *ps_day_data);
#endif
#endif









