| /* | |
| * 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) { | |
| ALOGD("SlopController: did not drop event with value .%3f", value); | |
| mHasSlopBeenMet = true; | |
| // Return the amount of value that exceeds the slop. | |
| return signOf(value) * (abs(mCumulativeValue) - mSlopThreshold); | |
| } | |
| ALOGD("SlopController: dropping event with value .%3f", value); | |
| 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 |