diff options
author | Erik Staats <estaats@google.com> | 2022-04-06 15:24:28 -0700 |
---|---|---|
committer | Erik Staats <estaats@google.com> | 2022-04-06 15:30:02 -0700 |
commit | fdb42f78cdce22e13353f3e3b529ac13ebf0f18f (patch) | |
tree | 1668889789997db4aee7556013af70ff57dd5f96 | |
parent | 9b8bc0f7c1fd4565572a894d4f5380e9ae0905b9 (diff) | |
download | libhardware-fdb42f78cdce22e13353f3e3b529ac13ebf0f18f.tar.gz |
dynamic_sensor: Fix HID min/max sample rate computation.
Bug: 228369656
Test: Used uhid-sample to add a dynamic sensor and verified correct
min/max sample rate.
Change-Id: I88a1bec26a03a97ee7a3c590d2601151b89ee545
-rw-r--r-- | modules/sensors/dynamic_sensor/HidRawSensor.cpp | 20 | ||||
-rw-r--r-- | modules/sensors/dynamic_sensor/HidRawSensor.h | 2 | ||||
-rw-r--r-- | modules/sensors/dynamic_sensor/HidUtils/HidParser.cpp | 10 |
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) - |