Driver kelas HID sensor
Dimulai dengan Windows 8, sistem operasi Windows mencakup driver Kelas HID sensor dalam kotak (SensorsHIDClassDriver.dll), yang mendukung sebelas jenis sensor yang berkomunikasi menggunakan transportasi HID.
Berikut adalah daftar sensor yang didukung:
- Akselerometer 3D
- Cahaya Sekitar
- Suhu sekitar
- Tekanan Atmosfer
- Kompas 3D
- Orientasi Perangkat
- Giroskop 3D
- Kelembapan
- Inklinometer 3D
- Kehadiran
- Kedekatan
Ilustrasi berikut menggambarkan aliran data bolak-balik dari dua aplikasi sensor ke bawah melalui tumpukan driver dan, akhirnya, ke perangkat keras itu sendiri.
Dukungan untuk sensor kustom
Selain sebelas sensor yang tercakup dalam daftar sebelumnya, driver kelas juga mendukung kelas Kustom. Kelas ini memungkinkan produsen sensor untuk mengintegrasikan perangkat yang tidak ditemukan dalam daftar sebelumnya: Misalnya, sensor karbon monoksida. Sensor kustom menyajikan dirinya ke API sensor sebagai perangkat kustom dengan properti unik.
Arsitektur dan gambaran umum
Jika Anda membuat firmware untuk sensor yang kompatibel, Anda memerlukan pemahaman dasar tentang model I/O yang didukung oleh driver kelas.
- Sensor mengirimkan laporan fitur atau laporan input ke driver kelas HID. Laporan fitur dikirim sebagai respons terhadap permintaan dari driver. Laporan ini berisi data properti termasuk pengaturan sensitivitas perubahan sensor, interval laporannya, dan status pelaporannya. Laporan input dikirim baik berdasarkan permintaan, atau secara asinkron sebagai respons terhadap suatu peristiwa. Laporan ini berisi data sensor aktual. Misalnya, untuk akselerometer, laporan berisi kekuatan G di sepanjang sumbu x, y-, dan z).
- Driver kelas HID mengirim laporan fitur ke sensor. Misalnya, ketika aplikasi meminta sensitivitas perubahan atau interval laporan baru, driver mengemas nilai-nilai ini ke dalam laporan fitur dan menggunakan laporan ini untuk mengirim permintaan ke firmware sensor.
Diagram berikut mengilustrasikan model I/O:
Contoh Deskriptor Laporan
Jika sensor Anda mendukung salah satu dari tujuh kategori asli driver kelas, firmware-nya harus mendukung laporan fitur dan input tertentu. Laporan fitur ini mencakup status pelaporan sensor saat ini, statusnya, sensitivitas perubahan, dan interval pelaporan (selain properti lain yang mungkin). Laporan input berisi pembacaan sensor: True atau False untuk sakelar, nilai G-force untuk akselerometer atau LUX untuk sensor cahaya sekitar.
Sampel laporan fitur akselerometer
Contoh kode berikut menunjukkan laporan fitur HID untuk akselerometer. Perhatikan sifat deskriptif diri dari laporan ini. Ini termasuk nilai minimum dan maksimum serta jumlah dan ukuran bidang individual.
//feature reports (xmit/receive)
HID_USAGE_PAGE_SENSOR,
HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE,
HID_LOGICAL_MIN_8(0x00), //LOGICAL_MINIMUM (0)
HID_LOGICAL_MAX_8(0xFF), //LOGICAL_MAXIMUM (255)
HID_REPORT_SIZE(8),
HID_REPORT_COUNT(1),
HID_FEATURE(Data_Var_Abs),
HID_USAGE_SENSOR_PROPERTY_SENSOR_STATUS,
HID_LOGICAL_MIN_8(0x00), //LOGICAL_MINIMUM (0)
HID_LOGICAL_MAX_8(0xFF), //LOGICAL_MAXIMUM (255)
HID_REPORT_SIZE(8),
HID_REPORT_COUNT(1),
HID_FEATURE(Data_Var_Abs),
HID_USAGE_SENSOR_PROPERTY_CHANGE_SENSITIVITY_ABS,
HID_LOGICAL_MIN_8(0x00), //LOGICAL_MINIMUM (0)
HID_LOGICAL_MAX_16(0xFF,0xFF), //LOGICAL_MAXIMUM (65535)
HID_REPORT_SIZE(16),
HID_REPORT_COUNT(1),
HID_USAGE_SENSOR_UNITS_G,
HID_UNIT_EXPONENT(0xE),
HID_FEATURE(Data_Var_Abs),
HID_USAGE_SENSOR_PROPERTY_REPORT_INTERVAL,
HID_LOGICAL_MIN_8(0x00), //LOGICAL_MINIMUM (0)
HID_LOGICAL_MAX_32(0xFF,0xFF,0xFF,0xFF), //LOGICAL_MAXIMUM (4294967295)
HID_REPORT_SIZE(32),
HID_REPORT_COUNT(1),
HID_USAGE_SENSOR_UNITS_MILLISECOND,
HID_UNIT_EXPONENT(0),
HID_FEATURE(Data_Var_Abs),
Sampel laporan input akselerometer
Contoh kode berikut menunjukkan laporan input HID untuk perangkat yang sama. Sekali lagi, perhatikan sifat deskriptif diri dari bidang dalam laporan ini.
//input reports (transmit)
HID_USAGE_PAGE_SENSOR,
HID_USAGE_SENSOR_STATE,
HID_LOGICAL_MIN_8(0x00), //LOGICAL_MINIMUM (0)
HID_LOGICAL_MAX_8(0xFF), //LOGICAL_MAXIMUM (255)
HID_REPORT_SIZE(8),
HID_REPORT_COUNT(1),
HID_INPUT(Data_Var_Abs),
HID_USAGE_SENSOR_EVENT,
HID_LOGICAL_MIN_8(0x00), //LOGICAL_MINIMUM (0)
HID_LOGICAL_MAX_8(0xFF), //LOGICAL_MAXIMUM (255)
HID_REPORT_SIZE(8),
HID_REPORT_COUNT(1),
HID_INPUT(Data_Var_Abs),
HID_USAGE_SENSOR_DATA_MOTION_ACCELERATION_X_AXIS,
HID_LOGICAL_MIN_16(0x01,0x80), // LOGICAL_MINIMUM (-32767)
HID_LOGICAL_MAX_16(0xFF,0x7F), // LOGICAL_MAXIMUM (32767)
HID_REPORT_SIZE(16),
HID_REPORT_COUNT(1),
HID_USAGE_SENSOR_UNITS_G,
HID_UNIT_EXPONENT(0xE),
HID_INPUT(Data_Var_Abs),
HID_USAGE_SENSOR_DATA_MOTION_ACCELERATION_Y_AXIS,
HID_LOGICAL_MIN_16(0x01,0x80), // LOGICAL_MINIMUM (-32767)
HID_LOGICAL_MAX_16(0xFF,0x7F), // LOGICAL_MAXIMUM (32767)
HID_REPORT_SIZE(16),
HID_REPORT_COUNT(1),
HID_USAGE_SENSOR_UNITS_G,
HID_UNIT_EXPONENT(0xE),
HID_INPUT(Data_Var_Abs),
HID_USAGE_SENSOR_DATA_MOTION_ACCELERATION_Z_AXIS,
HID_LOGICAL_MIN_16(0x01,0x80), // LOGICAL_MINIMUM (-32767)
HID_LOGICAL_MAX_16(0xFF,0x7F), // LOGICAL_MAXIMUM (32767)
HID_REPORT_SIZE(16),
HID_REPORT_COUNT(3),
HID_USAGE_SENSOR_UNITS_G,
HID_UNIT_EXPONENT(0xE),
HID_INPUT(Data_Var_Abs),
HID_USAGE_SENSOR_DATA_MOTION_INTENSITY,
HID_LOGICAL_MIN_8(0x00), //LOGICAL_MINIMUM (0)
HID_LOGICAL_MAX_8(0xFF), //LOGICAL_MAXIMUM (255)
HID_REPORT_SIZE(8),
HID_REPORT_COUNT(1),
HID_INPUT(Data_Var_Abs),