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    

树梅派硬件学习_xbox手柄驱动相关推荐

  1. 树梅派学习 21. 串口连接

    树梅派学习 21. 串口连接 接线: 其中6.8.10 是串口的引脚. 1. 执行命令 sudo apt-get update sudo apt-get upgrade sudo reboot 2. ...

  2. python硬件驱动_从零开始:手把手教你安装深度学习操作系统、驱动和各种python库!...

    原标题:从零开始:手把手教你安装深度学习操作系统.驱动和各种python库! 为了研究强化学习,最近购置了一台基于 Ubuntu 和英伟达 GPU 的深度学习机器.尽管目前在网络中能找到一些环境部署指 ...

  3. 如何学习linux设备驱动

    面对不断升级的内核,如何学习linux设备驱动   面对不断升级的linux内核.GNU开发工具.linux环境下的各种图形库,很多linux应用程序开发人员和linux设备驱动开发人员即兴奋,又烦躁 ...

  4. linux硬件开发学习,硬件学习该从何下手

    嵌入式的硬件学习是开始嵌入式的基础,从第一个最简单的流水灯开始,都是从开始读懂硬件原理图开始的,所有首先要有基本的电路知识,然后就是可以先学一下51单片机开发板,学习一下51的单片机基本外围设备有哪些 ...

  5. OpenHarmony学习笔记——I2C驱动0.96OLED屏幕

    文章目录 前言 I2C简介 硬件连接 编程实现 创建代码框架 初始化并复用GPIO 初始化I2C0 初始化OLED 从机地址 OLED初始化配置 功能代码 总结 目录 前言 前面介绍了一些关于在Hi3 ...

  6. 学习使用USB-TTL驱动PN532来读写IC卡

    学习使用USB-TTL驱动PN532来读写IC卡 PN532简介 PN532模块 使用前准备 硬件接线 软件设置 读取数据 写入数据 写入完成 总结 原文链接:https://www.yourcee. ...

  7. STM32L475 硬件SPI+软件SPI驱动ST7789V2

    前言 最近购买了IoT Board 潘多拉开发板来研究,学习使用STM32CubeMX工具配置SPI,然后驱动了TFTLCD.潘多拉开发板的TFTLCD驱动IC是ST7789V2,结合原子哥的TFTL ...

  8. Android(4.2) Sensors 学习——G-sensor,Gyroscope驱动移植

    Android(4.2) Sensors 学习--G-sensor,Gyroscope驱动移植 目录(?)[-] Sensors 种类和功能 G-sensor驱动code G-sensor HAL 注 ...

  9. 探索Linux设备树:硬件描述与驱动程序的桥梁

    目录标题 引言:Linux设备树简介 | Introduction: Linux Device Tree Overview a. 设备树的背景与发展 | Background and Developm ...

最新文章

  1. android根据ip获取域名_android常用工具类 通过域名获取ip
  2. Zabbix 中文乱码解决
  3. 中国自研数据库打破西方垄断:阿里成绩刷新世界尘封9年纪录,性能2倍于第二名...
  4. python--numpy pad函数使用
  5. Android之Only fullscreen opaque activities can request orientation
  6. mybatis学习(30):修改功能
  7. ubuntu jdk tomcat mysql_Ubuntu下JDK+Tomcat+MySql环境的搭建
  8. linux中波浪号代表什么_Linux有什么吸引力,在程序员中如此受欢迎?
  9. Gradle之使用Gradle的命令行
  10. Github copilot: AI协助编程尝试
  11. java cjson_使用cJSON
  12. 【保研】2021南京大学计算机夏令营笔试面试笔记
  13. 一周技术思考(第22期)-编程的基本礼节
  14. 运维的一些日常知识点
  15. 算法小白理解最大流最小割(Maximum flow Minimum cut)问题
  16. 2019新税率计算器
  17. lavarel5.2中多表联查 搜索后分页
  18. Linux 各种压缩、解压命令
  19. Drafting and Revision: Laplacian Pyramid Network for Fast High-Quality Artistic Style Transfer--T Li
  20. Java动态执行代码字符串

热门文章

  1. Unity 草的制作
  2. mysql忘记密码win10_win10 mysql8.0.12 忘记root密码如何重置密码
  3. java SpringBoot 对接支付宝 APP支付 证书模式及非证书模式
  4. 博客图片html代码,【html博客代码】图片羽化代码
  5. 研发人员一些比较重要的能力指标参考
  6. 微信公众号批量打标签的自动化实现方法
  7. Python:次方计算
  8. 带你学C带你飞 | printf函数 | 变量 | 常量和宏定义 | 数据类型 | 取值范围 | 字符串 | 运算符
  9. oracle 如何考试,oracle考试怎么报名
  10. Keil5快速下载支持包