From 954aeb5e257315875358d32b375a44d806843996 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Sat, 7 Sep 2019 18:05:38 -0700 Subject: [PATCH] AxisValue action channels now have a 'valid' flag, like Poses do --- .../controllers/src/controllers/AxisValue.cpp | 9 ++++++--- libraries/controllers/src/controllers/AxisValue.h | 4 ++-- .../controllers/src/controllers/InputDevice.cpp | 4 ++-- .../src/controllers/StandardController.cpp | 4 ++++ .../src/controllers/StandardControls.h | 4 ++++ .../src/controllers/UserInputMapper.cpp | 15 +++++++++++++++ .../controllers/src/controllers/UserInputMapper.h | 8 +++++--- .../controllers/src/controllers/impl/Endpoint.h | 2 +- .../controllers/impl/endpoints/ActionEndpoint.cpp | 2 +- .../controllers/impl/endpoints/ActionEndpoint.h | 2 +- .../impl/endpoints/CompositeEndpoint.cpp | 8 ++++++-- .../controllers/impl/endpoints/InputEndpoint.cpp | 2 +- .../controllers/impl/endpoints/ScriptEndpoint.h | 2 +- .../src/controllers/impl/filters/ClampFilter.h | 2 +- .../impl/filters/ConstrainToIntegerFilter.h | 2 +- .../filters/ConstrainToPositiveIntegerFilter.h | 2 +- .../controllers/impl/filters/DeadZoneFilter.cpp | 2 +- .../controllers/impl/filters/HysteresisFilter.cpp | 3 +-- .../src/controllers/impl/filters/NotFilter.cpp | 2 +- .../src/controllers/impl/filters/PulseFilter.cpp | 2 +- .../src/controllers/impl/filters/ScaleFilter.h | 2 +- 21 files changed, 57 insertions(+), 26 deletions(-) diff --git a/libraries/controllers/src/controllers/AxisValue.cpp b/libraries/controllers/src/controllers/AxisValue.cpp index 4b7913754c..0acbc6dbc7 100644 --- a/libraries/controllers/src/controllers/AxisValue.cpp +++ b/libraries/controllers/src/controllers/AxisValue.cpp @@ -12,10 +12,13 @@ namespace controller { - AxisValue::AxisValue(const float value, const quint64 timestamp) : - value(value), timestamp(timestamp) { } + AxisValue::AxisValue(const float value, const quint64 timestamp, bool valid) : + value(value), timestamp(timestamp), valid(valid) { + } bool AxisValue::operator==(const AxisValue& right) const { - return value == right.value && timestamp == right.timestamp; + return value == right.value && + timestamp == right.timestamp && + valid == right.valid; } } diff --git a/libraries/controllers/src/controllers/AxisValue.h b/libraries/controllers/src/controllers/AxisValue.h index e4bc20f7d2..ec356e1fb3 100644 --- a/libraries/controllers/src/controllers/AxisValue.h +++ b/libraries/controllers/src/controllers/AxisValue.h @@ -21,14 +21,14 @@ namespace controller { float value { 0.0f }; // The value can be timestamped to determine if consecutive identical values should be output (e.g., mouse movement). quint64 timestamp { 0 }; + bool valid { false }; AxisValue() {} - AxisValue(const float value, const quint64 timestamp); + AxisValue(const float value, const quint64 timestamp, bool valid = true); bool operator ==(const AxisValue& right) const; bool operator !=(const AxisValue& right) const { return !(*this == right); } }; - } #endif // hifi_controllers_AxisValue_h diff --git a/libraries/controllers/src/controllers/InputDevice.cpp b/libraries/controllers/src/controllers/InputDevice.cpp index dd430263fa..b28e7cfc82 100644 --- a/libraries/controllers/src/controllers/InputDevice.cpp +++ b/libraries/controllers/src/controllers/InputDevice.cpp @@ -77,13 +77,13 @@ namespace controller { return { getButton(channel), 0 }; case ChannelType::POSE: - return { getPose(channel).valid ? 1.0f : 0.0f, 0 }; + return { getPose(channel).valid ? 1.0f : 0.0f, 0, getPose(channel).valid }; default: break; } - return { 0.0f, 0 }; + return { 0.0f, 0, false }; } AxisValue InputDevice::getValue(const Input& input) const { diff --git a/libraries/controllers/src/controllers/StandardController.cpp b/libraries/controllers/src/controllers/StandardController.cpp index ece10ecca3..dbc92cc7e5 100644 --- a/libraries/controllers/src/controllers/StandardController.cpp +++ b/libraries/controllers/src/controllers/StandardController.cpp @@ -354,6 +354,10 @@ Input::NamedVector StandardController::getAvailableInputs() const { makePair(HIPS, "Hips"), makePair(SPINE2, "Spine2"), makePair(HEAD, "Head"), + makePair(LEFT_EYE, "LeftEye"), + makePair(RIGHT_EYE, "RightEye"), + makePair(LEFT_EYE_BLINK, "LeftEyeBlink"), + makePair(RIGHT_EYE_BLINK, "RightEyeBlink"), // Aliases, PlayStation style names makePair(LB, "L1"), diff --git a/libraries/controllers/src/controllers/StandardControls.h b/libraries/controllers/src/controllers/StandardControls.h index f521ab81cf..99d9246264 100644 --- a/libraries/controllers/src/controllers/StandardControls.h +++ b/libraries/controllers/src/controllers/StandardControls.h @@ -90,6 +90,8 @@ namespace controller { // Grips LEFT_GRIP, RIGHT_GRIP, + LEFT_EYE_BLINK, + RIGHT_EYE_BLINK, NUM_STANDARD_AXES, LZ = LT, RZ = RT @@ -174,6 +176,8 @@ namespace controller { TRACKED_OBJECT_13, TRACKED_OBJECT_14, TRACKED_OBJECT_15, + LEFT_EYE, + RIGHT_EYE, NUM_STANDARD_POSES }; diff --git a/libraries/controllers/src/controllers/UserInputMapper.cpp b/libraries/controllers/src/controllers/UserInputMapper.cpp index 33dc37312e..1eb1a9fa1a 100755 --- a/libraries/controllers/src/controllers/UserInputMapper.cpp +++ b/libraries/controllers/src/controllers/UserInputMapper.cpp @@ -256,6 +256,9 @@ void UserInputMapper::update(float deltaTime) { for (auto& channel : _actionStates) { channel = 0.0f; } + for (unsigned int i = 0; i < _actionStatesValid.size(); i++) { + _actionStatesValid[i] = true; + } for (auto& channel : _poseStates) { channel = Pose(); @@ -1233,5 +1236,17 @@ void UserInputMapper::disableMapping(const Mapping::Pointer& mapping) { } } +void UserInputMapper::setActionState(Action action, float value, bool valid) { + _actionStates[toInt(action)] = value; + _actionStatesValid[toInt(action)] = valid; +} + +void UserInputMapper::deltaActionState(Action action, float delta, bool valid) { + _actionStates[toInt(action)] += delta; + bool wasValid = _actionStatesValid[toInt(action)]; + _actionStatesValid[toInt(action)] = wasValid & valid; +} + + } diff --git a/libraries/controllers/src/controllers/UserInputMapper.h b/libraries/controllers/src/controllers/UserInputMapper.h index 2b3c947491..cd44f3226c 100644 --- a/libraries/controllers/src/controllers/UserInputMapper.h +++ b/libraries/controllers/src/controllers/UserInputMapper.h @@ -82,13 +82,14 @@ namespace controller { QString getActionName(Action action) const; QString getStandardPoseName(uint16_t pose); float getActionState(Action action) const { return _actionStates[toInt(action)]; } + bool getActionStateValid(Action action) const { return _actionStatesValid[toInt(action)]; } Pose getPoseState(Action action) const; int findAction(const QString& actionName) const; QVector getActionNames() const; Input inputFromAction(Action action) const { return getActionInputs()[toInt(action)].first; } - void setActionState(Action action, float value) { _actionStates[toInt(action)] = value; } - void deltaActionState(Action action, float delta) { _actionStates[toInt(action)] += delta; } + void setActionState(Action action, float value, bool valid = true); + void deltaActionState(Action action, float delta, bool valid = true); void setActionState(Action action, const Pose& value) { _poseStates[toInt(action)] = value; } bool triggerHapticPulse(float strength, float duration, controller::Hand hand); bool triggerHapticPulseOnDevice(uint16 deviceID, float strength, float duration, controller::Hand hand); @@ -146,6 +147,7 @@ namespace controller { std::vector _actionStates = std::vector(toInt(Action::NUM_ACTIONS), 0.0f); std::vector _actionScales = std::vector(toInt(Action::NUM_ACTIONS), 1.0f); std::vector _lastActionStates = std::vector(toInt(Action::NUM_ACTIONS), 0.0f); + std::vector _actionStatesValid = std::vector(toInt(Action::NUM_ACTIONS), false); std::vector _poseStates = std::vector(toInt(Action::NUM_ACTIONS)); std::vector _lastStandardStates = std::vector(); @@ -167,7 +169,7 @@ namespace controller { ConditionalPointer conditionalFor(const QJSValue& endpoint); ConditionalPointer conditionalFor(const QScriptValue& endpoint); ConditionalPointer conditionalFor(const Input& endpoint) const; - + MappingPointer parseMapping(const QJsonValue& json); RoutePointer parseRoute(const QJsonValue& value); EndpointPointer parseDestination(const QJsonValue& value); diff --git a/libraries/controllers/src/controllers/impl/Endpoint.h b/libraries/controllers/src/controllers/impl/Endpoint.h index bcf71f3094..692e427e16 100644 --- a/libraries/controllers/src/controllers/impl/Endpoint.h +++ b/libraries/controllers/src/controllers/impl/Endpoint.h @@ -100,7 +100,7 @@ namespace controller { _currentPose = value; } protected: - AxisValue _currentValue { 0.0f, 0 }; + AxisValue _currentValue { 0.0f, 0, false }; Pose _currentPose {}; }; diff --git a/libraries/controllers/src/controllers/impl/endpoints/ActionEndpoint.cpp b/libraries/controllers/src/controllers/impl/endpoints/ActionEndpoint.cpp index 58744c468c..4be23b0c29 100644 --- a/libraries/controllers/src/controllers/impl/endpoints/ActionEndpoint.cpp +++ b/libraries/controllers/src/controllers/impl/endpoints/ActionEndpoint.cpp @@ -26,7 +26,7 @@ void ActionEndpoint::apply(AxisValue newValue, const Pointer& source) { _currentValue.value += newValue.value; if (_input != Input::INVALID_INPUT) { - userInputMapper->deltaActionState(Action(_input.getChannel()), newValue.value); + userInputMapper->deltaActionState(Action(_input.getChannel()), newValue.value, newValue.valid); } } diff --git a/libraries/controllers/src/controllers/impl/endpoints/ActionEndpoint.h b/libraries/controllers/src/controllers/impl/endpoints/ActionEndpoint.h index 94da4663aa..7ab21031a7 100644 --- a/libraries/controllers/src/controllers/impl/endpoints/ActionEndpoint.h +++ b/libraries/controllers/src/controllers/impl/endpoints/ActionEndpoint.h @@ -32,7 +32,7 @@ public: virtual void reset() override; private: - AxisValue _currentValue { 0.0f, 0 }; + AxisValue _currentValue { 0.0f, 0, false }; Pose _currentPose{}; }; diff --git a/libraries/controllers/src/controllers/impl/endpoints/CompositeEndpoint.cpp b/libraries/controllers/src/controllers/impl/endpoints/CompositeEndpoint.cpp index f54c786a33..82a44bd7ae 100644 --- a/libraries/controllers/src/controllers/impl/endpoints/CompositeEndpoint.cpp +++ b/libraries/controllers/src/controllers/impl/endpoints/CompositeEndpoint.cpp @@ -27,7 +27,9 @@ bool CompositeEndpoint::readable() const { AxisValue CompositeEndpoint::peek() const { auto negative = first->peek(); auto positive = second->peek(); - auto result = AxisValue(positive.value - negative.value, std::max(positive.timestamp, negative.timestamp)); + auto result = AxisValue(positive.value - negative.value, + std::max(positive.timestamp, negative.timestamp), + negative.valid && positive.valid); return result; } @@ -35,7 +37,9 @@ AxisValue CompositeEndpoint::peek() const { AxisValue CompositeEndpoint::value() { auto negative = first->value(); auto positive = second->value(); - auto result = AxisValue(positive.value - negative.value, std::max(positive.timestamp, negative.timestamp)); + auto result = AxisValue(positive.value - negative.value, + std::max(positive.timestamp, negative.timestamp), + negative.valid && positive.valid); return result; } diff --git a/libraries/controllers/src/controllers/impl/endpoints/InputEndpoint.cpp b/libraries/controllers/src/controllers/impl/endpoints/InputEndpoint.cpp index 3755d860b6..db0aed47e1 100644 --- a/libraries/controllers/src/controllers/impl/endpoints/InputEndpoint.cpp +++ b/libraries/controllers/src/controllers/impl/endpoints/InputEndpoint.cpp @@ -16,7 +16,7 @@ using namespace controller; AxisValue InputEndpoint::peek() const { if (isPose()) { - return peekPose().valid ? AxisValue(1.0f, 0) : AxisValue(0.0f, 0); + return peekPose().valid ? AxisValue(1.0f, 0) : AxisValue(0.0f, 0, false); } auto userInputMapper = DependencyManager::get(); auto deviceProxy = userInputMapper->getDevice(_input); diff --git a/libraries/controllers/src/controllers/impl/endpoints/ScriptEndpoint.h b/libraries/controllers/src/controllers/impl/endpoints/ScriptEndpoint.h index e739ab0b01..1aa1746b24 100644 --- a/libraries/controllers/src/controllers/impl/endpoints/ScriptEndpoint.h +++ b/libraries/controllers/src/controllers/impl/endpoints/ScriptEndpoint.h @@ -41,7 +41,7 @@ protected: private: QScriptValue _callable; float _lastValueRead { 0.0f }; - AxisValue _lastValueWritten { 0.0f, 0 }; + AxisValue _lastValueWritten { 0.0f, 0, false }; bool _returnPose { false }; Pose _lastPoseRead; diff --git a/libraries/controllers/src/controllers/impl/filters/ClampFilter.h b/libraries/controllers/src/controllers/impl/filters/ClampFilter.h index 04684655c9..7ec8173c2a 100644 --- a/libraries/controllers/src/controllers/impl/filters/ClampFilter.h +++ b/libraries/controllers/src/controllers/impl/filters/ClampFilter.h @@ -19,7 +19,7 @@ class ClampFilter : public Filter { public: ClampFilter(float min = 0.0, float max = 1.0) : _min(min), _max(max) {}; virtual AxisValue apply(AxisValue value) const override { - return { glm::clamp(value.value, _min, _max), value.timestamp }; + return { glm::clamp(value.value, _min, _max), value.timestamp, value.valid }; } virtual Pose apply(Pose value) const override { return value; } diff --git a/libraries/controllers/src/controllers/impl/filters/ConstrainToIntegerFilter.h b/libraries/controllers/src/controllers/impl/filters/ConstrainToIntegerFilter.h index 2cce5f828d..3adcbbd008 100644 --- a/libraries/controllers/src/controllers/impl/filters/ConstrainToIntegerFilter.h +++ b/libraries/controllers/src/controllers/impl/filters/ConstrainToIntegerFilter.h @@ -20,7 +20,7 @@ public: ConstrainToIntegerFilter() = default; virtual AxisValue apply(AxisValue value) const override { - return { glm::sign(value.value), value.timestamp }; + return { glm::sign(value.value), value.timestamp, value.valid }; } virtual Pose apply(Pose value) const override { return value; } diff --git a/libraries/controllers/src/controllers/impl/filters/ConstrainToPositiveIntegerFilter.h b/libraries/controllers/src/controllers/impl/filters/ConstrainToPositiveIntegerFilter.h index 07dd6654f1..5dcc43b3f7 100644 --- a/libraries/controllers/src/controllers/impl/filters/ConstrainToPositiveIntegerFilter.h +++ b/libraries/controllers/src/controllers/impl/filters/ConstrainToPositiveIntegerFilter.h @@ -20,7 +20,7 @@ public: ConstrainToPositiveIntegerFilter() = default; virtual AxisValue apply(AxisValue value) const override { - return { (value.value <= 0.0f) ? 0.0f : 1.0f, value.timestamp }; + return { (value.value <= 0.0f) ? 0.0f : 1.0f, value.timestamp, value.valid }; } virtual Pose apply(Pose value) const override { return value; } diff --git a/libraries/controllers/src/controllers/impl/filters/DeadZoneFilter.cpp b/libraries/controllers/src/controllers/impl/filters/DeadZoneFilter.cpp index 84d3b9de60..4c396fee70 100644 --- a/libraries/controllers/src/controllers/impl/filters/DeadZoneFilter.cpp +++ b/libraries/controllers/src/controllers/impl/filters/DeadZoneFilter.cpp @@ -18,7 +18,7 @@ AxisValue DeadZoneFilter::apply(AxisValue value) const { if (magnitude < _min) { return { 0.0f, value.timestamp }; } - return { (magnitude - _min) * scale, value.timestamp }; + return { (magnitude - _min) * scale, value.timestamp, value.valid }; } bool DeadZoneFilter::parseParameters(const QJsonValue& parameters) { diff --git a/libraries/controllers/src/controllers/impl/filters/HysteresisFilter.cpp b/libraries/controllers/src/controllers/impl/filters/HysteresisFilter.cpp index 91e59a39b9..b7b573a98c 100644 --- a/libraries/controllers/src/controllers/impl/filters/HysteresisFilter.cpp +++ b/libraries/controllers/src/controllers/impl/filters/HysteresisFilter.cpp @@ -19,7 +19,6 @@ HysteresisFilter::HysteresisFilter(float min, float max) : _min(min), _max(max) } }; - AxisValue HysteresisFilter::apply(AxisValue value) const { if (_signaled) { if (value.value <= _min) { @@ -30,7 +29,7 @@ AxisValue HysteresisFilter::apply(AxisValue value) const { _signaled = true; } } - return { _signaled ? 1.0f : 0.0f, value.timestamp }; + return { _signaled ? 1.0f : 0.0f, value.timestamp, value.valid }; } bool HysteresisFilter::parseParameters(const QJsonValue& parameters) { diff --git a/libraries/controllers/src/controllers/impl/filters/NotFilter.cpp b/libraries/controllers/src/controllers/impl/filters/NotFilter.cpp index c0396857e5..dd181b7857 100644 --- a/libraries/controllers/src/controllers/impl/filters/NotFilter.cpp +++ b/libraries/controllers/src/controllers/impl/filters/NotFilter.cpp @@ -6,5 +6,5 @@ NotFilter::NotFilter() { } AxisValue NotFilter::apply(AxisValue value) const { - return { (value.value == 0.0f) ? 1.0f : 0.0f, value.timestamp }; + return { (value.value == 0.0f) ? 1.0f : 0.0f, value.timestamp, value.valid }; } diff --git a/libraries/controllers/src/controllers/impl/filters/PulseFilter.cpp b/libraries/controllers/src/controllers/impl/filters/PulseFilter.cpp index d37eb99ca9..353bf7dca9 100644 --- a/libraries/controllers/src/controllers/impl/filters/PulseFilter.cpp +++ b/libraries/controllers/src/controllers/impl/filters/PulseFilter.cpp @@ -29,7 +29,7 @@ AxisValue PulseFilter::apply(AxisValue value) const { _lastEmitTime = DEFAULT_LAST_EMIT_TIME; } - return { result, value.timestamp }; + return { result, value.timestamp, value.valid }; } bool PulseFilter::parseParameters(const QJsonValue& parameters) { diff --git a/libraries/controllers/src/controllers/impl/filters/ScaleFilter.h b/libraries/controllers/src/controllers/impl/filters/ScaleFilter.h index 3eb58e7f47..7c146d4e4a 100644 --- a/libraries/controllers/src/controllers/impl/filters/ScaleFilter.h +++ b/libraries/controllers/src/controllers/impl/filters/ScaleFilter.h @@ -23,7 +23,7 @@ public: ScaleFilter(float scale) : _scale(scale) {} virtual AxisValue apply(AxisValue value) const override { - return { value.value * _scale, value.timestamp }; + return { value.value * _scale, value.timestamp, value.valid }; } virtual Pose apply(Pose value) const override {