ngswfx

ngswfx

1个粉丝

55

问答

1

专栏

40

资料

ngswfx  发布于  2016-06-23 21:18:53
采纳率 0%
55个问答
3840

[已解决]有什么办法,能让QT环境下支持普通USB键盘(本来就支持,呵呵)

 

[i=s] 本帖最后由 ngswfx 于 2016-6-24 06:32 编辑 [/i]

最近做QT应用程序,已经写的差不多了,到了最后收尾的部分代码,需要考虑用户输入的问题了,PC上有usb或者ps2键盘,还有各种中文输入法,程序不用过多关注。

/////在arm上搞,这些就都是问题了,我的想法是,先支持输入英文再说。

暂考虑2种方法,一种是研究看能够使内核直接支持usb键盘(我优先计划用这种,由于USB键盘很便宜,用户配一个也很方便,而且输入速度快,直接一些,如果能支持2无线键盘鼠标,就更方便了),还有一种,是使用虚拟键盘。这个就需要下载各种虚拟键盘的代码,来研究修改了。 而且这种方式,大家都在用,感觉遇到大量输入操作的时候,很不实际,如果第一种方法,失败了,才会考虑。

////////////////// 看了文章:http://blog.sina.com.cn/s/blog_53689eaf01011f7u.html,感觉好像有戏

make menuconfig

Device Drivers--->USB support---->USB HIDBP Keyboard (simple Boot) support //[color=Blue]这个我以前弄kernel见到过类似的,好像已经开了。[/color]

/////////////[color=Blue]我就想先确认一下,根据大家了解到的现状,如果在3536这类海斯芯片上,USB普通键盘能否驱动起来?QT程序是否需要繁杂的接收处理动作。[/color]

//目前进度,内核应该已经支持了,插入usb键盘后,控制台已经提示usb keyboard找到了,而且Num Lock灯可控,供电肯定OK了,然后cat /proc/input/event0 执行后,按键盘上某个健,控制台一堆乱码。看来已经可以认,并且能够输入了。

//打开自己的程序,已经可以通过回车键(由于暂时没了鼠标,只能瞎按),控制打开程序,通过tab控制焦点在某个控件上,看来流程对了。由于板子上的另外一个蓝色口usb好像不一样,没弄对,只有一个usb口可用,估计问题不算大了。

///////////仔细看了一下3536文档 外围设备驱动 操作指南.pdf 这就放心了,应该问题不大。 //////////////////////////////// [color=Blue]目前键盘和鼠标的驱动要和上层结合使用,比如鼠标事件要和上层的 GUI 结合。 对键盘的操作只需要对/dev/input/下的 event 节点读取即可,而鼠标则需要标准的 库支持[/color] ////////[color=Blue]/这里看得人怕怕的,好像还要自己弄程序一样,其实QT已经做好了。[/color]

//////总体计划: 1、实现字符输入,先英文。(暂不考虑虚拟键盘) 2、实现汉字输入。(评估flash空间占用,内存占用问题)

///////////////////遇到的问题,及解决: 1、修改kernel配置,把感觉和USB键盘相关的东西打开了。突然发现鼠标要死不活的,估计在不停复位。约3秒钟,停1秒。多次重启没效果,都一样,开始还怀疑是不是usb外置的hub问题,直接接usb鼠标也不行。没办法,看来kernel配置出了问题。回复成以前备份的,OK了。:lol

[size=6][color=Red]已经搞定,我想多了。[/color][/size]。 ///////////[color=Blue]经过测试,看来这个USB物理键盘还是比较容易实现,总的来说没什么设置,kernel应该是默认就支持了,只要用QT,也默认就支持了,而且还支持USB HUB扩展。下一步找一个usb蓝牙鼠标键盘测试一下,看能否支持。[/color]

这样在实际项目中,方便太多了。

我来回答
回答10个
时间排序
认可量排序

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-06-24 07:58:54
认可0
QT下的USB键盘和鼠标要试一下程序在跑的时候插拔的情况

没搞好的话,会有小惊喜的:lol

ecomsbz

1个粉丝

22

问答

0

专栏

36

资料

ecomsbz 2016-06-24 12:12:00
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=32310&ptid=11721]zhuangweiye 发表于 2016-6-24 07:58[/url]
QT下的USB键盘和鼠标要试一下程序在跑的时候插拔的情况

没搞好的话,会有小惊喜的[/quote]

我们用的没有发现什么惊喜啊?:P

ngswfx

1个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-06-24 20:28:18
认可0
本帖最后由 ngswfx 于 2016-6-25 02:32 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=32310&ptid=11721]zhuangweiye 发表于 2016-6-24 07:58[/url]
QT下的USB键盘和鼠标要试一下程序在跑的时候插拔的情况

没搞好的话,会有小惊喜的[/quote]

我简单测试了一下,还行吧,弄个几次还都能及时认出来,多了还真可能不行。
到时再想处理机制吧。

fayfive

0个粉丝

13

问答

0

专栏

0

资料

fayfive 2016-08-24 17:05:43
认可0
请问怎样能获取键盘的键值和鼠标的位置?就是在控制台写个小程序获取,我知道节点/dev/event0一按键盘会有反应,但是不知道他的数据是怎样,怎样读回来?

kg123456

0个粉丝

14

问答

0

专栏

3

资料

kg123456 2016-08-25 08:31:08
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=36607&ptid=11721]fayfive 发表于 2016-8-24 17:05[/url]
请问怎样能获取键盘的键值和鼠标的位置?就是在控制台写个小程序获取,我知道节点/dev/event0一按键盘会有 ...[/quote]

这个应该去看input子系统吧   看它的讲解差不多就知道事件怎么上报的

