当前位置:首页 > 操作系统 > Windows

Qt - 集成罗技G29方向盘官方SDK(Windows平台)

简介

集成罗技G29方向盘SDK,获取罗技G29方向盘的转角、油门、刹车、挡位等数据

 

SDK下载

地址:https://www.logitechg.com.cn/zh-cn/innovation/developer-lab.html

进入之后选择下载第一个:方向盘SDK

技术分享图片

SDK说明

技术分享图片

解压后文件夹中有:

Demo(一个编译好的MFC例子,用于测试罗技G29的驱动是否安装好,是否与电脑连接成功)

Doc(SDK说明文档)

Include(.h头文件)

Lib(.lib .dll库文件,包含x86和x64)

Samples(三个MFC工程示例,使用Visual Studio 2017加载工程,配置项目属性即可编译成功)

技术分享图片

SDK中MFC示例使用说明

用于检测罗技G29方向盘是否能正常工作

1、下载安装罗技驱动lghub_installer.exe,地址:https://support.logi.com/hc/zh-cn/articles/360025298133

2、把罗技G29方向盘的USB接入电脑

3、双击Demo中SteeringWheelSDKDemo.exe(对应Sample中第一个,第二个是各个接口函数,第三个不用管)

4、点击 Init 初始化之后,可以看到 Device 0 和 Device 1哪个有数据index=哪个,且有数据证明正常使用

技术分享图片

SDK代码接入

方式一:

说明:因为最初不知道Windows下编译的库怎么导入Qt中使用,所以用该方法把Qt嵌入到Visual Studio中

开发环境:Windows10

开发工具:Visual Studio2017+Qt5.14.2

需要文件:LogitechSteeringWheelLib.h、LogitechSteeringWheelLib.lib

参考博客:https://blog.csdn.net/qq_41250354/article/details/104652071

1、工程属性中添加附加包含目录(SDK头文件目录):工程→属性→配置属性→C/C++→常规→附加包含目录

2、添加附加库目录(SDK静态库目录):工程→属性→配置属性→链接器→常规→附加库目录

3、添加附加依赖项(SDK静态库文件):工程→属性→配置属性→链接器→输入→附加依赖项

4、代码中加入,逻辑代码方法二中再说

            <span>#pragma</span> comment(lib, "LogitechSteeringWheelLib.lib")<span>
#include </span><span>"</span><span>LogitechSteeringWheelLib.h</span><span>"</span>

方式二:

说明:该方法可以直接加载dll动态库,并使用动态库中的函数,即使用Qt MinGW 和 MSVC 编译器都可以

开发环境:Windows10

开发工具:Qt5.14.2

需要文件:LogitechSteeringWheelLib.h、LogitechSteeringWheelEnginesWrapper.dll

注:Qt调用dll方法

法一使用Win32 API(调用LoadLibrary、GetProcAddress、FreeLibrary)

法二使用Qt API(定义函数指针、QLibrary、resolve)

法三使用静态链接方式(需要lib和dll):Qt pro文件中LIBS += -L路径 -l库名,其中引用库名格式为xxx.a,由于罗技官方没有提供,直接Pass

1、没有方法一中繁琐的步骤,这就是Qt的魅力,上代码(下面贴的代码使用的是法二加载dll库)

            <span>Logitech.h

#include </span>
            <span>"</span>
            <span>LogitechSteeringWheelLib.h</span>
            <span>"</span>
            <span>class</span> Logitech : <span>public</span><span> QObject {
    Q_OBJECT
  </span><span>public</span><span>:
    </span><span>explicit</span> Logitech(QObject *parent =<span> nullptr);
    </span>~<span>Logitech();

    </span><span>void</span> test(HWND hwnd);  <span>//</span><span>测试函数</span><span>bool</span> init(HWND hwnd);   <span>//</span><span>初始化罗技G29</span>
    QTimer* m_timer;        <span>//</span><span>获取数据定时器</span><span>
  signals:
  </span><span>public</span><span> slots:
    </span><span>void</span> onStartEnqueue(<span>int</span> time);  <span>//</span><span>开始入队</span><span>void</span> onStopEnqueue();           <span>//</span><span>停止入队</span><span>void</span> onGetLogitechData();    <span>//</span><span>获取罗技G29数据</span><span>private</span><span>:
    </span><span>int</span> m_index;    <span>//</span><span>罗技方向盘设备节点</span>
};
            <span>Logitech.cpp

#include </span>
            <span>"</span>
            <span>Logitech.h</span>
            <span>"</span>
            <span>//</span>
            <span>bool LogiSteeringInitializeWithWindow(bool ignoreXInputControllers, HWND hwnd);</span>
