142 lines
4.5 KiB
C++
142 lines
4.5 KiB
C++
/*
|
|
* Copyright (C) 2011 Invensense, Inc.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
/*************Removed the gesture related info for Google check in : Meenakshi Ramamoorthi: May 31st *********/
|
|
|
|
#ifndef ANDROID_MPL_SENSOR_H
|
|
#define ANDROID_MPL_SENSOR_H
|
|
|
|
#include <stdint.h>
|
|
#include <errno.h>
|
|
#include <sys/cdefs.h>
|
|
#include <sys/types.h>
|
|
#include <poll.h>
|
|
#include <utils/Vector.h>
|
|
#include <utils/KeyedVector.h>
|
|
#include "sensors.h"
|
|
#include "SensorBase.h"
|
|
|
|
/*****************************************************************************/
|
|
/** MPLSensor implementation which fits into the HAL example for crespo provided
|
|
* * by Google.
|
|
* * WARNING: there may only be one instance of MPLSensor, ever.
|
|
*/
|
|
|
|
class MPLSensor: public SensorBase
|
|
{
|
|
typedef void (MPLSensor::*hfunc_t)(sensors_event_t*, uint32_t*, int);
|
|
|
|
public:
|
|
MPLSensor();
|
|
virtual ~MPLSensor();
|
|
|
|
enum
|
|
{
|
|
Gyro=0,
|
|
Accelerometer,
|
|
MagneticField,
|
|
Orientation,
|
|
RotationVector,
|
|
LinearAccel,
|
|
Gravity,
|
|
numSensors
|
|
};
|
|
|
|
virtual int setDelay(int32_t handle, int64_t ns);
|
|
virtual int enable(int32_t handle, int enabled);
|
|
virtual int readEvents(sensors_event_t *data, int count);
|
|
virtual int getFd() const;
|
|
virtual int getAccelFd() const;
|
|
virtual int getTimerFd() const;
|
|
virtual int getPowerFd() const;
|
|
virtual int getPollTime();
|
|
virtual bool hasPendingEvents() const;
|
|
virtual void handlePowerEvent();
|
|
virtual void sleepEvent();
|
|
virtual void wakeEvent();
|
|
int populateSensorList(struct sensor_t *list, size_t len);
|
|
void cbOnMotion(uint16_t);
|
|
void cbProcData();
|
|
|
|
protected:
|
|
|
|
void clearIrqData(bool* irq_set);
|
|
void setPowerStates(int enabledsensor);
|
|
void initMPL();
|
|
void setupFIFO();
|
|
void setupCallbacks();
|
|
void gyroHandler(sensors_event_t *data, uint32_t *pendmask, int index);
|
|
void accelHandler(sensors_event_t *data, uint32_t *pendmask, int index);
|
|
void compassHandler(sensors_event_t *data, uint32_t *pendmask, int index);
|
|
void rvHandler(sensors_event_t *data, uint32_t *pendmask, int index);
|
|
void laHandler(sensors_event_t *data, uint32_t *pendmask, int index);
|
|
void gravHandler(sensors_event_t *data, uint32_t *pendmask, int index);
|
|
void orienHandler(sensors_event_t *data, uint32_t *pendmask, int index);
|
|
void calcOrientationSensor(float *Rx, float *Val);
|
|
int estimateCompassAccuracy();
|
|
|
|
int mNewData; //flag indicating that the MPL calculated new output values
|
|
int mDmpStarted;
|
|
long mMasterSensorMask;
|
|
long mLocalSensorMask;
|
|
int mPollTime;
|
|
int mCurFifoRate; //current fifo rate
|
|
bool mHaveGoodMpuCal; //flag indicating that the cal file can be written
|
|
bool mHaveGoodCompassCal;
|
|
bool mUseTimerIrqAccel;
|
|
bool mUsetimerIrqCompass;
|
|
bool mUseTimerirq;
|
|
struct pollfd mPollFds[4];
|
|
int mSampleCount;
|
|
pthread_mutex_t mMplMutex;
|
|
int64_t now_ns();
|
|
int64_t select_ns(unsigned long long time_set[]);
|
|
|
|
enum FILEHANDLES
|
|
{
|
|
MPUIRQ_FD, ACCELIRQ_FD, COMPASSIRQ_FD, TIMERIRQ_FD,
|
|
};
|
|
|
|
private:
|
|
|
|
int update_delay();
|
|
int accel_fd;
|
|
int timer_fd;
|
|
|
|
uint32_t mEnabled;
|
|
uint32_t mPendingMask;
|
|
sensors_event_t mPendingEvents[numSensors];
|
|
uint64_t mDelays[numSensors];
|
|
hfunc_t mHandlers[numSensors];
|
|
bool mForceSleep;
|
|
long int mOldEnabledMask;
|
|
android::KeyedVector<int, int> mIrqFds;
|
|
|
|
/* added for dynamic get sensor list */
|
|
bool mNineAxisEnabled;
|
|
void fillAccel(unsigned char accel, struct sensor_t *list);
|
|
void fillCompass(unsigned char compass, struct sensor_t *list);
|
|
void fillGyro(const char* gyro, struct sensor_t *list);
|
|
void fillRV(struct sensor_t *list);
|
|
void fillOrientation(struct sensor_t *list);
|
|
void fillGravity(struct sensor_t *list);
|
|
void fillLinearAccel(struct sensor_t *list);
|
|
};
|
|
|
|
void setCallbackObject(MPLSensor*);
|
|
|
|
/*****************************************************************************/
|
|
|
|
#endif // ANDROID_MPL_SENSOR_H
|