文章目录

  • 一. 简介
  • 二. 源码
  • 三. 源码下载链接

一. 简介

Logitech F310游戏手柄是Logitech公司生产的双模拟摇杆,动式方向按键游戏手柄。

游戏手柄的作用不只是可以用来玩游戏,还可以用于做一些机器人仿真,就比如最近MIT开源的Mini Cheetah四足机器人,其中机器人仿真部分用的控制器就是罗技F310游戏手柄。但是其采用的方法是直接调用QT中的QtGamepad库操作手柄,对于没有安装QT的人没办法直接调用,为此我写了一份罗技F310的通用驱动,驱动也兼容F710,其他型号的游戏手柄还未测试。

代码目前只支持Linux,可以实现读取所有遥感和按键的数值,最终效果如下:

驱动手柄并将各个按键值打印出来:


使用QT将功能做UI显示:

二. 源码

1. 头文件

Logitech_controller.h :

/*========================= Logitech_controller ==========================*//* @file    Logitech_controller.h* @author  lindongdong* @brief   详情请看Logitech_controller.cpp
*/
/*========================= Logitech_controller ==========================*//* define ----------------------------------------------------------------*/
#ifndef Logitech_DRIVER
#define Logitech_DRIVER/* Includes ---------------------------------------------------------------*/
#include <stdlib.h>
#include <iostream>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <linux/input.h>
#include <string.h>
#include <stdio.h>
#include <map>#define JSKEY_A     0x001
#define JSKEY_B     0x101
#define JSKEY_X     0x201
#define JSKEY_Y     0x301#define JSKEY_LB    0x401
#define JSKEY_RB    0x501
#define JSKEY_BACK  0x601
#define JSKEY_START 0x701
#define JSKEY_HOME  0x801#define JSKEY_LT 0x202
#define JSKEY_RT 0x502#define JSKEY_CROSS_X 0x602
#define JSKEY_CROSS_Y 0x702
#define JSKEY_LEFTSTICK_X 0x002
#define JSKEY_LEFTSTICK_Y 0x102
#define JSKEY_RIGHTSTICK_X 0x302
#define JSKEY_RIGHTSTICK_Y 0x402#define JSKEY_PRESS 0x001
#define JSKEY_RELEASE 0x0    #define JSKEY_CROSS_LOW_VALUE 0xffff8001
#define JSKEY_CROSS_HIGH_VALUE 0x7fff   using namespace std;class Logitech{private:char *dev;ssize_t n;int fd;int buf[2];
public:Logitech(char* device);map<int, int> Keystate_map;int  init();void listen_input();void print_key_state();
};
#endif //Logitech_DRIVER

2. 源文件

Logitech_controller.c :

