diff options
| -rw-r--r-- | libs/binder/include/binder/IBinder.h | 20 | ||||
| -rw-r--r-- | libs/input/Android.bp | 1 | ||||
| -rw-r--r-- | libs/input/VelocityTracker.cpp | 45 | ||||
| -rw-r--r-- | libs/vr/libpdx_default_transport/Android.bp | 1 | ||||
| -rw-r--r-- | libs/vr/libpdx_uds/Android.bp | 3 |
5 files changed, 54 insertions, 16 deletions
diff --git a/libs/binder/include/binder/IBinder.h b/libs/binder/include/binder/IBinder.h index 318070a2ac..3f0dad0f25 100644 --- a/libs/binder/include/binder/IBinder.h +++ b/libs/binder/include/binder/IBinder.h @@ -151,11 +151,31 @@ public: typedef void (*object_cleanup_func)(const void* id, void* obj, void* cleanupCookie); + /** + * This object is attached for the lifetime of this binder object. When + * this binder object is destructed, the cleanup function of all attached + * objects are invoked with their respective objectID, object, and + * cleanupCookie. Access to these APIs can be made from multiple threads, + * but calls from different threads are allowed to be interleaved. + */ virtual void attachObject( const void* objectID, void* object, void* cleanupCookie, object_cleanup_func func) = 0; + /** + * Returns object attached with attachObject. + */ virtual void* findObject(const void* objectID) const = 0; + /** + * WARNING: this API does not call the cleanup function for legacy reasons. + * It also does not return void* for legacy reasons. If you need to detach + * an object and destroy it, there are two options: + * - if you can, don't call detachObject and instead wait for the destructor + * to clean it up. + * - manually retrieve and destruct the object (if multiple of your threads + * are accessing these APIs, you must guarantee that attachObject isn't + * called after findObject and before detachObject is called). + */ virtual void detachObject(const void* objectID) = 0; virtual BBinder* localBinder(); diff --git a/libs/input/Android.bp b/libs/input/Android.bp index 2f399765a0..a2d6a8a798 100644 --- a/libs/input/Android.bp +++ b/libs/input/Android.bp @@ -16,6 +16,7 @@ cc_library { name: "libinput", + cpp_std: "c++17", host_supported: true, cflags: [ "-Wall", diff --git a/libs/input/VelocityTracker.cpp b/libs/input/VelocityTracker.cpp index c07a81245a..f72e49b664 100644 --- a/libs/input/VelocityTracker.cpp +++ b/libs/input/VelocityTracker.cpp @@ -23,9 +23,11 @@ // Log debug messages about the progress of the algorithm itself. #define DEBUG_STRATEGY 0 +#include <array> #include <inttypes.h> #include <limits.h> #include <math.h> +#include <optional> #include <android-base/stringprintf.h> #include <cutils/properties.h> @@ -564,7 +566,9 @@ static bool solveLeastSquares(const float* x, const float* y, * Optimized unweighted second-order least squares fit. About 2x speed improvement compared to * the default implementation */ -static float solveUnweightedLeastSquaresDeg2(const float* x, const float* y, size_t count) { +static std::optional<std::array<float, 3>> solveUnweightedLeastSquaresDeg2( + const float* x, const float* y, size_t count) { + // Solving y = a*x^2 + b*x + c float sxi = 0, sxiyi = 0, syi = 0, sxi2 = 0, sxi3 = 0, sxi2yi = 0, sxi4 = 0; for (size_t i = 0; i < count; i++) { @@ -573,8 +577,8 @@ static float solveUnweightedLeastSquaresDeg2(const float* x, const float* y, siz float xi2 = xi*xi; float xi3 = xi2*xi; float xi4 = xi3*xi; - float xi2yi = xi2*yi; float xiyi = xi*yi; + float xi2yi = xi2*yi; sxi += xi; sxi2 += xi2; @@ -591,13 +595,23 @@ static float solveUnweightedLeastSquaresDeg2(const float* x, const float* y, siz float Sx2y = sxi2yi - sxi2*syi / count; float Sx2x2 = sxi4 - sxi2*sxi2 / count; - float numerator = Sxy*Sx2x2 - Sx2y*Sxx2; float denominator = Sxx*Sx2x2 - Sxx2*Sxx2; if (denominator == 0) { ALOGW("division by 0 when computing velocity, Sxx=%f, Sx2x2=%f, Sxx2=%f", Sxx, Sx2x2, Sxx2); - return 0; + return std::nullopt; } - return numerator/denominator; + // Compute a + float numerator = Sx2y*Sxx - Sxy*Sxx2; + float a = numerator / denominator; + + // Compute b + numerator = Sxy*Sx2x2 - Sx2y*Sxx2; + float b = numerator / denominator; + + // Compute c + float c = syi/count - b * sxi/count - a * sxi2/count; + + return std::make_optional(std::array<float, 3>({c, b, a})); } bool LeastSquaresVelocityTrackerStrategy::getEstimator(uint32_t id, @@ -640,20 +654,23 @@ bool LeastSquaresVelocityTrackerStrategy::getEstimator(uint32_t id, if (degree > m - 1) { degree = m - 1; } - if (degree >= 1) { - if (degree == 2 && mWeighting == WEIGHTING_NONE) { // optimize unweighted, degree=2 fit + + if (degree == 2 && mWeighting == WEIGHTING_NONE) { + // Optimize unweighted, quadratic polynomial fit + std::optional<std::array<float, 3>> xCoeff = solveUnweightedLeastSquaresDeg2(time, x, m); + std::optional<std::array<float, 3>> yCoeff = solveUnweightedLeastSquaresDeg2(time, y, m); + if (xCoeff && yCoeff) { outEstimator->time = newestMovement.eventTime; outEstimator->degree = 2; outEstimator->confidence = 1; - outEstimator->xCoeff[0] = 0; // only slope is calculated, set rest of coefficients = 0 - outEstimator->yCoeff[0] = 0; - outEstimator->xCoeff[1] = solveUnweightedLeastSquaresDeg2(time, x, m); - outEstimator->yCoeff[1] = solveUnweightedLeastSquaresDeg2(time, y, m); - outEstimator->xCoeff[2] = 0; - outEstimator->yCoeff[2] = 0; + for (size_t i = 0; i <= outEstimator->degree; i++) { + outEstimator->xCoeff[i] = (*xCoeff)[i]; + outEstimator->yCoeff[i] = (*yCoeff)[i]; + } return true; } - + } else if (degree >= 1) { + // General case for an Nth degree polynomial fit float xdet, ydet; uint32_t n = degree + 1; if (solveLeastSquares(time, x, w, m, n, outEstimator->xCoeff, &xdet) diff --git a/libs/vr/libpdx_default_transport/Android.bp b/libs/vr/libpdx_default_transport/Android.bp index 74b8c8bd21..1176abf552 100644 --- a/libs/vr/libpdx_default_transport/Android.bp +++ b/libs/vr/libpdx_default_transport/Android.bp @@ -40,6 +40,7 @@ cc_library_shared { "liblog", "libutils", "libcrypto", + "libselinux", ], } diff --git a/libs/vr/libpdx_uds/Android.bp b/libs/vr/libpdx_uds/Android.bp index d64095061e..1d6eea29a6 100644 --- a/libs/vr/libpdx_uds/Android.bp +++ b/libs/vr/libpdx_uds/Android.bp @@ -26,8 +26,6 @@ cc_library_static { ], shared_libs: [ "libbinder", - ], - whole_static_libs: [ "libselinux", ], } @@ -57,5 +55,6 @@ cc_test { "liblog", "libutils", "libbinder", + "libselinux", ], } |