Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.

Sensor HAL 1.0

Sensor HAL antarmuka, dinyatakan dalam sensors.h , merupakan antarmuka antara Android kerangka kerja dan perangkat lunak khusus perangkat keras. Implementasi HAL harus mendefinisikan setiap fungsi yang dideklarasikan di sensor.h. Fungsi utamanya adalah:

  • get_sensors_list - Mengembalikan daftar semua sensor.
  • activate - Mulai atau berhenti sensor.
  • batch - Set parameter sensor ini seperti sampel frekuensi dan maksimum latency pelaporan.
  • setDelay - Digunakan hanya di HAL versi 1.0. Mengatur frekuensi pengambilan sampel untuk sensor tertentu.
  • flush - flushes FIFO dari sensor ditentukan dan melaporkan peristiwa lengkap siram saat ini dilakukan.
  • poll - Pengembalian peristiwa sensor yang tersedia.

Implementasinya harus thread-safe dan memungkinkan fungsi-fungsi ini dipanggil dari thread yang berbeda.

Antarmuka juga mendefinisikan beberapa jenis yang digunakan oleh fungsi-fungsi tersebut. Jenis utamanya adalah:

  • sensors_module_t
  • sensors_poll_device_t
  • sensor_t
  • sensors_event_t

Selain bagian bawah, melihat sensors.h untuk informasi lebih lanjut tentang tipe tersebut.

get_sensors_list(daftar)

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

Menyediakan daftar sensor yang diimplementasikan oleh HAL. Lihat sensor_t untuk rincian tentang bagaimana sensor didefinisikan.

Urutan kemunculan sensor dalam daftar adalah urutan sensor yang akan dilaporkan ke aplikasi. Biasanya, sensor dasar muncul terlebih dahulu, diikuti oleh sensor komposit.

Jika beberapa sensor berbagi jenis sensor dan properti bangun yang sama, yang pertama dalam daftar disebut sensor "default". Ini adalah salah satu yang dikembalikan oleh getDefaultSensor(int sensorType, bool wakeUp) .

Fungsi ini mengembalikan jumlah sensor dalam daftar.

aktifkan (sensor, benar/salah)

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

Mengaktifkan atau menonaktifkan sensor.

sensor_handle adalah pegangan dari sensor untuk mengaktifkan / menonaktifkan. Pegangan Sebuah sensor didefinisikan oleh handle bidang yang sensor_t struktur.

enabled set ke 1 untuk mengaktifkan atau 0 untuk menonaktifkan sensor.

Sensor satu-shot menonaktifkan diri secara otomatis setelah menerima sebuah acara, dan mereka harus tetap menerima untuk dinonaktifkan melalui panggilan untuk activate(..., enabled=0) .

Sensor non-bangun tidak pernah mencegah SoC masuk ke mode tunda; yaitu, HAL tidak boleh menahan penguncian sebagian sebagian atas nama aplikasi.

Sensor pengaktifan, saat mengirimkan peristiwa secara terus-menerus, dapat mencegah SoC masuk ke mode penangguhan, tetapi jika tidak ada peristiwa yang perlu dikirimkan, penguncian pengaktifan parsial harus dilepaskan.

Jika enabled adalah 1 dan sensor sudah diaktifkan, fungsi ini adalah no-op dan berhasil.

Jika enabled adalah 0 dan sensor tersebut sudah dinonaktifkan, fungsi ini adalah no-op dan berhasil.

Fungsi ini mengembalikan 0 pada keberhasilan dan angka kesalahan negatif sebaliknya.

batch (sensor, flag, periode pengambilan sampel, latensi laporan maksimum)

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

Set parameter sensor, termasuk sampel frekuensi dan laporan latency maksimal . Fungsi ini dapat dipanggil saat sensor diaktifkan, dalam hal ini tidak boleh menyebabkan pengukuran sensor hilang: Transisi dari satu laju pengambilan sampel ke laju pengambilan sampel lainnya tidak dapat menyebabkan peristiwa yang hilang, juga tidak dapat beralih dari latensi laporan maksimum yang tinggi ke latensi laporan yang rendah. latensi laporan maksimum.

sensor_handle adalah pegangan sensor untuk mengkonfigurasi.

flags saat ini tidak terpakai.

sampling_period_ns adalah periode sampling di mana sensor harus dijalankan, dalam nanodetik. Lihat sampling_period_ns untuk lebih jelasnya.

max_report_latency_ns adalah waktu maksimum dimana peristiwa dapat ditunda sebelum dilaporkan melalui HAL, dalam nanodetik. Lihat max_report_latency_ns ayat untuk lebih jelasnya.

