📄 buzz_testdlg.cpp
字号:
// 功能说明: 按钮状态重置。
// 函数原形: 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 + -