Ubuntu joystick 测试手柄 xbox

Ubuntu joystick 测试手柄 xbox

测试使用Ubuntu20.04 测试环境在工控机

安装测试

实际测试使用的手柄是北通阿修罗2pro
兼容xbox

Ubuntu20.04主机

连接手柄或者无线接收器后查看是否已经检测到:

ls /dev/input

找到输入中的 js0 即为手柄输入
在这里插入图片描述

需要安装joystick安装包:

sudo apt install joystick

测试手柄的数据输入:

jstest /dev/input/js0

在这里插入图片描述

测试代码

->>>完整的项目代码:

https://gitee.com/tianxiaohuahua/joystick_code

driver_Xbox_Joystick.cpp

#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 "driver_Xbox_Joystick.h"/* 获得手柄设备输入流 */
int xbox_open(char *file_name)
{int xbox_fd;xbox_fd = open(file_name, O_RDONLY);if (xbox_fd < 0){perror("open");return -1;}return xbox_fd;
}/* 读取手柄数据 */
int xbox_map_read(int xbox_fd, xbox_map_t *map)
{int len, type, number, value;struct js_event js;len = read(xbox_fd, &js, sizeof(struct js_event));if (len < 0){perror("read");return -1;}type = js.type;number = js.number;value = js.value;map->time = js.time;if (type == JS_EVENT_BUTTON){switch (number){case XBOX_BUTTON_A:map->a = value;break;case XBOX_BUTTON_B:map->b = value;break;case XBOX_BUTTON_X:map->x = value;break;case XBOX_BUTTON_Y:map->y = value;break;case XBOX_BUTTON_LB:map->lb = value;break;case XBOX_BUTTON_RB:map->rb = value;break;case XBOX_BUTTON_SELECT:map->select = value;break;case XBOX_BUTTON_START:map->start = value;break;case XBOX_BUTTON_HOME:map->home = value;break;case XBOX_BUTTON_LO:map->lo = value;break;case XBOX_BUTTON_RO:map->ro = value;break;default:break;}}else if (type == JS_EVENT_AXIS){switch(number){case XBOX_AXIS_LX:map->lx = value;break;case XBOX_AXIS_LY:map->ly = value;break;case XBOX_AXIS_RX:map->rx = value;break;case XBOX_AXIS_RY:map->ry = value;break;case XBOX_AXIS_LT:map->lt = value;break;case XBOX_AXIS_RT:map->rt = value;break;case XBOX_AXIS_XX:map->xx = value;break;case XBOX_AXIS_YY:map->yy = value;break;default:break;}}else{/* 若出错 */}return len;
}/* 关闭手柄设备输入流 */ 
void xbox_close(int xbox_fd)
{close(xbox_fd);return;
}int test(void)
{int xbox_fd ;xbox_map_t map;int len, type;int axis_value, button_value;int number_of_axis, number_of_buttons ;memset(&map, 0, sizeof(xbox_map_t));xbox_fd = xbox_open((char*)("/dev/input/js0"));if(xbox_fd < 0){return -1;}while(1){len = xbox_map_read(xbox_fd, &map);if (len < 0){usleep(10*1000);continue;}printf("\rTime:%8d A:%d B:%d X:%d Y:%d LB:%d RB:%d select:%d start:%d lo:%d ro:%d XX:%-6d YY:%-6d LX:%-6d LY:%-6d RX:%-6d RY:%-6d LT:%-6d RT:%-6d",map.time, map.a, map.b, map.x, map.y, map.lb, map.rb, map.select, map.start, map.lo, map.ro,map.xx, map.yy, map.lx, map.ly, map.rx, map.ry, map.lt, map.rt);fflush(stdout);}xbox_close(xbox_fd);return 0;
}JoyStickDriver::JoyStickDriver(){JoyStickInit();
}JoyStickDriver::~JoyStickDriver(){JoyStickClose();
}int JoyStickDriver::JoyStickInit(){JoystickFd = xbox_open((char*)("/dev/input/js0"));if(JoystickFd < 0) {return -1;}return 0;
}int JoyStickDriver::JoyStickRead(xbox_map_t *pMap){return xbox_map_read(JoystickFd, pMap);
}int JoyStickDriver::JoyStickRead(void){return xbox_map_read(JoystickFd, &joystickData);
}int JoyStickDriver::JoyStickClose(){xbox_close(JoystickFd);return 0;
}

driver_Xbox_Joystick.h

#ifndef driver_Xbox_Joystick_H
#define driver_Xbox_Joystick_h/* 手柄面板上所有可控制按键/轴(包括一个时间量) */ 
typedef struct xbox_map
{int     time;int     a;int     b;int     x;int     y;int     lb;int     rb;int     select;int     start;int     home;int     lo;int     ro;int     lx;int     ly;int     rx;int     ry;int     lt;int     rt;int     xx;int     yy;
}xbox_map_t;#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_SELECT  0x06
#define XBOX_BUTTON_START   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       0x00int test(void);class JoyStickDriver {
public:xbox_map_t joystickData;JoyStickDriver(void);~JoyStickDriver(void);int JoyStickInit(void);int JoyStickRead(xbox_map_t *pMap);int JoyStickRead(void);int JoyStickClose();private:int JoystickFd ;};#endif

