2017-12-18 37 views
3

저는 Windows 컴퓨터에 연결하고 컴퓨터의 터치 스크린을 시뮬레이트하는 Arduino 장치를 만들고 있습니다. 이 화면은 Arduino에 속하지 않지만 Arduino는 HID 터치 메시지를 USB를 통해 Windows 10 컴퓨터에 전달합니다.USB HID 멀티 터치 직렬보고

내가 한 첫 번째 작업은 Digitizer 이벤트 대신 AbsoluteMouse 이벤트를 릴레이하는 것이 었습니다. 이것은 나를 위해 잘 일했다. 그러나 내 장치가 여러 터치를 지원하므로 AbsoluteMouse 대신 멀티 터치 HID 메시지를 사용하고 싶습니다. 개념의 증거로서, 나는 단지 하나의 손가락의 데이터만을 중계하는 것으로 시작하고있다. (나는 이것을 작동 시키면 더 많은 손가락을 추가 할 계획이다). 내가 AbsoluteMouse를 사용하는 많은 예제를 발견

그래서 기본적으로 내가하지 않았다 : 구현하는 가장 쉬운 것으로 보인다 나는 SerialReport 접근 방식을 복용하고 HID 보고서를 복사하여 붙여 넣는 것보다 훨씬 많은 작업을 수행 할 수 있습니다. 그러나 터치 스크린을 사용하면 코드 샘플을 찾기가 매우 어렵습니다. (나는 단지 시냅스 터치 패드 샘플이 터치 스크린이 아닌 것을 발견했다). 이와 같이 터치 메시지를보고하기 위해 자체 코드를 구현하려고했습니다. 그러나 이것은 실패합니다. HID 설명자를 해석하는 방법을 이해할 수는 있겠지만 이것이 처음이기 때문에 확실하지 않습니다 ... 메시지 구조에 문제가 있습니까?

typedef union { 
    struct{ 
    uint8_t TipSwitchLsb4Bits_InRange_Confidence_Empty2Bits; 
    uint8_t Padding8_10Minus2; 
    int16_t xAxis; 
    int16_t yAxis; 
    int16_t width; 
    int16_t height; 
    int16_t ContactId; 
    uint8_t MaximumCount; 
    }; 
} HID_SerialTouchReport; 

void reportTouch(unsigned int x, unsigned int y) { 
    HID_SerialTouchReport report; 
    report.TipSwitchLsb4Bits_InRange_Confidence_Empty2Bits=0xff; 
    report.xAxis=x; 
    report.yAxis=y; 
    report.width=4; 
    report.height=4; 
    report.ContactId=0; 
    report.MaximumCount=1; 
    HID().SendReport(REPORTID_MTOUCH,&report,sizeof(report)); 
} 

... 
    static HIDSubDescriptor node(_hidSerialMultiTouchDescriptor, sizeof(_hidSerialMultiTouchDescriptor)); 
HID().AppendDescriptor(&node); 
... 

//Move the pointer diagonally across the screen: 
for(unsigned int x=0;x<32767;x+=1000) { 
    reportTouch(x,x); 
    delay(50); 
} 

테스트 코드가 MSPAINT에 오른쪽 아래 왼쪽 상단에서 대각선을 그릴 예정이다 :

#define REPORTID_MTOUCH     1 

