⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 buzz_testdlg.cpp

📁 有关USB接口的HID主机应用软件开发通用例子,值得参考收藏@+@
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// 功能说明: 按钮状态重置。
// 函数原形: ResetBCDEButton
// 输入参数: 无
// 输出参数: 无
// 备    注: 
//===========================================================
void CBuzz_TestDlg::ResetBCDEButton()
{
	for(int i=0;i<4;i++)
		BCDEButton[i].Passed = 0;
	Invalidate(1);
}

//===========================================================
// 功能说明: 等待线程结束。
// 函数原形: OnFinish() 
// 输入参数: 无
// 输出参数: 无
// 备    注: 
//===========================================================
void CBuzz_TestDlg::OnFinish() 
{
	// TODO: Add your control notification handler code here
	if(BuzzReceiveRun)
	{
		BuzzReceiveRun = 0;
		WaitForSingleObject(BuzzReceiveThred->m_hThread,INFINITE);
	}
	DisConnect();
}


//===========================================================
// 功能说明: 打开设备。
// 函数原形: Connect()
// 输入参数: 无
// 输出参数: 无
// 备    注: 
//===========================================================
void CBuzz_TestDlg::Connect()
{
	if(bConnect == 0 && Buzz.Prepare())
	{
		Buzz.RegisterNotificationHandle(GetSafeHwnd()); // 可以注释掉这一行,为什么?
		bConnect = 1;
		ResetButton();
		ResetBCDEButton();
		OnAllLed() ;     // 此处开辟多线程.
		Led[0].Passed = Led[1].Passed = Led[2].Passed = Led[3].Passed = 0;
		BuzzSendData[2] = BuzzSendData[3] = BuzzSendData[4] = BuzzSendData[5] = 0x00;
		//Buzz.SendData(BuzzSendData);
	/*	UCHAR tem[10];
		memcpy(tem,BuzzSendData,8);								
		tem[2] = tem[3]= tem[4]= tem[5]=0;
		Buzz.SendData(tem);
		Invalidate(1);*/
	}
	else if(bConnect == 0 )
	{
		bConnect = 0;
		Prompt = _T("设备没连接                                             ");
//		Prompt = _T("Device not connected!                                             ");
		Invalidate(1);
	}
}

//===========================================================
// 功能说明: 关闭设备。
// 函数原形: DisConnect()
// 输入参数: 无
// 输出参数: 无
// 备    注: 
//===========================================================
void CBuzz_TestDlg::DisConnect()
{
	bConnect = 0;
//		timeKillEvent(TimerID);        //删除定时器事件
//		timeEndPeriod(TimerAccuracy);  //清除定时器分辨率
	KillTimer(1);
	GetDlgItem(IDC_ALL_LED)->EnableWindow(0);
	GetDlgItem(IDC_TEST_LED)->EnableWindow(0);
	GetDlgItem(IDC_TestButton)->EnableWindow(0);
	Prompt = _T("设备没有连接                                             ");
//	Prompt = _T("Device not connected!                                             ");
	Invalidate(1);
	Buzz.Close();
}

//===========================================================
// 功能说明: 退出程序。
// 函数原形: OnCancel()
// 输入参数: 无
// 输出参数: 无
// 备    注: 
//===========================================================
void CBuzz_TestDlg::OnCancel() 
{
	// TODO: Add extra cleanup here
	OnFinish();
	CDialog::OnCancel();
}

//===========================================================
// 功能说明: 在测试LED时,检查并发送相应的数据。
// 函数原形: 由Windows 生成
// 输入参数: 由Windows 生成
// 输出参数: 无
// 备    注: 
//===========================================================
void CBuzz_TestDlg::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	//TRACE("l_button!\r\n");
	if(bConnect == 0)
		return;
	if(iTestMode == AllLedMode)
	{
		for(int i=0;i<4;i++)
			if(Led[i].Pos.PtInRect(point))						//判断是哪个LED,并发送数据
			{
				Led[i].Passed = !Led[i].Passed;
				BuzzSendData[i+2] = Led[i].Passed*LedOn;
				/*CString str;
				str.Format("%d,%d,%d,%d,%d,%d,%d,%d",BuzzSendData[0],BuzzSendData[1],BuzzSendData[2],BuzzSendData[3],
													BuzzSendData[4],BuzzSendData[5],BuzzSendData[6],BuzzSendData[7]);
				AfxMessageBox(str);*/
				int SendResult=Buzz.SendData(BuzzSendData);
			}
	}
	else if ( iTestMode == ButtonMode )				// AllLedMode
	{
		int ptinrect = 0;
		for(int i=0;i<4;i++)
			if(Led[i].Pos.PtInRect(point))						//判断
			{
				ptinrect = 1;
			}
		if( ptinrect )
		{
			if( BuzzSendData[2] && BuzzSendData[3] && BuzzSendData[4] && BuzzSendData[5] )
			{
				Led[0].Passed = Led[1].Passed = Led[2].Passed = Led[3].Passed = 0;
				BuzzSendData[2] = BuzzSendData[3] = BuzzSendData[4] = BuzzSendData[5] = LedOff;
			}
			else
			{
				Led[0].Passed = Led[1].Passed = Led[2].Passed = Led[3].Passed = 1;
				BuzzSendData[2] = BuzzSendData[3] = BuzzSendData[4] = BuzzSendData[5] = LedOn;
			}

			int SendResult=Buzz.SendData(BuzzSendData);
		}
	}
	InvalidateRect(CRect(Led[0].Pos.TopLeft (),Led[3].Pos.BottomRight () ),0);
	CDialog::OnLButtonDown(nFlags, point);
}

