Google cam kết thúc đẩy công bằng chủng tộc cho Cộng đồng người da đen. Xem cách thực hiện.

Cảm biến HAL 1.0

Giao diện cảm biến HAL, khai báo trong sensors.h , đại diện cho giao diện giữa Android khuôn khổ và các phần mềm phần cứng cụ thể. Việc triển khai HAL phải xác định từng chức năng được khai báo trong các cảm biến.h. Các chức năng chính là:

  • get_sensors_list - Trả về danh sách của tất cả các cảm biến.
  • activate - Bắt đầu hoặc dừng lại một cảm biến.
  • batch - Thiết lập các thông số của cảm biến như lấy mẫu tần số và độ trễ báo cáo tối đa.
  • setDelay - Chỉ được sử dụng trong HAL phiên bản 1.0. Đặt tần số lấy mẫu cho một cảm biến nhất định.
  • flush - sẽ xóa FIFO của cảm biến quy định và báo cáo một sự kiện hoàn toàn tuôn ra khi điều này được thực hiện.
  • poll - Trả kiện cảm biến có sẵn.

Việc triển khai phải an toàn cho luồng và cho phép các hàm này được gọi từ các luồng khác nhau.

Giao diện cũng xác định một số kiểu được sử dụng bởi các chức năng đó. Các loại chính là:

  • sensors_module_t
  • sensors_poll_device_t
  • sensor_t
  • sensors_event_t

Ngoài các phần bên dưới, xem sensors.h để biết thêm thông tin về các loại.

get_sensors_list (danh sách)

int (*get_sensors_list)(struct sensors_module_t* module, struct sensor_t
  const** list);

Cung cấp danh sách các cảm biến do HAL triển khai. Xem sensor_t để biết chi tiết về cách các cảm biến được định nghĩa.

Thứ tự mà các cảm biến xuất hiện trong danh sách là thứ tự mà các cảm biến sẽ được báo cáo cho các ứng dụng. Thông thường, các cảm biến cơ sở xuất hiện đầu tiên, tiếp theo là các cảm biến hỗn hợp.

Nếu một số cảm biến chia sẻ cùng một loại cảm biến và thuộc tính đánh thức, thì cảm biến đầu tiên trong danh sách được gọi là cảm biến "mặc định". Đây là một trở bởi getDefaultSensor(int sensorType, bool wakeUp) .

Hàm này trả về số lượng cảm biến trong danh sách.

kích hoạt (cảm biến, true / false)

int (*activate)(struct sensors_poll_device_t *dev, int sensor_handle, int
  enabled);

Kích hoạt hoặc hủy kích hoạt cảm biến.

sensor_handle là handle của cảm biến để kích hoạt / tắt. Xử lý của một bộ cảm biến được xác định bởi handle lĩnh vực của nó sensor_t cấu trúc.

enabled được thiết lập để 1 để cho phép hoặc từ 0 đến vô hiệu hóa các cảm biến.

Cảm biến One-shot tắt tự động khi nhận được một sự kiện, và họ vẫn phải chấp nhận để bị ngừng hoạt động thông qua một cuộc gọi đến activate(..., enabled=0) .

Cảm biến không đánh thức không bao giờ ngăn SoC chuyển sang chế độ tạm ngừng; nghĩa là, HAL sẽ không giữ một phần khóa đánh thức thay mặt cho các ứng dụng.

Cảm biến đánh thức, khi phân phối các sự kiện liên tục, có thể ngăn SoC chuyển sang chế độ tạm ngừng, nhưng nếu không có sự kiện nào cần được phân phối, khóa đánh thức một phần phải được giải phóng.

Nếu enabled là 1 và các cảm biến đã được kích hoạt, chức năng này là một không-op và thành công.

Nếu enabled là 0 và các cảm biến đã được ngừng hoạt động, chức năng này là một không-op và thành công.

Hàm này trả về 0 khi thành công và một số lỗi âm nếu không.

lô (cảm biến, cờ, khoảng thời gian lấy mẫu, độ trễ báo cáo tối đa)

