#ifndef _PCI2312_DEVICE_
#define _PCI2312_DEVICE_

//######################## 常量定义 #################################
// CreateFileObject所用的文件操作方式控制字(可通过或指令实现多种方式并操作)
#define PCI2312_modeRead				0x0000		// 只读文件方式
#define PCI2312_modeWrite				0x0001		// 只写文件方式
#define	PCI2312_modeReadWrite			0x0002		// 既读又写文件方式
#define PCI2312_modeCreate				0x1000		// 如果文件不存可以创建该文件，如果存在，则重建此文件，并清0
#define PCI2312_typeText				0x4000		// 以文本方式操作文件

//***********************************************************

//***********************************************************
// 用户函数接口
#ifndef _PCI2312_DRIVER_
#define DEVAPI __declspec(dllimport)
#else
#define DEVAPI __declspec(dllexport)
#endif

#ifdef __cplusplus
extern "C" {
#endif
	//######################## 常规通用函数 #################################
	// 适用于本设备的最基本操作
	HANDLE DEVAPI FAR PASCAL PCI2312_CreateDevice(int DeviceID = 0);		// 创建设备对象
	int DEVAPI FAR PASCAL PCI2312_GetDeviceCount(HANDLE hDevice);			// 取得设备总台数
	int DEVAPI FAR PASCAL PCI2312_GetDeviceCurrentID(HANDLE hDevice);
	BOOL DEVAPI FAR PASCAL PCI2312_ListDeviceDlg(HANDLE hDevice);			// 列表系统当中的所有的该PCI设备
    BOOL DEVAPI FAR PASCAL PCI2312_ReleaseDevice(HANDLE hDevice);			// 关闭设备,禁止传输,且释放资源

	//####################### 数字I/O输入输出函数 #################################
	// 用户可以使用WriteRegisterULong和ReadRegisterULong等函数直接控制寄存器进行I/O
	// 输入输出，但使用下面两个函数更省事，它不需要您关心寄存器分配和位操作等，而只
	// 需象VB等语言的属性操作那么简单地实现各开关量通道的控制。
	BOOL DEVAPI FAR PASCAL PCI2312_SetDeviceDO(             // 设置数字量输出状态     
										HANDLE hDevice,     // 设备句柄								        
										BYTE bDOSts[16]);	// 开关状态

	BOOL DEVAPI FAR PASCAL PCI2312_GetDeviceDI(             // 取得数字量输入状态     
										HANDLE hDevice,     // 设备句柄								        
										BYTE bDISts[16]);	// 开关状态	

	//####################### 中断函数 #################################
	// 它由硬件信号的状态变化引起CPU产生中断事件hEventInt。
	BOOL DEVAPI FAR PASCAL PCI2312_InitDeviceInt(			// 初始化中断
										HANDLE hDevice,     // 设备句柄	
										HANDLE hEventInt);	// 中断事件句柄,它由CreateSystemEvent创建
	LONG DEVAPI FAR PASCAL PCI2312_GetDeviceIntCount(HANDLE hDevice);  // 在中断初始化后，用它取得中断服务程序产生的次数
	BOOL DEVAPI FAR PASCAL PCI2312_ReleaseDeviceInt(HANDLE hDevice); // 释放中断资源

	//################# 内存映射寄存器直接操作及读写函数 ########################
	// 适用于用户对本设备更直接、更特殊、更低层、更复杂的控制。比如根据特殊的
	// 控制对象需要特殊的控制流程和控制效率时，则用户可以使用这些接口予以实现。
	BOOL DEVAPI FAR PASCAL PCI2312_GetDeviceBar(					// 取得指定的指定设备寄存器组BAR地址
											HANDLE hDevice,			// 设备对象句柄,它由CreateDevice函数创建
											__int64 pbPCIBar[6]);	// 返回PCI BAR所有地址,具体PCI BAR中有多少可用地址请看硬件说明书

	BOOL DEVAPI FAR PASCAL PCI2312_WritePortByte(HANDLE hDevice, __int64 pbPort, BYTE Value);
    BOOL DEVAPI FAR PASCAL PCI2312_WritePortWord(HANDLE hDevice, __int64 pbPort, WORD Value);
    BOOL DEVAPI FAR PASCAL PCI2312_WritePortULong(HANDLE hDevice, __int64 pbPort, ULONG Value);

    BYTE DEVAPI FAR PASCAL PCI2312_ReadPortByte(HANDLE hDevice, __int64 pbPort);
    WORD DEVAPI FAR PASCAL PCI2312_ReadPortWord(HANDLE hDevice, __int64 pbPort);
    ULONG DEVAPI FAR PASCAL PCI2312_ReadPortULong(HANDLE hDevice, __int64 pbPort);

	//########################### 线程操作函数 ######################################
	HANDLE DEVAPI FAR PASCAL PCI2312_CreateSystemEvent(void);			// 创建内核事件对象，供InitDeviceInt和VB子线程等函数使用
	BOOL DEVAPI FAR PASCAL PCI2312_ReleaseSystemEvent(HANDLE hEvent);	// 释放内核事件对象


#ifdef __cplusplus
}
#endif

// 自动包含驱动函数导入库
#ifndef _PCI2312_DRIVER_
	#ifndef _WIN64
		#pragma comment(lib, "PCI2312_32.lib")
		#pragma message("======== Welcome to use our art company's products!")
		#pragma message("======== Automatically linking with PCI2312_32.dll...")
		#pragma message("======== Successfully linked with PCI2312_32.dll")
	#else
		#pragma comment(lib, "PCI2312_64.lib")
		#pragma message("======== Welcome to use our art company's products!")
		#pragma message("======== Automatically linking with PCI2312_64.dll...")
		#pragma message("======== Successfully linked with PCI2312_64.dll")
	#endif

#endif

#endif // _PCI2312_DEVICE_
