#ifndef __UPDATE_SUPORT_H__
#define __UPDATE_SUPORT_H__
#include "platmacro.h"


#define MODULE_LEVEL BMS_HW_LEVEL_3
typedef enum
{
    Download_Step_Read,
    Download_Step_Send,
    Download_Step_Recvd_Ack,
    Download_Step_Process_Ack,
    Download_Step_Err,
    Download_Step_Send_Crc,
    Download_Step_Ok,
    Download_Step_Check_Crc_Failed,
    Download_Step_Check_Crc_Success,
    Download_Step_Read_Reset,
    Download_Step_Send_Reset,
}Download_Step_Enum;

#define MAX_FILE_NAME_LEN    256       /*�ļ���*/
#define MAX_UPSP_FILE_LEVEL BMS_HW_LEVEL_BUTT

/*-----------------------------------------------------------------------------------------
 Discription:  ����ά����ʼ��
 Author:       DFS
 Date:         2019-08-27
 Param:        ��
 Return:       Std_Ret_Ok:�ɹ�
               Std_Ret_Err:ʧ��
 Modify:
*-----------------------------------------------------------------------------------------*/
Std_Ret_Type UpdateSup_Init(void);


/*-----------------------------------------------------------------------------------------
 Discription:  ����ά��ʵʱ����ģ��
               1����ȡĿ¼����
               2����ȡ�����ļ���
               3������ά����
               4����λ��ȡ�汾��
 Author:       DFS
 Date:         2019-08-27
 Param:        ��
 Return:       Std_Ret_Ok:�ɹ�
               Std_Ret_Err:ʧ��
 Modify:
*-----------------------------------------------------------------------------------------*/
void UpdateSup_Runnable(void);

/*
    ʹ��ʾ��:
    1) ��BAU����              bau = 1   bcu = 0             bmu = 0             dst level = 3

    2) A\�Ե���BCU����        bau = 0   bcu = N(0<N<63)     bmu = 0             dst level = 2
       B\��BCU�㲥����        bau = 0   bcu = 63            bmu = 0             dst level = 2

    3) A\ĳһ��BMU�㲥����    bau = 0 bcu = N(0<N<63)       bmu = 127           dst level = 1
       B\ȫ����BMU�㲥����    bau = 0 bcu = 63              bmu = 127           dst level = 1
       C\ĳһ�ص�BMU����      bau = 0 bcu = N(0<N<63)       bmu = M(0<M<127)    dst level = 1
    */
typedef struct {
    uint8_t bmuId;
    uint8_t bcuId;
    uint8_t bauId;
    uint8_t dstLevel;
    uint8_t rackNum;
    uint8_t fileName[MAX_FILE_NAME_LEN];
}OTA_Exchange_Stru;

typedef enum
{
    OTA_Error_ok,
    OTA_Error_ISRunning,
    OTA_Error_ReadFile,
    OTA_Error_FileCrc,
    OTA_Error_Retry_Err,

}OTA_Error_Enum;

Std_Ret_Type update_init_new_download_job(OTA_Exchange_Stru* pOTAData, uint32_t size);

/*
    ʹ��ʾ��:
    1) ��BAU����              bau = 1   bcu = 0             bmu = 0             dst level = 3

    2) A\�Ե���BCU����        bau = 0   bcu = N(0<N<63)     bmu = 0             dst level = 2
       B\��BCU�㲥����        bau = 0   bcu = 63            bmu = 0             dst level = 2

    3) A\ĳһ��BMU�㲥����    bau = 0 bcu = N(0<N<63)       bmu = 127           dst level = 1
       B\ȫ����BMU�㲥����    bau = 0 bcu = 63              bmu = 127           dst level = 1
       C\ĳһ�ص�BMU����      bau = 0 bcu = N(0<N<63)       bmu = M(0<M<127)    dst level = 1
    */
void update_start_new_otajob(OTA_Exchange_Stru *pOTAData);

void UpdateSup_AbortUpdating(void);

int32_t Update_Recv_XNCan_PayLoad(uint8_t *buf, uint32_t len, void *param);

void update_send_msg_to_mqtt(uint8_t* buf, uint32_t len, void* param);

void update_simulate_start_newjob(void);

void update_send_test_show_version(void);

#endif /*__UPDATE_SUPORT_H__*/
