summaryrefslogtreecommitdiffstats
path: root/libs/gui/Sensor.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libs/gui/Sensor.cpp')
-rw-r--r--libs/gui/Sensor.cpp161
1 files changed, 91 insertions, 70 deletions
diff --git a/libs/gui/Sensor.cpp b/libs/gui/Sensor.cpp
index c52a88f..da6b0f9 100644
--- a/libs/gui/Sensor.cpp
+++ b/libs/gui/Sensor.cpp
@@ -32,11 +32,11 @@ namespace android {
Sensor::Sensor()
: mHandle(0), mType(0),
mMinValue(0), mMaxValue(0), mResolution(0),
- mPower(0), mMinDelay(0)
+ mPower(0), mMinDelay(0), mFifoReservedEventCount(0), mFifoMaxEventCount(0)
{
}
-Sensor::Sensor(struct sensor_t const* hwSensor)
+Sensor::Sensor(struct sensor_t const* hwSensor, int halVersion)
{
mName = hwSensor->name;
mVendor = hwSensor->vendor;
@@ -48,6 +48,15 @@ Sensor::Sensor(struct sensor_t const* hwSensor)
mResolution = hwSensor->resolution;
mPower = hwSensor->power;
mMinDelay = hwSensor->minDelay;
+ // Set fifo event count zero for older devices which do not support batching. Fused
+ // sensors also have their fifo counts set to zero.
+ if (halVersion >= SENSORS_DEVICE_API_VERSION_1_1) {
+ mFifoReservedEventCount = hwSensor->fifoReservedEventCount;
+ mFifoMaxEventCount = hwSensor->fifoMaxEventCount;
+ } else {
+ mFifoReservedEventCount = 0;
+ mFifoMaxEventCount = 0;
+ }
}
Sensor::~Sensor()
@@ -98,85 +107,97 @@ int32_t Sensor::getVersion() const {
return mVersion;
}
-size_t Sensor::getSize() const
-{
- return sizeof(int32_t) + ((mName.length() + 3) & ~3) +
- sizeof(int32_t) + ((mVendor.length() + 3) & ~3) +
- sizeof(int32_t) * 3 +
- sizeof(float) * 4 +
- sizeof(int32_t);
-}
-
-static inline
-size_t write(void* buffer, size_t offset, const String8& value) {
- memcpy(static_cast<char*>(buffer) + offset, value.string(), value.length());
- return (value.length() + 3) & ~3;
-}
-
-static inline
-size_t write(void* buffer, size_t offset, float value) {
- *reinterpret_cast<float*>(static_cast<char*>(buffer) + offset) = value;
- return sizeof(float);
+int32_t Sensor::getFifoReservedEventCount() const {
+ return mFifoReservedEventCount;
}
-static inline
-size_t write(void* buffer, size_t offset, int32_t value) {
- *reinterpret_cast<int32_t*>(static_cast<char*>(buffer) + offset) = value;
- return sizeof(int32_t);
+int32_t Sensor::getFifoMaxEventCount() const {
+ return mFifoMaxEventCount;
}
-status_t Sensor::flatten(void* buffer) const
+size_t Sensor::getFlattenedSize() const
{
- size_t offset = 0;
- offset += write(buffer, offset, int32_t(mName.length()));
- offset += write(buffer, offset, mName);
- offset += write(buffer, offset, int32_t(mVendor.length()));
- offset += write(buffer, offset, mVendor);
- offset += write(buffer, offset, mVersion);
- offset += write(buffer, offset, mHandle);
- offset += write(buffer, offset, mType);
- offset += write(buffer, offset, mMinValue);
- offset += write(buffer, offset, mMaxValue);
- offset += write(buffer, offset, mResolution);
- offset += write(buffer, offset, mPower);
- offset += write(buffer, offset, mMinDelay);
+ size_t fixedSize =
+ sizeof(int32_t) * 3 +
+ sizeof(float) * 4 +
+ sizeof(int32_t) * 3;
+
+ size_t variableSize =
+ sizeof(int32_t) + FlattenableUtils::align<4>(mName.length()) +
+ sizeof(int32_t) + FlattenableUtils::align<4>(mVendor.length());
+
+ return fixedSize + variableSize;
+}
+
+status_t Sensor::flatten(void* buffer, size_t size) const {
+ if (size < getFlattenedSize()) {
+ return NO_MEMORY;
+ }
+
+ FlattenableUtils::write(buffer, size, mName.length());
+ memcpy(static_cast<char*>(buffer), mName.string(), mName.length());
+ FlattenableUtils::advance(buffer, size, FlattenableUtils::align<4>(mName.length()));
+
+ FlattenableUtils::write(buffer, size, mVendor.length());
+ memcpy(static_cast<char*>(buffer), mVendor.string(), mVendor.length());
+ FlattenableUtils::advance(buffer, size, FlattenableUtils::align<4>(mVendor.length()));
+
+ FlattenableUtils::write(buffer, size, mVersion);
+ FlattenableUtils::write(buffer, size, mHandle);
+ FlattenableUtils::write(buffer, size, mType);
+ FlattenableUtils::write(buffer, size, mMinValue);
+ FlattenableUtils::write(buffer, size, mMaxValue);
+ FlattenableUtils::write(buffer, size, mResolution);
+ FlattenableUtils::write(buffer, size, mPower);
+ FlattenableUtils::write(buffer, size, mMinDelay);
+ FlattenableUtils::write(buffer, size, mFifoReservedEventCount);
+ FlattenableUtils::write(buffer, size, mFifoMaxEventCount);
return NO_ERROR;
}
-static inline
-size_t read(void const* buffer, size_t offset, String8* value, int32_t len) {
- value->setTo(static_cast<char const*>(buffer) + offset, len);
- return (len + 3) & ~3;
-}
+status_t Sensor::unflatten(void const* buffer, size_t size) {
+ size_t len;
-static inline
-size_t read(void const* buffer, size_t offset, float* value) {
- *value = *reinterpret_cast<float const*>(static_cast<char const*>(buffer) + offset);
- return sizeof(float);
-}
+ if (size < sizeof(size_t)) {
+ return NO_MEMORY;
+ }
+ FlattenableUtils::read(buffer, size, len);
+ if (size < len) {
+ return NO_MEMORY;
+ }
+ mName.setTo(static_cast<char const*>(buffer), len);
+ FlattenableUtils::advance(buffer, size, FlattenableUtils::align<4>(len));
-static inline
-size_t read(void const* buffer, size_t offset, int32_t* value) {
- *value = *reinterpret_cast<int32_t const*>(static_cast<char const*>(buffer) + offset);
- return sizeof(int32_t);
-}
-status_t Sensor::unflatten(void const* buffer, size_t size)
-{
- int32_t len;
- size_t offset = 0;
- offset += read(buffer, offset, &len);
- offset += read(buffer, offset, &mName, len);
- offset += read(buffer, offset, &len);
- offset += read(buffer, offset, &mVendor, len);
- offset += read(buffer, offset, &mVersion);
- offset += read(buffer, offset, &mHandle);
- offset += read(buffer, offset, &mType);
- offset += read(buffer, offset, &mMinValue);
- offset += read(buffer, offset, &mMaxValue);
- offset += read(buffer, offset, &mResolution);
- offset += read(buffer, offset, &mPower);
- offset += read(buffer, offset, &mMinDelay);
+ if (size < sizeof(size_t)) {
+ return NO_MEMORY;
+ }
+ FlattenableUtils::read(buffer, size, len);
+ if (size < len) {
+ return NO_MEMORY;
+ }
+ mVendor.setTo(static_cast<char const*>(buffer), len);
+ FlattenableUtils::advance(buffer, size, FlattenableUtils::align<4>(len));
+
+ size_t fixedSize =
+ sizeof(int32_t) * 3 +
+ sizeof(float) * 4 +
+ sizeof(int32_t) * 3;
+
+ if (size < fixedSize) {
+ return NO_MEMORY;
+ }
+
+ FlattenableUtils::read(buffer, size, mVersion);
+ FlattenableUtils::read(buffer, size, mHandle);
+ FlattenableUtils::read(buffer, size, mType);
+ FlattenableUtils::read(buffer, size, mMinValue);
+ FlattenableUtils::read(buffer, size, mMaxValue);
+ FlattenableUtils::read(buffer, size, mResolution);
+ FlattenableUtils::read(buffer, size, mPower);
+ FlattenableUtils::read(buffer, size, mMinDelay);
+ FlattenableUtils::read(buffer, size, mFifoReservedEventCount);
+ FlattenableUtils::read(buffer, size, mFifoMaxEventCount);
return NO_ERROR;
}