Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 95b00c8c authored by Ytai Ben-Tsvi's avatar Ytai Ben-Tsvi
Browse files

Refine the recenter operation

This change allows recentering to happen for an individual sensor
rather than to all at once. This avoids unecessary recentering and
rate limiting if the sensor being recentered is not being used in the
current mode.

Test: atest --host libheadtracking-test
Bug: 188502620
Change-Id: Ifb73050e0072e676b5936a22e0cd1be8d31e9596
parent b13c6854
Loading
Loading
Loading
Loading
+16 −4
Original line number Diff line number Diff line
@@ -108,11 +108,23 @@ class HeadTrackingProcessorImpl : public HeadTrackingProcessor {

    HeadTrackingMode getActualMode() const override { return mModeSelector.getActualMode(); }

    void recenter() override {
    void recenter(bool recenterHead, bool recenterScreen) override {
        if (recenterHead) {
            mHeadPoseDriftCompensator.recenter();
        }
        if (recenterScreen) {
            mScreenPoseDriftCompensator.recenter();
        }

        // If a sensor being recentered is included in the current mode, apply rate limiting to
        // avoid discontinuities.
        HeadTrackingMode mode = mModeSelector.getActualMode();
        if ((recenterHead && (mode == HeadTrackingMode::WORLD_RELATIVE ||
                              mode == HeadTrackingMode::SCREEN_RELATIVE)) ||
            (recenterScreen && mode == HeadTrackingMode::SCREEN_RELATIVE)) {
            mRateLimiter.enable();
        }
    }

  private:
    const Options mOptions;
+2 −2
Original line number Diff line number Diff line
@@ -89,9 +89,9 @@ class HeadTrackingProcessor {
    virtual HeadTrackingMode getActualMode() const = 0;

    /**
     * This causes the current poses for both the head and screen to be considered "center".
     * This causes the current poses for both the head and/or screen to be considered "center".
     */
    virtual void recenter() = 0;
    virtual void recenter(bool recenterHead = true, bool recenterScreen = true) = 0;
};

/**
+2 −2
Original line number Diff line number Diff line
@@ -124,7 +124,7 @@ void SpatializerPoseController::setHeadSensor(const ASensor* sensor) {
    // Start new sensor, if valid.
    mHeadSensor = sensor != nullptr ? mPoseProvider->startSensor(sensor, mSensorPeriod)
                                    : SensorPoseProvider::INVALID_HANDLE;
    mProcessor->recenter();
    mProcessor->recenter(true, false);
}

void SpatializerPoseController::setScreenSensor(const ASensor* sensor) {
@@ -136,7 +136,7 @@ void SpatializerPoseController::setScreenSensor(const ASensor* sensor) {
    // Start new sensor, if valid.
    mScreenSensor = sensor != nullptr ? mPoseProvider->startSensor(sensor, mSensorPeriod)
                                      : SensorPoseProvider::INVALID_HANDLE;
    mProcessor->recenter();
    mProcessor->recenter(false, true);
}

void SpatializerPoseController::setDesiredMode(HeadTrackingMode mode) {