www.pudn.com > 17551_portion.rar > rwDlg.cpp


// rwDlg.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "rw.h" 
#include "rwDlg.h" 
#include "GPIOCTL.h" 
#include "afxmt.h" 
#include "methoda.h" 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
 
CCriticalSection gCS; 
int count; 
BYTE	value; 
int fcount; 
///////////////////////////////////////////////////////////////////////////// 
// 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() 
 
///////////////////////////////////////////////////////////////////////////// 
// CRwDlg dialog 
 
CRwDlg::CRwDlg(CWnd* pParent /*=NULL*/) 
	: CDialog(CRwDlg::IDD, pParent) 
{ 
	//{{AFX_DATA_INIT(CRwDlg) 
	m_port = 0; 
	m_value = 0; 
	m_bitcount = 0; 
	m_t = 0.0; 
	m_bitvalue = 0; 
	m_f = 0.0; 
	//}}AFX_DATA_INIT 
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); 
} 
 
void CRwDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CRwDlg) 
	DDX_Text(pDX, IDC_port, m_port); 
	DDX_Text(pDX, IDC_value, m_value); 
	DDX_Text(pDX, IDC_EDIT1, m_bitcount); 
	DDX_Text(pDX, IDC_EDIT3, m_t); 
	DDX_Text(pDX, IDC_EDIT4, m_bitvalue); 
	DDX_Text(pDX, IDC_EDIT2, m_f); 
	//}}AFX_DATA_MAP 
} 
 
BEGIN_MESSAGE_MAP(CRwDlg, CDialog) 
	//{{AFX_MSG_MAP(CRwDlg) 
	ON_WM_SYSCOMMAND() 
	ON_WM_PAINT() 
	ON_WM_QUERYDRAGICON() 
	ON_BN_CLICKED(IDC_in, Onin) 
	ON_BN_CLICKED(IDC_out, Onout) 
	ON_BN_CLICKED(IDC_BUTTON3, OnButton3) 
	ON_BN_CLICKED(IDC_BUTTON4, OnButton4) 
	ON_BN_CLICKED(IDC_BUTTON5, OnButton5) 
	ON_BN_CLICKED(IDC_BUTTON1, OnButton1) 
	ON_BN_CLICKED(IDC_BUTTON2, OnButton2) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CRwDlg message handlers 
 
BOOL CRwDlg::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 
	    hndFile = CreateFile( 
                    "\\\\.\\AthDev",           // Open the Device "file" 
                    GENERIC_WRITE|GENERIC_READ, 
                    FILE_SHARE_WRITE|FILE_SHARE_READ, 
                    NULL, 
                    OPEN_EXISTING, 
                    0, 
                    NULL); 
 if (hndFile == INVALID_HANDLE_VALUE)        // Was the device opened? 
 {     CString str("无法打开设备"); 
       AfxMessageBox(str); 
    } 
UpdateData(TRUE); 
          Cmethoda mth; 
		  mth.hndFile=hndFile; 
        mth.IoctlCode = IOCTL_GPD_WRITE_PORT_UCHAR; 
            mth.InputBuffer.CharData = 0; 
             mth.InputBuffer.PortNumber=m_port; 
            mth.DataLength = sizeof(ULONG) + 
                         sizeof(mth.InputBuffer.CharData); 
    mth.IoctlResult = DeviceIoControl( 
                        mth.hndFile,                // Handle to device 
                        mth.IoctlCode,              // IO Control code for Write 
                        &mth.InputBuffer,           // Buffer to driver.  Holds port & data. 
                        mth.DataLength,             // Length of buffer in bytes. 
                        NULL,                   // Buffer from driver.   Not used. 
                        0,                      // Length of buffer in bytes. 
                        &mth.ReturnedLength,        // Bytes placed in outbuf.  Should be 0. 
                        NULL                    // NULL means wait till I/O completes. 
                        ); 
 