Fungsi ini mengembalikan 0 pada keberhasilan dan angka kesalahan negatif sebaliknya.

setDelay(sensor, periode pengambilan sampel)

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

Setelah HAL versi 1.0, fungsi ini tidak digunakan lagi dan tidak pernah dipanggil. Sebaliknya, batch fungsi dipanggil untuk mengatur sampling_period_ns parameter.

Dalam HAL versi 1.0, setDelay digunakan sebagai pengganti batch untuk set sampling_period_ns .

siram (sensor)

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

Tambahkan acara lengkap siram ke akhir FIFO hardware untuk sensor tertentu dan flushes FIFO; peristiwa tersebut dikirimkan seperti biasa (yaitu: seolah-olah latensi pelaporan maksimum telah kedaluwarsa) dan dihapus dari FIFO.

Flush terjadi secara tidak sinkron (yaitu: fungsi ini harus segera kembali). Jika implementasi menggunakan FIFO tunggal untuk beberapa sensor, FIFO tersebut akan di-flush dan event flush complete ditambahkan hanya untuk sensor yang ditentukan.

Jika sensor ditentukan tidak memiliki FIFO (tidak ada penyangga mungkin), atau jika FIFO, itu kosong pada saat panggilan, flush masih harus berhasil dan mengirim acara lengkap siram untuk sensor itu. Ini berlaku untuk semua sensor selain sensor sekali tembak.

Ketika flush disebut, bahkan jika acara siram sudah di FIFO untuk sensor itu, satu tambahan harus dibuat dan ditambahkan ke akhir FIFO, dan FIFO harus memerah. Jumlah flush panggilan harus sama dengan jumlah peristiwa lengkap siram dibuat.

flush tidak berlaku untuk satu-shot sensor; jika sensor_handle mengacu pada sensor satu-shot, flush harus kembali -EINVAL dan tidak menghasilkan apapun menyiram acara metadata lengkap.

Fungsi ini kembali 0 pada keberhasilan, -EINVAL jika sensor yang ditentukan adalah sensor satu-shot atau tidak diaktifkan, dan sejumlah kesalahan negatif sebaliknya.

pemilihan()

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

Mengembalikan array data sensor dengan mengisi data argumen. Fungsi ini harus memblokir hingga acara tersedia. Ini akan mengembalikan jumlah peristiwa yang dibaca saat berhasil, atau nomor kesalahan negatif jika terjadi kesalahan.

Jumlah kejadian dikembalikan dalam data harus kurang atau sama dengan count argumen. Fungsi ini tidak akan pernah mengembalikan 0 (tidak ada acara).

Urutan panggilan

Saat booting perangkat, get_sensors_list disebut.

Ketika sensor akan diaktifkan, yang batch fungsi akan disebut dengan parameter yang diminta, diikuti oleh activate(..., enable=1) .

Perhatikan bahwa dalam HAL versi 1_0, perintah itu sebaliknya: activate disebut pertama, diikuti oleh set_delay .

Ketika karakteristik diminta dari sensor berubah ketika sedang diaktifkan, batch fungsi disebut.

flush dapat dipanggil setiap saat, bahkan pada non-aktif sensor (dalam hal ini harus kembali -EINVAL )

Ketika sensor akan dinonaktifkan, activate(..., enable=0) akan dipanggil.

Dalam sejajar dengan panggilan tersebut, poll fungsi akan dipanggil berulang kali untuk meminta data. poll bisa disebut bahkan ketika tidak ada sensor diaktifkan.

sensor_modul_t

sensors_module_t adalah jenis yang digunakan untuk membuat modul hardware Android untuk sensor. Pelaksanaan HAL harus mendefinisikan suatu objek HAL_MODULE_INFO_SYM jenis ini untuk mengekspos get_sensors_list fungsi. Lihat definisi sensors_module_t di sensors.h dan definisi hw_module_t untuk informasi lebih lanjut.

sensor_poll_device_t / sensor_poll_device_1_t

sensors_poll_device_1_t berisi sisa metode didefinisikan di atas: activate , batch , flush dan poll . Its common bidang (tipe hw_device_t ) mendefinisikan nomor versi dari HAL.

sensor_t

sensor_t merupakan sensor Android . Berikut adalah beberapa bidang pentingnya:

