📄 digitizer.cpp
字号:
// Digitizer.cpp: implementation of the CDigitizer class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "dinput.h"
#include "Digitizer.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CDigitizer::CDigitizer()
{
m_digicfg.digiport = COM1;
m_digicfg.digisize = AT_A0;
m_digicfg.digitype = 23; // hipo & Richpeace
ReadCfg("digi.ini");
}
CDigitizer::~CDigitizer()
{
WriteCfg("digi.ini");
}
int CDigitizer::OpenComm()
{
DWORD dwError;
DCB dcbCommPort;
COMMTIMEOUTS commtimeouts;
DWORD evtmask;
CString str1,str2;
int nDigitizerType = 23;
switch (m_digicfg.digiport) {
case COM1:
m_sCommPortName="COM1";
break;
case COM2:
m_sCommPortName="COM2";
break;
case COM3:
m_sCommPortName="COM3";
break;
case COM4:
m_sCommPortName="COM4";
break;
}
m_hCommPort=CreateFile(LPCTSTR(m_sCommPortName),
GENERIC_READ | GENERIC_WRITE,
0,NULL,OPEN_EXISTING,0,NULL);
if (m_hCommPort == INVALID_HANDLE_VALUE)
{
dwError=GetLastError(); //得到上次操作的错误信息
// str2.LoadString(IDS_RPGRADESYSTEM); //富怡放码系统
switch (dwError) {
case ERROR_BUSY:
str1.LoadString(IDS_COMMPORTBUSY); //通讯口正在使用!
break;
default:
str1.LoadString(IDS_COMMPORTOPENERROR); //通讯口不能打开!
break;
}
AfxMessageBox(str1);
// gl_pWorkWindow->MessageBox(str1,str2,MB_OK | MB_ICONSTOP);
}
else
{
switch(nDigitizerType) {
case 4:
case 5:
case 6:
case 7: //calcomp
case 8: //calcomp
case 9: //calcomp
case 12: //Numonics
case 13: //Numonics
case 14: //Numonics
case 15: //calcomp
case 18: //CD_912
case 23: //Hipo,Richpeace
case 24: //Altek 16_Key
case 25: //Gerber
SetupComm(m_hCommPort,12,10);
break;
case 16: //summasketch A4
SetupComm(m_hCommPort,10,10);
break;
case 20: //summasketch A3
SetupComm(m_hCommPort,10,6);
break;
default:
SetupComm(m_hCommPort,16,10);
}
evtmask=EV_RXCHAR | EV_DSR | EV_RX80FULL | EV_RXFLAG;
SetCommMask(m_hCommPort,evtmask); //specifies a set of events to be monitored监控
PurgeComm(m_hCommPort,PURGE_TXCLEAR | PURGE_RXCLEAR); //Clears the output buffer (if the device driver has one).
//设置读串口时间限制
GetCommTimeouts(m_hCommPort,&commtimeouts);
commtimeouts.ReadTotalTimeoutMultiplier=2;
commtimeouts.ReadTotalTimeoutConstant=2;
SetCommTimeouts(m_hCommPort,&commtimeouts);
if (m_sCommPortName.Left(3) == _T("COM")) {
dcbCommPort.DCBlength=sizeof(DCB);
GetCommState(m_hCommPort,&dcbCommPort);
dcbCommPort.BaudRate=CBR_9600; //9600
dcbCommPort.ByteSize=8; //8
dcbCommPort.Parity=EVENPARITY; //2=偶校验
dcbCommPort.StopBits=ONESTOPBIT; //1位停止位
switch(nDigitizerType) {
case 2:
case 3:
case 19:
dcbCommPort.ByteSize=7; //7
dcbCommPort.StopBits=TWOSTOPBITS; //2位停止位
break;
case 20: //summasketch A3
case 16: //summasketch A4
dcbCommPort.Parity=ODDPARITY; //2=奇校验
break;
case 18:
case 21:
case 22:
case 23: //Hipo,Richpeace
case 24: //Altek 16_Key
case 25: //Gerber
dcbCommPort.Parity=NOPARITY; //0=NO校验
break;
}
dcbCommPort.fOutxDsrFlow=false; //DSR output flow control DSR=数据准备好
dcbCommPort.fDtrControl=DTR_CONTROL_ENABLE; // DTR flow control type DTR=数据终端准备好
dcbCommPort.fOutxCtsFlow=false; // CTS output flow control CTS=清除发送
dcbCommPort.fRtsControl=RTS_CONTROL_ENABLE; // RTS flow control 请求发送
dcbCommPort.fInX=false;
dcbCommPort.fOutX=false;
dcbCommPort.fBinary=true; //必须为二进制方式
dcbCommPort.fParity=true; //要奇偶校验
SetCommState(m_hCommPort,&dcbCommPort);
}
}
return 1;
}
int CDigitizer::ReadData()
{
int i,n,k=0,noldPH=0;
long xydata;
long xy[10];
char m_szBuffer[20];
unsigned long dwBytesRead;
DWORD dwEvtMask;
BOOL b_DigitizerDataStart=false;
int nDigitizerType = m_digicfg.digitype;
switch (nDigitizerType) { //数化板类型
case 4:
case 5:
case 6:
case 7:
case 8: //Calcomp A0 16_Key(0123..)A
case 9:
case 12: //Numonics AccuGrid A0 16_Key(123C..)
case 13: //Numonics AccuGrid A0 16_Key(0123..)
case 14: //Numonics AccuGrid A0 4_Key
case 21: //GTCO Roll Up 16_Key(0123..)
case 15: //Calcomp A0 16_Key(0123..)B
case 18: //CD-912 A0 16_Key A
case 23: //Hipo
case 24: //Altek 16_Key
case 25: //Gerber 16_key
m_nSizeDigitizerData=6;
break;
}
m_nToReadCharCount=m_nSizeDigitizerData*2; //要读的字节数
n=m_nToReadCharCount;
m_nReadCount=0; //已实际接收完的字节数
dwBytesRead=0; //本次实际接收的字节数
//----------------------------------
//一个字节一个字节读入,直到足够用,
//----------------------------------
while ((n > 0) && (m_nReadCount < m_nToReadCharCount))
{
GetCommMask(m_hCommPort,&dwEvtMask);
if (!(dwEvtMask & EV_RXFLAG)) //有一个字符在接收缓冲区?
{
return m_nReadCount;
}
if (ReadFile(m_hCommPort,&m_szBuffer[m_nReadCount], //接收数据缓冲区
1,
&dwBytesRead, NULL))
{
if (dwBytesRead == 0) //没读回数据
{
return m_nReadCount;
}
switch (nDigitizerType) //数化板类型
{
case 23: //Hipo,Richpeace
if ((m_szBuffer[m_nReadCount] & 0x80) != 0)
{
if (!b_DigitizerDataStart)
{
b_DigitizerDataStart=true;
}
else
{
m_szBuffer[noldPH]=0;
}
n=m_nSizeDigitizerData;
noldPH=m_nReadCount;
}
break;
}
m_nReadCount=m_nReadCount + dwBytesRead;
n=n-dwBytesRead;
}
else //读数据失败!
{
return m_nReadCount;
}
if ((m_nReadCount > m_nSizeDigitizerData) && (!b_DigitizerDataStart))
{
break;
}
}
if (!b_DigitizerDataStart)
{
return m_nReadCount;
}
if ((m_nReadCount == m_nToReadCharCount) || (n == 0))
{
switch (nDigitizerType)
{
case 23: //Hipo,Richpeace
for (i=0;i<m_nReadCount;i++)
{
if ((m_szBuffer[i] & 0x80) != 0)
{
if ((m_szBuffer[i+3] & 0xE0) != 0) //干扰
{
return m_nReadCount;
break;
}
if (i > m_nReadCount-m_nSizeDigitizerData) //有效数据不够用!
{
return m_nReadCount;
break;
}
xy[0]=(m_szBuffer[i] >> 2) & 0x0f;
xydata=(long)(m_szBuffer[i+2] & 0x7f) + (long)(m_szBuffer[i+1] & 0x7f)*128 + (long)(m_szBuffer[i] & 3)*16384;
if ((m_szBuffer[i+3] & 8) != 0)
{
xydata=xydata+16384*4;
}
xydata=(long)((double)xydata*1.016);
xy[1]=xydata & 0xff;
xy[2]=(xydata >> 8) & 0xff;
xy[3]=(xydata >> 16) & 0xff;
xy[4]=(xydata >> 24) & 0xff;
xydata=(long)(m_szBuffer[i+5] & 0x7f) + (long)(m_szBuffer[i+4] & 0x7f)*128 + (long)(m_szBuffer[i+3] & 7)*16384;
xydata=(long)((double)xydata*1.016);
//左下角为(0,0)点,转换为左上角为(0,0)点
int lpmm = 40;
switch (m_digicfg.digisize) {
case AT_A00:
xydata=(long)(44*25.4*lpmm - xydata);
break;
case AT_A0:
xydata=(long)(36*25.4*lpmm - xydata);
break;
case AT_A1:
xydata=(long)(24*25.4*lpmm - xydata);
break;
case AT_A2:
xydata=(long)(18*25.4*lpmm - xydata);
break;
case AT_A3:
case AT_A4:
xydata=(long)(12*25.4*lpmm - xydata);
break;
}
xy[5]=xydata & 0xff;
xy[6]=(xydata >> 8) & 0xff;
xy[7]=(xydata >> 16) & 0xff;
xy[8]=(xydata >> 24) & 0xff;
}
}
break;
}
}
for(i = 0; i < 10; i ++)
m_xy[i] = xy[i];
return m_nReadCount;
}
int CDigitizer::ReadCfg(CString fname)
{
CFile cfgfile;
if(cfgfile.Open(fname, CFile::modeRead))
{
cfgfile.SeekToBegin();
cfgfile.Read(&m_digicfg.digiport, sizeof(m_digicfg.digiport));
cfgfile.Read(&m_digicfg.digisize, sizeof(m_digicfg.digisize));
cfgfile.Read(&m_digicfg.digitype, sizeof(m_digicfg.digitype));
cfgfile.Close();
}
else
{
m_digicfg.digiport = COM1;
m_digicfg.digisize = AT_A0;
m_digicfg.digitype = 23;
WriteCfg("digi.ini");
}
return 1;
}
int CDigitizer::WriteCfg(CString fname)
{
CFile cfgfile;
if(!cfgfile.Open(fname, CFile::modeWrite))
cfgfile.Open(fname, CFile::modeWrite | CFile::modeCreate);
cfgfile.SeekToBegin();
cfgfile.Write(&m_digicfg.digiport, sizeof(m_digicfg.digiport));
cfgfile.Write(&m_digicfg.digisize, sizeof(m_digicfg.digisize));
cfgfile.Write(&m_digicfg.digitype, sizeof(m_digicfg.digitype));
cfgfile.Close();
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -