基于windows7的usb多点触控设备
前段时间,朋友要做一个windows7的usb多点触控设备,我就帮了个小忙,负责搞定了设备 与PC通信相关的这块。整个项目我做了两个东西,一是下位机的usb设备描述符,一个是上位机的测试软件,下面我会把这两个过程都写一下,跟大家共享!!!
一、下位机部分
我仔细查了不少关于windows7的usb多点触控设备的资料,这里先跟大家共享一下
http://blog.csdn.net/cazicaquw/article/details/6771582
http://blog.csdn.net/yunwen3344/article/details/8107439
http://msdn.microsoft.com/en-us/windows/hardware/gg487437.aspx
http://msdn.microsoft.com/en-us/library/ff553745(v=vs.85).aspx
http://msdn.microsoft.com/library/windows/hardware/jj248722.aspx
http://msdn.microsoft.com/en-us/library/windows/hardware/dn383592.aspx
我主要参考的是微软官方的几个网址,大家多点一下旁边的选项有很多资料在里面,这里并没有全贴出来。
对于这个项目来讲,首先要知道usb的枚举过程以及usb描述符的意义,这个网上有太多的教程了,我也是现学的不敢卖弄,大家可以百度一下。
下面我们讲主要的:
硬件平台: stm32f103ZE
软件平台:keil MDK-ARM 4.70.0.0
为了开发方便我们找了keil官方带的usb工程,在这个工程上修改,减少了不小的工作量。如果大家跟我装同一个版本的话应该都可以找到这个工程。这个工程是一个自定义的HID设备,我们所要做的就是在这个工程基础上,把自定义HID设备的描述符改成多点触控的描述符。
描述符在usbdesc.c这个文件中,我们修改的仅仅是设备描述符,其他的都不用动。直接贴修改后的描述符:
这时候可以打开控制面板 ,并且以图标方式显示, 看是否有 “笔和触摸”这个选项。如下图
在开始菜单的搜索框中输入 “笔和触摸” 看能否搜索出相同的选项。打开这个选项卡,勾上 “在通知区域显示比势图标” 然后确定
这个时候再任务栏的右下角应该可以看到这个图标
此时说明设备已经识别成功了,下面是发送触摸的数据包,
BOOL CTouchDlg::OnTouchInputMove(PTOUCHINPUT pInputs){CDC* pDC = GetDC();pDC->SelectObject(&m_pen);POINT point;point.x=pInputs->x/100;point.y=pInputs->y/100;for(int i=0;i<4;i++){if(m_CurrentPoint[i]==pInputs->dwID){pDC->MoveTo(m_OldPoint[i]);pDC->LineTo(point);m_OldPoint[i]=point;}}ReleaseDC(pDC);return TRUE;}BOOL CTouchDlg::OnTouchInputDown(PTOUCHINPUT pInputs){POINT point;point.x=pInputs->x/100;point.y=pInputs->y/100;for(int i=0;i<4;i++){if((m_nPointNum & (1<<i))==0 ){m_CurrentPoint[i]=pInputs->dwID;//保存当前点的IDm_OldPoint[i]=point;//保存当前点位置m_nPointNum |= (1<<i);//保存点标志break;}}CString str;str.Format("PtFlag:%d %d %d %d %d",m_nPointNum,m_CurrentPoint[0],m_CurrentPoint[1],m_CurrentPoint[2],m_CurrentPoint[3]);this->GetDlgItem(IDC_STATI1_DD)->SetWindowTextA(str);return TRUE;}BOOL CTouchDlg::OnTouchInputUp(PTOUCHINPUT pInputs){for(int i=0;i<4;i++){if(m_CurrentPoint[i]==pInputs->dwID){m_CurrentPoint[i]=0;m_nPointNum &=( ~(1<<i));}}CString str;str.Format("PtFlag:%d %d %d %d %d",m_nPointNum,m_CurrentPoint[0],m_CurrentPoint[1],m_CurrentPoint[2],m_CurrentPoint[3]);this->GetDlgItem(IDC_STATI1_DD)->SetWindowTextA(str);return TRUE;}
到了这里,这个程序已经可以完成最多4点画线,显示多点触摸事件的功能了。