static const uint8_t _hidSerialMultiTouchDescriptor[] PROGMEM = { 
    //https://docs.microsoft.com/en-us/windows-hardware/design/component-guidelines/sample-report-descriptor--serial-reporting-mode- 
    //linked from: https://docs.microsoft.com/en-us/windows-hardware/design/component-guidelines/selecting-packet-reporting-modes-in-multitouch-drivers 
    0x05, 0x0d,       // USAGE_PAGE (Digitizers) 
    0x09, 0x04,       // USAGE (Touch Screen) 
    0xa1, 0x01,       // COLLECTION (Application) 
    0x85, REPORTID_MTOUCH,    // REPORT_ID (Touch) 
    0x09, 0x22,       // USAGE (Finger) 
    0xa1, 0x00,       // COLLECTION (Physical) 
    0x09, 0x42,       //  USAGE (Tip Switch) 
    0x15, 0x00,       //  LOGICAL_MINIMUM (0) 
    0x25, 0x01,       //  LOGICAL_MAXIMUM (1) 
    0x75, 0x01,       //  REPORT_SIZE (1) 
    0x95, 0x01,       //  REPORT_COUNT (1) 
    0x81, 0x02,       //  INPUT (Data,Var,Abs) 
    0x95, 0x03,       //  REPORT_COUNT (3) 
    0x81, 0x03,       //  INPUT (Cnst,Ary,Abs) 
    0x09, 0x32,       //  USAGE (In Range) 
    0x09, 0x47,       //  USAGE (Confidence) 
    0x95, 0x02,       //  REPORT_COUNT (2) 
    0x81, 0x02,       //  INPUT (Data,Var,Abs) 
    0x95, 0x0a,       //  REPORT_COUNT (10) 
    0x81, 0x03,       //  INPUT (Cnst,Ary,Abs) 
    0x05, 0x01,       //  USAGE_PAGE (Generic Desk.. 
    0x26, 0xff, 0x7f,     //  LOGICAL_MAXIMUM (32767) 
    0x75, 0x10,       //  REPORT_SIZE (16) 
    0x95, 0x01,       //  REPORT_COUNT (1) 
    0x65, 0x00,       //  UNIT (None) 
    0x09, 0x30,       //  USAGE (X) 
    0x81, 0x02,       //  INPUT (Data,Var,Abs) 
    0x09, 0x31,       //  USAGE (Y) 
    0x46, 0x00, 0x00,     //  PHYSICAL_MAXIMUM (0) 
    0x81, 0x02,       //  INPUT (Data,Var,Abs) 
    0x05, 0x0d,       //  USAGE PAGE (Digitizers) 
    0x09, 0x48,       //  USAGE (Width) 
    0x09, 0x49,       //  USAGE (Height) 
    0x95, 0x01,       //  REPORT_COUNT (2) 
    0x81, 0x02,       //  INPUT (Data,Var,Abs) 
    0x81, 0x03,       //  INPUT (Cnst,Ary,Abs) 
    0x09, 0x51,       //  USAGE (Contact Identifier) 
    0x75, 0x10,       //  REPORT_SIZE (16) 
    0x95, 0x02,       //  REPORT_COUNT (1) 
    0x81, 0x02,       //  INPUT (Data,Var,Abs) 
    0x09, 0x55,       // USAGE(Maximum Count) 
    0x15, 0x00,       // LOGICAL_MINIMUM (0) 
    0x25, 0x08,       // LOGICAL_MAXIMUM (255) 
    0x75, 0x08,       // REPORT_SIZE (8) 
    0x95, 0x01,       // REPORT_COUNT (1) 
    0xb1, 0x02,       // FEATURE (Data,Var,Abs) 
    0xc0,        // END_COLLECTION 
    0xc0        // END_COLLECTION 
}; 

이 말했다 메시지의 내 구현입니다.

내가 이것을 AbsoluteMouse 서술자/메시지로 테스트 할 때 모든 것이 작동합니다. 그래서 나는 HID_SerialTouchReport 정의에 문제가 있다고 추정한다. 내 관심을 잡고있다

어떤 것들은 : 여전히 "USAGE (Y)"를 정의하는 동안

  1. 왜 "PHYSICAL_MAXIMUM (0)"오지 않습니다. 그것은 Y와 관련이 있으며 X가 아닌 것입니까? 그리고 그것은 왜 "0"입니까?
  2. 높이와 너비에 대한 "INPUT (Cnst, Ary, Abs)"의 "Ary"의 의미는 무엇입니까?
  3. "report.TipSwitchLsb4Bits_InRange_Confidence_Empty2Bits = 0xff;"로 일종의 "푸딩"을합니다. 그러나 이것은 모든 비 패드 비트가 "1"로 설정되어야한다고 생각하기 때문에 나에게 괜찮은 것처럼 보입니다.
  4. report.MaximumCount를 설정해야할지 잘 모르겠습니다. 나는 다른 수의 실험을 시도했다. & Id 값은 모두 효과가 없었다.
  5. 내 Arduino는 장치 관리자에 "복합 장치"로 표시되므로 모든 문제가 잘못된 것은 아닙니다.
  6. "직렬 패킷"모드는 레거시 Windows 7 용으로 연결되었으며 Windows 10을 사용하고 있습니다.하지만 문제는 아닙니다.
  7. Microsoft 사이트에서 직접 HID 설명자를 복사했지만 메시지 구조를 제대로 구성하지 못했습니다. (약간의 비트를 잊어 버렸습니까?)

