dynamic_sensor: Support report and power usage collections.

Bug: 207008609
Test: Verified dynamic sensor sampling.
Change-Id: If0bef3647d5c52f9bf1d92a2a0ead72e98c70b8c
diff --git a/modules/sensors/dynamic_sensor/HidRawSensor.cpp b/modules/sensors/dynamic_sensor/HidRawSensor.cpp
index f3c8a27..91aed0a 100644
--- a/modules/sensors/dynamic_sensor/HidRawSensor.cpp
+++ b/modules/sensors/dynamic_sensor/HidRawSensor.cpp
@@ -784,8 +784,9 @@
 }
 
 bool HidRawSensor::findSensorControlUsage(const std::vector<HidParser::ReportPacket> &packets) {
+    using namespace Hid::Sensor::PowerStateUsage;
     using namespace Hid::Sensor::PropertyUsage;
-    using namespace Hid::Sensor::RawMinMax;
+    using namespace Hid::Sensor::ReportingStateUsage;
 
     //REPORTING_STATE
     const HidParser::ReportItem *reportingState
@@ -793,13 +794,31 @@
 
     if (reportingState == nullptr
             || !reportingState->isByteAligned()
-            || reportingState->bitSize != 8
-            || reportingState->minRaw != REPORTING_STATE_MIN
-            || reportingState->maxRaw != REPORTING_STATE_MAX) {
+            || reportingState->bitSize != 8) {
         LOG_W << "Cannot find valid reporting state feature" << LOG_ENDL;
     } else {
         mReportingStateId = reportingState->id;
         mReportingStateOffset = reportingState->bitOffset / 8;
+
+        mReportingStateDisableIndex = -1;
+        mReportingStateEnableIndex = -1;
+        for (unsigned i = 0; i < reportingState->usageVector.size(); ++i) {
+            if (reportingState->usageVector[i] == REPORTING_STATE_NO_EVENTS) {
+                mReportingStateDisableIndex = i;
+            }
+            if (reportingState->usageVector[i] == REPORTING_STATE_ALL_EVENTS) {
+                mReportingStateEnableIndex = i;
+            }
+        }
+        if (mReportingStateDisableIndex < 0) {
+            LOG_W << "Cannot find reporting state to disable sensor"
+                  << LOG_ENDL;
+            mReportingStateId = -1;
+        }
+        if (mReportingStateEnableIndex < 0) {
+            LOG_W << "Cannot find reporting state to enable sensor" << LOG_ENDL;
+            mReportingStateId = -1;
+        }
     }
 
     //POWER_STATE
@@ -807,13 +826,31 @@
             = find(packets, POWER_STATE, HidParser::REPORT_TYPE_FEATURE);
     if (powerState == nullptr
             || !powerState->isByteAligned()
-            || powerState->bitSize != 8
-            || powerState->minRaw != POWER_STATE_MIN
-            || powerState->maxRaw != POWER_STATE_MAX) {
+            || powerState->bitSize != 8) {
         LOG_W << "Cannot find valid power state feature" << LOG_ENDL;
     } else {
         mPowerStateId = powerState->id;
         mPowerStateOffset = powerState->bitOffset / 8;
+
+        mPowerStateOffIndex = -1;
+        mPowerStateOnIndex = -1;
+        for (unsigned i = 0; i < powerState->usageVector.size(); ++i) {
+            if (powerState->usageVector[i] == POWER_STATE_D4_POWER_OFF) {
+                mPowerStateOffIndex = i;
+            }
+            if (powerState->usageVector[i] == POWER_STATE_D0_FULL_POWER) {
+                mPowerStateOnIndex = i;
+            }
+        }
+        if (mPowerStateOffIndex < 0) {
+            LOG_W << "Cannot find power state to power off sensor"
+                  << LOG_ENDL;
+            mPowerStateId = -1;
+        }
+        if (mPowerStateOnIndex < 0) {
+            LOG_W << "Cannot find power state to power on sensor" << LOG_ENDL;
+            mPowerStateId = -1;
+        }
     }
 
     //REPORT_INTERVAL
@@ -846,7 +883,6 @@
 }
 
 int HidRawSensor::enable(bool enable) {
-    using namespace Hid::Sensor::StateValue;
     SP(HidDevice) device = PROMOTE(mDevice);
 
     if (device == nullptr) {
@@ -864,7 +900,8 @@
         uint8_t id = static_cast<uint8_t>(mPowerStateId);
         if (device->getFeature(id, &buffer)
                 && buffer.size() > mPowerStateOffset) {
-            buffer[mPowerStateOffset] = enable ? POWER_STATE_FULL_POWER : POWER_STATE_POWER_OFF;
+            buffer[mPowerStateOffset] =
+                    enable ? mPowerStateOnIndex : mPowerStateOffIndex;
             setPowerOk = device->setFeature(id, buffer);
         } else {
             LOG_E << "enable: changing POWER STATE failed" << LOG_ENDL;
@@ -878,7 +915,8 @@
         if (device->getFeature(id, &buffer)
                 && buffer.size() > mReportingStateOffset) {
             buffer[mReportingStateOffset]
-                    = enable ? REPORTING_STATE_ALL_EVENT : REPORTING_STATE_NO_EVENT;
+                    = enable ? mReportingStateEnableIndex :
+                               mReportingStateDisableIndex;
             setReportingOk = device->setFeature(id, buffer);
         } else {
             LOG_E << "enable: changing REPORTING STATE failed" << LOG_ENDL;
@@ -1019,7 +1057,10 @@
     ss << "  Power state ";
     if (mPowerStateId >= 0) {
         ss << "found, id: " << mPowerStateId
-              << " offset: " << mPowerStateOffset << LOG_ENDL;
+              << " offset: " << mPowerStateOffset
+              << " power off index: " << mPowerStateOffIndex
+              << " power on index: " << mPowerStateOnIndex
+              << LOG_ENDL;
     } else {
         ss << "not found" << LOG_ENDL;
     }
@@ -1027,7 +1068,10 @@
     ss << "  Reporting state ";
     if (mReportingStateId >= 0) {
         ss << "found, id: " << mReportingStateId
-              << " offset: " << mReportingStateOffset << LOG_ENDL;
+              << " offset: " << mReportingStateOffset
+              << " disable index: " << mReportingStateDisableIndex
+              << " enable index: " << mReportingStateEnableIndex
+              << LOG_ENDL;
     } else {
         ss << "not found" << LOG_ENDL;
     }
diff --git a/modules/sensors/dynamic_sensor/HidRawSensor.h b/modules/sensors/dynamic_sensor/HidRawSensor.h
index 2dd32b6..201e72e 100644
--- a/modules/sensors/dynamic_sensor/HidRawSensor.h
+++ b/modules/sensors/dynamic_sensor/HidRawSensor.h
@@ -138,9 +138,13 @@
     // Features for control sensor
     int mReportingStateId;
     unsigned int mReportingStateOffset;
+    int mReportingStateDisableIndex;
+    int mReportingStateEnableIndex;
 
     int mPowerStateId;
     unsigned int mPowerStateOffset;
+    int mPowerStateOffIndex;
+    int mPowerStateOnIndex;
 
     int mReportIntervalId;
     unsigned int mReportIntervalOffset;
diff --git a/modules/sensors/dynamic_sensor/HidSensorDef.h b/modules/sensors/dynamic_sensor/HidSensorDef.h
index 2728b28..8f47a85 100644
--- a/modules/sensors/dynamic_sensor/HidSensorDef.h
+++ b/modules/sensors/dynamic_sensor/HidSensorDef.h
@@ -77,24 +77,28 @@
 };
 } // namespace ReportUsage
 
-namespace RawMinMax {
+namespace ReportingStateUsage {
 enum {
-    REPORTING_STATE_MIN = 0,
-    REPORTING_STATE_MAX = 5,
-    POWER_STATE_MIN = 0,
-    POWER_STATE_MAX = 5,
+    REPORTING_STATE_NO_EVENTS = 0x0840,
+    REPORTING_STATE_ALL_EVENTS = 0x0841,
+    REPORTING_STATE_REPORT_THRESHOLD_EVENTS = 0x0842,
+    REPORTING_STATE_REPORT_WAKE_ON_NO_EVENTS = 0x0843,
+    REPORTING_STATE_REPORT_WAKE_ON_ALL_EVENTS = 0x0844,
+    REPORTING_STATE_REPORT_WAKE_ON_THRESHOLD_EVENTS = 0x0845,
 };
-} // namespace RawMinMax
+} // namespace ReportingStateUsage
 
-namespace StateValue {
+namespace PowerStateUsage {
 enum {
-    POWER_STATE_FULL_POWER = 1,
-    POWER_STATE_POWER_OFF = 5,
-
-    REPORTING_STATE_ALL_EVENT = 1,
-    REPORTING_STATE_NO_EVENT = 0,
+    POWER_STATE_UNDEFINED = 0x0850,
+    POWER_STATE_D0_FULL_POWER = 0x0851,
+    POWER_STATE_D1_LOW_POWER = 0x0852,
+    POWER_STATE_D2_STANDBY_POWER_WITH_WAKEUP = 0x0853,
+    POWER_STATE_D3_SLEEP_WITH_WAKEUP = 0x0854,
+    POWER_STATE_D4_POWER_OFF = 0x0855,
 };
-} // StateValue
+} // namespace PowerStateUsage
+
 } // namespace Sensor
 } // namespace Hid
 #endif // HID_SENSOR_DEF_H_
diff --git a/modules/sensors/dynamic_sensor/HidUtils/HidParser.cpp b/modules/sensors/dynamic_sensor/HidUtils/HidParser.cpp
index 264f13c..704a1b3 100644
--- a/modules/sensors/dynamic_sensor/HidUtils/HidParser.cpp
+++ b/modules/sensors/dynamic_sensor/HidUtils/HidParser.cpp
@@ -248,6 +248,7 @@
                 ReportItem digest = {
                     .usage = r.getFullUsage(),
                     .id = id,
+                    .usageVector = r.getUsageVector(),
                     .minRaw = logical.first,
                     .maxRaw = logical.second,
                     .a = scale,
diff --git a/modules/sensors/dynamic_sensor/HidUtils/HidParser.h b/modules/sensors/dynamic_sensor/HidUtils/HidParser.h
index 4ef5ec6..20dcf63 100644
--- a/modules/sensors/dynamic_sensor/HidUtils/HidParser.h
+++ b/modules/sensors/dynamic_sensor/HidUtils/HidParser.h
@@ -89,6 +89,7 @@
     unsigned int usage;
     unsigned int id;
     int type; // feature, input or output
+    std::vector<unsigned int> usageVector;
 
     int64_t minRaw;
     int64_t maxRaw;