summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPresubmit Automerger Backend <android-build-presubmit-automerger-backend@system.gserviceaccount.com>2022-04-06 22:32:36 +0000
committerPresubmit Automerger Backend <android-build-presubmit-automerger-backend@system.gserviceaccount.com>2022-04-06 22:32:36 +0000
commita9b022ae2f1d31c26d3d9e36db5e8e3fc60b6b0e (patch)
tree1668889789997db4aee7556013af70ff57dd5f96
parent8a1df2fe03feba1c20f4d2f9ae6dbe5c3213d17e (diff)
parentfdb42f78cdce22e13353f3e3b529ac13ebf0f18f (diff)
downloadlibhardware-a9b022ae2f1d31c26d3d9e36db5e8e3fc60b6b0e.tar.gz
[automerge] dynamic_sensor: Fix HID min/max sample rate computation. 2p: fdb42f78cd
Original change: https://googleplex-android-review.googlesource.com/c/platform/hardware/libhardware/+/17625408 Bug: 228369656 Change-Id: I0df63dc8f74f2c481a6338a20c382f7bc306bcb8
-rw-r--r--modules/sensors/dynamic_sensor/HidRawSensor.cpp20
-rw-r--r--modules/sensors/dynamic_sensor/HidRawSensor.h2
-rw-r--r--modules/sensors/dynamic_sensor/HidUtils/HidParser.cpp10
3 files changed, 25 insertions, 7 deletions
diff --git a/modules/sensors/dynamic_sensor/HidRawSensor.cpp b/modules/sensors/dynamic_sensor/HidRawSensor.cpp
index 4520ddaa..3759e7e9 100644
--- a/modules/sensors/dynamic_sensor/HidRawSensor.cpp
+++ b/modules/sensors/dynamic_sensor/HidRawSensor.cpp
@@ -891,10 +891,18 @@ bool HidRawSensor::findSensorControlUsage(const std::vector<HidParser::ReportPac
mReportIntervalId = reportInterval->id;
mReportIntervalBitOffset = reportInterval->bitOffset;
mReportIntervalBitSize = reportInterval->bitSize;
-
- mFeatureInfo.minDelay = std::max(static_cast<int64_t>(1), reportInterval->minRaw) * 1000;
- mFeatureInfo.maxDelay = std::min(static_cast<int64_t>(1000000),
- reportInterval->maxRaw) * 1000; // maximum 1000 second
+ mReportIntervalScale = reportInterval->a;
+ mReportIntervalOffset = reportInterval->b;
+
+ mFeatureInfo.minDelay = 1000000.0
+ * (reportInterval->minRaw + reportInterval->b)
+ * reportInterval->a;
+ mFeatureInfo.minDelay = std::max(1000, mFeatureInfo.minDelay);
+ mFeatureInfo.maxDelay = 1000000.0
+ * (reportInterval->maxRaw + reportInterval->b)
+ * reportInterval->a;
+ mFeatureInfo.maxDelay = std::min(static_cast<int64_t>(1000000000),
+ mFeatureInfo.maxDelay);
}
return true;
return (mPowerStateId >= 0 || mReportingStateId >= 0) && mReportIntervalId >= 0;
@@ -981,7 +989,9 @@ int HidRawSensor::batch(int64_t samplingPeriod, int64_t batchingPeriod) {
if (device->getFeature(id, &buffer)
&& (8 * buffer.size()) >=
(mReportIntervalBitOffset + mReportIntervalBitSize)) {
- int64_t periodMs = samplingPeriod / 1000000; //ns -> ms
+ int64_t periodMs =
+ (((static_cast<double>(samplingPeriod)) / 1000000000.0)
+ / mReportIntervalScale) - mReportIntervalOffset;
int64_t maxPeriodMs =
(1LL << std::min(mReportIntervalBitSize, 63U)) - 1;
periodMs = std::min(periodMs, maxPeriodMs);
diff --git a/modules/sensors/dynamic_sensor/HidRawSensor.h b/modules/sensors/dynamic_sensor/HidRawSensor.h
index 66843fcd..074482a8 100644
--- a/modules/sensors/dynamic_sensor/HidRawSensor.h
+++ b/modules/sensors/dynamic_sensor/HidRawSensor.h
@@ -195,6 +195,8 @@ private:
int mReportIntervalId;
unsigned int mReportIntervalBitOffset;
unsigned int mReportIntervalBitSize;
+ double mReportIntervalScale;
+ int64_t mReportIntervalOffset;
// Input report translate table
std::vector<ReportTranslateRecord> mTranslateTable;
diff --git a/modules/sensors/dynamic_sensor/HidUtils/HidParser.cpp b/modules/sensors/dynamic_sensor/HidUtils/HidParser.cpp
index 19aa4291..63210200 100644
--- a/modules/sensors/dynamic_sensor/HidUtils/HidParser.cpp
+++ b/modules/sensors/dynamic_sensor/HidUtils/HidParser.cpp
@@ -240,8 +240,14 @@ std::vector<HidParser::ReportPacket> HidParser::convertGroupToPacket(
auto logical = r.getLogicalRange();
auto physical = r.getPhysicalRange();
- double scale = static_cast<double>((physical.second - physical.first))
- / (logical.second - logical.first);
+ double scale;
+ if ((physical.first != physical.second) &&
+ (logical.first != logical.second)) {
+ scale = static_cast<double>(physical.second - physical.first)
+ / (logical.second - logical.first);
+ } else {
+ scale = (physical.first != 0) ? physical.first : 1.0;
+ }
scale *= r.getExponentValue();
int64_t offset =
(physical.first * r.getExponentValue() / scale) -