164ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran/*
264ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran* Copyright (C) 2012 Invensense, Inc.
364ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran*
464ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran* Licensed under the Apache License, Version 2.0 (the "License");
564ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran* you may not use this file except in compliance with the License.
664ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran* You may obtain a copy of the License at
764ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran*
864ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran*      http://www.apache.org/licenses/LICENSE-2.0
964ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran*
1064ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran* Unless required by applicable law or agreed to in writing, software
1164ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran* distributed under the License is distributed on an "AS IS" BASIS,
1264ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1364ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran* See the License for the specific language governing permissions and
1464ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran* limitations under the License.
1564ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran*/
1664ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran
1764ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran#ifndef ANDROID_MPL_SENSOR_H
1864ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran#define ANDROID_MPL_SENSOR_H
1964ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran
2064ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran#include <stdint.h>
2164ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran#include <errno.h>
2264ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran#include <sys/cdefs.h>
2364ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran#include <sys/types.h>
2464ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran#include <poll.h>
2564ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran#include <utils/Vector.h>
2664ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran#include <utils/KeyedVector.h>
2764ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran#include "sensors.h"
2864ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran#include "SensorBase.h"
2964ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran#include "InputEventReader.h"
3064ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran
3164ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran#ifdef INVENSENSE_COMPASS_CAL
3264ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran
338504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrall#ifdef COMPASS_YAS53x
348504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrall#warning "unified HAL for YAS53x"
3533ce91b37062fa63af192f5643de93f3beebe854JP Abgrall#include "CompassSensor.IIO.primary.h"
3633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall#elif COMPASS_AMI306
3764ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran#warning "unified HAL for AMI306"
3833ce91b37062fa63af192f5643de93f3beebe854JP Abgrall#include "CompassSensor.IIO.primary.h"
3964ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran#else
4064ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran#warning "unified HAL for MPU9150"
4164ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran#include "CompassSensor.IIO.9150.h"
4264ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran#endif
4364ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran#else
4464ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran#warning "unified HAL for AKM"
4564ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran#include "CompassSensor.AKM.h"
4664ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran#endif
4764ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran
4864ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran/*****************************************************************************/
4964ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran/* Sensors Enable/Disable Mask
5064ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran *****************************************************************************/
5164ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran#define MAX_CHIP_ID_LEN             (20)
5264ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran
5364ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran#define INV_THREE_AXIS_GYRO         (0x000F)
5464ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran#define INV_THREE_AXIS_ACCEL        (0x0070)
5564ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran#define INV_THREE_AXIS_COMPASS      (0x0380)
5664ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran#define INV_ALL_SENSORS             (0x7FFF)
5764ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran
5864ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran#ifdef INVENSENSE_COMPASS_CAL
5964ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran#define ALL_MPL_SENSORS_NP          (INV_THREE_AXIS_ACCEL \
6064ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran                                      | INV_THREE_AXIS_COMPASS \
6164ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran                                      | INV_THREE_AXIS_GYRO)
6264ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran#else
6364ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran#define ALL_MPL_SENSORS_NP          (INV_THREE_AXIS_ACCEL \
6464ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran                                      | INV_THREE_AXIS_COMPASS \
6564ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran                                      | INV_THREE_AXIS_GYRO)
6664ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran#endif
6764ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran
6864ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran// bit mask of current active features (mFeatureActiveMask)
6964ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran#define INV_COMPASS_CAL              0x01
7064ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran#define INV_COMPASS_FIT              0x02
7164ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran#define INV_DMP_QUATERNION           0x04
7233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall#define INV_DMP_DISPL_ORIENTATION    0x08
7333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall
748504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrall/* Uncomment to enable Low Power Quaternion */
758504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrall#define ENABLE_LP_QUAT_FEAT
7633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall
778504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrall/* Uncomment to enable DMP display orientation
788504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrall   (within the HAL, see below for Java framework) */
798504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrall// #define ENABLE_DMP_DISPL_ORIENT_FEAT
8033ce91b37062fa63af192f5643de93f3beebe854JP Abgrall
8133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall#ifdef ENABLE_DMP_DISPL_ORIENT_FEAT
828504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrall/* Uncomment following to expose the SENSOR_TYPE_SCREEN_ORIENTATION
838504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrall   sensor type (DMP screen orientation) to the Java framework.
848504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrall   NOTE:
858504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrall       need Invensense customized
868504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrall       'hardware/libhardware/include/hardware/sensors.h' to compile correctly.
878504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrall   NOTE:
888504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrall       need Invensense java framework changes to:
898504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrall       'frameworks/base/core/java/android/view/WindowOrientationListener.java'
908504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrall       'frameworks/base/core/java/android/hardware/Sensor.java'
918504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrall       'frameworks/base/core/java/android/hardware/SensorEvent.java'
928504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrall       for the 'Auto-rotate screen' to use this feature.
938504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrall*/
948504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrall#define ENABLE_DMP_SCREEN_AUTO_ROTATION
958504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrall#warning "ENABLE_DMP_DISPL_ORIENT_FEAT is defined, framework changes are necessary for HAL to work properly"
9633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall#endif
9733ce91b37062fa63af192f5643de93f3beebe854JP Abgrall
988504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrallint isDmpScreenAutoRotationEnabled()
998504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrall{
10033ce91b37062fa63af192f5643de93f3beebe854JP Abgrall#ifdef ENABLE_DMP_SCREEN_AUTO_ROTATION
10133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall    return 1;
10233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall#else
10333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall    return 0;
10433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall#endif
10533ce91b37062fa63af192f5643de93f3beebe854JP Abgrall}
10664ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran
1078504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrallint (*m_pt2AccelCalLoadFunc)(long *bias) = NULL;
10864ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran/*****************************************************************************/
10964ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran/** MPLSensor implementation which fits into the HAL example for crespo provided
11064ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran *  by Google.
11164ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran *  WARNING: there may only be one instance of MPLSensor, ever.
11264ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran */
1138504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrall
11464ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaranclass MPLSensor: public SensorBase
11564ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran{
11664ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    typedef int (MPLSensor::*hfunc_t)(sensors_event_t*);
11764ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran
11864ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaranpublic:
1198504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrall
12033ce91b37062fa63af192f5643de93f3beebe854JP Abgrall    enum {
12164ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran        Gyro = 0,
12233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall        RawGyro,
12364ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran        Accelerometer,
12464ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran        MagneticField,
12564ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran        Orientation,
12664ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran        RotationVector,
12764ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran        LinearAccel,
12864ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran        Gravity,
12964ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran        numSensors
13064ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    };
13164ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran
1328504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrall    MPLSensor(CompassSensor *, int (*m_pt2AccelCalLoadFunc)(long*) = 0);
13333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall    virtual ~MPLSensor();
13433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall
13564ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    virtual int setDelay(int32_t handle, int64_t ns);
13664ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    virtual int enable(int32_t handle, int enabled);
13764ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    int32_t getEnableMask() { return mEnabled; }
13864ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran
13964ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    virtual int readEvents(sensors_event_t *data, int count);
14064ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    virtual int getFd() const;
14164ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    virtual int getAccelFd() const;
14264ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    virtual int getCompassFd() const;
14364ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    virtual int getPollTime();
14464ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    virtual bool hasPendingEvents() const;
14564ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    virtual void sleepEvent();
14664ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    virtual void wakeEvent();
14764ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    int populateSensorList(struct sensor_t *list, int len);
14864ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    void cbProcData();
14964ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran
15064ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    //static pointer to the object that will handle callbacks
15164ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    static MPLSensor* gMPLSensor;
15264ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran
15364ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    //AKM HAL Integration
15464ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    //void set_compass(long ready, long x, long y, long z, long accuracy);
15564ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    int executeOnData(sensors_event_t* data, int count);
15664ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    int readAccelEvents(sensors_event_t* data, int count);
15764ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    int readCompassEvents(sensors_event_t* data, int count);
15864ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran
15933ce91b37062fa63af192f5643de93f3beebe854JP Abgrall    int turnOffAccelFifo();
16033ce91b37062fa63af192f5643de93f3beebe854JP Abgrall    int enableDmpOrientation(int);
16133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall    int dmpOrientHandler(int);
16233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall    int readDmpOrientEvents(sensors_event_t* data, int count);
16333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall    int getDmpOrientFd();
16433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall    int openDmpOrientFd();
16533ce91b37062fa63af192f5643de93f3beebe854JP Abgrall    int closeDmpOrientFd();
16633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall
16733ce91b37062fa63af192f5643de93f3beebe854JP Abgrall    int getDmpRate(int64_t *);
16833ce91b37062fa63af192f5643de93f3beebe854JP Abgrall    int checkDMPOrientation();
16933ce91b37062fa63af192f5643de93f3beebe854JP Abgrall
17064ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaranprotected:
17164ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    CompassSensor *mCompassSensor;
17264ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran
17364ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    int gyroHandler(sensors_event_t *data);
17433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall    int rawGyroHandler(sensors_event_t *data);
17564ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    int accelHandler(sensors_event_t *data);
17664ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    int compassHandler(sensors_event_t *data);
17764ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    int rvHandler(sensors_event_t *data);
17864ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    int laHandler(sensors_event_t *data);
17964ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    int gravHandler(sensors_event_t *data);
18064ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    int orienHandler(sensors_event_t *data);
18164ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    void calcOrientationSensor(float *Rx, float *Val);
18264ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    virtual int update_delay();
18364ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran
18464ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    void inv_set_device_properties();
18564ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    int inv_constructor_init();
18664ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    int inv_constructor_default_enable();
18764ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    int setGyroInitialState();
18864ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    int setAccelInitialState();
18964ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    int masterEnable(int en);
19064ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    int onPower(int en);
19164ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    int enableLPQuaternion(int);
19264ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    int enableQuaternionData(int);
19364ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    int onDMP(int);
1948504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrall    int enableOneSensor(int en, const char *name, int (MPLSensor::*enabler)(int));
19564ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    int enableGyro(int en);
19664ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    int enableAccel(int en);
19764ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    int enableCompass(int en);
19864ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    void computeLocalSensorMask(int enabled_sensors);
19964ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    int enableSensors(unsigned long sensors, int en, uint32_t changed);
20064ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    int inv_read_gyro_buffer(int fd, short *data, long long *timestamp);
20164ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    int inv_float_to_q16(float *fdata, long *ldata);
20264ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    int inv_long_to_q16(long *fdata, long *ldata);
20364ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    int inv_float_to_round(float *fdata, long *ldata);
20464ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    int inv_float_to_round2(float *fdata, short *sdata);
20564ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    int inv_read_temperature(long long *data);
20664ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    int inv_read_dmp_state(int fd);
20764ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    int inv_read_sensor_bias(int fd, long *data);
20864ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    void inv_get_sensors_orientation(void);
20964ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    int inv_init_sysfs_attributes(void);
2108504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrall#ifdef COMPASS_YAS53x
21133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall    int resetCompass(void);
21233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall#endif
21364ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    void setCompassDelay(int64_t ns);
21464ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    void enable_iio_sysfs(void);
21564ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    int enableTap(int);
21664ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    int enableFlick(int);
21764ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    int enablePedometer(int);
21864ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    int checkLPQuaternion();
21964ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran
22064ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    int mNewData;   // flag indicating that the MPL calculated new output values
22164ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    int mDmpStarted;
22264ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    long mMasterSensorMask;
22364ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    long mLocalSensorMask;
22464ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    int mPollTime;
22564ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    bool mHaveGoodMpuCal;   // flag indicating that the cal file can be written
22664ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    int mGyroAccuracy;      // value indicating the quality of the gyro calibr.
22764ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    int mAccelAccuracy;     // value indicating the quality of the accel calibr.
2288504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrall    int mCompassAccuracy;     // value indicating the quality of the compass calibr.
22964ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    struct pollfd mPollFds[5];
23064ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    int mSampleCount;
23164ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    pthread_mutex_t mMplMutex;
23264ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    pthread_mutex_t mHALMutex;
23364ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran
23464ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    char mIIOBuffer[(16 + 8 * 3 + 8) * IIO_BUFFER_LENGTH];
23564ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran
23664ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    int iio_fd;
23764ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    int accel_fd;
23864ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    int mpufifo_fd;
23964ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    int gyro_temperature_fd;
24033ce91b37062fa63af192f5643de93f3beebe854JP Abgrall    int dmp_orient_fd;
24133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall
24233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall    int mDmpOrientationEnabled;
24364ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran
2448504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrall
24564ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    uint32_t mEnabled;
24664ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    uint32_t mOldEnabledMask;
24764ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    sensors_event_t mPendingEvents[numSensors];
24833ce91b37062fa63af192f5643de93f3beebe854JP Abgrall    int64_t mDelays[numSensors];
24964ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    hfunc_t mHandlers[numSensors];
25064ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    short mCachedGyroData[3];
25164ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    long mCachedAccelData[3];
25264ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    long mCachedCompassData[3];
25364ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    long mCachedQuaternionData[4];
25464ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    android::KeyedVector<int, int> mIrqFds;
25564ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran
25664ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    InputEventCircularReader mAccelInputReader;
25764ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    InputEventCircularReader mGyroInputReader;
25864ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran
25964ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    bool mFirstRead;
26064ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    short mTempScale;
26164ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    short mTempOffset;
26264ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    int64_t mTempCurrentTime;
26364ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    int mAccelScale;
26464ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran
26564ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    uint32_t mPendingMask;
26664ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    unsigned long mSensorMask;
26764ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran
26864ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    char chip_ID[MAX_CHIP_ID_LEN];
26964ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran
27064ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    signed char mGyroOrientation[9];
27164ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    signed char mAccelOrientation[9];
27264ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran
27364ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    int64_t mSensorTimestamp;
27464ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    int64_t mCompassTimestamp;
27564ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran
27664ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    struct sysfs_attrbs {
27764ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran       char *chip_enable;
27864ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran       char *power_state;
27964ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran       char *dmp_firmware;
28064ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran       char *firmware_loaded;
28164ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran       char *dmp_on;
28264ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran       char *dmp_int_on;
28333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall       char *dmp_event_int_on;
28433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall       char *dmp_output_rate;
28564ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran       char *tap_on;
28664ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran       char *key;
28764ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran       char *self_test;
28864ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran       char *temperature;
28964ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran
29064ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran       char *gyro_enable;
29164ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran       char *gyro_fifo_rate;
29264ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran       char *gyro_orient;
29364ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran       char *gyro_x_fifo_enable;
29464ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran       char *gyro_y_fifo_enable;
29564ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran       char *gyro_z_fifo_enable;
29664ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran
29764ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran       char *accel_enable;
29864ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran       char *accel_fifo_rate;
29964ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran       char *accel_fsr;
30064ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran       char *accel_bias;
30164ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran       char *accel_orient;
30264ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran       char *accel_x_fifo_enable;
30364ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran       char *accel_y_fifo_enable;
30464ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran       char *accel_z_fifo_enable;
30564ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran
30664ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran       char *quaternion_on;
30764ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran       char *in_quat_r_en;
30864ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran       char *in_quat_x_en;
30964ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran       char *in_quat_y_en;
31064ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran       char *in_quat_z_en;
31164ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran
31264ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran       char *in_timestamp_en;
31364ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran       char *trigger_name;
31464ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran       char *current_trigger;
31564ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran       char *buffer_length;
31633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall
31733ce91b37062fa63af192f5643de93f3beebe854JP Abgrall       char *display_orientation_on;
31833ce91b37062fa63af192f5643de93f3beebe854JP Abgrall       char *event_display_orientation;
31964ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    } mpu;
32064ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran
32164ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    char *sysfs_names_ptr;
32264ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    int mFeatureActiveMask;
32364ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran
32464ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaranprivate:
32564ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    /* added for dynamic get sensor list */
32664ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    void fillAccel(const char* accel, struct sensor_t *list);
32764ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    void fillGyro(const char* gyro, struct sensor_t *list);
32864ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    void fillRV(struct sensor_t *list);
32964ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    void fillOrientation(struct sensor_t *list);
33064ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    void fillGravity(struct sensor_t *list);
33164ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    void fillLinearAccel(struct sensor_t *list);
33264ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    void storeCalibration();
33364ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    void loadDMP();
3348504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrall    bool isMpu3050();
3358504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrall    int isLowPowerQuatEnabled();
3368504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrall    int isDmpDisplayOrientationOn();
3378504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrall
3388504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrall
33964ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran};
34064ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran
34164ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaranextern "C" {
34264ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    void setCallbackObject(MPLSensor*);
34364ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran    MPLSensor *getCallbackObject();
34464ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran}
34564ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran
34664ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran#endif  // ANDROID_MPL_SENSOR_H
347