Thrustmaster Hotas Warthog飞行操作杆开发

news2025/1/17 2:57:28

目录

0  摘        要         :简单说一下这篇文章在搞啥

1  背        景         :什么需求以及对开发的背景调查

2  环境配置          :具体需要什么环境,对软件层面的需求

3  硬件测试          :测试遥感器硬件本身好坏以及是否正常连接

4  Debug              :软件debug并放出相关代码

6  后       续          :完结撒花


0摘要

       本文主要介绍了一个简单的demo。在windows下通过DirectInput开发套件读取Thrustmaster Hotas Warthog飞行操作杆数据,要求后续可能会用C++进行更加深入的二次开发。


1背景

        今天上午,同事给我布置了一个任务,让我读取一个遥感的数据,要求后面用C++进行二次开发,看了一下设备,是:A10C疣猪双手摇杆 – Thrustmaster(图马思特)

        首先我去了官网,大致浏览了一番,发现官网没有说到相关素材的。只有适配什么软件啊,说明书啊,没有提到怎么进行二次开发,可惜...... 有幸在CSDN上找到几篇相关的内容,但是都不能直接解决我的二次开发问题,有的虽然有重合,但是需要收费。这里一次放出:

首先是python的,参考博客:Thrustmaster(图马思特) HOTAS Warthog 疣猪杆 读取按钮数据-CSDN博客

然后是介绍如何在Windows下通过Directinput来开发(收费):

Thrustmaster Hotas Warthog/猪杆/疣猪飞行操作杆开发_疣猪摇杆-CSDN博客

还有一个是使用XInput开发的,本人试过了可以使用,但是这个开发工具存在问题,简单的调试可以,但是如果是游戏那种对实时性要求高的就不行了:
Thrustmaster HOTAS Warthog 开发指南-CSDN博客

别人的实例代码:

#include <stdio.h>
#include <windows.h>
#include <mmsystem.h>

#pragma comment(lib,"Winmm.lib")

int main()
{
    UINT inum = joyGetNumDevs();
    printf("%d\n", inum);

    while (getchar() != 'q')
    {
        UINT uJoyID = 0;
        LPJOYINFO pji = new joyinfo_tag;
        joyGetPos(uJoyID, pji);

        printf("pji->wXpos: %d\n", pji->wXpos);
        printf("pji->wYpos: %d\n", pji->wYpos);
        printf("pji->wZpos: %d\n", pji->wZpos);
        printf("pji->wButtons: %d\n", pji->wButtons);

    }
    return 0;
}

2环境配置

        那就麻烦万能的GPT了

我:有一个Thrustmaster hotas warthog摇杆,怎么做二次开发?

ChatGPT 说:

要对Thrustmaster HOTAS Warthog摇杆进行二次开发,可以从以下几个方面入手:

1. 了解设备接口

HOTAS Warthog通常通过USB接口与PC连接,符合HID(Human Interface Device)标准。

可使用HID协议或现成的库读取和控制设备。

2. 开发工具与库

  • DirectInput/XInput:Windows平台上读取输入设备的API。适合处理复杂输入设备。
  • vJoy:虚拟摇杆驱动,适合自定义输入信号。
  • HIDAPI:跨平台库,可直接与HID设备通信。
  • Joystick Gremlin:用于自定义摇杆输入和映射(适合无代码修改)。
  • Python:利用pyvjoy或pyhidapi库开发自定义功能。

3. 固件/硬件层开发

  • HOTAS Warthog固件不可直接修改,但可以通过外接设备(如Arduino或STM32)中转信号,实现高级功能。
  • 如果想进行深度硬件改造,可以拆解摇杆并改装开关或传感器。

4. 软件集成

  • DCS World或Microsoft Flight Simulator等模拟飞行游戏支持自定义插件开发,可与摇杆联动。
  • 使用Lua脚本或SDK对接游戏,实现更复杂的控制逻辑。

5. 案例开发方向

  • 自定义按键映射(复杂组合键、宏命令)。
  • 模拟仪表或开关反馈(LED、震动反馈)。
  • 多设备联动(与脚蹬、推杆、仪表盘集成)。
  • 飞行模拟之外的用途(如工业设备控制、机械臂操控)。