void PASCAL TimerCallProc(UINT  TimerID, UINT msg,DWORD dwUser,  DWORD dwa,DWORD dwb)  
//定义定时器事件的调用函数
{
	if(!pDLG->bConnect)
		return;
	if(BuzzSendData[3]==0xff)
	{
		for(int i=0;i<8;i++)								//熄灭所有LED
			BuzzSendData[i] = 0;
	}
	else
	{
		BuzzSendData[2] = BuzzSendData[3] = BuzzSendData[4] = BuzzSendData[5] = 0xff;
	}
	int SendResult=pDLG->Buzz.SendData(BuzzSendData);
	if(SendResult)
	{
		pDLG->DisConnect();
		TRACE("Failed!");
	}

}

//===========================================================
// 功能说明: 开始测试LED。
// 函数原形: 无
// 输入参数: 无
// 输出参数: 无
// 备    注: .,
//===========================================================
void CBuzz_TestDlg::OnTestLed() 
{
	// TODO: Add your control notification handler code here
	if(bConnect == 0)
		return;
	if(BuzzReceiveRun)
	{
		BuzzReceiveRun = 0;
		WaitForSingleObject(BuzzReceiveThred->m_hThread,INFINITE);
	}
	for(int i=0;i<8;i++)								//熄灭所有LED
		BuzzSendData[i] = 0;
	Led[0].Passed = Led[1].Passed = Led[2].Passed = Led[3].Passed = 0;
	int SendResult=Buzz.SendData(BuzzSendData);
//	for(i=0;i<20;i++)									//按钮清0
//		Button[i].Passed = 0;
	Invalidate(1);
	iTestMode = SingleLedMode;	
	Prompt = _T("观察灯的情况                                          ");
//	Prompt = _T("Watch LED status.                                          ");
	//(CButton* )GetDlgItem(IDC_TestButton)->EnableWindow(1);
	(CButton* )GetDlgItem(IDC_TEST_LED)->EnableWindow(0);
	TimeCount = 0;
	SetTimer(1,500,NULL);


/*	pDLG = this;
	TIMECAPS timecaps;
	int TimerResolution;
	//从系统获得关于定时器服务能力的信息,//分辨率不能超出系统许可值(1到16毫秒)
	if (timeGetDevCaps(&timecaps,sizeof(TIMECAPS))==TIMERR_NOERROR)
      TimerAccuracy=min(max(timecaps.wPeriodMin,1),timecaps.wPeriodMax);
    timeBeginPeriod(TimerAccuracy);  
	//设置定时器分辨率
    TimerResolution=10;    //设置定时间隔为1毫秒
   //产生间隔1毫秒,周期执行的定时器事件;启动定时器
    TimerID = timeSetEvent(TimerResolution,TimerAccuracy,
                        &TimerCallProc,1,TIME_PERIODIC);
*/
}

