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