// 7300bint2Dlg.cpp : implementation file // #include "stdafx.h" #include "7300bint2.h" #include "7300bint2Dlg.h" #include "SetupDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #endif int gIntCount; HANDLE ghIntEvent[2]; BOOLEAN gbExitThread; DWORD WINAPI IntThread( LPVOID lpParam ) { while (gbExitThread == FALSE) { if (WaitForSingleObject(ghIntEvent[0], INFINITE) == WAIT_OBJECT_0) { gIntCount++; } } return (DWORD) 0; } // 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() // CMy7300bint2Dlg dialog CMy7300bint2Dlg::CMy7300bint2Dlg(CWnd* pParent /*=NULL*/) : CDialog(CMy7300bint2Dlg::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; ghIntEvent[0] = ghIntEvent[1] = NULL; } void CMy7300bint2Dlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CMy7300bint2Dlg, CDialog) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() //}}AFX_MSG_MAP ON_WM_CTLCOLOR() ON_BN_CLICKED(IDC_BT_SETUP, &CMy7300bint2Dlg::OnBnClickedBtSetup) ON_WM_DESTROY() ON_BN_CLICKED(IDC_BT_TRIGGER, &CMy7300bint2Dlg::OnBnClickedBtTrigger) END_MESSAGE_MAP() // CMy7300bint2Dlg message handlers BOOL CMy7300bint2Dlg::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 CMy7300bint2Dlg::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 CMy7300bint2Dlg::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 CMy7300bint2Dlg::OnQueryDragIcon() { return static_cast(m_hIcon); } HBRUSH CMy7300bint2Dlg::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 CMy7300bint2Dlg::OnBnClickedBtSetup() { // TODO: Add your control notification handler code here CSetupDlg setupDlg; INT_PTR nResponse; CString strTemp; 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_7300A_RevB, 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; if(m_nSampleCount > 32768) { AfxMessageBox( TEXT("Count can be assigned at most 32768") ); return; } if (m_nSampleRate > 15000 ) m_nSampleRate=15000; m_nC2=10000000/(m_nSampleRate); DIO_7300SetInterrupt(m_hCard, 1, 1, ghIntEvent); if(m_hThread == NULL ) { gbExitThread = FALSE; m_hThread = CreateThread( NULL, // default security attributes 0, // use default stack size IntThread, // thread function name NULL, // argument to thread function 0, // use default creation flags NULL); // returns the thread identifier } GetDlgItem(IDC_BT_TRIGGER)->EnableWindow( TRUE ); } else if (nResponse == IDCANCEL) { // TODO: Place code here to handle when the dialog is // dismissed with Cancel } } void CMy7300bint2Dlg::OnDestroy() { CDialog::OnDestroy(); // TODO: Add your message handler code here int i; if( m_hThread != NULL ) { gbExitThread = TRUE; // termnate the IntThread SetEvent( ghIntEvent[0] ); if (WaitForSingleObject(m_hThread, 5000) == WAIT_OBJECT_0) { CloseHandle( m_hThread ); m_hThread = NULL; } } if( m_hCard >= 0 ) { DIO_7300SetInterrupt(m_hCard, 0, 0, ghIntEvent); for (i=0; i<2; i++) { if(ghIntEvent[i]) ResetEvent(ghIntEvent[i]); } Release_Card( m_hCard ); m_hCard = -1; } } void CMy7300bint2Dlg::OnBnClickedBtTrigger() { // TODO: Add your control notification handler code here int i, k; CString strTemp; CString strLine1, strLine2, strLine3, strLine4, strLine5; CTR_Setup(m_hCard, 2, 2, m_nC2, BIN); k=0; i=0; gIntCount = 0; while ( k < m_nSampleCount ) { if (WaitForSingleObject(ghIntEvent[1], 10000)== WAIT_OBJECT_0) { strTemp.Format( TEXT("INT2 Count = %d "), k+1); SetDlgItemText( IDC_STATIC_06, strTemp ); //generate INT1 interrupt signal strTemp.Format( TEXT("INT1 Count = %d "), gIntCount ); SetDlgItemText( IDC_STATIC_05, strTemp ); k++; } else { AfxMessageBox( TEXT("****** It is too long to wait INT2 Event *****") ); break; } } CTR_Setup( m_hCard, 2, RATE_GENERATOR, 0, BIN); }