Home | History | Annotate | Download | only in libsensors
      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