简介
集成罗技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(); void test(HWND hwnd); //测试函数 bool init(HWND hwnd); //初始化罗技G29 QTimer* m_timer; //获取数据定时器 signals: public slots: void onStartEnqueue(int time); //开始入队 void onStopEnqueue(); //停止入队 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"; } }