Condividi tramite


Driver di classe HID del sensore

A partire da Windows 8, il sistema operativo Windows include un driver di classe HID del sensore in box (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
  • Pressione atmosferica
  • Bussola 3D
  • Orientamento del dispositivo
  • Giroscopio 3D
  • Umidità
  • Inclinometro 3D
  • Presenza
  • Prossimità

La figura seguente illustra il flusso di dati indietro e indietro da due applicazioni del sensore verso il basso attraverso lo stack di driver e, infine, all'hardware stesso.

architettura del sensore client.

Supporto per sensori personalizzati

Oltre agli undici sensori trattati negli elenchi precedenti, il driver di classe supporta anche una classe Personalizzata. Questa classe consente a un produttore del sensore di integrare un dispositivo non trovato nell'elenco precedente: ad esempio, un sensore monoxide 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 di funzionalità o un report di input al driver di classe HID. Un report delle funzionalità viene inviato in risposta a una richiesta dal driver. Questo report contiene dati sulle proprietà, tra cui l'impostazione di riservatezza delle modifiche del sensore, l'intervallo di report e lo stato di report. Un report di input viene inviato alla 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 delle funzionalità al sensore. Ad esempio, quando l'applicazione richiede una nuova riservatezza delle modifiche o un 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:

modello 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 report corrente di un sensore, lo stato, la modifica della riservatezza e l'intervallo di report (oltre ad altre possibili proprietà). I report di input contengono letture del sensore: True o False per un commutatore, valori di forza G per un accelerometro o LUX per un sensore di luce ambientale.

Report delle funzionalità dell'accelerometro di esempio

Nell'esempio di codice seguente viene illustrato il report delle funzionalità HID per l'accelerometro. Si noti la natura auto-descrittiva di questo report. 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),

Report di input dell'accelerometro di esempio

Nell'esempio di codice seguente viene illustrato il report di input HID per lo stesso dispositivo. Si noti anche la natura auto-descrittiva dei campi in questo report.

//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),