UpdateData(FALSE); 
  
	return TRUE;  // return TRUE  unless you set the focus to a control 
 
} 
 
void CRwDlg::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 CRwDlg::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 CRwDlg::OnQueryDragIcon() 
{ 
	return (HCURSOR) m_hIcon; 
} 
 
void CRwDlg::OnOK()  
{ 
	// TODO: Add extra validation here 
	 
	CDialog::OnOK(); 
} 
 
void CRwDlg::OnCancel()  
{ 
	// TODO: Add extra cleanup here 
	    if (!CloseHandle(hndFile))                  // Close the Device "file". 
    { 
       AfxMessageBox("Failed to close device.\n"); 
    } 
	CDialog::OnCancel(); 
} 
 
void CRwDlg::Onin()  
{     
	Cmethoda mth; 
	UpdateData(TRUE); 
    mth.PortNumber=m_port; 
      mth.hndFile=hndFile; 
	  
	 mth.IoctlCode = IOCTL_GPD_READ_PORT_UCHAR; 
             mth.DataLength = sizeof( mth.DataBuffer.CharData); 
   mth.IoctlResult = DeviceIoControl( 
                             mth.hndFile,            // Handle to device 
                             mth.IoctlCode,          // IO Control code for Read 
                            &mth.PortNumber,        // Buffer to driver. 
                            sizeof(mth.PortNumber), // Length of buffer in bytes. 
                            &mth.DataBuffer,        // Buffer from driver. 
                             mth.DataLength,         // Length of buffer in bytes. 
                            &mth.ReturnedLength,    // Bytes placed in DataBuffer. 
                            NULL                // NULL means wait till op. completes. 
                            ); 
                     CString str; 
          gCS.Lock(); 
         value=mth.DataBuffer.CharData; 
		 m_value=value; 
		 gCS.Unlock(); 
UpdateData(FALSE); 
  
	// TODO: Add your control notification handler code here 
	 
} 
 
void CRwDlg::Onout()  
{        UpdateData(TRUE); 
          Cmethoda mth; 
		  mth.hndFile=hndFile; 
        mth.IoctlCode = IOCTL_GPD_WRITE_PORT_UCHAR; 
		 
		gCS.Lock(); 
             value=m_value; 
            mth.InputBuffer.CharData =value; 
			gCS.Unlock(); 
             mth.InputBuffer.PortNumber=m_port; 
            mth.DataLength = sizeof(ULONG) + 
                         sizeof(mth.InputBuffer.CharData); 
    mth.IoctlResult = DeviceIoControl( 
                        mth.hndFile,                // Handle to device 
                        mth.IoctlCode,              // IO Control code for Write 
                        &mth.InputBuffer,           // Buffer to driver.  Holds port & data. 
                        mth.DataLength,             // Length of buffer in bytes. 
                        NULL,                   // Buffer from driver.   Not used. 
                        0,                      // Length of buffer in bytes. 
                        &mth.ReturnedLength,        // Bytes placed in outbuf.  Should be 0. 
                        NULL                    // NULL means wait till I/O completes. 
                        ); 
 
UpdateData(FALSE); 
  
	// TODO: Add your control notification handler code here 
	 
} 
 
