From 4c78c0b3301871d58053f5a0f4670d542fd1b70f Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Thu, 7 Apr 2016 13:17:49 -0700 Subject: [PATCH] Fix broken xbox controllers --- .../src/controllers/StateController.cpp | 6 ++++-- .../src/controllers/UserInputMapper.cpp | 9 +++++++-- .../src/controllers/impl/Endpoint.cpp | 5 ++++- .../controllers/src/controllers/impl/Endpoint.h | 17 +++++++++++++++++ 4 files changed, 32 insertions(+), 5 deletions(-) diff --git a/libraries/controllers/src/controllers/StateController.cpp b/libraries/controllers/src/controllers/StateController.cpp index e930c76af2..9b0301eb14 100644 --- a/libraries/controllers/src/controllers/StateController.cpp +++ b/libraries/controllers/src/controllers/StateController.cpp @@ -26,7 +26,7 @@ void StateController::setStateVariables(const QStringList& newStateVariables) { } StateController::StateController() : InputDevice("Application") { - _deviceID = UserInputMapper::STANDARD_DEVICE; + _deviceID = UserInputMapper::STATE_DEVICE; for (const auto& variable : stateVariables) { _namedReadLambdas[variable] = []()->float{ return 0; }; } @@ -49,7 +49,9 @@ Input::NamedVector StateController::getAvailableInputs() const { } EndpointPointer StateController::createEndpoint(const Input& input) const { - return std::make_shared(_namedReadLambdas[stateVariables[input.getChannel()]]); + auto name = stateVariables[input.getChannel()]; + ReadLambda& readLambda = const_cast&>(_namedReadLambdas)[name]; + return std::make_shared(readLambda); } } \ No newline at end of file diff --git a/libraries/controllers/src/controllers/UserInputMapper.cpp b/libraries/controllers/src/controllers/UserInputMapper.cpp index 369f7f447a..2b7d837aa5 100755 --- a/libraries/controllers/src/controllers/UserInputMapper.cpp +++ b/libraries/controllers/src/controllers/UserInputMapper.cpp @@ -140,7 +140,6 @@ void UserInputMapper::loadDefaultMapping(uint16 deviceID) { return; } - auto mapping = loadMappings(proxyEntry->second->getDefaultMappingConfigs()); if (mapping) { auto prevMapping = _mappingsByDevice[deviceID]; @@ -705,6 +704,12 @@ Mapping::Pointer UserInputMapper::loadMapping(const QString& jsonFile, bool enab if (jsonFile.isEmpty()) { return Mapping::Pointer(); } + // Each mapping only needs to be loaded once + static QSet loaded; + if (loaded.contains(jsonFile)) { + return Mapping::Pointer(); + } + loaded.insert(jsonFile); QString json; { QFile file(jsonFile); @@ -971,7 +976,7 @@ Route::Pointer UserInputMapper::parseRoute(const QJsonValue& value) { result->json = QString(QJsonDocument(obj).toJson()); result->source = parseSource(obj[JSON_CHANNEL_FROM]); result->debug = obj[JSON_CHANNEL_DEBUG].toBool(); - result->debug = obj[JSON_CHANNEL_PEEK].toBool(); + result->peek = obj[JSON_CHANNEL_PEEK].toBool(); if (!result->source) { qWarning() << "Invalid route source " << obj[JSON_CHANNEL_FROM]; return Route::Pointer(); diff --git a/libraries/controllers/src/controllers/impl/Endpoint.cpp b/libraries/controllers/src/controllers/impl/Endpoint.cpp index e771b1916f..289f83b228 100644 --- a/libraries/controllers/src/controllers/impl/Endpoint.cpp +++ b/libraries/controllers/src/controllers/impl/Endpoint.cpp @@ -12,5 +12,8 @@ // warning LNK4221: This object file does not define any previously undefined public symbols, // so it will not be used by any link operation that consumes this library // -//#include "Endpoint.h" +#include "Endpoint.h" +namespace controller { + Endpoint::WriteLambda DEFAULT_WRITE_LAMBDA = [](float) {}; +} diff --git a/libraries/controllers/src/controllers/impl/Endpoint.h b/libraries/controllers/src/controllers/impl/Endpoint.h index 475dc035bb..a938dd30b6 100644 --- a/libraries/controllers/src/controllers/impl/Endpoint.h +++ b/libraries/controllers/src/controllers/impl/Endpoint.h @@ -67,6 +67,23 @@ namespace controller { WriteLambda _writeLambda; }; + extern Endpoint::WriteLambda DEFAULT_WRITE_LAMBDA; + + class LambdaRefEndpoint : public Endpoint { + public: + using Endpoint::apply; + LambdaRefEndpoint(const ReadLambda& readLambda, const WriteLambda& writeLambda = DEFAULT_WRITE_LAMBDA) + : Endpoint(Input::INVALID_INPUT), _readLambda(readLambda), _writeLambda(writeLambda) { + } + + virtual float peek() const override { return _readLambda(); } + virtual void apply(float value, const Pointer& source) override { _writeLambda(value); } + + private: + const ReadLambda& _readLambda; + const WriteLambda& _writeLambda; + }; + class VirtualEndpoint : public Endpoint { public: