โปรโตคอลอุปกรณ์ที่โต้ตอบกับมนุษย์โดยตรง (HID) ของอุปกรณ์ติดตามการเคลื่อนไหวของศีรษะ ซึ่งพร้อมใช้งานสำหรับอุปกรณ์ที่ใช้ Android 13 ขึ้นไป จะช่วยให้อุปกรณ์ติดตามการเคลื่อนไหวของศีรษะเชื่อมต่อกับอุปกรณ์ Android ผ่าน USB หรือบลูทูธ และแสดงในเฟรมเวิร์กและแอป Android ผ่านเฟรมเวิร์กเซ็นเซอร์ โปรโตคอลนี้ใช้สำหรับการควบคุมเอฟเฟกต์เสียงเสมือนจริง (เสียง 3 มิติ) หน้านี้ใช้คำว่าอุปกรณ์และโฮสต์ตามความหมายของบลูทูธ โดยที่อุปกรณ์หมายถึงอุปกรณ์ติดตามการเคลื่อนไหวของศีรษะ และโฮสต์หมายถึงโฮสต์ Android
ผู้ผลิตอุปกรณ์ต้องกำหนดค่าอุปกรณ์ Android เพื่อเปิดใช้การรองรับโปรโตคอล HID ของอุปกรณ์ติดตามการเคลื่อนไหวของศีรษะ ดูข้อมูลโดยละเอียดเกี่ยวกับการกําหนดค่าได้ที่ Dynamic Sensors 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
#AndroidHeadTracker#2.0#x
x
คือจำนวนเต็ม (1
, 2
, 3
) ที่ระบุการขนส่งที่รองรับ ดังนี้
- 1: ACL
- 2: ISO
- 3: ACL + ISO
ไม่มีการสิ้นสุดด้วยค่า Null ซึ่งหมายความว่าขนาดทั้งหมดของพร็อพเพอร์ตี้นี้คืออักขระ 8 บิต 23 ตัวสำหรับเวอร์ชัน 1.0
พร็อพเพอร์ตี้นี้ใช้เป็นตัวแยกแยะเพื่อหลีกเลี่ยงการทับซ้อนกับเซ็นเซอร์ที่กำหนดเองอื่นๆ
พร็อพเพอร์ตี้: รหัสที่ไม่ซ้ำกันแบบถาวร (0x0302
)
พร็อพเพอร์ตี้รหัสที่ไม่ซ้ำกันแบบถาวร (0x0302
) คืออาร์เรย์แบบอ่านอย่างเดียวที่มีองค์ประกอบ 16 รายการ โดยแต่ละรายการมี 8 บิต (รวม 128 บิต) ไม่ควรมีตัวสิ้นสุด Null คุณจะใช้พร็อพเพอร์ตี้นี้หรือไม่ก็ได้
พร็อพเพอร์ตี้นี้ช่วยให้อุปกรณ์ติดตามการเคลื่อนไหวของศีรษะที่ผสานรวมอยู่ในอุปกรณ์เสียงอ้างอิงอุปกรณ์เสียงที่เชื่อมต่ออยู่ได้ ระบบรองรับรูปแบบต่อไปนี้
อุปกรณ์ติดตามการเคลื่อนไหวของศีรษะแบบสแตนด์อโลน
หากไม่มีพร็อพเพอร์ตี้รหัสที่ไม่ซ้ำกันแบบถาวร (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) และบลูทูธ LE (รูปแบบ HID v2.0) ต้องแสดงตัวบ่งชี้ HID 2 รายการที่มีที่อยู่เดียวกัน อุปกรณ์แบบ 2 โหมดที่มีอุปกรณ์ซ้ายและขวาแยกกันต้องแสดง HID บลูทูธ LE โดยใช้อุปกรณ์แบบ 2 โหมดหลักแทนอุปกรณ์รองที่ใช้ LE เท่านั้น
อ้างอิงโดยใช้ UUID
เมื่อใดก็ตามที่มีการตั้งค่าบิตสําคัญที่สุด (MSB) ของโอคเต็ต 8 (≥0x80
) ระบบจะตีความช่องนี้เป็น UUID ตามที่ระบุไว้ใน RFC-4122 อุปกรณ์เสียงที่เกี่ยวข้องจะให้ UUID เดียวกันซึ่งลงทะเบียนไว้ในเฟรมเวิร์ก Android ผ่านกลไกที่ไม่ระบุซึ่งเจาะจงสำหรับประเภทของการนำส่งที่ใช้
พร็อพเพอร์ตี้: สถานะการรายงาน (0x0316
)
พร็อพเพอร์ตี้สถานะการรายงาน (0x0316
) เป็นพร็อพเพอร์ตี้แบบอ่าน/เขียนที่มีความหมายตามมาตรฐานตามที่ระบุไว้ในข้อกำหนด HID โฮสต์ใช้พร็อพเพอร์ตี้นี้เพื่อระบุเหตุการณ์ที่จะรายงานให้อุปกรณ์ทราบ ระบบจะใช้เฉพาะค่า ไม่มีเหตุการณ์ (0x0840
) และเหตุการณ์ทั้งหมด (0x0841
) เท่านั้น
ค่าเริ่มต้นของช่องนี้ต้องเป็น "ไม่มีเหตุการณ์" และอุปกรณ์ต้องไม่แก้ไขค่านี้ ต้องเป็นโฮสต์เท่านั้น
พร็อพเพอร์ตี้: สถานะพลังงาน (0x0319
)
พร็อพเพอร์ตี้สถานะพลังงาน (0x0319
) เป็นพร็อพเพอร์ตี้อ่าน/เขียนที่มีความหมายตามมาตรฐานตามที่ระบุไว้ในข้อกำหนด HID โฮสต์ใช้พร็อพเพอร์ตี้นี้เพื่อบ่งบอกสถานะพลังงานที่อุปกรณ์ต้องอยู่ ระบบจะใช้เฉพาะค่าเปิดเครื่อง (0x0851
) และปิดเครื่อง (0x0855
) เท่านั้น
ค่าเริ่มต้นของช่องนี้กำหนดโดยอุปกรณ์และต้องไม่ได้รับการแก้ไขจากอุปกรณ์ แต่ต้องแก้ไขโดยโฮสต์เท่านั้น
พร็อพเพอร์ตี้: ช่วงเวลาของรายงาน (0x030E
)
พร็อพเพอร์ตี้ช่วงเวลาการรายงาน (0x030E
) เป็นพร็อพเพอร์ตี้อ่าน/เขียนที่มีความหมายตามมาตรฐานตามที่ระบุไว้ในข้อกำหนด HID โฮสต์ใช้พร็อพเพอร์ตี้นี้เพื่อระบุความถี่ในการรายงานค่าที่อ่านได้จากอุปกรณ์
หน่วยเป็นวินาที อุปกรณ์จะกําหนดช่วงที่ใช้ได้สําหรับค่านี้ และอธิบายโดยใช้กลไกค่าต่ำสุด/สูงสุดจริง ต้องรองรับอัตราการรายงานอย่างน้อย 50 Hz และอัตราการรายงานสูงสุดที่แนะนำคือ 100 Hz ดังนั้น ช่วงเวลารายงานขั้นต่ำต้องน้อยกว่าหรือเท่ากับ 20 ms และควรมากกว่าหรือเท่ากับ 10 ms
พร็อพเพอร์ตี้: ขนส่ง LE ที่ตัวแทนจำหน่ายจองไว้ (0xF410
)
พร็อพเพอร์ตี้ LE Transport (0xF410
) ที่ผู้ให้บริการจองไว้เป็นพร็อพเพอร์ตี้แบบอ่าน/เขียนที่มีความหมายตามมาตรฐานตามที่ระบุไว้ในข้อกำหนด HID โฮสต์ใช้พร็อพเพอร์ตี้นี้เพื่อระบุการขนส่งที่เลือก (ACL หรือ ISO) ระบบจะใช้เฉพาะค่า ACL (0xF800
) และ ISO (0xF801
) และต้องรวมทั้ง 2 รายการไว้ในคอลเล็กชันเชิงตรรกะ
พร็อพเพอร์ตี้นี้ได้รับการกําหนดค่าก่อนสถานะการจ่ายไฟหรือการรายงาน
ฟิลด์ข้อมูล: ค่าที่กำหนดเอง 1 (0x0544
)
ช่องค่าที่กำหนดเอง 1 (0x0544
) คือช่องป้อนข้อมูลที่ใช้สำหรับการรายงานข้อมูลการติดตามการเคลื่อนไหวของศีรษะจริง อาร์เรย์ 3 องค์ประกอบที่ตีความตามกฎ HID ปกติสำหรับค่าทางกายภาพตามที่ระบุไว้ในส่วนที่ 6.2.2.7 ของข้อกำหนด HID ช่วงที่ถูกต้องสำหรับองค์ประกอบแต่ละรายการคือ [-π, π] rad หน่วยจะเป็นเรเดียนเสมอ
ระบบจะตีความองค์ประกอบเป็น [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 สำหรับอุปกรณ์ที่รองรับเฉพาะการขนส่ง ACL ของบลูทูธ LE
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,
};