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,请按照下面列出的更改进行操作。

实现批处理函数

即使您不实现批处理(您的硬件没有 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:此值很重要,您需要根据传感器及其驱动程序的功能进行设置。

此值仅为连续传感器和按需更改传感器定义。它是对应于此传感器支持的最低频率的两个传感器事件之间的延迟。当通过 batch 函数请求较低频率时,事件将以此频率生成。框架或应用程序可以使用它来估计批处理 FIFO 何时可能已满。对于单次触发和特殊报告模式传感器,请将 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 传感器,除了 proximity 传感器之外 SENSOR_FLAG_SPECIAL_REPORTING_MODE 用于具有 special 报告模式的传感器,除了 tilt detector 传感器之外。

SENSOR_FLAG_WAKE_UP | SENSOR_FLAG_ON_CHANGE_MODE 用于 proximity 传感器和 Android 官方 tilt detector 传感器。

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

  • 现在,即使对于不支持批量处理的传感器,batch 函数也几乎总是成功,而与超时参数的值无关。 batch 函数可能失败的唯一情况是内部错误、错误的 sensor_handle, 或负的 sampling_period_ns 或负的 max_report_latency_ns
  • 传感器是否支持批量处理取决于其 fifoMaxEventCount 是否大于 0。(在以前的版本中,它基于 batch() 的返回值。)
  • 支持批量处理的传感器始终处于我们在以前版本中称为“批量模式”的状态:即使 max_report_latency_ns 参数为 0,传感器也必须仍然是批量的,这意味着当 SoC 进入挂起模式时,事件必须存储在 FIFO 中。
  • batch 函数的 flags 参数不再使用。 DRY_RUNWAKE_UPON_FIFO_FULL 都已被弃用,并且永远不会传递给 batch 函数。
  • 批量超时参数现在称为 max_report_latency 参数。