ngswfx

1个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-08-25 14:37:31
认可0
本帖最后由 ngswfx 于 2016-8-25 14:41 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=36607&ptid=11721]fayfive 发表于 2016-8-24 17:05[/url]
请问怎样能获取键盘的键值和鼠标的位置?就是在控制台写个小程序获取,我知道节点/dev/event0一按键盘会有 ...[/quote]


直接调用IVComInf_SetMousePosCallBack(bool bStart,void(*_MousePosCallBack)(int nX,int nY,int nButton,int nAction))即可。其中开启bStart=true;关闭就bStart=false;

//底层开启一个独立线程捕获鼠标相对坐标,至少知道动了没,QT程序也捕获过了,所以这个操作和QT无关,仅仅用来自己的程序判断鼠标

//////////鼠标事件捕获,只要存在鼠标,开启了捕获,就会通过回调送出相对坐标数据,用于QT界面使用过着TvWallServer程序使用

MousePosCallBack _MousePosCallBackEx=NULL;
bool                 bUseMouseScan=false;
int                  fdMouse=-1;
void                 *GetMoustInfThread(void *id);
pthread_t          hGetMoustInfThread=0;
void CheckStartGetMousePosThread()
{
        //printf("CheckStartGetMousePosThread IVComInf_CheckMouseIFExist before!\n");
        if(IVComInf_CheckMouseIFExist()){
                if(fdMouse==(-1)){
                        if(IsDirExist("/dev/input"))
                                fdMouse=open("/dev/input/mouse0",O_RDONLY);
                        else
                                fdMouse=open("/dev/mouse0",O_RDONLY);
                }
                if(fdMouse!=-1){
                        //printf("CheckStartGetMousePosThread IVComInf_CheckMouseIFExist ok! fdMouse:%d\n",fdMouse);
                        if(!hGetMoustInfThread){
                                int ret =0;
                                pthread_attr_t attr;
                                ret = pthread_attr_init(&attr);
                                pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);
                                ret = pthread_attr_setstacksize(&attr, 512*1024);
                                        ret=pthread_create(&hGetMoustInfThread,&attr,GetMoustInfThread,NULL);
                                pthread_attr_destroy(&attr);
                        }else{
                                //printf("CheckStartGetMousePosThread hGetMoustInfThread!=0 :%d!\n",hGetMoustInfThread);
                        }
                }
        }else{
                if(fdMouse!=(-1))
                        close(fdMouse);
                fdMouse=-1;
        }
}
void FreeMouseAndThread()
{
        if(hGetMoustInfThread){
                pthread_cancel(hGetMoustInfThread);
                hGetMoustInfThread=0;
        }
        //////////////
        if(fdMouse!=(-1))
                close(fdMouse);
        fdMouse=-1;
}
//////////获取鼠标位置,由于read读取鼠标位置时,如果鼠标没动,会阻塞,必须线程动作
void *GetMoustInfThread(void *id)
{
        printf("CheckStartGetMousePosThread GetMoustInfThread in!\n");
        int         retval=0;
        fd_set  readfds;
        struct timeval tv;
        while(1){
                if(fdMouse==(-1)){
                        //如果鼠标不存在,每隔1秒检查一次
                        usleep(1000000);
                        continue;
                }
                sleep(1);
                tv.tv_sec = 1;
                tv.tv_usec = 0;
                FD_ZERO(&readfds);
                FD_SET(fdMouse, &readfds);
                retval = select(fdMouse+1, &readfds, NULL, NULL, &tv);
                if(retval==0){
                        //printf("Time out!\n");
                        continue;
                }
                if(FD_ISSET(fdMouse,&readfds))
                {
                        char buf[128];
                        if(read(fdMouse, buf, 128) <= 0){//没有移动//终端设备,一次只能读取一行
                                //printf("read fdMouse<0!\n");
                                continue;
                        }
                        //printf("Button type = %d, X = %d, Y = %d, Z = %d\n",(buf[0]&0x07),buf[1],buf[2],buf[3]);
                        /////
                        if(_MousePosCallBackEx)
                                _MousePosCallBackEx(buf[1],buf[2],(buf[0]&0x07),buf[3]);
                }
        }
        pthread_exit(NULL);
        return 0;
}
IV_COM_INF_API bool        __stdcall        IVComInf_SetMousePosCallBack(bool bStart,void(*_MousePosCallBack)(int nX,int nY,int nButton,int nAction))
{
        if(_MousePosCallBack)
                _MousePosCallBackEx=_MousePosCallBack;
        if(bStart){
                bUseMouseScan=true;
                CheckStartGetMousePosThread();
        }else{
                FreeMouseAndThread();
                bUseMouseScan=false;
                _MousePosCallBackEx=NULL;
        }
        return true;
}

cy_ygs

0个粉丝

0

问答

0

专栏

0

资料

cy_ygs 2016-12-26 16:26:34
认可0
好资料,学习了

eddiewu2017

0个粉丝

1

问答

0

专栏

0

资料

eddiewu2017 2018-05-30 11:07:50
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=36646&ptid=11721]ngswfx 发表于 2016-8-25 14:37[/url]
直接调用IVComInf_SetMousePosCallBack(bool bStart,void(*_MousePosCallBack)(int nX,int nY,int nB ...[/quote]

请问有设置键盘事件回调方法吗?

waiwn

0个粉丝

4

问答

0

专栏

1

资料

waiwn 2018-05-30 11:18:16
认可0
先收藏,待后续需要时查询:victory:

ngswfx

1个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-06-24 09:45:12
认可0
多谢提醒,待会我测试一下
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
相关问答
无更多相似问答 去提问
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区