아니면 코드가 완전히 작동하지 않는 것입니까?

+0

은 0x09, 0x48, // USAGE (폭) 은 0x09, 0x49까지는, // USAGE (높이) 에 0x95, 0x01로는, // REPORT_COUNT (2) 는 ...해야한다 : 은 0x09, 0x48, // 0x39, 0x49, // USAGE (높이) 0x95, 0x02, // REPORT_COUNT (2) (들여 쓰기에 대한 죄송합니다. – aja

답변

1

확실히 말하기는 어렵지만 HID 보고서 설명자가 HID_SerialTouchReport 구조와 일치하지 않는 것처럼 보입니다. 다음은 내가 당신의 설명을 디코딩하는 방법입니다 : 내가 너비와 높이에 대한 올바른 보고서 수를 설정하고 (? 불필요) 패드 바이트, 불필요한 UNIT 및 PHYSICAL_MAXIMUM 및 중복 GLOBAL 항목 및 변화를 제거

//-------------------------------------------------------------------------------- 
// Decoded Application Collection 
//-------------------------------------------------------------------------------- 

/* 
05 0D  (GLOBAL) USAGE_PAGE   0x000D Digitizer Device Page 
09 04  (LOCAL) USAGE    0x000D0004 Touch Screen (CA=Application Collection) 
A1 01  (MAIN) COLLECTION   0x00000001 Application (Usage=0x000D0004: Page=Digitizer Device Page, Usage=Touch Screen, Type=CA) 
85 01   (GLOBAL) REPORT_ID   0x01 (1) 
09 22   (LOCAL) USAGE    0x000D0022 Finger (CL=Logical Collection) 
A1 00   (MAIN) COLLECTION   0x00000000 Physical (Usage=0x000D0022: Page=Digitizer Device Page, Usage=Finger, Type=CL) <-- Warning: USAGE type should be CP (Physical) 
09 42   (LOCAL) USAGE    0x000D0042 Tip Switch (MC=Momentary Control) 
15 00   (GLOBAL) LOGICAL_MINIMUM 0x00 (0) <-- Redundant: LOGICAL_MINIMUM is already 0 <-- Info: Consider replacing 15 00 with 14 
25 01   (GLOBAL) LOGICAL_MAXIMUM 0x01 (1) 
75 01   (GLOBAL) REPORT_SIZE  0x01 (1) Number of bits per field 
95 01   (GLOBAL) REPORT_COUNT  0x01 (1) Number of fields 
81 02   (MAIN) INPUT    0x00000002 (1 field x 1 bit) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap 
95 03   (GLOBAL) REPORT_COUNT  0x03 (3) Number of fields 
81 03   (MAIN) INPUT    0x00000003 (3 fields x 1 bit) 1=Constant 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap 
09 32   (LOCAL) USAGE    0x000D0032 In Range (MC=Momentary Control) 
09 47   (LOCAL) USAGE    0x000D0047 Confidence (DV=Dynamic Value) 
95 02   (GLOBAL) REPORT_COUNT  0x02 (2) Number of fields 
81 02   (MAIN) INPUT    0x00000002 (2 fields x 1 bit) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap 
95 0A   (GLOBAL) REPORT_COUNT  0x0A (10) Number of fields 
81 03   (MAIN) INPUT    0x00000003 (10 fields x 1 bit) 1=Constant 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap 
05 01   (GLOBAL) USAGE_PAGE   0x0001 Generic Desktop Page 
26 FF7F   (GLOBAL) LOGICAL_MAXIMUM 0x7FFF (32767) 
75 10   (GLOBAL) REPORT_SIZE  0x10 (16) Number of bits per field 
95 01   (GLOBAL) REPORT_COUNT  0x01 (1) Number of fields 
65 00   (GLOBAL) UNIT    0x00000000 No unit (0=None) <-- Redundant: UNIT is already 0x00000000 
09 30   (LOCAL) USAGE    0x00010030 X (DV=Dynamic Value) 
81 02   (MAIN) INPUT    0x00000002 (1 field x 16 bits) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap 
09 31   (LOCAL) USAGE    0x00010031 Y (DV=Dynamic Value) 
46 0000   (GLOBAL) PHYSICAL_MAXIMUM 0x0000 (0) <-- Redundant: PHYSICAL_MAXIMUM is already 0 <-- Info: Consider replacing 46 0000 with 44 
81 02   (MAIN) INPUT    0x00000002 (1 field x 16 bits) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap 
05 0D   (GLOBAL) USAGE_PAGE   0x000D Digitizer Device Page 
09 48   (LOCAL) USAGE    0x000D0048 Width (DV=Dynamic Value) 
09 49   (LOCAL) USAGE    0x000D0049 Height (DV=Dynamic Value) 
95 01   (GLOBAL) REPORT_COUNT  0x01 (1) Number of fields <-- Redundant: REPORT_COUNT is already 1 
81 02   (MAIN) INPUT    0x00000002 (1 field x 16 bits) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap 
81 03   (MAIN) INPUT    0x00000003 (1 field x 16 bits) 1=Constant 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap 
09 51   (LOCAL) USAGE    0x000D0051 Contact Identifier (DV=Dynamic Value) 
75 10   (GLOBAL) REPORT_SIZE  0x10 (16) Number of bits per field <-- Redundant: REPORT_SIZE is already 16 
95 02   (GLOBAL) REPORT_COUNT  0x02 (2) Number of fields 
81 02   (MAIN) INPUT    0x00000002 (2 fields x 16 bits) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap 
09 55   (LOCAL) USAGE    0x000D0055 Contact Count Maximum (SV=Static Value) 
15 00   (GLOBAL) LOGICAL_MINIMUM 0x00 (0) <-- Redundant: LOGICAL_MINIMUM is already 0 <-- Info: Consider replacing 15 00 with 14 
25 08   (GLOBAL) LOGICAL_MAXIMUM 0x08 (8) 
75 08   (GLOBAL) REPORT_SIZE  0x08 (8) Number of bits per field 
95 01   (GLOBAL) REPORT_COUNT  0x01 (1) Number of fields 
B1 02   (MAIN) FEATURE   0x00000002 (1 field x 8 bits) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap 
C0    (MAIN) END_COLLECTION  Physical 
C0   (MAIN) END_COLLECTION  Application 
*/ 

