dynamic_sensor: Support report and power usage collections.
Bug: 207008609 Test: Verified dynamic sensor sampling. Change-Id: If0bef3647d5c52f9bf1d92a2a0ead72e98c70b8c
This commit is contained in:
@@ -784,8 +784,9 @@ bool HidRawSensor::detectAndroidCustomSensor(const std::string &description) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool HidRawSensor::findSensorControlUsage(const std::vector<HidParser::ReportPacket> &packets) {
|
bool HidRawSensor::findSensorControlUsage(const std::vector<HidParser::ReportPacket> &packets) {
|
||||||
|
using namespace Hid::Sensor::PowerStateUsage;
|
||||||
using namespace Hid::Sensor::PropertyUsage;
|
using namespace Hid::Sensor::PropertyUsage;
|
||||||
using namespace Hid::Sensor::RawMinMax;
|
using namespace Hid::Sensor::ReportingStateUsage;
|
||||||
|
|
||||||
//REPORTING_STATE
|
//REPORTING_STATE
|
||||||
const HidParser::ReportItem *reportingState
|
const HidParser::ReportItem *reportingState
|
||||||
@@ -793,13 +794,31 @@ bool HidRawSensor::findSensorControlUsage(const std::vector<HidParser::ReportPac
|
|||||||
|
|
||||||
if (reportingState == nullptr
|
if (reportingState == nullptr
|
||||||
|| !reportingState->isByteAligned()
|
|| !reportingState->isByteAligned()
|
||||||
|| reportingState->bitSize != 8
|
|| reportingState->bitSize != 8) {
|
||||||
|| reportingState->minRaw != REPORTING_STATE_MIN
|
|
||||||
|| reportingState->maxRaw != REPORTING_STATE_MAX) {
|
|
||||||
LOG_W << "Cannot find valid reporting state feature" << LOG_ENDL;
|
LOG_W << "Cannot find valid reporting state feature" << LOG_ENDL;
|
||||||
} else {
|
} else {
|
||||||
mReportingStateId = reportingState->id;
|
mReportingStateId = reportingState->id;
|
||||||
mReportingStateOffset = reportingState->bitOffset / 8;
|
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
|
//POWER_STATE
|
||||||
@@ -807,13 +826,31 @@ bool HidRawSensor::findSensorControlUsage(const std::vector<HidParser::ReportPac
|
|||||||
= find(packets, POWER_STATE, HidParser::REPORT_TYPE_FEATURE);
|
= find(packets, POWER_STATE, HidParser::REPORT_TYPE_FEATURE);
|
||||||
if (powerState == nullptr
|
if (powerState == nullptr
|
||||||
|| !powerState->isByteAligned()
|
|| !powerState->isByteAligned()
|
||||||
|| powerState->bitSize != 8
|
|| powerState->bitSize != 8) {
|
||||||
|| powerState->minRaw != POWER_STATE_MIN
|
|
||||||
|| powerState->maxRaw != POWER_STATE_MAX) {
|
|
||||||
LOG_W << "Cannot find valid power state feature" << LOG_ENDL;
|
LOG_W << "Cannot find valid power state feature" << LOG_ENDL;
|
||||||
} else {
|
} else {
|
||||||
mPowerStateId = powerState->id;
|
mPowerStateId = powerState->id;
|
||||||
mPowerStateOffset = powerState->bitOffset / 8;
|
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
|
//REPORT_INTERVAL
|
||||||
@@ -846,7 +883,6 @@ void HidRawSensor::getUuid(uint8_t* uuid) const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int HidRawSensor::enable(bool enable) {
|
int HidRawSensor::enable(bool enable) {
|
||||||
using namespace Hid::Sensor::StateValue;
|
|
||||||
SP(HidDevice) device = PROMOTE(mDevice);
|
SP(HidDevice) device = PROMOTE(mDevice);
|
||||||
|
|
||||||
if (device == nullptr) {
|
if (device == nullptr) {
|
||||||
@@ -864,7 +900,8 @@ int HidRawSensor::enable(bool enable) {
|
|||||||
uint8_t id = static_cast<uint8_t>(mPowerStateId);
|
uint8_t id = static_cast<uint8_t>(mPowerStateId);
|
||||||
if (device->getFeature(id, &buffer)
|
if (device->getFeature(id, &buffer)
|
||||||
&& buffer.size() > mPowerStateOffset) {
|
&& buffer.size() > mPowerStateOffset) {
|
||||||
buffer[mPowerStateOffset] = enable ? POWER_STATE_FULL_POWER : POWER_STATE_POWER_OFF;
|
buffer[mPowerStateOffset] =
|
||||||
|
enable ? mPowerStateOnIndex : mPowerStateOffIndex;
|
||||||
setPowerOk = device->setFeature(id, buffer);
|
setPowerOk = device->setFeature(id, buffer);
|
||||||
} else {
|
} else {
|
||||||
LOG_E << "enable: changing POWER STATE failed" << LOG_ENDL;
|
LOG_E << "enable: changing POWER STATE failed" << LOG_ENDL;
|
||||||
@@ -878,7 +915,8 @@ int HidRawSensor::enable(bool enable) {
|
|||||||
if (device->getFeature(id, &buffer)
|
if (device->getFeature(id, &buffer)
|
||||||
&& buffer.size() > mReportingStateOffset) {
|
&& buffer.size() > mReportingStateOffset) {
|
||||||
buffer[mReportingStateOffset]
|
buffer[mReportingStateOffset]
|
||||||
= enable ? REPORTING_STATE_ALL_EVENT : REPORTING_STATE_NO_EVENT;
|
= enable ? mReportingStateEnableIndex :
|
||||||
|
mReportingStateDisableIndex;
|
||||||
setReportingOk = device->setFeature(id, buffer);
|
setReportingOk = device->setFeature(id, buffer);
|
||||||
} else {
|
} else {
|
||||||
LOG_E << "enable: changing REPORTING STATE failed" << LOG_ENDL;
|
LOG_E << "enable: changing REPORTING STATE failed" << LOG_ENDL;
|
||||||
@@ -1019,7 +1057,10 @@ std::string HidRawSensor::dump() const {
|
|||||||
ss << " Power state ";
|
ss << " Power state ";
|
||||||
if (mPowerStateId >= 0) {
|
if (mPowerStateId >= 0) {
|
||||||
ss << "found, id: " << mPowerStateId
|
ss << "found, id: " << mPowerStateId
|
||||||
<< " offset: " << mPowerStateOffset << LOG_ENDL;
|
<< " offset: " << mPowerStateOffset
|
||||||
|
<< " power off index: " << mPowerStateOffIndex
|
||||||
|
<< " power on index: " << mPowerStateOnIndex
|
||||||
|
<< LOG_ENDL;
|
||||||
} else {
|
} else {
|
||||||
ss << "not found" << LOG_ENDL;
|
ss << "not found" << LOG_ENDL;
|
||||||
}
|
}
|
||||||
@@ -1027,7 +1068,10 @@ std::string HidRawSensor::dump() const {
|
|||||||
ss << " Reporting state ";
|
ss << " Reporting state ";
|
||||||
if (mReportingStateId >= 0) {
|
if (mReportingStateId >= 0) {
|
||||||
ss << "found, id: " << mReportingStateId
|
ss << "found, id: " << mReportingStateId
|
||||||
<< " offset: " << mReportingStateOffset << LOG_ENDL;
|
<< " offset: " << mReportingStateOffset
|
||||||
|
<< " disable index: " << mReportingStateDisableIndex
|
||||||
|
<< " enable index: " << mReportingStateEnableIndex
|
||||||
|
<< LOG_ENDL;
|
||||||
} else {
|
} else {
|
||||||
ss << "not found" << LOG_ENDL;
|
ss << "not found" << LOG_ENDL;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -138,9 +138,13 @@ private:
|
|||||||
// Features for control sensor
|
// Features for control sensor
|
||||||
int mReportingStateId;
|
int mReportingStateId;
|
||||||
unsigned int mReportingStateOffset;
|
unsigned int mReportingStateOffset;
|
||||||
|
int mReportingStateDisableIndex;
|
||||||
|
int mReportingStateEnableIndex;
|
||||||
|
|
||||||
int mPowerStateId;
|
int mPowerStateId;
|
||||||
unsigned int mPowerStateOffset;
|
unsigned int mPowerStateOffset;
|
||||||
|
int mPowerStateOffIndex;
|
||||||
|
int mPowerStateOnIndex;
|
||||||
|
|
||||||
int mReportIntervalId;
|
int mReportIntervalId;
|
||||||
unsigned int mReportIntervalOffset;
|
unsigned int mReportIntervalOffset;
|
||||||
|
|||||||
@@ -77,24 +77,28 @@ enum {
|
|||||||
};
|
};
|
||||||
} // namespace ReportUsage
|
} // namespace ReportUsage
|
||||||
|
|
||||||
namespace RawMinMax {
|
namespace ReportingStateUsage {
|
||||||
enum {
|
enum {
|
||||||
REPORTING_STATE_MIN = 0,
|
REPORTING_STATE_NO_EVENTS = 0x0840,
|
||||||
REPORTING_STATE_MAX = 5,
|
REPORTING_STATE_ALL_EVENTS = 0x0841,
|
||||||
POWER_STATE_MIN = 0,
|
REPORTING_STATE_REPORT_THRESHOLD_EVENTS = 0x0842,
|
||||||
POWER_STATE_MAX = 5,
|
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 {
|
enum {
|
||||||
POWER_STATE_FULL_POWER = 1,
|
POWER_STATE_UNDEFINED = 0x0850,
|
||||||
POWER_STATE_POWER_OFF = 5,
|
POWER_STATE_D0_FULL_POWER = 0x0851,
|
||||||
|
POWER_STATE_D1_LOW_POWER = 0x0852,
|
||||||
REPORTING_STATE_ALL_EVENT = 1,
|
POWER_STATE_D2_STANDBY_POWER_WITH_WAKEUP = 0x0853,
|
||||||
REPORTING_STATE_NO_EVENT = 0,
|
POWER_STATE_D3_SLEEP_WITH_WAKEUP = 0x0854,
|
||||||
|
POWER_STATE_D4_POWER_OFF = 0x0855,
|
||||||
};
|
};
|
||||||
} // StateValue
|
} // namespace PowerStateUsage
|
||||||
|
|
||||||
} // namespace Sensor
|
} // namespace Sensor
|
||||||
} // namespace Hid
|
} // namespace Hid
|
||||||
#endif // HID_SENSOR_DEF_H_
|
#endif // HID_SENSOR_DEF_H_
|
||||||
|
|||||||
@@ -248,6 +248,7 @@ std::vector<HidParser::ReportPacket> HidParser::convertGroupToPacket(
|
|||||||
ReportItem digest = {
|
ReportItem digest = {
|
||||||
.usage = r.getFullUsage(),
|
.usage = r.getFullUsage(),
|
||||||
.id = id,
|
.id = id,
|
||||||
|
.usageVector = r.getUsageVector(),
|
||||||
.minRaw = logical.first,
|
.minRaw = logical.first,
|
||||||
.maxRaw = logical.second,
|
.maxRaw = logical.second,
|
||||||
.a = scale,
|
.a = scale,
|
||||||
|
|||||||
@@ -89,6 +89,7 @@ struct HidParser::ReportItem {
|
|||||||
unsigned int usage;
|
unsigned int usage;
|
||||||
unsigned int id;
|
unsigned int id;
|
||||||
int type; // feature, input or output
|
int type; // feature, input or output
|
||||||
|
std::vector<unsigned int> usageVector;
|
||||||
|
|
||||||
int64_t minRaw;
|
int64_t minRaw;
|
||||||
int64_t maxRaw;
|
int64_t maxRaw;
|
||||||
|
|||||||
Reference in New Issue
Block a user