Cảm biến HAL 1.0

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

  • get_sensors_list – Trả về danh sách tất cả cảm biến.
  • activate – Bắt đầu hoặc dừng một cảm biến.
  • batch – Đặt các thông số của cảm biến, chẳng hạn như tần suất lấy mẫu và độ trễ báo cáo tối đa.
  • setDelay – Chỉ dùng trong HAL phiên bản 1.0. Đặt tần suất lấy mẫu cho một cảm biến nhất định.
  • flush – Xoá sạch FIFO của cảm biến đã chỉ định và báo cáo sự kiện xoá sạch hoàn tất khi quá trình này hoàn tất.
  • poll – Trả về các sự kiện cảm biến hiện có.

Quá trình triển khai phải an toàn cho luồng và cho phép gọi các hàm này từ các chuỗi khác nhau.

Giao diện này cũng xác định một số loại mà các hàm đó sử dụng. 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, hãy 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ảm biến do HAL (Lớp trừu tượng phần cứng) triển khai. Hãy xem sensor_t để biết thông tin chi tiết về cách xác định cảm biến.

Thứ tự xuất hiện của cảm biến trong danh sách là thứ tự mà cảm biến sẽ được báo cáo cho các ứng dụng. Thông thường, cảm biến cơ sở sẽ xuất hiện trước, sau đó là cảm biến tổng hợp.

Nếu một số cảm biến có cùng 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à URL được trả về bởi getDefaultSensor(int sensorType, bool wakeUp).

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

activate(sensor, true/false)

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

Bật hoặc tắt cảm biến.

sensor_handle là tay cầm của cảm biến để kích hoạt/huỷ kích hoạt. Tay điều khiển của cảm biến được xác định bằng trường handle của cấu trúc sensor_t.

enabled được đặt thành 1 để bật hoặc 0 để tắt cảm biến.

Các cảm biến một lần tự động tự huỷ kích hoạt khi nhận được một sự kiện và vẫn phải chấp nhận bị huỷ kích hoạt thông qua lệnh gọi đến activate(..., enabled=0).

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

Khi liên tục gửi thông báo sự kiện, cảm biến đánh thức có thể ngăn SoC này sẽ chuyển sang chế độ tạm ngưng, nhưng nếu không cần gửi sự kiện nào, phải hủy bỏ khóa chế độ thức.

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

Nếu enabled là 0 và cảm biến đã bị tắt, thì chức năng này không hoạt động và thành công.

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

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);

Đặt các tham số của cảm biến, bao gồm tần số lấy mẫuđộ trễ báo cáo tối đa. Hàm này có thể được gọi trong khi cảm biến được kích hoạt, trong trường hợp mã hoá này không được làm mất bất kỳ thông tin đo lường cảm biến nào: Chuyển đổi từ một tỷ lệ lấy mẫu này sang tỷ lệ lấy mẫu khác không thể gây ra sự kiện bị mất, cũng như chuyển từ độ trễ báo cáo tối đa cao sang báo cáo tối đa thấp độ trễ.

sensor_handle là tay điều khiển của cảm biến cần định cấu hình.

flags hiện chưa được sử dụng.

sampling_period_ns là khoảng thời gian lấy mẫu mà cảm biến sẽ chạy, tính bằng nano giây. Hãy xem phần Sample_period_ns để biết chi tiết hơn.

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

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

setDelay(sensor, sampling period)

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

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

Trong HAL phiên bản 1.0, setDelay được sử dụng thay vì hàng loạt để đặt sampling_period_ns.

flush(sensor)

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

Thêm một sự kiện hoàn tất xả dữ liệu vào cuối FIFO phần cứng cho cảm biến được chỉ định và xả FIFO; các sự kiện đó sẽ được phân phối như bình thường (ví dụ: như thể độ trễ báo cáo tối đa đã hết hạn) và bị xoá khỏi FIFO.

