linux按键检测结束,关于Linux下按键的检测
寫這篇博客是因為自己想做一個fc模擬器,核心代碼(6502和ppu的模擬代碼)用的原子開發(fā)板的代碼,人家是從pc向單片機移植,我是反過來了,不過因為寫的不錯,用函數(shù)指針代替了switch方法可以學習一下,so就用了它的。
在寫按鍵控制的時候碰到一點點問題,怎么才能獲取按鍵的狀態(tài)。
寫代碼的時候碰到三個問題,一個一個的解決。
1、一般使用read、getchar()都要回車才能執(zhí)行。
經(jīng)過一番百度,http://blog.sina.com.cn/s/blog_7be4196901014dxl.html,這個博客解決了這個問題。
使用termios解決
測試代碼:
#include#include#include#includeint main(){
int fd=0;
struct termios saveterm,nt;
tcgetattr(fd,&saveterm);
nt=saveterm;
nt.c_lflag &=~ECHO;
nt.c_lflag &=~ISIG;
nt.c_lflag &= ~ICANON;
tcsetattr(fd,TCSANOW,&nt);
char buf[10];
while(1){
int num=read(fd,buf,sizeof(buf));
for(int i=0;i
通過這段代碼,我們可以不需要回車就可以讀取按鍵的值了,而且沒有回顯。但是出現(xiàn)了下面的兩個問題。
2、read是阻塞的,只有通過按鍵才能執(zhí)行。
再經(jīng)過一番百度,又找到了,嘿嘿。http://www.cplusplus.me/1088.html
測試代碼:
#include#include#include#includeint main(){
int fd=0;
int flags;
flags=fcntl(fd,F_GETFL);
flags|=O_NONBLOCK;
if(fcntl(fd,F_SETFL,flags)==-1){
exit(1);
}
char buf[10];
while(1){
int num=read(fd,buf,sizeof(buf));
for(int i=0;i當然這段代碼又有了第一份缺陷不過是非阻塞的了。
3、在第一個基礎上,如果一直按下F鍵,則一直顯示f,這時按下J鍵,則開始顯示J,在放開J,這不顯示任何東西了,這不是我想要的,我想要的是放開J之后任然知道F是按下的。
繼續(xù)百度,哈哈,找到了,http://blog.csdn.net/zgrjkflmkyc/article/details/39499521
使用event,這里不添代碼了。這有一個問題就是需要得到鍵盤是哪個event,一般是event1,這個就不多說了;還有就是退出后會將按鍵顯示在控制臺。
最后,滿足我的需求,需要將三段代碼結(jié)合起來。
第一步:初始化。。。
void InitJoy(){
inputfd=open("/dev/input/event1",O_RDWR);
tcgetattr(0,&saveterm);
nt=saveterm;
nt.c_lflag &= ~ECHO;
nt.c_lflag &= ~ISIG;
nt.c_lflag &= ~ICANON;
tcsetattr(0,TCSANOW,&nt);
int flags = fcntl(inputfd,F_GETFL);
flags |= O_NONBLOCK;
if(fcntl(inputfd,F_SETFL,flags)==-1){exit(1);}
flags = fcntl(0,F_GETFL);
flags |= O_NONBLOCK;
if(fcntl(0,F_SETFL,flags)==-1){exit(1);}
Nes_JoyInit();
cout<
下面的函數(shù)是讀取按鍵,更新按鍵的值。這一步重要的是讀兩次一次讀event,一次讀輸入0,這個是必要的要不然程序退出時,會在控制臺出現(xiàn)你剛才輸入過的東西。
void update(int joy,int value,unsigned char code){
if(value==1|value==2)
joypad[joy].value|=code;
else if(value==0)
joypad[joy].value&=(~code);
}
void NES_UpdateJoyValue(){
for(int ii=0;ii<5;ii++){
int num=read(inputfd,&t,sizeof(t));
read(0,buf,sizeof(buf));
if(num==sizeof(t)){
if(t.type==EV_KEY){
switch(t.code){
case 17:break;
case 31:update(0,t.value,0x10);break;
case 30:update(0,t.value,0x40);break;
case 32:update(0,t.value,0x80);break;
case 36:update(0,t.value,0x01);break;//A
case 37:update(0,t.value,0x02);break;//B
case 2: update(0,t.value,0x04);break;//select
case 3: update(0,t.value,0x08);break;//start
case 4:nesruning=0;break;
default:break;
}
}
}
}
}最后只要調(diào)用這個函數(shù)就可以得到想要的東西了
unsigned char NES_GetJoyPadVlaue(int JoyId){
unsigned char value=0;
NES_UpdateJoyValue();
if (JoyId==JOY2){return value;}
value=((joypad[JoyId].value >>joypad[JoyId].index) & 0x01);
joypad[JoyId].index++;
if (joypad[JoyId].index==23){joypad[JoyId].index=0;}
return value;
}
到這里fc輸入就完美的解決了配一張運行中的圖片,在虛擬機里面跑模擬器cpu占20%左右,感覺還行:
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的linux按键检测结束,关于Linux下按键的检测的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: i3wm快捷键
- 下一篇: linux 其他常用命令