From 298ac650d8ea36f12d877d28ce35ac585e6d4c8f Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 20 Oct 2015 21:25:49 -0700 Subject: [PATCH 01/10] Isolate sixense dynamic linking for OSX --- .../src/input-plugins/SixenseManager.cpp | 101 +++--------------- .../src/input-plugins/SixenseManager.h | 18 ---- .../src/input-plugins/SixenseSupportOSX.cpp | 97 +++++++++++++++++ 3 files changed, 109 insertions(+), 107 deletions(-) create mode 100644 libraries/input-plugins/src/input-plugins/SixenseSupportOSX.cpp diff --git a/libraries/input-plugins/src/input-plugins/SixenseManager.cpp b/libraries/input-plugins/src/input-plugins/SixenseManager.cpp index 33b4332430..24b1b60356 100644 --- a/libraries/input-plugins/src/input-plugins/SixenseManager.cpp +++ b/libraries/input-plugins/src/input-plugins/SixenseManager.cpp @@ -9,12 +9,21 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -#include +#include "SixenseManager.h" + +#ifdef HAVE_SIXENSE +#include "sixense.h" +#endif #include #include #include +// TODO: This should not be here +#include +Q_DECLARE_LOGGING_CATEGORY(inputplugins) +Q_LOGGING_CATEGORY(inputplugins, "hifi.inputplugins") + #include #include #include @@ -25,40 +34,12 @@ #include #include -#include "SixenseManager.h" - - -#ifdef HAVE_SIXENSE - #include "sixense.h" - -#ifdef __APPLE__ -static QLibrary* _sixenseLibrary { nullptr }; -#endif - -#endif - -// TODO: This should not be here -#include -Q_DECLARE_LOGGING_CATEGORY(inputplugins) -Q_LOGGING_CATEGORY(inputplugins, "hifi.inputplugins") - -#ifdef HAVE_SIXENSE - +#include "UserActivityLogger.h" const glm::vec3 SixenseManager::DEFAULT_AVATAR_POSITION { -0.25f, -0.35f, -0.3f }; // in hydra frame const float SixenseManager::CONTROLLER_THRESHOLD { 0.35f }; const float SixenseManager::DEFAULT_REACH_LENGTH { 1.5f }; -#endif - -#ifdef __APPLE__ -typedef int (*SixenseBaseFunction)(); -typedef int (*SixenseTakeIntFunction)(int); -#ifdef HAVE_SIXENSE -typedef int (*SixenseTakeIntAndSixenseControllerData)(int, sixenseControllerData*); -#endif -#endif - const QString SixenseManager::NAME = "Sixense"; const QString SixenseManager::HYDRA_ID_STRING = "Razer Hydra"; @@ -94,31 +75,6 @@ void SixenseManager::activate() { auto userInputMapper = DependencyManager::get(); userInputMapper->registerDevice(_inputDevice); -#ifdef __APPLE__ - - if (!_sixenseLibrary) { - -#ifdef SIXENSE_LIB_FILENAME - _sixenseLibrary = new QLibrary(SIXENSE_LIB_FILENAME); -#else - const QString SIXENSE_LIBRARY_NAME = "libsixense_x64"; - QString frameworkSixenseLibrary = QCoreApplication::applicationDirPath() + "/../Frameworks/" - + SIXENSE_LIBRARY_NAME; - - _sixenseLibrary = new QLibrary(frameworkSixenseLibrary); -#endif - } - - if (_sixenseLibrary->load()){ - qCDebug(inputplugins) << "Loaded sixense library for hydra support -" << _sixenseLibrary->fileName(); - } else { - qCDebug(inputplugins) << "Sixense library at" << _sixenseLibrary->fileName() << "failed to load." - << "Continuing without hydra support."; - return; - } - - SixenseBaseFunction sixenseInit = (SixenseBaseFunction) _sixenseLibrary->resolve("sixenseInit"); -#endif loadSettings(); sixenseInit(); #endif @@ -139,26 +95,13 @@ void SixenseManager::deactivate() { userInputMapper->removeDevice(_inputDevice->_deviceID); } -#ifdef __APPLE__ - SixenseBaseFunction sixenseExit = (SixenseBaseFunction)_sixenseLibrary->resolve("sixenseExit"); -#endif - sixenseExit(); - -#ifdef __APPLE__ - delete _sixenseLibrary; -#endif - #endif } void SixenseManager::setSixenseFilter(bool filter) { #ifdef HAVE_SIXENSE -#ifdef __APPLE__ - SixenseTakeIntFunction sixenseSetFilterEnabled = (SixenseTakeIntFunction) _sixenseLibrary->resolve("sixenseSetFilterEnabled"); -#endif - int newFilter = filter ? 1 : 0; - sixenseSetFilterEnabled(newFilter); + sixenseSetFilterEnabled(filter ? 1 : 0); #endif } @@ -180,11 +123,6 @@ void SixenseManager::InputDevice::update(float deltaTime, bool jointsCaptured) { #ifdef HAVE_SIXENSE _buttonPressedMap.clear(); -#ifdef __APPLE__ - SixenseBaseFunction sixenseGetNumActiveControllers = - (SixenseBaseFunction) _sixenseLibrary->resolve("sixenseGetNumActiveControllers"); -#endif - auto userInputMapper = DependencyManager::get(); static const float MAX_DISCONNECTED_TIME = 2.0f; @@ -213,24 +151,11 @@ void SixenseManager::InputDevice::update(float deltaTime, bool jointsCaptured) { // FIXME send this message once when we've positively identified hydra hardware //UserActivityLogger::getInstance().connectedDevice("spatial_controller", "hydra"); -#ifdef __APPLE__ - SixenseBaseFunction sixenseGetMaxControllers = - (SixenseBaseFunction) _sixenseLibrary->resolve("sixenseGetMaxControllers"); -#endif - int maxControllers = sixenseGetMaxControllers(); // we only support two controllers sixenseControllerData controllers[2]; -#ifdef __APPLE__ - SixenseTakeIntFunction sixenseIsControllerEnabled = - (SixenseTakeIntFunction) _sixenseLibrary->resolve("sixenseIsControllerEnabled"); - - SixenseTakeIntAndSixenseControllerData sixenseGetNewestData = - (SixenseTakeIntAndSixenseControllerData) _sixenseLibrary->resolve("sixenseGetNewestData"); -#endif - int numActiveControllers = 0; for (int i = 0; i < maxControllers && numActiveControllers < 2; i++) { if (!sixenseIsControllerEnabled(i)) { @@ -479,8 +404,6 @@ void SixenseManager::InputDevice::handlePoseEvent(float deltaTime, glm::vec3 pos glm::vec3 velocity(0.0f); glm::quat angularVelocity; - - if (prevPose.isValid() && deltaTime > std::numeric_limits::epsilon()) { velocity = (position - prevPose.getTranslation()) / deltaTime; diff --git a/libraries/input-plugins/src/input-plugins/SixenseManager.h b/libraries/input-plugins/src/input-plugins/SixenseManager.h index 062a27390c..bf657d347b 100644 --- a/libraries/input-plugins/src/input-plugins/SixenseManager.h +++ b/libraries/input-plugins/src/input-plugins/SixenseManager.h @@ -12,18 +12,6 @@ #ifndef hifi_SixenseManager_h #define hifi_SixenseManager_h -#ifdef HAVE_SIXENSE - #include - #include - #include "sixense.h" - -#ifdef __APPLE__ - #include - #include -#endif - -#endif - #include #include @@ -31,8 +19,6 @@ #include "InputPlugin.h" -class QLibrary; - const unsigned int BUTTON_0 = 1U << 0; // the skinny button between 1 and 2 const unsigned int BUTTON_1 = 1U << 5; const unsigned int BUTTON_2 = 1U << 6; @@ -75,7 +61,6 @@ private: static const float CONTROLLER_THRESHOLD; static const float DEFAULT_REACH_LENGTH; - using Samples = std::pair< MovingAverage< glm::vec3, MAX_NUM_AVERAGING_SAMPLES>, MovingAverage< glm::vec4, MAX_NUM_AVERAGING_SAMPLES> >; using MovingAverageMap = std::map< int, Samples >; @@ -113,9 +98,6 @@ private: glm::vec3 _reachRight; }; - - - bool _useSixenseFilter = true; std::shared_ptr _inputDevice { std::make_shared() }; static const QString NAME; diff --git a/libraries/input-plugins/src/input-plugins/SixenseSupportOSX.cpp b/libraries/input-plugins/src/input-plugins/SixenseSupportOSX.cpp new file mode 100644 index 0000000000..c5c3f7f14a --- /dev/null +++ b/libraries/input-plugins/src/input-plugins/SixenseSupportOSX.cpp @@ -0,0 +1,97 @@ +// +// SixenseSupportOSX.cpp +// +// +// Created by Clement on 10/20/15. +// Copyright 2015 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#ifdef __APPLE__ +#include "sixense.h" + +#include +#include +#include + +using std::string; +using std::unique_ptr; +using SixenseBaseFunction = int (*)(); +using SixenseTakeIntFunction = int (*)(int); +using SixenseTakeIntAndSixenseControllerData = int (*)(int, sixenseControllerData*); + +static unique_ptr SIXENSE; + +bool loadSixense() { + if (!SIXENSE) { + static const QString LIBRARY_PATH = +#ifdef SIXENSE_LIB_FILENAME + SIXENSE_LIB_FILENAME; +#else + QCoreApplication::applicationDirPath() + "/../Frameworks/libsixense_x64"; +#endif + SIXENSE.reset(new QLibrary(LIBRARY_PATH)); + } + + if (SIXENSE->load()){ + qDebug() << "Loaded sixense library for hydra support -" << SIXENSE->fileName(); + } else { + qDebug() << "Sixense library at" << SIXENSE->fileName() << "failed to load:" << SIXENSE->errorString(); + qDebug() << "Continuing without hydra support."; + } + return SIXENSE->isLoaded(); +} + +void unloadSixense() { + SIXENSE->unload(); +} + +template +Func resolve(const char* name) { + Q_ASSERT_X(SIXENSE && SIXENSE->isLoaded(), __FUNCTION__, "Sixense library not loaded"); + auto func = reinterpret_cast(SIXENSE->resolve(name)); + Q_ASSERT_X(func, __FUNCTION__, string("Could not resolve ").append(name).c_str()); + return func; +} + +// sixense.h wrapper for OSX dynamic linking +int sixenseInit() { + loadSixense(); + auto sixenseInit = resolve("sixenseInit"); + return sixenseInit(); +} + +int sixenseExit() { + auto sixenseExit = resolve("sixenseExit"); + auto returnCode = sixenseExit(); + unloadSixense(); + return returnCode; +} + +int sixenseSetFilterEnabled(int input) { + auto sixenseSetFilterEnabled = resolve("sixenseSetFilterEnabled"); + return sixenseSetFilterEnabled(input); +} + +int sixenseGetNumActiveControllers() { + auto sixenseGetNumActiveControllers = resolve("sixenseGetNumActiveControllers"); + return sixenseGetNumActiveControllers(); +} + +int sixenseGetMaxControllers() { + auto sixenseGetMaxControllers = resolve("sixenseGetMaxControllers"); + return sixenseGetMaxControllers(); +} + +int sixenseIsControllerEnabled(int input) { + auto sixenseIsControllerEnabled = resolve("sixenseIsControllerEnabled"); + return sixenseIsControllerEnabled(input); +} + +int sixenseGetNewestData(int input1, sixenseControllerData* intput2) { + auto sixenseGetNewestData = resolve("sixenseGetNewestData"); + return sixenseGetNewestData(input1, intput2); +} +#endif From 96aa5be457d1455348ffdf5e90f38898c79eaf3a Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 20 Oct 2015 23:06:44 -0700 Subject: [PATCH 02/10] Implement all Sixense methods for OS X --- .../src/input-plugins/SixenseSupportOSX.cpp | 102 +++++++++++++----- 1 file changed, 76 insertions(+), 26 deletions(-) diff --git a/libraries/input-plugins/src/input-plugins/SixenseSupportOSX.cpp b/libraries/input-plugins/src/input-plugins/SixenseSupportOSX.cpp index c5c3f7f14a..a890d7c138 100644 --- a/libraries/input-plugins/src/input-plugins/SixenseSupportOSX.cpp +++ b/libraries/input-plugins/src/input-plugins/SixenseSupportOSX.cpp @@ -24,7 +24,7 @@ using SixenseTakeIntAndSixenseControllerData = int (*)(int, sixenseControllerDat static unique_ptr SIXENSE; -bool loadSixense() { +void loadSixense() { if (!SIXENSE) { static const QString LIBRARY_PATH = #ifdef SIXENSE_LIB_FILENAME @@ -41,57 +41,107 @@ bool loadSixense() { qDebug() << "Sixense library at" << SIXENSE->fileName() << "failed to load:" << SIXENSE->errorString(); qDebug() << "Continuing without hydra support."; } - return SIXENSE->isLoaded(); } void unloadSixense() { SIXENSE->unload(); } -template -Func resolve(const char* name) { +template +int call(const char* name, Args... args) { Q_ASSERT_X(SIXENSE && SIXENSE->isLoaded(), __FUNCTION__, "Sixense library not loaded"); - auto func = reinterpret_cast(SIXENSE->resolve(name)); + auto func = reinterpret_cast(SIXENSE->resolve(name)); Q_ASSERT_X(func, __FUNCTION__, string("Could not resolve ").append(name).c_str()); - return func; + return func(args...); } // sixense.h wrapper for OSX dynamic linking int sixenseInit() { loadSixense(); - auto sixenseInit = resolve("sixenseInit"); - return sixenseInit(); + return call(__FUNCTION__); } - int sixenseExit() { - auto sixenseExit = resolve("sixenseExit"); - auto returnCode = sixenseExit(); + auto returnCode = call(__FUNCTION__); unloadSixense(); return returnCode; } -int sixenseSetFilterEnabled(int input) { - auto sixenseSetFilterEnabled = resolve("sixenseSetFilterEnabled"); - return sixenseSetFilterEnabled(input); +int sixenseGetMaxBases() { + return call(__FUNCTION__); } - -int sixenseGetNumActiveControllers() { - auto sixenseGetNumActiveControllers = resolve("sixenseGetNumActiveControllers"); - return sixenseGetNumActiveControllers(); +int sixenseSetActiveBase(int i) { + return call(__FUNCTION__, i); +} +int sixenseIsBaseConnected(int i) { + return call(__FUNCTION__, i); } int sixenseGetMaxControllers() { - auto sixenseGetMaxControllers = resolve("sixenseGetMaxControllers"); - return sixenseGetMaxControllers(); + return call(__FUNCTION__); +} +int sixenseIsControllerEnabled(int which) { + return call(__FUNCTION__, which); +} +int sixenseGetNumActiveControllers() { + return call(__FUNCTION__); } -int sixenseIsControllerEnabled(int input) { - auto sixenseIsControllerEnabled = resolve("sixenseIsControllerEnabled"); - return sixenseIsControllerEnabled(input); +int sixenseGetHistorySize() { + return call(__FUNCTION__); } -int sixenseGetNewestData(int input1, sixenseControllerData* intput2) { - auto sixenseGetNewestData = resolve("sixenseGetNewestData"); - return sixenseGetNewestData(input1, intput2); +int sixenseGetData(int which, int index_back, sixenseControllerData* data) { + return call(__FUNCTION__, which, index_back, data); +} +int sixenseGetAllData(int index_back, sixenseAllControllerData* data) { + return call(__FUNCTION__, index_back, data); +} +int sixenseGetNewestData(int which, sixenseControllerData* data) { + return call(__FUNCTION__, which, data); +} +int sixenseGetAllNewestData(sixenseAllControllerData* data) { + return call(__FUNCTION__, data); +} + +int sixenseSetHemisphereTrackingMode(int which_controller, int state) { + return call(__FUNCTION__, which_controller, state); +} +int sixenseGetHemisphereTrackingMode(int which_controller, int* state) { + return call(__FUNCTION__, which_controller, state); +} +int sixenseAutoEnableHemisphereTracking(int which_controller) { + return call(__FUNCTION__, which_controller); +} + +int sixenseSetHighPriorityBindingEnabled(int on_or_off) { + return call(__FUNCTION__, on_or_off); +} +int sixenseGetHighPriorityBindingEnabled(int* on_or_off) { + return call(__FUNCTION__, on_or_off); +} + +int sixenseTriggerVibration(int controller_id, int duration_100ms, int pattern_id) { + return call(__FUNCTION__, controller_id, duration_100ms, pattern_id); +} + +int sixenseSetFilterEnabled(int on_or_off) { + return call(__FUNCTION__, on_or_off); +} +int sixenseGetFilterEnabled(int* on_or_off) { + return call(__FUNCTION__, on_or_off); +} + +int sixenseSetFilterParams(float near_range, float near_val, float far_range, float far_val) { + return call(__FUNCTION__, near_range, near_val, far_range, far_val); +} +int sixenseGetFilterParams(float* near_range, float* near_val, float* far_range, float* far_val) { + return call(__FUNCTION__, near_range, near_val, far_range, far_val); +} + +int sixenseSetBaseColor(unsigned char red, unsigned char green, unsigned char blue) { + return call(__FUNCTION__, red, green, blue); +} +int sixenseGetBaseColor(unsigned char* red, unsigned char* green, unsigned char* blue) { + return call(__FUNCTION__, red, green, blue); } #endif From 503e03d4a811b67c7beade04bc030c45a494cab3 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 20 Oct 2015 23:17:58 -0700 Subject: [PATCH 03/10] Remove unused `using` --- .../src/input-plugins/SixenseSupportOSX.cpp | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/libraries/input-plugins/src/input-plugins/SixenseSupportOSX.cpp b/libraries/input-plugins/src/input-plugins/SixenseSupportOSX.cpp index a890d7c138..99af9c0ffc 100644 --- a/libraries/input-plugins/src/input-plugins/SixenseSupportOSX.cpp +++ b/libraries/input-plugins/src/input-plugins/SixenseSupportOSX.cpp @@ -16,13 +16,7 @@ #include #include -using std::string; -using std::unique_ptr; -using SixenseBaseFunction = int (*)(); -using SixenseTakeIntFunction = int (*)(int); -using SixenseTakeIntAndSixenseControllerData = int (*)(int, sixenseControllerData*); - -static unique_ptr SIXENSE; +static std::unique_ptr SIXENSE; void loadSixense() { if (!SIXENSE) { @@ -51,7 +45,7 @@ template int call(const char* name, Args... args) { Q_ASSERT_X(SIXENSE && SIXENSE->isLoaded(), __FUNCTION__, "Sixense library not loaded"); auto func = reinterpret_cast(SIXENSE->resolve(name)); - Q_ASSERT_X(func, __FUNCTION__, string("Could not resolve ").append(name).c_str()); + Q_ASSERT_X(func, __FUNCTION__, std::string("Could not resolve ").append(name).c_str()); return func(args...); } From e3b54f0272a25a8f38ddd4721109f4f1eae4a939 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 20 Oct 2015 23:41:20 -0700 Subject: [PATCH 04/10] Cleanup --- .../src/input-plugins/SixenseSupportOSX.cpp | 81 ++++++++++--------- 1 file changed, 45 insertions(+), 36 deletions(-) diff --git a/libraries/input-plugins/src/input-plugins/SixenseSupportOSX.cpp b/libraries/input-plugins/src/input-plugins/SixenseSupportOSX.cpp index 99af9c0ffc..4c8a285d76 100644 --- a/libraries/input-plugins/src/input-plugins/SixenseSupportOSX.cpp +++ b/libraries/input-plugins/src/input-plugins/SixenseSupportOSX.cpp @@ -1,6 +1,6 @@ // // SixenseSupportOSX.cpp -// +// libraries/input-plugins/src/input-plugins // // Created by Clement on 10/20/15. // Copyright 2015 High Fidelity, Inc. @@ -9,14 +9,31 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -#ifdef __APPLE__ +#if defined(__APPLE__) && defined(HAVE_SIXENSE) #include "sixense.h" #include #include #include -static std::unique_ptr SIXENSE; +using Library = std::unique_ptr; +static Library SIXENSE; + +struct Callable { + template int operator() (Args... args){ + return reinterpret_cast(function)(args...); + } + QFunctionPointer function; +}; + +Callable resolve(const Library& library, const char* name) { + Q_ASSERT_X(library && library->isLoaded(), __FUNCTION__, "Sixense library not loaded"); + auto function = library->resolve(name); + Q_ASSERT_X(function, __FUNCTION__, std::string("Could not resolve ").append(name).c_str()); + return Callable { function }; +} +#define FOREWARD resolve(SIXENSE, __FUNCTION__) + void loadSixense() { if (!SIXENSE) { @@ -36,106 +53,98 @@ void loadSixense() { qDebug() << "Continuing without hydra support."; } } - void unloadSixense() { SIXENSE->unload(); } -template -int call(const char* name, Args... args) { - Q_ASSERT_X(SIXENSE && SIXENSE->isLoaded(), __FUNCTION__, "Sixense library not loaded"); - auto func = reinterpret_cast(SIXENSE->resolve(name)); - Q_ASSERT_X(func, __FUNCTION__, std::string("Could not resolve ").append(name).c_str()); - return func(args...); -} // sixense.h wrapper for OSX dynamic linking int sixenseInit() { loadSixense(); - return call(__FUNCTION__); + return FOREWARD(); } int sixenseExit() { - auto returnCode = call(__FUNCTION__); + auto returnCode = FOREWARD(); unloadSixense(); return returnCode; } int sixenseGetMaxBases() { - return call(__FUNCTION__); + return FOREWARD(); } int sixenseSetActiveBase(int i) { - return call(__FUNCTION__, i); + return FOREWARD(i); } int sixenseIsBaseConnected(int i) { - return call(__FUNCTION__, i); + return FOREWARD(i); } int sixenseGetMaxControllers() { - return call(__FUNCTION__); + return FOREWARD(); } int sixenseIsControllerEnabled(int which) { - return call(__FUNCTION__, which); + return FOREWARD(which); } int sixenseGetNumActiveControllers() { - return call(__FUNCTION__); + return FOREWARD(); } int sixenseGetHistorySize() { - return call(__FUNCTION__); + return FOREWARD(); } int sixenseGetData(int which, int index_back, sixenseControllerData* data) { - return call(__FUNCTION__, which, index_back, data); + return FOREWARD(which, index_back, data); } int sixenseGetAllData(int index_back, sixenseAllControllerData* data) { - return call(__FUNCTION__, index_back, data); + return FOREWARD(index_back, data); } int sixenseGetNewestData(int which, sixenseControllerData* data) { - return call(__FUNCTION__, which, data); + return FOREWARD(which, data); } int sixenseGetAllNewestData(sixenseAllControllerData* data) { - return call(__FUNCTION__, data); + return FOREWARD(data); } int sixenseSetHemisphereTrackingMode(int which_controller, int state) { - return call(__FUNCTION__, which_controller, state); + return FOREWARD(which_controller, state); } int sixenseGetHemisphereTrackingMode(int which_controller, int* state) { - return call(__FUNCTION__, which_controller, state); + return FOREWARD(which_controller, state); } int sixenseAutoEnableHemisphereTracking(int which_controller) { - return call(__FUNCTION__, which_controller); + return FOREWARD(which_controller); } int sixenseSetHighPriorityBindingEnabled(int on_or_off) { - return call(__FUNCTION__, on_or_off); + return FOREWARD(on_or_off); } int sixenseGetHighPriorityBindingEnabled(int* on_or_off) { - return call(__FUNCTION__, on_or_off); + return FOREWARD(on_or_off); } int sixenseTriggerVibration(int controller_id, int duration_100ms, int pattern_id) { - return call(__FUNCTION__, controller_id, duration_100ms, pattern_id); + return FOREWARD(controller_id, duration_100ms, pattern_id); } int sixenseSetFilterEnabled(int on_or_off) { - return call(__FUNCTION__, on_or_off); + return FOREWARD(on_or_off); } int sixenseGetFilterEnabled(int* on_or_off) { - return call(__FUNCTION__, on_or_off); + return FOREWARD(on_or_off); } int sixenseSetFilterParams(float near_range, float near_val, float far_range, float far_val) { - return call(__FUNCTION__, near_range, near_val, far_range, far_val); + return FOREWARD(near_range, near_val, far_range, far_val); } int sixenseGetFilterParams(float* near_range, float* near_val, float* far_range, float* far_val) { - return call(__FUNCTION__, near_range, near_val, far_range, far_val); + return FOREWARD(near_range, near_val, far_range, far_val); } int sixenseSetBaseColor(unsigned char red, unsigned char green, unsigned char blue) { - return call(__FUNCTION__, red, green, blue); + return FOREWARD(red, green, blue); } int sixenseGetBaseColor(unsigned char* red, unsigned char* green, unsigned char* blue) { - return call(__FUNCTION__, red, green, blue); + return FOREWARD(red, green, blue); } #endif From 6ad20e417b41ddce22c7c13bc8d6811742b21600 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 21 Oct 2015 18:27:32 -0700 Subject: [PATCH 05/10] Typo --- .../src/input-plugins/SixenseSupportOSX.cpp | 52 +++++++++---------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/libraries/input-plugins/src/input-plugins/SixenseSupportOSX.cpp b/libraries/input-plugins/src/input-plugins/SixenseSupportOSX.cpp index 4c8a285d76..3ac2d197c2 100644 --- a/libraries/input-plugins/src/input-plugins/SixenseSupportOSX.cpp +++ b/libraries/input-plugins/src/input-plugins/SixenseSupportOSX.cpp @@ -32,7 +32,7 @@ Callable resolve(const Library& library, const char* name) { Q_ASSERT_X(function, __FUNCTION__, std::string("Could not resolve ").append(name).c_str()); return Callable { function }; } -#define FOREWARD resolve(SIXENSE, __FUNCTION__) +#define FORWARD resolve(SIXENSE, __FUNCTION__) void loadSixense() { @@ -61,90 +61,90 @@ void unloadSixense() { // sixense.h wrapper for OSX dynamic linking int sixenseInit() { loadSixense(); - return FOREWARD(); + return FORWARD(); } int sixenseExit() { - auto returnCode = FOREWARD(); + auto returnCode = FORWARD(); unloadSixense(); return returnCode; } int sixenseGetMaxBases() { - return FOREWARD(); + return FORWARD(); } int sixenseSetActiveBase(int i) { - return FOREWARD(i); + return FORWARD(i); } int sixenseIsBaseConnected(int i) { - return FOREWARD(i); + return FORWARD(i); } int sixenseGetMaxControllers() { - return FOREWARD(); + return FORWARD(); } int sixenseIsControllerEnabled(int which) { - return FOREWARD(which); + return FORWARD(which); } int sixenseGetNumActiveControllers() { - return FOREWARD(); + return FORWARD(); } int sixenseGetHistorySize() { - return FOREWARD(); + return FORWARD(); } int sixenseGetData(int which, int index_back, sixenseControllerData* data) { - return FOREWARD(which, index_back, data); + return FORWARD(which, index_back, data); } int sixenseGetAllData(int index_back, sixenseAllControllerData* data) { - return FOREWARD(index_back, data); + return FORWARD(index_back, data); } int sixenseGetNewestData(int which, sixenseControllerData* data) { - return FOREWARD(which, data); + return FORWARD(which, data); } int sixenseGetAllNewestData(sixenseAllControllerData* data) { - return FOREWARD(data); + return FORWARD(data); } int sixenseSetHemisphereTrackingMode(int which_controller, int state) { - return FOREWARD(which_controller, state); + return FORWARD(which_controller, state); } int sixenseGetHemisphereTrackingMode(int which_controller, int* state) { - return FOREWARD(which_controller, state); + return FORWARD(which_controller, state); } int sixenseAutoEnableHemisphereTracking(int which_controller) { - return FOREWARD(which_controller); + return FORWARD(which_controller); } int sixenseSetHighPriorityBindingEnabled(int on_or_off) { - return FOREWARD(on_or_off); + return FORWARD(on_or_off); } int sixenseGetHighPriorityBindingEnabled(int* on_or_off) { - return FOREWARD(on_or_off); + return FORWARD(on_or_off); } int sixenseTriggerVibration(int controller_id, int duration_100ms, int pattern_id) { - return FOREWARD(controller_id, duration_100ms, pattern_id); + return FORWARD(controller_id, duration_100ms, pattern_id); } int sixenseSetFilterEnabled(int on_or_off) { - return FOREWARD(on_or_off); + return FORWARD(on_or_off); } int sixenseGetFilterEnabled(int* on_or_off) { - return FOREWARD(on_or_off); + return FORWARD(on_or_off); } int sixenseSetFilterParams(float near_range, float near_val, float far_range, float far_val) { - return FOREWARD(near_range, near_val, far_range, far_val); + return FORWARD(near_range, near_val, far_range, far_val); } int sixenseGetFilterParams(float* near_range, float* near_val, float* far_range, float* far_val) { - return FOREWARD(near_range, near_val, far_range, far_val); + return FORWARD(near_range, near_val, far_range, far_val); } int sixenseSetBaseColor(unsigned char red, unsigned char green, unsigned char blue) { - return FOREWARD(red, green, blue); + return FORWARD(red, green, blue); } int sixenseGetBaseColor(unsigned char* red, unsigned char* green, unsigned char* blue) { - return FOREWARD(red, green, blue); + return FORWARD(red, green, blue); } #endif From 0a65bb145b0b4a1cb9445999619b576af93578ee Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 5 Nov 2015 11:08:20 -0800 Subject: [PATCH 06/10] Some more code cleanup --- interface/src/ui/ApplicationCompositor.cpp | 13 +------ .../src/input-plugins/SixenseManager.cpp | 38 +++++++++---------- .../src/input-plugins/SixenseManager.h | 23 +++-------- 3 files changed, 24 insertions(+), 50 deletions(-) diff --git a/interface/src/ui/ApplicationCompositor.cpp b/interface/src/ui/ApplicationCompositor.cpp index 2a2a45b67b..5b7bbc2aba 100644 --- a/interface/src/ui/ApplicationCompositor.cpp +++ b/interface/src/ui/ApplicationCompositor.cpp @@ -473,18 +473,7 @@ void ApplicationCompositor::renderControllerPointers(gpu::Batch& batch) { continue; } - int controllerButtons = 0; - - //Check for if we should toggle or drag the magnification window - if (controllerButtons & BUTTON_3) { - if (isPressed[index] == false) { - //We are now dragging the window - isPressed[index] = true; - //set the pressed time in us - pressedTime[index] = usecTimestampNow(); - stateWhenPressed[index] = _magActive[index]; - } - } else if (isPressed[index]) { + if (isPressed[index]) { isPressed[index] = false; //If the button was only pressed for < 250 ms //then disable it. diff --git a/libraries/input-plugins/src/input-plugins/SixenseManager.cpp b/libraries/input-plugins/src/input-plugins/SixenseManager.cpp index 24b1b60356..56f79ce3c1 100644 --- a/libraries/input-plugins/src/input-plugins/SixenseManager.cpp +++ b/libraries/input-plugins/src/input-plugins/SixenseManager.cpp @@ -24,21 +24,25 @@ Q_DECLARE_LOGGING_CATEGORY(inputplugins) Q_LOGGING_CATEGORY(inputplugins, "hifi.inputplugins") +#include #include #include -#include -#include -#include #include -#include +#include +#include +#include #include -#include -#include "UserActivityLogger.h" +static const unsigned int BUTTON_0 = 1U << 0; // the skinny button between 1 and 2 +static const unsigned int BUTTON_1 = 1U << 5; +static const unsigned int BUTTON_2 = 1U << 6; +static const unsigned int BUTTON_3 = 1U << 3; +static const unsigned int BUTTON_4 = 1U << 4; +static const unsigned int BUTTON_FWD = 1U << 7; +static const unsigned int BUTTON_TRIGGER = 1U << 8; const glm::vec3 SixenseManager::DEFAULT_AVATAR_POSITION { -0.25f, -0.35f, -0.3f }; // in hydra frame const float SixenseManager::CONTROLLER_THRESHOLD { 0.35f }; -const float SixenseManager::DEFAULT_REACH_LENGTH { 1.5f }; const QString SixenseManager::NAME = "Sixense"; const QString SixenseManager::HYDRA_ID_STRING = "Razer Hydra"; @@ -47,7 +51,6 @@ const QString MENU_PARENT = "Avatar"; const QString MENU_NAME = "Sixense"; const QString MENU_PATH = MENU_PARENT + ">" + MENU_NAME; const QString TOGGLE_SMOOTH = "Smooth Sixense Movement"; -const float DEFAULT_REACH_LENGTH = 1.5f; bool SixenseManager::isSupported() const { #ifdef HAVE_SIXENSE @@ -65,11 +68,11 @@ bool SixenseManager::isSupported() const { void SixenseManager::activate() { InputPlugin::activate(); + #ifdef HAVE_SIXENSE - _container->addMenu(MENU_PATH); _container->addMenuItem(MENU_PATH, TOGGLE_SMOOTH, - [this] (bool clicked) { this->setSixenseFilter(clicked); }, + [this] (bool clicked) { setSixenseFilter(clicked); }, true, true); auto userInputMapper = DependencyManager::get(); @@ -96,6 +99,7 @@ void SixenseManager::deactivate() { } sixenseExit(); + saveSettings(); #endif } @@ -123,8 +127,6 @@ void SixenseManager::InputDevice::update(float deltaTime, bool jointsCaptured) { #ifdef HAVE_SIXENSE _buttonPressedMap.clear(); - auto userInputMapper = DependencyManager::get(); - static const float MAX_DISCONNECTED_TIME = 2.0f; static bool disconnected { false }; static float disconnectedInterval { 0.0f }; @@ -218,9 +220,9 @@ void SixenseManager::InputDevice::update(float deltaTime, bool jointsCaptured) { // (4) assume that the orb is on a flat surface (yAxis is UP) // (5) compute the forward direction (zAxis = xAxis cross yAxis) -const float MINIMUM_ARM_REACH = 0.3f; // meters -const float MAXIMUM_NOISE_LEVEL = 0.05f; // meters -const quint64 LOCK_DURATION = USECS_PER_SECOND / 4; // time for lock to be acquired +static const float MINIMUM_ARM_REACH = 0.3f; // meters +static const float MAXIMUM_NOISE_LEVEL = 0.05f; // meters +static const quint64 LOCK_DURATION = USECS_PER_SECOND / 4; // time for lock to be acquired void SixenseManager::InputDevice::updateCalibration(void* controllersX) { auto controllers = reinterpret_cast(controllersX); @@ -240,14 +242,12 @@ void SixenseManager::InputDevice::updateCalibration(void* controllersX) { glm::vec3 xAxis = glm::normalize(_reachRight - _reachLeft); glm::vec3 zAxis = glm::normalize(glm::cross(xAxis, Vectors::UNIT_Y)); xAxis = glm::normalize(glm::cross(Vectors::UNIT_Y, zAxis)); - _reachLength = glm::dot(xAxis, _reachRight - _reachLeft); _avatarRotation = glm::inverse(glm::quat_cast(glm::mat3(xAxis, Vectors::UNIT_Y, zAxis))); const float Y_OFFSET_CALIBRATED_HANDS_TO_AVATAR = -0.3f; _avatarPosition.y += Y_OFFSET_CALIBRATED_HANDS_TO_AVATAR; qCDebug(inputplugins, "succeess: sixense calibration"); } break; - default: _calibrationState = CALIBRATION_STATE_IDLE; qCDebug(inputplugins, "failed: sixense calibration"); @@ -441,8 +441,6 @@ static const auto R2 = controller::A; static const auto R3 = controller::B; static const auto R4 = controller::Y; -using namespace controller; - controller::Input::NamedVector SixenseManager::InputDevice::getAvailableInputs() const { using namespace controller; static const Input::NamedVector availableInputs { @@ -486,7 +484,6 @@ void SixenseManager::saveSettings() const { { settings.setVec3Value(QString("avatarPosition"), _inputDevice->_avatarPosition); settings.setQuatValue(QString("avatarRotation"), _inputDevice->_avatarRotation); - settings.setValue(QString("reachLength"), QVariant(_inputDevice->_reachLength)); } settings.endGroup(); } @@ -498,7 +495,6 @@ void SixenseManager::loadSettings() { { settings.getVec3ValueIfValid(QString("avatarPosition"), _inputDevice->_avatarPosition); settings.getQuatValueIfValid(QString("avatarRotation"), _inputDevice->_avatarRotation); - settings.getFloatValueIfValid(QString("reachLength"), _inputDevice->_reachLength); } settings.endGroup(); } diff --git a/libraries/input-plugins/src/input-plugins/SixenseManager.h b/libraries/input-plugins/src/input-plugins/SixenseManager.h index bf657d347b..bdfbd539cb 100644 --- a/libraries/input-plugins/src/input-plugins/SixenseManager.h +++ b/libraries/input-plugins/src/input-plugins/SixenseManager.h @@ -19,21 +19,10 @@ #include "InputPlugin.h" -const unsigned int BUTTON_0 = 1U << 0; // the skinny button between 1 and 2 -const unsigned int BUTTON_1 = 1U << 5; -const unsigned int BUTTON_2 = 1U << 6; -const unsigned int BUTTON_3 = 1U << 3; -const unsigned int BUTTON_4 = 1U << 4; -const unsigned int BUTTON_FWD = 1U << 7; -const unsigned int BUTTON_TRIGGER = 1U << 8; - -const bool DEFAULT_INVERT_SIXENSE_MOUSE_BUTTONS = false; - // Handles interaction with the Sixense SDK (e.g., Razer Hydra). class SixenseManager : public InputPlugin { Q_OBJECT public: - // Plugin functions virtual bool isSupported() const override; virtual bool isJointController() const override { return true; } @@ -52,17 +41,18 @@ public: public slots: void setSixenseFilter(bool filter); -private: +private: static const int MAX_NUM_AVERAGING_SAMPLES = 50; // At ~100 updates per seconds this means averaging over ~.5s static const int CALIBRATION_STATE_IDLE = 0; static const int CALIBRATION_STATE_IN_PROGRESS = 1; static const int CALIBRATION_STATE_COMPLETE = 2; static const glm::vec3 DEFAULT_AVATAR_POSITION; static const float CONTROLLER_THRESHOLD; - static const float DEFAULT_REACH_LENGTH; - - using Samples = std::pair< MovingAverage< glm::vec3, MAX_NUM_AVERAGING_SAMPLES>, MovingAverage< glm::vec4, MAX_NUM_AVERAGING_SAMPLES> >; - using MovingAverageMap = std::map< int, Samples >; + + template + using SampleAverage = MovingAverage; + using Samples = std::pair, SampleAverage>; + using MovingAverageMap = std::map; class InputDevice : public controller::InputDevice { public: @@ -88,7 +78,6 @@ private: glm::vec3 _avatarPosition { DEFAULT_AVATAR_POSITION }; // in hydra-frame glm::quat _avatarRotation; // in hydra-frame - float _reachLength { DEFAULT_REACH_LENGTH }; float _lastDistance; // these are measured values used to compute the calibration results quint64 _lockExpiry; From d95709ee731aaa9fa031963e021b10d32062ddfc Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Fri, 6 Nov 2015 16:45:23 -0800 Subject: [PATCH 07/10] Added input plugins logging category --- .../src/input-plugins/InputPluginsLogging.cpp | 14 ++++++++++++++ .../src/input-plugins/InputPluginsLogging.h | 18 ++++++++++++++++++ .../src/input-plugins/SixenseManager.cpp | 5 ----- .../src/input-plugins/SixenseSupportOSX.cpp | 2 ++ 4 files changed, 34 insertions(+), 5 deletions(-) create mode 100644 libraries/input-plugins/src/input-plugins/InputPluginsLogging.cpp create mode 100644 libraries/input-plugins/src/input-plugins/InputPluginsLogging.h diff --git a/libraries/input-plugins/src/input-plugins/InputPluginsLogging.cpp b/libraries/input-plugins/src/input-plugins/InputPluginsLogging.cpp new file mode 100644 index 0000000000..c96941a8ca --- /dev/null +++ b/libraries/input-plugins/src/input-plugins/InputPluginsLogging.cpp @@ -0,0 +1,14 @@ +// +// InputPluginsLogging.cpp +// +// +// Created by Clement on 11/6/15. +// Copyright 2015 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#include "InputPluginsLogging.h" + +Q_LOGGING_CATEGORY(inputplugins, "hifi.inputplugins") diff --git a/libraries/input-plugins/src/input-plugins/InputPluginsLogging.h b/libraries/input-plugins/src/input-plugins/InputPluginsLogging.h new file mode 100644 index 0000000000..6460469190 --- /dev/null +++ b/libraries/input-plugins/src/input-plugins/InputPluginsLogging.h @@ -0,0 +1,18 @@ +// +// InputPluginsLogging.h +// +// +// Created by Clement on 11/6/15. +// Copyright 2015 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#ifndef hifi_InputPluginsLogging_h +#define hifi_InputPluginsLogging_h + +#include +Q_DECLARE_LOGGING_CATEGORY(inputplugins) + +#endif // hifi_InputPluginsLogging_h diff --git a/libraries/input-plugins/src/input-plugins/SixenseManager.cpp b/libraries/input-plugins/src/input-plugins/SixenseManager.cpp index 56f79ce3c1..9340cbf950 100644 --- a/libraries/input-plugins/src/input-plugins/SixenseManager.cpp +++ b/libraries/input-plugins/src/input-plugins/SixenseManager.cpp @@ -19,11 +19,6 @@ #include #include -// TODO: This should not be here -#include -Q_DECLARE_LOGGING_CATEGORY(inputplugins) -Q_LOGGING_CATEGORY(inputplugins, "hifi.inputplugins") - #include #include #include diff --git a/libraries/input-plugins/src/input-plugins/SixenseSupportOSX.cpp b/libraries/input-plugins/src/input-plugins/SixenseSupportOSX.cpp index 3ac2d197c2..4a4eab2ee1 100644 --- a/libraries/input-plugins/src/input-plugins/SixenseSupportOSX.cpp +++ b/libraries/input-plugins/src/input-plugins/SixenseSupportOSX.cpp @@ -16,6 +16,8 @@ #include #include +#include "InputPluginsLogging.h" + using Library = std::unique_ptr; static Library SIXENSE; From 6323728d7a5092073ec445663ff2d8ea276ad8b1 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Fri, 6 Nov 2015 16:56:48 -0800 Subject: [PATCH 08/10] Added perfect forwarding of arguments --- .../src/input-plugins/SixenseManager.cpp | 4 +++- .../src/input-plugins/SixenseSupportOSX.cpp | 11 +++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/libraries/input-plugins/src/input-plugins/SixenseManager.cpp b/libraries/input-plugins/src/input-plugins/SixenseManager.cpp index 9340cbf950..3085b377f0 100644 --- a/libraries/input-plugins/src/input-plugins/SixenseManager.cpp +++ b/libraries/input-plugins/src/input-plugins/SixenseManager.cpp @@ -12,7 +12,7 @@ #include "SixenseManager.h" #ifdef HAVE_SIXENSE -#include "sixense.h" +#include #endif #include @@ -28,6 +28,8 @@ #include #include +#include "InputPluginsLogging.h" + static const unsigned int BUTTON_0 = 1U << 0; // the skinny button between 1 and 2 static const unsigned int BUTTON_1 = 1U << 5; static const unsigned int BUTTON_2 = 1U << 6; diff --git a/libraries/input-plugins/src/input-plugins/SixenseSupportOSX.cpp b/libraries/input-plugins/src/input-plugins/SixenseSupportOSX.cpp index 4a4eab2ee1..378c99de76 100644 --- a/libraries/input-plugins/src/input-plugins/SixenseSupportOSX.cpp +++ b/libraries/input-plugins/src/input-plugins/SixenseSupportOSX.cpp @@ -9,11 +9,13 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +// Mock implementation of sixense.h to hide dynamic linking on OS X #if defined(__APPLE__) && defined(HAVE_SIXENSE) -#include "sixense.h" +#include + +#include #include -#include #include #include "InputPluginsLogging.h" @@ -22,8 +24,9 @@ using Library = std::unique_ptr; static Library SIXENSE; struct Callable { - template int operator() (Args... args){ - return reinterpret_cast(function)(args...); + template + int operator() (Args&&... args){ + return reinterpret_cast(function)(std::forward(args)...); } QFunctionPointer function; }; From 137a2c1c48bfe67d5f4713342297cf1ce1176a07 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Fri, 6 Nov 2015 17:15:34 -0800 Subject: [PATCH 09/10] Fix file headers --- .../input-plugins/src/input-plugins/InputPluginsLogging.cpp | 2 +- libraries/input-plugins/src/input-plugins/InputPluginsLogging.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/input-plugins/src/input-plugins/InputPluginsLogging.cpp b/libraries/input-plugins/src/input-plugins/InputPluginsLogging.cpp index c96941a8ca..43a708e5c7 100644 --- a/libraries/input-plugins/src/input-plugins/InputPluginsLogging.cpp +++ b/libraries/input-plugins/src/input-plugins/InputPluginsLogging.cpp @@ -1,6 +1,6 @@ // // InputPluginsLogging.cpp -// +// libraries/input-plugins/src/input-plugins // // Created by Clement on 11/6/15. // Copyright 2015 High Fidelity, Inc. diff --git a/libraries/input-plugins/src/input-plugins/InputPluginsLogging.h b/libraries/input-plugins/src/input-plugins/InputPluginsLogging.h index 6460469190..f82ffdbe2e 100644 --- a/libraries/input-plugins/src/input-plugins/InputPluginsLogging.h +++ b/libraries/input-plugins/src/input-plugins/InputPluginsLogging.h @@ -1,6 +1,6 @@ // // InputPluginsLogging.h -// +// libraries/input-plugins/src/input-plugins // // Created by Clement on 11/6/15. // Copyright 2015 High Fidelity, Inc. From 68a72b0f4161ea565bbd5f2a4d19efb74aecfbcd Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Fri, 6 Nov 2015 17:22:12 -0800 Subject: [PATCH 10/10] Bit of cleanup --- .../src/input-plugins/SixenseSupportOSX.cpp | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/libraries/input-plugins/src/input-plugins/SixenseSupportOSX.cpp b/libraries/input-plugins/src/input-plugins/SixenseSupportOSX.cpp index 378c99de76..f6cec5d67f 100644 --- a/libraries/input-plugins/src/input-plugins/SixenseSupportOSX.cpp +++ b/libraries/input-plugins/src/input-plugins/SixenseSupportOSX.cpp @@ -20,6 +20,10 @@ #include "InputPluginsLogging.h" +#ifndef SIXENSE_LIB_FILENAME +#define SIXENSE_LIB_FILENAME QCoreApplication::applicationDirPath() + "/../Frameworks/libsixense_x64" +#endif + using Library = std::unique_ptr; static Library SIXENSE; @@ -41,15 +45,9 @@ Callable resolve(const Library& library, const char* name) { void loadSixense() { - if (!SIXENSE) { - static const QString LIBRARY_PATH = -#ifdef SIXENSE_LIB_FILENAME - SIXENSE_LIB_FILENAME; -#else - QCoreApplication::applicationDirPath() + "/../Frameworks/libsixense_x64"; -#endif - SIXENSE.reset(new QLibrary(LIBRARY_PATH)); - } + Q_ASSERT_X(!(SIXENSE && SIXENSE->isLoaded()), __FUNCTION__, "Sixense library already loaded"); + SIXENSE.reset(new QLibrary(SIXENSE_LIB_FILENAME)); + Q_CHECK_PTR(SIXENSE); if (SIXENSE->load()){ qDebug() << "Loaded sixense library for hydra support -" << SIXENSE->fileName();