diff options
author | Mathias Agopian <mathias@google.com> | 2011-07-14 16:39:46 -0700 |
---|---|---|
committer | Mathias Agopian <mathias@google.com> | 2011-07-14 16:39:46 -0700 |
commit | 29c176f043333c2d286bbe7d5e6a82d2af97b535 (patch) | |
tree | 3413ad371e87d47bb6809d2bb8a5e688b372eda1 /services/sensorservice | |
parent | f382dc2d97e22f6bcce7aa8250d797edc616719e (diff) | |
download | frameworks_base-29c176f043333c2d286bbe7d5e6a82d2af97b535.zip frameworks_base-29c176f043333c2d286bbe7d5e6a82d2af97b535.tar.gz frameworks_base-29c176f043333c2d286bbe7d5e6a82d2af97b535.tar.bz2 |
sensorservice: be more robust when there are no sensor h/w
Bug: 5030108
Change-Id: I45b85b3c492b9268cb0ae44d2e5fc8c708b6e66e
Diffstat (limited to 'services/sensorservice')
-rw-r--r-- | services/sensorservice/SensorFusion.cpp | 32 | ||||
-rw-r--r-- | services/sensorservice/SensorService.cpp | 123 |
2 files changed, 80 insertions, 75 deletions
diff --git a/services/sensorservice/SensorFusion.cpp b/services/sensorservice/SensorFusion.cpp index 4ec0c8c..518a1bb 100644 --- a/services/sensorservice/SensorFusion.cpp +++ b/services/sensorservice/SensorFusion.cpp @@ -28,23 +28,25 @@ SensorFusion::SensorFusion() mEnabled(false), mGyroTime(0) { sensor_t const* list; - size_t count = mSensorDevice.getSensorList(&list); - for (size_t i=0 ; i<count ; i++) { - if (list[i].type == SENSOR_TYPE_ACCELEROMETER) { - mAcc = Sensor(list + i); - } - if (list[i].type == SENSOR_TYPE_MAGNETIC_FIELD) { - mMag = Sensor(list + i); - } - if (list[i].type == SENSOR_TYPE_GYROSCOPE) { - mGyro = Sensor(list + i); - // 200 Hz for gyro events is a good compromise between precision - // and power/cpu usage. - mGyroRate = 200; - mTargetDelayNs = 1000000000LL/mGyroRate; + ssize_t count = mSensorDevice.getSensorList(&list); + if (count > 0) { + for (size_t i=0 ; i<size_t(count) ; i++) { + if (list[i].type == SENSOR_TYPE_ACCELEROMETER) { + mAcc = Sensor(list + i); + } + if (list[i].type == SENSOR_TYPE_MAGNETIC_FIELD) { + mMag = Sensor(list + i); + } + if (list[i].type == SENSOR_TYPE_GYROSCOPE) { + mGyro = Sensor(list + i); + // 200 Hz for gyro events is a good compromise between precision + // and power/cpu usage. + mGyroRate = 200; + mTargetDelayNs = 1000000000LL/mGyroRate; + } } + mFusion.init(); } - mFusion.init(); } void SensorFusion::process(const sensors_event_t& event) { diff --git a/services/sensorservice/SensorService.cpp b/services/sensorservice/SensorService.cpp index 64d214b..e0dce1f 100644 --- a/services/sensorservice/SensorService.cpp +++ b/services/sensorservice/SensorService.cpp @@ -70,73 +70,76 @@ void SensorService::onFirstRef() SensorDevice& dev(SensorDevice::getInstance()); if (dev.initCheck() == NO_ERROR) { - ssize_t orientationIndex = -1; - bool hasGyro = false; - uint32_t virtualSensorsNeeds = - (1<<SENSOR_TYPE_GRAVITY) | - (1<<SENSOR_TYPE_LINEAR_ACCELERATION) | - (1<<SENSOR_TYPE_ROTATION_VECTOR); sensor_t const* list; - int count = dev.getSensorList(&list); - mLastEventSeen.setCapacity(count); - for (int i=0 ; i<count ; i++) { - registerSensor( new HardwareSensor(list[i]) ); - switch (list[i].type) { - case SENSOR_TYPE_ORIENTATION: - orientationIndex = i; - break; - case SENSOR_TYPE_GYROSCOPE: - hasGyro = true; - break; - case SENSOR_TYPE_GRAVITY: - case SENSOR_TYPE_LINEAR_ACCELERATION: - case SENSOR_TYPE_ROTATION_VECTOR: - virtualSensorsNeeds &= ~(1<<list[i].type); - break; + ssize_t count = dev.getSensorList(&list); + if (count > 0) { + ssize_t orientationIndex = -1; + bool hasGyro = false; + uint32_t virtualSensorsNeeds = + (1<<SENSOR_TYPE_GRAVITY) | + (1<<SENSOR_TYPE_LINEAR_ACCELERATION) | + (1<<SENSOR_TYPE_ROTATION_VECTOR); + + mLastEventSeen.setCapacity(count); + for (ssize_t i=0 ; i<count ; i++) { + registerSensor( new HardwareSensor(list[i]) ); + switch (list[i].type) { + case SENSOR_TYPE_ORIENTATION: + orientationIndex = i; + break; + case SENSOR_TYPE_GYROSCOPE: + hasGyro = true; + break; + case SENSOR_TYPE_GRAVITY: + case SENSOR_TYPE_LINEAR_ACCELERATION: + case SENSOR_TYPE_ROTATION_VECTOR: + virtualSensorsNeeds &= ~(1<<list[i].type); + break; + } } - } - // it's safe to instantiate the SensorFusion object here - // (it wants to be instantiated after h/w sensors have been - // registered) - const SensorFusion& fusion(SensorFusion::getInstance()); - - if (hasGyro) { - // Always instantiate Android's virtual sensors. Since they are - // instantiated behind sensors from the HAL, they won't - // interfere with applications, unless they looks specifically - // for them (by name). - - registerVirtualSensor( new RotationVectorSensor() ); - registerVirtualSensor( new GravitySensor(list, count) ); - registerVirtualSensor( new LinearAccelerationSensor(list, count) ); - - // these are optional - registerVirtualSensor( new OrientationSensor() ); - registerVirtualSensor( new CorrectedGyroSensor(list, count) ); - - // virtual debugging sensors... - char value[PROPERTY_VALUE_MAX]; - property_get("debug.sensors", value, "0"); - if (atoi(value)) { - registerVirtualSensor( new GyroDriftSensor() ); + // it's safe to instantiate the SensorFusion object here + // (it wants to be instantiated after h/w sensors have been + // registered) + const SensorFusion& fusion(SensorFusion::getInstance()); + + if (hasGyro) { + // Always instantiate Android's virtual sensors. Since they are + // instantiated behind sensors from the HAL, they won't + // interfere with applications, unless they looks specifically + // for them (by name). + + registerVirtualSensor( new RotationVectorSensor() ); + registerVirtualSensor( new GravitySensor(list, count) ); + registerVirtualSensor( new LinearAccelerationSensor(list, count) ); + + // these are optional + registerVirtualSensor( new OrientationSensor() ); + registerVirtualSensor( new CorrectedGyroSensor(list, count) ); + + // virtual debugging sensors... + char value[PROPERTY_VALUE_MAX]; + property_get("debug.sensors", value, "0"); + if (atoi(value)) { + registerVirtualSensor( new GyroDriftSensor() ); + } } - } - // 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); + // 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); - mInitCheck = NO_ERROR; + run("SensorService", PRIORITY_URGENT_DISPLAY); + mInitCheck = NO_ERROR; + } } } |