//-------------------------------------------------------------------------------- 
// Digitizer Device Page featureReport 01 (Device <-> Host) 
//-------------------------------------------------------------------------------- 

typedef struct 
{ 
    uint8_t reportId;         // Report ID = 0x01 (1) 
                // Collection: TouchScreen Finger 
    uint8_t DIG_TouchScreenFingerContactCountMaximum; // Usage 0x000D0055: Contact Count Maximum, Value = 0 to 8 
} featureReport01_t; 


//-------------------------------------------------------------------------------- 
// Digitizer Device Page inputReport 01 (Device --> Host) 
//-------------------------------------------------------------------------------- 

typedef struct 
{ 
    uint8_t reportId;         // Report ID = 0x01 (1) 
                // Collection: TouchScreen Finger 
    uint8_t DIG_TouchScreenFingerTipSwitch : 1;  // Usage 0x000D0042: Tip Switch, Value = 0 to 1 
    uint8_t : 1;          // Pad 
    uint8_t : 1;          // Pad 
    uint8_t : 1;          // Pad 
    uint8_t DIG_TouchScreenFingerInRange : 1;   // Usage 0x000D0032: In Range, Value = 0 to 1 
    uint8_t DIG_TouchScreenFingerConfidence : 1;  // Usage 0x000D0047: Confidence, Value = 0 to 1 
    uint8_t : 1;          // Pad 
    uint8_t : 1;          // Pad 
    uint8_t : 1;          // Pad 
    uint8_t : 1;          // Pad 
    uint8_t : 1;          // Pad 
    uint8_t : 1;          // Pad 
    uint8_t : 1;          // Pad 
    uint8_t : 1;          // Pad 
    uint8_t : 1;          // Pad 
    uint8_t : 1;          // Pad 
    uint16_t GD_TouchScreenFingerX;     // Usage 0x00010030: X, Value = 0 to 32767 
    uint16_t GD_TouchScreenFingerY;     // Usage 0x00010031: Y, Value = 0 to 32767 
    uint16_t DIG_TouchScreenFingerWidth;    // Usage 0x000D0048: Width, Value = 0 to 32767 
                // Usage 0x000D0049 Height (DV=Dynamic Value) Value = 0 to 32767 <-- Ignored: REPORT_COUNT (1) is too small 
    uint16_t pad_8;         // Pad 
    uint16_t DIG_TouchScreenFingerContactIdentifier[2]; // Usage 0x000D0051: Contact Identifier, Value = 0 to 32767 
} inputReport01_t; 

