โปรโตคอลอุปกรณ์ติดตามการเคลื่อนไหวศีรษะ (HID) ที่พร้อมใช้งานสำหรับอุปกรณ์ ที่ใช้ Android 13 ขึ้นไปจะช่วยให้ อุปกรณ์ติดตามการเคลื่อนไหวของศีรษะเพื่อเชื่อมต่อกับอุปกรณ์ Android ผ่าน USB หรือ ใช้บลูทูธและใช้เฟรมเวิร์กและแอปของ Android ผ่าน เซ็นเซอร์ โปรโตคอลนี้ใช้สำหรับ กำลังควบคุม เอฟเฟกต์เสียงเสมือนจริง (เสียง 3 มิติ) หน้านี้ใช้คำว่าอุปกรณ์และ โฮสต์ โดยใช้ความหมายบลูทูธ โดย device หมายถึงอุปกรณ์ติดตามการเคลื่อนไหวศีรษะ และ host หมายถึงโฮสต์ Android
ผู้ผลิตอุปกรณ์ต้องกำหนดค่าอุปกรณ์ Android ของตนเพื่อให้รองรับ โปรโตคอล HID เครื่องติดตามการเคลื่อนไหวศีรษะ หากต้องการดูข้อมูลโดยละเอียดเพิ่มเติมเกี่ยวกับ โปรดดู เทคโนโลยีเซ็นเซอร์แบบไดนามิก README
หน้านี้ในกรณีที่คุ้นเคยกับแหล่งข้อมูลต่อไปนี้
โครงสร้างระดับบนสุด
เฟรมเวิร์ก Android ระบุว่าอุปกรณ์ติดตามศีรษะเป็นอุปกรณ์ HID
ดูตัวอย่างทั้งหมดของข้อบ่งชี้ HID ที่ถูกต้องได้ที่ ภาคผนวก 1: ตัวอย่างข้อบ่งชี้ HID
ที่ระดับบนสุด อุปกรณ์ติดตามศีรษะคือคอลเล็กชันแอปที่มี
Sensors
หน้า (0x20
) และการใช้งาน Other: Custom
(0xE1
) ใน
คอลเล็กชันคือช่องข้อมูล (อินพุต) และพร็อพเพอร์ตี้ (ฟีเจอร์) ต่างๆ
พร็อพเพอร์ตี้และช่องข้อมูล
ส่วนนี้จะอธิบายพร็อพเพอร์ตี้และช่องข้อมูลในแอปพลิเคชัน คอลเล็กชันอุปกรณ์ติดตามศีรษะ
พร็อพเพอร์ตี้: คำอธิบายเซ็นเซอร์ (0x0308
)
พร็อพเพอร์ตี้รายละเอียดเซ็นเซอร์ (0x0308
) คือสตริง ASCII (8 บิต) แบบอ่านอย่างเดียว
คุณสมบัติที่ต้องมีค่าต่อไปนี้
เครื่องติดตามการเคลื่อนไหวศีรษะเวอร์ชัน 1.0:
#AndroidHeadTracker#1.0
อุปกรณ์ติดตามศีรษะเวอร์ชัน 2.0 (พร้อมใช้งานใน Android 15 หรือ สูงกว่า) ซึ่งรวมถึงการรองรับ LE Audio ดังนี้
#AndroidHeadTracker#2.0#x
x
เป็นจำนวนเต็ม (1
, 2
, 3
) ที่ระบุการส่งการสนับสนุน:
- 1: ACL
- 2: ISO
- 3: ACL + ISO
คาดว่าไม่มีเครื่องหมายสิ้นสุดที่เป็นค่าว่าง ซึ่งหมายความว่าขนาดรวมของพร็อพเพอร์ตี้นี้ คืออักขระ 23 ตัวแบบ 8 บิตสำหรับเวอร์ชัน 1.0
พร็อพเพอร์ตี้นี้ทำหน้าที่เป็นการเลือกปฏิบัติเพื่อหลีกเลี่ยงการชนกัน เซ็นเซอร์ที่กำหนดเอง
พร็อพเพอร์ตี้: รหัสที่ไม่ซ้ำกันแบบถาวร (0x0302
)
พร็อพเพอร์ตี้ Persistent Unique ID (0x0302
) เป็นอาร์เรย์แบบอ่านอย่างเดียวที่ 16
รายการละ 8 บิต (ทั้งหมด 128 บิต) คาดว่าไม่มีเครื่องหมายสิ้นสุดที่เป็นค่าว่าง ช่วงเวลานี้
หรือไม่ใส่ก็ได้
พร็อพเพอร์ตี้นี้อนุญาตอุปกรณ์ติดตามการเคลื่อนไหวศีรษะที่ผสานรวมอยู่ในเสียง อุปกรณ์เพื่ออ้างอิงอุปกรณ์เสียงที่เชื่อมต่ออยู่ ระบบรองรับรูปแบบต่อไปนี้
เครื่องติดตามศีรษะแบบสแตนด์อโลน
ถ้าไม่มีพร็อพเพอร์ตี้รหัสถาวรถาวร (0x0302
) หรือมีการตั้งค่าเป็นทั้งหมด
เลข 0 แสดงว่าอุปกรณ์ติดตามศีรษะไม่ได้แนบอยู่กับตัว
เสียงและสามารถใช้แยกกันได้ เช่น โดยการให้ผู้ใช้
เชื่อมโยงอุปกรณ์ติดตามศีรษะเข้ากับอุปกรณ์เสียงแยกต่างหากด้วยตนเอง
การอ้างอิงใช้ที่อยู่ MAC ของบลูทูธ
อ็อกเท็ต | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
ค่า | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | B | T | MAC ของบลูทูธ |
ในรูปแบบนี้ อ็อกเท็ต 8 รายการแรกต้องเป็น 0
ส่วนอ็อกเท็ต 8 และ 9 ต้องมี
ค่า ASCII B
และ T
ตามลำดับ และ 6 อ็อกเท็ตต่อไปนี้
ตีความว่าเป็นที่อยู่ MAC ของบลูทูธ โดยถือว่าเป็นอุปกรณ์ติดตามศีรษะ
จะมีผลกับอุปกรณ์เสียงที่มีที่อยู่ MAC นี้ ที่อยู่นี้ต้องเป็น
แม้ว่าอุปกรณ์จะใช้ที่อยู่ MAC แบบสุ่มเพื่อสร้าง
การเชื่อมต่อ อุปกรณ์แบบ 2 โหมดที่เชื่อมต่อผ่านบลูทูธแบบคลาสสิก
(รูปแบบ HID v1.0) และ Bluetooth LE (รูปแบบ HID v2.0) ต้องแสดง HID 2 รายการ
ข้อบ่งชี้ที่มีที่อยู่เดียวกัน อุปกรณ์แบบ 2 โหมดแยกกัน
อุปกรณ์ซ้ายและขวาต้องเปิด Bluetooth LE HID โดยใช้ Dual หลัก
อุปกรณ์หลักแทนอุปกรณ์รองสำหรับ LE เท่านั้น
การอ้างอิงโดยใช้ UUID
เมื่อใดก็ตามที่ตั้งค่าบิตที่สำคัญที่สุด (MSB) ของอ็อกเท็ต 8 (≥0x80
) ฟิลด์
ถูกแปลค่าเป็น UUID ตามที่ระบุไว้ใน
RFC-4122
อุปกรณ์เสียงที่เกี่ยวข้องจะมี UUID เดียวกัน ซึ่งลงทะเบียนใน
เฟรมเวิร์กของ Android ผ่านกลไกที่ไม่ระบุซึ่งเจาะจงสำหรับ
ของการขนส่งที่ใช้
พร็อพเพอร์ตี้: สถานะการรายงาน (0x0316
)
พร็อพเพอร์ตี้สถานะการรายงาน (0x0316
) เป็นพร็อพเพอร์ตี้อ่าน/เขียนที่มี
อรรถศาสตร์มาตรฐานตามที่กำหนดไว้ในข้อกำหนด HID โฮสต์ใช้
เพื่อแสดงให้อุปกรณ์ทราบว่าจะรายงานเหตุการณ์ใด เฉพาะค่า No
ระบบจะใช้เหตุการณ์ (0x0840
) และเหตุการณ์ทั้งหมด (0x0841
)
ค่าเริ่มต้นสำหรับช่องนี้ต้องเป็น "ไม่มีเหตุการณ์" และต้องไม่เป็น อุปกรณ์แก้ไขโดยโฮสต์เท่านั้น
คุณสมบัติ: สถานะพลังงาน (0x0319
)
พร็อพเพอร์ตี้ Power State (0x0319
) เป็นพร็อพเพอร์ตี้อ่าน/เขียนที่มี
อรรถศาสตร์มาตรฐานตามที่กำหนดไว้ในข้อกำหนด HID โฮสต์ใช้
เพื่อบอกอุปกรณ์ว่าต้องอยู่ในรูปแบบใด เฉพาะ
ใช้ค่าการปิดเครื่อง (0x0851
) และปิดเครื่อง (0x0855
)
อุปกรณ์จะกำหนดค่าเริ่มต้นของช่องนี้และต้องไม่เป็น อุปกรณ์แก้ไขโดยโฮสต์เท่านั้น
พร็อพเพอร์ตี้: ช่วงเวลาของรายงาน (0x030E
)
พร็อพเพอร์ตี้ระยะเวลาของรายงาน (0x030E
) เป็นพร็อพเพอร์ตี้แบบอ่าน/เขียนที่มีมิติข้อมูล
อรรถศาสตร์มาตรฐานตามที่กำหนดไว้ในข้อกำหนด HID โฮสต์ใช้
เพื่อแสดงให้อุปกรณ์ทราบว่าจะรายงานการอ่านข้อมูลของอุปกรณ์บ่อยเพียงใด
หน่วยเป็นวินาที ช่วงที่ถูกต้องสำหรับค่านี้จะกำหนดโดยอุปกรณ์
และอธิบายโดยใช้กลไก Physical นาที/สูงสุด อย่างน้อย 50 Hz
จะต้องมีการรองรับอัตราการรายงาน และอัตราการรายงานสูงสุดที่แนะนำคือ
100 Hz ดังนั้น ช่วงเวลาการรายงานขั้นต่ำจะต้องน้อยกว่าหรือเท่ากับ
20 มิลลิวินาที และขอแนะนำให้มากกว่าหรือเท่ากับ 10 มิลลิวินาที
พร็อพเพอร์ตี้: LE Transport ที่ผู้ให้บริการสงวนไว้ (0xF410
)
พร็อพเพอร์ตี้ LE Transport (0xF410
) ที่ผู้ให้บริการสงวนไว้เป็นพร็อพเพอร์ตี้แบบอ่าน/เขียน
ที่มีความหมายมาตรฐานตามที่ระบุไว้ในข้อกำหนด HID ผู้จัด
ใช้พร็อพเพอร์ตี้นี้เพื่อระบุการขนส่งที่เลือก (ACL หรือ ISO) เฉพาะ
มีการใช้ค่า ACL (0xF800
) และ ISO (0xF801
) และต้องรวมทั้ง 2 ค่า
ในคอลเล็กชันเชิงตรรกะ
พร็อพเพอร์ตี้นี้ได้รับการกำหนดค่าก่อนสถานะกำลังหรือการรายงาน
ช่องข้อมูล: ค่าที่กำหนดเอง 1 (0x0544
)
ช่องค่าที่กำหนดเอง 1 (0x0544
) เป็นช่องป้อนข้อมูลที่ใช้สำหรับการรายงานฟิลด์
ข้อมูลการติดตามการเคลื่อนไหวของศีรษะ เป็นอาร์เรย์ 3 เอลิเมนต์ ซึ่งตีความตาม
เข้ากับกฎ HID ปกติสำหรับค่าทางกายภาพตามที่ระบุไว้ในส่วนที่ 6.2.2.7 ของ
ตามข้อกำหนดของ HID ช่วงที่ถูกต้องของแต่ละองค์ประกอบคือ [-π, π] เรเดียน หน่วย
เป็นเรเดียนเสมอ
ระบบจะตีความองค์ประกอบเป็น [rx, ry, rz]
ดังนั้น [rx, ry, rz]
เป็น
เวกเตอร์การหมุน
แสดงการเปลี่ยนรูปแบบจากเฟรมอ้างอิงเป็นเฟรมส่วนหัว
ค่าแมกนิจูดต้องอยู่ในช่วง [0..π]
กรอบการอ้างอิงนั้นกำหนดเองได้ แต่โดยทั่วไปจะคงที่และต้อง ถนัดขวา ยอมรับได้ว่ามีละอองลอยเล็กน้อย แกนส่วนหัว ได้แก่
- X จากหูซ้ายไปขวา
- Y จากด้านหลังของศีรษะถึงจมูก (กลับไปด้านหน้า)
- ตัว Z จากคอไปจนถึงด้านบนของศีรษะ
ช่องข้อมูล: ค่าที่กำหนดเอง 2 (0x0545
)
ช่องค่าที่กำหนดเอง 2 (0x0545
) เป็นช่องป้อนข้อมูลที่ใช้สำหรับรายงานฟังก์ชัน
ข้อมูลการติดตามการเคลื่อนไหวของศีรษะ ซึ่งเป็นอาร์เรย์จุดคงที่แบบ 3 องค์ประกอบ
ได้รับการแปลค่าตามกฎ HID ปกติสำหรับค่าทางกายภาพ
หน่วยจะเป็นเรเดียน/วินาทีเสมอ
ระบบจะตีความองค์ประกอบเป็น [vx, vy, vz]
ดังนั้น [vx, vy, vz]
เป็น
เวกเตอร์การหมุน
จะแสดงความเร็วเชิงมุมของกรอบศีรษะ (สัมพันธ์กับตัวเอง)
ช่องข้อมูล: ค่าที่กำหนดเอง 3 (0x0546
)
ช่องค่าที่กำหนดเอง 3 (0x0546
) เป็นช่องป้อนข้อมูลที่ใช้สำหรับการติดตาม
ความไม่ต่อเนื่องในเฟรมอ้างอิง เป็นจำนวนเต็มสเกลาร์ 8 บิตใน
ขนาด และจะต้องเพิ่มค่า (โดยตัดรอบ) ด้วยอุปกรณ์ทุกครั้ง
กรอบของการอ้างอิงจะเปลี่ยนไป เช่น ถ้าอัลกอริทึมตัวกรองการวางแนว
ที่ถูกรีเซ็ตสถานะซึ่งใช้ในการกำหนดการวางแนว ค่านี้คือ
ได้รับการแปลค่าตามกฎ HID ปกติสำหรับค่าทางกายภาพ อย่างไรก็ตาม
คุณค่าทางกายภาพและหน่วยนั้นไม่สำคัญ ข้อมูลเดียวที่เกี่ยวข้องกับ
เป็นค่าที่เปลี่ยนแปลง เพื่อหลีกเลี่ยงปัญหาตัวเลขที่เกี่ยวข้องกับการสูญเสียความแม่นยำ
ขอแนะนำให้ตั้งค่า
ค่าต่ำสุดทางกายภาพ ค่าสูงสุดทางกายภาพ และเลขยกกำลังของหน่วยเป็น 0 สำหรับฟิลด์นี้
โครงสร้างรายงาน
การจัดกลุ่มพร็อพเพอร์ตี้ลงในรายงาน (ตามการกำหนดรหัสรายงาน) คือ ได้อย่างยืดหยุ่น เราขอแนะนำให้แยกพร็อพเพอร์ตี้อ่านอย่างเดียวเพื่อประสิทธิภาพในการทำงาน จากคุณสมบัติการอ่าน/เขียน
สำหรับช่องข้อมูล ค่าที่กำหนดเอง 1, 2 และ 3 ต้องเหมือนกัน และอยู่ในรายงานเดียวสำหรับอุปกรณ์หนึ่งๆ (คอลเล็กชันแอป)
ส่งรายงานอินพุต
อุปกรณ์จะต้องทำงานไม่พร้อมกันเป็นระยะๆ (ผ่านข้อความ HID INPUT) ส่งรายงานอินพุตเมื่อตรงกับเงื่อนไขทั้งหมดต่อไปนี้
- พร็อพเพอร์ตี้สถานะพลังงานได้รับการตั้งค่าเป็น "พลังงานเต็ม"
- พร็อพเพอร์ตี้สถานะการรายงานจะตั้งค่าเป็นเหตุการณ์ทั้งหมด
- พร็อพเพอร์ตี้ช่วงเวลาการรายงานไม่ใช่ 0
พร็อพเพอร์ตี้ช่วงเวลาการรายงานจะเป็นตัวกำหนดความถี่ในการส่งรายงาน วันและเวลา ไม่ตรงตามเงื่อนไขใดๆ ข้างต้น อุปกรณ์ต้องไม่ส่งรายงานใดๆ
ความเข้ากันได้แบบส่งต่อและย้อนหลัง
โปรโตคอล HID เครื่องมือติดตามส่วนหัวใช้รูปแบบการกำหนดเวอร์ชันที่อนุญาตให้ โดยอนุญาตให้สามารถทำงานร่วมกันระหว่างโฮสต์และอุปกรณ์ที่ใช้ โปรโตคอลเวอร์ชันต่างๆ มีการระบุเวอร์ชันโปรโตคอล ด้วยตัวเลข 2 ตัว ได้แก่ หลักและรอง ซึ่งมีความหมายแตกต่างกันดังนี้ ดังที่อธิบายไว้ในส่วนต่อไปนี้
เวอร์ชันที่รองรับโดยอุปกรณ์จะดูได้จาก
พร็อพเพอร์ตี้คำอธิบายเซ็นเซอร์ (0x0308
)
ความเข้ากันได้กับเวอร์ชันย่อย
การเปลี่ยนแปลงในเวอร์ชันย่อยจะเข้ากันได้กับเวอร์ชันเก่ากว่า เวอร์ชันที่อิงตามเวอร์ชันหลักเดียวกัน ข้อมูลอัปเดตเกี่ยวกับผู้เยาว์ โฮสต์จะไม่สนใจฟิลด์ข้อมูลและพร็อพเพอร์ตี้เพิ่มเติม ตัวอย่างเช่น อุปกรณ์ที่ใช้โปรโตคอลเวอร์ชัน 1.6 สามารถทำงานร่วมกับโฮสต์ที่สนับสนุน โปรโตคอลเวอร์ชัน 1.x รวมถึงเวอร์ชัน 1.5
ความเข้ากันได้ของเวอร์ชันหลัก
อนุญาตให้ใช้การเปลี่ยนแปลงที่เข้ากันไม่ได้กับการเปลี่ยนแปลงเวอร์ชันหลัก ถึง รองรับเวอร์ชันหลักหลายเวอร์ชันเพื่อ ความสามารถในการทำงานร่วมกับโฮสต์เก่าและใหม่ อุปกรณ์สามารถระบุคอลเล็กชันแอปหลายรายการในรายงานได้ ข้อบ่งชี้ เช่น
const unsigned char ReportDescriptor[] = {
HID_USAGE_PAGE_SENSOR,
HID_USAGE_SENSOR_TYPE_OTHER_CUSTOM,
HID_COLLECTION(HID_APPLICATION),
// Feature report 2 (read-only).
HID_REPORT_ID(2),
// Magic value: "#AndroidHeadTracker#1.5"
HID_USAGE_SENSOR_PROPERTY_SENSOR_DESCRIPTION,
HID_LOGICAL_MIN_8(0),
HID_LOGICAL_MAX_8(0xFF),
HID_REPORT_SIZE(8),
HID_REPORT_COUNT(23),
HID_FEATURE(HID_CONST_VAR_ABS),
...
HID_END_COLLECTION,
HID_COLLECTION(HID_APPLICATION),
// Feature report 12 (read-only).
HID_REPORT_ID(12),
// Magic value: "#AndroidHeadTracker#2.4"
HID_USAGE_SENSOR_PROPERTY_SENSOR_DESCRIPTION,
HID_LOGICAL_MIN_8(0),
HID_LOGICAL_MAX_8(0xFF),
HID_REPORT_SIZE(8),
HID_REPORT_COUNT(23),
HID_FEATURE(HID_CONST_VAR_ABS),
...
HID_END_COLLECTION,
};
ในกรณีนี้ โฮสต์สามารถแจกแจงคอลเล็กชันแอปต่างๆ ทั้งหมดได้ ที่โฆษณาโดยอุปกรณ์ ตรวจสอบคุณสมบัติคำอธิบายเซ็นเซอร์เพื่อ พิจารณาเวอร์ชันโปรโตคอลที่แต่ละเวอร์ชันจะใช้ จากนั้นเลือก ซึ่งเป็นโปรโตคอลเวอร์ชันล่าสุดที่โฮสต์รองรับ เมื่อเลือกแล้ว โฮสต์จะทำงาน ด้วยโปรโตคอลเดียวที่เลือกไว้สำหรับอายุการใช้งานของอุปกรณ์ การเชื่อมต่อ
ภาคผนวก: ตัวอย่างของข้อบ่งชี้ HID
ตัวอย่างต่อไปนี้แสดงข้อบ่งชี้ HID ที่ถูกต้องโดยทั่วไป โดยใช้ มาโคร C ที่ใช้กันโดยทั่วไป โดยอยู่ใน การใช้งานเซ็นเซอร์ HID (ส่วนที่ 4.1)
const unsigned char ReportDescriptor[] = {
HID_USAGE_PAGE_SENSOR,
HID_USAGE_SENSOR_TYPE_OTHER_CUSTOM,
HID_COLLECTION(HID_APPLICATION),
// Feature report 2 (read-only).
HID_REPORT_ID(2),
// Magic value: "#AndroidHeadTracker#1.0"
HID_USAGE_SENSOR_PROPERTY_SENSOR_DESCRIPTION,
HID_LOGICAL_MIN_8(0),
HID_LOGICAL_MAX_8(0xFF),
HID_REPORT_SIZE(8),
HID_REPORT_COUNT(23),
HID_FEATURE(HID_CONST_VAR_ABS),
// UUID.
HID_USAGE_SENSOR_PROPERTY_PERSISTENT_UNIQUE_ID,
HID_LOGICAL_MIN_8(0),
HID_LOGICAL_MAX_8(0xFF),
HID_REPORT_SIZE(8),
HID_REPORT_COUNT(16),
HID_FEATURE(HID_CONST_VAR_ABS),
// Feature report 1 (read/write).
HID_REPORT_ID(1),
// 1-bit on/off reporting state.
HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE,
HID_LOGICAL_MIN_8(0),
HID_LOGICAL_MAX_8(1),
HID_REPORT_SIZE(1),
HID_REPORT_COUNT(1),
HID_COLLECTION(HID_LOGICAL),
HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_NO_EVENTS,
HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS,
HID_FEATURE(HID_DATA_ARR_ABS),
HID_END_COLLECTION,
// 1-bit on/off power state.
HID_USAGE_SENSOR_PROPERTY_POWER_STATE,
HID_LOGICAL_MIN_8(0),
HID_LOGICAL_MAX_8(1),
HID_REPORT_SIZE(1),
HID_REPORT_COUNT(1),
HID_COLLECTION(HID_LOGICAL),
HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D4_POWER_OFF,
HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D0_FULL_POWER,
HID_FEATURE(HID_DATA_ARR_ABS),
HID_END_COLLECTION,
// 6-bit reporting interval, with values [0x00..0x3F] corresponding to [10ms..100ms].
HID_USAGE_SENSOR_PROPERTY_REPORT_INTERVAL,
HID_LOGICAL_MIN_8(0x00),
HID_LOGICAL_MAX_8(0x3F),
HID_PHYSICAL_MIN_8(10),
HID_PHYSICAL_MAX_8(100),
HID_REPORT_SIZE(6),
HID_REPORT_COUNT(1),
HID_USAGE_SENSOR_UNITS_SECOND,
HID_UNIT_EXPONENT(0xD), // 10^-3
HID_FEATURE(HID_DATA_VAR_ABS),
// Input report 1
// Orientation as rotation vector (scaled to [-pi..pi] rad).
HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_1,
HID_LOGICAL_MIN_16(0x01, 0x80), // LOGICAL_MINIMUM (-32767)
HID_LOGICAL_MAX_16(0xFF, 0x7F), // LOGICAL_MAXIMUM (32767)
HID_PHYSICAL_MIN_32(0x60, 0x4F, 0x46, 0xED), // -314159265
HID_PHYSICAL_MAX_32(0xA1, 0xB0, 0xB9, 0x12), // 314159265
HID_UNIT_EXPONENT(0x08), // 10^-8
HID_REPORT_SIZE(16),
HID_REPORT_COUNT(3),
HID_INPUT(HID_DATA_VAR_ABS),
// Angular velocity as rotation vector (scaled to [-32..32] rad/sec).
HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_2,
HID_LOGICAL_MIN_16(0x01, 0x80), // LOGICAL_MINIMUM (-32767)
HID_LOGICAL_MAX_16(0xFF, 0x7F), // LOGICAL_MAXIMUM (32767)
HID_PHYSICAL_MIN_8(0xE0),
HID_PHYSICAL_MAX_8(0x20),
HID_UNIT_EXPONENT(0x00), // 10^0
HID_REPORT_SIZE(16),
HID_REPORT_COUNT(3),
HID_INPUT(HID_DATA_VAR_ABS),
// Reference frame reset counter.
HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_3,
HID_LOGICAL_MIN_16(0x00, 0x00), // LOGICAL_MINIMUM (0)
HID_LOGICAL_MAX_16(0xFF, 0x00), // LOGICAL_MAXIMUM (255)
HID_PHYSICAL_MIN_8(0x00),
HID_PHYSICAL_MAX_8(0x00),
HID_UNIT_EXPONENT(0x00), // 10^0
HID_REPORT_SIZE(8),
HID_REPORT_COUNT(1),
HID_INPUT(HID_DATA_VAR_ABS),
HID_END_COLLECTION,
};
ภาคผนวก 2: ตัวอย่างข้อบ่งชี้ HID v2.0
ตัวอย่างต่อไปนี้แสดงข้อบ่งชี้ HID v2.0 สำหรับอุปกรณ์ที่รองรับ เฉพาะการรับส่ง Bluetooth LE ACL เท่านั้น
const unsigned char ReportDescriptor[] = {
HID_USAGE_PAGE_SENSOR,
HID_USAGE_SENSOR_TYPE_OTHER_CUSTOM,
HID_COLLECTION(HID_APPLICATION),
// Feature report 2 (read-only).
HID_REPORT_ID(2),
// Magic value: "#AndroidHeadTracker#2.0#1"
HID_USAGE_SENSOR_PROPERTY_SENSOR_DESCRIPTION,
HID_LOGICAL_MIN_8(0),
HID_LOGICAL_MAX_8(0xFF),
HID_REPORT_SIZE(8),
HID_REPORT_COUNT(25),
HID_FEATURE(HID_CONST_VAR_ABS),
// UUID.
HID_USAGE_SENSOR_PROPERTY_PERSISTENT_UNIQUE_ID,
HID_LOGICAL_MIN_8(0),
HID_LOGICAL_MAX_8(0xFF),
HID_REPORT_SIZE(8),
HID_REPORT_COUNT(16),
HID_FEATURE(HID_CONST_VAR_ABS),
// Feature report 1 (read/write).
HID_REPORT_ID(1),
// 1-bit on/off reporting state.
HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE,
HID_LOGICAL_MIN_8(0),
HID_LOGICAL_MAX_8(1),
HID_REPORT_SIZE(1),
HID_REPORT_COUNT(1),
HID_COLLECTION(HID_LOGICAL),
HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_NO_EVENTS,
HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS,
HID_FEATURE(HID_DATA_ARR_ABS),
HID_END_COLLECTION,
// 1-bit on/off power state.
HID_USAGE_SENSOR_PROPERTY_POWER_STATE,
HID_LOGICAL_MIN_8(0),
HID_LOGICAL_MAX_8(1),
HID_REPORT_SIZE(1),
HID_REPORT_COUNT(1),
HID_COLLECTION(HID_LOGICAL),
HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D4_POWER_OFF,
HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D0_FULL_POWER,
HID_FEATURE(HID_DATA_ARR_ABS),
HID_END_COLLECTION,
// 6-bit reporting interval, with values [0x00..0x3F] corresponding to [10ms..100ms].
HID_USAGE_SENSOR_PROPERTY_REPORT_INTERVAL,
HID_LOGICAL_MIN_8(0x00),
HID_LOGICAL_MAX_8(0x3F),
HID_PHYSICAL_MIN_8(10),
HID_PHYSICAL_MAX_8(100),
HID_REPORT_SIZE(6),
HID_REPORT_COUNT(1),
HID_USAGE_SENSOR_UNITS_SECOND,
HID_UNIT_EXPONENT(0xD), // 10^-3
HID_FEATURE(HID_DATA_VAR_ABS),
// 1-bit transport selection
HID_USAGE_SENSOR_PROPERTY_VENDOR_LE_TRANSPORT,
HID_LOGICAL_MIN_8(0),
HID_LOGICAL_MAX_8(1),
HID_REPORT_SIZE(1),
HID_REPORT_COUNT(1),
HID_COLLECTION(HID_LOGICAL),
HID_USAGE_SENSOR_PROPERTY_VENDOR_LE_TRANSPORT_ACL,
HID_USAGE_SENSOR_PROPERTY_VENDOR_LE_TRANSPORT_ISO,
HID_FEATURE(HID_DATA_ARR_ABS),
HID_END_COLLECTION,
// Input report 1
// Orientation as rotation vector (scaled to [-pi..pi] rad).
HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_1,
HID_LOGICAL_MIN_16(0x01, 0x80), // LOGICAL_MINIMUM (-32767)
HID_LOGICAL_MAX_16(0xFF, 0x7F), // LOGICAL_MAXIMUM (32767)
HID_PHYSICAL_MIN_32(0x60, 0x4F, 0x46, 0xED), // -314159265
HID_PHYSICAL_MAX_32(0xA1, 0xB0, 0xB9, 0x12), // 314159265
HID_UNIT_EXPONENT(0x08), // 10^-8
HID_REPORT_SIZE(16),
HID_REPORT_COUNT(3),
HID_INPUT(HID_DATA_VAR_ABS),
// Angular velocity as rotation vector (scaled to [-32..32] rad/sec).
HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_2,
HID_LOGICAL_MIN_16(0x01, 0x80), // LOGICAL_MINIMUM (-32767)
HID_LOGICAL_MAX_16(0xFF, 0x7F), // LOGICAL_MAXIMUM (32767)
HID_PHYSICAL_MIN_8(0xE0),
HID_PHYSICAL_MAX_8(0x20),
HID_UNIT_EXPONENT(0x00), // 10^0
HID_REPORT_SIZE(16),
HID_REPORT_COUNT(3),
HID_INPUT(HID_DATA_VAR_ABS),
// Reference frame reset counter.
HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_3,
HID_LOGICAL_MIN_16(0x00, 0x00), // LOGICAL_MINIMUM (0)
HID_LOGICAL_MAX_16(0xFF, 0x00), // LOGICAL_MAXIMUM (255)
HID_PHYSICAL_MIN_8(0x00),
HID_PHYSICAL_MAX_8(0x00),
HID_UNIT_EXPONENT(0x00), // 10^0
HID_REPORT_SIZE(8),
HID_REPORT_COUNT(1),
HID_INPUT(HID_DATA_VAR_ABS),
HID_END_COLLECTION,
};