1984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian/* 2984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian * Copyright (C) 2011 The Android Open Source Project 3984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian * 4984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian * Licensed under the Apache License, Version 2.0 (the "License"); 5984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian * you may not use this file except in compliance with the License. 6984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian * You may obtain a copy of the License at 7984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian * 8984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian * http://www.apache.org/licenses/LICENSE-2.0 9984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian * 10984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian * Unless required by applicable law or agreed to in writing, software 11984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian * distributed under the License is distributed on an "AS IS" BASIS, 12984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian * See the License for the specific language governing permissions and 14984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian * limitations under the License. 15984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian */ 16984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian 17984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian#ifndef ANDROID_SENSOR_FUSION_H 18984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian#define ANDROID_SENSOR_FUSION_H 19984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian 20984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian#include <stdint.h> 21984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian#include <sys/types.h> 22984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian 23984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian#include <utils/SortedVector.h> 24984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian#include <utils/Singleton.h> 25984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian#include <utils/String8.h> 26984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian 27984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian#include <gui/Sensor.h> 28984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian 29984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian#include "Fusion.h" 30984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian 31984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian// --------------------------------------------------------------------------- 32984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian 33984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopiannamespace android { 34984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian// --------------------------------------------------------------------------- 35984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian 36984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopianclass SensorDevice; 37984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian 38984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopianclass SensorFusion : public Singleton<SensorFusion> { 39984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian friend class Singleton<SensorFusion>; 40984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian 41984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian SensorDevice& mSensorDevice; 42984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian Sensor mAcc; 43984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian Sensor mMag; 44984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian Sensor mGyro; 45f66684a6fb2a2991e84a085673629db2a0494fc6Peng Xu 46f66684a6fb2a2991e84a085673629db2a0494fc6Peng Xu Fusion mFusions[NUM_FUSION_MODE]; // normal, no_mag, no_gyro 47f66684a6fb2a2991e84a085673629db2a0494fc6Peng Xu 48f66684a6fb2a2991e84a085673629db2a0494fc6Peng Xu bool mEnabled[NUM_FUSION_MODE]; 49f66684a6fb2a2991e84a085673629db2a0494fc6Peng Xu 50f66684a6fb2a2991e84a085673629db2a0494fc6Peng Xu vec4_t &mAttitude; 51f66684a6fb2a2991e84a085673629db2a0494fc6Peng Xu vec4_t mAttitudes[NUM_FUSION_MODE]; 52f66684a6fb2a2991e84a085673629db2a0494fc6Peng Xu 53f66684a6fb2a2991e84a085673629db2a0494fc6Peng Xu SortedVector<void*> mClients[3]; 54f66684a6fb2a2991e84a085673629db2a0494fc6Peng Xu 552e2a560c4b60c24258e0eaadc1189eb9dcc1a0b4Mathias Agopian float mEstimatedGyroRate; 56984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian nsecs_t mTargetDelayNs; 57f66684a6fb2a2991e84a085673629db2a0494fc6Peng Xu 58984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian nsecs_t mGyroTime; 59f66684a6fb2a2991e84a085673629db2a0494fc6Peng Xu nsecs_t mAccTime; 60984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian 61984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian SensorFusion(); 62984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian 63984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopianpublic: 64984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian void process(const sensors_event_t& event); 65984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian 66f66684a6fb2a2991e84a085673629db2a0494fc6Peng Xu bool isEnabled() const { 67f66684a6fb2a2991e84a085673629db2a0494fc6Peng Xu return mEnabled[FUSION_9AXIS] || 68f66684a6fb2a2991e84a085673629db2a0494fc6Peng Xu mEnabled[FUSION_NOMAG] || 69f66684a6fb2a2991e84a085673629db2a0494fc6Peng Xu mEnabled[FUSION_NOGYRO]; 70f66684a6fb2a2991e84a085673629db2a0494fc6Peng Xu } 71f66684a6fb2a2991e84a085673629db2a0494fc6Peng Xu 72f66684a6fb2a2991e84a085673629db2a0494fc6Peng Xu bool hasEstimate(int mode = FUSION_9AXIS) const { 73f66684a6fb2a2991e84a085673629db2a0494fc6Peng Xu return mFusions[mode].hasEstimate(); 74f66684a6fb2a2991e84a085673629db2a0494fc6Peng Xu } 75f66684a6fb2a2991e84a085673629db2a0494fc6Peng Xu 76f66684a6fb2a2991e84a085673629db2a0494fc6Peng Xu mat33_t getRotationMatrix(int mode = FUSION_9AXIS) const { 77f66684a6fb2a2991e84a085673629db2a0494fc6Peng Xu return mFusions[mode].getRotationMatrix(); 78f66684a6fb2a2991e84a085673629db2a0494fc6Peng Xu } 79f66684a6fb2a2991e84a085673629db2a0494fc6Peng Xu 80f66684a6fb2a2991e84a085673629db2a0494fc6Peng Xu vec4_t getAttitude(int mode = FUSION_9AXIS) const { 81f66684a6fb2a2991e84a085673629db2a0494fc6Peng Xu return mAttitudes[mode]; 82f66684a6fb2a2991e84a085673629db2a0494fc6Peng Xu } 83f66684a6fb2a2991e84a085673629db2a0494fc6Peng Xu 84f66684a6fb2a2991e84a085673629db2a0494fc6Peng Xu vec3_t getGyroBias() const { return mFusions[FUSION_9AXIS].getBias(); } 852e2a560c4b60c24258e0eaadc1189eb9dcc1a0b4Mathias Agopian float getEstimatedRate() const { return mEstimatedGyroRate; } 86984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian 87f66684a6fb2a2991e84a085673629db2a0494fc6Peng Xu status_t activate(int mode, void* ident, bool enabled); 88f66684a6fb2a2991e84a085673629db2a0494fc6Peng Xu status_t setDelay(int mode, void* ident, int64_t ns); 89984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian 90f66684a6fb2a2991e84a085673629db2a0494fc6Peng Xu float getPowerUsage(int mode=FUSION_9AXIS) const; 91984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian int32_t getMinDelay() const; 92984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian 93ba02cd2f6cc3f59adf66cb2b9176bfe6c9e382d1Mathias Agopian void dump(String8& result); 94984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian}; 95984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian 96984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian 97984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian// --------------------------------------------------------------------------- 98984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian}; // namespace android 99984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian 100984826cc158193e61e3a00359ef4f6699c7d748aMathias Agopian#endif // ANDROID_SENSOR_FUSION_H 101