typedef <span>bool</span> (*Fun0)(<span>bool</span><span> ignoreXInputControllers, HWND hwnd);

</span><span>//</span><span>bool LogiUpdate();</span>
typedef <span>bool</span> (*<span>Fun1)();

</span><span>//</span><span>bool LogiIsConnected(const int index);</span>
typedef <span>bool</span> (*Fun2)(<span>const</span><span>int</span><span> index);

</span><span>//</span><span>DIJOYSTATE2* LogiGetState(const int index);</span>
typedef DIJOYSTATE2* (*Fun3)(<span>const</span><span>int</span><span> index);

Fun0 initLogitech;        </span><span>//</span><span>初始化罗技SDK,会关联一个窗口</span>
Fun1 updateLogitech;      <span>//</span><span>更新设备状态</span>
Fun2 connectedLogitech;   <span>//</span><span>检查设备索引是否连接</span>
Fun3 getStateLogitech;    <span>//</span><span>以基本的方法获取设备状态</span><span>
Logitech::Logitech(QObject </span>*<span>parent) : QObject(parent) {
    qDebug() </span><< <span>"</span><span>thread 1: </span><span>"</span> <<<span> QThread::currentThreadId();
    m_index </span>= <span>0</span><span>;
    m_timer </span>= <span>new</span> QTimer(<span>this</span><span>);
}

Logitech::</span>~<span>Logitech() {}

</span><span>bool</span><span> Logitech::init(HWND hwnd) {
    qDebug() </span><< <span>"</span><span>thread 2: </span><span>"</span> <<<span> QThread::currentThreadId();
    qDebug() </span><< <span>"</span><span>Logitech init</span><span>"</span><span>;

    </span><span>//</span><span>加载dll</span>
    QLibrary qLib(<span>"</span><span>LogitechSteeringWheelEnginesWrapper</span><span>"</span><span>);
    </span><span>if</span><span>(qLib.load()) {
        qDebug() </span><< <span>"</span><span>QLibrary load success!</span><span>"</span><span>;

        initLogitech </span>= (Fun0)qLib.resolve(<span>"</span><span>LogiSteeringInitializeWithWindow</span><span>"</span><span>);
        updateLogitech </span>= (Fun1)qLib.resolve(<span>"</span><span>LogiUpdate</span><span>"</span><span>);
        connectedLogitech </span>= (Fun2)qLib.resolve(<span>"</span><span>LogiIsConnected</span><span>"</span><span>);
        getStateLogitech </span>= (Fun3)qLib.resolve(<span>"</span><span>LogiGetState</span><span>"</span><span>);

        </span><span>if</span>(initLogitech && updateLogitech && connectedLogitech &&<span> getStateLogitech) {
            qDebug() </span><< <span>"</span><span>resolve success!</span><span>"</span><span>;

            </span><span>//</span><span>初始化罗技方向盘</span><span>bool</span> ret = initLogitech(<span>true</span><span>, hwnd);
            </span><span>if</span><span> (ret) {
                connect(m_timer, </span>&QTimer::timeout, <span>this</span>, &<span>Logitech::onGetLogitechData);
            }
            </span><span>return</span><span> ret;
        } </span><span>else</span><span> {
            qDebug() </span><< <span>"</span><span>resolve failed!</span><span>"</span><span>;
            </span><span>return</span><span>false</span><span>;
        }
    } </span><span>else</span><span> {
        qDebug() </span><< <span>"</span><span>QLibrary load failed!</span><span>"</span><span>;
        </span><span>return</span><span>false</span><span>;
    }
}

</span><span>void</span><span> Logitech::onGetLogitechData() {
    </span><span>if</span> (updateLogitech() &&<span> connectedLogitech(m_index)) {
        DIJOYSTATE2</span>* logitechData =<span> getStateLogitech(m_index);
        qDebug(</span><span>"</span><span>%6d %6d %6d %d</span><span>"</span><span>,
               logitechData</span>->lX,    <span>//</span><span>方向盘角度</span>
               logitechData->lY,    <span>//</span><span>油门</span>
               logitechData->lRz,    <span>//</span><span>刹车</span>
               logitechData->rgbButtons[<span>12</span>/<span>13</span>/<span>14</span>] == <span>128</span>);<span>//</span><span>挡位</span>
    } <span>else</span><span> {
        qDebug() </span><< <span>"</span><span>Logitech getLogitechData failed</span><span>"</span><span>;
    }
}</span>

 

原文:https://www.cnblogs.com/citrus/p/14812861.html


【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!

相关教程推荐

其他课程推荐