widget/gonk/ProcessOrientation.h

Thu, 22 Jan 2015 13:21:57 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 22 Jan 2015 13:21:57 +0100
branch
TOR_BUG_9701
changeset 15
b8a032363ba2
permissions
-rw-r--r--

Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6

     1 /*
     2  * Copyright (c) 2013, Linux Foundation. All rights reserved
     3  *
     4  * Copyright (C) 2008 The Android Open Source Project
     5  *
     6  * Licensed under the Apache License, Version 2.0 (the "License");
     7  * you may not use this file except in compliance with the License.
     8  * You may obtain a copy of the License at
     9  *
    10  *      http://www.apache.org/licenses/LICENSE-2.0
    11  *
    12  * Unless required by applicable law or agreed to in writing, software
    13  * distributed under the License is distributed on an "AS IS" BASIS,
    14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    15  * See the License for the specific language governing permissions and
    16  * limitations under the License.
    17  */
    19 #ifndef ProcessOrientation_h
    20 #define ProcessOrientation_h
    22 #include "mozilla/Hal.h"
    24 namespace mozilla {
    26 // History of observed tilt angles.
    27 #define TILT_HISTORY_SIZE 40
    29 class ProcessOrientation {
    30 public:
    31   ProcessOrientation() {};
    32   ~ProcessOrientation() {};
    34   int OnSensorChanged(const mozilla::hal::SensorData& event, int deviceCurrentRotation);
    35   int Reset();
    37 private:
    38   int GetProposedRotation();
    40   // Returns true if the tilt angle is acceptable for a given predicted
    41   // rotation.
    42   bool IsTiltAngleAcceptable(int rotation, int tiltAngle);
    44   // Returns true if the orientation angle is acceptable for a given predicted
    45   // rotation. This function takes into account the gap between adjacent
    46   // orientations for hysteresis.
    47   bool IsOrientationAngleAcceptable(int rotation, int orientationAngle,
    48                                     int currentRotation);
    50   // Returns true if the predicted rotation is ready to be advertised as a
    51   // proposed rotation.
    52   bool IsPredictedRotationAcceptable(long now);
    54   void ClearPredictedRotation();
    55   void UpdatePredictedRotation(long now, int rotation);
    56   bool IsAccelerating(float magnitude);
    57   void ClearTiltHistory();
    58   void AddTiltHistoryEntry(long now, float tilt);
    59   bool IsFlat(long now);
    60   bool IsSwinging(long now, float tilt);
    61   int NextTiltHistoryIndex(int index);
    62   float RemainingMS(long now, long until);
    64   // The tilt angle range in degrees for each orientation. Beyond these tilt
    65   // angles, we don't even consider transitioning into the specified orientation.
    66   // We place more stringent requirements on unnatural orientations than natural
    67   // ones to make it less likely to accidentally transition into those states.
    68   // The first value of each pair is negative so it applies a limit when the
    69   // device is facing down (overhead reading in bed). The second value of each
    70   // pair is positive so it applies a limit when the device is facing up
    71   // (resting on a table). The ideal tilt angle is 0 (when the device is vertical)
    72   // so the limits establish how close to vertical the device must be in order
    73   // to change orientation.
    74   static const int tiltTolerance[][4];
    76   // Timestamp and value of the last accelerometer sample.
    77   long mLastFilteredTimestampNanos;
    78   float mLastFilteredX, mLastFilteredY, mLastFilteredZ;
    80   // The last proposed rotation, -1 if unknown.
    81   int mProposedRotation;
    83   // Value of the current predicted rotation, -1 if unknown.
    84   int mPredictedRotation;
    86   // Timestamp of when the predicted rotation most recently changed.
    87   long mPredictedRotationTimestampNanos;
    89   // Timestamp when the device last appeared to be flat for sure (the flat delay
    90   // elapsed).
    91   long mFlatTimestampNanos;
    93   // Timestamp when the device last appeared to be swinging.
    94   long mSwingTimestampNanos;
    96   // Timestamp when the device last appeared to be undergoing external
    97   // acceleration.
    98   long mAccelerationTimestampNanos;
   100   struct {
   101     struct {
   102       float tiltAngle;
   103       long timestampNanos;
   104     } history[TILT_HISTORY_SIZE];
   105     int index;
   106   } mTiltHistory;
   107 };
   109 } // namespace mozilla
   110 #endif

mercurial