#ifndef CONTROLCAN_H
#define CONTROLCAN_H

#ifdef __cplusplus
extern "C" {
#endif

// Windows 类型定义
#ifndef _WINDEF_
typedef unsigned char       BYTE;
typedef unsigned short      USHORT;
typedef unsigned int        UINT;
typedef unsigned long       DWORD;
typedef void*               PVOID;
typedef char                CHAR;
typedef int                 INT;
typedef unsigned long       ULONG;
#endif

// 设备类型定义
#define VCI_USBCAN2         4   // USBCAN-2A/2C/CANalyst-II 系列

// 设备信息结构体
typedef struct _VCI_BOARD_INFO {
    USHORT hw_Version;      // 硬件版本
    USHORT fw_Version;      // 固件版本
    USHORT dr_Version;      // 驱动版本
    USHORT in_Version;      // 接口库版本
    USHORT irq_Num;         // 保留
    BYTE   can_Num;         // CAN 通道数量
    CHAR   str_Serial_Num[20];  // 序列号
    CHAR   str_hw_Type[40];     // 硬件类型
    USHORT Reserved[4];
} VCI_BOARD_INFO, *PVCI_BOARD_INFO;

// CAN 帧结构体
typedef struct _VCI_CAN_OBJ {
    UINT   ID;              // CAN ID
    UINT   TimeStamp;       // 时间戳
    BYTE   TimeFlag;        // 时间标志
    BYTE   SendType;        // 发送类型：0=正常，1=单次
    BYTE   RemoteFlag;      // 远程帧标志：0=数据帧，1=远程帧
    BYTE   ExternFlag;      // 帧格式：0=标准帧，1=扩展帧
    BYTE   DataLen;         // 数据长度
    BYTE   Data[8];         // 数据
    BYTE   Reserved[3];
} VCI_CAN_OBJ, *PVCI_CAN_OBJ;

// 初始化配置结构体
typedef struct _VCI_INIT_CONFIG {
    DWORD  AccCode;         // 验收码
    DWORD  AccMask;         // 屏蔽码
    DWORD  Reserved;
    BYTE   Filter;          // 滤波方式
    BYTE   Timing0;         // 波特率定时器0
    BYTE   Timing1;         // 波特率定时器1
    BYTE   Mode;            // 工作模式
} VCI_INIT_CONFIG, *PVCI_INIT_CONFIG;

// 滤波范围结构体
typedef struct _VCI_FILTER_RECORD {
    DWORD ExtFrame;         // 帧类型：0=标准，1=扩展
    DWORD Start;            // 起始 ID
    DWORD End;              // 结束 ID
} VCI_FILTER_RECORD, *PVCI_FILTER_RECORD;

// 函数声明
#ifdef _MSC_VER
#define EXPORT_API __declspec(dllimport)
#else
#define EXPORT_API
#endif

// 打开设备
EXPORT_API DWORD __stdcall VCI_OpenDevice(DWORD DeviceType, DWORD DeviceInd, DWORD Reserved);

// 关闭设备
EXPORT_API DWORD __stdcall VCI_CloseDevice(DWORD DeviceType, DWORD DeviceInd);

// 初始化 CAN
EXPORT_API DWORD __stdcall VCI_InitCAN(DWORD DeviceType, DWORD DeviceInd, DWORD CANInd, PVCI_INIT_CONFIG pInitConfig);

// 启动 CAN
EXPORT_API DWORD __stdcall VCI_StartCAN(DWORD DeviceType, DWORD DeviceInd, DWORD CANInd);

// 复位 CAN
EXPORT_API DWORD __stdcall VCI_ResetCAN(DWORD DeviceType, DWORD DeviceInd, DWORD CANInd);

// 发送数据
EXPORT_API DWORD __stdcall VCI_Transmit(DWORD DeviceType, DWORD DeviceInd, DWORD CANInd, PVCI_CAN_OBJ pSend, DWORD Len);

// 接收数据
EXPORT_API DWORD __stdcall VCI_Receive(DWORD DeviceType, DWORD DeviceInd, DWORD CANInd, PVCI_CAN_OBJ pReceive, DWORD Len, INT WaitTime);

// 获取接收数量
EXPORT_API DWORD __stdcall VCI_GetReceiveNum(DWORD DeviceType, DWORD DeviceInd, DWORD CANInd);

// 清除缓冲区
EXPORT_API DWORD __stdcall VCI_ClearBuffer(DWORD DeviceType, DWORD DeviceInd, DWORD CANInd);

// 读取设备信息
EXPORT_API DWORD __stdcall VCI_ReadBoardInfo(DWORD DeviceType, DWORD DeviceInd, PVCI_BOARD_INFO pInfo);

// 查找 USB 设备
EXPORT_API DWORD __stdcall VCI_FindUsbDevice2(PVCI_BOARD_INFO pInfo);

// 复位 USB 设备
EXPORT_API DWORD __stdcall VCI_UsbDeviceReset(DWORD DeviceType, DWORD DeviceInd, DWORD Reserved);

// 设置参数
EXPORT_API DWORD __stdcall VCI_SetReference(DWORD DeviceType, DWORD DeviceInd, DWORD CANInd, DWORD RefType, PVOID pData);

#ifdef __cplusplus
}
#endif

#endif // CONTROLCAN_H
