149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/*
249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow* Copyright (C) 2012 Invensense, Inc.
349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow*
449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow* Licensed under the Apache License, Version 2.0 (the "License");
549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow* you may not use this file except in compliance with the License.
649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow* You may obtain a copy of the License at
749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow*
849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow*      http://www.apache.org/licenses/LICENSE-2.0
949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow*
1049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow* Unless required by applicable law or agreed to in writing, software
1149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow* distributed under the License is distributed on an "AS IS" BASIS,
1249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow* See the License for the specific language governing permissions and
1449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow* limitations under the License.
1549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow*/
1649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
1749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#ifndef ANDROID_MPL_SENSOR_H
1849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define ANDROID_MPL_SENSOR_H
1949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
2049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#include <stdint.h>
2149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#include <errno.h>
2249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#include <sys/cdefs.h>
2349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#include <sys/types.h>
2449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#include <poll.h>
2549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#include <time.h>
2649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#include <utils/Vector.h>
2749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#include <utils/KeyedVector.h>
2849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#include <utils/String8.h>
2949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#include "sensors.h"
3049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#include "SensorBase.h"
3149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#include "InputEventReader.h"
3249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
3349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#ifndef INVENSENSE_COMPASS_CAL
3449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#pragma message("unified HAL for AKM")
3549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#include "CompassSensor.AKM.h"
3649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#endif
3749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
3849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#ifdef SENSOR_ON_PRIMARY_BUS
3949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#pragma message("Sensor on Primary Bus")
4049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#include "CompassSensor.IIO.primary.h"
4149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#else
4249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#pragma message("Sensor on Secondary Bus")
4349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#include "CompassSensor.IIO.9150.h"
4449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#endif
4549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
4649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowclass PressureSensor;
474a28f9c897c46c42a255823f7e307169a828a025Rosa Chow
4849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/*****************************************************************************/
4949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/* Sensors Enable/Disable Mask
5049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *****************************************************************************/
5149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define MAX_CHIP_ID_LEN             (20)
5249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
5349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define INV_THREE_AXIS_GYRO         (0x000F)
5449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define INV_THREE_AXIS_ACCEL        (0x0070)
5549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define INV_THREE_AXIS_COMPASS      (0x0380)
5649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define INV_ONE_AXIS_PRESSURE       (0x0400)
5749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define INV_ALL_SENSORS             (0x7FFF)
5849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
5949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#ifdef INVENSENSE_COMPASS_CAL
6049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define ALL_MPL_SENSORS_NP          (INV_THREE_AXIS_ACCEL \
6149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow                                      | INV_THREE_AXIS_COMPASS \
6249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow                                      | INV_THREE_AXIS_GYRO)
6349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#else
6449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define ALL_MPL_SENSORS_NP          (INV_THREE_AXIS_ACCEL \
6549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow                                      | INV_THREE_AXIS_COMPASS \
6649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow                                      | INV_THREE_AXIS_GYRO)
6749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#endif
6849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
6949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow// bit mask of current active features (mMplFeatureActiveMask)
7049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define INV_COMPASS_CAL              0x01
7149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define INV_COMPASS_FIT              0x02
7249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow// bit mask of current active features (mFeatureActiveMask)
734a28f9c897c46c42a255823f7e307169a828a025Rosa Chow#define INV_DMP_QUATERNION           0x001 //3 elements without real part, 32 bit each
744a28f9c897c46c42a255823f7e307169a828a025Rosa Chow#define INV_DMP_DISPL_ORIENTATION    0x002
754a28f9c897c46c42a255823f7e307169a828a025Rosa Chow#define INV_DMP_SIGNIFICANT_MOTION   0x004
764a28f9c897c46c42a255823f7e307169a828a025Rosa Chow#define INV_DMP_PEDOMETER            0x008
774a28f9c897c46c42a255823f7e307169a828a025Rosa Chow#define INV_DMP_PEDOMETER_STEP       0x010
784a28f9c897c46c42a255823f7e307169a828a025Rosa Chow#define INV_DMP_PED_STANDALONE       0x020 //timestamps only
794a28f9c897c46c42a255823f7e307169a828a025Rosa Chow#define INV_DMP_6AXIS_QUATERNION     0x040 //3 elements without real part, 32 bit each
804a28f9c897c46c42a255823f7e307169a828a025Rosa Chow#define INV_DMP_PED_QUATERNION       0x080 //3 elements without real part, 16 bit each
814a28f9c897c46c42a255823f7e307169a828a025Rosa Chow#define INV_DMP_PED_INDICATOR        0x100 //tag along header with step indciator
824a28f9c897c46c42a255823f7e307169a828a025Rosa Chow#define INV_DMP_BATCH_MODE           0x200
834a28f9c897c46c42a255823f7e307169a828a025Rosa Chow#define INV_DMP_ACCEL_PED (0xffff)
8449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
8549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow// bit mask of whether screen orientation is on
8649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/*#define SCREEN_ORIENTATION_MASK (                         \
8749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        (isDmpDisplayOrientationOn()                      \
8849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        && ((1 << INV_DMP_DISPL_ORIENTATION)              \
8949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow             || !isDmpScreenAutoRotationEnabled()))       \
9049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow)*/
9149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow// bit mask of whether DMP should be turned on
9249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define DMP_FEATURE_MASK (                           \
9349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        (INV_DMP_QUATERNION)                         \
9449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        | (INV_DMP_DISPL_ORIENTATION)                \
9549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        | (INV_DMP_SIGNIFICANT_MOTION)               \
9649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        | (INV_DMP_PEDOMETER)                        \
974a28f9c897c46c42a255823f7e307169a828a025Rosa Chow        | (INV_DMP_PEDOMETER_STEP)                   \
9849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        | (INV_DMP_6AXIS_QUATERNION)                 \
9949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        | (INV_DMP_PED_QUATERNION)                   \
10049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        | (INV_DMP_BATCH_MODE)                       \
10149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow)
10249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow// bit mask of DMP features as sensors
10349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define DMP_SENSOR_MASK (                            \
10449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        (INV_DMP_DISPL_ORIENTATION)                  \
10549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        | (INV_DMP_SIGNIFICANT_MOTION)               \
10649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        | (INV_DMP_PEDOMETER)                        \
1074a28f9c897c46c42a255823f7e307169a828a025Rosa Chow        | (INV_DMP_PEDOMETER_STEP)                   \
10849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        | (INV_DMP_6AXIS_QUATERNION)                 \
10949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow)
11049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow// data header format used by kernel driver.
1114a28f9c897c46c42a255823f7e307169a828a025Rosa Chow#define DATA_FORMAT_STEP           0x0001
112cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro#define DATA_FORMAT_MARKER         0x0010
1134a28f9c897c46c42a255823f7e307169a828a025Rosa Chow#define DATA_FORMAT_PED_STANDALONE 0x0100
11449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define DATA_FORMAT_PED_QUAT       0x0200
11549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define DATA_FORMAT_6_AXIS         0x0400
11649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define DATA_FORMAT_QUAT           0x0800
11749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define DATA_FORMAT_COMPASS        0x1000
11849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define DATA_FORMAT_GYRO           0x2000
11949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define DATA_FORMAT_ACCEL          0x4000
12049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define DATA_FORMAT_PRESSURE       0x8000
12149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define DATA_FORMAT_MASK           0xffff
12249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
12349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define BYTES_PER_SENSOR                8
12449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define BYTES_PER_SENSOR_PACKET         16
12549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define QUAT_ONLY_LAST_PACKET_OFFSET    16
12649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define BYTES_QUAT_DATA                 24
12749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define MAX_SUSPEND_BATCH_PACKET_SIZE   1024
12849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define MAX_PACKET_SIZE                 80 //8 * 4 + (2 * 24)
12949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
13049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/* Uncomment to enable Low Power Quaternion */
13149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define ENABLE_LP_QUAT_FEAT
13249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
13349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/* Uncomment to enable DMP display orientation
13449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow   (within the HAL, see below for Java framework) */
13549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow//#define ENABLE_DMP_DISPL_ORIENT_FEAT
13649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
13749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#ifdef ENABLE_DMP_DISPL_ORIENT_FEAT
13849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/* Uncomment following to expose the SENSOR_TYPE_SCREEN_ORIENTATION
13949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow   sensor type (DMP screen orientation) to the Java framework.
14049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow   NOTE:
14149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       need Invensense customized
14249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       'hardware/libhardware/include/hardware/sensors.h' to compile correctly.
14349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow   NOTE:
14449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       need Invensense java framework changes to:
14549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       'frameworks/base/core/java/android/view/WindowOrientationListener.java'
14649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       'frameworks/base/core/java/android/hardware/Sensor.java'
14749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       'frameworks/base/core/java/android/hardware/SensorEvent.java'
14849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       for the 'Auto-rotate screen' to use this feature.
14949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow*/
15049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define ENABLE_DMP_SCREEN_AUTO_ROTATION
15149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#pragma message("ENABLE_DMP_DISPL_ORIENT_FEAT is defined, framework changes are necessary for HAL to work properly")
15249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#endif
15349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
15449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/* Enable Pressure sensor support */
15549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define ENABLE_PRESSURE
15649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
15749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowint isDmpScreenAutoRotationEnabled()
15849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow{
15949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#ifdef ENABLE_DMP_SCREEN_AUTO_ROTATION
16049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    return 1;
16149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#else
16249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    return 0;
16349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#endif
16449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow}
16549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
16649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowint (*m_pt2AccelCalLoadFunc)(long *bias) = NULL;
16749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/*****************************************************************************/
16849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/** MPLSensor implementation which fits into the HAL example for crespo provided
16949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  by Google.
17049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  WARNING: there may only be one instance of MPLSensor, ever.
17149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */
17249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
17349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowclass MPLSensor: public SensorBase
17449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow{
17549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    typedef int (MPLSensor::*hfunc_t)(sensors_event_t*);
17649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
17749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowpublic:
17849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
17949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    enum {
18049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        Gyro = 0,
18149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        RawGyro,
18249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        Accelerometer,
18349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        MagneticField,
18449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        RawMagneticField,
18549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        Pressure,
18649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        Orientation,
18749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        RotationVector,
18849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        GameRotationVector,
18949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        LinearAccel,
19049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        Gravity,
19149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        SignificantMotion,
19249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        StepDetector,
19349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        StepCounter,
19449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        GeomagneticRotationVector,
19549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        NumSensors
19649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    };
19749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
19849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    MPLSensor(CompassSensor *, int (*m_pt2AccelCalLoadFunc)(long*) = 0);
19949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    virtual ~MPLSensor();
20049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
20149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    virtual int setDelay(int32_t handle, int64_t ns);
20249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    virtual int enable(int32_t handle, int enabled);
20349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    virtual int batch(int handle, int flags, int64_t period_ns, int64_t timeout);
204cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro    virtual int flush(int handle);
205cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro    int checkBatchEnabled();
2064a28f9c897c46c42a255823f7e307169a828a025Rosa Chow    int setBatch(int en, int toggleEnable);
20749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int32_t getEnableMask() { return mEnabled; }
20849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void getHandle(int32_t handle, int &what, android::String8 &sname);
20949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
21049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    virtual int readEvents(sensors_event_t *data, int count);
21149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    virtual int getFd() const;
21249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    virtual int getAccelFd() const;
21349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    virtual int getCompassFd() const;
21449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    virtual int getPollTime();
21549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    virtual int getStepCountPollTime();
21649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    virtual bool hasPendingEvents() const;
21749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    virtual bool hasStepCountPendingEvents();
21849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    virtual void sleepEvent();
21949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    virtual void wakeEvent();
22049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int populateSensorList(struct sensor_t *list, int len);
22149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void cbProcData();
22249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
22349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    //static pointer to the object that will handle callbacks
22449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    static MPLSensor* gMPLSensor;
22549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
22649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int readAccelEvents(sensors_event_t* data, int count);
22749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void buildCompassEvent();
22849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void buildMpuEvent();
22949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
23049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int turnOffAccelFifo();
23149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int turnOffGyroFifo();
23249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int enableDmpOrientation(int);
23349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int dmpOrientHandler(int);
23449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int readDmpOrientEvents(sensors_event_t* data, int count);
23549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int getDmpOrientFd();
23649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int openDmpOrientFd();
23749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int closeDmpOrientFd();
23849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
23949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int getDmpRate(int64_t *);
24049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int checkDMPOrientation();
24149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
24249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int getDmpSignificantMotionFd();
24349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int readDmpSignificantMotionEvents(sensors_event_t* data, int count);
24449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int enableDmpSignificantMotion(int);
24549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int significantMotionHandler(sensors_event_t* data);
24649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    bool checkSmdSupport(){return (mDmpSignificantMotionEnabled);};
24749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
24849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int enableDmpPedometer(int, int);
24949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int readDmpPedometerEvents(sensors_event_t* data, int count, int32_t id, int32_t type, int outputType);
25049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int getDmpPedometerFd();
25149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    bool checkPedometerSupport() {return (mDmpPedometerEnabled || mDmpStepCountEnabled);};
25249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    bool checkOrientationSupport() {return ((isDmpDisplayOrientationOn()
25349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow                                       && (mDmpOrientationEnabled
25449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow                                       || !isDmpScreenAutoRotationEnabled())));};
25549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
25649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowprotected:
25749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    CompassSensor *mCompassSensor;
25849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    PressureSensor *mPressureSensor;
25949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
26049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int gyroHandler(sensors_event_t *data);
26149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int rawGyroHandler(sensors_event_t *data);
26249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int accelHandler(sensors_event_t *data);
26349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int compassHandler(sensors_event_t *data);
26449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int rawCompassHandler(sensors_event_t *data);
26549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int rvHandler(sensors_event_t *data);
26649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int grvHandler(sensors_event_t *data);
26749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int laHandler(sensors_event_t *data);
26849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int gravHandler(sensors_event_t *data);
26949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int orienHandler(sensors_event_t *data);
27049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int smHandler(sensors_event_t *data);
27149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int pHandler(sensors_event_t *data);
27249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int scHandler(sensors_event_t *data);
27349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int gmHandler(sensors_event_t *data);
27449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int psHandler(sensors_event_t *data);
275cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro    int metaHandler(sensors_event_t *data, int flags);
27649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void calcOrientationSensor(float *Rx, float *Val);
27749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    virtual int update_delay();
27849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
27949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void inv_set_device_properties();
28049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int inv_constructor_init();
28149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int inv_constructor_default_enable();
28249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int setGyroInitialState();
28349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int setAccelInitialState();
28449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int masterEnable(int en);
2854a28f9c897c46c42a255823f7e307169a828a025Rosa Chow    int enablePedStandalone(int en);
2864a28f9c897c46c42a255823f7e307169a828a025Rosa Chow    int enablePedStandaloneData(int en);
28749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int enablePedQuaternion(int);
28849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int enablePedQuaternionData(int);
28949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int enable6AxisQuaternion(int);
29049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int enable6AxisQuaternionData(int);
29149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int enableLPQuaternion(int);
29249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int enableQuaternionData(int);
29349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int enableAccelPedometer(int);
29449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int enableAccelPedData(int);
29549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int onDmp(int);
29649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int enableGyro(int en);
297cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro    int enableLowPowerAccel(int en);
29849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int enableAccel(int en);
29949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int enableCompass(int en, int rawSensorOn);
30049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int enablePressure(int en);
3014a28f9c897c46c42a255823f7e307169a828a025Rosa Chow    int enableBatch(int64_t timeout);
30249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void computeLocalSensorMask(int enabled_sensors);
30349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int computeBatchSensorMask(int enableSensor, int checkNewBatchSensor);
30449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int computeBatchDataOutput();
30549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int enableSensors(unsigned long sensors, int en, uint32_t changed);
30649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int inv_read_gyro_buffer(int fd, short *data, long long *timestamp);
30749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int inv_float_to_q16(float *fdata, long *ldata);
30849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int inv_long_to_q16(long *fdata, long *ldata);
30949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int inv_float_to_round(float *fdata, long *ldata);
31049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int inv_float_to_round2(float *fdata, short *sdata);
31149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int inv_long_to_float(long *ldata, float *fdata);
31249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int inv_read_temperature(long long *data);
31349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int inv_read_dmp_state(int fd);
31449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int inv_read_sensor_bias(int fd, long *data);
31549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void inv_get_sensors_orientation(void);
31649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int inv_init_sysfs_attributes(void);
31749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int resetCompass(void);
31849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void setCompassDelay(int64_t ns);
31949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void enable_iio_sysfs(void);
32049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int enablePedometer(int);
3214a28f9c897c46c42a255823f7e307169a828a025Rosa Chow    int enablePedIndicator(int en);
3224a28f9c897c46c42a255823f7e307169a828a025Rosa Chow    int checkPedStandaloneEnabled(void);
32349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int checkPedQuatEnabled();
32449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int check6AxisQuatEnabled();
325cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro    int checkLPQRateSupported();
32649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int checkLPQuaternion();
32749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int checkAccelPed();
328cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro    void setInitial6QuatValue();
32949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int writeSignificantMotionParams(bool toggleEnable,
33049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow                                     uint32_t delayThreshold1, uint32_t delayThreshold2,
33149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow                                     uint32_t motionThreshold);
33249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
33349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int mNewData;   // flag indicating that the MPL calculated new output values
33449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int mDmpStarted;
33549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    long mMasterSensorMask;
33649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    long mLocalSensorMask;
33749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int mPollTime;
33849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int mStepCountPollTime;
33949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    bool mHaveGoodMpuCal;   // flag indicating that the cal file can be written
34049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int mGyroAccuracy;      // value indicating the quality of the gyro calibr.
34149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int mAccelAccuracy;     // value indicating the quality of the accel calibr.
34249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int mCompassAccuracy;     // value indicating the quality of the compass calibr.
34349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    struct pollfd mPollFds[5];
34449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int mSampleCount;
34549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    pthread_mutex_t mMplMutex;
34649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    pthread_mutex_t mHALMutex;
34749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
34849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    char mIIOBuffer[(16 + 8 * 3 + 8) * IIO_BUFFER_LENGTH];
34949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
35049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int iio_fd;
35149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int accel_fd;
35249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int mpufifo_fd;
35349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int gyro_temperature_fd;
35449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int accel_x_offset_fd;
35549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int accel_y_offset_fd;
35649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int accel_z_offset_fd;
35749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
35849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int accel_x_dmp_bias_fd;
35949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int accel_y_dmp_bias_fd;
36049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int accel_z_dmp_bias_fd;
36149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
36249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int gyro_x_offset_fd;
36349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int gyro_y_offset_fd;
36449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int gyro_z_offset_fd;
36549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
36649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int gyro_x_dmp_bias_fd;
36749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int gyro_y_dmp_bias_fd;
36849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int gyro_z_dmp_bias_fd;
36949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
37049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int dmp_orient_fd;
37149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int mDmpOrientationEnabled;
37249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
37349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int dmp_sign_motion_fd;
37449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int mDmpSignificantMotionEnabled;
37549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
37649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int dmp_pedometer_fd;
37749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int mDmpPedometerEnabled;
37849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int mDmpStepCountEnabled;
37949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
38049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    uint32_t mEnabled;
38149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    uint32_t mBatchEnabled;
382cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro    int32_t mFlushEnabled;
383cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro    uint32_t mOldBatchEnabledMask;
38449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int64_t mBatchTimeoutInMs;
38549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    sensors_event_t mPendingEvents[NumSensors];
38649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int64_t mDelays[NumSensors];
38749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int64_t mBatchDelays[NumSensors];
3884a28f9c897c46c42a255823f7e307169a828a025Rosa Chow    int64_t mBatchTimeouts[NumSensors];
38949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    hfunc_t mHandlers[NumSensors];
39049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    short mCachedGyroData[3];
39149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    long mCachedAccelData[3];
39249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    long mCachedCompassData[3];
39349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    long mCachedQuaternionData[3];
39449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    long mCached6AxisQuaternionData[3];
39549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    long mCachedPedQuaternionData[3];
39649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    long mCachedPressureData;
39749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    android::KeyedVector<int, int> mIrqFds;
39849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
39949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    InputEventCircularReader mAccelInputReader;
40049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    InputEventCircularReader mGyroInputReader;
40149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
40249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    bool mFirstRead;
40349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    short mTempScale;
40449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    short mTempOffset;
40549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int64_t mTempCurrentTime;
40649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int mAccelScale;
407cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro    long mAccelSelfTestScale;
40849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    long mGyroScale;
4094a28f9c897c46c42a255823f7e307169a828a025Rosa Chow    long mGyroSelfTestScale;
41049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    long mCompassScale;
41149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    float mCompassBias[3];
41249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    bool mFactoryGyroBiasAvailable;
41349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    long mFactoryGyroBias[3];
41449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    bool mGyroBiasAvailable;
41549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    bool mGyroBiasApplied;
41649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    float mGyroBias[3];    //in body frame
41749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    long mGyroChipBias[3]; //in chip frame
41849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    bool mFactoryAccelBiasAvailable;
41949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    long mFactoryAccelBias[3];
42049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    bool mAccelBiasAvailable;
42149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    bool mAccelBiasApplied;
42249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    long mAccelBias[3];    //in chip frame
42349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
42449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    uint32_t mPendingMask;
42549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    unsigned long mSensorMask;
42649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
42749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    char chip_ID[MAX_CHIP_ID_LEN];
42849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    char mSysfsPath[MAX_SYSFS_NAME_LEN];
42949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
43049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    signed char mGyroOrientation[9];
43149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    signed char mAccelOrientation[9];
43249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
43349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int64_t mSensorTimestamp;
43449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int64_t mCompassTimestamp;
43549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int64_t mPressureTimestamp;
43649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
43749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    struct sysfs_attrbs {
43849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *chip_enable;
43949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *power_state;
440cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro       char *master_enable;
44149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *dmp_firmware;
44249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *firmware_loaded;
44349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *dmp_on;
44449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *dmp_int_on;
44549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *dmp_event_int_on;
44649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *tap_on;
44749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *key;
44849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *self_test;
44949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *temperature;
45049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
45149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *gyro_enable;
45249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *gyro_fifo_rate;
45349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *gyro_fsr;
45449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *gyro_orient;
45549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *gyro_fifo_enable;
4564a28f9c897c46c42a255823f7e307169a828a025Rosa Chow       char *gyro_rate;
45749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
45849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *accel_enable;
45949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *accel_fifo_rate;
46049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *accel_fsr;
46149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *accel_bias;
46249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *accel_orient;
46349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *accel_fifo_enable;
4644a28f9c897c46c42a255823f7e307169a828a025Rosa Chow       char *accel_rate;
46549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
46649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *three_axis_q_on; //formerly quaternion_on
4674a28f9c897c46c42a255823f7e307169a828a025Rosa Chow       char *three_axis_q_rate;
468cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro
46949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *six_axis_q_on;
4704a28f9c897c46c42a255823f7e307169a828a025Rosa Chow       char *six_axis_q_rate;
471cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro
472cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro       char *six_axis_q_value;
473cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro
47449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *ped_q_on;
4754a28f9c897c46c42a255823f7e307169a828a025Rosa Chow       char *ped_q_rate;
4764a28f9c897c46c42a255823f7e307169a828a025Rosa Chow
4774a28f9c897c46c42a255823f7e307169a828a025Rosa Chow       char *step_detector_on;
4784a28f9c897c46c42a255823f7e307169a828a025Rosa Chow       char *step_indicator_on;
47949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
48049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *in_timestamp_en;
48149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *in_timestamp_index;
48249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *in_timestamp_type;
48349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
48449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *buffer_length;
48549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
48649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *display_orientation_on;
48749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *event_display_orientation;
48849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
48949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *in_accel_x_offset;
49049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *in_accel_y_offset;
49149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *in_accel_z_offset;
492cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro       char *in_accel_self_test_scale;
49349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
49449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *in_accel_x_dmp_bias;
49549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *in_accel_y_dmp_bias;
49649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *in_accel_z_dmp_bias;
49749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
49849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *in_gyro_x_offset;
49949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *in_gyro_y_offset;
50049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *in_gyro_z_offset;
5014a28f9c897c46c42a255823f7e307169a828a025Rosa Chow       char *in_gyro_self_test_scale;
50249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
50349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *in_gyro_x_dmp_bias;
50449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *in_gyro_y_dmp_bias;
50549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *in_gyro_z_dmp_bias;
50649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
50749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *event_smd;
50849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *smd_enable;
50949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *smd_delay_threshold;
51049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *smd_delay_threshold2;
51149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *smd_threshold;
51249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *batchmode_timeout;
51349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *batchmode_wake_fifo_full_on;
514cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro       char *flush_batch;
51549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
51649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *pedometer_on;
51749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *pedometer_int_on;
51849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *event_pedometer;
51949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *pedometer_steps;
520cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro
521cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro       char *motion_lpa_on;
52249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    } mpu;
52349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
52449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    char *sysfs_names_ptr;
52549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int mMplFeatureActiveMask;
52649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    uint64_t mFeatureActiveMask;
52749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    bool mDmpOn;
52849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int mPedUpdate;
529cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro    int mPressureUpdate;
53049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int64_t mQuatSensorTimestamp;
5314a28f9c897c46c42a255823f7e307169a828a025Rosa Chow    int64_t mStepSensorTimestamp;
53249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    uint64_t mLastStepCount;
5334a28f9c897c46c42a255823f7e307169a828a025Rosa Chow    int mLeftOverBufferSize;
5344a28f9c897c46c42a255823f7e307169a828a025Rosa Chow    char mLeftOverBuffer[24];
535cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro    bool mInitial6QuatValueAvailable;
536cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro    long mInitial6QuatValue[4];
537cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro    bool mFlushBatchSet;
538cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro    uint32_t mSkipReadEvents;
53949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
54049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowprivate:
54149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    /* added for dynamic get sensor list */
54249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void fillAccel(const char* accel, struct sensor_t *list);
54349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void fillGyro(const char* gyro, struct sensor_t *list);
54449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void fillRV(struct sensor_t *list);
54549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void fillGMRV(struct sensor_t *list);
54649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void fillGRV(struct sensor_t *list);
54749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void fillOrientation(struct sensor_t *list);
54849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void fillGravity(struct sensor_t *list);
54949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void fillLinearAccel(struct sensor_t *list);
55049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void fillSignificantMotion(struct sensor_t *list);
55149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#ifdef ENABLE_DMP_SCREEN_AUTO_ROTATION
55249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void fillScreenOrientation(struct sensor_t *list);
55349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#endif
55449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void storeCalibration();
55549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void loadDMP();
55649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    bool isMpuNonDmp();
55749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int isLowPowerQuatEnabled();
55849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int isDmpDisplayOrientationOn();
55949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void getCompassBias();
56049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void getFactoryGyroBias();
56149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void setFactoryGyroBias();
56249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void getGyroBias();
56349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void setGyroBias();
56449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void getFactoryAccelBias();
56549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void setFactoryAccelBias();
56649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void getAccelBias();
56749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void setAccelBias();
56849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int isCompassDisabled();
5694a28f9c897c46c42a255823f7e307169a828a025Rosa Chow    int setBatchDataRates();
5704a28f9c897c46c42a255823f7e307169a828a025Rosa Chow    int resetDataRates();
5714a28f9c897c46c42a255823f7e307169a828a025Rosa Chow    void initBias();
57249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void sys_dump(bool fileMode);
57349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow};
57449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
57549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowextern "C" {
57649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void setCallbackObject(MPLSensor*);
57749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    MPLSensor *getCallbackObject();
57849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow}
57949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
58049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#endif  // ANDROID_MPL_SENSOR_H
581