Nota
L'accesso a questa pagina richiede l'autorizzazione. Puoi provare ad accedere o a cambiare directory.
L'accesso a questa pagina richiede l'autorizzazione. Puoi provare a cambiare directory.
A partire da Windows 8, il sistema operativo Windows include un driver di classe HID del sensore integrato (SensorsHIDClassDriver.dll), che supporta undici tipi di sensori che comunicano usando il trasporto HID.
Ecco un elenco dei sensori supportati:
- Accelerometro 3D
- Luce ambientale
- Temperatura ambiente
- Pressione atmosferica
- Bussola 3D
- Orientamento del dispositivo
- Giroscopio 3D
- Umidità
- Inclinometro 3D
- Presenza
- Prossimità
La figura seguente illustra il flusso di dati da due applicazioni del sensore fino allo stack di driver e, infine, all'hardware stesso.
Supporto per sensori personalizzati
Oltre agli undici sensori coperti negli elenchi precedenti, il driver di classe supporta anche una classe Custom. Questa classe consente a un produttore di sensori di integrare un dispositivo non trovato nell'elenco precedente: ad esempio, un sensore monossido di carbonio. Il sensore personalizzato si presenta all'API del sensore come dispositivo personalizzato con proprietà univoce.
Architettura e panoramica
Se si sta creando il firmware per un sensore compatibile, è necessaria una conoscenza di base del modello di I/O supportato dal driver di classe.
- Il sensore invia un report delle funzionalità o un report di input al driver di classe HID. Un report di funzionalità viene inviato in risposta a una richiesta del driver. Questo report contiene dati sulle proprietà, tra cui l'impostazione della sensibilità ai cambiamenti del sensore, l'intervallo di segnalazione e il suo stato di segnalazione. Un report di input viene inviato su richiesta o in modo asincrono in risposta a un evento. Questo report contiene i dati effettivi del sensore. Ad esempio, per un accelerometro, il report contiene le forze G lungo gli assi x, y e z.
- Il driver di classe HID invia report sulle funzionalità al sensore. Ad esempio, quando l'applicazione richiede una nuova sensibilità ai cambiamenti o un nuovo intervallo di report, il driver inserisce questi valori in un report delle funzionalità e usa questo report per inviare la richiesta al firmware del sensore.
Il diagramma seguente illustra il modello di I/O:
Descrittore di report di esempio
Se il sensore supporta una delle sette categorie native del driver di classe, il firmware dovrà supportare report di input e funzionalità specifici. I report delle funzionalità includono lo stato di segnalazione corrente di un sensore, lo stato, la modifica della sensibilità e l'intervallo di report (oltre ad altre proprietà possibili). I report di input contengono letture dei sensori: True o False per un commutatore, valori di forza G per un accelerometro o LUX per un sensore di luce ambientale.
Report di funzionalità dell'accelerometro di esempio
L'esempio di codice seguente mostra il report delle funzionalità HID per l'accelerometro. Si noti la natura autodescrittiva di questa relazione. Include valori minimi e massimi e il conteggio e le dimensioni dei singoli campi.
//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),
Rapporto di input dell'accelerometro di esempio
L'esempio di codice seguente mostra il report di input HID per lo stesso dispositivo. Anche in questo caso, si noti la natura auto-descrittiva dei campi in questo rapporto.
//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),