From 6c5c26e914c2f515f1ca678fa32ab78750b8a4b5 Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Sun, 30 Aug 2015 06:26:03 +0200 Subject: win32-joystick: allow for unique selection of joysticks Distinguish joystick GUIDs to allow selecting one of several with the same name. Issue: #230 --- .../ftnoir_tracker_joystick.cpp | 34 ++++++++++++++++++++-- ftnoir_tracker_joystick/ftnoir_tracker_joystick.h | 16 +++++++++- .../ftnoir_tracker_joystick_dialog.cpp | 4 ++- 3 files changed, 50 insertions(+), 4 deletions(-) (limited to 'ftnoir_tracker_joystick') diff --git a/ftnoir_tracker_joystick/ftnoir_tracker_joystick.cpp b/ftnoir_tracker_joystick/ftnoir_tracker_joystick.cpp index 45cf2f10..ac374aa8 100644 --- a/ftnoir_tracker_joystick/ftnoir_tracker_joystick.cpp +++ b/ftnoir_tracker_joystick/ftnoir_tracker_joystick.cpp @@ -82,6 +82,17 @@ static BOOL CALLBACK EnumJoysticksCallback( const DIDEVICEINSTANCE* pdidInstance if (stop) { + if (self->guid_to_check.size()) + { + QString guid = guid_to_string(pdidInstance->guidInstance); + if (guid != self->guid_to_check) + { + return DIENUM_CONTINUE; + } + else + qDebug() << "guid ok" << self->guid_to_check; + } + (void) self->g_pDI->CreateDevice( pdidInstance->guidInstance, &self->g_pJoystick, NULL); qDebug() << "device" << static_cast(self->s.joyid); } @@ -103,13 +114,32 @@ void FTNoIR_Tracker::start_tracker(QFrame* frame) goto fail; } + guid_to_check = s.guid; + if( FAILED( hr = g_pDI->EnumDevices( DI8DEVCLASS_GAMECTRL, EnumJoysticksCallback, this, DIEDFL_ATTACHEDONLY))) { - qDebug() << "enum2"; - goto fail; + if (guid_to_check.isEmpty()) + { + qDebug() << "enum1"; + goto fail; + } + } + + if (!g_pJoystick && guid_to_check.size()) + { + guid_to_check = ""; + + if( FAILED( hr = g_pDI->EnumDevices( DI8DEVCLASS_GAMECTRL, + EnumJoysticksCallback, + this, + DIEDFL_ATTACHEDONLY))) + { + qDebug() << "enum2"; + goto fail; + } } if (!g_pJoystick) diff --git a/ftnoir_tracker_joystick/ftnoir_tracker_joystick.h b/ftnoir_tracker_joystick/ftnoir_tracker_joystick.h index 0958246a..ab32ec56 100644 --- a/ftnoir_tracker_joystick/ftnoir_tracker_joystick.h +++ b/ftnoir_tracker_joystick/ftnoir_tracker_joystick.h @@ -30,11 +30,12 @@ using namespace options; struct settings : opts { - value joyid; + value joyid, guid; value joy_1, joy_2, joy_3, joy_4, joy_5, joy_6; settings() : opts("tracker-joystick"), joyid(b, "joy-id", ""), + guid(b, "joy-guid", ""), joy_1(b, "axis-map-1", 1), joy_2(b, "axis-map-2", 2), joy_3(b, "axis-map-3", 3), @@ -44,6 +45,18 @@ struct settings : opts { {} }; +template +QString guid_to_string(const GUID guid) +{ + char buf[40] = {0}; + wchar_t szGuidW[40] = {0}; + + StringFromGUID2(guid, szGuidW, 40); + WideCharToMultiByte(0, 0, szGuidW, -1, buf, 40, NULL, NULL); + + return QString(buf); +} + class FTNoIR_Tracker : public ITracker { public: @@ -59,6 +72,7 @@ public: DIDEVICEINSTANCE def; int iter; // XXX bad style settings s; + QString guid_to_check; static constexpr int AXIS_MAX = 65535; }; diff --git a/ftnoir_tracker_joystick/ftnoir_tracker_joystick_dialog.cpp b/ftnoir_tracker_joystick/ftnoir_tracker_joystick_dialog.cpp index 7200003c..88074fef 100644 --- a/ftnoir_tracker_joystick/ftnoir_tracker_joystick_dialog.cpp +++ b/ftnoir_tracker_joystick/ftnoir_tracker_joystick_dialog.cpp @@ -6,7 +6,8 @@ static BOOL CALLBACK EnumJoysticksCallback( const DIDEVICEINSTANCE* pdidInstance auto self = ( TrackerControls* )pContext; self->guids.push_back(pdidInstance->guidInstance); - self->ui.joylist->addItem(QString(pdidInstance->tszInstanceName)); + self->ui.joylist->addItem(QString(pdidInstance->tszInstanceName), + guid_to_string(pdidInstance->guidInstance)); return DIENUM_CONTINUE; } @@ -49,6 +50,7 @@ fin: } void TrackerControls::doOK() { + s.guid = ui.joylist->currentData().toString(); s.b->save(); if (tracker) tracker->reload(); -- cgit v1.2.3 From a224ffabfedd0f90f8412c63a95bcdefaa6897d9 Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Sun, 30 Aug 2015 06:41:29 +0200 Subject: win32-joystick: nix unused variable --- ftnoir_tracker_joystick/ftnoir_tracker_joystick.h | 1 - ftnoir_tracker_joystick/ftnoir_tracker_joystick_dialog.cpp | 1 - 2 files changed, 2 deletions(-) (limited to 'ftnoir_tracker_joystick') diff --git a/ftnoir_tracker_joystick/ftnoir_tracker_joystick.h b/ftnoir_tracker_joystick/ftnoir_tracker_joystick.h index ab32ec56..76bafbd4 100644 --- a/ftnoir_tracker_joystick/ftnoir_tracker_joystick.h +++ b/ftnoir_tracker_joystick/ftnoir_tracker_joystick.h @@ -83,7 +83,6 @@ public: TrackerControls(); void register_tracker(ITracker *) {} void unregister_tracker() {} - QList guids; Ui::UIJoystickControls ui; FTNoIR_Tracker* tracker; settings s; diff --git a/ftnoir_tracker_joystick/ftnoir_tracker_joystick_dialog.cpp b/ftnoir_tracker_joystick/ftnoir_tracker_joystick_dialog.cpp index 88074fef..f3b7077c 100644 --- a/ftnoir_tracker_joystick/ftnoir_tracker_joystick_dialog.cpp +++ b/ftnoir_tracker_joystick/ftnoir_tracker_joystick_dialog.cpp @@ -5,7 +5,6 @@ static BOOL CALLBACK EnumJoysticksCallback( const DIDEVICEINSTANCE* pdidInstance { auto self = ( TrackerControls* )pContext; - self->guids.push_back(pdidInstance->guidInstance); self->ui.joylist->addItem(QString(pdidInstance->tszInstanceName), guid_to_string(pdidInstance->guidInstance)); -- cgit v1.2.3 From 22bde7a4fd6eb48cdcdde61d86ca193abd054699 Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Sun, 30 Aug 2015 06:49:10 +0200 Subject: win32-joystick: fix COM failure path Device enumeration only fails for internal reasons. Not finding the device is not one of them. --- ftnoir_tracker_joystick/ftnoir_tracker_joystick.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) (limited to 'ftnoir_tracker_joystick') diff --git a/ftnoir_tracker_joystick/ftnoir_tracker_joystick.cpp b/ftnoir_tracker_joystick/ftnoir_tracker_joystick.cpp index ac374aa8..77fd7241 100644 --- a/ftnoir_tracker_joystick/ftnoir_tracker_joystick.cpp +++ b/ftnoir_tracker_joystick/ftnoir_tracker_joystick.cpp @@ -121,11 +121,8 @@ void FTNoIR_Tracker::start_tracker(QFrame* frame) this, DIEDFL_ATTACHEDONLY))) { - if (guid_to_check.isEmpty()) - { - qDebug() << "enum1"; - goto fail; - } + qDebug() << "enum1"; + goto fail; } if (!g_pJoystick && guid_to_check.size()) -- cgit v1.2.3 From 4ad662d67bb12feed12095cd9a41a46bfac16d1c Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Sun, 30 Aug 2015 08:52:59 +0200 Subject: win32-joystick: fix duplicate device name selection logic Tested-by: @nanospork Closes #230 --- ftnoir_tracker_joystick/ftnoir_tracker_joystick.h | 6 ++++ .../ftnoir_tracker_joystick_controls.ui | 38 +++++++++++++++++++++- .../ftnoir_tracker_joystick_dialog.cpp | 15 ++++++--- 3 files changed, 53 insertions(+), 6 deletions(-) (limited to 'ftnoir_tracker_joystick') diff --git a/ftnoir_tracker_joystick/ftnoir_tracker_joystick.h b/ftnoir_tracker_joystick/ftnoir_tracker_joystick.h index 76bafbd4..75305f07 100644 --- a/ftnoir_tracker_joystick/ftnoir_tracker_joystick.h +++ b/ftnoir_tracker_joystick/ftnoir_tracker_joystick.h @@ -14,6 +14,7 @@ #include #include #include +#include #include #include "opentrack/plugin-api.hpp" #ifndef DIRECTINPUT_VERSION @@ -86,6 +87,11 @@ public: Ui::UIJoystickControls ui; FTNoIR_Tracker* tracker; settings s; + struct joys { + QString name; + QString guid; + }; + QList _joys; private slots: void doOK(); void doCancel(); diff --git a/ftnoir_tracker_joystick/ftnoir_tracker_joystick_controls.ui b/ftnoir_tracker_joystick/ftnoir_tracker_joystick_controls.ui index 3533f93d..88737023 100644 --- a/ftnoir_tracker_joystick/ftnoir_tracker_joystick_controls.ui +++ b/ftnoir_tracker_joystick/ftnoir_tracker_joystick_controls.ui @@ -9,7 +9,7 @@ 0 0 - 251 + 498 303 @@ -79,6 +79,12 @@ + + + 0 + 0 + + 1 @@ -131,6 +137,12 @@ + + + 0 + 0 + + 2 @@ -183,6 +195,12 @@ + + + 0 + 0 + + 3 @@ -235,6 +253,12 @@ + + + 0 + 0 + + 4 @@ -287,6 +311,12 @@ + + + 0 + 0 + + 5 @@ -339,6 +369,12 @@ + + + 0 + 0 + + 6 diff --git a/ftnoir_tracker_joystick/ftnoir_tracker_joystick_dialog.cpp b/ftnoir_tracker_joystick/ftnoir_tracker_joystick_dialog.cpp index f3b7077c..0463933f 100644 --- a/ftnoir_tracker_joystick/ftnoir_tracker_joystick_dialog.cpp +++ b/ftnoir_tracker_joystick/ftnoir_tracker_joystick_dialog.cpp @@ -4,9 +4,12 @@ static BOOL CALLBACK EnumJoysticksCallback( const DIDEVICEINSTANCE* pdidInstance, VOID* pContext ) { auto self = ( TrackerControls* )pContext; + auto name = QString(pdidInstance->tszInstanceName); + auto guid = guid_to_string(pdidInstance->guidInstance); + TrackerControls::joys cur { name, guid }; + self->_joys.append(cur); - self->ui.joylist->addItem(QString(pdidInstance->tszInstanceName), - guid_to_string(pdidInstance->guidInstance)); + self->ui.joylist->addItem(name + " " + guid); return DIENUM_CONTINUE; } @@ -38,8 +41,6 @@ fin: g_pDI->Release(); } - tie_setting(s.joyid, ui.joylist); - tie_setting(s.joy_1, ui.joy_1); tie_setting(s.joy_2, ui.joy_2); tie_setting(s.joy_3, ui.joy_3); @@ -49,7 +50,11 @@ fin: } void TrackerControls::doOK() { - s.guid = ui.joylist->currentData().toString(); + int idx = ui.joylist->currentIndex(); + joys def { "", "" }; + auto val = _joys.value(idx, def); + s.guid = val.guid; + s.joyid = val.name; s.b->save(); if (tracker) tracker->reload(); -- cgit v1.2.3