Sdílet prostřednictvím


Ovladač třídy HID snímače

Od Windows 8 operační systém Windows obsahuje ovladač třídy HID (SensorsHIDClassDriver.dll), který podporuje jedenáct typů senzorů, které komunikují pomocí HID přenosu.

Tady je seznam podporovaných senzorů:

  • Akcelerometr 3D
  • Okolní světlo
  • Okolní teplota
  • Tlak vzduchu
  • Kompas 3D
  • Orientace zařízení
  • Gyroskop 3D
  • Vlhkost
  • 3D Inklinometr
  • Přítomnost
  • Blízkost

Následující obrázek znázorňuje tok dat ze dvou aplikací snímačů směrem dolů přes zásobník ovladačů a nakonec do samotného hardwaru.

architektura klientského senzoru.

Podpora vlastních senzorů

Kromě jedenácti senzorů zahrnutých v předchozích seznamech podporuje třídní ovladač také vlastní třídu. Tato třída umožňuje výrobci senzorů integrovat zařízení, které nebylo nalezeno v předchozím seznamu: Například senzor oxidu uhelnatého. Vlastní senzor se prezentuje rozhraní API senzoru jako vlastní zařízení s jedinečnými vlastnostmi.

Architektura a přehled

Pokud vytváříte firmware kompatibilního senzoru, budete potřebovat základní znalost V/V modelu podporovaného ovladačem třídy.

  • Senzor odešle buď zprávu o funkci, nebo vstupní zprávu ovladači třídy HID. Hlášení o vlastnostech se odešle v reakci na požadavek od ovladače. Tato sestava obsahuje data vlastností, včetně nastavení citlivosti změny senzoru, intervalu zprávy a stavu zprávy. Vstupní zpráva se odešle buď na žádost, nebo asynchronně v reakci na událost. Tato zpráva obsahuje skutečná data ze snímačů. Například u akcelerometru sestava obsahuje přetížení G podél os x, y a z.
  • Ovladač třídy HID odesílá do senzoru zprávy o funkcích. Když například aplikace požádá o nový interval citlivosti vůči změnám nebo interval sestavy, ovladač tyto hodnoty zabalí do reportu o funkcích a použije tento report k odeslání požadavku do firmwaru senzoru.

Následující diagram znázorňuje V/V model:

i/o model.

Ukázkový deskriptor zprávy

Pokud váš senzor podporuje jednu ze sedmi kategorií nativních pro třídní ovladač, jeho firmware musí podporovat konkrétní funkce a vstupní sestavy. Hlášení funkcí zahrnují aktuální stav hlášení senzoru, jeho stav, citlivost změny a interval hlášení (kromě dalších možných vlastností). Vstupní zprávy obsahují měření snímačů, například hodnoty Pravda nebo Nepravda pro přepínač, hodnoty přetížení (G-force) pro akcelerometr nebo LUX pro senzor okolního světla.

Ukázková zpráva o funzionalitě akcelerometru

Následující příklad kódu ukazuje výkaz funkcí HID pro akcelerometr. Všimněte si samopopisné povahy této sestavy. Zahrnuje minimální a maximální hodnoty a počet a velikost jednotlivých polí.

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

Ukázková zpráva o vstupu z akcelerometru

Následující příklad kódu ukazuje vstupní zprávu HID pro stejné zařízení. Znovu si všimněte samopopisné povahy polí v této zprávě.

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