summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMathias Agopian <mathias@google.com>2010-07-29 16:51:38 -0700
committerMathias Agopian <mathias@google.com>2010-07-29 18:18:00 -0700
commit050b56244ff46d43e4886018d7cd20f0b1dc02b9 (patch)
tree1c0cfcd08dbd18b386bebe5dd2cbeb1c945ccbda
parent3fb627525e077fa5452a99ac1e2a7e9c41995044 (diff)
downloadframeworks_base-050b56244ff46d43e4886018d7cd20f0b1dc02b9.zip
frameworks_base-050b56244ff46d43e4886018d7cd20f0b1dc02b9.tar.gz
frameworks_base-050b56244ff46d43e4886018d7cd20f0b1dc02b9.tar.bz2
Added SensorManager.getMinDelay()
Exposed the new "min delay" sensor property through native and java sensor apis. This allows the caller to know what is the maximum rate at which a sensor can return events, or, if a sensor works in "update" mode (events returned only when the value changes). Also augmented SensorManager.regusterSensorEvent() so that it can accept a value in microsecond in addition to the 4 constants already defined. Change-Id: If425e9979892666df8c989d7de3c362230fa19e0
-rw-r--r--api/current.xml11
-rw-r--r--core/java/android/hardware/Sensor.java10
-rw-r--r--core/java/android/hardware/SensorManager.java13
-rw-r--r--core/jni/android_hardware_SensorManager.cpp3
-rw-r--r--include/gui/Sensor.h2
-rw-r--r--include/gui/SensorEventQueue.h2
-rw-r--r--libs/gui/Sensor.cpp12
-rw-r--r--libs/gui/SensorEventQueue.cpp4
-rw-r--r--native/android/sensor.cpp4
-rw-r--r--native/include/android/sensor.h11
10 files changed, 61 insertions, 11 deletions
diff --git a/api/current.xml b/api/current.xml
index f1a383f..9de160a 100644
--- a/api/current.xml
+++ b/api/current.xml
@@ -77549,6 +77549,17 @@
visibility="public"
>
</method>
+<method name="getMinDelay"
+ return="int"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
<method name="getName"
return="java.lang.String"
abstract="false"
diff --git a/core/java/android/hardware/Sensor.java b/core/java/android/hardware/Sensor.java
index 3490ac0..b49a409 100644
--- a/core/java/android/hardware/Sensor.java
+++ b/core/java/android/hardware/Sensor.java
@@ -92,6 +92,7 @@ public class Sensor {
private float mMaxRange;
private float mResolution;
private float mPower;
+ private int mMinDelay;
private int mLegacyType;
@@ -147,6 +148,15 @@ public class Sensor {
return mPower;
}
+ /**
+ * @return the minimum delay allowed between two events in microsecond
+ * or zero if this sensor only returns a value when the data it's measuring
+ * changes.
+ */
+ public int getMinDelay() {
+ return mMinDelay;
+ }
+
int getHandle() {
return mHandle;
}
diff --git a/core/java/android/hardware/SensorManager.java b/core/java/android/hardware/SensorManager.java
index e6750e6..5cc8d5d 100644
--- a/core/java/android/hardware/SensorManager.java
+++ b/core/java/android/hardware/SensorManager.java
@@ -935,7 +935,8 @@ public class SensorManager
* received faster or slower than the specified rate. Usually events
* are received faster. The value must be one of
* {@link #SENSOR_DELAY_NORMAL}, {@link #SENSOR_DELAY_UI},
- * {@link #SENSOR_DELAY_GAME}, or {@link #SENSOR_DELAY_FASTEST}.
+ * {@link #SENSOR_DELAY_GAME}, or {@link #SENSOR_DELAY_FASTEST}
+ * or, the desired delay between events in microsecond.
*
* @return <code>true</code> if the sensor is supported and successfully
* enabled.
@@ -967,6 +968,7 @@ public class SensorManager
* are received faster. The value must be one of
* {@link #SENSOR_DELAY_NORMAL}, {@link #SENSOR_DELAY_UI},
* {@link #SENSOR_DELAY_GAME}, or {@link #SENSOR_DELAY_FASTEST}.
+ * or, the desired delay between events in microsecond.
*
* @param handler
* The {@link android.os.Handler Handler} the
@@ -992,16 +994,17 @@ public class SensorManager
delay = 0;
break;
case SENSOR_DELAY_GAME:
- delay = 20;
+ delay = 20000;
break;
case SENSOR_DELAY_UI:
- delay = 60;
+ delay = 60000;
break;
case SENSOR_DELAY_NORMAL:
- delay = 200;
+ delay = 200000;
break;
default:
- return false;
+ delay = rate;
+ break;
}
synchronized (sListeners) {
diff --git a/core/jni/android_hardware_SensorManager.cpp b/core/jni/android_hardware_SensorManager.cpp
index 7b23418..e29495c 100644
--- a/core/jni/android_hardware_SensorManager.cpp
+++ b/core/jni/android_hardware_SensorManager.cpp
@@ -38,6 +38,7 @@ struct SensorOffsets
jfieldID range;
jfieldID resolution;
jfieldID power;
+ jfieldID minDelay;
} gSensorOffsets;
/*
@@ -74,6 +75,7 @@ sensors_module_get_next_sensor(JNIEnv *env, jobject clazz, jobject sensor, jint
env->SetFloatField(sensor, sensorOffsets.range, list->getMaxValue());
env->SetFloatField(sensor, sensorOffsets.resolution, list->getResolution());
env->SetFloatField(sensor, sensorOffsets.power, list->getPowerUsage());
+ env->SetIntField(sensor, sensorOffsets.minDelay, list->getMinDelay());
next++;
return next<count ? next : 0;
@@ -154,6 +156,7 @@ nativeClassInit (JNIEnv *_env, jclass _this)
sensorOffsets.range = _env->GetFieldID(sensorClass, "mMaxRange", "F");
sensorOffsets.resolution = _env->GetFieldID(sensorClass, "mResolution","F");
sensorOffsets.power = _env->GetFieldID(sensorClass, "mPower", "F");
+ sensorOffsets.minDelay = _env->GetFieldID(sensorClass, "mMinDelay", "I");
}
static JNINativeMethod gMethods[] = {
diff --git a/include/gui/Sensor.h b/include/gui/Sensor.h
index e696d63..2de07b1 100644
--- a/include/gui/Sensor.h
+++ b/include/gui/Sensor.h
@@ -63,6 +63,7 @@ public:
float getMaxValue() const;
float getResolution() const;
float getPowerUsage() const;
+ int32_t getMinDelay() const;
// Flattenable interface
virtual size_t getFlattenedSize() const;
@@ -81,6 +82,7 @@ private:
float mMaxValue;
float mResolution;
float mPower;
+ int32_t mMinDelay;
};
// ----------------------------------------------------------------------------
diff --git a/include/gui/SensorEventQueue.h b/include/gui/SensorEventQueue.h
index ad36dac..6581ae3 100644
--- a/include/gui/SensorEventQueue.h
+++ b/include/gui/SensorEventQueue.h
@@ -65,7 +65,7 @@ public:
status_t setEventRate(Sensor const* sensor, nsecs_t ns) const;
// these are here only to support SensorManager.java
- status_t enableSensor(int32_t handle, int32_t ms) const;
+ status_t enableSensor(int32_t handle, int32_t us) const;
status_t disableSensor(int32_t handle) const;
private:
diff --git a/libs/gui/Sensor.cpp b/libs/gui/Sensor.cpp
index cb85df9..b1f37ff 100644
--- a/libs/gui/Sensor.cpp
+++ b/libs/gui/Sensor.cpp
@@ -32,7 +32,7 @@ namespace android {
Sensor::Sensor()
: mHandle(0), mType(0),
mMinValue(0), mMaxValue(0), mResolution(0),
- mPower(0)
+ mPower(0), mMinDelay(0)
{
}
@@ -46,6 +46,7 @@ Sensor::Sensor(struct sensor_t const* hwSensor)
mMaxValue = hwSensor->maxRange; // FIXME: maxValue
mResolution = hwSensor->resolution;
mPower = hwSensor->power;
+ mMinDelay = hwSensor->minDelay;
}
Sensor::~Sensor()
@@ -84,12 +85,17 @@ float Sensor::getPowerUsage() const {
return mPower;
}
+int32_t Sensor::getMinDelay() const {
+ return mMinDelay;
+}
+
size_t Sensor::getFlattenedSize() const
{
return sizeof(int32_t) + ((mName.length() + 3) & ~3) +
sizeof(int32_t) + ((mVendor.length() + 3) & ~3) +
sizeof(int32_t) * 2 +
- sizeof(float) * 4;
+ sizeof(float) * 4 +
+ sizeof(int32_t);
}
size_t Sensor::getFdCount() const
@@ -132,6 +138,7 @@ status_t Sensor::flatten(void* buffer, size_t size,
offset += write(buffer, offset, mMaxValue);
offset += write(buffer, offset, mResolution);
offset += write(buffer, offset, mPower);
+ offset += write(buffer, offset, mMinDelay);
return NO_ERROR;
}
@@ -169,6 +176,7 @@ status_t Sensor::unflatten(void const* buffer, size_t size,
offset += read(buffer, offset, &mMaxValue);
offset += read(buffer, offset, &mResolution);
offset += read(buffer, offset, &mPower);
+ offset += read(buffer, offset, &mMinDelay);
return NO_ERROR;
}
diff --git a/libs/gui/SensorEventQueue.cpp b/libs/gui/SensorEventQueue.cpp
index 4b46842..3396f25 100644
--- a/libs/gui/SensorEventQueue.cpp
+++ b/libs/gui/SensorEventQueue.cpp
@@ -114,10 +114,10 @@ status_t SensorEventQueue::disableSensor(Sensor const* sensor) const {
return mSensorEventConnection->enableDisable(sensor->getHandle(), false);
}
-status_t SensorEventQueue::enableSensor(int32_t handle, int32_t ms) const {
+status_t SensorEventQueue::enableSensor(int32_t handle, int32_t us) const {
status_t err = mSensorEventConnection->enableDisable(handle, true);
if (err == NO_ERROR) {
- mSensorEventConnection->setEventRate(handle, ms2ns(ms));
+ mSensorEventConnection->setEventRate(handle, us2ns(us));
}
return err;
}
diff --git a/native/android/sensor.cpp b/native/android/sensor.cpp
index e1fc4e7..db534e0 100644
--- a/native/android/sensor.cpp
+++ b/native/android/sensor.cpp
@@ -149,3 +149,7 @@ float ASensor_getResolution(ASensor const* sensor)
return static_cast<Sensor const*>(sensor)->getResolution();
}
+int ASensor_getMinDelay(ASensor const* sensor)
+{
+ return static_cast<Sensor const*>(sensor)->getMinDelay();
+}
diff --git a/native/include/android/sensor.h b/native/include/android/sensor.h
index 00d95d8..b4ce024 100644
--- a/native/include/android/sensor.h
+++ b/native/include/android/sensor.h
@@ -121,6 +121,7 @@ typedef struct ASensorEvent {
float temperature;
float distance;
float light;
+ float pressure;
};
int32_t reserved1[4];
} ASensorEvent;
@@ -188,7 +189,8 @@ int ASensorEventQueue_disableSensor(ASensorEventQueue* queue, ASensor const* sen
/*
* Sets the delivery rate of events in microseconds for the given sensor.
* Note that this is a hint only, generally event will arrive at a higher
- * rate.
+ * rate. It is an error to set a rate inferior to the value returned by
+ * ASensor_getMinDelay().
* Returns a negative error code on failure.
*/
int ASensorEventQueue_setEventRate(ASensorEventQueue* queue, ASensor const* sensor, int32_t usec);
@@ -239,6 +241,13 @@ int ASensor_getType(ASensor const* sensor);
*/
float ASensor_getResolution(ASensor const* sensor);
+/*
+ * Returns the minimum delay allowed between events in microseconds.
+ * A value of zero means that this sensor doesn't report events at a
+ * constant rate, but rather only when a new data is available.
+ */
+int ASensor_getMinDelay(ASensor const* sensor);
+
#ifdef __cplusplus
};