nama: A dilihat pengguna string yang mewakili sensor. String ini sering berisi nama bagian dari sensor yang mendasari, jenis sensor, dan apakah itu sensor bangun. Misalnya, “LIS2HH12 Accelerometer”, “MAX21000 Uncalibrated Gyroscope”, “BMP280 Wake-up Barometer”, “MPU6515 Game Rotation Vector”

pegangan: integer yang digunakan untuk merujuk ke sensor saat mendaftar untuk itu atau menghasilkan peristiwa dari itu.

ketik: Jenis sensor. Lihat penjelasan tipe sensor di Apa sensor Android? untuk lebih jelasnya, dan melihat jenis Sensor untuk jenis sensor resmi. Untuk jenis sensor non-resmi, type harus dimulai dengan SENSOR_TYPE_DEVICE_PRIVATE_BASE

stringType: Jenis sensor sebagai string. Ketika sensor memiliki tipe resmi, diatur untuk SENSOR_STRING_TYPE_* . Ketika sensor memiliki produsen tertentu jenis, stringType harus dimulai dengan produsen nama domain terbalik. Sebagai contoh, sebuah sensor (mengatakan detektor unicorn) didefinisikan oleh tim Cool-produk di fiksi-Perusahaan bisa menggunakan stringType=”com.fictional_company.cool_product.unicorn_detector” . The stringType digunakan untuk mengidentifikasi secara unik jenis sensor non-resmi. Lihat sensors.h untuk informasi lebih lanjut tentang jenis dan tipe string.

requiredPermission: Sebuah string yang mewakili izin bahwa aplikasi harus memiliki untuk melihat sensor, daftar itu dan menerima datanya. String kosong berarti aplikasi tidak memerlukan izin apa pun untuk mengakses sensor ini. Beberapa jenis sensor seperti monitor denyut jantung memiliki wajib requiredPermission . Semua sensor yang memberikan informasi sensitif pengguna (seperti detak jantung) harus dilindungi dengan izin.

bendera: Flags untuk sensor ini, mendefinisikan modus pelaporan sensor dan apakah sensor adalah sensor bangun atau tidak. Sebagai contoh, sebuah sensor bangun satu-shot akan memiliki flags = SENSOR_FLAG_ONE_SHOT_MODE | SENSOR_FLAG_WAKE_UP . Bit dari flag yang tidak digunakan dalam versi HAL saat ini harus dibiarkan sama dengan 0.

maxRange: Nilai maksimum sensor dapat melaporkan, dalam unit yang sama dengan nilai yang dilaporkan. Sensor harus dapat melaporkan nilai tanpa menjenuhkan dalam [-maxRange; maxRange] . Perhatikan bahwa ini berarti kisaran total sensor dalam arti generik adalah 2*maxRange . Saat sensor melaporkan nilai pada beberapa sumbu, rentang berlaku untuk setiap sumbu. Misalnya, “+/- 2g” accelerometer akan melaporkan maxRange = 2*9.81 = 2g .

Resolusi: Perbedaan terkecil di nilai bahwa sensor dapat mengukur. Biasanya dihitung berdasarkan maxRange dan jumlah bit dalam pengukuran.

listrik: Biaya kekuatan yang memungkinkan sensor, di milliAmps. Ini hampir selalu lebih dari konsumsi daya yang dilaporkan dalam lembar data sensor yang mendasarinya. Lihat Basis sensor! = Sensor fisik untuk rincian lebih lanjut dan melihat proses pengukuran daya untuk rincian tentang bagaimana mengukur konsumsi daya dari sensor. Jika konsumsi daya sensor tergantung pada apakah perangkat bergerak, konsumsi daya saat bergerak adalah salah satu yang dilaporkan dalam power lapangan.

mindelay: Untuk sensor terus menerus, periode sampling, di mikrodetik, sesuai dengan tingkat tercepat mendukung sensor. Lihat sampling_period_ns untuk rincian tentang bagaimana nilai ini digunakan. Hati-hati bahwa minDelay dinyatakan dalam mikrodetik sementara sampling_period_ns dalam nanodetik. Untuk on-perubahan dan pelaporan sensor modus khusus, kecuali ditentukan lain, minDelay harus 0. Untuk sensor satu-shot, itu harus -1.

maxDelay: Untuk terus menerus dan on-perubahan sensor, periode sampel, dalam mikrodetik, sesuai dengan tingkat paling lambat mendukung sensor. Lihat sampling_period_ns untuk rincian tentang bagaimana nilai ini digunakan. Hati-hati bahwa maxDelay dinyatakan dalam mikrodetik sementara sampling_period_ns dalam nanodetik. Untuk khusus dan satu-shot sensor, maxDelay harus 0.