5. 案例开发方向

  • 自定义按键映射(复杂组合键、宏命令)。
  • 模拟仪表或开关反馈(LED、震动反馈)。
  • 多设备联动(与脚蹬、推杆、仪表盘集成)。
  • 飞行模拟之外的用途(如工业设备控制、机械臂操控)。

我的需求是在window下进行C++开发,所以就需要DirectInput/XInput。  后面gpt就对这两种开发工具做了比较,简单来说就是对DirectInput和XInput开发工具进行比较。

您说:

DirectInput/XInput是什么软件?还是第三方库?

ChatGPT 说:

DirectInput和XInput都不是独立的软件或第三方库,而是微软提供的API(应用程序接口),用于在Windows系统上与输入设备(如游戏手柄、摇杆、方向盘)进行交互。

1. DirectInput

简介:DirectInput是微软DirectX的一部分,专门用于与各种输入设备(键盘、鼠标、摇杆、游戏手柄等)交互。

特点:

  • 支持多种设备,尤其是复杂的飞行摇杆和赛车方向盘。
  • 支持多按键、轴、旋钮、力反馈(Force Feedback)。
  • 不支持Xbox 360及更新设备(XInput替代)。
  • 适用场景:适合读取复杂的输入设备,如Thrustmaster HOTAS Warthog这种多轴、多按钮设备。
  • 开发语言支持:C/C++(DirectX SDK),C#(通过SharpDX或SlimDX封装)。

2. XInput

简介:XInput是微软专门为Xbox 360及更新型号的控制器设计的API。

特点:

  • 仅支持Xbox 360、Xbox One等标准手柄。
  • 不支持复杂的摇杆设备和力反馈功能(功能较简化)。
  • 简单易用,适合一般的游戏手柄开发。
  • 适用场景:主要用于开发支持Xbox手柄的PC游戏,不适合HOTAS Warthog这种设备。
  • 开发语言支持:C/C++,也有C#封装(如XInput.NET)。

      然后就是根据这个开发工具进行环境配置与软件部署

您说:

DirectInput怎么用于摇杆做第三方开发?

ChatGPT 说:

使用 DirectInput 与 Thrustmaster HOTAS Warthog 摇杆进行第三方开发,主要涉及设备初始化、输入读取和数据解析等步骤。:

1.开发工具:

  • 推荐使用 Visual Studio(Windows 环境)。
  • C++是DirectInput最常用的开发语言。

2.环境准备:

安装 DirectX SDK(适用于 DirectInput):

https://www.microsoft.com/zh-cn/download/details.aspx?id=8109

安装后,新建Visual Studio项目,并且配置头文件和库文件(这里路径很怪,在:C:\Program Files (x86)\Windows Kits\10\Lib\10.0.16299.0\um\x64目录下)。

链接库:

  • 右键项目 → 属性 → 链接器 → 输入 → 附加依赖项
  • 添加:dinput8.lib; dxguid.lib; d3d8.lib; winmm.lib
  • 注意: 我的该目录下只有 d3d9.lib;
  • 包含目录:
  • C/C++ → 常规 → 附加包含目录 → 添加 DirectX SDK 的 Include 目录。
  • 链接器 → 常规 → 附加库目录 → 添加 DirectX SDK 的 Lib 目录。

3. 注意VS的debug模式是x64

3硬件测试

安装了官网的驱动程序和测试软件,确定硬件方面还有连接是正常的


下载后驱动程序直接安装:

经过硬件测试软件确定硬件还有连接,动遥感(准心在动)还有按钮(亮灯)是没有问题的!:

4Debug

中间花了三个小时与GPT对战,互相debug,在一个阴暗的小角落里面通过手机+电脑飞快的查询问题。其中最严重的bug是获取设备的这个函数报错:

// 获取设备时打印详细错误码
hr = g_pJoystickDevice->Acquire();
if (FAILED(hr)) {
    std::cerr << "设备获取失败! 错误码: " << std::hex << hr << std::endl;
    return false;
}

一直提示没有管理员权限(返回0x80070005):