main.cpp

#include <iostream>
#include "main.h"int main(int argc, char *argv[])
{std::cout << "123" << std::endl;JoyStickDriver  joystick;while(1){int len = joystick.JoyStickRead();if (len < 0){usleep(10*1000);continue;}printf("\rTime:%8d A:%d B:%d X:%d Y:%d LB:%d RB:%d select:%d start:%d lo:%d ro:%d XX:%-6d YY:%-6d LX:%-6d LY:%-6d RX:%-6d RY:%-6d LT:%-6d RT:%-6d",joystick.joystickData.time, joystick.joystickData.a, joystick.joystickData.b, joystick.joystickData.x, joystick.joystickData.y, joystick.joystickData.lb, joystick.joystickData.rb, joystick.joystickData.select, joystick.joystickData.start, joystick.joystickData.lo, joystick.joystickData.ro,joystick.joystickData.xx, joystick.joystickData.yy, joystick.joystickData.lx, joystick.joystickData.ly, joystick.joystickData.rx, joystick.joystickData.ry, joystick.joystickData.lt, joystick.joystickData.rt);fflush(stdout);}return 0;
}

CMakeList.txt

# VERSION需要和本机安装的Cmake对应
cmake_minimum_required(VERSION 3.10.2) # 指定了当前的工程名称,最后输出的可执行文件名称,赋值给了{PROJECT_NAME}变量
project(app) # c++ 11
set(CMAKE_CXX_FLAGS "-std=c++11")# 添加头文件
include_directories(${PROJECT_SOURCE_DIR}/include)
include_directories(${PROJECT_SOURCE_DIR}/include/driver)# 查找指定目录下的所有.cpp与.h文件 并存放到指定变量名{SC_FILES}FILE(GLOB SC_FILES ${PROJECT_SOURCE_DIR}/src/driver/driver_Xbox_Joystick.cpp )#####生成可执行文件
# 使用指定的源文件创建出一个可执行文件,第一个变量必须是可执行文件的名字,后面默认是其他源文件
add_executable(${PROJECT_NAME} ${SC_FILES} ${PROJECT_SOURCE_DIR}/src/main.cpp) 
# 指定链接给定目标和/或其依赖项时要使用的库或标志,链接动态库静态库等

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/786519.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

注意力机制篇 | YOLOv8改进之添加DAT注意力机制

前言:Hello大家好,我是小哥谈。DAT(Vision Transformer with Deformable Attention)是一种引入了可变形注意力机制的视觉Transformer。在训练算法模型的时候,通过引入可变形注意力机制,改进了视觉Transformer的效率和性能,使其在处理复杂的视觉任务时更加高效和准确。�…

css酷炫边框

