이 문서에서는 호환되는 Windows 11 호스트에 연결하는 촉각 펜 디바이스에 대한 프로토콜 구현에 대해 자세히 설명합니다. 여기에는 펜 트랜스듀서 내에서 촉각 응답을 생성하기 위한 기계적 제약 조건, 전기 제약 조건 또는 구성 요소 선택에 대한 지침이 포함되지 않습니다. 이 구현 지침은 펜 트랜스듀서와 펜 디지타이저 간에 사용되는 펜 프로토콜과 관련이 없습니다. 그러나 구현에서는 펜 디지타이저가 촉각 응답을 변조하기 위해 펜 트랜스듀서에 추가 매개 변수를 제공할 수 있도록 하는 업링크 기능이 있는 펜 프로토콜을 사용하도록 선택할 수 있습니다.
디바이스 클래스
촉각 펜은 Windows에서 펜 장치 클래스의 확장입니다. 이 구현 가이드는 펜 구현 가이드 에 추가하고 펜 트랜스듀서 내에서 촉각을 구현하는 데 중점을 두므로 촉각 펜은 여기에 포함된 것 외에도 펜 구현 가이드 의 요구 사항을 충족해야 합니다.
디바이스 버스 연결
촉각 펜은 Microsoft에서 제공한 받은 편지함 드라이버를 사용하여 Bluetooth를 통해 HID를 사용하여 Windows 호스트에 연결해야 합니다.
촉각 펜 프로토콜 구현
여기에 제시된 정보를 이해할 수 있도록 HID 프로토콜을 잘 이해해야 합니다. HID 프로토콜에 대한 자세한 내용은 다음 리소스를 참조하세요.
Windows에는 HID 클래스 드라이버와 해당 HID Bluetooth 지원 미니포트 드라이버가 포함되어 있으므로 타사 미니 포트 드라이버가 필요하지 않습니다. 촉각 펜 디바이스 펌웨어는 이 항목에 설명된 사용량만 보고하면 됩니다. Windows는 펌웨어 및 자체 HID 드라이버를 사용하여 디바이스를 사용하도록 설정하고 Windows 애플리케이션에 디바이스에 대한 액세스 권한을 부여합니다.
샘플 설명자는 아래의 샘플 보고서 설명자 섹션에 제공됩니다.
필수 최상위 HID 컬렉션
촉각 펜 디바이스는 디바이스가 디지타이저/스타일러스(페이지 0x0D, 사용량 0x20)로 표시되는 최상위 컬렉션을 제공하는 방식으로 Windows 10 시스템에서 HID 프로토콜을 사용해야 합니다.
펜 디지타이저 입력 보고서
펜 디지타이저 컬렉션은 OS에 보고된 입력 보고서에서 트랜스듀서 일련 번호 및 트랜스듀서 공급업체 ID로 구성된 스타일러스 식별자를 보고해야 합니다. 스타일러스 컬렉션을 통해 동일한 스타일러스 식별자를 보고해야 합니다. 이를 통해 OS는 디지타이저에서 생성된 펜 입력과 스타일러스의 상관 관계를 지정할 수 있습니다. 펜 구현 가이드에 대한 자세한 내용은 펜 프로토콜 구현에서 확인할 수 있습니다.
변환기 일련 번호
Transducer 일련 번호는 펜 디지타이저와 통신하는 펜 액세서리에 사용되는 트랜스듀서에 대한 고유한 영구 식별자입니다. 이는 32비트여야 하며, 변환기 공급업체 ID로 식별되는 공급업체 또는 엔터티에 의해 정의됩니다. 펜 액세서리가 이 값 전송을 지원하지 않거나 전송이 완전히 수신되지 않았기 때문에 트랜스듀서 일련 번호를 디지타이저에 알 수 없는 경우 디지타이저는 호스트에 0을 보고해야 합니다. Null 위치는 호스트에서 지원되지 않습니다.
트랜스듀서 일련 번호 - 2부
Transducer 일련 번호 – 2부에서는 펜 액세서리에 사용되는 트랜스듀서에 대한 고유 영구 식별자의 일부로 32비트를 추가로 지정할 수 있습니다. 펜 액세서리가 이 값 전송을 지원하지 않거나 전송이 완전히 수신되지 않았기 때문에 트랜스듀서 일련 번호 – 2부를 디지타이저에 알 수 없는 경우 디지타이저는 호스트에 0을 보고해야 합니다. Null 위치는 호스트에서 지원되지 않습니다.
| 페이지 | 아이디 | 비고 |
|---|---|---|
| 0xD | 0x5B | 고유한 펜 식별에 종속된 기능에 대한 필수 사항(아래 참조) |
| 0xD | 0x6E | 추가 32비트별 일련 번호의 선택적 확장 |
Transducer 공급업체 ID
Transducer Vendor ID는 펜 디지타이저와 통신하는 펜 액세서리에 사용되는 트랜스듀서 제조업체와 통신하기 위한 필드입니다. 이는 제조업체 또는 IHV/OEM이 해당 목적을 위해 USB-IF 벤더 ID 사용을 승인하는 2바이트 USB-IF 할당 벤더 ID가 필요로 합니다.
| 페이지 | 아이디 | 비고 |
|---|---|---|
| 0xD | 0x91 | 고유한 펜 식별에 종속된 기능에 대한 필수 사항(아래 참조) |
고유한 펜 식별에 종속된 기능
펜 촉각과 같은 시나리오를 사용하도록 설정하려면 PenID 보고가 필수입니다(이 가이드의 촉각 기능에 필요).
또한 디지털 잉크 작업을 위해 여러 펜을 사용하는 시나리오의 경우 필수입니다. 다음은 그 예입니다.
- Windows의 화이트보드 앱은 각 펜을 특정 수동 입력 도구에 매핑할 수 있는 여러 펜 사용을 지원합니다.
- 일반적으로, 디지타이저가 화면에서 한 번에 단일 펜만 지원하더라도, 다양한 실제 펜에 특성 또는 동작을 할당하려는 앱입니다.
- 지원되는 디지타이저에서 여러 개의 동시 펜을 추적하려는 앱
촉각 출력 보고서
펜 디바이스가 촉각 피드백을 지원하는 경우 스타일러스 TLC 내에 촉각 피드백 컬렉션(페이지 0x0E, 사용량 0x01)을 포함하여 시스템과 애플리케이션이 이를 활용할 수 있습니다. HID 사양이 촉각 피드백을 지원하는 방법에 대한 자세한 내용은 HID 사양에 대한 Haptics 페이지 비준을 참조하세요.
호스트는 출력 보고서(촉각 피드백 수집을 통해)에서 다음 사용량을 사용하여 호스트가 촉각 펜 디바이스에 촉각 피드백 이벤트를 발급할 수 있도록 합니다. 디바이스가 촉각 피드백 수집을 노출하도록 선택하는 경우 호스트에서 시작한 촉각 피드백을 지원하도록 허용하려면 일부 사용이 필수입니다.
| 회원 | Description | 페이지 | 아이디 | 필수/선택 |
|---|---|---|---|---|
| 파형 목록 | 디바이스에서 지원하는 촉각 파형의 순서가 지정된 목록 | 0x0E | 0x10 | 필수 |
| 기간 목록 | 파형 목록에 있는 파형의 지속 시간에 대한 정렬된 목록 | 0x0E | 0x11 | 필수 |
| 자동 트리거 | 디바이스의 판단에 따라 자동으로 트리거되는 파형 | 0x0E | 0x20 | 필수 |
| 연결된 컨트롤 자동 트리거 | 촉각 피드백과 관련된 제어 장치의 HID 사용 | 0x0E | 0x22 | 필수 |
| 강렬 | 출력 - 수동 트리거 파형의 강도(백분율) | 0x0E | 0x23 | 선택적 |
| 반복 횟수 | 출력 - 초기 재생 후 수동 트리거 파형을 재생하는 횟수 | 0x0E | 0x24 | 선택적 |
| Retrigger 기간 | 출력 - 반복할 때 수동 트리거를 다시 트리거하기 전에 대기하는 시간 | 0x0E | 0x25 | 선택적 |
| 파형 컷오프 시간 | 차단되기 전에 수동 트리거 파형이 재생될 수 있는 최대 시간 | 0x0E | 0x28 | 선택적 |
파형 목록
파형 목록 사용은 서수로 정렬된 지원되는 파형의 HID 사용량 컬렉션을 나타냅니다. 미리 정의된 촉각 파형은 HID 사양에 정의됩니다. 펜 촉각 디바이스의 경우 이러한 파형은 서로 다른 시나리오에 해당하는 두 세그먼트로 분류될 수 있습니다.
- WAVEFORM_*CONTINOUS - 사용자가 펜, 연필 등과 같은 다양한 도구를 사용하여 적극적으로 수동 입력하는 동안 다양한 질감을 시뮬레이션하기 위한 잉크 기반 피드백입니다.
- WAVEFORM_* - 사용자가 단추 위로 마우스를 가져가고, 비활성화된 단추를 클릭하고, 잉크 셰이프 인식에 성공하는 등의 입력 기반 작업을 수행하는 경우에 대한 불연속적이고 비연속적인 상호 작용 기반 피드백입니다.
펜 촉각 디바이스에 대해 지원되는 파형의 전체 목록은 다음과 같습니다.
| 파형 | Description | 페이지 | 아이디 | 필수/선택 |
|---|---|---|---|---|
| WAVEFORM_NONE (파형 없음) | No-op. 진행 중인 파형의 재생 상태에 영향을 주지 않아야 합니다. | 0x0E | 0x1001 | 필수 |
| WAVEFORM_STOP | 진행 중인 파형의 재생을 중지합니다. | 0x0E | 0x1002 | 필수 |
| 파형_클릭 | 짧은 "클릭" 피드백을 만듭니다. 앱에서 선택한 상호 작용 피드백 파형이 촉각 펜에서 지원되지 않는 경우 기본 대체 | 0x0E | 0x1003 | 필수 |
| WAVEFORM_잉크연속 | 실제 볼 포인트 펜으로 수동 입력의 느낌을 시뮬레이션합니다. 잉킹 파형이 촉각 펜에서 지원되지 않는 경우 기본 예비 옵션. | 0x0E | 0x100B | 필수 |
| WAVEFORM_SUCCESS | 사용자에게 작업이 성공했음을 알리는 강력한 촉각 신호 | 0x0E | 0x1009 | 선택적 |
| WAVEFORM_ERROR | 사용자에게 작업이 실패했거나 오류가 발생했음을 알리는 강력한 촉각 신호 | 0x0E | 0x100A | 선택적 |
| WAVEFORM_HOVER | 사용자가 촉각 펜으로 대화형 UI 요소 위로 마우스를 가져간 경우 촉각 신호 | 0x0E | 0x1008 | 선택적 |
| WAVEFORM_PRESS | 사용자가 증분 작업에서 대화형 UI 요소를 누를 때에 대한 촉각 신호(릴리스 참조) | 0x0E | 0x1006 | 선택적 |
| WAVEFORM_RELEASE | 사용자가 증분 작업에서 대화형 UI 요소를 해제하는 경우에 대한 촉각 신호(Press 참조) | 0x0E | 0x1007 | 선택적 |
| WAVEFORM_PENCILCONTINUOUS | 사용자가 필기 도구로 연필을 선택할 때 연속적인 촉각 신호 | 0x0E | 0x100C | 선택적 |
| WAVEFORM_MARKERCONTINUOUS | 사용자가 잉킹 도구로 마커를 선택할 때 연속적인 촉각 신호 | 0x0E | 0x100D | 선택적 |
| WAVEFORM_CHISELMARKERCONTINUOUS | 사용자가 필기 도구로써 끌 마커/형광펜을 선택할 때 연속 진동 신호 | 0x0E | 0x100E | 선택적 |
| WAVEFORM_BRUSHCONTINUOUS | 사용자가 잉킹 도구로 브러시를 선택할 때 연속적인 촉각 신호 | 0x0E | 0x100F | 선택적 |
| 파형_지우개연속(파형 - eraser 기능) | 사용자가 잉킹 도구로 지우개를 선택할 때 지속적인 촉각 신호 | 0x0E | 0x1010 | 선택적 |
| WAVEFORM_SPARKLECONTINUOUS | 멀티 컬러 브러시와 같은 특수 잉크 도구에 대한 연속 촉각 신호 | 0x0E | 0x1011 | 선택적 |
비고
필수는 아니지만 보다 완전한 사용자 환경을 제공하기 위해 다른 열거형 파형도 구현하는 것이 좋습니다. 특히 WAVEFORM_PRESS 및 WAVEFORM_RELEASE 중요한 상호 작용 피드백을 제공하므로 권장됩니다.
모든 HID 규격 촉각 디바이스에는 WAVEFORM_NONE 및 WAVEFORM_STOP 모두 필요합니다. 서수 1과 2는 암시적으로 WAVEFORM_NONE 및 WAVEFORM_STOP로 설정됩니다. 파형 목록 또는 기간 목록에서 선언할 필요가 없습니다. Waveform 목록은 목록에서 각 서수의 실제 최소값과 최대값으로 지원되는 파형을 선언합니다.
기간 목록
기간 목록 사용량은 서수로 정렬된 파형 목록에 있는 지원되는 파형의 기간 모음을 나타냅니다. 파형 지속 시간 단위는 밀리초이고 지속 시간은 비연속 파형에 대해 0이 아닌 양의 값이어야 합니다. 파형이 연속된 경우(호스트에 의해 중지되거나 파형 차단 시간이 초과될 때까지 재생됨) 해당 기간은 0으로 정의됩니다.
WAVEFORM_NONE 및 WAVEFORM_STOP 기간은 0으로 간주됩니다. 기간 목록에 선언할 필요가 없습니다.
강렬
강도 사용량은 파형에 적용할 최대 강도의 백분율을 나타냅니다. 이 값은 0~100% 사이여야 합니다. 100%는 최대 강도로 디바이스에 의해 파형이 트리거되고 0%는 촉각 트랜스듀서가 활성화되지 않음을 나타냅니다.
반복 횟수
반복 횟수 사용량은 파형을 반복하는 횟수를 나타냅니다. 0의 반복 횟수는 수동 트리거 파형이 한 번만 재생되어야 하며 반복되지 않음을 나타냅니다. 파형 컷오프 시간을 초과하면 불완전한 반복이 무시될 것으로 예상됩니다.
Retrigger 기간
Retrigger 기간 사용량은 반복 수로 지정된 값에 따라 출력 보고서에서 수동 트리거 파형을 반복하기 전에 디바이스가 대기하는 시간을 나타냅니다. 이 값의 단위는 밀리초입니다. Retrigger 기간이 재생 중인 파형의 지속 시간보다 짧으면, Retrigger 기간에 표시된 시간에 파형을 중지하고 다시 시작해야 합니다.
파형 컷오프 시간
파형 컷오프 시간 사용량은 디바이스에서 수동 트리거 파형을 재생을 종료하기 전에 반복할 수 있는 최대 시간을 나타냅니다. 이 값은 디바이스에 대한 상수 값이며 설정된 기간이 없는 연속 파형과 여러 번 반복되도록 설정된 불연속 지속 시간이 있는 파형을 모두 포함합니다. 이 값의 단위는 밀리초입니다.
촉각 출력 보고서
호스트는 출력 보고서에서 다음 사용 방법을 사용하여 촉각 피드백 이벤트를 Haptic Pen 디바이스에 전달합니다. 일부 사용법은 Windows 호스트 구현과의 호환성을 위해 필수입니다.
| 회원 | Description | 페이지 | 아이디 | 필수/선택 |
|---|---|---|---|---|
| 수동 트리거 | 호스트에서 명시적 명령으로 실행하기 위한 파형 | 0x0E | 0x21 | 필수 |
| 강렬 | 수동 트리거 파형의 강도(백분율) | 0x0E | 0x23 | 필수 |
| 반복 횟수 | 초기 재생 후 수동 트리거 파형을 재생하는 횟수 | 0x0E | 0x24 | 선택적 |
| Retrigger 기간 | 반복할 때 수동 트리거를 다시 시도하기 전에 대기하는 시간 | 0x0E | 0x25 | 선택적 |
수동 트리거
수동 트리거 사용은 호스트에서 재생하도록 요청된 파형 목록에서 지원되는 파형 사용을 나타냅니다. WAVEFORM_NONE 이외의 수동 트리거가 포함된 출력 보고서를 디바이스로 보내면 출력 보고서에 포함된 추가 속성(강도, 반복 횟수, Retrigger 기간)을 사용하여 지정된 파형 재생을 즉시 시작해야 합니다. 출력 보고서에 WAVEFORM_STOP 수동 트리거가 포함된 경우 진행 중인 파형 재생을 중지해야 합니다.
강도, 반복 횟수 및 Retrigger 기간 사용량은 출력 기능 보고서와 관련하여 이전 섹션을 참조하세요.
햅틱 시작 및 중지
아래 순서도는 펜의 촉각 신호를 구성, 지우기, 시작 및 중지해야 하는 시기를 설명합니다.
아래에 설명된 다양한 촉각 상태는 다음과 같습니다.
- 재생 중 : 펜이 촉각적 파형을 적극적으로 재생 중입니다.
- 일시 중지됨: 펜이 파형으로 구성되었지만 적극적으로 재생되지 않음
- 중지됨: 펜이 파형으로 구성되지 않고 적극적으로 아무 것도 재생하지 않습니다.
디지타이저의 펜 상태에 대해서는 Windows 펜 상태를 참조하세요.
비고
펜이 범위를 벗어나면 촉각 구성을 지우는 것이 좋지만 필수는 아닙니다. 이는 아래 다이어그램에서 "펜: 범위 내; 촉각: 일시 중지됨" 상태에서 펜이 범위를 벗어날 때 나오는 두 개의 대체 경로를 통해 전달됩니다.
비고
호스트는 언제든지 비연속 파형 재생을 요청할 수 있습니다. 이 경우, 펜은 재생을 완료한 후 이전 상태로 돌아가야 합니다.
비고
호스트는 연속 파형만 구성해야 합니다. 불연속/비연속 파형은 수동으로만 트리거됩니다.
키보드 컬렉션(선택 사항)
HID 키보드 보고서를 통해 호스트에 대한 테일 엔드 단추 클릭을 보고할 수 있도록 하는 선택적 기능입니다.
호환되는 디바이스는 호스트에 노출된 HID Bluetooth 키보드 디바이스를 통해 3개의 고유한 단추 동작에 해당하는 3가지 고유한 키보드 조합을 보고해야 합니다. 작업 및 해당 키보드 조합은 아래에 설명되어 있습니다.
| 단추 동작 | 키 조합 |
|---|---|
| 한 번 클릭 | WIN+F20 |
| 두 번 클릭 | WIN+F19 |
| 길게 누르기 | Win+F18 |
Bluetooth 단추 구현
테일 엔드 Bluetooth 단추를 구현하기 위해 디바이스는 호스트에 노출된 HID Bluetooth LE 키보드 디바이스를 통해 3개의 고유한 단추 동작에 해당하는 3가지 고유한 키보드 조합을 보고합니다. 작업 및 해당 키보드 조합은 아래에 설명되어 있습니다.
| Bluetooth 단추 동작 | 보고를 위한 키 조합 |
|---|---|
| 한 번 클릭 | WIN+F20 |
| 두 번 클릭 | WIN+F19 |
| 길게 누르기 | WIN+F18 |
펜 보관
Windows 10 버전 1903부터 Windows는 호환되는 펜 저장을 통합하는 디바이스에 대한 알림을 지원합니다. 이 메커니즘은 제거 또는 교체되는 펜을 감지하고 한 쌍의 바로 가기 조합에 대한 해당 HID 키보드 보고서를 생성하는 하드웨어에 의존합니다. 도크 신호를 보내려면(펜이 보관함에 꽂혔을 때) WIN+CTRL+F20을 보고하고, 페독 신호를 보내려면(펜이 보관함에서 제거되었을 때) WIN+CTRL+F19를 보고합니다. 펌웨어 또는 드라이버로 구현할 수 있습니다.
이러한 도킹 취소/도킹 이벤트는 셸 잉크 작업 영역 메뉴를 가져오거나 해제합니다. Windows 10부터 버전 2004 Office는 개발자가 stowage 이벤트를 인식할 수 있도록 애플리케이션을 확장할 수 있는 플랫폼 API 를 사용하여 이러한 이벤트에 대응합니다. 펜이 도크에 있는지 여부를 쿼리할 수 없으며, 앱은 포그라운드에 있는 경우 제거 및 반환 이벤트에 대한 알림만 받습니다.
샘플 HID 보고서 설명자
05,0D, // Usage Page (Digitizers)
09,20, // Usage (Stylus)
A1,01, // Collection (Application)
85,40, // Report ID (64)
95,01, // Report Count (1)
75,20, // Report Size (32)
17,00,00,00,80, // Logical Minimum (-2147483648)
27,FF,FF,FF,7F, // Logical Maximum (2147483647)
09,5B, // Transducer Serial Number
81,02, // Input (Data,Var,Abs)
75,10, // Report Size (16)
15,01, // Logical Minimum (1)
27,FF,FF,00,00, // Logical Maximum (65535)
09,91, // Transducer Vendor ID
81,02, // Input (Data,Var,Abs)
05,0E, // Usage Page (Haptics)
09,01, // Usage (0x01)
A1,02, // Collection (Logical)
85,41, // Report ID (65)
95,01, // Report Count (1)
75,08, // Report Size (8)
15,01, // Logical Minimum (1)
26,FF,00, // Logical Maximum (255)
09,24, // Usage (0x24)
B1,02, // Feature (Data,Var,Abs)
09,24, // Usage (0x24)
91,02, // Output (Data,Var,Abs)
09,23, // Usage (0x23)
B1,02, // Feature (Data,Var,Abs)
09,23, // Usage (0x23)
91,02, // Output (Data,Var,Abs)
15,01, // Logical Minimum (1)
25,12, // Logical Maximum (18)
09,20, // Usage (0x20)
B1,02, // Feature (Data,Var,Abs)
09,21, // Usage (0x21)
91,02, // Output (Data,Var,Abs)
15,00, // Logical Minimum (0)
26,FE,00, // Logical Maximum (254)
66,01,10, // Unit (SI Linear)
55,FD, // Unit Exponent (253)
35,00, // Physical Minimum (0)
46,EC,09, // Physical Maximum (2540)
09,28, // Usage (0x28)
91,02, // Output (Data,Var,Abs)
75,10, // Report Size (16)
26,D0,07, // Logical Maximum (2000)
46,D0,07, // Physical Maximum (2000)
09,25, // Usage (0x25)
91,02, // Output (Data,Var,Abs)
09,25, // Usage (0x25)
B1,02, // Feature (Data,Var,Abs)
45,00, // Physical Maximum (0)
85,42, // Report ID (66)
75,20, // Report Size (32)
17,42,00,0D,00, // Logical Minimum (852034)
27,42,00,0D,00, // Logical Maximum (852034)
09,22, // Usage (0x22)
B1,02, // Feature (Data,Var,Abs)
09,11, // Usage (0x11)
A1,02, // Collection (Logical)
05,0A, // Usage Page (Ordinal)
75,10, // Report Size (16)
95,10, // Report Count (16)
15,01, // Logical Minimum (1)
27,FF,FF,00,00, // Logical Maximum (65535)
19,03, // Usage Minimum (0x03)
29,12, // Usage Maximum (0x12)
B1,02, // Feature (Data,Var,Abs)
C0, // End Collection ()
05,0E, // Usage Page (Haptics)
09,10, // Usage (0x10)
A1,02, // Collection (Logical)
05,0A, // Usage Page (Ordinal)
16,03,10, // Logical Minimum (4099)
26,FF,2F, // Logical Maximum (12287)
19,03, // Usage Minimum (0x03)
29,12, // Usage Maximum (0x12)
B1,02, // Feature (Data,Var,Abs)
C0, // End Collection ()
C0, // End Collection ()
C0 // End Collection ()