From a3cd032a41b39d38a26460acfec39561fde2ba6e Mon Sep 17 00:00:00 2001 From: Brad Hefta-Gaub Date: Thu, 29 Oct 2015 10:06:21 -0700 Subject: [PATCH 1/4] register/remove devices when the input plugins are activated/deactivated --- examples/controllers/controllerMappings.js | 8 +++++++- .../src/input-plugins/SDL2Manager.cpp | 17 +++++++++++++++++ .../src/input-plugins/SDL2Manager.h | 7 ++++++- .../src/input-plugins/SixenseManager.cpp | 4 +++- .../src/input-plugins/ViveControllerManager.cpp | 15 +++++++++++++-- .../src/input-plugins/ViveControllerManager.h | 3 +++ 6 files changed, 49 insertions(+), 5 deletions(-) diff --git a/examples/controllers/controllerMappings.js b/examples/controllers/controllerMappings.js index 42494816f4..3848f62096 100644 --- a/examples/controllers/controllerMappings.js +++ b/examples/controllers/controllerMappings.js @@ -91,5 +91,11 @@ Object.keys(Controller.Actions).forEach(function (actionName) { Controller.hardwareChanged.connect(function () { - print("hardwareChanged"); + print("hardwareChanged ---------------------------------------------------"); + Object.keys(Controller.Hardware).forEach(function (deviceName) { + Object.keys(Controller.Hardware[deviceName]).forEach(function (input) { + print("Controller.Hardware." + deviceName + "." + input + ":" + Controller.Hardware[deviceName][input]); + }); + }); + print("-------------------------------------------------------------------"); }); \ No newline at end of file diff --git a/libraries/input-plugins/src/input-plugins/SDL2Manager.cpp b/libraries/input-plugins/src/input-plugins/SDL2Manager.cpp index 54197b1a70..554b0bac95 100644 --- a/libraries/input-plugins/src/input-plugins/SDL2Manager.cpp +++ b/libraries/input-plugins/src/input-plugins/SDL2Manager.cpp @@ -74,6 +74,23 @@ void SDL2Manager::deinit() { #endif } +void SDL2Manager::activate() { + auto userInputMapper = DependencyManager::get(); + for (auto joystick : _openJoysticks) { + userInputMapper->registerDevice(joystick); + emit joystickAdded(joystick); + } +} + +void SDL2Manager::deactivate() { + auto userInputMapper = DependencyManager::get(); + for (auto joystick : _openJoysticks) { + userInputMapper->removeDevice(joystick->getDeviceID()); + emit joystickRemoved(joystick); + } +} + + bool SDL2Manager::isSupported() const { #ifdef HAVE_SDL2 return true; diff --git a/libraries/input-plugins/src/input-plugins/SDL2Manager.h b/libraries/input-plugins/src/input-plugins/SDL2Manager.h index fec6972591..ed543d4265 100644 --- a/libraries/input-plugins/src/input-plugins/SDL2Manager.h +++ b/libraries/input-plugins/src/input-plugins/SDL2Manager.h @@ -34,7 +34,12 @@ public: virtual void init() override; virtual void deinit() override; - + + /// Called when a plugin is being activated for use. May be called multiple times. + virtual void activate() override; + /// Called when a plugin is no longer being used. May be called multiple times. + virtual void deactivate() override; + virtual void pluginFocusOutEvent() override; virtual void pluginUpdate(float deltaTime, bool jointsCaptured) override; diff --git a/libraries/input-plugins/src/input-plugins/SixenseManager.cpp b/libraries/input-plugins/src/input-plugins/SixenseManager.cpp index d5ff4c93a8..60138929e9 100644 --- a/libraries/input-plugins/src/input-plugins/SixenseManager.cpp +++ b/libraries/input-plugins/src/input-plugins/SixenseManager.cpp @@ -92,6 +92,8 @@ void SixenseManager::activate() { auto userInputMapper = DependencyManager::get(); userInputMapper->registerDevice(this); + qDebug() << "just called registerDevice hydra id:" << _deviceID; + #ifdef __APPLE__ @@ -125,6 +127,7 @@ void SixenseManager::activate() { void SixenseManager::deactivate() { InputPlugin::deactivate(); + #ifdef HAVE_SIXENSE CONTAINER->removeMenuItem(MENU_NAME, TOGGLE_SMOOTH); CONTAINER->removeMenu(MENU_PATH); @@ -135,7 +138,6 @@ void SixenseManager::deactivate() { if (_deviceID != controller::Input::INVALID_DEVICE) { auto userInputMapper = DependencyManager::get(); userInputMapper->removeDevice(_deviceID); - _deviceID = controller::Input::INVALID_DEVICE; } #ifdef __APPLE__ diff --git a/libraries/input-plugins/src/input-plugins/ViveControllerManager.cpp b/libraries/input-plugins/src/input-plugins/ViveControllerManager.cpp index 8dd3d21a07..dc3e062417 100644 --- a/libraries/input-plugins/src/input-plugins/ViveControllerManager.cpp +++ b/libraries/input-plugins/src/input-plugins/ViveControllerManager.cpp @@ -133,6 +133,11 @@ void ViveControllerManager::activate() { _renderControllers = true; } #endif + + // unregister with UserInputMapper + auto userInputMapper = DependencyManager::get(); + userInputMapper->registerDevice(this); + _registeredWithInputMapper = true; } void ViveControllerManager::deactivate() { @@ -150,6 +155,11 @@ void ViveControllerManager::deactivate() { } _poseStateMap.clear(); #endif + + // unregister with UserInputMapper + auto userInputMapper = DependencyManager::get(); + userInputMapper->removeDevice(_deviceID); + _registeredWithInputMapper = false; } void ViveControllerManager::updateRendering(RenderArgs* args, render::ScenePointer scene, render::PendingChanges pendingChanges) { @@ -270,15 +280,16 @@ void ViveControllerManager::update(float deltaTime, bool jointsCaptured) { auto userInputMapper = DependencyManager::get(); if (numTrackedControllers == 0) { - if (_deviceID != 0) { + if (_registeredWithInputMapper) { userInputMapper->removeDevice(_deviceID); - _deviceID = 0; + _registeredWithInputMapper = false; _poseStateMap.clear(); } } if (_trackedControllers == 0 && numTrackedControllers > 0) { userInputMapper->registerDevice(this); + _registeredWithInputMapper = true; UserActivityLogger::getInstance().connectedDevice("spatial_controller", "steamVR"); } diff --git a/libraries/input-plugins/src/input-plugins/ViveControllerManager.h b/libraries/input-plugins/src/input-plugins/ViveControllerManager.h index 67ad75c9e8..6984734c21 100644 --- a/libraries/input-plugins/src/input-plugins/ViveControllerManager.h +++ b/libraries/input-plugins/src/input-plugins/ViveControllerManager.h @@ -69,6 +69,9 @@ private: bool _renderControllers; static const QString NAME; + + bool _registeredWithInputMapper { false }; + }; #endif // hifi__ViveControllerManager From ed87ae3d5a4461dacdef532188af3763293c205e Mon Sep 17 00:00:00 2001 From: Brad Hefta-Gaub Date: Thu, 29 Oct 2015 10:57:30 -0700 Subject: [PATCH 2/4] remove some debugging --- libraries/input-plugins/src/input-plugins/SixenseManager.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/libraries/input-plugins/src/input-plugins/SixenseManager.cpp b/libraries/input-plugins/src/input-plugins/SixenseManager.cpp index 31a7f50d5c..2527da9e03 100644 --- a/libraries/input-plugins/src/input-plugins/SixenseManager.cpp +++ b/libraries/input-plugins/src/input-plugins/SixenseManager.cpp @@ -81,7 +81,6 @@ bool SixenseManager::isSupported() const { } void SixenseManager::activate() { - qDebug() << "SixenseManager::activate()..."; InputPlugin::activate(); #ifdef HAVE_SIXENSE _calibrationState = CALIBRATION_STATE_IDLE; @@ -126,7 +125,6 @@ void SixenseManager::activate() { } void SixenseManager::deactivate() { - qDebug() << "SixenseManager::deactivate()..."; InputPlugin::deactivate(); #ifdef HAVE_SIXENSE From 3d37a1d2497dba09d1a03bf54a1c5d8d5fc6e170 Mon Sep 17 00:00:00 2001 From: Brad Hefta-Gaub Date: Thu, 29 Oct 2015 11:06:20 -0700 Subject: [PATCH 3/4] fix Controller.Hardware when input plugins are deactived --- .../controllers/src/controllers/ScriptingInterface.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/libraries/controllers/src/controllers/ScriptingInterface.cpp b/libraries/controllers/src/controllers/ScriptingInterface.cpp index e49248e8f0..a62172a730 100644 --- a/libraries/controllers/src/controllers/ScriptingInterface.cpp +++ b/libraries/controllers/src/controllers/ScriptingInterface.cpp @@ -204,25 +204,24 @@ namespace controller { } void ScriptingInterface::updateMaps() { + QVariantMap newHardware; auto userInputMapper = DependencyManager::get(); auto devices = userInputMapper->getDevices(); - QSet foundDevices; for (const auto& deviceMapping : devices) { auto deviceID = deviceMapping.first; if (deviceID != userInputMapper->getStandardDeviceID()) { auto device = deviceMapping.second; auto deviceName = QString(device->getName()).remove(SANITIZE_NAME_EXPRESSION); qCDebug(controllers) << "Device" << deviceMapping.first << ":" << deviceName; - foundDevices.insert(device->getName()); - if (_hardware.contains(deviceName)) { + if (newHardware.contains(deviceName)) { continue; } // Expose the IDs to JS - _hardware.insert(deviceName, createDeviceMap(device)); + newHardware.insert(deviceName, createDeviceMap(device)); } - } + _hardware = newHardware; } From 851460b2bd973e42d8c1f46b3346000c36013ce5 Mon Sep 17 00:00:00 2001 From: Brad Hefta-Gaub Date: Thu, 29 Oct 2015 11:26:11 -0700 Subject: [PATCH 4/4] fix build buster for SDL2 missing builds --- libraries/input-plugins/src/input-plugins/SDL2Manager.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libraries/input-plugins/src/input-plugins/SDL2Manager.cpp b/libraries/input-plugins/src/input-plugins/SDL2Manager.cpp index f41b724c11..600dc5c56f 100644 --- a/libraries/input-plugins/src/input-plugins/SDL2Manager.cpp +++ b/libraries/input-plugins/src/input-plugins/SDL2Manager.cpp @@ -75,19 +75,23 @@ void SDL2Manager::deinit() { } void SDL2Manager::activate() { +#ifdef HAVE_SDL2 auto userInputMapper = DependencyManager::get(); for (auto joystick : _openJoysticks) { userInputMapper->registerDevice(joystick); emit joystickAdded(joystick.get()); } +#endif } void SDL2Manager::deactivate() { +#ifdef HAVE_SDL2 auto userInputMapper = DependencyManager::get(); for (auto joystick : _openJoysticks) { userInputMapper->removeDevice(joystick->getDeviceID()); emit joystickRemoved(joystick.get()); } +#endif }