Phiên bản HAL không được dùng nữa

Trong bản phát hành L của Android, chúng tôi đang tạm dừng hỗ trợ cho một số phiên bản HAL cảm biến. Các phiên bản được hỗ trợ duy nhất là SENSORS_DEVICE_API_VERSION_1_0SENSORS_DEVICE_API_VERSION_1_3 .

Trong các bản phát hành tiếp theo, chúng tôi có thể cũng sẽ ngừng hỗ trợ cho 1_0.

1_0 không có khái niệm phân khối. Nếu có thể, tất cả các thiết bị sử dụng 1_0 NÊN nâng cấp lên 1_3.

1_1 và 1_2 có định nghĩa kém về khái niệm phân khối và không được hỗ trợ nữa

Tất cả các thiết bị hiện đang sử dụng 1_1 hoặc 1_2 PHẢI nâng cấp lên 1_3.

Trong 1_3, chúng tôi đã đơn giản hóa khái niệm phân khối và giới thiệu các cảm biến đánh thức.

Để nâng cấp lên 1_3, hãy thực hiện theo các thay đổi được liệt kê bên dưới.

Thực hiện chức năng hàng loạt

Ngay cả khi bạn không triển khai tính năng bó (phần cứng của bạn không có FIFO), bạn vẫn phải triển khai chức năng batch . batch được sử dụng để đặt khoảng thời gian lấy mẫu và độ trễ báo cáo tối đa cho một cảm biến nhất định. Nó thay thế setDelay . setDelay sẽ không được gọi nữa.

Nếu không triển khai tính năng theo đợt, bạn có thể triển khai batch bằng cách gọi hàm setDelay hiện có bằng tham số sampling_period_ns được cung cấp.

Thực hiện chức năng tuôn ra

Ngay cả khi bạn không triển khai batching, bạn vẫn phải triển khai chức năng flush .

Nếu bạn không triển khai tính năng theo đợt, flush phải tạo một sự kiện META_DATA_FLUSH_COMPLETE và trả về 0 (thành công).

Thay đổi cảm biến_poll_device_t.common.version của bạn

your_poll_device.common.version = SENSORS_DEVICE_API_VERSION_1_3

Thêm các trường mới vào định nghĩa cảm biến của bạn

Khi xác định từng cảm biến, ngoài các trường cảm biến_t ​​thông thường:

.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,

bạn cũng phải đặt các trường mới, được xác định trong khoảng từ 1_0 đến 1_3:

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

fifoReservedEventCount : Nếu không triển khai tính năng tạo khối, hãy đặt giá trị này thành 0.

fifoMaxEventCount : Nếu không triển khai batching, hãy đặt giá trị này thành 0

stringType : Đặt thành 0 cho tất cả các cảm biến chính thức của Android (những cảm biến được xác định trong cảm biến.h), vì giá trị này sẽ bị khung ghi đè. Đối với các cảm biến không chính thức, hãy xem cảm biến_t ​​để biết chi tiết về cách đặt cảm biến.

requirePermission : Đây là quyền mà các ứng dụng sẽ bắt buộc phải có để có quyền truy cập vào cảm biến của bạn. Bạn thường có thể đặt giá trị này thành 0 cho tất cả cảm biến của mình nhưng cảm biến có loại HEART_RATE phải đặt giá trị này thành SENSOR_PERMISSION_BODY_SENSORS.

maxDelay : Giá trị này rất quan trọng và bạn sẽ cần đặt nó theo khả năng của cảm biến và trình điều khiển của nó.

Giá trị này chỉ được xác định cho các cảm biến liên tục và thay đổi. Đó là độ trễ giữa hai sự kiện cảm biến tương ứng với tần số thấp nhất mà cảm biến này hỗ trợ. Khi tần số thấp hơn được yêu cầu thông qua chức năng batch , thay vào đó, các sự kiện sẽ được tạo ở tần số này. Nó có thể được khung hoặc ứng dụng sử dụng để ước tính thời điểm lô FIFO có thể đầy. Nếu giá trị này không được đặt đúng, CTS sẽ thất bại. Đối với cảm biến chế độ báo cáo một lần và chế độ báo cáo đặc biệt, hãy đặt maxDelay thành 0.

Đối với các cảm biến liên tục, hãy đặt nó ở khoảng thời gian lấy mẫu tối đa được phép tính bằng micro giây.

Những điều sau đây có thể áp dụng cho period_ns , maxDelayminDelay :

  • period_ns tính bằng nano giây trong khi maxDelay / minDelay tính bằng micro giây.
  • maxDelay phải luôn vừa với số nguyên có dấu 32 bit. Nó được khai báo là 64-bit trên kiến ​​trúc 64-bit chỉ vì lý do tương thích nhị phân.

flags : Trường này xác định chế độ báo cáo của cảm biến và liệu cảm biến có phải là cảm biến đánh thức hay không.

Nếu bạn không triển khai tính năng theo đợt và chỉ chuyển từ 1.0 sang 1.3, hãy đặt giá trị này thành:

SENSOR_FLAG_WAKE_UP | SENSOR_FLAG_ONE_SHOT_MODE cho cảm biến một lần chụp

SENSOR_FLAG_CONTINUOUS_MODE dành cho cảm biến liên tục SENSOR_FLAG_ON_CHANGE_MODE dành cho cảm biến thay đổi ngoại trừ độ gần SENSOR_FLAG_SPECIAL_REPORTING_MODE dành cho cảm biến có chế độ báo cáo đặc biệt ngoại trừ bộ phát hiện độ nghiêng .

SENSOR_FLAG_WAKE_UP | SENSOR_FLAG_ON_CHANGE_MODE cho cảm biến tiệm cận và cảm biến phát hiện độ nghiêng chính thức của Android.

Những lưu ý khi nâng cấp từ 1_1 hoặc 1_2

  • Chức năng batch hiện nay gần như luôn thành công, ngay cả đối với các cảm biến không hỗ trợ bó, không phụ thuộc vào giá trị của đối số hết thời gian chờ. Các trường hợp duy nhất mà chức năng batch có thể không thành công là lỗi nội bộ hoặc sensor_handle, không tốt hoặc lấy sampling_period_ns hoặc max_report_latency_ns âm.
  • Liệu một cảm biến có hỗ trợ tạo khối hay không được xác định bằng việc nó có fifoMaxEventCount lớn hơn 0 hay không. (Trong các phiên bản trước, giá trị này dựa trên giá trị trả về của batch() .)
  • Các cảm biến hỗ trợ phân nhóm luôn ở chế độ mà chúng tôi gọi là “chế độ hàng loạt” trong các phiên bản trước: ngay cả khi tham số max_report_latency_ns là 0, cảm biến vẫn phải được phân nhóm, nghĩa là các sự kiện phải được lưu trữ trong FIFO khi SoC chuyển sang chế độ tạm dừng .
  • Tham số flags của hàm batch không được sử dụng nữa. DRY_RUNWAKE_UPON_FIFO_FULL đều không được dùng nữa và sẽ không bao giờ được chuyển sang hàm batch .
  • Đối số hết thời gian chờ hàng loạt hiện được gọi là đối số max_report_latency .