// 7296int2Dlg.cpp : implementation file // #include "stdafx.h" #include "7296int2.h" #include "7296int2Dlg.h" #include "SetupDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #endif #define COS_INTERRUPT_MESSAGE _T("COS_INT") #define TIMER_INTERRUPT_MESSAGE _T("TIMER_INT") UINT WM_INT0 = ::RegisterWindowMessage(COS_INTERRUPT_MESSAGE); UINT WM_INT1 = ::RegisterWindowMessage(TIMER_INTERRUPT_MESSAGE); U32 gInBuffer[32768], gOutBuffer[32768]; int gIntCount; HANDLE ghIntEvent[2]; // CAboutDlg dialog used for App About class CAboutDlg : public CDialog { public: CAboutDlg(); // Dialog Data enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support // Implementation protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) END_MESSAGE_MAP() // CMy7296int2Dlg dialog CMy7296int2Dlg::CMy7296int2Dlg(CWnd* pParent /*=NULL*/) : CDialog(CMy7296int2Dlg::IDD, pParent) , m_nCardIdx(-1) , m_nSampleCount(-1) , m_nSampleRate(-1) , m_hCard(-1) , m_hThread(NULL) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); m_nC1=10; m_nC2=10; m_TimerCount = 0; m_COSCount = 0; } void CMy7296int2Dlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CMy7296int2Dlg, CDialog) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_REGISTERED_MESSAGE(WM_INT0, OnCOS0Interrupt) ON_REGISTERED_MESSAGE(WM_INT1, OnTimerInterrupt) //}}AFX_MSG_MAP ON_WM_CTLCOLOR() ON_BN_CLICKED(IDC_BT_SETUP, &CMy7296int2Dlg::OnBnClickedBtSetup) ON_WM_DESTROY() ON_BN_CLICKED(IDC_BT_TRIGGER, &CMy7296int2Dlg::OnBnClickedBtTrigger) END_MESSAGE_MAP() // CMy7296int2Dlg message handlers BOOL CMy7296int2Dlg::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) { BOOL bNameValid; CString strAboutMenu; bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); ASSERT(bNameValid); 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 return TRUE; // return TRUE unless you set the focus to a control } void CMy7296int2Dlg::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 CMy7296int2Dlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, reinterpret_cast(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 function to obtain the cursor to display while the user drags // the minimized window. HCURSOR CMy7296int2Dlg::OnQueryDragIcon() { return static_cast(m_hIcon); } HBRUSH CMy7296int2Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); // TODO: Change any attributes of the DC here if ( pWnd->GetDlgCtrlID() == IDC_STATIC_04 ) pDC->SetTextColor(RGB(255,0,0)); // TODO: Return a different brush if the default is not desired return hbr; } void CMy7296int2Dlg::OnBnClickedBtSetup() { // TODO: Add your control notification handler code here CSetupDlg setupDlg; INT_PTR nResponse; CString strTemp; int i, k; nResponse = setupDlg.DoModal(); if (nResponse == IDOK) { if( m_nCardIdx != setupDlg.m_nCardIdx ) { if( m_hCard != -1 ) { Release_Card( m_hCard ); m_hCard = -1; } m_nCardIdx = setupDlg.m_nCardIdx; } if( m_hCard == -1 ) { if ((m_hCard = Register_Card(PCI_7296, m_nCardIdx)) < 0) { strTemp.Format( TEXT("Register_Card Error = %d"), m_hCard); AfxMessageBox( strTemp ); EndDialog(IDCANCEL); return; } } m_nSampleCount = setupDlg.m_nSampleCount; m_nSampleRate = setupDlg.m_nSampleRate; for ( i=0, k=0; i255) k=0; gInBuffer[i]=0; } gIntCount = 0; DIO_PortConfig(m_hCard, Channel_P1A, INPUT_PORT); DIO_PortConfig(m_hCard, Channel_P2A, OUTPUT_PORT); DIO_PortConfig(m_hCard, Channel_P1C, INPUT_PORT); DIO_PortConfig(m_hCard, Channel_P2C, OUTPUT_PORT); GetDlgItem(IDC_BT_TRIGGER)->EnableWindow( TRUE ); } else if (nResponse == IDCANCEL) { // TODO: Place code here to handle when the dialog is // dismissed with Cancel } } void CMy7296int2Dlg::OnDestroy() { CDialog::OnDestroy(); // TODO: Add your message handler code here int i; if( m_hCard >= 0 ) { DIO_SetDualInterrupt(m_hCard, INT1_DISABLE, INT2_DISABLE, ghIntEvent); for (i=0; i<2; i++) { if(ghIntEvent[i]) ResetEvent(ghIntEvent[i]); } Release_Card( m_hCard ); m_hCard = -1; } } void CMy7296int2Dlg::OnBnClickedBtTrigger() { // TODO: Add your control notification handler code here DIO_INT1_EventMessage (m_hCard, INT1_FP1C0, this->m_hWnd, WM_INT0, NULL); DIO_INT2_EventMessage (m_hCard, INT2_TIMER_COUNTER, this->m_hWnd, WM_INT1, NULL); m_nC2 = 2000000/(m_nSampleRate*m_nC1); CTR_Setup(m_hCard, 1, RATE_GENERATOR, m_nC1, BIN); CTR_Setup(m_hCard, 2, RATE_GENERATOR, m_nC2, BIN); m_TimerCount = 0; m_COSCount = 0; } LRESULT CMy7296int2Dlg::OnCOS0Interrupt(WPARAM wParam, LPARAM lParam) { // do something useful CString strTemp; m_COSCount ++; strTemp.Format( TEXT("INT1 Count = %d "), m_COSCount); SetDlgItemText( IDC_STATIC_05, strTemp ); return (LRESULT) 0; } LRESULT CMy7296int2Dlg::OnTimerInterrupt(WPARAM wParam, LPARAM lParam) { int i; CString strTemp; CString strLine1, strLine2, strLine3, strLine4, strLine5; i=0; // do something useful if( m_TimerCount < m_nSampleCount ) { DO_WritePort( m_hCard, Channel_P2C, 1 ); DO_WritePort (m_hCard, Channel_P2C, 0 ); strTemp.Format( TEXT("INT2 Count = %d "), m_TimerCount); SetDlgItemText( IDC_STATIC_06, strTemp ); DO_WritePort( m_hCard, Channel_P2A, gOutBuffer[m_TimerCount]); DI_ReadPort( m_hCard, Channel_P1A, &(gInBuffer[m_TimerCount]) ); //generate INT1 interrupt signal m_TimerCount++; } else { DIO_INT2_EventMessage ( m_hCard, INT2_DISABLE, this->m_hWnd, NULL, NULL); DIO_INT1_EventMessage ( m_hCard, INT1_DISABLE, this->m_hWnd, NULL, NULL); CTR_Setup( m_hCard, 1, RATE_GENERATOR, 0, BIN); CTR_Setup( m_hCard, 2, RATE_GENERATOR, 0, BIN); GetDlgItem(IDC_STATIC_07)->ShowWindow( SW_SHOW ); strLine1.Empty(); /// clear strLine1 strLine2.Empty(); /// clear strLine2 strLine3.Empty(); /// clear strLine3 strLine4.Empty(); /// clear strLine4 strLine5.Empty(); /// clear strLine5 for ( i=0; i<50 /*m_nSampleCount*/; i++) { strTemp.Format( TEXT("%d, "), gInBuffer[i] ); if(i<10) { strLine1 += strTemp; } if(i>=10 && i<20) { strLine2 += strTemp; } if(i>=20 && i<30) { strLine3 += strTemp; } if (i>=30 && i<40) { strLine4 += strTemp; } if (i>=40 && i<50) { strLine5 += strTemp; } } if( !strLine1.IsEmpty() ) SetDlgItemText( IDC_STATIC_LINE1, strLine1 ); if( !strLine2.IsEmpty() ) SetDlgItemText( IDC_STATIC_LINE2, strLine2 ); if( !strLine3.IsEmpty() ) SetDlgItemText( IDC_STATIC_LINE3, strLine3 ); if( !strLine4.IsEmpty() ) SetDlgItemText( IDC_STATIC_LINE4, strLine4 ); if( !strLine5.IsEmpty() ) SetDlgItemText( IDC_STATIC_LINE5, strLine5 ); } return (LRESULT) 0; }