边框一 .leftClass {background: #000;/* -webkit-animation: twinkling 1s infinite ease-in-out; 1秒钟的开始结束都慢的无限次动画 */ } .leftClass::before {content: "";width: 104%;height: 102%;border-radius: 8px;background-image: linear-gradient(var(…

正则表达式引擎库汇合

1.总览表格 一些正则表达式库的对比 index库名编程语言说明代码示例编译指令1Posix正则C语言是C标准库中用于编译POSIX风格的正则表达式库 posix-re.cgcc posix-re.c 2PCRE库C语言提供类似Perl语言的一个正则表达式引擎库。 一般系统上对应/usr/lib64/libpcre.so这个库文件&am…

柔性数组详细讲解

动态内存函数的使用和综合实践-malloc&#xff0c;free&#xff0c;realloc&#xff0c;calloc-CSDN博客https://blog.csdn.net/Jason_from_China/article/details/137075045 柔性数组存在的意义 柔性数组在编程语言中指的是可以动态调整大小的数组。相比固定大小的数组&#…

STL容器的一些操作(常用的,不全)

目录 string 1.string的一些创建 2.string 的读入和输出&#xff1a; 3.string的一些操作 4.彻底清空string 容器的函数 vector 1.vector的一些创建&#xff1a; 2.vector的一些操作&#xff1a; 3.vector的彻底清空并释放内存&#xff1a; queue 循环队列&#xff1…

兑换码生成算法

兑换码生成算法 兑换码生成算法1.兑换码的需求2.算法分析2.重兑校验算法3.防刷校验算法 3.算法实现 兑换码生成算法 兑换码生成通常涉及在特定场景下为用户提供特定产品或服务的权益或礼品&#xff0c;典型的应用场景包括优惠券、礼品卡、会员权益等。 1.兑换码的需求 要求如…

Pointnet++分类和分割数据集准备和实验复现

5.分类数据集Modelnet40及可视化 Modelnet40分类数据集 原始的modelnet40是off文件&#xff0c;是cad模型 OFF文件是一种用于存储三维对象信息的文件格式&#xff0c;全称为"Object File Format"。它主要用于存储几何体的顶点、边和面信息&#xff0c;以及可能的颜…

面对复杂多变的网络攻击,企业应如何守护网络安全

企业上云&#xff0c;即越来越多的企业把业务和数据&#xff0c;迁移到云端。随着云计算、大数据、物联网、人工智能等技术的发展&#xff0c;用户、应用程序和数据无处不在&#xff0c;企业之间的业务边界逐渐被打破&#xff0c;网络攻击愈演愈烈&#xff0c;手段更为多。 当前…

uni app 扫雷

闲来无聊。做个扫雷玩玩吧&#xff0c;点击打开&#xff0c;长按标记&#xff0c;标记的点击两次或长按取消标记。所有打开结束 <template><view class"page_main"><view class"add_button" style"width: 100vw; margin-bottom: 20r…

Docker容器监控之CAdvisor+InfluxDB+Granfana

介绍&#xff1a;CAdvisor监控收集InfluxDB存储数据Granfana展示图表 目录 1、新建3件套组合的docker-compose.yml 2、查看三个服务容器是否启动 3、浏览cAdvisor收集服务&#xff0c;http://ip:8080/ 4、浏览influxdb存储服务&#xff0c;http://ip:8083/ 5、浏览grafan…

如何利用CSS实现文字滚动效果

1. 使用CSS3的animation属性 CSS3的animation属性可以让元素在一段时间内不停地播放某个动画效果。我们可以利用这个特性来实现文字滚动效果。 我们需要定义一个包含所有需要滚动的文本的容器元素。比如&#xff1a; <div class"scroll-container"><p>…

JAV八股--redis

如何保证Redis和数据库数据一致性 关于异步通知中消息队列和Canal的内容。 redisson实现的分布式锁的主从一致性 明天继续深入看这个系列问题 介绍IO复用模型

【机器学习300问】59、计算图是如何帮助人们理解反向传播的?

在学习神经网络的时候&#xff0c;势必会学到误差反向传播&#xff0c;它对于神经网络的意义极其重大&#xff0c;它是训练多层前馈神经网络的核心算法&#xff0c;也是机器学习和深度学习领域中最为重要的算法之一。要正确理解误差反向传播&#xff0c;不妨借助一个工具——计…

代码随想录算法训练营第24天|理论基础 |77. 组合

理论基础 jia其实在讲解二叉树的时候&#xff0c;就给大家介绍过回溯&#xff0c;这次正式开启回溯算法&#xff0c;大家可以先看视频&#xff0c;对回溯算法有一个整体的了解。 题目链接/文章讲解&#xff1a;代码随想录 视频讲解&#xff1a;带你学透回溯算法&#xff08;理…

深入理解数据结构——堆

前言&#xff1a; 在前面我们已经学习了数据结构的基础操作&#xff1a;顺序表和链表及其相关内容&#xff0c;今天我们来学一点有些难度的知识——数据结构中的二叉树&#xff0c;今天我们先来学习二叉树中堆的知识&#xff0c;这部分内容还是非常有意思的&#xff0c;下面我们…

前端秘法番外篇----学完Web API,前端才能算真正的入门

目录 一.引言 二.元素的获取和事件 1.获取元素 2.各种事件 2.1点击事件 2.2键盘事件 三.获取&修改操作 1.获取修改元素属性 2.修改表单属性 2.1暂停播放键的转换 2.2计数器的实现 2.3全选的实现 3.样式操作 3.1行内样式操作 3.2类名样式操作 四.节点 1.创…

记录Xshell使用ed25519公钥免密链接SSH

试了半天&#xff0c;Xshell好像没办法导入linux生成的ssh公钥,因此需要以下步骤实现免密登录 结论&#xff0c;在linux公钥文件中&#xff0c;将客户端生成的ed25519公钥加上去即可(一个公钥单独一行) 1.使用Linux生成秘钥文件(不需要输入私钥密码passphrase)或者直接创建一…

【Servlet】继承关系以及service方法

文章目录 一、继承关系二、相关方法 一、继承关系 Servlet接口下有一个GenericServlet抽象类。在GenericServlet下有一个子类HttpServlet&#xff0c;它是基于http协议。 继承关系 javax.servlet.Servlet接口​ javax.GenericServlet抽象类​ javax.servlet.http.HttpServ…

生产制造园区数字孪生3D大屏展示提升运营效益

在智慧园区的建设中&#xff0c;3D可视化管理平台成为必不可少的工具&#xff0c;数字孪生公司深圳华锐视点打造的智慧园区3D可视化综合管理平台&#xff0c;致力于将园区的人口、经济、应急服务等各项业务进行3D数字化、网络化处理&#xff0c;从而实现决策支持的优化和管理的…

C++多线程:Atomic原子类与CAS锁详解(十)

1、原子操作的概念 什么是原子操作&#xff1a; 原子被认为是构成物质最小的单位&#xff0c;是不可分割的一个东西。而在程序中原子操作被认为是不可分割的一个步骤或者指令其实我们很简单的程序&#xff0c;在高级语言中被认为是一个步骤的操作&#xff0c;编译成汇编指令之…