#pragma once #include #include "LaserLogger.h" typedef HANDLE(WINAPI*pCH365mOpenDevice)(ULONG iIndex, BOOL iEnableMemory, BOOL iEnableInterrupt); typedef BOOL(WINAPI*pCH365mReadIoByte)(ULONG iIndex, PVOID iAddr, PUCHAR oByte); typedef BOOL(WINAPI*pCH365mSetA15_A8)(ULONG iIndex, UCHAR iA15_A8); typedef BOOL(WINAPI*pCH365mWriteIoByte)(ULONG iIndex, PVOID iAddr, UCHAR iByte); typedef VOID(WINAPI*pCH365mCloseDevice)(ULONG iIndex); #define LASER_PORT 7 //激光开关端口 #define PORT_CNT 8 //低位端口的个数 #define OUT_PORT_ADDR_L 0xDE //输出端口的地址--低8 位 #define OUT_PORT_ADDR_H 0xDD //输出端口的地址--高8 位 #define IN_PORT_ADDR_L 0x1F //输入端口的地址--低8 位 10 进制31 #define IN_PORT_ADDR_H 0xDF //输入端口的地址--高8 位 10 进制223 class Pci365CardMgr { typedef struct SPciPort { SPciPort() { num = -1; bReverse = false; } public: int num;//端口的编号 bool bReverse;//是否反转(反转了以后读取和写入都会反过来) }SPciPort; public: Pci365CardMgr(); ~Pci365CardMgr(); public: static Pci365CardMgr* m_instance; long m_OutPortStateLow;//记录当前输出端口的状态(低八位)--用于向端口写数据 long m_OutPortStateHigh;//记录当前输出端口的状态(高八位)--用于向端口写数据 HINSTANCE m_PciCh365Handle;//保存Ch365动态链接库的句柄 HANDLE m_DeviceHandle;//pci设备的句柄 bool m_bIniPci365Card = false; public: void InitPci365Card(); public: bool ReadDll(); bool IniPciCard(); void CtrlLaserGate(bool bon); void WritePortState(SPciPort PciPort, bool bOpen); bool LowOrHight(int &PortNum); long& GetOutPortState(bool bLow); int GetPortAddr(bool bLow, bool bWirte); long SetBitOn(long PortVal, int PortIdx); BYTE SetBitOff(BYTE PortVal, int PortIdx); void WriteIoPortByte(int PortAddr, long PortVal); //dll 函数指针 pCH365mOpenDevice CH365mOpenDevice;// 打开CH365设备,返回句柄,出错则无效 pCH365mReadIoByte CH365mReadIoByte;//从I/O端口读取一个字节 pCH365mSetA15_A8 CH365mSetA15_A8;//设置高地址,即设置A15-A8的输出 pCH365mWriteIoByte CH365mWriteIoByte;// 向I/O端口写入一个字节 pCH365mCloseDevice CH365mCloseDevice;// 关闭CH365设备 public: static Pci365CardMgr* GetInstance() { if (m_instance == nullptr) { m_instance = new Pci365CardMgr(); } return m_instance; } };