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,一经查实,立即删除!

相关文章

什么函数不能声明为虚函数?

常见的不能声明为虚函数的有普通函数&#xff08;非成员函数&#xff09;、静态成员函数、内联成员函数、 构造函数和友元函数。以下将分别对这几种情况进行分析。 普通函数&#xff08;非成员函数&#xff09; 普通函数&#xff08;非成员函数&#xff09;只能overload &…

sql注入详解

ps:简单说下这里只写了我能理解的明白的&#xff0c;后面的二阶注入&#xff0c;堆叠注入没写 手工sql注入 1.存在sql注入本质上就是数据库过滤的不严格或者未进行过滤&#xff0c;1 and 11&#xff0c;返回正常&#xff0c;1 and 12 返回不正常&#xff0c;说明带到数据库里面…

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

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

C51-- 蓝牙,WIFI模块

HC-08蓝牙模块: 蓝牙 -- 最好用的 串口透传 模块 透传 -- 透明传送&#xff0c;指的是在数据传输的过程中&#xff0c;通过无线的方式这组数据不发生任何形式的改变&#xff0c; 仿佛传输过程是透明的&#xff0c;同时保证传输质量&#xff0c;最终原封不动的传送到接收者手…

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 柔性数组存在的意义 柔性数组在编程语言中指的是可以动态调整大小的数组。相比固定大小的数组&#…

Redis中惰性策略的启发和流量包应用设计

引言 在技术领域&#xff0c;许多中间件之所以获得巨大成功&#xff0c;部分原因在于它们所采用的思想之先进。这些思想解决了一个个世纪难题&#xff0c;接下来我将讲述一个我学习到的思想&#xff0c;并将其应用至工作中的案例。 惰性策略在日常编码中随处可见&#xff0c;但…

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.兑换码的需求 要求如…

【DevOps工具篇】安装 LDAP 管理 GUI PhpLdapAdmin

【DevOps工具篇】安装 LDAP 管理 GUI PhpLdapAdmin 目录 【DevOps工具篇】安装 LDAP 管理 GUI PhpLdapAdmin启用远程管理功能安装 phpLDAPadmin对 phpLDAPadmin 进行补丁Apache 的配置编辑配置文件推荐超级课程: Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速…

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

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

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

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

未来的发展趋势-无服务架构-即将到来-让我们欢呼吧

无服务架构&#xff08;Serverless Architecture&#xff09;是一种颠覆性的云计算架构范式&#xff0c;旨在简化应用程序开发和部署过程&#xff0c;提高开发效率和降低成本。在传统的基础设施即服务&#xff08;IaaS&#xff09;和平台即服务&#xff08;PaaS&#xff09;模型…

uni app 扫雷

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

Pytorch实用教程:torch.from_numpy(X_train)和torch.from_numpy(X_train).float()的区别

在PyTorch中&#xff0c;torch.from_numpy()函数和.float()方法被用来从NumPy数组创建张量&#xff0c;并可能改变张量的数据类型。两者之间的区别主要体现在数据类型的转换上&#xff1a; torch.from_numpy(X_train)&#xff1a;这行代码将NumPy数组X_train转换为一个PyTorch张…

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>…

【每日一道算法题】有序数组的平方、长度最小的子数组

文章目录 有序数组的平方写在前面题目思路解析暴力解法双指针法 我的代码暴力解法双指针法 参考答案解法暴力方法双指针法 长度最小的子数组原题思路解析暴力法滑动窗口法 我的代码官方题解滑动窗口法 有序数组的平方 写在前面 本人是一名在java后端寻路的小白&#xff0c;希…

JAV八股--redis

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