筛选以前版本 (数据)
为了优化数据吞吐量,传感器设备必须将筛选器条件应用于数据更新事件,以便仅在需要时引发这些事件。 此筛选会导致 CPU 使用率降低 (,因为传感器和 CPU) 的传感器吞吐量降低) 和更少的 (能耗。
有两个值 (或属性) 支持传感器设备的筛选器条件。 第一个是当前报告间隔 (CRI) ,第二个是更改敏感度 (CS) 。 这两个属性都可以由传感器应用程序设置。
当前报告间隔是客户端希望在发生有意义的更改时接收的数据更新之间的最小时间段(以毫秒为单位)。 更改敏感度是用于指定有意义的更改的值 (或百分比) 。
因此,气象站应用程序可以为 60,000 (或 1 分钟) 的温度传感器指定当前报告间隔 (CRI) 。 而且,温度传感器需要更改敏感度值 (,而不是) 百分比。 例如,如果此温度传感器返回摄氏度,而变化敏感度值温度为 2.0,则此特定传感器只会在温度增加或减少时,在请求的报告间隔内提高 2.0 摄氏度,在本例中, (一分钟) 。
环境光传感器 (ALS) 是需要将更改敏感度指定为百分比的传感器示例。 例如,如果 Illuminance 的更改敏感度值为 2.0,则此传感器会将该值解释为百分比,并且仅当 LUX 值已删除或增加 2% 时,才会引发数据更新事件。
下表列出了六个常见传感器、与每个传感器关联的数据以及相应的更改敏感度。
传感器 | Datafield | 更改敏感度值 |
---|---|---|
光传感器 | 莱克丝 | 照度变化百分比 |
加速计 | 加速 X | 加速 G 力 |
加速 Y | 加速 G 力 | |
加速 Z | 加速 G 力 | |
3D 陀螺仪 | Angular速度 X | 每秒Angular速度 (度) |
Angular速度 Y | 每秒Angular速度 (度) | |
Angular速度 Z | 每秒Angular速度 (度) | |
指南针 | 磁北标题 | 度 |
True North Heading | 度 | |
测斜仪 | Yaw | 度 |
音调 | 度 | |
Roll | 度 | |
设备方向 | 四元 | 度移动 |
旋转矩阵 | 度移动 |
下表列出了建议的当前报告间隔 (CRI) 默认值。
传感器类型 | 建议的默认报告间隔 |
---|---|
环境光 | 5000 |
加速计 | 100 |
陀螺测试仪 | 100 |
指南针 | 100 |
测斜仪 | 50 |
方向 | 50 |
下表列出了建议的更改敏感度 (CS) 默认值。
传感器类型 | 建议的默认更改敏感度 |
---|---|
环境光 | 50 |
加速计 | 0.02 |
陀螺测试仪 | 0.50 |
指南针 | 0.20 |
测斜仪 | 0.50 |
方向 | 0.50 |
更改测斜仪和方向传感器的敏感度 (CS)
应将测斜仪和方向传感器的敏感度计算为两个四元数之间的角度。 从数学上讲,这表示为:
2*cos⁻ー (dot product (q1, q2) )
此计算可确保各种平板电脑 (或设备) 方向的一致性。
有效的当前报告间隔 (CRI) 和更改敏感度 (CS)
多个应用程序可以同时设置当前报告间隔 (CRI) 和给定传感器的更改敏感度 (CS) 属性。 驱动程序负责确定哪些请求的属性适用。 驱动程序设置的属性称为有效当前Report-Interval (E-CRI) 和有效Change-Sensitivity (E-CS) 。
为客户端应用程序设置 E-CRI 和 E-CS
每当客户端应用程序与传感器建立连接时,驱动程序都需要设置 E-CRI 和 E-CS 值。 这些值存储在所谓的客户端容器中。 下表列出了传感器驱动程序支持的六种方法,并指定驱动程序应对其客户端容器和 E-CRI 和 E-CS 属性执行的操作。
感兴趣的事件 | 事件处理程序活动 |
ISensorDriver::OnClientConnect | 将客户端项添加到客户端容器 根据需要读取默认 CRI 和 CS 值,存储在客户端容器中 |
ISensorDriver::OnClientDisconnect | 从客户端容器中删除客户端,并根据其余客户端设置 E-CRI 和 E-CS |
ISensorDriver::OnClientSubscribeToEvents | 更新“订阅事件”字段 - (设置为有关传感器的真实) 。 打开来自传感器的事件报告。 |
ISensorDriver::OnClientUnSubscribeToEvents | 更新“订阅事件”字段 – (设置为有关传感器的 false) 。 如果没有订阅者保留,请关闭来自设备的事件报告。 |
ISensorDriver::OnSetProperties | 如果设置了 CS 或 CRI 属性,请更新相应的客户端容器字段。 |
IFileCallbackCleanup::OnCleanupFile | 客户端已崩溃或停止响应。 应从客户端容器中删除客户端。 |
下表表示具有 4 个连接的客户端应用程序的 3D 加速计客户端容器。 其中两个客户端应用 (对应于第 2 行和第 4 行) 订阅事件。
客户端文件句柄 | 订阅事件 | CRI | CS (X) | CX (Y) | CS (Z) |
---|---|---|---|---|---|
FF80A267 | FALSE | 50 | .001 | .001 | .001 |
FF802489 | TRUE | 70 | .02 | .02 | .02 |
FF80D345 | FALSE | 15 | Null | Null | Null |
FF803287 | TRUE | 100 | .005 | .005 | .005 |
驱动程序评估此组连接的客户端后,它为 E-CRI 和 E-CS 选择了以下值:
- E-CRI:70 毫秒
- E-CS 值: (可以使用最小阈值) 折叠为单个值
- X:.005
- Y:.005
- Z:.005
请注意,在此示例中,没有事件接收器集的客户端 (第一行和第三行) 被忽略,因为事件筛选不适用于这些客户端。
通过评估 E-CRI、E-CS) 的有效 CRI 和 CS (值来筛选数据更新事件
确定当前 E-CRI 和 E-CS 值并更新为传感器连接状态更改后,传感器设备将使用这些值来筛选引发到连接的客户端应用程序的事件。 这些值与“当前”数据值 () 与以前的数据值 () 之间的差异进行比较。 如果 E-CS 值已超过等于或大于 E-CRI 的时间段,则仅当引发数据事件时,才应引发数据事件。 唯一的例外是应用默认值 () 时传感器设备启动,以便客户端可以接收正确的通知。
下图演示了如何评估原始传感器数据的时间筛选,以确定何时应引发数据事件。
在上图中,图表下半部分的红色数据表示原始传感器数据。 绿线表示将返回到轮询数据的客户端的数据, (实现此行为) 的方法之一,以及触发数据事件时表示的“X”值。 蓝线是 E-CS 边界的阈值, (+/- E-CS 相对于最后一个数据事件值) 。
通过实现此事件筛选逻辑,可以大幅减少数据更新事件的数量,当传感器数据发生有意义的更改时,应用程序仍会收到通知。
数据筛选的设备运行时优化
本部分介绍在开发传感器驱动程序时应考虑的多个运行时优化。
支持中断
驱动程序应依赖于中断,而不是轮询设备。 这将导致性能和电源管理改进。 这些改进包括以下内容。
- 设备可以根据当前更改敏感度和报告间隔输入较低的电源状态。
- 使用中断可减少驱动程序和传感器固件中不必要的代码执行。
- 使用中断将减少总线活动。
注意 如果驱动程序依赖于中断,但驱动程序中存在当前报告间隔和更改敏感度逻辑,则驱动程序可能会在数据更新之间收到大量中断。 因此,驱动程序可能需要禁用 (或屏蔽) 中断,直到当前报告间隔过期。
将更改敏感度支持移动到设备
如果传感器硬件或固件支持阈值检测,则应使用此功能来支持更改敏感度。 通过将支持移动到设备,然后响应相应的中断,可以减少驱动程序中的处理开销。
将报表间隔支持移动到设备
如果传感器硬件或固件支持报表间隔的概念,则应使用此功能。
如果传感器不提供本机报表间隔支持,请考虑为当前报表间隔的子集禁用中断。 然后,此时间过后,检索当前设备数据。