Việc xả xảy ra không đồng bộ (tức 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 cho nhiều cảm biến, thì FIFO đó sẽ xả nước và sự kiện hoàn tất xả nước chỉ được thêm vào cho cảm biến được chỉ định.

Nếu cảm biến được chỉ định không có FIFO (không có khả năng tải vào bộ đệm) hoặc nếu FIFO, trống tại thời điểm gọi, flush vẫn phải thành công và gửi một sự kiện hoàn tất xả nước cho cảm biến đó. Điều này áp dụng cho tất cả cảm biến ngoại trừ cảm biến một lần.

Khi flush được gọi, ngay cả khi đã có sự kiện xả dữ liệu trong phương thức FIFO cho cảm biến đó, bạn phải tạo và thêm một cảm biến khác vào cuối của FIFO và FIFO phải được kích hoạt. Số lệnh gọi flush phải bằng số sự kiện hoàn tất xả được tạo.

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

Hàm này trả về 0 nếu thành công, -EINVAL nếu cảm biến được chỉ định là cảm biến một lần hoặc không được bật và số lỗi âm nếu không.

poll()

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

Trả về một mảng dữ liệu cảm biến bằng cách điền đối số data. Hàm này phải chặn cho đến khi có sự kiện. Thao tác này sẽ trả về số lượng sự kiện đã đọc khi thành công hoặc số lỗi âm trong trường hợp có lỗi.

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

Trình tự lệnh gọi

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

Khi một cảm biến được kích hoạt, hàm batch sẽ được gọi bằng các tham số được yêu cầu, theo sau là activate(..., enable=1).

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

Khi các đặc điểm được yêu cầu của một cảm biến thay đổi trong lúc được kích hoạt, thì hàm batch sẽ được gọi.

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

Khi một cảm biến bị vô hiệu hoá, activate(..., enable=0) sẽ được gọi.

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

mô-đun cảm biến_t

sensors_module_t là loại phần cứng dùng để tạo phần cứng Android cho các cảm biến. Việc triển khai HAL phải xác định một đối tượng HAL_MODULE_INFO_SYM thuộc loại này để hiển thị hàm get_sensors_list. 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 / sensor_poll_device_1_t

sensors_poll_device_1_t chứa các phương thức còn lại được xác định ở trên: activate, batch, flushpoll. Trường common (thuộc loại hw_device_t) xác định số phiên bản của HAL.

cảm biến

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

name: Một chuỗi mà người dùng 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 cơ bản, loại cảm biến và liệu đó có phải là cảm biến đánh thức hay không. Ví dụ: "Cảm biến gia tốc LIS2HH12", "Con quay hồi chuyển chưa được hiệu chuẩn MAX21000", "Báo áp đánh thức BMP280", "Vectơ xoay trò chơi MPU6515"

handle: Số nguyên dùng để tham chiếu đến cảm biến khi đăng ký hoặc tạo sự kiện từ cảm biến đó.

type: Loại cảm biến. Hãy xem phần giải thích về loại cảm biến trong bài viết Cảm biến Android là gì? để biết thêm thông tin chi tiết và xem phần Các loại cảm biến để biết các loại cảm biến chính thức. Để các loại cảm biến không chính thức, type phải bắt đầu bằng SENSOR_TYPE_DEVICE_PRIVATE_BASE

stringType: Loại cảm biến dưới dạng chuỗi. Khi cảm biến có loại chính thức, được đặt thành SENSOR_STRING_TYPE_*. Thời gian cảm biến có loại dành riêng cho nhà sản xuất, stringType phải bắt đầu bằng tên miền ngược của nhà sản xuất. Ví dụ: một cảm biến (ví dụ: trình phát hiện kỳ lân) do nhóm Cool-product xác định tại Công ty hư cấu có thể sử dụng stringType=”com.fictional_company.cool_product.unicorn_detector”. stringType được dùng để nhận dạng duy nhất các cảm biến không chính thức loại. Vui lòng xem sensors.h để biết thêm thông tin về các loại và chuỗi loại.

requiredPermission: Một chuỗi đại diện cho quyền mà ứng dụng phải có để xem cảm biến, đăng ký với cảm biến và nhận dữ liệu của cảm biến. Chuỗi trống có nghĩa là ứ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ư máy theo dõi nhịp tim có bắt buộc requiredPermission. Tất cả cảm biến cung cấp tín hiệu nhạy cảm thông tin người dùng (chẳng hạn như nhịp tim) phải được bảo vệ bằng quyền.

flags: Cờ cho cảm biến 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. Ví dụ: cảm biến đánh thức một lần 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 mà cảm biến có thể báo cáo, theo cùng đơn vị với các giá trị được báo cáo. Cảm biến phải có khả năng báo cáo các giá trị mà không làm bão hoà trong [-maxRange; maxRange]. Xin lưu ý rằng điều này có nghĩa là tổng phạm vi của 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 nhiều trục, phạm vi sẽ áp dụng cho từng trục. Ví dụ: "+/- 2g" gia tốc kế sẽ báo cáo maxRange = 2*9.81 = 2g.

độ phân giải: Mức chênh lệch nhỏ nhất về giá trị mà cảm biến có thể đo lường. Thường được tính toán dựa trên maxRange và số bit trong phép đo.

power: Chi phí điện năng để bật cảm biến, tính bằng mili giây. Mức tiêu thụ điện năng này gần như luôn cao hơn mức tiêu thụ điện năng được báo cáo trong bảng dữ liệu của cảm biến cơ bản. Hãy xem phần Cảm biến cơ sở != cảm biến thực tế để biết thêm thông tin chi tiết và xem phần Quy trình đo lường điện năng để biết thông tin chi tiết về cách đo lường mức tiêu thụ điện năng của cảm biến. Nếu mức tiêu thụ điện năng của cảm biến phụ thuộc vào việc thiết bị có đang di chuyển hay không, mức tiêu thụ điện năng trong khi di chuyển là mức tiêu thụ điện năng được báo cáo trong power .

minDelay:Đối với các cảm biến liên tục, khoảng thời gian lấy mẫu, tính theo micrô giây, tương ứng với tốc độ nhanh nhất mà cảm biến hỗ trợ. Hãy xem sampling_period_ns để biết thông tin chi tiết về cách sử dụng giá trị này. Xin lưu ý rằng minDelay biểu thị bằng micrô giây, còn sampling_period_ns được biểu thị bằng nano giây. Đối với cảm biến chế độ báo cáo đặc biệt và chế độ thay đổi, trừ khi có quy định khác, minDelay phải là 0. Đối với cảm biến một lần, giá trị này phải là -1.

maxDelay:Đối với các cảm biến liên tục và thay đổi, phương pháp lấy mẫu chu kỳ, tính bằng micrô giây, tương ứng với tốc độ chậm nhất mà cảm biến Google Cloud. Hãy xem phần Sample_period_ns để biết thông tin chi tiết về cách sử dụng giá trị này. Xin lưu ý rằng maxDelay được biểu thị bằng micro giây còn sampling_period_ns được biểu thị bằng nano giây. Đối với cảm biến chụp một lần và cảm biến đặc biệt, maxDelay phải: 0.

fifofoSavedEventCount: Số sự kiện dành riêng cho cảm biến này trong FIFO phần cứng. Nếu có một FIFO chuyên dụng cho cảm biến này, thì 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 phần FIFO được dành riêng cho cảm biến đó. Trên hầu hết các hệ thống FIFO dùng chung và trên các hệ thống không có FIFO phần cứng, giá trị này là 0.

fifoMaxEventCount: Số sự kiện tối đa có thể được lưu trữ trong FIFO cho cảm biến này. Giá trị này luôn lớn hơn hoặc bằng fifoReservedEventCount. Giá trị này được dùng để ước tính nhanh chóng, FIFO sẽ đầy khi đăng ký cảm biến tại một điểm 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 không có FIFO phần cứng, fifoMaxEventCount là 0. Hãy xem phần Gộp nhóm để biết thêm thông tin 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ị ghi đè theo khung này. Ví dụ: cảm biến gia tốc kế buộc phải có chế độ báo cáo liên tục và thiết bị theo dõi nhịp tim buộc phải được SENSOR_PERMISSION_BODY_SENSORS bảo vệ quyền.

sự kiện_cảm biến_t

Các sự kiện cảm biến do cảm biến Android tạo ra và được báo cáo thông qua hàm cuộc thăm dò ý kiến có giá trị là type sensors_event_t. Sau đây là một số các trường quan trọng của sensors_event_t:

version: Phải là sizeof(struct sensors_event_t)

sensor: Tên của cảm biến đã tạo sự kiện, theo định nghĩa của sensor_t.handle.

type: Loại cảm biến của cảm biến đã tạo sự kiện, như được xác định bởi sensor_t.type.

timestamp: Dấu thời gian của sự kiện tính bằng nano giây. Đây là thời điểm sự kiện đã xảy ra (đã thực hiện một bước hoặc đã thực hiện đo gia tốc kế), không phải thời gian báo cáo sự kiện. timestamp phải được đồng bộ hoá với xung nhịp elapsedRealtimeNano và trong trường hợp cảm biến liên tục, dao động phải nhỏ. Đôi khi, bạn cần lọc dấu thời gian để đáp ứng các yêu cầu của CDD, vì việc chỉ sử dụng thời gian ngắt SoC để đặt dấu thời gian sẽ gây ra độ trễ quá cao và việc chỉ sử dụng thời gian của khối cảm biến để đặt dấu thời gian có thể gây ra tình trạng không đồng bộ với đồng hồ elapsedRealtimeNano, vì đồng hồ cảm biến bị trôi.

các trường dữ liệu và chồng chéo:Các giá trị được đo lường bằng cảm biến. Ý nghĩa và đơn vị của các trường đó là dành riêng cho từng loại cảm biến. Hãy xem sensors.h và định nghĩa về các Loại cảm biến khác nhau để biết nội dung mô tả về các trường dữ liệu. Đối với một số cảm biến, độ chính xác của các lần đọc cũng được báo cáo trong dữ liệu thông qua trường status. 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 các cảm biến đó, việc phải đặt trường trạng thái được đề cập trong định nghĩa loại cảm biến của chúng.

Sự kiện hoàn tất việc làm mới siêu dữ liệu

Sự kiện siêu dữ liệu có cùng loại với sự kiện cảm biến thông thường: sensors_event_meta_data_t = sensors_event_t. Các kết quả này được trả về cùng với các sự kiện cảm biến khác thông qua cuộc thăm dò ý kiến. Các tệp này có các trường sau:

version: Phải là META_DATA_VERSION

type: Phải là SENSOR_TYPE_META_DATA

cảm biến, dành riêng và dấu thời gian: Phải là 0

meta_data.what: Chứa loại siêu dữ liệu cho sự kiện này. Hiện tại, chỉ có một loại siêu dữ liệu hợp lệ: META_DATA_FLUSH_COMPLETE.

Sự kiện META_DATA_FLUSH_COMPLETE thể hiện việc hoàn tất việc xả một FIFO cảm biến. Khi meta_data.what=META_DATA_FLUSH_COMPLETE, meta_data.sensor phải được đặt thành tay cầm của cảm biến đã được xả. Đó là được tạo khi và chỉ khi flush được gọi trên một cảm biến. Xem phần này trên hàm flush để biết thêm thông tin.