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
1124a28f9c897c46c42a255823f7e307169a828a025Rosa Chow#define DATA_FORMAT_PED_STANDALONE 0x0100
11349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define DATA_FORMAT_PED_QUAT       0x0200
11449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define DATA_FORMAT_6_AXIS         0x0400
11549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define DATA_FORMAT_QUAT           0x0800
11649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define DATA_FORMAT_COMPASS        0x1000
11749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define DATA_FORMAT_GYRO           0x2000
11849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define DATA_FORMAT_ACCEL          0x4000
11949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define DATA_FORMAT_PRESSURE       0x8000
12049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define DATA_FORMAT_MASK           0xffff
12149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
12249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define BYTES_PER_SENSOR                8
12349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define BYTES_PER_SENSOR_PACKET         16
12449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define QUAT_ONLY_LAST_PACKET_OFFSET    16
12549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define BYTES_QUAT_DATA                 24
12649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define MAX_SUSPEND_BATCH_PACKET_SIZE   1024
12749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define MAX_PACKET_SIZE                 80 //8 * 4 + (2 * 24)
12849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
12949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/* Uncomment to enable Low Power Quaternion */
13049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define ENABLE_LP_QUAT_FEAT
13149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
13249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/* Uncomment to enable DMP display orientation
13349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow   (within the HAL, see below for Java framework) */
13449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow//#define ENABLE_DMP_DISPL_ORIENT_FEAT
13549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
13649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#ifdef ENABLE_DMP_DISPL_ORIENT_FEAT
13749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/* Uncomment following to expose the SENSOR_TYPE_SCREEN_ORIENTATION
13849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow   sensor type (DMP screen orientation) to the Java framework.
13949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow   NOTE:
14049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       need Invensense customized
14149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       'hardware/libhardware/include/hardware/sensors.h' to compile correctly.
14249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow   NOTE:
14349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       need Invensense java framework changes to:
14449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       'frameworks/base/core/java/android/view/WindowOrientationListener.java'
14549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       'frameworks/base/core/java/android/hardware/Sensor.java'
14649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       'frameworks/base/core/java/android/hardware/SensorEvent.java'
14749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       for the 'Auto-rotate screen' to use this feature.
14849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow*/
14949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define ENABLE_DMP_SCREEN_AUTO_ROTATION
15049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#pragma message("ENABLE_DMP_DISPL_ORIENT_FEAT is defined, framework changes are necessary for HAL to work properly")
15149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#endif
15249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
15349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/* Enable Pressure sensor support */
15449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define ENABLE_PRESSURE
15549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
15649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowint isDmpScreenAutoRotationEnabled()
15749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow{
15849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#ifdef ENABLE_DMP_SCREEN_AUTO_ROTATION
15949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    return 1;
16049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#else
16149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    return 0;
16249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#endif
16349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow}
16449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
16549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowint (*m_pt2AccelCalLoadFunc)(long *bias) = NULL;
16649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/*****************************************************************************/
16749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/** MPLSensor implementation which fits into the HAL example for crespo provided
16849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  by Google.
16949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  WARNING: there may only be one instance of MPLSensor, ever.
17049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */
17149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
17249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowclass MPLSensor: public SensorBase
17349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow{
17449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    typedef int (MPLSensor::*hfunc_t)(sensors_event_t*);
17549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
17649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowpublic:
17749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
17849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    enum {
17949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        Gyro = 0,
18049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        RawGyro,
18149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        Accelerometer,
18249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        MagneticField,
18349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        RawMagneticField,
18449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        Pressure,
18549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        Orientation,
18649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        RotationVector,
18749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        GameRotationVector,
18849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        LinearAccel,
18949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        Gravity,
19049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        SignificantMotion,
19149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        StepDetector,
19249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        StepCounter,
19349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        GeomagneticRotationVector,
19449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        NumSensors
19549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    };
19649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
19749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    MPLSensor(CompassSensor *, int (*m_pt2AccelCalLoadFunc)(long*) = 0);
19849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    virtual ~MPLSensor();
19949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
20049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    virtual int setDelay(int32_t handle, int64_t ns);
20149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    virtual int enable(int32_t handle, int enabled);
20249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    virtual int batch(int handle, int flags, int64_t period_ns, int64_t timeout);
2034a28f9c897c46c42a255823f7e307169a828a025Rosa Chow    int setBatch(int en, int toggleEnable);
20449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int32_t getEnableMask() { return mEnabled; }
20549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void getHandle(int32_t handle, int &what, android::String8 &sname);
20649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
20749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    virtual int readEvents(sensors_event_t *data, int count);
20849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    virtual int getFd() const;
20949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    virtual int getAccelFd() const;
21049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    virtual int getCompassFd() const;
21149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    virtual int getPollTime();
21249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    virtual int getStepCountPollTime();
21349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    virtual bool hasPendingEvents() const;
21449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    virtual bool hasStepCountPendingEvents();
21549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    virtual void sleepEvent();
21649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    virtual void wakeEvent();
21749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int populateSensorList(struct sensor_t *list, int len);
21849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void cbProcData();
21949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
22049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    //static pointer to the object that will handle callbacks
22149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    static MPLSensor* gMPLSensor;
22249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
22349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int readAccelEvents(sensors_event_t* data, int count);
22449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void buildCompassEvent();
22549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void buildMpuEvent();
22649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
22749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int turnOffAccelFifo();
22849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int turnOffGyroFifo();
22949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int enableDmpOrientation(int);
23049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int dmpOrientHandler(int);
23149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int readDmpOrientEvents(sensors_event_t* data, int count);
23249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int getDmpOrientFd();
23349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int openDmpOrientFd();
23449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int closeDmpOrientFd();
23549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
23649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int getDmpRate(int64_t *);
23749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int checkDMPOrientation();
23849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
23949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int getDmpSignificantMotionFd();
24049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int readDmpSignificantMotionEvents(sensors_event_t* data, int count);
24149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int enableDmpSignificantMotion(int);
24249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int significantMotionHandler(sensors_event_t* data);
24349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    bool checkSmdSupport(){return (mDmpSignificantMotionEnabled);};
24449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
24549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int enableDmpPedometer(int, int);
24649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int readDmpPedometerEvents(sensors_event_t* data, int count, int32_t id, int32_t type, int outputType);
24749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int getDmpPedometerFd();
24849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    bool checkPedometerSupport() {return (mDmpPedometerEnabled || mDmpStepCountEnabled);};
24949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    bool checkOrientationSupport() {return ((isDmpDisplayOrientationOn()
25049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow                                       && (mDmpOrientationEnabled
25149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow                                       || !isDmpScreenAutoRotationEnabled())));};
25249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
25349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowprotected:
25449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    CompassSensor *mCompassSensor;
25549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    PressureSensor *mPressureSensor;
25649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
25749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int gyroHandler(sensors_event_t *data);
25849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int rawGyroHandler(sensors_event_t *data);
25949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int accelHandler(sensors_event_t *data);
26049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int compassHandler(sensors_event_t *data);
26149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int rawCompassHandler(sensors_event_t *data);
26249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int rvHandler(sensors_event_t *data);
26349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int grvHandler(sensors_event_t *data);
26449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int laHandler(sensors_event_t *data);
26549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int gravHandler(sensors_event_t *data);
26649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int orienHandler(sensors_event_t *data);
26749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int smHandler(sensors_event_t *data);
26849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int pHandler(sensors_event_t *data);
26949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int scHandler(sensors_event_t *data);
27049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int gmHandler(sensors_event_t *data);
27149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int psHandler(sensors_event_t *data);
27249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void calcOrientationSensor(float *Rx, float *Val);
27349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    virtual int update_delay();
27449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
27549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void inv_set_device_properties();
27649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int inv_constructor_init();
27749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int inv_constructor_default_enable();
27849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int setGyroInitialState();
27949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int setAccelInitialState();
28049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int masterEnable(int en);
2814a28f9c897c46c42a255823f7e307169a828a025Rosa Chow    int enablePedStandalone(int en);
2824a28f9c897c46c42a255823f7e307169a828a025Rosa Chow    int enablePedStandaloneData(int en);
28349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int enablePedQuaternion(int);
28449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int enablePedQuaternionData(int);
28549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int enable6AxisQuaternion(int);
28649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int enable6AxisQuaternionData(int);
28749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int enableLPQuaternion(int);
28849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int enableQuaternionData(int);
28949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int enableAccelPedometer(int);
29049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int enableAccelPedData(int);
29149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int onDmp(int);
29249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int enableGyro(int en);
29349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int enableAccel(int en);
29449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int enableCompass(int en, int rawSensorOn);
29549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int enablePressure(int en);
2964a28f9c897c46c42a255823f7e307169a828a025Rosa Chow    int enableBatch(int64_t timeout);
29749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void computeLocalSensorMask(int enabled_sensors);
29849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int computeBatchSensorMask(int enableSensor, int checkNewBatchSensor);
29949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int computeBatchDataOutput();
30049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int enableSensors(unsigned long sensors, int en, uint32_t changed);
30149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int inv_read_gyro_buffer(int fd, short *data, long long *timestamp);
30249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int inv_float_to_q16(float *fdata, long *ldata);
30349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int inv_long_to_q16(long *fdata, long *ldata);
30449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int inv_float_to_round(float *fdata, long *ldata);
30549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int inv_float_to_round2(float *fdata, short *sdata);
30649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int inv_long_to_float(long *ldata, float *fdata);
30749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int inv_read_temperature(long long *data);
30849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int inv_read_dmp_state(int fd);
30949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int inv_read_sensor_bias(int fd, long *data);
31049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void inv_get_sensors_orientation(void);
31149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int inv_init_sysfs_attributes(void);
31249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int resetCompass(void);
31349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void setCompassDelay(int64_t ns);
31449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void enable_iio_sysfs(void);
31549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int enablePedometer(int);
3164a28f9c897c46c42a255823f7e307169a828a025Rosa Chow    int enablePedIndicator(int en);
3174a28f9c897c46c42a255823f7e307169a828a025Rosa Chow    int checkPedStandaloneEnabled(void);
31849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int checkPedQuatEnabled();
31949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int check6AxisQuatEnabled();
32049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int checkLPQuaternion();
32149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int checkAccelPed();
32249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int writeSignificantMotionParams(bool toggleEnable,
32349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow                                     uint32_t delayThreshold1, uint32_t delayThreshold2,
32449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow                                     uint32_t motionThreshold);
32549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
32649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int mNewData;   // flag indicating that the MPL calculated new output values
32749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int mDmpStarted;
32849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    long mMasterSensorMask;
32949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    long mLocalSensorMask;
33049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int mPollTime;
33149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int mStepCountPollTime;
33249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    bool mHaveGoodMpuCal;   // flag indicating that the cal file can be written
33349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int mGyroAccuracy;      // value indicating the quality of the gyro calibr.
33449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int mAccelAccuracy;     // value indicating the quality of the accel calibr.
33549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int mCompassAccuracy;     // value indicating the quality of the compass calibr.
33649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    struct pollfd mPollFds[5];
33749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int mSampleCount;
33849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    pthread_mutex_t mMplMutex;
33949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    pthread_mutex_t mHALMutex;
34049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
34149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    char mIIOBuffer[(16 + 8 * 3 + 8) * IIO_BUFFER_LENGTH];
34249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
34349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int iio_fd;
34449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int accel_fd;
34549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int mpufifo_fd;
34649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int gyro_temperature_fd;
34749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int accel_x_offset_fd;
34849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int accel_y_offset_fd;
34949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int accel_z_offset_fd;
35049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
35149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int accel_x_dmp_bias_fd;
35249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int accel_y_dmp_bias_fd;
35349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int accel_z_dmp_bias_fd;
35449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
35549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int gyro_x_offset_fd;
35649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int gyro_y_offset_fd;
35749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int gyro_z_offset_fd;
35849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
35949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int gyro_x_dmp_bias_fd;
36049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int gyro_y_dmp_bias_fd;
36149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int gyro_z_dmp_bias_fd;
36249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
36349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int dmp_orient_fd;
36449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int mDmpOrientationEnabled;
36549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
36649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int dmp_sign_motion_fd;
36749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int mDmpSignificantMotionEnabled;
36849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
36949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int dmp_pedometer_fd;
37049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int mDmpPedometerEnabled;
37149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int mDmpStepCountEnabled;
37249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
37349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    uint32_t mEnabled;
37449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    uint32_t mBatchEnabled;
37549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int64_t mBatchTimeoutInMs;
37649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    sensors_event_t mPendingEvents[NumSensors];
37749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int64_t mDelays[NumSensors];
37849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int64_t mBatchDelays[NumSensors];
3794a28f9c897c46c42a255823f7e307169a828a025Rosa Chow    int64_t mBatchTimeouts[NumSensors];
38049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    hfunc_t mHandlers[NumSensors];
38149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    short mCachedGyroData[3];
38249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    long mCachedAccelData[3];
38349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    long mCachedCompassData[3];
38449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    long mCachedQuaternionData[3];
38549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    long mCached6AxisQuaternionData[3];
38649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    long mCachedPedQuaternionData[3];
38749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    long mCachedPressureData;
38849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    android::KeyedVector<int, int> mIrqFds;
38949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
39049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    InputEventCircularReader mAccelInputReader;
39149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    InputEventCircularReader mGyroInputReader;
39249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
39349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    bool mFirstRead;
39449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    short mTempScale;
39549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    short mTempOffset;
39649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int64_t mTempCurrentTime;
39749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int mAccelScale;
39849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    long mGyroScale;
3994a28f9c897c46c42a255823f7e307169a828a025Rosa Chow    long mGyroSelfTestScale;
40049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    long mCompassScale;
40149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    float mCompassBias[3];
40249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    bool mFactoryGyroBiasAvailable;
40349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    long mFactoryGyroBias[3];
40449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    bool mGyroBiasAvailable;
40549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    bool mGyroBiasApplied;
40649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    float mGyroBias[3];    //in body frame
40749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    long mGyroChipBias[3]; //in chip frame
40849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    bool mFactoryAccelBiasAvailable;
40949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    long mFactoryAccelBias[3];
41049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    bool mAccelBiasAvailable;
41149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    bool mAccelBiasApplied;
41249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    long mAccelBias[3];    //in chip frame
41349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
41449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    uint32_t mPendingMask;
41549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    unsigned long mSensorMask;
41649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
41749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    char chip_ID[MAX_CHIP_ID_LEN];
41849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    char mSysfsPath[MAX_SYSFS_NAME_LEN];
41949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
42049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    signed char mGyroOrientation[9];
42149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    signed char mAccelOrientation[9];
42249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
42349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int64_t mSensorTimestamp;
42449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int64_t mCompassTimestamp;
42549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int64_t mPressureTimestamp;
42649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
42749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    struct sysfs_attrbs {
42849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *chip_enable;
42949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *power_state;
43049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *dmp_firmware;
43149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *firmware_loaded;
43249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *dmp_on;
43349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *dmp_int_on;
43449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *dmp_event_int_on;
43549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *tap_on;
43649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *key;
43749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *self_test;
43849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *temperature;
43949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
44049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *gyro_enable;
44149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *gyro_fifo_rate;
44249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *gyro_fsr;
44349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *gyro_orient;
44449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *gyro_fifo_enable;
4454a28f9c897c46c42a255823f7e307169a828a025Rosa Chow       char *gyro_rate;
44649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
44749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *accel_enable;
44849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *accel_fifo_rate;
44949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *accel_fsr;
45049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *accel_bias;
45149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *accel_orient;
45249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *accel_fifo_enable;
4534a28f9c897c46c42a255823f7e307169a828a025Rosa Chow       char *accel_rate;
45449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
45549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *three_axis_q_on; //formerly quaternion_on
4564a28f9c897c46c42a255823f7e307169a828a025Rosa Chow       char *three_axis_q_rate;
4574a28f9c897c46c42a255823f7e307169a828a025Rosa Chow
45849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *six_axis_q_on;
4594a28f9c897c46c42a255823f7e307169a828a025Rosa Chow       char *six_axis_q_rate;
4604a28f9c897c46c42a255823f7e307169a828a025Rosa Chow
46149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *ped_q_on;
4624a28f9c897c46c42a255823f7e307169a828a025Rosa Chow       char *ped_q_rate;
4634a28f9c897c46c42a255823f7e307169a828a025Rosa Chow
4644a28f9c897c46c42a255823f7e307169a828a025Rosa Chow       char *step_detector_on;
4654a28f9c897c46c42a255823f7e307169a828a025Rosa Chow       char *step_indicator_on;
46649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
46749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *in_timestamp_en;
46849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *in_timestamp_index;
46949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *in_timestamp_type;
47049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
47149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *buffer_length;
47249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
47349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *display_orientation_on;
47449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *event_display_orientation;
47549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
47649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *in_accel_x_offset;
47749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *in_accel_y_offset;
47849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *in_accel_z_offset;
47949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
48049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *in_accel_x_dmp_bias;
48149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *in_accel_y_dmp_bias;
48249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *in_accel_z_dmp_bias;
48349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
48449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *in_gyro_x_offset;
48549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *in_gyro_y_offset;
48649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *in_gyro_z_offset;
4874a28f9c897c46c42a255823f7e307169a828a025Rosa Chow       char *in_gyro_self_test_scale;
48849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
48949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *in_gyro_x_dmp_bias;
49049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *in_gyro_y_dmp_bias;
49149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *in_gyro_z_dmp_bias;
49249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
49349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *event_smd;
49449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *smd_enable;
49549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *smd_delay_threshold;
49649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *smd_delay_threshold2;
49749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *smd_threshold;
49849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *batchmode_timeout;
49949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *batchmode_wake_fifo_full_on;
50049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
50149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *pedometer_on;
50249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *pedometer_int_on;
50349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *event_pedometer;
50449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       char *pedometer_steps;
50549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    } mpu;
50649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
50749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    char *sysfs_names_ptr;
50849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int mMplFeatureActiveMask;
50949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    uint64_t mFeatureActiveMask;
51049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    bool mDmpOn;
51149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int mPedUpdate;
51249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int64_t mQuatSensorTimestamp;
5134a28f9c897c46c42a255823f7e307169a828a025Rosa Chow    int64_t mStepSensorTimestamp;
51449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    uint64_t mLastStepCount;
5154a28f9c897c46c42a255823f7e307169a828a025Rosa Chow    int mLeftOverBufferSize;
5164a28f9c897c46c42a255823f7e307169a828a025Rosa Chow    char mLeftOverBuffer[24];
51749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
51849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowprivate:
51949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    /* added for dynamic get sensor list */
52049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void fillAccel(const char* accel, struct sensor_t *list);
52149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void fillGyro(const char* gyro, struct sensor_t *list);
52249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void fillRV(struct sensor_t *list);
52349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void fillGMRV(struct sensor_t *list);
52449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void fillGRV(struct sensor_t *list);
52549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void fillOrientation(struct sensor_t *list);
52649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void fillGravity(struct sensor_t *list);
52749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void fillLinearAccel(struct sensor_t *list);
52849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void fillSignificantMotion(struct sensor_t *list);
52949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#ifdef ENABLE_DMP_SCREEN_AUTO_ROTATION
53049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void fillScreenOrientation(struct sensor_t *list);
53149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#endif
53249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void storeCalibration();
53349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void loadDMP();
53449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    bool isMpuNonDmp();
53549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int isLowPowerQuatEnabled();
53649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int isDmpDisplayOrientationOn();
53749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void getCompassBias();
53849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void getFactoryGyroBias();
53949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void setFactoryGyroBias();
54049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void getGyroBias();
54149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void setGyroBias();
54249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void getFactoryAccelBias();
54349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void setFactoryAccelBias();
54449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void getAccelBias();
54549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void setAccelBias();
54649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int isCompassDisabled();
5474a28f9c897c46c42a255823f7e307169a828a025Rosa Chow    int setBatchDataRates();
5484a28f9c897c46c42a255823f7e307169a828a025Rosa Chow    int resetDataRates();
5494a28f9c897c46c42a255823f7e307169a828a025Rosa Chow    void initBias();
55049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void sys_dump(bool fileMode);
55149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow};
55249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
55349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowextern "C" {
55449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    void setCallbackObject(MPLSensor*);
55549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    MPLSensor *getCallbackObject();
55649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow}
55749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
55849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#endif  // ANDROID_MPL_SENSOR_H
559