/*========================= Gamepad Control ================================*//* Copyright (C) 2021 - ~, SCUT-RobotLab Development Team* @file    Logitech_controller.cpp* @author  lindongdong* @brief   罗技遥控器的驱动库,库目前支持罗技遥控器型号:F710、F310。* @note *         - 注意按键值所对应的意义。*         - 当手柄 Mode为黄灯时,左边上下左右按键与左边遥感值互换,按键按下为对应遥感边界值(+-1)*           遥感推至极限为对应按键值。*         - 一般情况下使用非黄灯模式。* @method *         - 1. 手柄驱动路径     : char path[] = "/dev/input/js0";*         - 2. 定义一个遥控器类  : Logitech Logitech(path);*         - 3. 遥控器类初始化    : Logitech.init();*         - 4. 线程中进行数据接受 : Logitech.listen_input();* @warning *         - At least C++11 is required.  *         - Only linux platform is supported for now.
*/
/*========================= Gamepad Control ================================*//* Includes ----------------------------------------------------------------*/
#include "Logitech_controller.h"using namespace std;Logitech::Logitech(char* device)
{dev = device;memset(buf, 0, sizeof buf);
}int Logitech::init()
{fd = open(dev, O_RDONLY);if (fd == -1) {fprintf(stderr, "Cannot open %s: %s.\n", dev, strerror(errno));return EXIT_FAILURE;}/*Key Status*//* 0 is released *//* 1 is press    */Keystate_map[JSKEY_A] =0;Keystate_map[JSKEY_B] =0;Keystate_map[JSKEY_X] =0;Keystate_map[JSKEY_Y] =0;/* 0 is released *//* 1 is press    */Keystate_map[JSKEY_LB] =0;Keystate_map[JSKEY_RB] =0;/* 0 is released *//* 1 is press    */Keystate_map[JSKEY_BACK] =0;Keystate_map[JSKEY_START] =0;Keystate_map[JSKEY_HOME] =0;/*  0 is released *//* -1 is the left or up button is pressed *//*  1 is the right or down button is pressed*/Keystate_map[JSKEY_CROSS_X] =0;Keystate_map[JSKEY_CROSS_Y] =0;/* the result is the value of the key(0~99)*/Keystate_map[JSKEY_LT] =0;Keystate_map[JSKEY_RT] =0;/* the result is the value of the key(-100~100)*/Keystate_map[JSKEY_LEFTSTICK_X] =0;Keystate_map[JSKEY_LEFTSTICK_Y] =0;Keystate_map[JSKEY_RIGHTSTICK_X] =0;Keystate_map[JSKEY_RIGHTSTICK_Y] =0;return 0;
}void Logitech::listen_input()
{while (1) {memset(buf, 0, sizeof buf);n = read(fd, &buf, sizeof buf);n = n / sizeof(int);if (n == (ssize_t)-1) {if (errno == EINTR)continue;elsebreak;}unsigned short btn = buf[1] >> 16;short val = (short)(buf[1] & 0xffff);/*Test for button ID*///cout<<"0x"<<hex<<btn<<endl;if (btn == JSKEY_LT || btn == JSKEY_RT){unsigned short prs_val = val + 32768;val = (unsigned short) (((long)prs_val)*100/65536);Keystate_map[btn]= val;}else if (btn == JSKEY_LEFTSTICK_X || btn == JSKEY_LEFTSTICK_Y ||btn == JSKEY_RIGHTSTICK_X || btn == JSKEY_RIGHTSTICK_Y){/* y-axis reverse */if(btn==JSKEY_LEFTSTICK_Y||btn == JSKEY_RIGHTSTICK_Y){val=(-1)*val;}val = val*100/32767;Keystate_map[btn]= val;}else{switch (val){case JSKEY_PRESS:Keystate_map[btn]=1;break;case JSKEY_RELEASE:Keystate_map[btn]=0;break;case JSKEY_CROSS_LOW_VALUE:Keystate_map[btn]=-1;break;case JSKEY_CROSS_HIGH_VALUE:Keystate_map[btn]=1;break;default:break;}/* y-axis reverse */if(btn==JSKEY_CROSS_Y){Keystate_map[btn]=(-1)*Keystate_map[btn];}}print_key_state();}
}void Logitech::print_key_state()
{cout<<endl;cout<<"JSKEY_A = "<<Keystate_map[JSKEY_A]<<endl;cout<<"JSKEY_B = "<<Keystate_map[JSKEY_B]<<endl;cout<<"JSKEY_X = "<<Keystate_map[JSKEY_X]<<endl;cout<<"JSKEY_Y = "<<Keystate_map[JSKEY_Y]<<endl;cout<<"JSKEY_LB = "<<Keystate_map[JSKEY_LB]<<endl;cout<<"JSKEY_RB = "<<Keystate_map[JSKEY_RB]<<endl;cout<<"JSKEY_BACK = "<<Keystate_map[JSKEY_BACK]<<endl;cout<<"JSKEY_START = "<<Keystate_map[JSKEY_START]<<endl;cout<<"JSKEY_HOME = "<<Keystate_map[JSKEY_HOME]<<endl;cout<<"JSKEY_LT = "<<Keystate_map[JSKEY_LT]<<endl;cout<<"JSKEY_RT = "<<Keystate_map[JSKEY_RT]<<endl;cout<<"JSKEY_CROSS_X = "<<Keystate_map[JSKEY_CROSS_X]<<endl;cout<<"JSKEY_CROSS_Y = "<<Keystate_map[JSKEY_CROSS_Y]<<endl;cout<<"JSKEY_LEFTSTICK_X  = "<<Keystate_map[JSKEY_LEFTSTICK_X] <<"     JSKEY_LEFTSTICK_Y   = "<<Keystate_map[JSKEY_LEFTSTICK_Y]<<endl;cout<<"JSKEY_RIGHTSTICK_X = "<<Keystate_map[JSKEY_RIGHTSTICK_X]<<"     JSKEY_RIGHTSTICK_Y = "<<Keystate_map[JSKEY_RIGHTSTICK_Y]<<endl;
}

3. 测试代码

Logitech_controller_test.cpp :

#include "Logitech_controller.h"using namespace std;int main()
{char path[] = "/dev/input/js0";Logitech gamepad(path);gamepad.init();gamepad.listen_input();return 0;
}

三. 源码下载链接

以上例程中的代码如下:

  1. 罗技遥控手柄驱动测试代码下载链接。
  2. 基于QT的罗技遥控手柄驱动测试下载链接。

开发环境:

  • ubuntu18.04
  • Qt5.10.0
  • Cmake 3.10.2

罗技F310与F710游戏手柄驱动(附C++源码)相关推荐

  1. 实战|Python轻松实现动态网页爬虫(附详细源码)

    用浅显易懂的语言分享爬虫.数据分析及可视化等干货,希望人人都能学到新知识. 项目背景 事情是这样的,前几天我公众号写了篇爬虫入门的实战文章,叫做<实战|手把手教你用Python爬虫(附详细源码) ...

  2. beautifulsoup解析动态页面div未展开_实战|Python轻松实现动态网页爬虫(附详细源码)...

    用浅显易懂的语言分享爬虫.数据分析及可视化等干货,希望人人都能学到新知识.项目背景事情是这样的,前几天我公众号写了篇爬虫入门的实战文章,叫做<实战|手把手教你用Python爬虫(附详细源码)&g ...

  3. 1.Arduino入门项目1-超声波测距仪(附项目源码、库文件、电路图、材料清单等资料)

    1.Arduino入门项目1-超声波测距仪 (项目源码.库文件.电路图.材料清单等可在文末获取) 设计者:STCode(公众号同名) 后台回复:入门项目1 获取完整资料 1.Arduino入门项目1- ...

  4. 13个经典的量化策略涵盖股票期货期权市场(附策略源码)

    原 13个经典的量化策略,涵盖股票.期货.期权市场(附策略源码)https://blog.csdn.net/myquant/article/details/805670021.双均线策略(期货) 2. ...

  5. 知识图谱实战案例完全剖析(附完整源码和数据集)-张子良-专题视频课程

    知识图谱实战案例完全剖析(附完整源码和数据集)-2070人已学习 课程介绍         课程定位:系统学习知识图谱的佳实践: 系统学习:完全覆盖知识建模.图数据库.知识应用和知识获取: 实战指引: ...

  6. 自动发邮件的程序 c语言,5分钟!教你用C语言发送邮件:附送源码+教学!

    5分钟!教你用C语言发送邮件:附送源码+教学!-1.jpg (10.71 KB, 下载次数: 0) 2018-9-3 02:21 上传 关注<一碳科技>,获取更多知识! 前言 相信年夜家都 ...

  7. ASP.NET 3.5 新特性开发向导实践(附项目源码下载)

    ASP.NET 3.5 新特性开发向导实践(附项目源码下载) 本篇文章将演示ASP.NET 3.5 部分新功能.新特性,包括LINQ.ListView控件.LinqDataSource.DataPag ...

  8. github可视化_Cesium数据可视化-仓储调度系统可视化部分(附github源码)

    Cesium数据可视化-仓储调度系统可视化部分 目的 仓储调度系统需要一个可视化展示物资运输实况的界面,需要配合GPS设备发送的位置信息,实时绘制物资运输情况和仓储仓库.因此,使用Cesium可视化该 ...

  9. JavaScript实现唯一路径问题的动态编程方法的算法(附完整源码)

    JavaScript实现唯一路径问题的动态编程方法的算法(附完整源码) dpUniquePaths.js完整源代码 dpUniquePaths.test.js完整源代码 dpUniquePaths.j ...

  10. JavaScript实现唯一路径问题的回溯方法的算法(附完整源码)

    JavaScript实现唯一路径问题的回溯方法的算法(附完整源码) btUniquePaths.js完整源代码 btUniquePaths.test.js完整源代码 btUniquePaths.js完 ...

最新文章

  1. python编写Mysql自动备份脚本
  2. C语言实验——求一个3*3矩阵对角线元素之和
  3. 时频分析:短时傅立叶变换实现(4)
  4. 10.1-控制单元CU的组合逻辑设计
  5. python在windows上的扩展名_python – 如何克服 – 在windows上使用文件名或扩展名失败的pip install ansible...
  6. 从阿里腾讯的大会上得到的启示,来分享一些可视化大屏
  7. python对ip地址排序、对列表进行去重
  8. 2018-2019-2 网络对抗技术 20165322 Exp8 Web基础
  9. matlab中mod(10 3),matlab的rem()和mod()函数
  10. 利用 Python 爬取58同城品牌公寓(附带租房指南)
  11. word在试图打开文件时遇到错误,一种解决办法
  12. origin画图---学习时遇到的画图记录
  13. firefox不能正常下载文件
  14. 不用下载软件,免费将PDF文件缩小的方法分享
  15. qgmt数据,就差白城后面的一个城市有点问题
  16. 年薪35w带12人团队,内推阿里被拒了。。。
  17. BZOJ2407:探险/BZOJ4398:福慧双修-最短路+分治
  18. Java转义字符(转载)
  19. vue/html+qrcode生成付款二维码(前端部分)
  20. Js逆向——捅了【马蜂窝】的ob混淆与加速乐

热门文章

  1. GD32F103与STM32F103的区别 2021.6.2
  2. Java面试基础问题之(一)—— JDK和JRE区别
  3. cs224n课程及NLP相关知识记录
  4. 最清晰的VGG16模型图
  5. 杭州登山地图是谁开发的_浙江新添7个省级运动休闲小镇!杭州这个地方榜上有名!...
  6. 台风怎么看内存颗粒_内存应该怎么选?看完你就知道了。影驰 星曜 DDR4-3000 8G 内存测评(RGB真的强)...
  7. java学习-狼人杀
  8. 软考中级软件设计师--6.UML
  9. UI美化APICLOUD千月影视APP源码
  10. 嵌入式linux开发实战——项目1认识嵌入式系统