VOID CALLBACK timerAPCProc( 
  LPVOID lpArgToCompletionRoutine, 
  DWORD dwTimerLowValue, 
  DWORD dwTimerHighValue            
                          ) 
 { 
           
	         Cmethoda *mth; 
			   
             mth=(Cmethoda *)(lpArgToCompletionRoutine); 
            
                if(count==0) 
				{ 
                         CloseHandle( 
                                  *mth->htimer  // handle to object to close 
                                     ); 
  
		 
		  
				}  
      
		    //CancelWaitableTimer( 
        //  HANDLE hTimer  // handle to a timer object 
                 //);     
}  
 
 
UINT Setfqy(LPVOID pParam) 
{ 
 
 
      CRwDlg * pdlg; 
     pdlg=(CRwDlg *)AfxGetApp()->m_pMainWnd; 
  
	  double fqy; 
 fqy=pdlg->m_f; 
if(fqy>10000||fqy<=0) 
	 { 
	CString str; 
	str="频率不在0到10000Hz之间"; 
		AfxMessageBox(str); 
     	return 0; 
	 }    
    double n; 
    n=(double)(1/(2*fqy));     
 
 
    Cmethoda mth; 
//        mth.htimer=&htimer; 
     mth.IoctlCode = IOCTL_GPD_WRITE_PORT_UCHAR; 
mth.hndFile=pdlg->hndFile; 
          mth.bit=0; 
   mth.DataLength = sizeof(ULONG) + 
                         sizeof(mth.InputBuffer.CharData); 
         gCS.Lock(); 
          mth.m_bitcounta=pdlg->m_bitcount; 
            mth.InputBuffer.PortNumber=pdlg->m_port;    
            gCS.Unlock(); 
LARGE_INTEGER lCnt1,lFr,lCnt2; 
     double f1,f2; 
		 double fTime=0; 
	QueryPerformanceFrequency(&lFr);      //得到计数器的频率 
            
	f2=lFr.QuadPart; 
QueryPerformanceCounter(&lCnt1);   //起始记时 
    while(count==1) 
	{ 
//SwitchToThread();//防止线程占用100%的资源 
	   if(fTime>n) 
	   { 
 QueryPerformanceCounter(&lCnt1);   //起始记时 
           mth.not(&(mth.bit));        
              gCS.Lock(); 
//	AfxMessageBox("lai"); 
               mth.bitTOchar(&value, mth.m_bitcounta,mth.bit); 
              mth.InputBuffer.CharData = value; 
                
           mth.IoctlResult = DeviceIoControl( 
                          mth.hndFile,                // Handle to device 
                           mth.IoctlCode,              // IO Control code for Write 
                        &(mth.InputBuffer),           // Buffer to driver.  Holds port & data. 
                           mth.DataLength,             // Length of buffer in bytes. 
                        NULL,                   // Buffer from driver.   Not used. 
                        0,                      // Length of buffer in bytes. 
                        &(mth.ReturnedLength),        // Bytes placed in outbuf.  Should be 0. 
                        NULL  
						);// NULL means wait till I/O completes. 
                       gCS.Unlock(); 
     
	   } 
	   SwitchToThread(); 
	QueryPerformanceCounter(&lCnt2); 
    SwitchToThread(); 
	f1=lCnt2.QuadPart-lCnt1.QuadPart; 
 
	fTime=(double)(f1/f2);	//fTime就是所用的时间 
         
 
	} 
	pdlg->UpdateData(FALSE); 
	return 0; 
		 
} 
         
 
 
