{"id":466,"date":"2017-05-18T11:31:28","date_gmt":"2017-05-18T15:31:28","guid":{"rendered":"http:\/\/www.talariavr.com\/blog\/?page_id=466"},"modified":"2017-05-18T11:31:28","modified_gmt":"2017-05-18T15:31:28","slug":"vive-tracker-documentation-archive","status":"publish","type":"page","link":"http:\/\/www.talariavr.com\/blog\/vive-tracker-documentation-archive\/","title":{"rendered":"Vive Tracker Documentation Archive"},"content":{"rendered":"<p style=\"text-align: center;\"><span style=\"font-size: 18pt;\"><strong><span style=\"font-family: helvetica, arial, sans-serif;\">This page is outdated. \u00a0I&#8217;ve kept it on the site in the event anyone needs it for archival reference, but please direct your attention to <\/span><\/strong><a href=\"http:\/\/www.talariavr.com\/blog\/vive-tracker-initial-documentation\"><span style=\"text-decoration: underline;\"><span style=\"font-family: helvetica, arial, sans-serif; color: #00ccff; text-decoration: underline;\">www.talariavr.com\/blog\/vive-tracker-initial-documentation<\/span><\/span><\/a><strong><span style=\"font-family: helvetica, arial, sans-serif;\"> for up-to-date inf<\/span><span style=\"font-family: helvetica, arial, sans-serif;\">ormation<\/span><span style=\"font-family: helvetica, arial, sans-serif;\">.<\/span><\/strong><\/span><\/p>\n<p style=\"text-align: center;\"><strong><span style=\"font-family: helvetica, arial, sans-serif; font-size: 18pt;\">The following post was published on 27 March, 2017. \u00a0It was briefly updated on 7 April, 2017.<\/span><\/strong><\/p>\n<p style=\"text-align: center;\"><strong><span style=\"font-family: helvetica, arial, sans-serif; font-size: 18pt;\">\u00a0<\/span><\/strong><\/p>\n<p style=\"text-align: center;\"><span style=\"font-size: 18pt;\"><strong><span style=\"color: #00ccff; font-family: helvetica, arial, sans-serif;\">* \u00a0* \u00a0* \u00a0* \u00a0* \u00a0* \u00a0* \u00a0* \u00a0* \u00a0* \u00a0* \u00a0* \u00a0* \u00a0* \u00a0* \u00a0<\/span><span style=\"color: #00ccff; font-family: helvetica, arial, sans-serif;\">* \u00a0* \u00a0* \u00a0* \u00a0*<\/span><span style=\"color: #00ccff; font-family: helvetica, arial, sans-serif;\"><br \/>\n<\/span><span style=\"font-family: helvetica, arial, sans-serif;\">UPDATE:<\/span><\/strong><\/span><\/p>\n<p style=\"text-align: center;\"><span style=\"font-size: 18pt;\"><strong><span style=\"font-family: helvetica, arial, sans-serif;\">REDDIT USER \/U\/MATZMANN666 HAS CREATED AN ARDUINO LIBRARY, SEE BOTTOM OF POST FOR MORE INFORMATION<\/span><span style=\"font-family: helvetica, arial, sans-serif; color: #00ccff;\"><br \/>\n<\/span><span style=\"color: #00ccff;\"><span style=\"font-family: helvetica, arial, sans-serif;\">* \u00a0* \u00a0* \u00a0* \u00a0* \u00a0* \u00a0* \u00a0* \u00a0* \u00a0* \u00a0* \u00a0* \u00a0* \u00a0* \u00a0* \u00a0<\/span><span style=\"font-family: helvetica, arial, sans-serif;\">* \u00a0* \u00a0* \u00a0* \u00a0*<\/span><\/span><span style=\"font-family: helvetica, arial, sans-serif; color: #00ccff;\"><br \/>\n<\/span><\/strong><\/span><\/p>\n<p><span style=\"font-size: 12pt; font-family: helvetica, arial, sans-serif;\"><a href=\"http:\/\/www.talariavr.com\/blog\/wp-content\/uploads\/2017\/03\/TrackerWorking.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-446\" src=\"http:\/\/www.talariavr.com\/blog\/wp-content\/uploads\/2017\/03\/TrackerWorking.png\" width=\"960\" height=\"462\" srcset=\"http:\/\/www.talariavr.com\/blog\/wp-content\/uploads\/2017\/03\/TrackerWorking.png 1920w, http:\/\/www.talariavr.com\/blog\/wp-content\/uploads\/2017\/03\/TrackerWorking-300x144.png 300w, http:\/\/www.talariavr.com\/blog\/wp-content\/uploads\/2017\/03\/TrackerWorking-768x370.png 768w, http:\/\/www.talariavr.com\/blog\/wp-content\/uploads\/2017\/03\/TrackerWorking-1024x493.png 1024w, http:\/\/www.talariavr.com\/blog\/wp-content\/uploads\/2017\/03\/TrackerWorking-561x270.png 561w\" sizes=\"auto, (max-width: 960px) 100vw, 960px\" \/><\/a><br \/>\nHi friends &#8211; So I&#8217;ve spent the last few days familiarizing myself with (and troubleshooting) USB control of the Vive Tracker. \u00a0I wanted to simply get this information recorded quickly as to enable other developers to send data packets and edit controller state information of the Vive Tracker, and so because I&#8217;m prioritizing speed I can guarantee it&#8217;s not going to read gracefully. \u00a0I intend to rewrite this in a more properly documented report sometime in the future (I seem to be in a workflow of ~one blog post every other month).<\/span><\/p>\n<p><span style=\"font-size: 12pt; font-family: helvetica, arial, sans-serif;\">So, getting into the documentation: Below is various levels of abstraction on how I altered the Vive Tracker&#8217;s inputs. \u00a0<span style=\"text-decoration: underline;\">All documentation is relevant as of 27 March, 2017<\/span>; it will likely change in the coming months! \u00a0I programmed on an Atmel AVR (the family of microcontrollers used in <a href=\"https:\/\/www.arduino.cc\/\"><span style=\"text-decoration: underline;\"><span style=\"color: #00ccff; text-decoration: underline;\">Arduino<\/span><\/span><\/a>) <a href=\"http:\/\/www.microchip.com\/wwwproducts\/en\/AT90USB647\"><span style=\"text-decoration: underline;\"><span style=\"color: #00ccff; text-decoration: underline;\">AT90USB647<\/span><\/span><\/a> chip at 8 MHz and 3.3V with an external 5V power supply to the USB lines. \u00a0It should be noted that the Vive Tracker requires a 5V source to initiate USB\u00a0communications. \u00a0Additionally worth noting, the Tracker does not externally supply\u00a0power, which means accessory makers at this time will need to implement a secondary battery into their USB-driving designs (this means to use a Vive Tracker USB accessory, users will need to charge both the Tracker and the accessory separately, and accessory manufacturing costs will increase due to the need of an independent\u00a0battery).<\/span><br \/>\n<span style=\"font-size: 12pt; font-family: helvetica, arial, sans-serif;\"><span style=\"font-size: 18pt;\"><br \/>\n<\/span><span style=\"font-size: 18pt;\"><strong>1. The Feature Report<\/strong><\/span><br \/>\n<\/span><\/p>\n<p><span style=\"font-family: helvetica, arial, sans-serif; font-size: 12pt;\">See Pages 50 &#8211; 52 (.pdf\u00a0file pages 60 &#8211; 62) of the <span style=\"text-decoration: underline;\"><span style=\"color: #00ccff;\"><a style=\"color: #00ccff; text-decoration: underline;\" href=\"http:\/\/www.usb.org\/developers\/hidpage\/HID1_11.pdf\" target=\"_blank\">USB HID Specification 1.11<\/a><\/span><\/span>\u00a0for reference on HID Set_Report requests. \u00a0This is the format for shipping out an HID Feature Report, values specific to the Vive Tracker payloads:<\/span><\/p>\n<div><span style=\"font-family: helvetica, arial, sans-serif; font-size: 12pt;\"><span style=\"font-family: terminal, monaco, monospace; font-size: 10pt;\"><em>bmRequestType<\/em>: 0b00100001 \u00a0 \u00a0 \u00a0\/\/ See Page 50 of HID Spec for bit descriptions<\/span><br \/>\n<span style=\"font-family: terminal, monaco, monospace; font-size: 10pt;\"><em>bRequest<\/em>: \u00a0 \u00a0 \u00a00x09 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ Value for SET_REPORT<\/span><br \/>\n<span style=\"font-family: terminal, monaco, monospace; font-size: 10pt;\"><em>wValue<\/em>: \u00a0 \u00a0 \u00a0 \u00a00x0300 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ MSB=Report Type (0x03, value for Feature report)<\/span><br \/>\n<span style=\"font-family: terminal, monaco, monospace; font-size: 10pt;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ LSB=Report ID (0x00, report IDs not used &#8211; Page 51)<\/span><br \/>\n<span style=\"font-family: terminal, monaco, monospace; font-size: 10pt;\"><em>wIndex<\/em>: \u00a0 \u00a0 \u00a0 \u00a02 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ HTC&#8217;s selected Descriptor Index (I think)<\/span><br \/>\n<span style=\"font-family: terminal, monaco, monospace; font-size: 10pt;\"><em>wLength<\/em>: \u00a0 \u00a0 \u00a0 sizeof(payload) \/\/ Size in bytes of the coming payload (<em>Data<\/em> field, next line)<\/span><br \/>\n<span style=\"font-family: terminal, monaco, monospace; font-size: 10pt;\"><em>Data<\/em>: \u00a0 \u00a0 \u00a0 \u00a0 \u00a0{Data_Set_ADDR, Length_of_Following_Data, bData[0], bData[1], &#8230; , bData[n]}<\/span><\/span><\/div>\n<p><span style=\"font-family: helvetica, arial, sans-serif; font-size: 12pt;\"><br \/>\nMSB = Most Significant Byte, LSB = Least Significant Byte.<\/span><\/p>\n<p><span style=\"font-family: helvetica, arial, sans-serif; font-size: 12pt;\">Below is an abstracted example for defining an accessory\u00a0connection and sending a payload declaring the trigger held down halfway and menu button pressed. \u00a0Please note that as of 27 March, 2017 the\u00a0bit &amp; byte values on Pages 25 &#8211; 26\u00a0of the\u00a0<span style=\"text-decoration: underline;\"><span style=\"color: #00ccff;\"><a style=\"color: #00ccff; text-decoration: underline;\" href=\"https:\/\/dl.vive.com\/Tracker\/Guideline\/HTC_Vive_Tracker_Developer_Guidelines_v1.3.pdf\" target=\"_blank\">HTC Vive Tracker Developer Guidelines v1.3<\/a><\/span><\/span>\u00a0are incompletely, and in some cases incorrectly, defined (rectified later, below).<\/span><\/p>\n<div><span style=\"font-family: helvetica, arial, sans-serif; font-size: 12pt;\"><span style=\"font-family: terminal, monaco, monospace; font-size: 10pt;\"><em>bmRequestType<\/em>: 0b00100001<\/span><br \/>\n<span style=\"font-family: terminal, monaco, monospace; font-size: 10pt;\"><em>bRequest<\/em>: \u00a0 \u00a0 \u00a00x09<\/span><br \/>\n<span style=\"font-family: terminal, monaco, monospace; font-size: 10pt;\"><em>wValue<\/em>: \u00a0 \u00a0 \u00a0 \u00a00x0300<\/span><br \/>\n<span style=\"font-family: terminal, monaco, monospace; font-size: 10pt;\"><em>wIndex<\/em>: \u00a0 \u00a0 \u00a0 \u00a02<\/span><br \/>\n<span style=\"font-family: terminal, monaco, monospace; font-size: 10pt;\"><em>wLength<\/em>: \u00a0 \u00a0 \u00a0\u00a05<\/span><br \/>\n<span style=\"font-family: terminal, monaco, monospace; font-size: 10pt;\"><em>Data<\/em>: \u00a0 \u00a0 \u00a0 \u00a0 \u00a0{0xB3, 3, 0x03, 0x00, 0x00}<\/span><\/span><\/div>\n<div><span style=\"font-family: helvetica, arial, sans-serif; font-size: 12pt;\"><span style=\"font-family: terminal, monaco, monospace; font-size: 10pt;\"><em>bmRequestType<\/em>: 0b00100001<br \/>\n<em>bRequest<\/em>: \u00a0 \u00a0 \u00a00x09<br \/>\n<em>wValue<\/em>: \u00a0 \u00a0 \u00a0 \u00a00x0300<br \/>\n<em>wIndex<\/em>: \u00a0 \u00a0 \u00a0 \u00a02<br \/>\n<em>wLength<\/em>: \u00a0 \u00a0 \u00a0\u00a012<br \/>\n<em>Data<\/em>: \u00a0 \u00a0 \u00a0 \u00a0 \u00a0{0xB4, 10, 0x00, 0b00000100, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00}<br \/>\n<\/span><\/span><span style=\"font-size: 12pt; font-family: helvetica, arial, sans-serif;\"><span style=\"font-size: 18pt;\"><strong><br \/>\n2. Rectified Byte Definitions<\/strong><\/span><br \/>\n<\/span><\/div>\n<p><span style=\"font-size: 12pt; font-family: helvetica, arial, sans-serif;\">The manual fails to mention or make clear that the Data_Set_Address and Data_Count need to be included in the feature report.\u00a0 Bytes in my examples are read left-to-right, indexed at zero. \u00a0Bits are read right-to-left, also indexed at zero.<\/span><\/p>\n<div><span style=\"font-family: terminal, monaco, monospace; font-size: 10pt;\">ADDRESS: 0xB3<br \/>\nUPCOMING_DATA_COUNT (3)<br \/>\n0 &#8211; HOST_TYPE (2=PHONE, 3=ACCESSORY)<br \/>\n1 &#8211; RESERVED (CHARGE ENABLE, can&#8217;t be edited yet &#8211; Tracker will always leech power from host)<br \/>\n2 &#8211; RESERVED (OS TYPE, TBD)<br \/>\n{ 0xB3, 3, HOST_TYPE, 0x00, 0x00 }<\/span><\/div>\n<div><span style=\"font-family: terminal, monaco, monospace; font-size: 10pt;\">ADDRESS: 0xB4<br \/>\nUPCOMING_DATA_COUNT (10)<br \/>\n0 &#8211; NO VISIBLE FUNCTION (TAG INDEX)<br \/>\n1 &#8211; BUTTONS:<br \/>\n1.0 &#8211; TRIGGER (OVERRIDES ANALOGUE TRIGGER BYTE TO BE 0xFF, or at least I can confirm this occurs within Unity)<br \/>\n1.1 &#8211; GRIP<br \/>\n1.2 &#8211; APPLICATION MENU<br \/>\n1.3 &#8211; SYSTEM (Yes, it will open the dashboard)<br \/>\n1.4 &#8211; TOUCHPAD BUTTON (ONLY WORKS IF TOUCHPAD_CONTACT IS WRITTEN TO 1)<br \/>\n1.5 &#8211; TOUCHPAD_CONTACT (DOES NOT REQUIRE TOUCHPAD AXIS VALUES)<br \/>\n1.6 &#8211; RESERVED<br \/>\n1.7 &#8211; RESERVED<br \/>\n2 &#8211; TOUCHPAD_X_LSB (LSB = Least Significant Byte)<br \/>\n3 &#8211; TOUCHPAD_X_MSB (MSB = Most Significant Byte)<br \/>\n4 &#8211; TOUCHPAD_Y_LSB (LSB)<br \/>\n5 &#8211; TOUCHPAD_Y_MSB (MSB)<br \/>\n6 &#8211; NO VISIBLE FUNCTION (SHOULD BE TRIGGER_LSB)<br \/>\n7 &#8211; TRIGGER (SHOULD BE TRIGGER_MSB, OVERRIDES TRIGGER BIT OF BUTTON BYTE IF WRITTEN TO 0xFF. \u00a0Since byte 6 is unused we lose a whole byte of possible data transfer.)<br \/>\n8 &#8211; RESERVED (BATTERY_LSB?)<br \/>\n9 &#8211; RESERVED (BATTERY_MSB?)<br \/>\n{ 0xB4, 10, 0x00, BUTTONS, PAD_X_LSB, PAD_X_MSB, PAD_Y_LSB, PAD_Y_MSB, 0x00, TRIGGER, 0x00, 0x00 }<\/span><br \/>\n<span style=\"font-size: 12pt; font-family: helvetica, arial, sans-serif;\"><span style=\"font-size: 18pt;\"><br \/>\n<\/span><span style=\"font-size: 18pt;\"><strong>3. Library Interfacing<\/strong><\/span><br \/>\n<\/span><\/div>\n<p><span style=\"font-family: helvetica, arial, sans-serif; font-size: 12pt;\">USB protocols are not something you can just throw together in an afternoon &#8211; you&#8217;re going to want a library to handle all that overhead. \u00a0For the code snippet\u00a0below,\u00a0I used the\u00a0<span style=\"text-decoration: underline; color: #00ccff;\"><a style=\"color: #00ccff; text-decoration: underline;\" href=\"http:\/\/www.fourwalledcubicle.com\/LUFA.php\" target=\"_blank\">Lightweight USB Framework for AVRs (LUFA)\u00a0library by Dean Camera<\/a><\/span>, building upon the <span style=\"font-family: terminal, monaco, monospace; font-size: 10pt;\">GenericHIDHost<\/span> demo found in <span style=\"font-family: terminal, monaco, monospace; font-size: 10pt;\">&#8230;\/LUFA 151115\/Demos\/Host\/LowLevel\/GenericHIDHost<\/span>; coded in <span style=\"font-size: 10pt; font-family: terminal, monaco, monospace;\">C++<\/span>.<\/span><\/p>\n<p><span style=\"font-family: helvetica, arial, sans-serif; font-size: 12pt;\">First I edited the <span style=\"font-family: terminal, monaco, monospace; font-size: 10pt;\">makefile<\/span> to reflect my chip. \u00a0<a href=\"http:\/\/codeandlife.com\/2016\/01\/30\/usb-mouse-with-atmega32u4-pro-micro-clone-and-lufa\/\"><span style=\"text-decoration: underline;\"><span style=\"color: #00ccff; text-decoration: underline;\">This blog post<\/span><\/span><\/a> by Joonas Pihlajamaa really helped me get started. \u00a0Below are the values I changed:<\/span><\/p>\n<div><span style=\"font-family: terminal, monaco, monospace; font-size: 10pt;\">\u00a0 MCU = at90usb647<br \/>\nBOARD = USER<br \/>\nF_CPU = 8000000<\/span><\/div>\n<p><span style=\"font-family: helvetica, arial, sans-serif; font-size: 12pt;\">I then went into <span style=\"font-family: terminal, monaco, monospace; font-size: 10pt;\">GenericHIDHost.h<\/span> and removed any references to on-board LEDs or a serial output monitor, as my custom board did not have a definitions file for these things. \u00a0Then within <span style=\"font-family: tahoma, arial, helvetica, sans-serif; font-size: 10pt;\">GenericHIDHost.c<\/span>, this was the main function to perform the same task that was described at the end of <b>Section 1<\/b> of this post:<\/span><\/p>\n<div><span style=\"font-family: helvetica, arial, sans-serif; font-size: 12pt;\"><span style=\"font-family: terminal, monaco, monospace; font-size: 10pt;\">int main(void)<\/span><br \/>\n<span style=\"font-family: terminal, monaco, monospace; font-size: 10pt;\">{<br \/>\n. \u00a0 SetupHardware();<br \/>\n. \u00a0 GlobalInterruptEnable();<br \/>\n.<br \/>\n<\/span><\/span><span style=\"font-family: helvetica, arial, sans-serif; font-size: 12pt;\"><span style=\"font-family: terminal, monaco, monospace; font-size: 10pt;\">. \u00a0 for(;;)<br \/>\n. \u00a0 {<br \/>\n. \u00a0 \u00a0 \u00a0 uint8_t\u00a0payload0xB3[5] = {0xB3, 3, 0x03, 0x00, 0x00};<br \/>\n. \u00a0 \u00a0 \u00a0 uint8_t payload0xB4[12] = {0xB4, 10, 0x00, 1 &lt;&lt; 2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00};<br \/>\n.<br \/>\n. \u00a0 \u00a0 \u00a0 WriteNextReport(payload0xB3, 0x00, REPORT_TYPE_FEATURE, 5);<br \/>\n. \u00a0 \u00a0 \u00a0 USB_USBTask();<br \/>\n.<br \/>\n. \u00a0 \u00a0 \u00a0 WriteNextReport(payload0xB4, 0x00, REPORT_TYPE_FEATURE, 12);<br \/>\n. \u00a0 \u00a0 \u00a0 USB_USBTask();<br \/>\n. \u00a0 }<br \/>\n}<\/span><\/span><\/div>\n<p><span style=\"font-family: helvetica, arial, sans-serif; font-size: 12pt;\">I&#8217;ve not yet tested how necessary\u00a0it is to write the <span style=\"font-family: terminal, monaco, monospace; font-size: 10pt;\">0xB3<\/span> report every frame, but I do know this bit got the Tracker to work reliably. \u00a0The other code I had to change was in the function <span style=\"font-family: terminal, monaco, monospace; font-size: 10pt;\">WriteNextReport<\/span>\u00a0at the end of <span style=\"font-family: terminal, monaco, monospace; font-size: 10pt;\">GenericHIDHost.c<\/span>. \u00a0Apparently <span style=\"font-family: terminal, monaco, monospace; font-size: 10pt;\"><i>wIndex<\/i><\/span>\u00a0was set to <span style=\"font-size: 10pt; font-family: terminal, monaco, monospace;\">0<\/span> by default, however HTC&#8217;s Vive Tracker requires <span style=\"font-family: terminal, monaco, monospace; font-size: 10pt;\"><i>wIndex<\/i><\/span> to be <span style=\"font-family: terminal, monaco, monospace; font-size: 10pt;\">2<\/span>.<\/span><\/p>\n<div><span style=\"font-family: terminal, monaco, monospace; font-size: 10pt;\">USB_ControlRequest = (USB_Request_Header_t)<br \/>\n{<br \/>\n.bmRequestType = 0b00100001,<br \/>\n.bRequest \u00a0 \u00a0 \u00a0= 0x09,<br \/>\n.wValue \u00a0 \u00a0 \u00a0 \u00a0= 0x0300,<br \/>\n.wIndex \u00a0 \u00a0 \u00a0 \u00a0= 2,<br \/>\n.wLength \u00a0 \u00a0 \u00a0 = ReportLength,<br \/>\n};<br \/>\n<\/span><span style=\"font-size: 12pt; font-family: helvetica, arial, sans-serif;\"><span style=\"font-size: 18pt;\"><br \/>\n<\/span><span style=\"font-size: 18pt;\"><strong>4. A Low(er)-Level Look<\/strong><\/span><br \/>\n<\/span><\/div>\n<p><span style=\"font-family: helvetica, arial, sans-serif; font-size: 12pt;\">Solely from picking apart Dean&#8217;s library, these would seem to be the primary steps that need to be performed in order to successfully communicate with the Vive Tracker:<\/span><\/p>\n<div><span style=\"font-family: terminal, monaco, monospace; font-size: 10pt;\">&#8211; Initiate USB as host<br \/>\n&#8211; Enumerate the attached USB device<br \/>\n&#8211; Read and process the device&#8217;s configuration descriptor<br \/>\n&#8211; Set the device to its initial configuration (Dean remarks that it&#8217;s unlikely to have more than one configuration)<br \/>\n&gt; \u00a0 bmRequestType: 0b10000000<br \/>\n&gt; \u00a0 bRequest: 0x09<br \/>\n&gt; \u00a0 wValue: 1<br \/>\n&gt; \u00a0 wIndex: 0<br \/>\n&gt; \u00a0 wLength: 0<br \/>\n&gt; \u00a0 Data: NULL<br \/>\n&#8211; At this stage, all the setup is now complete!<br \/>\n&#8211; To send a report:<br \/>\n&gt; \u00a0 Prepare the bus\/pipe<br \/>\n&gt; \u00a0 Feed it the header (bmRequestType, bRequest, wValue, etc.)<br \/>\n&gt; \u00a0 Feed it the datastream (starting with {0xB_, etc.} )<br \/>\n&gt; \u00a0 Return the bus\/pipe to its initial state<br \/>\n&#8211; Perform any other needed USB host tasks<\/span><\/div>\n<p><span style=\"font-family: helvetica, arial, sans-serif; font-size: 12pt;\">This section isn&#8217;t 100% solidified for me, simply because Dean did such a great job at constructing this library that once I was able to format the payload correctly for the Tracker, I had no more\u00a0need to dive into the low-level for troubleshooting. \u00a0If you&#8217;re using AVRs for your microcontroller, I highly\u00a0recommend Dean&#8217;s LUFA library!<\/span><\/p>\n<p><span style=\"font-family: helvetica, arial, sans-serif; font-size: 12pt;\">I am by no means proficient in USB HID communications, but if you run into any road blocks then feel free to reach out to me, perhaps I&#8217;ll be able to offer some advice as a result of my own troubleshooting.<\/span><\/p>\n<p><span style=\"font-family: helvetica, arial, sans-serif; font-size: 12pt;\">I made note of this at the top &#8211; <del>if you think that it would be valuable for me to develop this into an library for USB Host-capable Arduino boards, please comment your interest below. \u00a0It could definitely help out if you explain what you would hope to use said library to do with the Vive Tracker.<\/del><\/span><\/p>\n<p><span style=\"font-family: helvetica, arial, sans-serif; font-size: 12pt;\">EDIT: Reddit user <span style=\"text-decoration: underline;\"><span style=\"color: #00ccff; text-decoration: underline;\"><a style=\"color: #00ccff; text-decoration: underline;\" href=\"https:\/\/www.reddit.com\/user\/matzman666\">\/u\/matzmann666<\/a><\/span><\/span>\u00a0has wonderfully created a library for the Arduino Due ARM-based microcontroller! \u00a0Check out their GitHub page here:\u00a0<span style=\"text-decoration: underline;\"><span style=\"color: #00ccff; text-decoration: underline;\">github.com\/matzman666\/USBHost<\/span><\/span><\/span><\/p>\n<p><span style=\"font-family: helvetica, arial, sans-serif; font-size: 12pt;\">And lastly, I&#8217;d like to send a thousand thanks to <a href=\"https:\/\/twitter.com\/virtual_dario\"><span style=\"text-decoration: underline; color: #00ccff;\">Dario Laverde from HTC<\/span><\/a>, he was a great help in troubleshooting a lot of the feature report content, and I wouldn&#8217;t have Vive Trackers to work with if it weren&#8217;t for him. \u00a0Thank you, Dario!<\/span><\/p>\n<p><span style=\"font-family: helvetica, arial, sans-serif; font-size: 12pt;\">Alright, that&#8217;s all I&#8217;ve got for this quick and dirty documentation. \u00a0Next time you hear from me should be a little more developed, but I really wanted to get this info out there fast! \u00a0I hope some folks out there\u00a0find it useful :)<\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>This page is outdated. \u00a0I&#8217;ve kept it on the site in the event anyone needs it for archival reference, but please direct your attention to www.talariavr.com\/blog\/vive-tracker-initial-documentation for up-to-date information. The following post was published on 27 March, 2017. \u00a0It was briefly updated on 7 April, 2017. \u00a0 * \u00a0* \u00a0* \u00a0* \u00a0* \u00a0* \u00a0* \u00a0* \u00a0* \u00a0* \u00a0* \u00a0* \u00a0* \u00a0* \u00a0* \u00a0* \u00a0* \u00a0* \u00a0* \u00a0* UPDATE: REDDIT USER \/U\/MATZMANN666 HAS CREATED AN ARDUINO LIBRARY, SEE BOTTOM OF POST&#8230;<\/p>\n<p class=\"read-more\"><a class=\"btn btn-default\" href=\"http:\/\/www.talariavr.com\/blog\/vive-tracker-documentation-archive\/\"> Read More<span class=\"screen-reader-text\">  Read More<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-466","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"http:\/\/www.talariavr.com\/blog\/wp-json\/wp\/v2\/pages\/466","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.talariavr.com\/blog\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"http:\/\/www.talariavr.com\/blog\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"http:\/\/www.talariavr.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.talariavr.com\/blog\/wp-json\/wp\/v2\/comments?post=466"}],"version-history":[{"count":5,"href":"http:\/\/www.talariavr.com\/blog\/wp-json\/wp\/v2\/pages\/466\/revisions"}],"predecessor-version":[{"id":471,"href":"http:\/\/www.talariavr.com\/blog\/wp-json\/wp\/v2\/pages\/466\/revisions\/471"}],"wp:attachment":[{"href":"http:\/\/www.talariavr.com\/blog\/wp-json\/wp\/v2\/media?parent=466"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}