树梅派硬件学习_xbox手柄驱动

joystick手柄驱动

使用xbox手柄

手柄测试:

ls /dev/input #找到一个js0表示支持joystick

cat /dev/input/js0 | hexdump #实时查看手柄的输出, 十六进制显示
00000a0 8bb4 0051 0000 0702 8ee8 0051 8001 0702
00000b0 8f56 0051 0000 0702 9000 0051 8001 0702
00000c0 9046 0051 0000 0702 9456 0051 7fff 0702


sudo apt-get install joystick #下载手柄驱动

 jstest /dev/input/js0 #测试手柄,相当于上一种16进制的解释
Axes:  0:     0  1:     0  2:-32767  3:     0  4:     0  5:-32767  6:     0  7:     0 Buttons:  0:off  1:off  2:off  3:off  4:off  5:off  6:off  7:off  8:off  9:off 10:off 

代码

#include <stdio.h>  
#include <unistd.h>  
#include <string.h>  
#include <sys/types.h>  
#include <sys/stat.h>  
#include <fcntl.h>  
#include <errno.h>  
#include <linux/input.h>  
#include <linux/joystick.h>  
#include <iostream>

using namespace std;

#define XBOX_TYPE_BUTTON    0x01  
#define XBOX_TYPE_AXIS      0x02  

#define XBOX_BUTTON_A       0x00  
#define XBOX_BUTTON_B       0x01  
#define XBOX_BUTTON_X       0x02  
#define XBOX_BUTTON_Y       0x03  
#define XBOX_BUTTON_LB      0x04  
#define XBOX_BUTTON_RB      0x05  
#define XBOX_BUTTON_START   0x06  
#define XBOX_BUTTON_BACK    0x07  
#define XBOX_BUTTON_HOME    0x08  
#define XBOX_BUTTON_LO      0x09    /* 左摇杆按键 */  
#define XBOX_BUTTON_RO      0x0a    /* 右摇杆按键 */  

#define XBOX_BUTTON_ON      0x01  
#define XBOX_BUTTON_OFF     0x00  

#define XBOX_AXIS_LX        0x00    /* 左摇杆X轴 */  
#define XBOX_AXIS_LY        0x01    /* 左摇杆Y轴 */  
#define XBOX_AXIS_RX        0x03    /* 右摇杆X轴 */  
#define XBOX_AXIS_RY        0x04    /* 右摇杆Y轴 */  
#define XBOX_AXIS_LT        0x02  
#define XBOX_AXIS_RT        0x05  
#define XBOX_AXIS_XX        0x06    /* 方向键X轴 */  
#define XBOX_AXIS_YY        0x07    /* 方向键Y轴 */  

#define XBOX_AXIS_VAL_UP        -32767  
#define XBOX_AXIS_VAL_DOWN      32767  
#define XBOX_AXIS_VAL_LEFT      -32767  
#define XBOX_AXIS_VAL_RIGHT     32767  

#define XBOX_AXIS_VAL_MIN       -32767  
#define XBOX_AXIS_VAL_MAX       32767  
#define XBOX_AXIS_VAL_MID       0x00  

class XBox{
	
private:
	int xbox_fd=0;
	const char* file_name = "/dev/input/js0";

public:
	 struct xbox_map 
	{  
		int     time;  
		int     a;  
		int     b;  
		int     x;  
		int     y;  
		int     lb;  
		int     rb;  
		int     start;  
		int     back;  
		int     home;  
		int     lo;  
		int     ro;  

		int     lx;  
		int     ly;  
		int     rx;  
		int     ry;  
		int     lt;  
		int     rt;  
		int     xx;  
		int     yy;  
	}map;  


public:
	XBox(){
		 this->map = {0};
	}
	~XBox(){}

	int xbox_open()  
	{  
		this->xbox_fd = open(this->file_name, O_RDONLY);  
		if (this->xbox_fd < 0)  
		{  
			perror("open");  
			return -1;  
		}  

		return 1;  
	}  

	int xbox_map_read()  
	{  
		int len, type, number, value;  
		struct js_event js;  

		len = read(this->xbox_fd, &js, sizeof(struct js_event));  
		if (len < 0)  
		{  
			perror("read");  
			return -1;  
		}  

		type = js.type;  
		number = js.number;  
		value = js.value;  

		this->map.time = js.time;  

		if (type == JS_EVENT_BUTTON)  
		{  
			switch (number)  
			{  
				case XBOX_BUTTON_A:  
					this->map.a = value;  
					break;  

				case XBOX_BUTTON_B:  
					this->map.b = value;  
					break;  

				case XBOX_BUTTON_X:  
					this->map.x = value;  
					break;  

				case XBOX_BUTTON_Y:  
					this->map.y = value;  
					break;  

				case XBOX_BUTTON_LB:  
					this->map.lb = value;  
					break;  

				case XBOX_BUTTON_RB:  
					this->map.rb = value;  
					break;  

				case XBOX_BUTTON_START:  
					this->map.start = value;  
					break;  

				case XBOX_BUTTON_BACK:  
					this->map.back = value;  
					break;  

				case XBOX_BUTTON_HOME:  
					this->map.home = value;  
					break;  

				case XBOX_BUTTON_LO:  
					this->map.lo = value;  
					break;  

				case XBOX_BUTTON_RO:  
					this->map.ro = value;  
					break;  

				default:  
					break;  
			}  
		}  
		else if (type == JS_EVENT_AXIS)  
		{  
			switch(number)  
			{  
				case XBOX_AXIS_LX:  
					this->map.lx = value;  
					break;  

				case XBOX_AXIS_LY:  
					this->map.ly = value;  
					break;  

				case XBOX_AXIS_RX:  
					this->map.rx = value;  
					break;  

				case XBOX_AXIS_RY:  
					this->map.ry = value;  
					break;  

				case XBOX_AXIS_LT:  
					this->map.lt = value;  
					break;  

				case XBOX_AXIS_RT:  
					this->map.rt = value;  
					break;  

				case XBOX_AXIS_XX:  
					this->map.xx = value;  
					break;  

				case XBOX_AXIS_YY:  
					this->map.yy = value;  
					break;  

				default:  
					break;  
			}  
		}  
		else  
		{  
			/* Init do nothing */  
		}  

		return len;  
	}  

	void xbox_close()  
	{  
		close(this->xbox_fd);  
		return;  
	}  
	
	

};


int main(void)  
{  
    XBox xbox;  
    int len;


    if( xbox.xbox_open() < 0)  
    {  
		printf("打开文件失败!");
        return -1;  
    }  

    while(1)  
    {  
        len = xbox.xbox_map_read();  
        if (len < 0)  
        {  
            usleep(10*1000);  
            continue;  
        }  
		if(xbox.map.a==1)printf("a\t");
		if(xbox.map.b==1)printf("b\t");
		if(xbox.map.xx<0)printf("left\t");
		if(xbox.map.xx>0)printf("right\t");

        printf("\n");
    }  

    xbox.xbox_close();  
    return 0;  
}  


输出:

#全部为:
Time: 6647560 A:0 B:0 X:0 Y:0 LB:0 RB:0 start:0 back:0 home:0 LO:0 RO:0 XX:0      YY:0      LX:0      LY:0      RX:0      RY:0

输出:
right	
b	right	
right	
a	right	
a	
a	left	
left	


上一篇:使用PySDL2捕捉操纵杆事件


下一篇:Xbox无法进入开发者模式