0x88780096 (DIERR_OTHERAPPHASPRIO):其他程序占用设备。
0x8878000C (DIERR_NOTACQUIRED):设备没有被获取。
0x8878000F (DIERR_INPUTLOST):输入设备丢失,需重新获取。
0x80070005 (E_ACCESSDENIED):权限不足(需要管理员权限)。

后面不知道Gpt给的啥代码,这个问题不提示了。最后的代码见下:
 

#include <windows.h>
#include <dinput.h>
#include <iostream>

#pragma comment(lib, "dinput8.lib")
#pragma comment(lib, "dxguid.lib")

LPDIRECTINPUT8 g_pDirectInput = nullptr;
LPDIRECTINPUTDEVICE8 g_pJoystickDevice = nullptr;

bool InitDirectInput(HINSTANCE hInstance, HWND hWnd) {
    // 初始化 DirectInput
    if (FAILED(DirectInput8Create(hInstance, DIRECTINPUT_VERSION, IID_IDirectInput8, (void**)&g_pDirectInput, NULL))) {
        std::cerr << "DirectInput 初始化失败!" << std::endl;
        return false;
    }

    // 创建设备(默认获取第一个手柄)
    if (FAILED(g_pDirectInput->CreateDevice(GUID_Joystick, &g_pJoystickDevice, NULL))) {
        std::cerr << "无法创建摇杆设备!" << std::endl;
        return false;
    }

    // 设置数据格式
    if (FAILED(g_pJoystickDevice->SetDataFormat(&c_dfDIJoystick))) {
        std::cerr << "设置数据格式失败!" << std::endl;
        return false;
    }

    // 设置后台非独占模式
    if (FAILED(g_pJoystickDevice->SetCooperativeLevel(hWnd, DISCL_NONEXCLUSIVE | DISCL_BACKGROUND))) {
        std::cerr << "设置协作级别失败!" << std::endl;
        return false;
    }

    // 获取设备控制权
    if (FAILED(g_pJoystickDevice->Acquire())) {
        std::cerr << "设备获取失败!" << std::endl;
        return false;
    }

    std::cout << "DirectInput 初始化成功,正在监听摇杆输入..." << std::endl;
    return true;
}

void ReadJoystickState() {
    DIJOYSTATE js;
    HRESULT hr = g_pJoystickDevice->Poll();  // 轮询设备状态

    if (FAILED(hr)) {
        // 设备可能丢失,尝试重新获取
        g_pJoystickDevice->Acquire();
        return;
    }

    // 获取设备状态
    if (FAILED(g_pJoystickDevice->GetDeviceState(sizeof(DIJOYSTATE), &js))) {
        std::cerr << "读取设备状态失败!" << std::endl;
        return;
    }

    // 打印摇杆信息
    std::cout << "X轴: " << js.lX << "  Y轴: " << js.lY << "  Z轴: " << js.lZ << std::endl;
}

void CleanUp() {
    if (g_pJoystickDevice) {
        g_pJoystickDevice->Unacquire();
        g_pJoystickDevice->Release();
        g_pJoystickDevice = nullptr;
    }
    if (g_pDirectInput) {
        g_pDirectInput->Release();
        g_pDirectInput = nullptr;
    }
}

int main() {
    HINSTANCE hInstance = GetModuleHandle(NULL);
    HWND hWnd = GetConsoleWindow();  // 使用控制台窗口句柄

    if (!InitDirectInput(hInstance, hWnd)) {
        std::cerr << "DirectInput 初始化失败,程序终止!" << std::endl;
        return -1;
    }

    // 持续读取摇杆数据
    while (true) {
        ReadJoystickState();
        Sleep(2000);  // 每100ms读取一次
    }

    CleanUp();
    return 0;
}

最后效果展示如下

6后续

可惜只要求我写个demo,具体还没要求我干啥,能读遥感数据就行,按钮后面有需求再写demo吧。

完结,撒花

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

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

相关文章

OpenCV基于均值漂移算法(pyrMeanShiftFiltering)的水彩画特效

