c++|罗技F310与F710游戏手柄驱动(附C++源码)
文章图片
文章目录
- 一. 简介
- 二. 源码
- 三. 源码下载链接
一. 简介
文章图片
Logitech F310
游戏手柄是Logitech公司生产的双模拟摇杆,动式方向按键游戏手柄。游戏手柄的作用不只是可以用来玩游戏,还可以用于做一些机器人仿真,就比如最近MIT开源的
Mini Cheetah
四足机器人,其中机器人仿真部分用的控制器就是罗技F310游戏手柄。但是其采用的方法是直接调用QT
中的QtGamepad库
操作手柄,对于没有安装QT的人没办法直接调用,为此我写了一份罗技F310的通用驱动,驱动也兼容F710,其他型号的游戏手柄还未测试。代码目前只支持
Linux
,可以实现读取所有遥感和按键的数值,最终效果如下:驱动手柄并将各个按键值打印出来:
使用QT将功能做UI显示:
二. 源码 1. 头文件
Logitech_controller.h :
/*========================= Logitech_controller ==========================*/
/* @fileLogitech_controller.h
* @authorlindongdong
* @brief详情请看Logitech_controller.cpp
*/
/*========================= Logitech_controller ==========================*//* define ----------------------------------------------------------------*/
#ifndef Logitech_DRIVER
#define Logitech_DRIVER/* Includes ---------------------------------------------------------------*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
文章图片
2. 源文件
Logitech_controller.c :
/*========================= Gamepad Control ================================*/
/* Copyright (C) 2021 - ~, SCUT-RobotLab Development Team
* @fileLogitech_controller.cpp
* @authorlindongdong
* @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;
else
break;
}unsigned short btn = buf[1] >> 16;
short val = (short)(buf[1] & 0xffff);
/*Test for button ID*/
//cout<<"0x"<
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;
}
三. 源码下载链接 【c++|罗技F310与F710游戏手柄驱动(附C++源码)】以上例程中的代码如下:
- 罗技遥控手柄驱动测试代码下载链接。
- 基于QT的罗技遥控手柄驱动测试下载链接。
- ubuntu18.04
- Qt5.10.0
- Cmake 3.10.2
推荐阅读
- opencv|opencv C++模板匹配的简单实现
- C语言学习|第十一届蓝桥杯省赛 大学B组 C/C++ 第一场
- c++基础概念笔记
- 牛逼!C++开发的穿越丛林真人游戏,游戏未上线就有百万人气
- C++Primer之|C++Primer之 函数探幽
- c/c++|有感 Visual Studio 2015 RTM 简介 - 八年后回归 Dot Net,终于迎来了 Mvc 时代,盼走了 Web 窗体时代...
- QML基础信息
- C++-类型转换
- MongoDB|MongoDB - 简介
- C++面试题目总结