学习了《圈圈教你玩usb 第二版》的第11章,有疑问,想知道,usb触摸屏 单击,双击,右键的 报告怎么实现。
圈圈的代码,主要实现了鼠标的移动。
/********************************************************************
函数功能:产生多点触摸事件。
入口参数:x:x轴坐标数组;y:y轴坐标数组;
s:状态数组,例如是否触摸,是否有效;n:触摸的点数。
返 回:无。
备 注:无。
********************************************************************/
void MultiPointReport(uint16_t *x, uint16_t *y, uint8_t *s, uint8_t n)
{
uint8_t i;
uint8_t ReportBuf[14]; //总共为14字节,第1字节为报告ID。
//第2字节为第一点状态,第3字节为第一点的触摸ID号;
//第4、5字节为第一点x轴,第6、7字节为第一点y轴;
//第8字节为第二点状态,第9字节为第二点的触摸ID号;
//第10、11字节为第二点x轴,第12、13字节为第二点y轴;
//第14字节为当前触摸的点数。我们定义的报告中,每次只能
//发送2个点,如果超过两个点,则另外再增加额外的报告,
//这时额外的报告的触摸点数都要设置为0。
if(n == 0)
return;
if(n > MAX_TOUCH_POINT) //如果超过最大支持的点数,则只发送最多点数
{
n = MAX_TOUCH_POINT;
}
ReportBuf[0] = REPORTID_MTOUCH; //多点报告的报告ID为REPORTID_MTOUCH
for(i = 0; i < n;) //分别发送各个点
{
ReportBuf[1] = s[i]; //状态
ReportBuf[2] = i + 1; //ID号
ReportBuf[3] = x[i] & 0xFF; //X轴低8位
ReportBuf[4] = (x[i] >> 8) & 0xFF; //X轴高8位
ReportBuf[5] = y[i] & 0xFF; //Y轴低8位
ReportBuf[6] = (y[i] >> 8) & 0xFF; //Y轴高8位
if(i == 0) //第一个包
{
ReportBuf[13] = n; //触摸的点数
}
else //其它包,设置为0
{
ReportBuf[13] = 0;
}
i ++;
if(i < n) //还有数据需要发送
{
ReportBuf[7] = s[i]; //状态
ReportBuf[8] = i + 1; //ID号
ReportBuf[9] = x[i] & 0xFF; //X轴低8位
ReportBuf[10] = (x[i] >> 8) & 0xFF; //X轴高8位
ReportBuf[11] = y[i] & 0xFF; //Y轴低8位
ReportBuf[12] = (y[i] >> 8) & 0xFF; //Y轴高8位
i++;
}
else //没有更多的数据需要发送,后面的清0
{
uint8_t j;
for(j = 7; j < 13; j++)
{
ReportBuf[j] = 0;
}
}
//
USBD_TOUCH_SendReport(&USB_Device_dev,ReportBuf,sizeof(ReportBuf));
}
}
|