• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2011 Invensense, Inc.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 /*************Removed the gesture related info for Google check in : Meenakshi Ramamoorthi: May 31st *********/
17 
18 #ifndef ANDROID_MPL_SENSOR_H
19 #define ANDROID_MPL_SENSOR_H
20 
21 #include <stdint.h>
22 #include <errno.h>
23 #include <sys/cdefs.h>
24 #include <sys/types.h>
25 #include <poll.h>
26 #include <utils/Vector.h>
27 #include <utils/KeyedVector.h>
28 #include "sensors.h"
29 #include "SensorBase.h"
30 
31 /*****************************************************************************/
32 /** MPLSensor implementation which fits into the HAL example for crespo provided
33  * * by Google.
34  * * WARNING: there may only be one instance of MPLSensor, ever.
35  */
36 
37 class MPLSensor: public SensorBase
38 {
39     typedef void (MPLSensor::*hfunc_t)(sensors_event_t*, uint32_t*, int);
40 
41 public:
42     MPLSensor();
43     virtual ~MPLSensor();
44 
45     enum
46     {
47         Gyro=0,
48         Accelerometer,
49         MagneticField,
50         Orientation,
51         RotationVector,
52         LinearAccel,
53         Gravity,
54         numSensors
55     };
56 
57     virtual int setDelay(int32_t handle, int64_t ns);
58     virtual int enable(int32_t handle, int enabled);
59     virtual int readEvents(sensors_event_t *data, int count);
60     virtual int getFd() const;
61     virtual int getAccelFd() const;
62     virtual int getTimerFd() const;
63     virtual int getPowerFd() const;
64     virtual int getPollTime();
65     virtual bool hasPendingEvents() const;
66     virtual void handlePowerEvent();
67     virtual void sleepEvent();
68     virtual void wakeEvent();
69     int populateSensorList(struct sensor_t *list, int len);
70     void cbOnMotion(uint16_t);
71     void cbProcData();
72 
73 protected:
74 
75     void clearIrqData(bool* irq_set);
76     void setPowerStates(int enabledsensor);
77     void initMPL();
78     void setupFIFO();
79     void setupCallbacks();
80     void gyroHandler(sensors_event_t *data, uint32_t *pendmask, int index);
81     void accelHandler(sensors_event_t *data, uint32_t *pendmask, int index);
82     void compassHandler(sensors_event_t *data, uint32_t *pendmask, int index);
83     void rvHandler(sensors_event_t *data, uint32_t *pendmask, int index);
84     void laHandler(sensors_event_t *data, uint32_t *pendmask, int index);
85     void gravHandler(sensors_event_t *data, uint32_t *pendmask, int index);
86     void orienHandler(sensors_event_t *data, uint32_t *pendmask, int index);
87     void calcOrientationSensor(float *Rx, float *Val);
88     int estimateCompassAccuracy();
89 
90     int mNewData; //flag indicating that the MPL calculated new output values
91     int mDmpStarted;
92     long mMasterSensorMask;
93     long mLocalSensorMask;
94     int mPollTime;
95     int mCurFifoRate; //current fifo rate
96     bool mHaveGoodMpuCal; //flag indicating that the cal file can be written
97     bool mHaveGoodCompassCal;
98     bool mUseTimerIrqAccel;
99     bool mUsetimerIrqCompass;
100     bool mUseTimerirq;
101     struct pollfd mPollFds[4];
102     int mSampleCount;
103     pthread_mutex_t mMplMutex;
104     int64_t now_ns();
105     int64_t select_ns(unsigned long long time_set[]);
106 
107     enum FILEHANDLES
108     {
109         MPUIRQ_FD, ACCELIRQ_FD, COMPASSIRQ_FD, TIMERIRQ_FD,
110     };
111 
112 private:
113 
114     int update_delay();
115     int accel_fd;
116     int timer_fd;
117 
118     uint32_t mEnabled;
119     uint32_t mPendingMask;
120     sensors_event_t mPendingEvents[numSensors];
121     uint64_t mDelays[numSensors];
122     hfunc_t mHandlers[numSensors];
123     bool mForceSleep;
124     long int mOldEnabledMask;
125     android::KeyedVector<int, int> mIrqFds;
126 
127     /* added for dynamic get sensor list              */
128     bool mNineAxisEnabled;
129     void fillAccel(unsigned char accel, struct sensor_t *list);
130     void fillCompass(unsigned char compass, struct sensor_t *list);
131     void fillGyro(const char* gyro, struct sensor_t *list);
132     void fillRV(struct sensor_t *list);
133     void fillOrientation(struct sensor_t *list);
134     void fillGravity(struct sensor_t *list);
135     void fillLinearAccel(struct sensor_t *list);
136 };
137 
138 void setCallbackObject(MPLSensor*);
139 
140 /*****************************************************************************/
141 
142 #endif  // ANDROID_MPL_SENSOR_H
143