int (*batch)(
     struct sensors_poll_device_1* dev,
     int sensor_handle,
     int flags,
     int64_t sampling_period_ns,
     int64_t max_report_latency_ns);

Thiết lập các thông số của cảm biến, bao gồm lấy mẫu tần sốbáo cáo độ trễ tối đa . Chức năng này có thể được gọi trong khi cảm biến được kích hoạt, trong trường hợp đó, nó không được làm mất bất kỳ phép đo cảm biến nào: Việc chuyển đổi từ tốc độ lấy mẫu này sang tốc độ lấy mẫu khác không thể gây ra các sự kiện bị mất, cũng như không thể chuyển từ độ trễ báo cáo tối đa cao xuống thấp độ trễ báo cáo tối đa.

sensor_handle là handle của cảm biến để cấu hình.

flags hiện không sử dụng.

sampling_period_ns là thời gian lấy mẫu mà tại đó các cảm biến nên chạy, trong nano giây. Xem sampling_period_ns để biết thêm chi tiết.

max_report_latency_ns là thời gian tối đa mà các sự kiện có thể bị trì hoãn trước khi được báo cáo thông qua HAL, trong nano giây. Xem max_report_latency_ns đoạn để biết thêm chi tiết.

Hàm này trả về 0 khi thành công và một số lỗi âm nếu không.

setDelay (cảm biến, khoảng thời gian lấy mẫu)

int (*setDelay)(
     struct sensors_poll_device_t *dev,
     int sensor_handle,
     int64_t sampling_period_ns);

Sau phiên bản HAL 1.0, hàm này không được dùng nữa và không bao giờ được gọi. Thay vào đó, batch chức năng được gọi là để thiết lập sampling_period_ns tham số.

Trong HAL phiên bản 1.0, setDelay được sử dụng thay cho hàng loạt để thiết lập sampling_period_ns .

tuôn ra (cảm biến)

int (*flush)(struct sensors_poll_device_1* dev, int sensor_handle);

Thêm một sự kiện hoàn toàn tuôn ra đến hết FIFO phần cứng cho bộ cảm biến định và xóa các FIFO; những sự kiện đó được phân phối như bình thường (tức là: như thể độ trễ báo cáo tối đa đã hết hạn) và bị xóa khỏi FIFO.

Quá trình xả xảy ra không đồng bộ (nghĩa là: hàm này phải trả về ngay lập tức). Nếu quá trình triển khai sử dụng một FIFO duy nhất cho một số cảm biến, FIFO đó sẽ được xóa và sự kiện hoàn thành xả chỉ được thêm vào cho cảm biến được chỉ định.

Nếu cảm biến định không có FIFO (không đệm có thể), hoặc nếu FIFO, hoàn toàn trống rỗng tại thời điểm cuộc gọi, flush vẫn phải thành công và gửi một sự kiện hoàn toàn tuôn ra cho cảm biến đó. Điều này áp dụng cho tất cả các cảm biến không phải là cảm biến chụp một lần.

Khi flush được gọi là, ngay cả khi một sự kiện tuôn ra là đã có trong FIFO cho cảm biến đó, là một bổ sung phải được tạo ra và thêm vào cuối của FIFO, và FIFO phải được xối rửa. Số lượng flush các cuộc gọi phải bằng số sự kiện hoàn toàn tuôn ra tạo ra.

flush không áp dụng cho một-shot cảm biến; nếu sensor_handle đề cập đến một cảm biến one-shot, flush phải trả lại -EINVAL và không tạo ra bất kỳ sự kiện siêu dữ liệu hoàn chỉnh tuôn ra.

Chức năng này trở về 0 nếu thành công, -EINVAL nếu bộ cảm biến định là một bộ cảm biến one-shot hoặc không được kích hoạt, và một số lỗi tiêu cực khác.

thăm dò ý kiến ​​()

int (*poll)(struct sensors_poll_device_t *dev, sensors_event_t* data, int
  count);

Returns một loạt các dữ liệu cảm biến bằng cách điền vào các data tham số. Chức năng này phải chặn cho đến khi có sự kiện. Nó sẽ trả về số sự kiện được đọc khi thành công hoặc số lỗi âm trong trường hợp có lỗi.

