#ifndef UDS_ZLGCAN_WRAP_H
#define UDS_ZLGCAN_WRAP_H

#include "zlgcan_x86/zlgcan.h"
#include "zuds/zuds.h"

#pragma pack(push,1)

typedef struct _ZUDS_WRAP_REQUEST_PAR
{
    uint32 src_addr;             // 请求地址
    uint32 dst_addr;             // 响应地址
    uint8  suppress_response;    // 1:抑制响应
}ZUDS_WRAP_REQUEST_PAR;

typedef struct _ZUDS_WRAP_RESPONSE_PAR
{
    UDS_STATUS status;  // 错误码
    RESPONSE_TYPE type; // RT_POSITIVE, RT_NEGATIVE
}ZUDS_WRAP_RESPONSE_PAR;


#pragma pack(pop)

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @brief 初始化UDS库
 * @param[in] hCanChannel, CAN通道句柄，需要先调用zlgcan的接口打开一个CAN通道。
 * @param[in] isCanfd, 是否使用CANFD帧通讯
 * @return UDS实例句柄
 */
ZUDS_HANDLE STDCALL ZUDS_WRAP_Init(CHANNEL_HANDLE hCanChannel, int isCanfd);

/**
 * @brief 退出程序前必须释放资源, 否则程序可能异常
 * @param[in] handle, 与ZUDS_WRAP_Init配对使用
 */
void STDCALL ZUDS_WRAP_Release(ZUDS_HANDLE handle);

/** 
 * 设置参数, 主要有:
 * 会话层参数, type=PARAM_TYPE_SESSION, param:详见 ZUDS_SESSION_PARAM
 * 传输层参数, type=PARAM_TYPE_ISO15765, param:详见 ZUDS_ISO15765_PARAM
 */
void STDCALL ZUDS_WRAP_SetParam(ZUDS_HANDLE handle, PARAM_TYPE type, void* param);

/**
 * @brief 执行服务请求, 阻塞函数, ECU有响应或响应超时返回。
 * @param[in] handle: ZUDS_Init的返回值
 * @param[in] requestPar: 请求参数
 * @param[in] data: UDS请求数据，包含服务ID
 * @param[in] dataLen: UDS请求数据字节长度
 * @param[out] respPar: 响应参数
 * @param[in, out] respBuf: UDS响应数据缓冲区
 * @param[in] respBufSize:UDS响应数据缓冲区字节长度
 * @return 实际UDS响应数据的长度
 */
uint32 STDCALL ZUDS_WRAP_Request(ZUDS_HANDLE handle, const ZUDS_WRAP_REQUEST_PAR* requestPar, const uint8 *data, uint32 dataLen,
    ZUDS_WRAP_RESPONSE_PAR *respPar, uint8* respBuf, uint32 respBufSize, int isCanfd);

/**
* @brief 传入接收的数据帧。必须异步于ZUDS_WRAP_Request传入，才能解析出请求响应
* @param[in] handle: 操作句柄，ZUDS_Init的返回值
* @param[in] pReceive: CAN帧数组
* @param[in] len: CAN帧数量
*/
void STDCALL ZUDS_WRAP_OnReceiveCAN(ZUDS_HANDLE handle, ZCAN_Receive_Data* pReceive, UINT len);
void STDCALL ZUDS_WRAP_OnReceiveCANFD(ZUDS_HANDLE handle, ZCAN_ReceiveFD_Data* pReceive, UINT len);

/**
 * @brief 中止请求, ZUDS_Request返回
 */
void STDCALL ZUDS_WRAP_Stop(ZUDS_HANDLE handle);

/**
 * @brief 用于实现会话保持。
 * @param[in] enable: true=使能会话保持, false=禁能会话保持
 */
void STDCALL ZUDS_WRAP_SetTesterPresent(ZUDS_HANDLE handle, uint8 enable, const ZUDS_TESTER_PRESENT_PARAM* param);



#ifdef __cplusplus
}
#endif


#endif