1895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/*
2895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * Copyright (C) 2011 Invensense, Inc.
3895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
4895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * Licensed under the Apache License, Version 2.0 (the "License");
5895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * you may not use this file except in compliance with the License.
6895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * You may obtain a copy of the License at
7895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
8895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *      http://www.apache.org/licenses/LICENSE-2.0
9895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
10895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * Unless required by applicable law or agreed to in writing, software
11895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * distributed under the License is distributed on an "AS IS" BASIS,
12895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * See the License for the specific language governing permissions and
14895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * limitations under the License.
15895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
16895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/*************Removed the gesture related info for Google check in : Meenakshi Ramamoorthi: May 31st *********/
17895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
18895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#ifndef ANDROID_MPL_SENSOR_H
19895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#define ANDROID_MPL_SENSOR_H
20895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
21895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#include <stdint.h>
22895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#include <errno.h>
23895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#include <sys/cdefs.h>
24895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#include <sys/types.h>
25895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#include <poll.h>
26895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#include <utils/Vector.h>
27895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#include <utils/KeyedVector.h>
28895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#include "sensors.h"
29895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#include "SensorBase.h"
30895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
31895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/*****************************************************************************/
32895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/** MPLSensor implementation which fits into the HAL example for crespo provided
33895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * * by Google.
34895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * * WARNING: there may only be one instance of MPLSensor, ever.
35895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
36895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
37895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallclass MPLSensor: public SensorBase
38895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
39895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    typedef void (MPLSensor::*hfunc_t)(sensors_event_t*, uint32_t*, int);
40895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
41895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallpublic:
42895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    MPLSensor();
43895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    virtual ~MPLSensor();
44895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
45895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    enum
46895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    {
47895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        Gyro=0,
48895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        Accelerometer,
49895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        MagneticField,
50895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        Orientation,
51895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        RotationVector,
52895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        LinearAccel,
53895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        Gravity,
54895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        numSensors
55895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    };
56895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
57895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    virtual int setDelay(int32_t handle, int64_t ns);
58895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    virtual int enable(int32_t handle, int enabled);
59895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    virtual int readEvents(sensors_event_t *data, int count);
60895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    virtual int getFd() const;
61895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    virtual int getAccelFd() const;
62895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    virtual int getTimerFd() const;
63895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    virtual int getPowerFd() const;
64895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    virtual int getPollTime();
65895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    virtual bool hasPendingEvents() const;
66895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    virtual void handlePowerEvent();
67895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    virtual void sleepEvent();
68895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    virtual void wakeEvent();
69895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    int populateSensorList(struct sensor_t *list, int len);
70895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    void cbOnMotion(uint16_t);
71895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    void cbProcData();
72895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
73895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallprotected:
74895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
75895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    void clearIrqData(bool* irq_set);
76895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    void setPowerStates(int enabledsensor);
77895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    void initMPL();
78895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    void setupFIFO();
79895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    void setupCallbacks();
80895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    void gyroHandler(sensors_event_t *data, uint32_t *pendmask, int index);
81895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    void accelHandler(sensors_event_t *data, uint32_t *pendmask, int index);
82895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    void compassHandler(sensors_event_t *data, uint32_t *pendmask, int index);
83895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    void rvHandler(sensors_event_t *data, uint32_t *pendmask, int index);
84895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    void laHandler(sensors_event_t *data, uint32_t *pendmask, int index);
85895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    void gravHandler(sensors_event_t *data, uint32_t *pendmask, int index);
86895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    void orienHandler(sensors_event_t *data, uint32_t *pendmask, int index);
87895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    void calcOrientationSensor(float *Rx, float *Val);
88895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    int estimateCompassAccuracy();
89895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
90895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    int mNewData; //flag indicating that the MPL calculated new output values
91895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    int mDmpStarted;
92895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    long mMasterSensorMask;
93895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    long mLocalSensorMask;
94895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    int mPollTime;
95895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    int mCurFifoRate; //current fifo rate
96895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    bool mHaveGoodMpuCal; //flag indicating that the cal file can be written
97895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    bool mHaveGoodCompassCal;
98895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    bool mUseTimerIrqAccel;
99895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    bool mUsetimerIrqCompass;
100895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    bool mUseTimerirq;
101895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    struct pollfd mPollFds[4];
102895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    int mSampleCount;
103895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    pthread_mutex_t mMplMutex;
104895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    int64_t now_ns();
105895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    int64_t select_ns(unsigned long long time_set[]);
106895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
107895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    enum FILEHANDLES
108895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    {
109895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        MPUIRQ_FD, ACCELIRQ_FD, COMPASSIRQ_FD, TIMERIRQ_FD,
110895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    };
111895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
112895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallprivate:
113895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
114895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    int update_delay();
115895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    int accel_fd;
116895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    int timer_fd;
117895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
118895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    uint32_t mEnabled;
119895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    uint32_t mPendingMask;
120895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    sensors_event_t mPendingEvents[numSensors];
121895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    uint64_t mDelays[numSensors];
122895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    hfunc_t mHandlers[numSensors];
123895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    bool mForceSleep;
124895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    long int mOldEnabledMask;
125895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    android::KeyedVector<int, int> mIrqFds;
126895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
127895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    /* added for dynamic get sensor list              */
128895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    bool mNineAxisEnabled;
129895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    void fillAccel(unsigned char accel, struct sensor_t *list);
130895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    void fillCompass(unsigned char compass, struct sensor_t *list);
131895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    void fillGyro(const char* gyro, struct sensor_t *list);
132895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    void fillRV(struct sensor_t *list);
133895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    void fillOrientation(struct sensor_t *list);
134895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    void fillGravity(struct sensor_t *list);
135895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    void fillLinearAccel(struct sensor_t *list);
136895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall};
137895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
138895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallvoid setCallbackObject(MPLSensor*);
139895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
140895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/*****************************************************************************/
141895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
142895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#endif  // ANDROID_MPL_SENSOR_H
143