| /* |
| * Copyright 2023 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| // clang-format off |
| #include "../Macros.h" |
| // clang-format on |
| |
| #include "SlopController.h" |
| |
| namespace { |
| int signOf(float value) { |
| if (value == 0) return 0; |
| if (value > 0) return 1; |
| return -1; |
| } |
| } // namespace |
| |
| namespace android { |
| |
| SlopController::SlopController(float slopThreshold, nsecs_t slopDurationNanos) |
| : mSlopThreshold(slopThreshold), mSlopDurationNanos(slopDurationNanos) {} |
| |
| float SlopController::consumeEvent(nsecs_t eventTimeNanos, float value) { |
| if (mSlopDurationNanos == 0) { |
| return value; |
| } |
| |
| if (shouldResetSlopTracking(eventTimeNanos, value)) { |
| mCumulativeValue = 0; |
| mHasSlopBeenMet = false; |
| } |
| |
| mLastEventTimeNanos = eventTimeNanos; |
| |
| if (mHasSlopBeenMet) { |
| // Since slop has already been met, we know that all of the current value would pass the |
| // slop threshold. So return that, without any further processing. |
| return value; |
| } |
| |
| mCumulativeValue += value; |
| |
| if (abs(mCumulativeValue) >= mSlopThreshold) { |
| mHasSlopBeenMet = true; |
| // Return the amount of value that exceeds the slop. |
| return signOf(value) * (abs(mCumulativeValue) - mSlopThreshold); |
| } |
| |
| return 0; |
| } |
| |
| bool SlopController::shouldResetSlopTracking(nsecs_t eventTimeNanos, float value) const { |
| const nsecs_t ageNanos = eventTimeNanos - mLastEventTimeNanos; |
| if (ageNanos >= mSlopDurationNanos) { |
| return true; |
| } |
| if (value == 0) { |
| return false; |
| } |
| if (signOf(mCumulativeValue) != signOf(value)) { |
| return true; |
| } |
| return false; |
| } |
| |
| } // namespace android |