Số sự kiện trả lại trong data phải nhỏ hoặc tương đương với count đối số. Hàm này sẽ không bao giờ trả về 0 (không có sự kiện).

Trình tự cuộc gọi

Khi khởi động thiết bị, get_sensors_list được gọi.

Khi một bộ cảm biến được kích hoạt, batch chức năng sẽ được gọi với các thông số yêu cầu, tiếp theo là activate(..., enable=1) .

Lưu ý rằng trong HAL phiên bản 1_0, thứ tự là ngược lại: activate được gọi là đầu tiên, tiếp theo là set_delay .

Khi những đặc điểm yêu cầu của một bộ cảm biến đang thay đổi khi nó được kích hoạt, batch hàm được gọi.

flush có thể được gọi bất cứ lúc nào, ngay cả trên bộ cảm biến không kích hoạt (trong trường hợp này nó phải trả lại -EINVAL )

Khi một bộ cảm biến được kích hoạt, activate(..., enable=0) sẽ được gọi.

Song song với những cuộc gọi, các poll chức năng sẽ được gọi nhiều lần để dữ liệu theo yêu cầu. poll có thể được gọi ngay cả khi không cảm biến được kích hoạt.

sensor_module_t

sensors_module_t là loại dùng để tạo ra các mô-đun phần cứng Android cho các cảm biến. Việc thực hiện HAL phải xác định một đối tượng HAL_MODULE_INFO_SYM thuộc loại này để vạch trần get_sensors_list chức năng. Xem định nghĩa của sensors_module_t trong sensors.h và định nghĩa của hw_module_t để biết thêm thông tin.

cảm biến_poll_device_t / cảm biến_poll_device_1_t

sensors_poll_device_1_t chứa phần còn lại của các phương pháp định nghĩa ở trên: activate , batch , flushpoll . Nó common lĩnh vực (loại hw_device_t ) xác định số phiên bản của HAL.

sensor_t

sensor_t đại diện cho một cảm biến Android . Dưới đây là một số lĩnh vực quan trọng của nó:

tên: Một chuỗi do người dùng có thể nhìn thấy đại diện cho cảm biến. Chuỗi này thường chứa tên bộ phận của cảm biến bên dưới, loại cảm biến và liệu nó có phải là cảm biến đánh thức hay không. Ví dụ: “Gia tốc kế LIS2HH12”, “Con quay hồi chuyển không hiệu chỉnh MAX21000”, “Phong vũ biểu đánh thức BMP280”, “Véc tơ quay trò chơi MPU6515”

xử lý: Các số nguyên sử dụng để tham khảo các cảm biến khi đăng ký để nó hoặc tạo ra các sự kiện từ nó.

gõ: Các loại cảm biến. Xem giải thích về loại cảm biến trong cảm biến Android là gì? để biết thêm chi tiết và xem các loại cảm biến với nhiều loại cảm biến chính thức. Đối với các loại cảm biến không chính thức, type phải bắt đầu với SENSOR_TYPE_DEVICE_PRIVATE_BASE

stringType: Các loại cảm biến như là một chuỗi. Khi cảm biến có một loại chính thức, thiết lập để SENSOR_STRING_TYPE_* . Khi cảm biến có một kiểu cụ thể nhà sản xuất, stringType phải bắt đầu với các nhà sản xuất tên miền ngược. Ví dụ, một bộ cảm biến (nói một máy dò kỳ lân) được xác định bởi nhóm Cool-sản phẩm tại hư cấu-Công ty có thể sử dụng stringType=”com.fictional_company.cool_product.unicorn_detector” . Các stringType được sử dụng để nhận diện cảm biến loại phi chính thức. Xem sensors.h để biết thêm thông tin về chủng loại và kiểu chuỗi.

