joystick手柄驱动

使用xbox手柄

手柄测试:

ls /dev/input #找到一个js0表示支持joystickcat /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 0702sudo 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