#include "Pci365CardMgr.h" Pci365CardMgr* Pci365CardMgr::m_instance = nullptr; void Pci365CardMgr::InitPci365Card() { if (m_bIniPci365Card) { return; } m_OutPortStateLow = 0;//记录当前输出端口的状态--用于向端口写数据 m_OutPortStateHigh = 0;//记录当前输出端口的状态--用于向端口写数据 if (ReadDll())//读取dll { //自己初始化pci 卡 IniPciCard(); //关闭激光端口 CtrlLaserGate(false); } } bool Pci365CardMgr::ReadDll() { m_PciCh365Handle = LoadLibrary(L"CH365DLL.DLL"); if (!m_PciCh365Handle) { LaserLogger::GetInstance()->WriteLog(0, "LoadLibrary CH365DLL.DLL is error"); return false; } //读取需要的函数地址 bool result = true; result &= ((CH365mOpenDevice = (pCH365mOpenDevice)GetProcAddress(m_PciCh365Handle, "CH365mOpenDevice")) != NULL); result &= ((CH365mReadIoByte = (pCH365mReadIoByte)GetProcAddress(m_PciCh365Handle, "CH365mReadIoByte")) != NULL); result &= ((CH365mSetA15_A8 = (pCH365mSetA15_A8)GetProcAddress(m_PciCh365Handle, "CH365mSetA15_A8")) != NULL); result &= ((CH365mWriteIoByte = (pCH365mWriteIoByte)GetProcAddress(m_PciCh365Handle, "CH365mWriteIoByte")) != NULL); result &= ((CH365mCloseDevice = (pCH365mCloseDevice)GetProcAddress(m_PciCh365Handle, "CH365mCloseDevice")) != NULL); if (!result) { LaserLogger::GetInstance()->WriteLog(0, "CH365mOpenDevice is error"); return false; } return true; } bool Pci365CardMgr::IniPciCard() { //初始化pci 卡 m_DeviceHandle = CH365mOpenDevice(0, true, true); if ((int)m_DeviceHandle == -1) { LaserLogger::GetInstance()->WriteLog(0, "ch365 pci is not discovered"); return false; } //初始化输入端口(否则输入端口无法读取) UCHAR ChByte = 0xFF; CH365mSetA15_A8(0, ChByte);//恢复高8位地址 LaserLogger::GetInstance()->WriteLog(0, "ch365 pci IniPciCard is OK"); m_bIniPci365Card = true; return true; } void Pci365CardMgr::CtrlLaserGate(bool bon) { SPciPort PciPort; PciPort.num = LASER_PORT; /*if (gMirror->IsLaserSwitch()) bon = !bon; */ try { WritePortState(PciPort, bon); } catch (...) { LaserLogger::GetInstance()->WriteLog(0, "function:WritePortState is error"); } } void Pci365CardMgr::WritePortState(SPciPort PciPort, bool bOpen) { //检查pci 初始化状态 if (m_bIniPci365Card == false) { return; } if (PciPort.num == -1) return; //处理高八位还是低八位 bool bLow = LowOrHight(PciPort.num); //获得输出端口状态 long &OutPortState = GetOutPortState(bLow); //获得端口地址 int PortAddr = GetPortAddr(bLow, true); //反向操作 if (PciPort.bReverse) { bOpen = !bOpen; } if (bOpen) { OutPortState = SetBitOn(OutPortState, PciPort.num); WriteIoPortByte(PortAddr, OutPortState); } else { OutPortState = SetBitOff(OutPortState, PciPort.num); WriteIoPortByte(PortAddr, OutPortState); } } bool Pci365CardMgr::LowOrHight(int &PortNum) { bool bLow = true;//低八位 if (PortNum >= PORT_CNT)//高八位 { bLow = false; PortNum -= PORT_CNT;//统一8 位来处理 } return bLow; } long& Pci365CardMgr::GetOutPortState(bool bLow) { if (bLow) return m_OutPortStateLow; else return m_OutPortStateHigh; } int Pci365CardMgr::GetPortAddr(bool bLow, bool bWirte) { int addr; if (bLow)//低八位 { if (bWirte) { addr = OUT_PORT_ADDR_L; } else { addr = IN_PORT_ADDR_L; } } else//高八位 { if (bWirte) { addr = OUT_PORT_ADDR_H; } else { addr = IN_PORT_ADDR_H; } } return addr; } long Pci365CardMgr::SetBitOn(long PortVal, int PortIdx) { PortVal = PortVal | (1 << PortIdx); return PortVal; } BYTE Pci365CardMgr::SetBitOff(BYTE PortVal, int PortIdx) { PortVal = (PortVal)&(~(1 << PortIdx)); return PortVal; } void Pci365CardMgr::WriteIoPortByte(int PortAddr, long PortVal) { UCHAR ChByte; if (PortAddr < 255) { USHORT mAddr = (USHORT)PortAddr; ChByte = (UCHAR)PortVal; CH365mWriteIoByte(0, (PVOID)mAddr, ChByte);//端口写入一次时间大约需要4us } else { ChByte = PortAddr >> 8; CH365mSetA15_A8(0, ChByte);//设定高8位地址 USHORT mAddr = (USHORT)(PortAddr % 256); ChByte = (UCHAR)PortVal; CH365mWriteIoByte(0, (PVOID)mAddr, ChByte); ChByte = 0xFF; CH365mSetA15_A8(0, ChByte);//恢复高8位地址 } } Pci365CardMgr::Pci365CardMgr() { } Pci365CardMgr::~Pci365CardMgr() { }