requiredPermission: Một chuỗi đại diện cho phép các ứng dụng phải có để xem cảm biến, đăng ký với nó và nhận dữ liệu của nó. Một chuỗi trống có nghĩa là các ứng dụng không yêu cầu bất kỳ quyền nào để truy cập vào cảm biến này. Một số loại cảm biến như theo dõi nhịp tim có một bắt buộc requiredPermission . Tất cả các cảm biến cung cấp thông tin nhạy cảm của người dùng (chẳng hạn như nhịp tim) phải được bảo vệ bởi một sự cho phép.

cờ: cờ cho cảm biến này, quy định chế độ báo cáo của cảm biến và liệu các cảm biến là một bộ cảm biến báo thức hay không. Ví dụ, một bộ cảm biến báo thức one-shot sẽ có flags = SENSOR_FLAG_ONE_SHOT_MODE | SENSOR_FLAG_WAKE_UP . Các bit của cờ không được sử dụng trong phiên bản HAL hiện tại phải được để bằng 0.

maxRange: Giá trị tối đa các cảm biến có thể báo cáo, trong đơn vị tương tự như các giá trị báo cáo. Các cảm biến phải có khả năng báo cáo giá trị mà không bão hòa trong [-maxRange; maxRange] . Lưu ý rằng điều này có nghĩa tổng loạt các cảm biến theo nghĩa chung là 2*maxRange . Khi cảm biến báo cáo các giá trị trên một số trục, phạm vi áp dụng cho mỗi trục. Ví dụ, một “+/- 2g” gia tốc sẽ báo cáo maxRange = 2*9.81 = 2g .

độ phân giải: Sự khác biệt nhỏ trong giá trị mà bộ cảm biến có thể đo lường. Thường được tính dựa trên maxRange và số bit trong đo lường.

sức mạnh: Chi phí điện tạo điều kiện cho các bộ cảm biến, trong milliamps. Con số này gần như luôn nhiều hơn mức tiêu thụ điện năng được báo cáo trong biểu dữ liệu của cảm biến bên dưới. Xem cơ sở cảm biến! = Cảm biến vật lý để biết thêm chi tiết và xem quá trình đo lường điện để biết chi tiết về làm thế nào để đo điện năng tiêu thụ của một bộ cảm biến. Nếu tiêu thụ điện năng của bộ cảm biến phụ thuộc vào việc các thiết bị đang di chuyển, tiêu thụ điện năng trong khi di chuyển là một trong những báo cáo trong power trường.

minDelay: Đối với cảm biến liên tục, thời gian lấy mẫu, trong micro giây, tương ứng với tốc độ nhanh nhất sự hỗ trợ cảm biến. Xem sampling_period_ns để biết chi tiết về cách giá trị này được sử dụng. Ghi chú rằng minDelay được thể hiện trong micro khi sampling_period_ns là trong nano giây. Đối với on-thay đổi và cảm biến chế độ báo cáo đặc biệt, trừ trường hợp quy định, minDelay phải là 0. Đối với cảm biến one-shot, nó phải là -1.

maxDelay: Đối với liên tục và trên sự thay đổi cảm biến, giai đoạn lấy mẫu, trong micro giây, tương ứng với tốc độ chậm nhất sự hỗ trợ cảm biến. Xem sampling_period_ns để biết chi tiết về cách giá trị này được sử dụng. Ghi chú rằng maxDelay được thể hiện trong micro khi sampling_period_ns là trong nano giây. Đối với bộ cảm biến đặc biệt và một-shot, maxDelay phải là 0.

fifoReservedEventCount: Số sự kiện dành riêng cho các cảm biến này trong phần cứng FIFO. Nếu có một FIFO dành riêng cho cảm biến này, sau đó fifoReservedEventCount là kích thước của FIFO chuyên dụng này. Nếu FIFO được chia sẻ với các cảm biến khác, fifoReservedEventCount là kích thước của một phần của FIFO đó được dành riêng cho cảm biến đó. Trên hầu hết các hệ thống chia sẻ FIFO và trên các hệ thống không có FIFO phần cứng, giá trị này là 0.

