/*
 * @Description: OTA模块-svc层
 * @Author: yangsw
 * @Date: 2021-06-21 10:44:09
 * @LastEditTime: 2023-03-01 13:57:14
 * @LastEditors: Lida
 * @Reference: 
 */
#ifndef H_SVC_OTA_H
#define H_SVC_OTA_H

#include "../../com/svc/svc_com.h"

#define OTA_FIRMWARE_PARA_ADDR      (gw_u32)0x00025000
#define OTA_FIRMWARE_ADDR           (gw_u32)0x00026000

#define OTA_PACKGE_SIZE   256

typedef enum{
    E_OTA_EVENT_NO=0,
    E_OTA_EVENT_REQUEST_OTA=0x0010,         //请求OTA
    E_OTA_EVENT_REQUEST_OTA_DATA=0x0020,    //请求OTA数据
    E_OTA_EVENT_ALL=0xFFFF,
}E_OTA_Event_Enum;

typedef struct{
    /*写入标志*/
    gw_u8 u8Sig;
    /*新固件标志*/
    gw_u8 u8IsNewFirmware;
    /*固件总长度*/
    gw_u32 u32FirmwareLen;
    //制定升级的软件版本
    gw_u8 u8softversion[2];
    //固件MD5
    gw_u8 u8Md5[16];
    /*校验和*/
    gw_u8 u8Sum; 
}S_Ota_Para;

typedef struct{
    E_OTA_Event_Enum e_ota_sending_event;
    gw_u16 ota_event;
    gw_u8 startflag;
    /*固件包编号*/
    gw_u16 u16PackNum;
    /*固件接收当前长度*/
    gw_u32 u32FirmwareLen;
    /*OTA固件当前长度*/
    gw_u32 u32CurLen;
    /*OTA固件剩余长度*/    
    gw_s32 u32RemainLen;
    gw_u16 u16Crc;    
    /*OTA升级结果*/
    gw_u8  u8Result;
    /*OTA升级异常计数*/
    gw_u8 buff[OTA_PACKGE_SIZE];    
    //请求固件开始地址  
    gw_u32 u32OtaStartAddr;
    //请求固件结束地址    
    gw_u32 u32OtaEndAddr;     
    gw_u8  u8Err;   
    S_Ota_Para s_para; 
}S_Ota;



void Svc_Ota_Start(void);
S_Ota* Svc_Ota_Get_Data(void);
E_Result_State Svc_Ota_Write_Firmware(gw_u8 *pu8Data,gw_u16 u16PackNum,gw_u16 u16Len);
E_Result_State Save_Firmware_Para(void);
void WWDG_Config(void);
void WWDG_FeedDog(void);

void Svc_Ota_Post_Event(E_OTA_Event_Enum ota_event);
void Svc_Ota_Clear_Event(E_OTA_Event_Enum ota_event);
E_OTA_Event_Enum Svc_Ota_Get_Pending_Event(void);
void Svc_Ota_Lock_Event(E_OTA_Event_Enum ota_event);
E_Result_Check Svc_Ota_Event_Is_Changed(E_OTA_Event_Enum ota_event);

#endif