From 00be6b3e3a12ee2de08360b484fd73fe3a2d8879 Mon Sep 17 00:00:00 2001 From: samcake Date: Fri, 30 Oct 2015 17:32:26 -0700 Subject: [PATCH 1/3] Add support for NOT conditional in the route json --- .../src/controllers/UserInputMapper.cpp | 19 ++++++++++++++++++- .../impl/conditionals/EndpointConditional.h | 8 ++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/libraries/controllers/src/controllers/UserInputMapper.cpp b/libraries/controllers/src/controllers/UserInputMapper.cpp index d33e215797..6462103290 100755 --- a/libraries/controllers/src/controllers/UserInputMapper.cpp +++ b/libraries/controllers/src/controllers/UserInputMapper.cpp @@ -825,12 +825,29 @@ Conditional::Pointer UserInputMapper::parseConditional(const QJsonValue& value) return std::make_shared(children); } else if (value.isString()) { // Support "when" : "GamePad.RB" - auto input = findDeviceInput(value.toString()); + auto conditionalToken = value.toString(); + + // Detect for modifier case (Not...) + QString conditionalModifier; + const QString JSON_CONDITIONAL_MODIFIER_NOT("!"); + if (conditionalToken.startsWith(JSON_CONDITIONAL_MODIFIER_NOT)) { + conditionalModifier = JSON_CONDITIONAL_MODIFIER_NOT; + conditionalToken = conditionalToken.right(conditionalToken.size() - conditionalModifier.size()); + } + + auto input = findDeviceInput(conditionalToken); auto endpoint = endpointFor(input); if (!endpoint) { return Conditional::Pointer(); } + if (!conditionalModifier.isEmpty()) { + if (conditionalModifier == JSON_CONDITIONAL_MODIFIER_NOT) { + return std::make_shared(endpoint); + } + } + + // Default and conditional behavior return std::make_shared(endpoint); } diff --git a/libraries/controllers/src/controllers/impl/conditionals/EndpointConditional.h b/libraries/controllers/src/controllers/impl/conditionals/EndpointConditional.h index 1e4205afc7..8f0499077e 100644 --- a/libraries/controllers/src/controllers/impl/conditionals/EndpointConditional.h +++ b/libraries/controllers/src/controllers/impl/conditionals/EndpointConditional.h @@ -23,5 +23,13 @@ private: Endpoint::Pointer _endpoint; }; +class NotEndpointConditional : public Conditional { +public: + NotEndpointConditional(Endpoint::Pointer endpoint) : _endpoint(endpoint) {} + virtual bool satisfied() override { return _endpoint && _endpoint->value() == 0.0; } +private: + Endpoint::Pointer _endpoint; +}; + } #endif From c2687b4998ad47c4b15dd6ba951e30786ea5562f Mon Sep 17 00:00:00 2001 From: samcake Date: Mon, 2 Nov 2015 14:17:07 -0800 Subject: [PATCH 2/3] Cleaning the feature not conditional do the true design --- .../src/controllers/UserInputMapper.cpp | 9 ++++----- .../impl/conditionals/EndpointConditional.h | 8 -------- .../impl/conditionals/NotConditional.cpp | 20 ++++++++++++------- .../impl/conditionals/NotConditional.h | 14 +++++++++++++ 4 files changed, 31 insertions(+), 20 deletions(-) diff --git a/libraries/controllers/src/controllers/UserInputMapper.cpp b/libraries/controllers/src/controllers/UserInputMapper.cpp index 5edc3390a6..a5d447d479 100755 --- a/libraries/controllers/src/controllers/UserInputMapper.cpp +++ b/libraries/controllers/src/controllers/UserInputMapper.cpp @@ -26,6 +26,7 @@ #include "Logging.h" #include "impl/conditionals/AndConditional.h" +#include "impl/conditionals/NotConditional.h" #include "impl/conditionals/EndpointConditional.h" #include "impl/conditionals/ScriptConditional.h" @@ -838,18 +839,16 @@ Conditional::Pointer UserInputMapper::parseConditional(const QJsonValue& value) auto input = findDeviceInput(conditionalToken); auto endpoint = endpointFor(input); - if (!endpoint) { - return Conditional::Pointer(); - } + auto conditional = std::make_shared(endpoint); if (!conditionalModifier.isEmpty()) { if (conditionalModifier == JSON_CONDITIONAL_MODIFIER_NOT) { - return std::make_shared(endpoint); + return std::make_shared(conditional); } } // Default and conditional behavior - return std::make_shared(endpoint); + return conditional; } return Conditional::parse(value); diff --git a/libraries/controllers/src/controllers/impl/conditionals/EndpointConditional.h b/libraries/controllers/src/controllers/impl/conditionals/EndpointConditional.h index 36fd3e5daa..0ba1347087 100644 --- a/libraries/controllers/src/controllers/impl/conditionals/EndpointConditional.h +++ b/libraries/controllers/src/controllers/impl/conditionals/EndpointConditional.h @@ -23,13 +23,5 @@ private: Endpoint::Pointer _endpoint; }; -class NotEndpointConditional : public Conditional { -public: - NotEndpointConditional(Endpoint::Pointer endpoint) : _endpoint(endpoint) {} - virtual bool satisfied() override { return _endpoint && _endpoint->value() == 0.0; } -private: - Endpoint::Pointer _endpoint; -}; - } #endif diff --git a/libraries/controllers/src/controllers/impl/conditionals/NotConditional.cpp b/libraries/controllers/src/controllers/impl/conditionals/NotConditional.cpp index e30b060985..813c8ebfad 100644 --- a/libraries/controllers/src/controllers/impl/conditionals/NotConditional.cpp +++ b/libraries/controllers/src/controllers/impl/conditionals/NotConditional.cpp @@ -6,10 +6,16 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -// NOTE: we don't need to include this header unless/until we add additional symbols. -// By removing this header we prevent these warnings on windows: -// -// 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 "NotConditional.h" + +#include "NotConditional.h" + +using namespace controller; + +bool NotConditional::satisfied() { + if (_operand) { + return (!_operand->satisfied()); + } else { + return false; + } +} + diff --git a/libraries/controllers/src/controllers/impl/conditionals/NotConditional.h b/libraries/controllers/src/controllers/impl/conditionals/NotConditional.h index 3acda07106..6b19cf9505 100644 --- a/libraries/controllers/src/controllers/impl/conditionals/NotConditional.h +++ b/libraries/controllers/src/controllers/impl/conditionals/NotConditional.h @@ -12,5 +12,19 @@ #include "../Conditional.h" +namespace controller { + + class NotConditional : public Conditional { + public: + using Pointer = std::shared_ptr; + + NotConditional(Conditional::Pointer operand) : _operand(operand) { } + + virtual bool satisfied() override; + + private: + Conditional::Pointer _operand; + }; +} #endif From 0211e00c86bc49a91c5d5944f8c87df4d8014752 Mon Sep 17 00:00:00 2001 From: samcake Date: Mon, 2 Nov 2015 15:01:59 -0800 Subject: [PATCH 3/3] Cleaning the feature not conditional do the true design --- libraries/controllers/src/controllers/UserInputMapper.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/libraries/controllers/src/controllers/UserInputMapper.cpp b/libraries/controllers/src/controllers/UserInputMapper.cpp index a5d447d479..192404b85a 100755 --- a/libraries/controllers/src/controllers/UserInputMapper.cpp +++ b/libraries/controllers/src/controllers/UserInputMapper.cpp @@ -839,6 +839,9 @@ Conditional::Pointer UserInputMapper::parseConditional(const QJsonValue& value) auto input = findDeviceInput(conditionalToken); auto endpoint = endpointFor(input); + if (!endpoint) { + return Conditional::Pointer(); + } auto conditional = std::make_shared(endpoint); if (!conditionalModifier.isEmpty()) {