센서 HID 클래스 드라이버
Windows 8 시작하여 Windows 운영 체제에는 HID 전송을 사용하여 통신하는 11가지 유형의 센서를 지원하는 기본 제공 센서 HID 클래스 드라이버(SensorsHIDClassDriver.dll)가 포함되어 있습니다.
지원되는 센서 목록은 다음과 같습니다.
- 가속도계 3D
- 주변 광원
- 주변 온도
- 대기압
- 나침반 3D
- 디바이스 방향
- 자이로스코프 3D
- 습도
- 경사계 3D
- 현재 상태
- 근접성
다음 그림에서는 두 센서 애플리케이션에서 드라이버 스택을 거쳐 하드웨어 자체로의 데이터 흐름을 보여 줍니다.
사용자 지정 센서 지원
이전 목록에서 다루는 11개의 센서 외에도 클래스 드라이버는 Custom 클래스도 지원합니다. 이 클래스를 사용하면 센서 제조업체가 이전 목록에서 찾을 수 없는 디바이스(예: 일산화탄소 센서)를 통합할 수 있습니다. 사용자 지정 센서는 고유한 속성을 가진 사용자 지정 디바이스로 센서 API에 자신을 제공합니다.
아키텍처 및 개요
호환되는 센서용 펌웨어를 만드는 경우 클래스 드라이버에서 지원하는 I/O 모델에 대한 기본적인 이해가 필요합니다.
- 센서는 기능 보고서 또는 입력 보고서를 HID 클래스 드라이버에 보냅니다. 드라이버의 요청에 대한 응답으로 기능 보고서가 전송됩니다. 이 보고서에는 센서의 변경 민감도 설정, 보고서 간격 및 보고 상태를 포함한 속성 데이터가 포함됩니다. 입력 보고서는 요청에 따라 전송되거나 이벤트에 대한 응답으로 비동기적으로 전송됩니다. 이 보고서에는 실제 센서 데이터가 포함되어 있습니다. 예를 들어 가속도계의 경우 보고서에는 x-, y-및 z축을 따라 G-forces가 포함됩니다.
- HID 클래스 드라이버는 센서에 기능 보고서를 보냅니다. 예를 들어 애플리케이션이 새 변경 민감도 또는 보고서 간격을 요청할 때 드라이버는 이러한 값을 기능 보고서에 패키지하고 이 보고서를 사용하여 센서의 펌웨어에 요청을 보냅니다.
다음 다이어그램은 I/O 모델을 보여 줍니다.
샘플 보고서 설명자
센서가 클래스 드라이버의 네이티브인 7가지 범주 중 하나를 지원하는 경우 해당 펌웨어는 특정 기능 및 입력 보고서를 지원해야 합니다. 기능 보고서에는 센서의 현재 보고 상태, 상태, 변경 민감도 및 보고 간격(기타 가능한 속성 외에)이 포함됩니다. 입력 보고서에는 센서 판독값이 포함됩니다. 스위치의 경우 True 또는 False, 가속도계의 경우 G-force 값 또는 주변 광원 센서의 경우 LUX입니다.
샘플 가속도계 기능 보고서
다음 코드 예제에서는 가속도계에 대한 HID 기능 보고서를 보여줍니다. 이 보고서의 자체 설명 특성을 확인합니다. 여기에는 최소 및 최대 값과 개별 필드의 개수 및 크기가 포함됩니다.
//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),
샘플 가속도계 입력 보고서
다음 코드 예제에서는 동일한 디바이스에 대한 HID 입력 보고서를 보여줍니다. 이 보고서에서 필드의 자체 설명 특성을 다시 확인합니다.
//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),