arm按键处理与qt程序Word下载.docx
- 文档编号:19493131
- 上传时间:2023-01-06
- 格式:DOCX
- 页数:15
- 大小:19.61KB
arm按键处理与qt程序Word下载.docx
《arm按键处理与qt程序Word下载.docx》由会员分享,可在线阅读,更多相关《arm按键处理与qt程序Word下载.docx(15页珍藏版)》请在冰豆网上搜索。
LCDRange*angle;
LCDRange*force;
};
#endif
Gameboard.cpp文件内容如下:
QApplication>
QFont>
QGridLayout>
QHBoxLayout>
QLCDNumber>
QLabel>
QPushButton>
QVBoxLayout>
cannonfield.h"
gameboard.h"
GameBoard:
:
GameBoard(QWidget*parent)
:
QWidget(parent)
if((buttons_fd=:
open(BUTTONS_DEV,O_RDWR))<
0){
qDebug()<
<
"
Erroropening"
BUTTONS_DEV<
buttonsdevice."
;
}else{
Open"
successful."
}
……
getKey=newQTimer(this);
connect(getKey,SIGNAL(timeout()),this,SLOT(getButtonKey()));
newGame();
}
……
voidGameBoard:
getButtonKey(){
intvalue;
intkey_value;
fd_setrds;
intret;
FD_ZERO(&
rds);
FD_SET(buttons_fd,&
ret=select(buttons_fd+1,&
rds,NULL,NULL,NULL);
if(ret<
0){
qDebug("
select"
);
exit(0);
if(ret==0){
Timeout.\n"
}elseif(FD_ISSET(buttons_fd,&
rds)){
ret=read(buttons_fd,&
key_value,sizeof(key_value));
if(ret!
=sizeof(key_value)){
if(errno!
=EAGAIN)
readbuttons\n"
}else{
//qDebug("
Youpressedbuttons%d\n"
key_value);
switch(key_value){
case1:
value=angle->
value();
value=value+1;
angle->
setValue(value);
break;
case2:
value=value-1;
case3:
value=force->
force->
case4:
case5:
fire();
}
该程序运行时需要加载buttons的驱动程序,其设备文件名应当为/dev/buttons
2、使用多线程机制来实现输入/输出
/home/sprife/../example/tutorial/t13_thread项目实现的是使用多线程方法来完成外部输入设备(按键)的操作,其中的renderthread.h与renderthread.cpp文件实现类输入设备(按键)操作的实时监控,当有按键被按下时使用emitsendkey(key_value)来发送信号。
具体代码如下:
QtGui>
math.h>
renderthread.h"
intbuttons_fd;
RenderThread:
RenderThread(QObject*parent)
QThread(parent)
//buttonsdeviceopen
open(DEV_BUTTONS,O_RDWR))<
DEV_BUTTONS<
BUTTONSdevice."
}else
successfull."
~RenderThread()
close(buttons_fd);
voidRenderThread:
run()
forever{
fd_setrds;
FD_ZERO(&
FD_SET(buttons_fd,&
ret=select(buttons_fd+1,&
if(ret<
perror("
exit
(1);
}
if(ret==0){
printf("
}elseif(FD_ISSET(buttons_fd,&
ret=read(buttons_fd,&
key_value,sizeofkey_value);
if(ret!
=sizeofkey_value){
if(errno!
perror("
continue;
}
}
emitsendKey(key_value);
在主线程中通过启动该线程,并将该线程的触发的信号与相应的槽进行连接,完成对按键操作的相应,具体代码在gameboard.cpp文件中,文件的具体内容如下:
......
connect(&
thread,SIGNAL(sendKey(int)),
this,SLOT(readKey(int)));
thread.start();
readKey(intkey_value){
if(cannonField->
gameOver()||cannonField->
isShooting())
return;
switch(key_value){
case1:
value=angle->
value=value+1;
angle->
break;
case2:
value=value-1;
case3:
value=force->
force->
case4:
case5:
fire();
程序的运行需要在程序运行前加载按钮的驱动程序,该驱动程序代码如下:
linux/module.h>
linux/kernel.h>
linux/fs.h>
linux/init.h>
linux/delay.h>
linux/poll.h>
asm/irq.h>
linux/interrupt.h>
linux/irq.h>
asm/uaccess.h>
asm/arch/regs-gpio.h>
asm/hardware.h>
#defineDEVICE_NAME"
buttons"
#defineBUTTON_MAJOR232
structbutton_irq_desc{
intirq;
intpin;
intpin_setting;
intnumber;
char*name;
#if1
staticstructbutton_irq_descbutton_irqs[]={
{IRQ_EINT3,S3C2410_GPF3,S3C2410_GPF3_EINT3,0,"
KEY1"
},/*K1*/
{IRQ_EINT11,S3C2410_GPG3,S3C2410_GPG3_EINT11,1,"
KEY2"
},/*K5*/
{IRQ_EINT9,S3C2410_GPG1,S3C2410_GPG1_EINT9,2,"
KEY3"
},/*K4*/
{IRQ_EINT5,S3C2410_GPF5,S3C2410_GPF5_EINT5,3,"
KEY4"
},/*K3*/
{IRQ_EINT12,S3C2410_GPG4,S3C2410_GPG4_EINT12,4,"
KEY5"
},/*K2*/
staticDECLARE_WAIT_QUEUE_HEAD(button_waitq);
staticirqreturn_tbuttons_interrupt(intirq,void*dev_id)
structbutton_irq_desc*button_irqs=(structbutton_irq_desc*)dev_id;
intup=s3c2410_gpio_getpin(button_irqs->
pin);
if(up)
key_values[button_irqs->
number]=(button_irqs->
number+
1);
else
1)+0x80;
//savenumlabel
key_values[5]=button_irqs->
number;
ev_press=1;
if(up)//modifybylyj
wake_up_interruptible(&
button_waitq);
returnIRQ_RETVAL(IRQ_HANDLED);
staticintqq2440_buttons_open(structinode*inode,structfile*file)
inti;
interr;
for(i=0;
i<
sizeof(button_irqs)/sizeof(button_irqs[0]);
i++){
s3c2410_gpio_cfgpin(button_irqs[i].pin,button_irqs[i].pin_setting);
err=request_irq(button_irqs[i].irq,buttons_interrupt,NULL,
button_irqs[i].name,(void*)&
button_irqs[i]);
set_irq_type(button_irqs[i].irq,IRQT_BOTHEDGE);
if(err)
break;
if(err){
i--;
for(;
i>
=0;
i--){
disable_irq(button_irqs[i].irq);
free_irq(button_irqs[i].irq,(void*)&
return-EBUSY;
return0;
staticintqq2440_buttons_close(structinode*inode,structfile*file)
staticintqq2440_buttons_read(structfile*filp,char__user*buff,
size_tcount,loff_t*offp)
unsignedlongerr;
inti=0;
if(!
ev_press){
if(filp->
f_flags&
O_NONBLOCK)
return-EAGAIN;
wait_event_interruptible(button_waitq,ev_press);
ev_press=0;
err=copy_to_user(buff,(constvoid*)&
(key_values[key_values[5]]),
min(sizeof(key_values),count));
//modifybylyj
memset((void*)key_values,0,sizeof(key_values));
returnerr?
-EFAULT:
min(sizeof(key_values),count);
staticunsignedintqq2440_buttons_poll(
structfile*file,
structpoll_table_struct*wait)
unsignedintmask=0;
poll_wait(file,&
button_waitq,wait);
if(ev_press)
mask|=POLLIN|POLLRDNORM;
returnmask;
staticstructfile_operationsqq2440_buttons_fops={
.owner=THIS_MODULE,
.open=qq2440_buttons_open,
.release=qq2440_buttons_close,
.read=qq2440_buttons_read,
.poll=qq2440_buttons_poll,
staticint__initqq2440_buttons_init(void)
intret;
ret=register_chrdev(BUTTON_MAJOR,DEVICE_NAME,
&
qq2440_buttons_fops);
if(ret<
printk(DEVICE_NAME"
can'
tregistermajornumber\n"
returnret;
initialized\n"
staticvoid__exitqq2440_buttons_exit(void)
unregister_chrdev(BUTTON_MAJOR,DEVICE_NAME);
module_init(qq2440_buttons_init);
module_exit(qq2440_buttons_exit);
MODULE_AUTHOR("
MODULE_DESCRIPTION("
S3C2410/S3C2440BUTTONDriver"
MODULE_LICENSE("
GPL"
在使用该QT程序是应当先加载按钮的驱动程序,加载的设备文件名应当为/dev/buttons。
在程序中指定插件目录,通过QApplication:
addLibraryPath(QString)或者QApplication:
setLibraryPath(QStringList)来设置
比如你把imageformats文件夹拷贝到当前目录下,在main()函数中加1行
QApplication:
addLibraryPath("
./"
QT-embedded-4.5forarm的安装和使用
2009-06-1213:
38:
26|
分类:
技术相关|
标签:
|字号大中小
订阅
以下是详细的安装过程,如果想避免漫长的编译过程,可以下载已经编译安装好的压缩包QtEmbedded-4.5.1-arm.tar.gz,解压缩到/usr/local/Trolltech目录下(若无Trolltech则创建此目录),直接从step3开始。
#tarzxvfQtEmbedded-4.5.1-arm.tar.gz-C/usr/local/Trolltech
完整安装过程:
step1.将qt-embedded-linux-opensource-src-4.5.1.tar.gz拷贝到Linux下,解压缩:
#tarzxvfqt-embedded-linux-opensource-src-4.5.1.tar.gz
#cdqt-embedded-linux-opensource-src-4.5.1
修改qt-embedded-linux-opensource-src-4.5.1/src/gui/embedded/qmouselinuxtp_qws.h,在头文件处加入:
#defineQT_QWS_IPAQ
#defineQT_QWS_IPAQ_RAW
step2.配置选项并安装,也可以下载安装脚本qte_for_arm.sh:
#./configure\
-embeddedarm\
-qt-sql-sqlite\
-plugin-sql-sqlite\
-no-scripttools\
-no-nis\
-exceptions\
-xmlpatterns\
-no-largefile\
-no-libmng\
-no-accessibility\
-depths16\
-nomakedocs\
-maketools\
-makelibs\
-qt-zlib\
-feature-THREAD\
-feature-CONCURRENT\
-feature-SOUND\
-feature-EFFECTS\
-feature-QWS_MULTIPROCESS\
-silent>
log_cfg2>
1
#make&
makeinstall
step3.设置环境变量(两种方法):
仅当前用户有效(其他用户无效):
修改$HOME/.bash_profile,加入:
PATH=/usr/local/Trolltech/QtEmbedded-4.5.1-arm/bin:
$PATH
立即生效:
#source$HOME/.bash_profile
所有用户有效(包括root和普通用户):
修改/etc/profile,加入以下行(一般在最后一行添加):
exportPATH=/usr/local/Trolltech/QtEmbedded-4.5.1-arm/bin:
#source/etc/profile
step4.要移植Qt-embedded到开发板上,需要拷贝的Qte基本库文件、图片插件库和字体文件:
1)QtEm
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- arm 按键 处理 qt 程序