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 (Lớp trừu tượng phần cứng) phải xác định từng hàm đã khai báo trong sensor.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 cảm biến.batch
– Đặt thông số của cảm biến, chẳng hạn như tần suất lấy mẫu và tối đa độ trễ báo cáo.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 cụ thể.flush
– Xoá FIFO của cảm biến được chỉ định và báo cáo một lượt xả nước đã 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 cũng xác định một số loại được 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. Vui lòng xem sensor_t để biết chi tiết về cách xác định cảm biến.
Thứ tự xuất hiện của các cảm biến trong danh sách này là thứ tự mà các cảm biến sẽ được báo cáo cho ứng dụng. Thông thường, các cảm biến cơ sở trước tiên là cảm biến tổng hợp.
Nếu một vài cảm biến dùng chung một loại cảm biến và thuộc tính đánh thức thì
một cảm biế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.
kích hoạt(cảm biến, 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. Một cảm biến
tay cầm đượ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 sẽ tự động huỷ kích hoạt sau khi nhận được sự kiện,
và họ vẫn phải chấp nhận yêu cầu huỷ kích hoạt bằng cách 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 thông số của cảm biến, bao gồm tần suất lấy mẫu và báo cáo tối đa độ trễ. 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 khi thành công và nếu không thì trả về số lỗi âm.
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, 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 giá trị
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(cảm biến)
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ác cảm biến khác
so với cảm biến một lần.
Khi flush
được gọi, ngay cả khi sự kiện xả đã có 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ượng flush
lệnh gọi phải bằng số sự kiện xả dữ liệu được tạo.
flush
không áp dụng cho tính năng một lần
cảm biến; nếu sensor_handle
đề cập đến cảm biến một lần,
flush
phải trả về -EINVAL
và không tạo bất kỳ giá trị nào
sự kiện xả siêu dữ liệu hoàn tất.
Hàm này trả về 0 khi thành công, trả về -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 cùng với số lỗi âm.
cuộc thăm dò ý kiến()
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 xảy ra 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ự cuộc 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
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ị huỷ kích hoạt, 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 để
dữ liệu yêu cầu. poll
có thể được gọi 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
, flush
và
poll
. 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:
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 bên dưới, loại cảm biến và cho dù đó là cảm biến đánh thức. Ví dụ: "Gia tốc kế LIS2HH12", “MAX21000 Con quay hồi chuyển không được hiệu chỉnh”, “BMP280 Wake-up Barometer”, “Trò chơi MPU6515 Vectơ xoay"
handle: Số nguyên dùng để tham chiếu đến cảm biến khi đăng ký cảm biến hoặc tạo sự kiện từ đó.
type: Loại cảm biến. Xem nội dung giải thích về cảm biến
nhập Cảm biến Android là gì? để biết thêm chi tiết và xem Loại cảm biến để biết các loại cảm biến chính thức. Cho
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 (chẳng hạn như
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. 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 thể hiện quyền
mà ứng dụng phải sở hữu để xem cảm biến, đăng ký cảm biến và nhận
dữ liệu của nền tảng đó. 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 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
. Một số thông tin về
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 một đơn vị với
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 giá trị trên
nhiều trục, phạm vi sẽ áp dụng cho mỗi 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 được.
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.
Con số 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. Xem phần Cảm biến cơ sở != vật lý
cảm biến để biết thêm chi tiết và xem bài viết Đo lường nguồn điện
để biết thông tin chi tiết về cách đo mức tiêu thụ điện năng của cảm biến.
Nếu mức tiêu thụ năng lượ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ụ năng lượ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 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 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ác cảm biến chế độ báo cáo khi thay đổi và chế độ báo cáo đặc biệt, trừ khi
nếu không thì minDelay
phải bằng 0. Đối với cảm biến chụp một lần,
phải là -1.
maxDelay:Đối với các cảm biến liên tục và khi 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
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ụp một lần và cảm biến đặc biệt, maxDelay
phải:
0.
fifoForEventCount: 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 là
được chia sẻ với các cảm biến khác, fifoReservedEventCount
là kích thước của phần
FIFO 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, thì giá trị này bằng 0.
fifoMaxEventCount: Số lượng 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 Tạo lô để 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ị 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)
Cảm biến: Tay cầm của cảm biến đã tạo ra sự kiện, như được xác định bằng
sensor_t.handle
.
type: Loại cảm biến của cảm biến đã tạo ra sự kiện, được xác định bằng ký tự
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 cần lọc dấu thời gian để đáp ứng CDD
theo các yêu cầu nhất định, chẳng hạn như chỉ sử dụng thời gian gián đoạn của hệ thống SoC để đặt dấu thời gian
gây ra sự dao động quá cao và chỉ sử dụng thời gian của chip cảm biến để đặt
có thể gây ra quá trình huỷ đồng bộ hoá
Đồng hồ elapsedRealtimeNano
, khi đồng hồ cảm biến 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 đó cụ thể cho từng cảm biến
loại. Vui lòng 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ề
trường dữ liệu. Đối với một số cảm biến, độ chính xác của kết quả đo cũng được báo cáo
dưới dạng một phần của dữ liệu, thông qua trường status
. Trường này chỉ
được đưa qua cho các loại cảm biến đó, xuất hiện ở lớp SDK dưới dạng một
giá trị chính xác. Đối với các cảm biến đó, trường trạng thái phải được đặt trên thực tế
được đề cập trong loại cảm biến
định nghĩa.
Sự kiện hoàn tất xoá 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. Họ sở hữu các trường sau:
version: Phải là META_DATA_VERSION
loại: 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 của sự kiện này. Hiện có một
loại siêu dữ liệu hợp lệ duy nhất: META_DATA_FLUSH_COMPLETE
.
Các sự kiện META_DATA_FLUSH_COMPLETE
biểu thị việc hoàn tất quá trình xả dữ liệu
cảm biến FIFO. 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ả nước. Đó 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.