BOOL CBuzz_TestDlg::OnDeviceChange(WPARAM wParam, LPARAM lParam)
{
    PDEV_BROADCAST_HDR broadcastHdr;

	switch (wParam) {
	case DBT_DEVICEARRIVAL:
		broadcastHdr = (PDEV_BROADCAST_HDR) lParam;
        if ( (DBT_DEVTYP_DEVICEINTERFACE == broadcastHdr -> dbch_devicetype))
        {
            PDEV_BROADCAST_DEVICEINTERFACE  broadcastInterface;
            
            broadcastInterface = (PDEV_BROADCAST_DEVICEINTERFACE) lParam;

            //
            // Open the hid device for query access
            //
            
			Connect();
             
	    }
        break;

    case DBT_DEVICEREMOVEPENDING:
    case DBT_DEVICEREMOVECOMPLETE:

        //
        // Do the same steps for DBT_DEVICEREMOVEPENDING and 
        //   DBT_DEVICEREMOVECOMPLETE.  We do not receive the 
        //   remove complete request for a device if it is
        //   disabled or removed via Device Manager.  However,
        //   in that case will receive the remove pending.  
        //   We remove the device from our currently displayed
        //   list of devices and unregister notification.
        //
        broadcastHdr = (PDEV_BROADCAST_HDR) lParam;

        if (DBT_DEVTYP_HANDLE == broadcastHdr -> dbch_devicetype)
        {
            PDEV_BROADCAST_HANDLE broadcastHandle;
            HANDLE                deviceHandle;
            
            broadcastHandle = (PDEV_BROADCAST_HANDLE) lParam;

            //
            // Get the file handle of the device that was removed
            //  from the system
            //
            
            deviceHandle = (HANDLE) broadcastHandle -> dbch_handle;

			if(Buzz.DeviceHandle == deviceHandle)
				DisConnect();

        }

		break;

    case DBT_DEVICEQUERYREMOVE:

        //
        // If this message is received, the device is either
        //  being disabled or removed through device manager.
        //  To properly handle this request, we need to close
        //  the handle to the device.
        //

        broadcastHdr = (PDEV_BROADCAST_HDR) lParam;

        if (DBT_DEVTYP_DEVICEINTERFACE == broadcastHdr -> dbch_devicetype)
        {
            PDEV_BROADCAST_HANDLE broadcastHandle;
            HANDLE                deviceHandle;
            
            broadcastHandle = (PDEV_BROADCAST_HANDLE) lParam;

            //
            // Get the file handle of the device that was removed
            //  from the system
            //
            
            deviceHandle = (HANDLE) broadcastHandle -> dbch_handle;

			DisConnect();

         }
        return TRUE;
	}      
	return FALSE;
}

void CBuzz_TestDlg::OnAllLed() 
{
	// TODO: Add your control notification handler code here
	iTestMode = AllLedMode;
	Prompt = _T("在灯亮时按A键,查看灯的亮度变化                                     ");
//	Prompt = _T("Press A When all led on, watch change of Led light.                                     ");
	GetDlgItem(IDC_ALL_LED)->EnableWindow(0);
	GetDlgItem(IDC_TEST_LED)->EnableWindow(0);
	//GetDlgItem(IDC_TestButton)->EnableWindow(1);
	BuzzReceiveRun = 1;
	BuzzReceiveThred = AfxBeginThread (BuzzReceive,this,THREAD_PRIORITY_TIME_CRITICAL );
	Invalidate(1); 
}

void CBuzz_TestDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	if( !(BuzzSendData[2] || BuzzSendData[3] || BuzzSendData[4] || BuzzSendData[5]) )
	{
		BuzzSendData[2] = 0xff;
	}
	for(int i=2; i<6; i++)
	{
		if(BuzzSendData[i] == 0xff && i<5 )
		{
			BuzzSendData[i] = 0x00;
			BuzzSendData[i+1] = 0xff;
			Led[i-1].Passed = LedOn;
			Led[i-2].Passed = LedOff;
			break;
		}
		if(BuzzSendData[i] == 0xff && i==5 )
		{
			BuzzSendData[i] = 0x00;
			BuzzSendData[2] = 0xff;
			Led[0].Passed = LedOn;
			Led[i-2].Passed = LedOff;
		}
	}
	int SendResult=Buzz.SendData(BuzzSendData);
	InvalidateRect(CRect(Led[0].Pos.TopLeft (),Led[3].Pos.BottomRight () ),0);

	TimeCount++;
	if( TimeCount>8 )
		(CButton* )GetDlgItem(IDC_TestButton)->EnableWindow(1);

	CDialog::OnTimer(nIDEvent);
}

void CBuzz_TestDlg::OnTestButton() 
{
	// TODO: Add your control notification handler code here
	if(bConnect == 0)
		return;
	KillTimer(1);
//	ResetButton();
	Invalidate(1);
	(CButton* )GetDlgItem(IDC_TestButton)->EnableWindow(0);
	iTestMode = ButtonMode;	
	Prompt = _T("单独压下所有按钮,同时压下每组的BCDE按钮                     ");
//	Prompt = _T("Press all the key singly and press BCDE key of each pod                     ");
	BuzzReceiveRun = 1;
	BuzzReceiveThred = AfxBeginThread (BuzzReceive,this,THREAD_PRIORITY_TIME_CRITICAL );
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -