1758di_intdlg.cpp
来自「16 relay output channels and 16 isolated」· C++ 代码 · 共 655 行 · 第 1/2 页
CPP
655 行
// TODO: Add your control notification handler code here
CDISettingDlg dlg;
dlg.DIChanNum = m_DIChanNum;
dlg.DISetting = DIFilterEnable;
dlg.DISettingFlag = FilterEnabled;
if ( IDOK==dlg.DoModal())
{
ULONG ulDataLength = sizeof(ULONG) ;
DRV_DeviceSetProperty( m_DriverHandle, CFG_DiFilterIntervalCounter, &m_FilterCounter, ulDataLength);
ulDataLength = sizeof(BYTE) *16 ;
DRV_DeviceSetProperty( m_DriverHandle, CFG_DiFilterEnableForAll, DIFilterEnable , ulDataLength);
//or
/*
ulDataLength = sizeof(BYTE) ;
for(int i=0;i<16;i++)
DRV_DeviceSetProperty( m_DriverHandle, CFG_DiFilterEnablePort0+i,
&(DIFilterEnable[i]) , ulDataLength);
*/
UpdateData();
SetFilter();
}
}
UINT C1758DI_INTDlg::EventThread(LPVOID ThreadArg)
{
// TODO: Add your control notification handler code here
PT_CheckEvent ptCheckEvent;
PT_FDITransfer ptDITransfer;
USHORT usEventType;
USHORT usDIIntValue[8];
ptCheckEvent.EventType = &usEventType;
ptCheckEvent.Milliseconds = INFINITE;
ptDITransfer.ulRetData = (ULONG *)usDIIntValue;
ptDITransfer.usEventType = ADS_EVT_INTERRUPT;
C1758DI_INTDlg *pDlg= (C1758DI_INTDlg *)ThreadArg;
while ( true )
{
if (DRV_CheckEvent( pDlg->m_DriverHandle, &ptCheckEvent ) == SUCCESS)
{
if ( usEventType == ADS_EVT_DEVICE_CLOSED )
{
break;
}
usEventType -= ADS_EVT_INTERRUPT_DI0;
if( usEventType >= 0 && usEventType < 128 )
{
pDlg->dwEventCount[usEventType]++;
}
}
}
return 0;
}
void C1758DI_INTDlg::OnStopbtn()
{
// TODO: Add your control notification handler code here
for( int i=0; i< 128; i++)
{
if( DIInterruptEnable[ i/8 ] & (1 << (i % 8) ) )
{
m_InterruptList.SetCheck( i, FALSE );
}
}
DWORD dwExitCode;
if(pThreadObject)
{
GetExitCodeThread(pThreadObject->m_hThread, &dwExitCode );
if( dwExitCode == STILL_ACTIVE )
TerminateThread( pThreadObject->m_hThread, dwExitCode );
pThreadObject=NULL;
}
KillTimer( IntTimer );
}
void C1758DI_INTDlg::OnSelectdevice()
{
// TODO: Add your control notification handler code here
UCHAR DeviceName[150];
DWORD dwExitCode;
m_ulDevNum=0;
DRV_SelectDevice( m_hWnd, FALSE, &m_ulDevNum, DeviceName );
m_DeviceName.SetWindowText( (LPCTSTR)DeviceName );
if(pThreadObject)
{
GetExitCodeThread(pThreadObject->m_hThread, &dwExitCode );
if( dwExitCode == STILL_ACTIVE )
TerminateThread( pThreadObject->m_hThread, dwExitCode );
pThreadObject = NULL;
}
if( m_DriverHandle )
DRV_DeviceClose( &m_DriverHandle );
ZeroMemory( DIInterruptEnable, sizeof(BYTE)*16 );
for(int i = 0; i < 128; i++)
dwEventCount[i]=0;
m_ErrCde=DRV_DeviceOpen( m_ulDevNum, &m_DriverHandle );
if( m_ErrCde!=SUCCESS )
{
DRV_GetErrorMessage(m_ErrCde,(LPSTR)m_szErrMsg);
MessageBox((LPCSTR)m_szErrMsg, "Driver Message", MB_OK);
return ;
}
PT_DeviceGetFeatures ptGetFeatures;
ptGetFeatures.buffer = &m_DeviceFeatures;
ptGetFeatures.size = sizeof(DEVFEATURES);
DRV_DeviceGetFeatures( m_DriverHandle, &ptGetFeatures );
m_DIChanNum = m_DeviceFeatures.usMaxDIChl;
ULONG ulDataLength = sizeof(BYTE) *16 ;
DRV_DeviceGetProperty( m_DriverHandle, CFG_DiTriggerEnableRisingForAll, DIRisingTrigger , &ulDataLength);
DRV_DeviceGetProperty( m_DriverHandle, CFG_DiTriggerEnableFallingForAll, DIFallingTrigger ,&ulDataLength);
DRV_DeviceGetProperty( m_DriverHandle, CFG_DiFilterEnableForAll, DIFilterEnable , &ulDataLength );
ulDataLength = sizeof(ULONG) ;
DRV_DeviceGetProperty( m_DriverHandle, CFG_DiFilterIntervalCounter, &m_FilterCounter, &ulDataLength);
CString szTemp;
szTemp.Format( "%g", 10000.0 / (m_FilterCounter* 2.0 ) );
SetDlgItemText( IDC_FILTERTIME, szTemp);
CString sText;
m_InterruptList.DeleteAllItems();
for (int nRow = 0; nRow < m_DIChanNum; nRow++)
{
sText.Format( "P%X_IDI%02d", nRow / 8, nRow % 8 );
m_InterruptList.InsertItem(nRow, sText);
}
m_PortCom.ResetContent();
for ( nRow = 0; nRow < m_DIChanNum / 8; nRow++)
{
sText.Format( "Port %X", nRow );
m_PortCom.AddString(sText);
}
m_PortCom.SetCurSel(0);
SetTrigerMode();
SetFilter();
UpdateData(FALSE);
}
void C1758DI_INTDlg::OnOK()
{
// TODO: Add extra validation here
if( m_DriverHandle )
DRV_DeviceClose( &m_DriverHandle );
CDialog::OnOK();
}
void C1758DI_INTDlg::OnStartScan()
{
// TODO: Add your control notification handler code here
UpdateData();
m_StartScan.EnableWindow(FALSE);
m_StopScan.EnableWindow(TRUE);
SetTimer(ReadTimer,m_dwScanTime,NULL);
}
void C1758DI_INTDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
if( nIDEvent == ReadTimer )
{
USHORT DIValue;
CString str;
PT_DioReadPortByte ptDioReadPortByte;
ptDioReadPortByte.port = m_PortCom.GetCurSel();
ptDioReadPortByte.value = &DIValue;
DRV_DioReadPortByte( m_DriverHandle, &ptDioReadPortByte );
str.Format("%02X", DIValue);
m_ScanData.SetWindowText(str );
}
if( nIDEvent == IntTimer )
{
float ratio;
char szBuf[20];
dwCurrentTime = GetTickCount();
if ((dwTime = dwCurrentTime - dwStartTime) > 1000)
{
dwStartTime = dwCurrentTime;
for(int i = 0; i < 128; i++)
{
ratio = (float)(((float)dwEventCount[i] / (float)dwTime) * 1000.0);
sprintf( szBuf, "%0.1f", ratio );
m_InterruptList.SetItemText( i, 3, szBuf);
dwEventCount[i]=0;
}
}
}
CDialog::OnTimer(nIDEvent);
}
void C1758DI_INTDlg::OnStopScan()
{
// TODO: Add your control notification handler code here
m_StartScan.EnableWindow(TRUE);
m_StopScan.EnableWindow(FALSE);
KillTimer( ReadTimer );
}
BOOL C1758DI_INTDlg::OnCommand(WPARAM wParam, LPARAM lParam)
{
// TODO: Add your specialized code here and/or call the base class
return CDialog::OnCommand(wParam, lParam);
}
void C1758DI_INTDlg::OnChangeFilterCounter()
{
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CDialog::OnInitDialog()
// function and call CRichEditCtrl().SetEventMask()
// with the ENM_CHANGE flag ORed into the mask.
// TODO: Add your control notification handler code here
UpdateData();
CString szTemp;
if( m_FilterCounter > 0)
{
ULONG ulDataLength = sizeof(ULONG) ;
DRV_DeviceSetProperty( m_DriverHandle, CFG_DiFilterIntervalCounter, &m_FilterCounter, ulDataLength);
szTemp.Format( "%g", 10000.0 / (m_FilterCounter *2.0) );
}
else
szTemp.Format( "%g", 0);
SetDlgItemText( IDC_FILTERTIME, szTemp);
}
void C1758DI_INTDlg::OnItemchangedInterruptList(NMHDR* pNMHDR, LRESULT* pResult)
{
HD_NOTIFY *phdn = (HD_NOTIFY *) pNMHDR;
// TODO: Add your control notification handler code here
BOOL bCheck;
USHORT usTemp;
PT_EnableEvent EventSetting;
bCheck = m_InterruptList.GetCheck( phdn->iItem );
if( bCheck )
usTemp = 1;
else
usTemp = 0;
if( ( DIInterruptEnable[phdn->iItem / 8] & (1 << (phdn->iItem % 8) ))
== (usTemp << (phdn->iItem % 8)) )
{
*pResult = 0;
return;
}
if( phdn->iItem >= 0 )
{
EventSetting.EventType = ADS_EVT_INTERRUPT_DI0 + phdn->iItem;
if( bCheck )
{
EventSetting.Enabled = TRUE;
EventSetting.Count = 1;
dwEventCount[phdn->iItem ] =0;
DIInterruptEnable[phdn->iItem / 8] |= 1 << (phdn->iItem % 8);
}
else
{
EventSetting.Enabled = FALSE;
EventSetting.Count = 0;
DIInterruptEnable[phdn->iItem / 8] &= ~(1 << (phdn->iItem % 8));
}
m_ErrCde = DRV_EnableEvent( m_DriverHandle, &EventSetting );
if ( m_ErrCde != 0)
{
DRV_GetErrorMessage( m_ErrCde, (LPSTR)m_szErrMsg );
MessageBox( (LPCSTR)m_szErrMsg, "Driver Message", MB_OK );
return;
}
if( pThreadObject == NULL )
{
pThreadObject = AfxBeginThread( C1758DI_INTDlg::EventThread, this,
THREAD_PRIORITY_HIGHEST, 0, 0, NULL );
dwStartTime = GetTickCount();
SetTimer(IntTimer,1000,NULL);
}
usTemp = 0;
for( int i=0; i<16; i++)
usTemp |=DIInterruptEnable[i];
DWORD dwExitCode;
if(usTemp == 0 && pThreadObject)
{
GetExitCodeThread(pThreadObject->m_hThread, &dwExitCode );
if( dwExitCode == STILL_ACTIVE )
TerminateThread( pThreadObject->m_hThread, dwExitCode );
pThreadObject=NULL;
}
}
*pResult = 0;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?