2 1에서 연락처 식별자 REPORT_COUNT, 그것은 나에게 더 나은 같습니다

//-------------------------------------------------------------------------------- 
// Decoded Application Collection 
//-------------------------------------------------------------------------------- 

/* 
05 0D  (GLOBAL) USAGE_PAGE   0x000D Digitizer Device Page 
09 04  (LOCAL) USAGE    0x000D0004 Touch Screen (CA=Application Collection) 
A1 01  (MAIN) COLLECTION   0x00000001 Application (Usage=0x000D0004: Page=Digitizer Device Page, Usage=Touch Screen, Type=CA) 
85 01   (GLOBAL) REPORT_ID   0x01 (1) 
09 22   (LOCAL) USAGE    0x000D0022 Finger (CL=Logical Collection) 
A1 00   (MAIN) COLLECTION   0x00000000 Physical (Usage=0x000D0022: Page=Digitizer Device Page, Usage=Finger, Type=CL) <-- Warning: USAGE type should be CP (Physical) 
09 42   (LOCAL) USAGE    0x000D0042 Tip Switch (MC=Momentary Control) 
15 00   (GLOBAL) LOGICAL_MINIMUM 0x00 (0) <-- Redundant: LOGICAL_MINIMUM is already 0 <-- Info: Consider replacing 15 00 with 14 
25 01   (GLOBAL) LOGICAL_MAXIMUM 0x01 (1) 
75 01   (GLOBAL) REPORT_SIZE  0x01 (1) Number of bits per field 
95 01   (GLOBAL) REPORT_COUNT  0x01 (1) Number of fields 
81 02   (MAIN) INPUT    0x00000002 (1 field x 1 bit) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap 
95 03   (GLOBAL) REPORT_COUNT  0x03 (3) Number of fields 
81 03   (MAIN) INPUT    0x00000003 (3 fields x 1 bit) 1=Constant 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap 
09 32   (LOCAL) USAGE    0x000D0032 In Range (MC=Momentary Control) 
09 47   (LOCAL) USAGE    0x000D0047 Confidence (DV=Dynamic Value) 
95 02   (GLOBAL) REPORT_COUNT  0x02 (2) Number of fields 
81 02   (MAIN) INPUT    0x00000002 (2 fields x 1 bit) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap 
95 0A   (GLOBAL) REPORT_COUNT  0x0A (10) Number of fields 
81 03   (MAIN) INPUT    0x00000003 (10 fields x 1 bit) 1=Constant 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap 
05 01   (GLOBAL) USAGE_PAGE   0x0001 Generic Desktop Page 
26 FF7F   (GLOBAL) LOGICAL_MAXIMUM 0x7FFF (32767) 
75 10   (GLOBAL) REPORT_SIZE  0x10 (16) Number of bits per field 
95 01   (GLOBAL) REPORT_COUNT  0x01 (1) Number of fields 
09 30   (LOCAL) USAGE    0x00010030 X (DV=Dynamic Value) 
81 02   (MAIN) INPUT    0x00000002 (1 field x 16 bits) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap 
09 31   (LOCAL) USAGE    0x00010031 Y (DV=Dynamic Value) 
81 02   (MAIN) INPUT    0x00000002 (1 field x 16 bits) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap 
05 0D   (GLOBAL) USAGE_PAGE   0x000D Digitizer Device Page 
09 48   (LOCAL) USAGE    0x000D0048 Width (DV=Dynamic Value) 
09 49   (LOCAL) USAGE    0x000D0049 Height (DV=Dynamic Value) 
95 02   (GLOBAL) REPORT_COUNT  0x02 (2) Number of fields 
81 02   (MAIN) INPUT    0x00000002 (2 fields x 16 bits) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap 
09 51   (LOCAL) USAGE    0x000D0051 Contact Identifier (DV=Dynamic Value) 
95 01   (GLOBAL) REPORT_COUNT  0x01 (1) Number of fields 
81 02   (MAIN) INPUT    0x00000002 (1 field x 16 bits) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap 
09 55   (LOCAL) USAGE    0x000D0055 Contact Count Maximum (SV=Static Value) 
25 08   (GLOBAL) LOGICAL_MAXIMUM 0x08 (8) 
75 08   (GLOBAL) REPORT_SIZE  0x08 (8) Number of bits per field 
B1 02   (MAIN) FEATURE   0x00000002 (1 field x 8 bits) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap 
C0    (MAIN) END_COLLECTION  Physical 
C0   (MAIN) END_COLLECTION  Application 
*/ 

