improve orientation sensor with gyro data

when we do our own sensor fusion, we also export an
improved orientation sensor and hide the HAL sensor.
The fused orientation sensor is much more precise, fast
and smooth.

Change-Id: I0ea843b47ad9d12f6b22cce51f8629852d423126
This commit is contained in:
Mathias Agopian 2011-06-08 20:06:50 -07:00
parent 3301542828
commit 010e422301
2 changed files with 20 additions and 4 deletions

View File

@ -52,7 +52,6 @@ namespace android {
* Notes: * Notes:
* *
* - what about a gyro-corrected magnetic-field sensor? * - what about a gyro-corrected magnetic-field sensor?
* - option to "hide" the HAL sensors
* - run mag sensor from time to time to force calibration * - run mag sensor from time to time to force calibration
* - gravity sensor length is wrong (=> drift in linear-acc sensor) * - gravity sensor length is wrong (=> drift in linear-acc sensor)
* *
@ -71,6 +70,7 @@ void SensorService::onFirstRef()
SensorDevice& dev(SensorDevice::getInstance()); SensorDevice& dev(SensorDevice::getInstance());
if (dev.initCheck() == NO_ERROR) { if (dev.initCheck() == NO_ERROR) {
ssize_t orientationIndex = -1;
bool hasGyro = false; bool hasGyro = false;
uint32_t virtualSensorsNeeds = uint32_t virtualSensorsNeeds =
(1<<SENSOR_TYPE_GRAVITY) | (1<<SENSOR_TYPE_GRAVITY) |
@ -82,6 +82,9 @@ void SensorService::onFirstRef()
for (int i=0 ; i<count ; i++) { for (int i=0 ; i<count ; i++) {
registerSensor( new HardwareSensor(list[i]) ); registerSensor( new HardwareSensor(list[i]) );
switch (list[i].type) { switch (list[i].type) {
case SENSOR_TYPE_ORIENTATION:
orientationIndex = i;
break;
case SENSOR_TYPE_GYROSCOPE: case SENSOR_TYPE_GYROSCOPE:
hasGyro = true; hasGyro = true;
break; break;
@ -120,6 +123,18 @@ void SensorService::onFirstRef()
} }
} }
// build the sensor list returned to users
mUserSensorList = mSensorList;
if (hasGyro &&
(virtualSensorsNeeds & (1<<SENSOR_TYPE_ROTATION_VECTOR))) {
// if we have the fancy sensor fusion, and it's not provided by the
// HAL, use our own (fused) orientation sensor by removing the
// HAL supplied one form the user list.
if (orientationIndex >= 0) {
mUserSensorList.removeItemsAt(orientationIndex);
}
}
run("SensorService", PRIORITY_URGENT_DISPLAY); run("SensorService", PRIORITY_URGENT_DISPLAY);
mInitCheck = NO_ERROR; mInitCheck = NO_ERROR;
} }
@ -315,9 +330,9 @@ SensorService::getActiveVirtualSensors() const
} }
String8 SensorService::getSensorName(int handle) const { String8 SensorService::getSensorName(int handle) const {
size_t count = mSensorList.size(); size_t count = mUserSensorList.size();
for (size_t i=0 ; i<count ; i++) { for (size_t i=0 ; i<count ; i++) {
const Sensor& sensor(mSensorList[i]); const Sensor& sensor(mUserSensorList[i]);
if (sensor.getHandle() == handle) { if (sensor.getHandle() == handle) {
return sensor.getName(); return sensor.getName();
} }
@ -328,7 +343,7 @@ String8 SensorService::getSensorName(int handle) const {
Vector<Sensor> SensorService::getSensorList() Vector<Sensor> SensorService::getSensorList()
{ {
return mSensorList; return mUserSensorList;
} }
sp<ISensorEventConnection> SensorService::createSensorEventConnection() sp<ISensorEventConnection> SensorService::createSensorEventConnection()

View File

@ -114,6 +114,7 @@ class SensorService :
// constants // constants
Vector<Sensor> mSensorList; Vector<Sensor> mSensorList;
Vector<Sensor> mUserSensorList;
DefaultKeyedVector<int, SensorInterface*> mSensorMap; DefaultKeyedVector<int, SensorInterface*> mSensorMap;
Vector<SensorInterface *> mVirtualSensorList; Vector<SensorInterface *> mVirtualSensorList;
Permission mDump; Permission mDump;