fifoReservedEventCount: Jumlah kejadian disediakan untuk sensor ini dalam perangkat keras FIFO. Jika ada FIFO khusus untuk sensor ini, maka fifoReservedEventCount adalah ukuran FIFO khusus ini. Jika FIFO dibagi dengan sensor lain, fifoReservedEventCount adalah ukuran bagian dari FIFO yang dicadangkan untuk sensor itu. Pada sebagian besar sistem FIFO bersama, dan pada sistem yang tidak memiliki FIFO perangkat keras, nilai ini adalah 0.

fifoMaxEventCount: Jumlah maksimum peristiwa yang dapat disimpan dalam FIFOs untuk sensor ini. Ini selalu lebih besar atau sama dengan fifoReservedEventCount . Nilai ini digunakan untuk memperkirakan seberapa cepat FIFO akan penuh ketika mendaftar ke sensor pada tingkat tertentu, seandainya tidak ada sensor lain yang diaktifkan. Pada sistem yang tidak memiliki FIFO hardware, fifoMaxEventCount adalah 0. Lihat Batching untuk lebih jelasnya.

Untuk sensor dengan tipe sensor resmi, beberapa bidang ditimpa oleh kerangka kerja. Misalnya, accelerometer sensor dipaksa untuk memiliki modus pelaporan terus menerus, dan denyut jantung monitor dipaksa untuk dilindungi oleh SENSOR_PERMISSION_BODY_SENSORS izin.

sensor_event_t

Peristiwa sensor yang dihasilkan oleh sensor Android dan dilaporkan melalui jajak pendapat fungsi yang dari type sensors_event_t . Berikut adalah beberapa bidang penting dari sensors_event_t :

Versi: Harus sizeof(struct sensors_event_t)

sensor: Gagang sensor yang dihasilkan acara tersebut, seperti yang didefinisikan oleh sensor_t.handle .

ketik: Jenis sensor dari sensor yang dihasilkan acara tersebut, seperti yang didefinisikan oleh sensor_t.type .

timestamp: The timestamp acara dalam nanodetik. Ini adalah waktu peristiwa itu terjadi (langkah diambil, atau pengukuran akselerometer dilakukan), bukan waktu peristiwa itu dilaporkan. timestamp harus disinkronkan dengan elapsedRealtimeNano jam, dan dalam kasus sensor terus menerus, jitter harus kecil. Timestamp filtering kadang-kadang diperlukan untuk memenuhi persyaratan CDD, seperti hanya menggunakan SoC interupsi waktu untuk mengatur cap waktu menyebabkan jitter terlalu tinggi, dan hanya menggunakan waktu sensor chip untuk mengatur cap waktu dapat menyebabkan de-sinkronisasi dari elapsedRealtimeNano jam, sebagai sensor jam melayang.

Data dan tumpang tindih bidang: Nilai-nilai yang diukur oleh sensor. Arti dan unit dari bidang tersebut khusus untuk setiap jenis sensor. Lihat sensors.h dan definisi yang berbeda jenis Sensor untuk penjelasan dari bidang data. Untuk beberapa sensor, akurasi pembacaan juga dilaporkan sebagai bagian dari data, melalui status lapangan. Bidang ini hanya disalurkan untuk jenis sensor tertentu, yang muncul di lapisan SDK sebagai nilai akurasi. Bagi mereka sensor, fakta bahwa bidang status harus diatur disebutkan dalam mereka jenis sensor definisi.

Metadata flush acara selesai

Peristiwa Metadata memiliki tipe yang sama dengan peristiwa sensor yang normal: sensors_event_meta_data_t = sensors_event_t . Mereka dikembalikan bersama dengan peristiwa sensor lainnya melalui polling. Mereka memiliki bidang-bidang berikut:

Versi: Harus META_DATA_VERSION

ketik: Harus SENSOR_TYPE_META_DATA

sensor, dilindungi, dan timestamp: Harus 0

meta_data.what: Berisi jenis metadata untuk acara ini. Saat ini jenis metadata tunggal valid: META_DATA_FLUSH_COMPLETE .

META_DATA_FLUSH_COMPLETE peristiwa mewakili penyelesaian flush sensor FIFO. Ketika meta_data.what=META_DATA_FLUSH_COMPLETE , meta_data.sensor harus diatur ke gagang sensor yang telah memerah. Mereka dihasilkan jika dan hanya jika flush disebut pada sensor. Lihat bagian di siram fungsi untuk informasi lebih lanjut.