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 必須產生一個 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 何時可能會滿載。如果未正確設定這個值,CTS 就會失敗。針對一次性和特殊回報模式感應器,請將 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 (適用於一次性感應器)

SENSOR_FLAG_CONTINUOUS_MODE 適用於連續感應器 SENSOR_FLAG_ON_CHANGE_MODE 適用於變更時感應器 (鄰近感應器除外) SENSOR_FLAG_SPECIAL_REPORTING_MODE 適用於特殊回報模式的感應器 (傾斜偵測器除外)。

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
  • 感應器是否支援批次處理,取決於 fifoMaxEventCount 是否大於 0。(在先前版本中,此值是根據 batch() 的傳回值計算)。
  • 支援批次處理的各項感應器一向處於我們在先前版本中稱為「批次模式」的狀態:即使 max_report_latency_ns 參數為 0,感應器仍必須進行批次處理,也就是說,當 SoC 進入暫停模式時,事件必須儲存在 FIFO 中。
  • batch 函式的 flags 參數已不再使用。DRY_RUNWAKE_UPON_FIFO_FULL 已淘汰,且永遠不會傳遞至 batch 函式。
  • 批次逾時引數現在稱為 max_report_latency 引數。