#ifndef __TRANSFER_EXT_SERVER_H__
#define __TRANSFER_EXT_SERVER_H__
#include "platmacro.h"
#include "bms_transfer.h"
#include "can_rbus.h"

#define ONCE_UP_FILE_SIZE       192  /*一次传输的数组长度 96~192 (4Bytes Align)*/
#define ONCE_PACKED_FRAME_SIZE  (ONCE_UP_FILE_SIZE+TRANSFER_FRAMEWORK_LENGTH+10)  /*一次传输的最大包的长度*/


typedef enum
{
    Transfer_Bro_Step_Stop,
    Transfer_Bro_Step_Read,
    Transfer_Bro_Step_Send,
    Transfer_Bro_Step_Recvd_Ack,
    Transfer_Bro_Step_Processed_Ack,
    Transfer_Bro_Step_Err,
    Transfer_Bro_Step_Ok,
}Transfer_Bro_Step_Enum;

typedef void (*ServerSpecIn_CallBack)(void *param);


/*
    收到一个ID的frame ack
    */
void TransferExt_RecvdOneFrameACK(uint32_t id);

/*
    收到一个ID的process ack
    */
void TransferExt_RecvdOneProcessedACK(uint32_t id);

/*-----------------------------------------------------------------------------------------
 Discription:  传输维护模块初始化
 Author:       DFS
 Date:         2019-09-03
 Param:        无
 Return:
 Modify:
*-----------------------------------------------------------------------------------------*/
Std_Ret_Type TransferExt_Init(void);

/*!
 * @brief      开启新的传输维护任务
 *
 * @param[in]   flow
 * @param[in]   outId
 * @return
 * @retval      None
 *
 * @par         modify    log
 * Date        Author     Description             \n
 * 2019-09-03     dfs      Create             \n
 * 2022-07-13     dfs      按照新的接口方式适配   \n
 */
Std_Ret_Type TransferExt_StartNew(uint32_t outId, CANRBUS_FlowMsg_Infor_Stru *flow);


/*-----------------------------------------------------------------------------------------
 Discription:  停滞当前的传输任务
 Author:       DFS
 Date:         2019-09-03
 Param:        无
 Return:
 Modify:
*-----------------------------------------------------------------------------------------*/
Std_Ret_Type TransferExt_StopMaintianceTrans(void);

/*-----------------------------------------------------------------------------------------
 Discription:  获取当前传输的步骤
 Author:       DFS
 Date:         2019-09-03
 Param:        无
 Return:
 Modify:
*-----------------------------------------------------------------------------------------*/
Transfer_Bro_Step_Enum TransferExt_GetTransStep(void);


/*-----------------------------------------------------------------------------------------
 Discription:  传输服务运行
               10ms运行1次
 Author:       DFS
 Date:         2019-09-03
 Param:        无
 Return:       停滞or运行
 Modify:
*-----------------------------------------------------------------------------------------*/
void TransferExt_Runnable(void);


/*-----------------------------------------------------------------------------------------
 Discription:  传输服务是否处于停滞状态
 Author:       DFS
 Date:         2019-09-03
 Param:        无
 Return:       停滞or运行
 Modify:
*-----------------------------------------------------------------------------------------*/
Std_Bool_Enum TransferExt_ISTransStandby(void);


/*-----------------------------------------------------------------------------------------
 Discription:  传输服务是否使能
 Author:       DFS
 Date:         2019-09-03
 Param:        无
 Return:       开启了还是未开启业务
 Modify:
*-----------------------------------------------------------------------------------------*/
Std_Bool_Enum TransferExt_EnabledStatus(void);


/*-----------------------------------------------------------------------------------------
 Discription:  停滞当前的传输任务
 Author:       DFS
 Date:         2019-09-03
 Param:        无
 Return:
 Modify:
*-----------------------------------------------------------------------------------------*/
Std_Ret_Type TransferExt_StopMaintianceTrans(void);


/*-----------------------------------------------------------------------------------------
 Discription:  特殊数据接收到时注册回调
               用于升级时，广播转发时使用
 Author:       DFS
 Date:         2019-09-03
 Param:        @Param1:Std_True:使能  Std_False:关闭
               @Param2:回调指针
 Return:       None
 Modify:
*-----------------------------------------------------------------------------------------*/
void TransferExt_SetServerSpecIn(Std_Bool_Enum en, ServerSpecIn_CallBack pfCallBack);

/*-----------------------------------------------------------------------------------------
 Discription:  服务端口接收到特殊数据的ACK
               用于广播升级转发功能
 Author:       DFS
 Date:         2019-09-03
 Param:        @Param1:数据指针
 Return:       None
 Modify:
*-----------------------------------------------------------------------------------------*/
void TransferExt_ServerSpecInAck(void *buf);

/*-----------------------------------------------------------------------------------------
 Discription:  特殊服务端口是否打开
 Author:       DFS
 Date:         2019-09-03
 Param:        None
 Return:       Std_True:处于特殊数据接收状态
               Std_False:未处于....
 Modify:
*-----------------------------------------------------------------------------------------*/
Std_Bool_Enum TransferExt_ServerSpecInStatus(void);

/*-----------------------------------------------------------------------------------------
 Discription:  获取传输状态
 Author:
 Date:         2020-03-26
 Param:        无
Return:       0：传输成功 1传输失败
 Modify:
*-----------------------------------------------------------------------------------------*/
uint16_t TransferExt_GetTransferSate(void);

/*
    查看是否收到了 全部的receivd frame ack
    */
Std_Ret_Type isRecvFrameAckAllGot(void);


/*
    查看是否收到了 全部的processed frame ack
    */
Std_Ret_Type isProcessedFrameAckAllGot(void);

#endif /*__TRANSFER_EXT_SERVER_H__*/

