• Qt


    简介

    集成罗技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、代码中加入,逻辑代码方法二中再说

    #pragma comment(lib, "LogitechSteeringWheelLib.lib")
    #include "LogitechSteeringWheelLib.h"

    方式二:

    说明:该方法可以直接加载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库)

    我是使用定时器去获取罗技方向盘数据的,定时器的写法相信大家都会,我这里就没有贴出来了

    Logitech.h
    
    #include "LogitechSteeringWheelLib.h"
    
    class Logitech : public QObject {
        Q_OBJECT
      public:
        explicit Logitech(QObject *parent = nullptr);
        ~Logitech();
    
        bool init(HWND hwnd);   //初始化罗技G29
        QTimer* m_timer;        //获取数据定时器
    public slots:
        void onGetLogitechData();    //获取罗技G29数据
    
      private:
        int m_index;    //罗技方向盘设备节点
    };
    Logitech.cpp
    
    #include "Logitech.h"
    
    //bool LogiSteeringInitializeWithWindow(bool ignoreXInputControllers, HWND hwnd);
    typedef bool (*Fun0)(bool ignoreXInputControllers, HWND hwnd);
    
    //bool LogiUpdate();
    typedef bool (*Fun1)();
    
    //bool LogiIsConnected(const int index);
    typedef bool (*Fun2)(const int index);
    
    //DIJOYSTATE2* LogiGetState(const int index);
    typedef DIJOYSTATE2* (*Fun3)(const int index);
    
    Fun0 initLogitech;        //初始化罗技SDK,会关联一个窗口
    Fun1 updateLogitech;      //更新设备状态
    Fun2 connectedLogitech;   //检查设备索引是否连接
    Fun3 getStateLogitech;    //以基本的方法获取设备状态
    
    Logitech::Logitech(QObject *parent) : QObject(parent) {
        qDebug() << "thread 1: " << QThread::currentThreadId();
        m_index = 0;
        m_timer = new QTimer(this);
    }
    
    Logitech::~Logitech() {}
    
    bool Logitech::init(HWND hwnd) {
        qDebug() << "thread 2: " << QThread::currentThreadId();
        qDebug() << "Logitech init";
    
        //加载dll
        QLibrary qLib("LogitechSteeringWheelEnginesWrapper");
        if(qLib.load()) {
            qDebug() << "QLibrary load success!";
    
            initLogitech = (Fun0)qLib.resolve("LogiSteeringInitializeWithWindow");
            updateLogitech = (Fun1)qLib.resolve("LogiUpdate");
            connectedLogitech = (Fun2)qLib.resolve("LogiIsConnected");
            getStateLogitech = (Fun3)qLib.resolve("LogiGetState");
    
            if(initLogitech && updateLogitech && connectedLogitech && getStateLogitech) {
                qDebug() << "resolve success!";
    
                //初始化罗技方向盘
                bool ret = initLogitech(true, hwnd);
                if (ret) {
                    connect(m_timer, &QTimer::timeout, this, &Logitech::onGetLogitechData);
                }
                return ret;
            } else {
                qDebug() << "resolve failed!";
                return false;
            }
        } else {
            qDebug() << "QLibrary load failed!";
            return false;
        }
    }
    
    void Logitech::onGetLogitechData() {
        if (updateLogitech() && connectedLogitech(m_index)) {
            DIJOYSTATE2* logitechData = getStateLogitech(m_index);
            qDebug("%6d %6d %6d %d",
                   logitechData->lX,    //方向盘角度
                   logitechData->lY,    //油门
                   logitechData->lRz,    //刹车
                   logitechData->rgbButtons[12/13/14] == 128);//挡位
        } else {
            qDebug() << "Logitech getLogitechData failed";
        }
    }
    博客园文作者:Citrusliu 博文地址:https://www.cnblogs.com/citrus
  • 相关阅读:
    dell服务器 bios界面
    windows server 常用功能(一)
    Windows server 2016 / Windows 10关于域管理员帐号权限不足的问题
    (转)Java并发编程:并发容器之CopyOnWriteArrayList
    (转)ThreadLocal
    (转)java volatile关键字
    (转)java fail-fast机制
    (转)java并发对象锁、类锁、私有锁
    (转)java synchronised关键字
    javascript array
  • 原文地址:https://www.cnblogs.com/citrus/p/14812861.html
Copyright © 2020-2023  润新知