/*----------------------------------------------------------------
* FileName    : bms_update.h
* Create Date : 2014-10-30
*
*---------------------------------------------------------------*/

#ifndef __BMS_UPDATE_H__
#define __BMS_UPDATE_H__
#include <stdint.h>
#include "platmacro.h"
#define MAX_CMD_LINE 256
#define BMS_MAX_SW_UPDATE_MSG_LEN (MAX_CMD_LINE>>1)

typedef enum
{
    BMS_PLUSE_ON_STM8 = 127,
    BMS_EXCHANGE_DATA_VIA_STM32,
    BMS_UPDATA_STM8_OVER
}BMS_SW_UPDATE_MSG_TYPE_ENUM;

typedef struct
{
    uint8_t  msgType;
    uint8_t  len;
    uint16_t crc;       /* 小端 */
}BMS_SW_UPDATE_MSG_HEADER;

typedef struct
{
    BMS_SW_UPDATE_MSG_HEADER header;
    uint8_t  data[BMS_MAX_SW_UPDATE_MSG_LEN];
}BMS_SW_UPDATE_MSG;

typedef struct
{
    uint32_t offset;       /* 小端 */
    uint8_t  data[BMS_MAX_SW_UPDATE_MSG_LEN];
}BMS_SW_UPDATE_MSG_DADA_BODY_STRU;

typedef struct
{
    uint32_t len;       /* 小端 */
    uint32_t crc;       /* 小端 */
}BMS_SW_UPDATE_MSG_UPDATE_INFO_BODY_STRU;

typedef void (*MSG_TYPE_PROCESS)(BMS_SW_UPDATE_MSG *pReceiveDate);
typedef struct
{
    uint32_t msgType;
    MSG_TYPE_PROCESS msgProcess;
}MSG_PROCESS_LOOP_BACK;

/*----------------------------------------------------------------------------------------------------
 Discription:STM8升级及其它功能注册
 Param:    无
 Return:   0:执行成功
           非0:执行错误
*----------------------------------------------------------------------------------------------------*/
int32_t InitExclusive(uint8_t InsertMessageType,MSG_TYPE_PROCESS pFunction);

/*----------------------------------------------------------------------------------------------------
 Discription:程序更新初始化
 Param:    无
 Return:   0:执行成功 非0:执行错误
*----------------------------------------------------------------------------------------------------*/
extern int32_t BMS_InitUpdate(void);

/*----------------------------------------------------------------------------------------------------
 Discription:读取正常程序运行的偏移位置
 Param:    无
 Return:   正常程序运行的偏移位置
*----------------------------------------------------------------------------------------------------*/
uint16_t GetBootMainRunAddr(void);

/*----------------------------------------------------------------------------------------------------
 Discription:通过传输模块传输升级功能
 Param:    @param1: 输入数据指针
           @param2: 输入数据长度
 Return:   需要传输的数据长度(<0时表示不需要数据传输)
*----------------------------------------------------------------------------------------------------*/
void BMS_TransferUpdateMsg(uint8_t* buf, uint8_t data_len);

/*----------------------------------------------------------------------------------------------------
 Discription:在线升级接收数据处理
 Param:    更新消息
 Return:   无
*----------------------------------------------------------------------------------------------------*/
void BMS_ProcessUpdateMsgProcess(uint8_t* pMsg);

/*----------------------------------------------------------------------------------------------------
 Discription:是否在程序更新状态
 Param:    无
 Return:   Std_True:在更新状态         Std_False:未更新
*----------------------------------------------------------------------------------------------------*/
Std_Bool_Enum BMS_IsInUpdateState(void);

/*-----------------------------------------------------
Discription: 是否处于广播升级
Author:     DFS
Create:     2017-8-17
Modify:
-----------------------------------------------------*/
Std_Bool_Enum BMS_ISBroadcastUpload(void);

/*-----------------------------------------------------
Discription: 设置是否处于广播升级
Author:     DFS
Create:     2017-8-17
Modify:
-----------------------------------------------------*/
void BMS_SetBroadcastUpload(Std_Bool_Enum isUpload);

/*-----------------------------------------------------
Discription: 开始升级的准备工作
             启动的准备工作
Author:     DFS
Create:     2020-08-13
Modify:
-----------------------------------------------------*/
void BMS_OTAStartPrg(void);

/*-----------------------------------------------------
Discription: 结束升级工作(目前主要为复位)
             根据CRC结果给出返回如果正确就返回:Success，后复位
             如果错误就返回Failed；
             !!!!!目前给出的解决方案为只要进入到最后一帧当做正确(每帧都有CRC)!!!!!!!

Author:     DFS
Create:     2020-08-13
Modify:
-----------------------------------------------------*/
void BMS_OTAEndPrg(void);


#endif

