/*
* 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, int 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 mMpuAccuracy; //global storage for the current accuracy status
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