From ba0dbeac80659a09da19d0373ce2b86b3ba3ffb1 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 1 Nov 2016 13:36:20 -0700 Subject: [PATCH 1/8] Add InputManager::getSubdeviceNames --- libraries/plugins/src/plugins/InputPlugin.h | 3 +++ plugins/hifiSdl2/src/SDL2Manager.cpp | 8 +++++++- plugins/hifiSdl2/src/SDL2Manager.h | 2 ++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/libraries/plugins/src/plugins/InputPlugin.h b/libraries/plugins/src/plugins/InputPlugin.h index f68be3edf6..0db0b24420 100644 --- a/libraries/plugins/src/plugins/InputPlugin.h +++ b/libraries/plugins/src/plugins/InputPlugin.h @@ -21,6 +21,9 @@ public: virtual void pluginFocusOutEvent() = 0; virtual void pluginUpdate(float deltaTime, const controller::InputCalibrationData& inputCalibrationData) = 0; + // Some input plugins are comprised of multiple subdevices (SDL2, for instance). + // If an input plugin is only a single device, it will only return it's primary name. + virtual QStringList getSubdeviceNames() { return { getName() }; }; virtual bool isHandController() const = 0; }; diff --git a/plugins/hifiSdl2/src/SDL2Manager.cpp b/plugins/hifiSdl2/src/SDL2Manager.cpp index b9a19658e2..91a693cc09 100644 --- a/plugins/hifiSdl2/src/SDL2Manager.cpp +++ b/plugins/hifiSdl2/src/SDL2Manager.cpp @@ -65,8 +65,10 @@ void SDL2Manager::init() { _openJoysticks[id] = joystick; auto userInputMapper = DependencyManager::get(); userInputMapper->registerDevice(joystick); + auto name = SDL_GameControllerName(controller); + _subdeviceNames << name; emit joystickAdded(joystick.get()); - emit subdeviceConnected(getName(), SDL_GameControllerName(controller)); + emit subdeviceConnected(getName(), name); } } } @@ -78,6 +80,10 @@ void SDL2Manager::init() { } } +QStringList SDL2Manager::getSubdeviceNames() { + return _subdeviceNames; +} + void SDL2Manager::deinit() { _openJoysticks.clear(); diff --git a/plugins/hifiSdl2/src/SDL2Manager.h b/plugins/hifiSdl2/src/SDL2Manager.h index 44b75abd2f..fc1654bce1 100644 --- a/plugins/hifiSdl2/src/SDL2Manager.h +++ b/plugins/hifiSdl2/src/SDL2Manager.h @@ -26,6 +26,7 @@ public: bool isSupported() const override; const QString& getName() const override { return NAME; } + QStringList getSubdeviceNames() override; bool isHandController() const override { return false; } void init() override; @@ -79,6 +80,7 @@ private: QMap _openJoysticks; bool _isInitialized { false } ; static const QString NAME; + QStringList _subdeviceNames; }; #endif // hifi__SDL2Manager_h From e4341d7a02980aacc849f869dd4495997e0fa106 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 1 Nov 2016 13:42:37 -0700 Subject: [PATCH 2/8] Add vive and xbox controller checking to PluginUtils --- libraries/plugins/src/plugins/PluginUtils.cpp | 21 +++++++++++++++++++ libraries/plugins/src/plugins/PluginUtils.h | 2 ++ 2 files changed, 23 insertions(+) diff --git a/libraries/plugins/src/plugins/PluginUtils.cpp b/libraries/plugins/src/plugins/PluginUtils.cpp index bc53e8166a..f1cc85634f 100644 --- a/libraries/plugins/src/plugins/PluginUtils.cpp +++ b/libraries/plugins/src/plugins/PluginUtils.cpp @@ -32,3 +32,24 @@ bool PluginUtils::isHandControllerAvailable() { } return false; }; + +bool isSubdeviceContainingNameAvailable(QString name) { + for (auto& inputPlugin : PluginManager::getInstance()->getInputPlugins()) { + auto subdeviceNames = inputPlugin->getSubdeviceNames(); + for (auto& name : subdeviceNames) { + if (name.contains(name)) { + return true; + } + } + } + return false; +}; + +bool PluginUtils::isViveControllerAvailable() { + return isSubdeviceContainingNameAvailable("Vive"); +}; + +bool PluginUtils::isXboxControllerAvailable() { + return isSubdeviceContainingNameAvailable("X360 Controller"); +}; + diff --git a/libraries/plugins/src/plugins/PluginUtils.h b/libraries/plugins/src/plugins/PluginUtils.h index 727677ccd3..f1449bc3af 100644 --- a/libraries/plugins/src/plugins/PluginUtils.h +++ b/libraries/plugins/src/plugins/PluginUtils.h @@ -16,4 +16,6 @@ class PluginUtils { public: static bool isHMDAvailable(const QString& pluginName = ""); static bool isHandControllerAvailable(); + static bool isViveControllerAvailable(); + static bool isXboxControllerAvailable(); }; From 16d91833e8ba6fd9d14e17c728a240b28c76b407 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 1 Nov 2016 13:43:32 -0700 Subject: [PATCH 3/8] Add optional url query to InfoView --- libraries/ui/src/InfoView.cpp | 4 +++- libraries/ui/src/InfoView.h | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/libraries/ui/src/InfoView.cpp b/libraries/ui/src/InfoView.cpp index 6b6d6645f5..d2c72bf5f2 100644 --- a/libraries/ui/src/InfoView.cpp +++ b/libraries/ui/src/InfoView.cpp @@ -37,7 +37,7 @@ QString fetchVersion(const QUrl& url) { return r.trimmed(); } -void InfoView::show(const QString& path, bool firstOrChangedOnly) { +void InfoView::show(const QString& path, bool firstOrChangedOnly, QString urlQuery) { static bool registered{ false }; if (!registered) { registerType(); @@ -49,6 +49,8 @@ void InfoView::show(const QString& path, bool firstOrChangedOnly) { } else { url = QUrl::fromLocalFile(path); } + url.setQuery(urlQuery); + if (firstOrChangedOnly) { const QString lastVersion = infoVersion.get(); const QString version = fetchVersion(url); diff --git a/libraries/ui/src/InfoView.h b/libraries/ui/src/InfoView.h index 275effbfa5..ea6150a4d8 100644 --- a/libraries/ui/src/InfoView.h +++ b/libraries/ui/src/InfoView.h @@ -22,7 +22,7 @@ class InfoView : public QQuickItem { static const QString NAME; public: static void registerType(); - static void show(const QString& path, bool firstOrChangedOnly = false); + static void show(const QString& path, bool firstOrChangedOnly = false, QString urlQuery = ""); InfoView(QQuickItem* parent = nullptr); QUrl url(); From 3147ea9e33c557d48881b849c1ad70a38956f5f3 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 1 Nov 2016 13:43:55 -0700 Subject: [PATCH 4/8] Update help window to auto select xbox or vive controller tab on availability of device --- interface/resources/html/help.html | 22 +++++++++++++++++----- interface/src/Application.cpp | 12 +++++++++++- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/interface/resources/html/help.html b/interface/resources/html/help.html index 6cc4dab6af..422f5c6b46 100644 --- a/interface/resources/html/help.html +++ b/interface/resources/html/help.html @@ -50,21 +50,33 @@ function showKbm() { document.getElementById("main_image").setAttribute("src", "img/controls-help-keyboard.png"); } - function showHandControllers() { + function showViveControllers() { document.getElementById("main_image").setAttribute("src", "img/controls-help-vive.png"); } - function showGameController() { + function showXboxController() { document.getElementById("main_image").setAttribute("src", "img/controls-help-gamepad.png"); } + function load() { + console.log("In help.html: ", window.location.href); + parts = window.location.href.split("?"); + if (parts.length > 0) { + var defaultTab = parts[1]; + if (defaultTab == "xbox") { + showXboxController(); + } else if (defaultTab == "vive") { + showViveControllers(); + } + } + } - +
- - + +
diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 5fe15fa8e5..a18081c664 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2155,7 +2155,17 @@ void Application::aboutApp() { } void Application::showHelp() { - InfoView::show(INFO_HELP_PATH); + static const QString QUERY_STRING_XBOX = "xbox"; + static const QString QUERY_STRING_VIVE = "vive"; + + QString queryString = ""; + if (PluginUtils::isViveControllerAvailable()) { + queryString = QUERY_STRING_VIVE; + } else if (PluginUtils::isXboxControllerAvailable()) { + queryString = QUERY_STRING_XBOX; + } + + InfoView::show(INFO_HELP_PATH, false, queryString); } void Application::resizeEvent(QResizeEvent* event) { From ba7eac5281e01b0457bddb1b337ba7f909088a3f Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 1 Nov 2016 13:53:10 -0700 Subject: [PATCH 5/8] Override getSubdeviceNames in OculusControllerManager --- plugins/oculus/src/OculusControllerManager.cpp | 11 +++++++++++ plugins/oculus/src/OculusControllerManager.h | 1 + 2 files changed, 12 insertions(+) diff --git a/plugins/oculus/src/OculusControllerManager.cpp b/plugins/oculus/src/OculusControllerManager.cpp index 5d493f4c9d..f0edc5a465 100644 --- a/plugins/oculus/src/OculusControllerManager.cpp +++ b/plugins/oculus/src/OculusControllerManager.cpp @@ -117,6 +117,17 @@ void OculusControllerManager::stopHapticPulse(bool leftHand) { } } +QStringList OculusControllerManager::getSubdeviceNames() { + QStringList devices; + if (_touch) { + devices << _touch->getName(); + } + if (_remote) { + devices << _remote->getName(); + } + return devices; +} + using namespace controller; static const std::vector> BUTTON_MAP { { diff --git a/plugins/oculus/src/OculusControllerManager.h b/plugins/oculus/src/OculusControllerManager.h index 234acd7db2..1ca9e0f47e 100644 --- a/plugins/oculus/src/OculusControllerManager.h +++ b/plugins/oculus/src/OculusControllerManager.h @@ -27,6 +27,7 @@ public: const QString& getName() const override { return NAME; } bool isHandController() const override { return _touch != nullptr; } + QStringList getSubdeviceNames() override; bool activate() override; void deactivate() override; From 625c98820de9e7cc2e78ffc14b1062fb505a4c03 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 3 Nov 2016 14:01:52 -0700 Subject: [PATCH 6/8] Fix isSubdeviceContainingNameAvailable --- libraries/plugins/src/plugins/PluginUtils.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/libraries/plugins/src/plugins/PluginUtils.cpp b/libraries/plugins/src/plugins/PluginUtils.cpp index f1cc85634f..b7e025222a 100644 --- a/libraries/plugins/src/plugins/PluginUtils.cpp +++ b/libraries/plugins/src/plugins/PluginUtils.cpp @@ -35,10 +35,12 @@ bool PluginUtils::isHandControllerAvailable() { bool isSubdeviceContainingNameAvailable(QString name) { for (auto& inputPlugin : PluginManager::getInstance()->getInputPlugins()) { - auto subdeviceNames = inputPlugin->getSubdeviceNames(); - for (auto& name : subdeviceNames) { - if (name.contains(name)) { - return true; + if (inputPlugin->isActive()) { + auto subdeviceNames = inputPlugin->getSubdeviceNames(); + for (auto& subdeviceName : subdeviceNames) { + if (subdeviceName.contains(name)) { + return true; + } } } } From 413199459bc6e2cf8caaa4e138216c3e0addea7e Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 3 Nov 2016 14:02:18 -0700 Subject: [PATCH 7/8] Fix the name searched for in isViveControllerAvailable --- libraries/plugins/src/plugins/PluginUtils.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/plugins/src/plugins/PluginUtils.cpp b/libraries/plugins/src/plugins/PluginUtils.cpp index b7e025222a..48530bfe8c 100644 --- a/libraries/plugins/src/plugins/PluginUtils.cpp +++ b/libraries/plugins/src/plugins/PluginUtils.cpp @@ -48,7 +48,7 @@ bool isSubdeviceContainingNameAvailable(QString name) { }; bool PluginUtils::isViveControllerAvailable() { - return isSubdeviceContainingNameAvailable("Vive"); + return isSubdeviceContainingNameAvailable("OpenVR"); }; bool PluginUtils::isXboxControllerAvailable() { From 687605ad38425eee9825e9581e3f8ec6ae7892b1 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 3 Nov 2016 14:02:53 -0700 Subject: [PATCH 8/8] Add proper adding and removal of subdeviceNames in SDL2Manager after startup --- plugins/hifiSdl2/src/Joystick.h | 2 ++ plugins/hifiSdl2/src/SDL2Manager.cpp | 6 +++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/plugins/hifiSdl2/src/Joystick.h b/plugins/hifiSdl2/src/Joystick.h index 25381d545a..a10e02d325 100644 --- a/plugins/hifiSdl2/src/Joystick.h +++ b/plugins/hifiSdl2/src/Joystick.h @@ -31,6 +31,8 @@ public: const QString& getName() const { return _name; } + SDL_GameController* getGameController() { return _sdlGameController; } + // Device functions virtual controller::Input::NamedVector getAvailableInputs() const override; virtual QString getDefaultMappingConfig() const override; diff --git a/plugins/hifiSdl2/src/SDL2Manager.cpp b/plugins/hifiSdl2/src/SDL2Manager.cpp index 91a693cc09..b6fa567aee 100644 --- a/plugins/hifiSdl2/src/SDL2Manager.cpp +++ b/plugins/hifiSdl2/src/SDL2Manager.cpp @@ -163,15 +163,19 @@ void SDL2Manager::pluginUpdate(float deltaTime, const controller::InputCalibrati Joystick::Pointer joystick = std::make_shared(id, controller); _openJoysticks[id] = joystick; userInputMapper->registerDevice(joystick); + QString name = SDL_GameControllerName(controller); emit joystickAdded(joystick.get()); - emit subdeviceConnected(getName(), SDL_GameControllerName(controller)); + emit subdeviceConnected(getName(), name); + _subdeviceNames << name; } } else if (event.type == SDL_CONTROLLERDEVICEREMOVED) { if (_openJoysticks.contains(event.cdevice.which)) { Joystick::Pointer joystick = _openJoysticks[event.cdevice.which]; _openJoysticks.remove(event.cdevice.which); userInputMapper->removeDevice(joystick->getDeviceID()); + QString name = SDL_GameControllerName(joystick->getGameController()); emit joystickRemoved(joystick.get()); + _subdeviceNames.removeOne(name); } } }