UINT Setbittime(LPVOID pParam) 
{ 
     Cmethoda mth; 
         
     mth.IoctlCode = IOCTL_GPD_WRITE_PORT_UCHAR; 
      CRwDlg * pdlg; 
     pdlg=(CRwDlg *)AfxGetApp()->m_pMainWnd; 
	  
mth.hndFile=pdlg->hndFile; 
           
   mth.DataLength = sizeof(ULONG) + 
                         sizeof(mth.InputBuffer.CharData); 
              
            gCS.Lock(); 
			   
          mth.m_bitcounta=pdlg->m_bitcount; 
            mth.InputBuffer.PortNumber=pdlg->m_port; 
            mth.bit=pdlg->m_bitvalue; 
           gCS.Unlock(); 
			   
   
 
         int icount,icount1; 
		 icount1=0; 
		icount=1; 
 
    double n; 
     
   long n1; 
 
    n=pdlg->m_t; 
	if(n==0) 
	{ 
		CString str1; 
		str1="时间不能为零"; 
		AfxMessageBox(str1); 
		return 0; 
	} 
   n1=(long)(n*1000-1); 
       
		while(icount==1) 
	{ 
     
	                      
              gCS.Lock(); 
			   
            mth.bitTOchar(&value, mth.m_bitcounta,mth.bit); 
            mth.InputBuffer.CharData = value; 
        mth.IoctlResult = DeviceIoControl( 
                        mth.hndFile,                // Handle to device 
                        mth.IoctlCode,              // IO Control code for Write 
                        &mth.InputBuffer,           // Buffer to driver.  Holds port & data. 
                        mth.DataLength,             // Length of buffer in bytes. 
                        NULL,                   // Buffer from driver.   Not used. 
                        0,                      // Length of buffer in bytes. 
                        &mth.ReturnedLength,        // Bytes placed in outbuf.  Should be 0. 
                        NULL                    // NULL means wait till I/O completes. 
                        ); 
                   gCS.Unlock(); 
           
                mth.not(&mth.bit);				 
				Sleep(n1); 
              ++icount1; 
          if(icount1==2) 
	  { 
 	pdlg->UpdateData(FALSE); 
		  break; 
	  }    
	       
	} 
	pdlg->UpdateData(FALSE); 
      return 0; 
} 
 
 
 
void CRwDlg::OnButton3()  
{ 
	UpdateData(TRUE); 
 
	AfxBeginThread(Setbittime, this , THREAD_PRIORITY_HIGHEST);// TODO: Add your control notification handler code here 
	 
 UpdateData(FALSE);	// TODO: Add your control notification handler code here 
	 
} 
 
 
 
void CRwDlg::OnButton4()  
{ 
UpdateData(TRUE); 
	Cmethoda mth; 
 
          mth.m_bitcounta=m_bitcount; 
              mth.bit=m_bitvalue; 
             mth.hndFile=hndFile; 
         mth.bitTOchar(&value, mth.m_bitcounta,mth.bit); 
         mth.IoctlCode = IOCTL_GPD_WRITE_PORT_UCHAR; 
            mth.InputBuffer.CharData = value; 
             mth.InputBuffer.PortNumber=m_port; 
            mth.DataLength = sizeof(ULONG) + 
                         sizeof(mth.InputBuffer.CharData); 
    mth.IoctlResult = DeviceIoControl( 
                        mth.hndFile,                // Handle to device 
                        mth.IoctlCode,              // IO Control code for Write 
                        &mth.InputBuffer,           // Buffer to driver.  Holds port & data. 
                        mth.DataLength,             // Length of buffer in bytes. 
                        NULL,                   // Buffer from driver.   Not used. 
                        0,                      // Length of buffer in bytes. 
                        &mth.ReturnedLength,        // Bytes placed in outbuf.  Should be 0. 
                        NULL                    // NULL means wait till I/O completes. 
                        ); 
 
 UpdateData(FALSE); 
       
	// TODO: Add your control notification handler code here 
		// TODO: Add your control notification handler code here 
	 
} 
 
void CRwDlg::OnButton5()  
{ 
UpdateData(TRUE); 
Cmethoda mth; 
gCS.Lock(); 
m_bitvalue=mth.readbitfromchar(&value, m_bitcount); 
gCS.Unlock(); 
UpdateData(FALSE); 
	// TODO: Add your control notification handler code here 
	 
} 
 
void CRwDlg::OnButton1()  
{ 
UpdateData(TRUE); 
 
	gCS.Lock(); 
	count=1; 
	gCS.Unlock(); 
	AfxBeginThread(Setfqy, this , THREAD_PRIORITY_NORMAL);	// TODO: Add your control notification handler code here 
	 
} 
 
void CRwDlg::OnButton2()  
{ 
	gCS.Lock(); 
	count=0; 
	gCS.Unlock();	 
	 UpdateData(FALSE);	// TODO: Add your control notification handler code here 
	 
}