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