The open source OpenXR runtime
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

d/wmr: Handle 0x17 packets

Add a debug report for 0x17 packets on Reverb G2 that
report controller statuses. The statuses seen so far
are 0x0 for unpaired, 0x1 for paired but offline, and
0x2 for online. Paired reports provide VID and PID for the
associated motion controller.

authored by

Jan Schmidt and committed by
Jakob Bornecrantz
5efe0da7 7b95755f

+56 -9
+51 -8
src/xrt/drivers/wmr/wmr_hmd.c
··· 65 65 */ 66 66 67 67 static void 68 - hololens_unknown_17_decode_packet(struct wmr_hmd *wh, const unsigned char *buffer, int size) 68 + hololens_handle_controller_status_packet(struct wmr_hmd *wh, const unsigned char *buffer, int size) 69 69 { 70 - if (size >= 7) { 71 - WMR_TRACE(wh, "Got packet 0x17 (%i)\n\t%02x %02x %02x %02x %02x %02x %02x ", size, buffer[0], buffer[1], 72 - buffer[2], buffer[3], buffer[4], buffer[5], buffer[6]); 73 - } else { 74 - WMR_TRACE(wh, "Got packet 0x17 (%i)", size); 70 + if (size < 3) { 71 + WMR_DEBUG(wh, "Got small packet 0x17 (%i)", size); 72 + return; 73 + } 74 + 75 + uint8_t controller_id = buffer[1]; 76 + uint8_t pkt_type = buffer[2]; 77 + 78 + switch (pkt_type) { 79 + case WMR_CONTROLLER_STATUS_UNPAIRED: { 80 + WMR_TRACE(wh, "Controller %d is not paired", controller_id); 81 + break; 82 + } 83 + case WMR_CONTROLLER_STATUS_OFFLINE: { 84 + if (size < 7) { 85 + WMR_TRACE(wh, "Got small controller offline status packet (%i)", size); 86 + return; 87 + } 88 + 89 + /* Skip packet type, controller id, presence */ 90 + buffer += 3; 91 + 92 + uint16_t vid = read16(&buffer); 93 + uint16_t pid = read16(&buffer); 94 + WMR_TRACE(wh, "Controller %d offline. VID 0x%04x PID 0x%04x", controller_id, vid, pid); 95 + break; 96 + } 97 + case WMR_CONTROLLER_STATUS_ONLINE: { 98 + if (size < 10) { 99 + WMR_TRACE(wh, "Got small controller online status packet (%i)", size); 100 + return; 101 + } 102 + 103 + /* Skip packet type, controller id, presence */ 104 + buffer += 3; 105 + 106 + uint16_t vid = read16(&buffer); 107 + uint16_t pid = read16(&buffer); 108 + uint8_t unknown1 = read8(&buffer); 109 + uint16_t unknown2160 = read16(&buffer); 110 + 111 + WMR_TRACE(wh, "Controller %d online. VID 0x%04x PID 0x%04x val1 %u val2 %u", controller_id, vid, pid, 112 + unknown1, unknown2160); 113 + break; 114 + } 115 + default: // 116 + WMR_DEBUG(wh, "Unknown controller status packet (%i) type 0x%02x", size, pkt_type); 117 + break; 75 118 } 76 119 } 77 120 ··· 250 293 case WMR_MS_HOLOLENS_MSG_RIGHT_CONTROLLER: // 251 294 hololens_handle_controller_packet(wh, buffer, size); 252 295 break; 253 - case WMR_MS_HOLOLENS_MSG_UNKNOWN_17: // 254 - hololens_unknown_17_decode_packet(wh, buffer, size); 296 + case WMR_MS_HOLOLENS_MSG_CONTROLLER_STATUS: // 297 + hololens_handle_controller_status_packet(wh, buffer, size); 255 298 break; 256 299 case WMR_MS_HOLOLENS_MSG_CONTROL: // 257 300 WMR_DEBUG(wh, "WMR_MS_HOLOLENS_MSG_CONTROL: %02x, (%i)", buffer[0], size);
+5 -1
src/xrt/drivers/wmr/wmr_protocol.h
··· 37 37 #define WMR_MS_HOLOLENS_MSG_BT_IFACE 0x05 /* Bluetooth interface */ 38 38 #define WMR_MS_HOLOLENS_MSG_LEFT_CONTROLLER 0x06 /* Left controller */ 39 39 #define WMR_MS_HOLOLENS_MSG_RIGHT_CONTROLLER 0x0E /* Right controller */ 40 - #define WMR_MS_HOLOLENS_MSG_UNKNOWN_17 0x17 40 + #define WMR_MS_HOLOLENS_MSG_CONTROLLER_STATUS 0x17 41 41 42 42 // Messages types specific to WMR Hololens Sensors' companion devices 43 43 #define WMR_CONTROL_MSG_IPD_VALUE 0x01 44 44 #define WMR_CONTROL_MSG_UNKNOWN_05 0x05 45 45 46 46 #define WMR_BT_IFACE_MSG_DEBUG 0x19 47 + 48 + #define WMR_CONTROLLER_STATUS_UNPAIRED 0x0 49 + #define WMR_CONTROLLER_STATUS_OFFLINE 0x1 50 + #define WMR_CONTROLLER_STATUS_ONLINE 0x2 47 51 48 52 #define STR_TO_U32(s) ((uint32_t)(((s)[0]) | ((s)[1] << 8) | ((s)[2] << 16) | ((s)[3] << 24))) 49 53 #define WMR_MAGIC STR_TO_U32("Dlo+")