You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
TwoLaserHead-PushJig/LaiPuLaser/PciCh365Mgr.h

146 lines
4.3 KiB
C

#pragma once
#include "Module.h"
#include "CH365DLL.H"
#include "GlobalFunction.h"
#include "PciPort.h"
#include "BitOperation.h"
#include "EnumPropertieType.h"
#define PORT_CNT 8 //<2F><>λ<EFBFBD>˿ڵĸ<DAB5><C4B8><EFBFBD>
#define OUT_PORT_ADDR_L 0xDE //<2F><><EFBFBD><EFBFBD><EFBFBD>˿ڵĵ<DAB5>ַ--<2D><>8 λ
#define OUT_PORT_ADDR_H 0xDD //<2F><><EFBFBD><EFBFBD><EFBFBD>˿ڵĵ<DAB5>ַ--<2D><>8 λ
#define IN_PORT_ADDR_L 0x1F //<2F><><EFBFBD><EFBFBD><EFBFBD>˿ڵĵ<DAB5>ַ--<2D><>8 λ 10 <20><><EFBFBD><EFBFBD>31
#define IN_PORT_ADDR_H 0xDF //<2F><><EFBFBD><EFBFBD><EFBFBD>˿ڵĵ<DAB5>ַ--<2D><>8 λ 10 <20><><EFBFBD><EFBFBD>223
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);
//ch365 pci<63><69><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
class CPciCh365Mgr:public CModule
{
public:
CPciCh365Mgr(void);
~CPciCh365Mgr(void);
virtual void Ini();
virtual MODULE GetModuleType(){return _MODULE_PCI365;};
bool IsInitialize(){return m_bIni;};
bool ReadPortState(SPciPort PciPort,bool bCheckIniState = true);
void WritePortState(SPciPort PciPort,bool bOpen);
void SendOnePulse(SPciPort PciPort,unsigned int Delay);
long &GetOutPortState(bool bLow);
void DelayTime(unsigned int us);
LARGE_INTEGER GetClockFre(){return m_ClockFre;};
void CloseLaserPort();
private:
bool ReadDll();
bool IniPciCard();
void IniOutPortState();
void CheckIniState();
int GetPortAddr(bool bLow,bool bWirte);
void IniClockFre();
BOOL ReadIoPortByte(int PortAddr,long &PortVal);
void WriteIoPortByte(int PortAddr,long PortVal);
bool LowOrHight(int &PortNum);
private:
bool m_bIni;//pci <20><><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD>ɹ<EFBFBD>
//dll <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
pCH365mOpenDevice CH365mOpenDevice;// <20><><EFBFBD><EFBFBD>CH365<36>豸,<2C><><EFBFBD>ؾ<EFBFBD><D8BE><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч
pCH365mReadIoByte CH365mReadIoByte;//<2F><>I/O<>˿ڶ<CBBF>ȡһ<C8A1><D2BB><EFBFBD>ֽ<EFBFBD>
pCH365mSetA15_A8 CH365mSetA15_A8;//<2F><><EFBFBD>øߵ<C3B8>ַ,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>A15-A8<41><38><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
pCH365mWriteIoByte CH365mWriteIoByte;// <20><>I/O<>˿<EFBFBD>д<EFBFBD><D0B4>һ<EFBFBD><D2BB><EFBFBD>ֽ<EFBFBD>
pCH365mCloseDevice CH365mCloseDevice;// <20>ر<EFBFBD>CH365<36>
HINSTANCE m_PciCh365Handle;//<2F><><EFBFBD><EFBFBD>Ch365<36><35>̬<EFBFBD><CCAC><EFBFBD>ӿ<EFBFBD><D3BF>ľ<EFBFBD><C4BE><EFBFBD>
HANDLE m_DeviceHandle;//pci<63><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>
long m_OutPortStateLow;//<2F><>¼<EFBFBD><C2BC>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD>˿ڵ<CBBF>״̬(<28>Ͱ<EFBFBD>λ)--<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD>
long m_OutPortStateHigh;//<2F><>¼<EFBFBD><C2BC>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD>˿ڵ<CBBF>״̬(<28>߰<EFBFBD>λ)--<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD>
bool m_bHasSmartClock;//<2F>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>ڲ<EFBFBD>ʱ<EFBFBD><CAB1>
LARGE_INTEGER m_ClockFre;//<2F>ڲ<EFBFBD><DAB2><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>Ƶ<EFBFBD><C6B5>
};
extern CPciCh365Mgr *gPciCh365Mgr;
//<2F><><EFBFBD><EFBFBD><EFBFBD>߰<EFBFBD>λ<EFBFBD><CEBB><EFBFBD>ǵͰ<C7B5>λ
inline bool CPciCh365Mgr::LowOrHight(int &PortNum)
{
bool bLow = true;//<2F>Ͱ<EFBFBD>λ
if(PortNum>=PORT_CNT)//<2F>߰<EFBFBD>λ
{
bLow = false;
PortNum -= PORT_CNT;//ͳһ8 λ<><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
return bLow;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>״̬
//bLow <20>Ƿ<EFBFBD>Ϊ<EFBFBD><CEAA>8 λ
inline long &CPciCh365Mgr::GetOutPortState(bool bLow)
{
if(bLow)
return m_OutPortStateLow;
else
return m_OutPortStateHigh;
}
//<2F><>ȡ<EFBFBD>˿ڶ<CBBF>Ӧ<EFBFBD>ĵ<EFBFBD>ַ
inline int CPciCh365Mgr::GetPortAddr(bool bLow,bool bWirte)
{
int addr;
if(bLow)//<2F>Ͱ<EFBFBD>λ
{
if(bWirte)
{
addr = OUT_PORT_ADDR_L;
}
else
{
addr = IN_PORT_ADDR_L;
}
}
else//<2F>߰<EFBFBD>λ
{
if(bWirte)
{
addr = OUT_PORT_ADDR_H;
}
else
{
addr = IN_PORT_ADDR_H;
}
}
return addr;
}
//<2F><>ȡPortNum <20>˿<EFBFBD>״̬(1 <20><><EFBFBD><EFBFBD>0)
inline bool CPciCh365Mgr::ReadPortState(SPciPort PciPort,bool bCheckIniState)
{
if(bCheckIniState)
CheckIniState();
//<2F><><EFBFBD><EFBFBD><EFBFBD>߰<EFBFBD>λ<EFBFBD><CEBB><EFBFBD>ǵͰ<C7B5>λ
bool bLow = LowOrHight(PciPort.num);
//<2F><><EFBFBD>ö˿ڵ<CBBF>ַ
int PortAddr = GetPortAddr(bLow,false);
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>ֵ
long InPortState;
ReadIoPortByte(PortAddr,InPortState);
bool ret = IsBitOn(InPortState,PciPort.num);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(PciPort.bReverse)
{
ret = !ret;
}
return ret;
}