fifoMaxEventCount: Số lượng tối đa các sự kiện mà có thể được lưu trữ trong FIFOs cho cảm biến này. Đây là luôn luôn lớn hơn hoặc bằng fifoReservedEventCount . Giá trị này được sử dụng để ước tính FIFO sẽ đầy nhanh như thế nào khi đăng ký với cảm biến ở một tốc độ cụ thể, giả sử không có cảm biến nào khác được kích hoạt. Trên các hệ thống mà không có một FIFO phần cứng, fifoMaxEventCount là 0. Xem trộn để biết thêm chi tiết.

Đối với các cảm biến có loại cảm biến chính thức, một số trường sẽ bị khung ghi đè. Ví dụ, gia tốc cảm biến buộc phải có một chế độ báo cáo liên tục, và nhịp tim màn buộc phải được bảo vệ bởi SENSOR_PERMISSION_BODY_SENSORS phép.

sensor_event_t

Sự kiện cảm biến được tạo ra bởi các cảm biến Android và báo cáo thông qua các cuộc thăm dò chức năng là các type sensors_event_t . Dưới đây là một số lĩnh vực quan trọng của sensors_event_t :

phiên bản: Phải là sizeof(struct sensors_event_t)

cảm biến: Tay cầm của cảm biến mà tạo ra sự kiện này, theo quy định của sensor_t.handle .

gõ: Loại cảm biến của cảm biến mà tạo ra sự kiện này, theo quy định của sensor_t.type .

timestamp: Các dấu thời gian của sự kiện trong nano giây. Đây là thời gian sự kiện đã xảy ra (một bước đã được thực hiện hoặc một phép đo gia tốc đã được thực hiện), không phải là thời gian sự kiện được báo cáo. timestamp phải được đồng bộ với elapsedRealtimeNano đồng hồ, và trong trường hợp của cảm biến liên tục, jitter phải nhỏ. Dấu thời gian lọc đôi khi cần thiết để đáp ứng các yêu cầu CDD, như chỉ sử dụng các SoC ngắt thời gian để thiết lập các timestamps gây jitter quá cao, và chỉ sử dụng thời gian chip cảm biến để thiết lập các timestamps có thể gây ra de-đồng bộ hóa từ elapsedRealtimeNano đồng hồ, như đồng hồ cảm biến trôi.

dữ liệu và chồng chéo lĩnh vực: Các giá trị đo bằng cảm biến. Ý nghĩa và đơn vị của các trường đó là đặc trưng cho từng loại cảm biến. Xem sensors.h và định nghĩa của sự khác nhau các loại cảm biến cho một mô tả của các trường dữ liệu. Đối với một số cảm biến, tính chính xác của các bài đọc cũng được báo cáo như là một phần của dữ liệu, thông qua một status hiện trường. Trường này chỉ được chuyển qua cho các loại cảm biến được chọn đó, xuất hiện ở lớp SDK dưới dạng giá trị độ chính xác. Đối với những cảm biến, thực tế là trường trạng thái phải được thiết lập được đề cập trong họ loại cảm biến định nghĩa.

Siêu dữ liệu xóa các sự kiện hoàn chỉnh

Sự kiện siêu dữ liệu có cùng loại như các sự kiện cảm biến bình thường: sensors_event_meta_data_t = sensors_event_t . Chúng được trả lại cùng với các sự kiện cảm biến khác thông qua thăm dò ý kiến. Họ sở hữu các trường sau:

phiên bản: Phải META_DATA_VERSION

gõ: Phải SENSOR_TYPE_META_DATA

cảm biến, dành riêng, và timestamp: Phải là 0

meta_data.what: Chứa các loại siêu dữ liệu cho sự kiện này. Hiện nay là một loại siêu dữ liệu có giá trị duy nhất: META_DATA_FLUSH_COMPLETE .

META_DATA_FLUSH_COMPLETE sự kiện đại diện cho việc hoàn thành các tuôn ra của một bộ cảm biến FIFO. Khi meta_data.what=META_DATA_FLUSH_COMPLETE , meta_data.sensor phải được thiết lập để xử lý của bộ cảm biến đã được đỏ ửng. Chúng được tạo ra khi và chỉ khi flush được gọi là trên cảm biến. Xem phần trên tuôn ra chức năng để biết thêm thông tin.