Bluetooth HID device 鼠标模拟触摸屏以及Android的back,home键的实现

来源:互联网 发布:命令行进入linux mysql 编辑:程序博客网 时间:2024/04/30 18:49

蓝牙HID device Role 可以支持鼠标,键盘,协议栈的部分就不说了,主要是需要input report,output report等的处理.

第一步我们是考虑直接在鼠标这个类型上来模拟触屏的操作,大家都知道,鼠标是报告相对坐标的input设备,而触摸屏是报告绝对坐标的,因此我们必须将从远程屏幕上获得的绝对坐标转为相对坐标.然后组成input report.

hid一个很重要的东西是report descriptor,报告描述符,这个标准可以在USB联盟的网页上找到.

但鼠标一般是短距离连续移动,一般在网上找到的描述符里report size都是8bit,逻辑最大值和最小值是-127到127,可是屏幕的范围就远不止这么大,起先我们考虑的是分段移动,一次移动127,如果总共要移动500,就分成4次连续移动,但是这些input事件从Android手机侧收到之后,从input设备节点读到的事件都对,但到inputreader往上的处理之后就变得很奇怪,在屏幕上无规则的严重偏移.

于是我们进行了如下修改:

   1, 修改HID descriptor, 扩大X,Y的范围到(-4096,4095),将 X和Y的report size扩大为32bit(即4个字节)
   2,扩大report buffer到10 字节,用4个byte存储x坐标,4个byte存储y坐标,这4个byte是由一个32个bit的int型的坐标值拆成4段得到的,存储的时候,低位在 前,高位在后.
   3,发送button up和button down的report的时候,有效位是buffer[0].将buffer[1]~buffer[8]里都填充0.
   4,程序初始化的时候,坐标初始点为屏幕中心,第一次移动是从中心点移动到当前位置,每次移动之后,记录当前位置供下次移动时计算差值.

这样改过之后,基本上单点点击都比较准,但如果快速多次点击的话,还是会出现input节点拿到的事件都对,屏幕显示上的坐标却乱跳的情况.还有待研究.不知道是不是Android对相对坐标支持的局限性,我们也考虑干脆用touchscreen的描述符来做.


模拟home,back键比较简单,这两个按键不是标准键盘按键,需要在描述符里自定义键值,实现要点如下:

在HID descriptor里增加Input report,定义Home和Back的键值,分别是0a 23 02 (即0x0223),0a 24 02(即0x0224), 顺序是back在前,home在后, input report 设定report id =3(数值应该是自定义的,与鼠标和其他键盘的报告id区分开就行) ,单独列出或合并在键盘的那些项目里都可,report size是1bit,count是2,填充6bit的0,拼成一个字节,第一个bit表示back,第二个bit表示home,也就是在report 里,buffer是1byte,back是0x01,home是0x02,如果前面定义home在前,back在后,则home是 0x01,back是0x02.

0 0
原创粉丝点击