1、均值漂移算法原理 pyrMeanShiftFiltering算法结合了均值迁移&#xff08;Mean Shift&#xff09;算法和图像金字塔&#xff08;Image Pyramid&#xff09;的概念&#xff0c;用于图像分割和平滑处理。以下是该算法的详细原理&#xff1a; 1.1 、均值迁移&#xff08;Mean …

1.15学习

web ctfhub-网站源码 打开环境&#xff0c;查看源代码无任何作用&#xff0c;但是其提醒就在表面暗示我们用dirsearch进行目录扫描&#xff0c;登录kali的root端&#xff0c;利用终端输入dirsearch -u 网址的命令扫描该网址目录&#xff0c;扫描成功后获得信息&#xff0c;在…

Three.js+Vue3+Vite应用lil-GUI调试开发3D效果(三)

前期文章中我们完成了创建第一个场景、添加轨道控制器的功能&#xff0c;接下来我们继续阐述其他的功能&#xff0c;本篇文章中主要讲述如何应用lil-GUI调试开发3D效果&#xff0c;在开始具体流程和步骤之前&#xff0c;请先查看之前的内容&#xff0c;因为该功能必须在前期内容…

鸿蒙报错Init keystore failed: keystore password was incorrect

报错如下&#xff1a; > hvigor ERROR: Failed :entry:defaultSignHap... > hvigor ERROR: Tools execution failed. 01-13 16:35:55 ERROR - hap-sign-tool: error: Init keystore failed: keystore password was incorrect * Try the following: > The key stor…

Jmeter配置服务代理器 Proxy(二)

1.创建脚本记录器 2.配置&#xff1a;Jmeter代理、端口、记录目标等 3.配置谷歌浏览器代理 浏览器配置代理的详细教程可参考&#xff1a;使用whistle代理-CSDN博客 4.启动Jmeter记录器 点击ok后弹出这个界面&#xff0c;生成了证书&#xff1a; 5.给浏览器安装Jmeter代理的证书…

3.Qt Quick-QML地图引擎之v4.3版本(新增动态轨迹线/海图/天地图街道/天地图卫星)

在上个版本Qt Quick-QML地图引擎之v4版本(新增多模型切换/3D模型欧拉角模拟)_qt加载3d地图-CSDN博客更新了3D模拟功能&#xff0c;在4.3版本增加动态轨迹线、三个地图(海图/天地图街道/天地图卫星)。 4.3版本已经支持qt6 cmake版本&#xff0c;而4.3版本以下支持qt5版本&#x…

我国无人机新增实名登记110.3 万架,累计完成飞行2666万小时

据央视新闻从中国民航局了解到&#xff0c;2024 年我国全年新增通航企业 145 家、通用机场 26 个&#xff0c;颁发无人驾驶航空器型号合格证 6 个、新增实名登记无人机 110.3 万架&#xff0c;无人机运营单位总数超过 2 万家&#xff0c;累计完成无人机飞行 2666 万小时&#x…

hadoop3.3和hive4.0安装——单节点

hadoop3.3x和hive4.0安装部署 为什么我要安装hive4.0&#xff0c;因为阿里云镜像只有hive4.0 软件相互兼容性版本 系统centos7 uname -a如果内核3.0以上可以用 安装jdk1.8以上的版本&#xff08;配置好环境变量&#xff09; hadoop3.3.x与hive4.0.x 创建目录 mkdir -p /us…

基于Springboot的社区医院管理系统【附源码】

基于Springboot的社区医院管理系统 效果如下&#xff1a; 系统登陆页面 病例信息页面 家庭医生管理页面 健康档案管理页面 就诊信息管理页面 药品管理页面 个人信息管理页面 用户管理页面 研究背景 随着医疗行业的快速发展和信息化建设的不断推进&#xff0c;社区医院作为基…

爬虫后的数据处理与使用(使用篇--实现分类预测)

&#xff08;&#xff09;紧接上文&#xff0c;在完成基本的数据处理后&#xff0c;接下来就是正常的使用了。当然怎么用&#xff0c;确实需要好好思考一下~ 上文&#xff1a;爬虫后的数据处理与使用&#xff08;处理篇&#xff09; 前言&#xff1a; 一般来说&#xff0c;我…

springMVC---常用注解

