📄 pcl 733dlg.cpp
字号:
// PCL 733Dlg.cpp : implementation file
//
#include "stdafx.h"
#include "PCL 733.h"
#include "..\..\..\..\include\Driver.h"
#include "..\..\..\..\include\Paras.h"
#include "..\..\..\..\include\Event.h"
#include "PCL 733Dlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define IDM_TIMER1 1
typedef struct _PT_ThreadArg
{
LONG m_lDriverHandle;
CPCL733Dlg * pDlg;
// PT_CheckEvent ptCheckEvent;
} PT_ThreadArg, * LPT_ThreadArg;
static PT_ThreadArg Context;
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CPCL733Dlg dialog
CPCL733Dlg::CPCL733Dlg(CWnd* pParent /*=NULL*/)
: CDialog(CPCL733Dlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CPCL733Dlg)
m_nEventCountDI0 = 1;
m_nEventCountDI16 = 1;
m_uPort = 0;
m_hDriverHandle=NULL;
m_lScanTime = 1000;
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_bStart = FALSE;
m_bEnableDI0 = FALSE;
m_bEnableDI16 = FALSE;
m_pThreadObject = NULL;
}
void CPCL733Dlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CPCL733Dlg)
DDX_Control(pDX, IDC_SPINPORT, m_SpinPort);
DDX_Control(pDX, IDC_EVTFRQDI16, m_ctlEvtFrqDI16);
DDX_Control(pDX, IDC_EVTFRQDI0, m_ctlEvtFrqDI0);
DDX_Control(pDX, IDC_DEVICENAME, m_ctlDeviceName);
DDX_Control(pDX, IDC_DATA, m_ctlData);
DDX_Text(pDX, IDC_EVTCNTDI0, m_nEventCountDI0);
DDV_MinMaxUInt(pDX, m_nEventCountDI0, 1, 10000);
DDX_Text(pDX, IDC_EVTCNTDI16, m_nEventCountDI16);
DDV_MinMaxUInt(pDX, m_nEventCountDI16, 1, 10000);
DDX_Text(pDX, IDC_PORT, m_uPort);
DDV_MinMaxUInt(pDX, m_uPort, 0, 3);
DDX_Text(pDX, IDC_SCANTIME, m_lScanTime);
DDV_MinMaxUInt(pDX, m_lScanTime, 1, 10000);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CPCL733Dlg, CDialog)
//{{AFX_MSG_MAP(CPCL733Dlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDM_ABOUT, OnAbout)
ON_BN_CLICKED(IDM_CLOSE, OnCloseDlg)
ON_BN_CLICKED(IDC_SELECTDEVICE, OnSelectDevice)
ON_NOTIFY(UDN_DELTAPOS, IDC_SPINPORT, OnDeltaposSpinport)
ON_BN_CLICKED(IDC_START, OnStart)
ON_WM_CLOSE()
ON_BN_CLICKED(IDC_STOP, OnStop)
ON_WM_TIMER()
ON_BN_CLICKED(IDC_ENABLEDI0, OnEnableDI0)
ON_BN_CLICKED(IDC_ENABLEDI16, OnEnableDI16)
ON_BN_CLICKED(IDC_DISABLEDI0, OnDisableDI0)
ON_BN_CLICKED(IDC_DISABLEDI16, OnDisableDI16)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CPCL733Dlg message handlers
BOOL CPCL733Dlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
m_SpinPort.SetRange(0,3);
m_SpinPort.SetPos(0);
Context.pDlg=this;
OnSelectDevice();
return TRUE; // return TRUE unless you set the focus to a control
}
void CPCL733Dlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CPCL733Dlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CPCL733Dlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CPCL733Dlg::OnAbout()
{
// TODO: Add your control notification handler code here
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
void CPCL733Dlg::OnCloseDlg()
{
// TODO: Add your control notification handler code here
::SendMessage(m_hWnd,WM_CLOSE,(WPARAM)0,(LPARAM)0);
}
void CPCL733Dlg::OnSelectDevice()
{
// TODO: Add your control notification handler code here
UCHAR DeviceName[MAX_PATH];
PT_DeviceGetFeatures devFeature;
if (m_bStart)
{
MessageBox("The timer is active,stop it before select device!","Demo Message",MB_OK|MB_ICONEXCLAMATION);
return;
}
if (m_bEnableDI0)
{
MessageBox("The DI0 Event is enabled,disable it before select device!","Demo Message",MB_OK|MB_ICONEXCLAMATION);
return;
}
if (m_bEnableDI16)
{
MessageBox("The DI16 Event is enabled,disable it before select device!","Demo Message",MB_OK|MB_ICONEXCLAMATION);
return;
}
if ( m_hDriverHandle != NULL )
DRV_DeviceClose( &m_hDriverHandle );
m_ulDevNum = 0;
m_nErrCode=DRV_SelectDevice(m_hWnd, FALSE, &m_ulDevNum, DeviceName );
m_ctlDeviceName.SetWindowText((LPTSTR)DeviceName);
m_nErrCode = DRV_DeviceOpen( m_ulDevNum, &m_hDriverHandle);
Context.m_lDriverHandle=m_hDriverHandle;
devFeature.buffer=(DEVFEATURES *)malloc(sizeof(DEVFEATURES));
if ((m_nErrCode = DRV_DeviceGetFeatures(m_hDriverHandle,&devFeature))!= SUCCESS)
{
DRV_GetErrorMessage(m_nErrCode,(LPSTR)m_szErrMsg);
MessageBox((LPCSTR)m_szErrMsg,"Driver Message",MB_OK);
DRV_DeviceClose((LONG far *)&m_hDriverHandle);
return;
}
if(devFeature.buffer->dwBoardID == BD_PCL733)
{
::EnableWindow(::GetDlgItem(m_hWnd,IDC_START),TRUE);
::EnableWindow(::GetDlgItem(m_hWnd,IDC_ENABLEDI0),TRUE);
::EnableWindow(::GetDlgItem(m_hWnd,IDC_ENABLEDI16),TRUE);
}
else
{
::EnableWindow(::GetDlgItem(m_hWnd,IDC_START),FALSE);
::EnableWindow(::GetDlgItem(m_hWnd,IDC_STOP),FALSE);
::EnableWindow(::GetDlgItem(m_hWnd,IDC_ENABLEDI0),FALSE);
::EnableWindow(::GetDlgItem(m_hWnd,IDC_ENABLEDI16),FALSE);
::EnableWindow(::GetDlgItem(m_hWnd,IDC_DISABLEDI0),FALSE);
::EnableWindow(::GetDlgItem(m_hWnd,IDC_DISABLEDI16),FALSE);
}
free(devFeature.buffer);
}
void CPCL733Dlg::OnDeltaposSpinport(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
// TODO: Add your control notification handler code here
m_uPort=pNMUpDown->iPos;
UpdateData(FALSE);
*pResult = 0;
}
void CPCL733Dlg::OnStart()
{
// TODO: Add your control notification handler code here
if(!UpdateData(TRUE))
return;
::EnableWindow(::GetDlgItem(m_hWnd,IDC_START),FALSE);
::EnableWindow(::GetDlgItem(m_hWnd,IDC_STOP),TRUE);
SetTimer(IDM_TIMER1,m_lScanTime,NULL);
m_bStart=TRUE;
}
void CPCL733Dlg::OnStop()
{
// TODO: Add your control notification handler code here
KillTimer(IDM_TIMER1);
m_bStart=FALSE;
::EnableWindow(::GetDlgItem(m_hWnd,IDC_START),TRUE);
::EnableWindow(::GetDlgItem(m_hWnd,IDC_STOP),FALSE);
}
void CPCL733Dlg::OnClose()
{
// TODO: Add your message handler code here and/or call default
if (m_bStart)
{
MessageBox("The timer is active,stop it before close!","Demo Message",MB_OK|MB_ICONEXCLAMATION);
return;
}
if (m_bEnableDI0)
{
MessageBox("The DI0 Event is enabled,disable it before close!","Demo Message",MB_OK|MB_ICONEXCLAMATION);
return;
}
if (m_bEnableDI16)
{
MessageBox("The DI16 Event is enabled,disable it before close!","Demo Message",MB_OK|MB_ICONEXCLAMATION);
return;
}
CDialog::OnClose();
}
void CPCL733Dlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
USHORT gwValue; // input value
char szBuf[10];
if (nIDEvent == IDM_TIMER1)
{
m_ptDioReadPortByte.port = m_uPort;
m_ptDioReadPortByte.value = (USHORT far *)&gwValue;
if ((m_nErrCode = DRV_DioReadPortByte(m_hDriverHandle,
(LPT_DioReadPortByte)&m_ptDioReadPortByte)) != 0)
{
DRV_GetErrorMessage(m_nErrCode,(LPSTR)m_szErrMsg);
KillTimer( IDM_TIMER1 );
MessageBox((LPCSTR)m_szErrMsg, "Driver Message", MB_OK);
OnStop();
}
else
{
sprintf( szBuf, "%02X", gwValue );
m_ctlData.SetWindowText( (LPCTSTR)szBuf );
}
}
CDialog::OnTimer(nIDEvent);
}
void CPCL733Dlg::OnEnableDI0()
{
// TODO: Add your control notification handler code here
PT_EnableEvent EventSetting;
if(!UpdateData(TRUE))
return;
EventSetting.Enabled = TRUE;
EventSetting.Count = m_nEventCountDI0;
EventSetting.EventType = ADS_EVT_INTERRUPT_DI0;
m_nErrCode = DRV_EnableEvent( m_hDriverHandle, &EventSetting );
if ( m_nErrCode != 0)
{
DRV_GetErrorMessage( m_nErrCode, (LPSTR)m_szErrMsg );
MessageBox( (LPCSTR)m_szErrMsg, "Driver Message", MB_OK );
return;
}
m_bEnableDI0 = TRUE;
::EnableWindow(::GetDlgItem(m_hWnd,IDC_ENABLEDI0),FALSE);
::EnableWindow(::GetDlgItem(m_hWnd,IDC_DISABLEDI0),TRUE);
if (m_pThreadObject==NULL)
{
m_pThreadObject=AfxBeginThread(CPCL733Dlg::EventThread,&Context);
}
}
void CPCL733Dlg::OnEnableDI16()
{
// TODO: Add your control notification handler code here
PT_EnableEvent EventSetting;
if(!UpdateData(TRUE))
return;
EventSetting.Enabled = TRUE;
EventSetting.Count = m_nEventCountDI16;
EventSetting.EventType = ADS_EVT_INTERRUPT_DI16;
m_nErrCode = DRV_EnableEvent( m_hDriverHandle, &EventSetting );
if ( m_nErrCode != 0)
{
DRV_GetErrorMessage( m_nErrCode, (LPSTR)m_szErrMsg );
MessageBox( (LPCSTR)m_szErrMsg, "Driver Message", MB_OK );
return;
}
m_bEnableDI16 = TRUE;
::EnableWindow(::GetDlgItem(m_hWnd,IDC_ENABLEDI16),FALSE);
::EnableWindow(::GetDlgItem(m_hWnd,IDC_DISABLEDI16),TRUE);
if (m_pThreadObject==NULL)
{
m_pThreadObject=AfxBeginThread(CPCL733Dlg::EventThread,&Context);
}
}
void CPCL733Dlg::OnDisableDI0()
{
// TODO: Add your control notification handler code here
PT_EnableEvent EventSetting;
m_bEnableDI0 = FALSE;
if(!m_bEnableDI16) m_pThreadObject = NULL;
m_ctlEvtFrqDI0.SetWindowText("0");
EventSetting.Enabled = FALSE;
EventSetting.Count = m_nEventCountDI0;
EventSetting.EventType = ADS_EVT_INTERRUPT_DI0;
m_nErrCode = DRV_EnableEvent( m_hDriverHandle, &EventSetting );
if ( m_nErrCode != 0)
{
DRV_GetErrorMessage( m_nErrCode, (LPSTR)m_szErrMsg );
MessageBox( (LPCSTR)m_szErrMsg, "Driver Message", MB_OK );
return;
}
::EnableWindow(::GetDlgItem(m_hWnd,IDC_ENABLEDI0),TRUE);
::EnableWindow(::GetDlgItem(m_hWnd,IDC_DISABLEDI0),FALSE);
}
void CPCL733Dlg::OnDisableDI16()
{
// TODO: Add your control notification handler code here
PT_EnableEvent EventSetting;
m_bEnableDI16 = FALSE;
if(!m_bEnableDI0) m_pThreadObject = NULL;
m_ctlEvtFrqDI16.SetWindowText("0");
EventSetting.Enabled = FALSE;
EventSetting.Count = m_nEventCountDI16;
EventSetting.EventType = ADS_EVT_INTERRUPT_DI16;
m_nErrCode = DRV_EnableEvent( m_hDriverHandle, &EventSetting );
if ( m_nErrCode != 0)
{
DRV_GetErrorMessage( m_nErrCode, (LPSTR)m_szErrMsg );
MessageBox( (LPCSTR)m_szErrMsg, "Driver Message", MB_OK );
return;
}
::EnableWindow(::GetDlgItem(m_hWnd,IDC_ENABLEDI16),TRUE);
::EnableWindow(::GetDlgItem(m_hWnd,IDC_DISABLEDI16),FALSE);
}
UINT CPCL733Dlg::EventThread(PVOID pContext)
{
PT_ThreadArg *ptTArg=(PT_ThreadArg *)pContext;
CPCL733Dlg * pDlg=ptTArg->pDlg;
UCHAR szBuf[256];
DWORD dwCurrentTime,dwTime;
DWORD EventCount_DI[2];
double ratio_DI[2];
USHORT usEventType;
ULONG ErrCde;
PT_CheckEvent ptCheckEvent;
EventCount_DI[0]=0;
EventCount_DI[1]=0;
ptCheckEvent.EventType=&usEventType;
ptCheckEvent.Milliseconds=1000;
pDlg->m_dwStartTime = GetTickCount();
while(pDlg->m_bEnableDI0 || pDlg->m_bEnableDI16)
{
if ( (ErrCde=DRV_CheckEvent( ptTArg->m_lDriverHandle, &ptCheckEvent )) == SUCCESS)
{
if ( *ptCheckEvent.EventType == ADS_EVT_INTERRUPT_DI0 )
{
EventCount_DI[0]++;
}
if ( *ptCheckEvent.EventType == ADS_EVT_INTERRUPT_DI16 )
{
EventCount_DI[1]++;
}
}
else
{
if (pDlg->m_bEnableDI0 || pDlg->m_bEnableDI16) {
DRV_GetErrorMessage( ErrCde, (LPSTR)szBuf );
::MessageBox(pDlg->GetSafeHwnd(),(LPCSTR)szBuf, "Driver Message", MB_OK );
pDlg->OnDisableDI0();
pDlg->OnDisableDI16();
return 0;
}
}
dwCurrentTime = GetTickCount();
if ( ( dwTime = dwCurrentTime - pDlg->m_dwStartTime ) >= 1000 )
{
ratio_DI[0] = ((EventCount_DI[0] / (double)dwTime) * 1000.0);
sprintf( (LPSTR)szBuf, "%.3f", ratio_DI[0] );
if(pDlg->m_bEnableDI0)
pDlg->m_ctlEvtFrqDI0.SetWindowText((LPSTR)szBuf);
EventCount_DI[0] = 0;
ratio_DI[1] = ((EventCount_DI[1] / (double)dwTime) * 1000.0);
sprintf( (LPSTR)szBuf, "%.3f", ratio_DI[1] );
if(pDlg->m_bEnableDI16)
pDlg->m_ctlEvtFrqDI16.SetWindowText((LPSTR)szBuf);
EventCount_DI[1] = 0;
pDlg->m_dwStartTime = GetTickCount();
}
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -