Fix the bug that causes setDelay not working
Fix the bug that causes setDelay not working. Many native sensor apps, such as camera EIS, still use this API. Bug: b/27790706 Change-Id: Iaf7eeb3311a2148ca556d27dbd117e1992715644
This commit is contained in:
@@ -888,7 +888,7 @@ void HubConnection::queueActivate(int handle, bool enable)
|
|||||||
|
|
||||||
initConfigCmd(&cmd, handle);
|
initConfigCmd(&cmd, handle);
|
||||||
|
|
||||||
ALOGI("queueActive: sensor=%d, enable=%d", cmd.sensorType, enable);
|
ALOGI("queueActive: sensor=%d, handle=%d, enable=%d", cmd.sensorType, handle, enable);
|
||||||
do {
|
do {
|
||||||
ret = write(mFd, &cmd, sizeof(cmd));
|
ret = write(mFd, &cmd, sizeof(cmd));
|
||||||
} while(ret != sizeof(cmd));
|
} while(ret != sizeof(cmd));
|
||||||
@@ -897,47 +897,53 @@ void HubConnection::queueActivate(int handle, bool enable)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void HubConnection::queueSetDelay(int handle, nsecs_t delayNs)
|
void HubConnection::queueSetDelay(int handle, nsecs_t sampling_period_ns)
|
||||||
{
|
{
|
||||||
struct ConfigCmd cmd;
|
struct ConfigCmd cmd;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (mSensorState[handle].sensorType) {
|
if (mSensorState[handle].sensorType) {
|
||||||
mSensorState[handle].latency = delayNs;
|
mSensorState[handle].rate = period_ns_to_frequency_q10(sampling_period_ns);
|
||||||
|
|
||||||
initConfigCmd(&cmd, handle);
|
initConfigCmd(&cmd, handle);
|
||||||
|
|
||||||
ALOGI("queueSetDelay: sensor=%d, delay=%" PRId64, cmd.sensorType, delayNs);
|
ALOGI("queueSetDelay: sensor=%d, handle=%d, period=%" PRId64,
|
||||||
|
cmd.sensorType, handle, sampling_period_ns);
|
||||||
do {
|
do {
|
||||||
ret = write(mFd, &cmd, sizeof(cmd));
|
ret = write(mFd, &cmd, sizeof(cmd));
|
||||||
} while(ret != sizeof(cmd));
|
} while(ret != sizeof(cmd));
|
||||||
} else {
|
} else {
|
||||||
ALOGI("queueSetDelay: unhandled handle=%d, delay=%" PRId64, handle, delayNs);
|
ALOGI("queueSetDelay: unhandled handle=%d, period=%" PRId64, handle, sampling_period_ns);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void HubConnection::queueBatch(
|
void HubConnection::queueBatch(
|
||||||
int handle,
|
int handle,
|
||||||
__attribute__((unused)) int flags,
|
__attribute__((unused)) int flags,
|
||||||
int64_t sampling_period_ns,
|
nsecs_t sampling_period_ns,
|
||||||
int64_t max_report_latency_ns)
|
nsecs_t max_report_latency_ns)
|
||||||
{
|
{
|
||||||
struct ConfigCmd cmd;
|
struct ConfigCmd cmd;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (mSensorState[handle].sensorType) {
|
if (mSensorState[handle].sensorType) {
|
||||||
if (sampling_period_ns > 0 && mSensorState[handle].rate != SENSOR_RATE_ONCHANGE && mSensorState[handle].rate != SENSOR_RATE_ONESHOT)
|
if (sampling_period_ns > 0 &&
|
||||||
mSensorState[handle].rate = 1024000000000ULL / sampling_period_ns;
|
mSensorState[handle].rate != SENSOR_RATE_ONCHANGE &&
|
||||||
|
mSensorState[handle].rate != SENSOR_RATE_ONESHOT) {
|
||||||
|
mSensorState[handle].rate = period_ns_to_frequency_q10(sampling_period_ns);
|
||||||
|
}
|
||||||
mSensorState[handle].latency = max_report_latency_ns;
|
mSensorState[handle].latency = max_report_latency_ns;
|
||||||
|
|
||||||
initConfigCmd(&cmd, handle);
|
initConfigCmd(&cmd, handle);
|
||||||
|
|
||||||
ALOGI("queueBatch: sensor=%d, period=%" PRId64 ", latency=%" PRId64, cmd.sensorType, sampling_period_ns, max_report_latency_ns);
|
ALOGI("queueBatch: sensor=%d, handle=%d, period=%" PRId64 ", latency=%" PRId64,
|
||||||
|
cmd.sensorType, handle, sampling_period_ns, max_report_latency_ns);
|
||||||
do {
|
do {
|
||||||
ret = write(mFd, &cmd, sizeof(cmd));
|
ret = write(mFd, &cmd, sizeof(cmd));
|
||||||
} while(ret != sizeof(cmd));
|
} while(ret != sizeof(cmd));
|
||||||
} else {
|
} else {
|
||||||
ALOGI("queueBatch: unhandled handle=%d, period=%" PRId64 ", latency=%" PRId64, handle, sampling_period_ns, max_report_latency_ns);
|
ALOGI("queueBatch: unhandled handle=%d, period=%" PRId64 ", latency=%" PRId64,
|
||||||
|
handle, sampling_period_ns, max_report_latency_ns);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -952,7 +958,7 @@ void HubConnection::queueFlush(int handle)
|
|||||||
initConfigCmd(&cmd, handle);
|
initConfigCmd(&cmd, handle);
|
||||||
cmd.cmd = CONFIG_CMD_FLUSH;
|
cmd.cmd = CONFIG_CMD_FLUSH;
|
||||||
|
|
||||||
ALOGI("queueFlush: sensor=%d", cmd.sensorType);
|
ALOGI("queueFlush: sensor=%d, handle=%d", cmd.sensorType, handle);
|
||||||
do {
|
do {
|
||||||
ret = write(mFd, &cmd, sizeof(cmd));
|
ret = write(mFd, &cmd, sizeof(cmd));
|
||||||
} while(ret != sizeof(cmd));
|
} while(ret != sizeof(cmd));
|
||||||
|
|||||||
@@ -58,8 +58,8 @@ struct HubConnection : public Thread {
|
|||||||
void queueBatch(
|
void queueBatch(
|
||||||
int handle,
|
int handle,
|
||||||
int flags,
|
int flags,
|
||||||
int64_t sampling_period_ns,
|
nsecs_t sampling_period_ns,
|
||||||
int64_t max_report_latency_ns);
|
nsecs_t max_report_latency_ns);
|
||||||
|
|
||||||
void queueFlush(int handle);
|
void queueFlush(int handle);
|
||||||
|
|
||||||
@@ -83,6 +83,12 @@ protected:
|
|||||||
virtual void onFirstRef();
|
virtual void onFirstRef();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
typedef uint32_t rate_q10_t; // q10 means lower 10 bits are for fractions
|
||||||
|
|
||||||
|
static inline uint64_t period_ns_to_frequency_q10(nsecs_t period_ns) {
|
||||||
|
return 1024000000000ULL / period_ns;
|
||||||
|
}
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
CONFIG_CMD_DISABLE = 0,
|
CONFIG_CMD_DISABLE = 0,
|
||||||
@@ -96,7 +102,7 @@ private:
|
|||||||
{
|
{
|
||||||
uint32_t evtType;
|
uint32_t evtType;
|
||||||
uint64_t latency;
|
uint64_t latency;
|
||||||
uint32_t rate;
|
rate_q10_t rate;
|
||||||
uint8_t sensorType;
|
uint8_t sensorType;
|
||||||
uint8_t cmd;
|
uint8_t cmd;
|
||||||
uint16_t flags;
|
uint16_t flags;
|
||||||
@@ -111,7 +117,7 @@ private:
|
|||||||
|
|
||||||
struct SensorState {
|
struct SensorState {
|
||||||
uint64_t latency;
|
uint64_t latency;
|
||||||
uint32_t rate;
|
rate_q10_t rate;
|
||||||
uint8_t sensorType;
|
uint8_t sensorType;
|
||||||
uint8_t alt;
|
uint8_t alt;
|
||||||
uint8_t flushCnt;
|
uint8_t flushCnt;
|
||||||
|
|||||||
@@ -580,7 +580,7 @@ int SensorContext::setDelay(int handle, int64_t delayNs) {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((sensor.flags & 0xE) == SENSOR_FLAG_CONTINUOUS_MODE) {
|
if ((sensor.flags & REPORTING_MODE_MASK) == SENSOR_FLAG_CONTINUOUS_MODE) {
|
||||||
if ((delayNs/1000) < sensor.minDelay) {
|
if ((delayNs/1000) < sensor.minDelay) {
|
||||||
delayNsClamped = sensor.minDelay * 1000;
|
delayNsClamped = sensor.minDelay * 1000;
|
||||||
} else if ((delayNs/1000) > sensor.maxDelay) {
|
} else if ((delayNs/1000) > sensor.maxDelay) {
|
||||||
@@ -624,7 +624,7 @@ int SensorContext::batch(
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((sensor.flags & 0xE) == SENSOR_FLAG_CONTINUOUS_MODE) {
|
if ((sensor.flags & REPORTING_MODE_MASK) == SENSOR_FLAG_CONTINUOUS_MODE) {
|
||||||
if ((sampling_period_ns/1000) < sensor.minDelay) {
|
if ((sampling_period_ns/1000) < sensor.minDelay) {
|
||||||
sampling_period_ns_clamped = sensor.minDelay * 1000;
|
sampling_period_ns_clamped = sensor.minDelay * 1000;
|
||||||
} else if ((sampling_period_ns/1000) > sensor.maxDelay) {
|
} else if ((sampling_period_ns/1000) > sensor.maxDelay) {
|
||||||
|
|||||||
Reference in New Issue
Block a user