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 + -
显示快捷键?