//-------------------------------------------------------------------------------- 
// Digitizer Device Page featureReport 01 (Device <-> Host) 
//-------------------------------------------------------------------------------- 

typedef struct 
{ 
    uint8_t reportId;         // Report ID = 0x01 (1) 
                // Collection: TouchScreen Finger 
    uint8_t DIG_TouchScreenFingerContactCountMaximum; // Usage 0x000D0055: Contact Count Maximum, Value = 0 to 8 
} featureReport01_t; 


//-------------------------------------------------------------------------------- 
// Digitizer Device Page inputReport 01 (Device --> Host) 
//-------------------------------------------------------------------------------- 

typedef struct 
{ 
    uint8_t reportId;         // Report ID = 0x01 (1) 
                // Collection: TouchScreen Finger 
    uint8_t DIG_TouchScreenFingerTipSwitch : 1;  // Usage 0x000D0042: Tip Switch, Value = 0 to 1 
    uint8_t : 1;          // Pad 
    uint8_t : 1;          // Pad 
    uint8_t : 1;          // Pad 
    uint8_t DIG_TouchScreenFingerInRange : 1;   // Usage 0x000D0032: In Range, Value = 0 to 1 
    uint8_t DIG_TouchScreenFingerConfidence : 1;  // Usage 0x000D0047: Confidence, Value = 0 to 1 
    uint8_t : 1;          // Pad 
    uint8_t : 1;          // Pad 
    uint8_t : 1;          // Pad 
    uint8_t : 1;          // Pad 
    uint8_t : 1;          // Pad 
    uint8_t : 1;          // Pad 
    uint8_t : 1;          // Pad 
    uint8_t : 1;          // Pad 
    uint8_t : 1;          // Pad 
    uint8_t : 1;          // Pad 
    uint16_t GD_TouchScreenFingerX;     // Usage 0x00010030: X, Value = 0 to 32767 
    uint16_t GD_TouchScreenFingerY;     // Usage 0x00010031: Y, Value = 0 to 32767 
    uint16_t DIG_TouchScreenFingerWidth;    // Usage 0x000D0048: Width, Value = 0 to 32767 
    uint16_t DIG_TouchScreenFingerHeight;    // Usage 0x000D0049: Height, Value = 0 to 32767 
    uint16_t DIG_TouchScreenFingerContactIdentifier; // Usage 0x000D0051: Contact Identifier, Value = 0 to 32767 
} inputReport01_t; 

이 HID 보고서 설명도 마이크로 소프트가 때때로 잘못 얻는 것을 놀랐 아니에요 공예 너무 까다로운 수 있습니다. 일부 프로그래밍 위즈 (나보다 나은 방법)가 그들을 만들기위한 훌륭한 소프트웨어를 만들 수 있다면 나는 세상이 더 나은 곳이라고 생각한다. :)

공개 : 내가 작성한 자유 소프트웨어를 사용하여 보고서 설명자를 디코딩했다. hidrdd이라고합니다. 나는 파이썬으로 이식하는 것을 의미하지만 아직 파이썬을 배울 길이 없다. - 손가락의 최대 수, 즉

// var is like: 
uint8_t my_value1; 
uint8_t my_value2; 

// ary is like: 
uint8_t my_value[2]; 

maximumcount 것은 "연락처 최대 카운트 '사용으로 나타납니다

BTW, VAR와 진 사이의 차이는 최고의 C 선언의 차이로 이해 될 수있다 동시에 누를 수 있으며 장치에서 보내거나받을 수있는 기능 보고서의 일부입니다. 보고서 설명자는 0 손가락과 8 손가락 사이의 값을 동시에 누를 수 있음을 나타냅니다.