HAL 版本弃用

在 Android L 版本中,我们将停止对某些传感器 HAL 版本的支持,仅支持 SENSORS_DEVICE_API_VERSION_1_0 SENSORS_DEVICE_API_VERSION_1_3 版本。

在后面的版本中,我们也可能会停止对 1_0 的支持。

1_0 没有批处理的概念。如果条件允许,所有使用 1_0 的设备都应升级到 1_3。

1_1 和 1_2 都没有充分定义批处理概念,并且不再受支持

目前使用 1_1 或 1_2 的所有设备都必须升级到 1_3。

在 1_3 中,我们简化了批处理的概念并引入了唤醒传感器。

要升级到 1_3,请按照下文所列更改执行操作。

实现 batch 函数

即使您没有实施批处理(您的硬件没有 FIFO),您也必须实现 batch 函数。batch 用于设置指定传感器的采样周期和最大报告延迟时间。它可以取代 setDelaysetDelay 将不再得到调用。

如果您不实施批处理,则可以利用提供的 sampling_period_ns 参数通过仅调用现有的 setDelay 函数来实现 batch

实现 Flush 函数

即使不实施批处理,也必须实现 flush 函数。

如果不实施批处理,则 flush 必须生成一个 META_DATA_FLUSH_COMPLETE 事件并返回 0(成功)。

更改 sensors_poll_device_t.common.version

your_poll_device.common.version = SENSORS_DEVICE_API_VERSION_1_3

在传感器定义中添加新字段

定义每个传感器时,除了以下常规 sensor_t 字段外:

.name =       "My magnetic field Sensor",
.vendor =     "My company",
.version
=    1,
.handle =     mag_handle,
.type =       SENSOR_TYPE_MAGNETIC_FIELD,
.maxRange =   200.0f,
.resolution = CONVERT_M,
.power =      5.0f,
.minDelay =
 16667,

您还必须设置在 1_0 和 1_3 之间定义的新字段:

.fifoReservedEventCount = 0,
.fifoMaxEventCount =   0,
.stringType =         0,
.requiredPermission = 0,
.maxDelay =      200000
.flags =
SENSOR_FLAG_CONTINUOUS_MODE,

fifoReservedEventCount:如果不实施批处理,请将此字段设置为 0。

fifoMaxEventCount:如果不实施批处理,请将此字段设置为 0。

stringType:针对所有官方 Android 传感器(在 sensors.h 中定义的传感器),请将此字段设置为 0,因为该值会被框架覆盖。对于非官方传感器,请参阅 sensor_t,详细了解如何对其进行设置。

requiredPermission:这是应用访问传感器所必备的权限。通常情况下,您可以针对所有传感器将此字段设置为 0;但对于类型为 HEART_RATE 的传感器,则必须将此字段设置为 SENSOR_PERMISSION_BODY_SENSORS.

maxDelay:这个值很重要,您将需要根据传感器及其驱动程序的功能对此字段进行设置。

仅对连续 (continuous) 和中断 (on-change) 模式下的传感器定义此值。此值是两个传感器事件之间的延迟时间,其中传感器事件对应传感器支持的最低频率。当通过 batch 函数请求较低的频率时,将以该频率生成事件。框架或应用可以用它来预测批处理 FIFO 可能存满的时间。如果此值设置不正确,CTS 将失败。对于单次 (one-shot) 和特殊 (special) 报告模式下的传感器,请将 maxDelay 设置为 0。

对于连续模式下的传感器,请将此字段设置为允许的最大采样周期(以微秒为单位)。

以下内容适用于 period_nsmaxDelayminDelay

  • period_ns 以纳秒为单位,而 maxDelay/minDelay 以微秒为单位。
  • maxDelay 应始终是 32 位的带符号整数。仅出于二进制兼容性原因,才允许在 64 位架构上将其声明为 64 位整数。

flags:该字段会定义传感器的报告模式以及传感器是否为唤醒传感器。

如果您不实施批处理,只是从 1.0 升级到 1.3,请将此字段设置为:

SENSOR_FLAG_WAKE_UP | SENSOR_FLAG_ONE_SHOT_MODE - 单次 (one-shot) 模式下的传感器

SENSOR_FLAG_CONTINUOUS_MODE - 连续 (continuous) 模式下的传感器;SENSOR_FLAG_ON_CHANGE_MODE - 中断 (on-change) 模式下的传感器(近程传感器除外);SENSOR_FLAG_SPECIAL_REPORTING_MODE - 特殊 (special) 报告模式下的传感器(倾斜探测器传感器除外)。

SENSOR_FLAG_WAKE_UP | SENSOR_FLAG_ON_CHANGE_MODE - 近程传感器和 Android 官方倾斜探测器传感器。

从 1_1 或 1_2 升级时的注意事项

  • 现在,即使是不支持批处理的传感器,batch 函数几乎也总能成功,而且不受超时参数值的影响。可能导致 batch 函数失败的情形仅包括:内部错误、sensor_handle, 不良、sampling_period_ns 值为负或 max_report_latency_ns 值为负。
  • 传感器是否支持批处理取决于它是否具有大于 0 的 fifoMaxEventCount 。(在以前的版本中,它是以 batch() 的返回值为依据。)
  • 支持批处理的传感器在以前的版本中始终处于“批处理模式”:即使 max_report_latency_ns 参数为 0,仍必须对传感器进行批处理操作,这意味着当 SoC 进入挂起模式时,事件必须存储在 FIFO 中。
  • 将不再使用 batch 函数的 flags 参数。DRY_RUNWAKE_UPON_FIFO_FULL 两者都已弃用,将永远不会被传递给 batch 函数。
  • 批处理超时参数现称为 max_report_latency 参数。