Trong bản phát hành L của Android, chúng tôi sẽ ngừng hỗ trợ một số phiên bản HAL cảm biến. Các phiên bản duy nhất được hỗ trợ là SENSORS_DEVICE_API_VERSION_1_0
và SENSORS_DEVICE_API_VERSION_1_3
.
Trong các bản phát hành tiếp theo, chúng tôi cũng có thể ngừng hỗ trợ phiên bản 1_0.
1_0 không có khái niệm về tính năng xử lý hàng loạt. Nếu có thể, tất cả thiết bị sử dụng 1_0 PHẢI cập nhật lên 1_3.
1_1 và 1_2 bị định nghĩa không rõ ràng về khái niệm xử lý hàng loạt và không còn được hỗ trợ nữa
Tất 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 phiên bản 1_3, chúng tôi đã đơn giản hoá khái niệm về tính năng xử lý hàng loạt và giới thiệu cảm biến đánh thức.
Để nâng cấp lên phiên bản 1_3, hãy làm theo các thay đổi được liệt kê bên dưới.
Triển khai hàm xử lý hàng loạt
Ngay cả khi không triển khai tính năng xử lý hàng loạt (phần cứng của bạn không có FIFO), bạn vẫn phải triển khai hàm batch
. batch
được 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. Phương thức này thay thế setDelay
. setDelay
sẽ không được gọi nữa.
Nếu không triển khai tính năng xử lý hàng loạt, bạn có thể triển khai batch
bằng cách chỉ cần gọi hàm setDelay
hiện có với tham số sampling_period_ns
được cung cấp.
Triển khai hàm xả
Ngay cả khi không triển khai tính năng xử lý hàng loạt, bạn vẫn phải triển khai hàm flush
.
Nếu bạn không triển khai tính năng xử lý hàng loạ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 sensors_poll_device_t.common.version
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ủa cảm biến
Khi xác định từng cảm biến, ngoài các trường sensor_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 xử lý hàng loạt, hãy đặt giá trị này thành 0.
fifoMaxEventCount: Nếu không triển khai tính năng xử lý hàng loạt, hãy đặt giá trị này thành 0
stringType: Đặt thành 0 cho tất cả cảm biến Android chính thức (những cảm biến được xác định trong sensors.h), vì khung sẽ ghi đè giá trị này. Đối với các cảm biến không chính thức, hãy xem sensor_t để biết thông tin chi tiết về cách thiết lập.
requiredPermission: Đây là quyền mà các ứng dụng bắt buộc phải có để truy cập vào cảm biến của bạn. Thông thường, bạn có thể đặt giá trị này thành 0 cho tất cả cảm biến, 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 cần đặt giá trị này theo khả năng của cảm biến và trình điều khiển của cảm biến.
Giá trị này chỉ được xác định cho các cảm biến liên tục và thay đổi. Đây 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 hàm batch
, các sự kiện sẽ được tạo ở tần số này. Khung hoặc ứng dụng có thể sử dụng thông tin này để ước tính thời điểm hàng đợi FIFO theo lô có thể đầy. Nếu bạn không đặt giá trị này đúng cách, CTS sẽ không thành công.
Đối với cảm biến chế độ báo cáo đặc biệt và một lần, hãy đặt maxDelay
thành 0.
Đối với cảm biến liên tục, hãy đặt giá trị này thành khoảng thời gian lấy mẫu tối đa được phép tính bằng micro giây.
Sau đây là các nội dung áp dụng cho period_ns
, maxDelay
và minDelay
:
period_ns
tính bằng nano giây cònmaxDelay
/minDelay
tính bằng micrô giây.maxDelay
phải luôn nằm trong một số nguyên 32 bit đã ký. Tệp này chỉ được khai báo là 64 bit trên kiến trúc 64 bit vì lý do tương thích nhị phân.
cờ: 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 xử lý hàng loạt và chỉ chuyển từ phiên bản 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
SENSOR_FLAG_CONTINUOUS_MODE
đối với cảm biến liên tục, SENSOR_FLAG_ON_CHANGE_MODE
đối với cảm biến thay đổi, ngoại trừ cảm biến gần, SENSOR_FLAG_SPECIAL_REPORTING_MODE
đối với cảm biến có chế độ báo cáo đặc biệt, ngoại trừ trình phát hiện độ nghiêng.
SENSOR_FLAG_WAKE_UP | SENSOR_FLAG_ON_CHANGE_MODE
cho cảm biến độ gần và cảm biến trình phát hiện độ nghiêng chính thức của Android.
Lưu ý khi nâng cấp từ phiên bản 1_1 hoặc 1_2
- Hàm
batch
hiện gần như luôn thành công, ngay cả đối với các cảm biến không hỗ trợ tính năng xử lý hàng loạt, độc lập với giá trị của đối số thời gian chờ. Các trường hợp duy nhất mà hàmbatch
có thể không thành công là lỗi nội bộ hoặcsensor_handle,
không hợp lệ hoặcsampling_period_ns
âm hoặcmax_report_latency_ns
âm. - Việc cảm biến có hỗ trợ tính năng xử lý hàng loạt hay không được xác định bằng việc cảm biế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ủabatch()
.) - Các cảm biến hỗ trợ tính năng xử lý hàng loạt 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 xử lý hàng loạt, nghĩa là các sự kiện phải được lưu trữ trong FIFO khi SoC chuyển sang chế độ tạm ngưng. - Tham số
flags
của hàmbatch
không còn được sử dụng nữa.DRY_RUN
vàWAKE_UPON_FIFO_FULL
đều không được dùng nữa và sẽ không bao giờ được truyền vào hàmbatch
. - Đối số thời gian chờ hàng loạt hiện được gọi là đối số
max_report_latency
.