目录 一、创建项目 1.依赖 2.web.xml 3.spring-mvc.xml 二、RequestParam注解 1.作用 2.属性 3.代码 DeptController类 启动tomcat 三、RequestBody注解 1.作用 2.属性 3.代码 (1&#xff09;DeptController类 (2&#xff09;index.jsp (3)启动tomcat 四、P…

持续集成 01|Gitee介绍、Pycharm使用Gitee

目录 一、理论 二、 git的简介与安装 三、Gitee 1、注册网易163邮箱 2、注册Gitee账号 3、git和gitee管理代码工作原理 三、PyCharm安装配置Gitee 四、Pycharm使用Gitee插件的五种场景 1、将 Gitee的新仓库 Checkout&#xff08;检出&#xff09;到 Pycharm中 2、推送…

深入了解生成对抗网络(GAN):原理、实现及应用

生成对抗网络&#xff08;GAN, Generative Adversarial Networks&#xff09;是由Ian Goodfellow等人于2014年提出的一种深度学习模型&#xff0c;旨在通过对抗训练生成与真实样本相似的数据。GAN在图像生成、图像修复、超分辨率等领域取得了显著的成果。本文将深入探讨GAN的基…

云服务信息安全管理体系认证,守护云端安全

在数据驱动的时代&#xff0c;云计算已成为企业业务的超级引擎&#xff0c;推动着企业飞速发展。然而&#xff0c;随着云计算的广泛应用&#xff0c;信息安全问题也日益凸显&#xff0c;如同暗流涌动下的礁石&#xff0c;时刻威胁着企业的航行安全。这时&#xff0c;云服务信息…

正泰电工携手图扑:变电站数字孪生巡检平台

随着电力行业的快速发展与智能化转型&#xff0c;传统的人工巡检方式难以匹配现代电网对于效率、安全和精细化管理的高标准要求。在此背景下&#xff0c;构建智慧变电站巡检系统已成为推动变电站智能化进程、实现高效运营和保障电网可靠性的重要战略。 图扑软件与正泰电工联合…

加强金融数据治理,推进金融科技变革!

​ 近年来&#xff0c;随着大数据、人工智能等新一代信息技术的高速发展&#xff0c;数字化浪潮席卷全球&#xff0c;金融业作为数据密集型行业&#xff0c;以数据支撑决策、以数据防范风险、以数据驱动创新、以数据优化业务已成为金融业的共识&#xff0c;如何加强金融数据治理…

【数据结构】快排之三路划分+文件归并排序

排序 一.快排1.快排性能分析2.快排之三路划分3.快排之内省排序 二.归并1.外排序2.文件归并排序 一.快排 1.快排性能分析 决定快排性能的关键点是每次单趟排序后&#xff0c;key对数组的分割&#xff0c;如果每次选key基本二分居中&#xff0c;那么快排的递归树就是颗均匀的满…

机器学习笔记合集

&#x1f525;转载来源&#xff1a;机器学习笔记合集 大家好&#xff0c;这里是好评笔记&#xff0c;公主 号&#xff1a;Goodnote。本笔记的任务是解读机器学习实践/面试过程中可能会用到的知识点&#xff0c;内容通俗易懂&#xff0c;入门、实习和校招轻松搞定。 笔记介绍 本…

2025年01月15日Github流行趋势

1. 项目名称&#xff1a;tabby - 项目地址url&#xff1a;https://github.com/TabbyML/tabby - 项目语言&#xff1a;Rust - 历史star数&#xff1a;25764 - 今日star数&#xff1a;1032 - 项目维护者&#xff1a;wsxiaoys, apps/autofix-ci, icycodes, liangfung, boxbeam - 项…

晨辉面试抽签和评分管理系统之九:随机编排考生的分组(以教师资格考试面试为例)

晨辉面试抽签和评分管理系统&#xff08;下载地址:www.chenhuisoft.cn&#xff09;是公务员招录面试、教师资格考试面试、企业招录面试等各类面试通用的考生编排、考生入场抽签、候考室倒计时管理、面试考官抽签、面试评分记录和成绩核算的面试全流程信息化管理软件。提供了考生…