# P.I. Engineering SDK Help

## ShipDriver Data Report

### General Information

VID | 05f3h
PID Reflector | 041fh or 1055
Consumer Usage Page | 1
Usage Page | 000Ch or 12

### ShipDriver Input Report

Figure 1: ShipDriver key reference.

Endpoint: 3, consumer usage page. There are two additional endpoints; 1 is keyboard and 2 is joystick.

Report Length: 32 bytes.

1. General Incoming Data

Byte 1* | Byte 2 | Byte 3 | Byte 4 | Byte 5 | Byte 6 | Byte 7 | Byte 8 | Byte 9 | Byte 10 | Byte 11 | Byte 12 | Byte 13 | Byte 14 | Byte 15 | Byte 16 | Byte 17 | Byte 18 | Byte 19 | Byte 20 | Byte 21 | Byte 22 | Bytes 23-32
Constant | Unit ID | Data Type | Keys 0-5 | Keys 6-11 | Keys 12-17 | Keys 18-23 | Keys 24-29 | Keys 30-33 | Keys 34-38 | Keys 39-43 | Wheel MSB | Wheel LSB | Lever 1 | Lever 2 | Switch 2 | Switch 1 | Ship Mode | Lever 1 cal'ed | Lever 2 cal'ed | Switch 2 cal'ed | Switch 1 cal'ed | Reserved
0 | <data> | 0 | D1 | D2 | D3 | D4 | D5 | D6 | D7 | D8 | A1 | A2 | A3 | A4 | A5 | A6 | Ship Mode | A7 | A8 | A9 | A10 | value

D1: for all bits 0 for key up, 1 for key down. Bit 1=Key 0, bit 2=Key 1, bit 3=Key 2, bit 4=Key 3, bit 5=Key 4, bit 6=Key 5, bits 7-8=0 always.
D2: for all bits 0 for key up, 1 for key down. Bit 1=Key 6, bit 2=Key 7, bit 3=Key 8, bit 4=Key 9, bit 5=Key 10, bit 6=Key 11, bits 7-8=0 always.
D3: for all bits 0 for key up, 1 for key down. Bit 1=Key 12, Bit 2=Key 13, bit 3=Key 14, bit 4=Key 15, bit 5=Key 16, bit 6=Key 17, bits 7-8=0 always.
D4: for all bits 0 for key up, 1 for key down. Bit 1=Key 18, Bit 2=Key 19, bit 3=Key 20, bit 4=Key 21, bit 5=Key 22, bit 6=Key 23, bits 7-8=0 always.
D5: for all bits 0 for key up, 1 for key down. Bit 1=Key 24, Bit 2=Key 25, bit 3=Key 26, bit 4=Key 27, bit 5=Key 28, bit 6=Key 29, bits 7-8=0 always.
D6: for all bits 0 for key up, 1 for key down. Bit 1=Key 30, Bit 2=Key 31, bit 3=Key 32, bit 4=Key 33, bits 5-8=0 always.
D7: for all bits 0 for key up, 1 for key down. Bit 1=Key 34, Bit 2=Key 35, bit 3=Key 36, bit 4=Key 37, bit 5=Key 38, bits 6-8=0 always.
D8: for all bits 0 for key up, 1 for key down. Bit 1=Key 39, Bit 2=Key 40, bit 3=Key 41, bit 4=Key 42, bit 5=Key 43, bits 6-8=0 always.
A1: Wheel MSB, after calibration reports calibrated values.
A2: Wheel LSB, after calibration reports calibrated values.
A3: Lever 1 uncalibrated
A4: Lever 2 uncalibrated
A5: Switch 2 uncalibrated
A6: Switch 1 uncalibrated
Ship Mode: Ship Mode, 1= Analogs as Joystick (Tiller), 129= Analogs as Joystick (Wheel), 0=Data Only. See output report 9 for more details.
A7: Lever 1 calibrated, 0 is 0%, 128 is 50% and 255 is 100%.
A8: Lever 2 calibrated, 0 is 0%, 128 is 50% and 255 is 100%.
A9: Switch 2 calibrated, 0 is 0%, 128 is 50% and 255 is 100%.
A10: Switch 1 calibrated, 0 is 0%, 128 is 50% and 255 is 100%.

2. Descriptor Data

This data is returned after a Request for Descriptor output report is sent.

Byte 1* | Byte 2 | Byte 3 | Byte 4 | Byte 5 | Byte 6 | Byte 7 | Byte 8 | Byte 9 | Byte 10 | Byte 11 | Byte 12 | Byte 13 | Byte 14 | Bytes 15-33
Constant | Unit ID | Data Type | Mode | Key mapstart | Layer2 Offset | Out size | Report size | Max Columns | Max Rows | LED State | Version | PID Low | PID Hi | Reserved
0 | <data> | 214 | 0 | 32 | 128 | 35 | 31 | 8 | 8 | NA | <data> | 31 | 4 | value

### ShipDriver Output Report

The following types of output reports are shown in the summary below.

Report | Format | Description
--- | --- | ---
1 | 0, 189, UnitID, 0... | Set Unit ID
2 | 0, 214, 0... | Request Descriptor
3 | 0, 215, OnOff, 0... | Speaker Control
4 | 0, 195, 7, 0... | Start Calibration
5 | 0, 195, 9, 0... | Save Calibration
6 | 0, 195, 0, 0... | Disable Auto-Writing to LED Display
7 | 0, 195, Control, 0... | Auto-Write Calibrated Values to LED Display
8 | 0, 187, LED3, LED2, LED1, 0... | Write to LED Display*
9 | 0, 216, Ship Mode, 0... | Set Ship Mode
10 | 0, 218, Sensitivity, 0... | Wheel Sensitivity+
11 | 0, 219, Sensitivity, 0... | Tiller Sensitivity++
12 | 0, 190, S2 LSB, S2 MSB, S1 LSB, S1 MSB, 0... | Deadzone for Switches
13 | 0, 217, 0... | Zero Wheel+
14 | 0, 201, Modifier, 0, HC1, HC2, HC3, HC4, HC5, HC6, 0... | Keyboard Reflector
15 | 0, 202, Joystick X, Joystick Y, Z rot., Joystick Z, Slider, Buttons, Buttons, Buttons, Buttons, 0, Point of View Hat, 0... | Joystick Reflector

*Must first send output report 6: Disable Auto-Writing to LED Display.
+Applicable only if ShipMode=129
++Applicable only if ShipMode=1

Endpoint: 4, vendor defined usage page

Report Length: 36 bytes.

1. Set Unit ID

Byte 1* | Byte 2 | Byte 3 | Bytes 4-36
Constant | Unit ID Command | Unit ID (0-255) | Constant
0 | 189 | value | 0

2. Request Descriptor

Byte 1* | Byte 2 | Bytes 3-36
Constant | Descriptor Command | Constant
0 | 214 | 0

3. Speaker Control

Byte 1* | Byte 2 | Byte 3 | Bytes 4-36
Constant | Speaker Command | OnOff | Constant
0 | 215 | 0=off, 1=on | 0

4. Start Calibration

Byte 1* | Byte 2 | Byte 3 | Bytes 4-36
Constant | Command | Constant | Constant
0 | 195 | 7 | 0

5. Save Calibration

Byte 1* | Byte 2 | Byte 3 | Bytes 4-36
Constant | Command | Constant | Constant
0 | 195 | 9 | 0

6. Disable Auto-Writing to LED Display

Byte 1* | Byte 2 | Byte 3 | Bytes 4-36
Constant | Command | Constant | Constant
0 | 195 | 0 | 0

7. Auto-Write Calibrated Values to LED Display

Byte 1* | Byte 2 | Byte 3 | Bytes 4-36
Constant | Command | Control | Constant
0 | 195 | Control | 0

Control: 1:Wheel, 2: Lever 1, 3: Lever 2, 4: Switch 2, 5: Switch 1. For wheel 0-360 degrees, all others 0-100%.

8. Write to LED Display*

Byte 1* | Byte 2 | Byte 3 | Byte 4 | Byte 5 | Bytes 6-36
Constant | LED Command | Right Digit | Middle Digit | Left Digit | Constant
0 | 187 | LED3 | LED2 | LED1 | 0

LED1: For all bits, 0 to turn off segment, 1 to turn on segment. Each bit corresponds to a segment as shown in figure for the right digit.
LED2: For all bits, 0 to turn off segment, 1 to turn on segment. Each bit corresponds to a segment as shown in figure for the middle digit.
LED3: For all bits, 0 to turn off segment, 1 to turn on segment. Each bit corresponds to a segment as shown in figure for the left digit.
* Make sure to send an output report 6: Disable Auto-Writing to LED Display first.

9. Set Ship Mode

Byte 1* | Byte 2 | Byte 3 | Bytes 4-36
Constant | Command | Mode | Constant
0 | 216 | Ship Mode | 0

Ship Mode: Set Ship Mode=1, Analogs as Joystick (Tiller) to enable analogs to send joystick messages. Wheel sends Slider, Lever 1 sends Joystick X, Lever 2 sends Joystick Y, Switch 1 sends Z axis, Switch 2 sends Z rot. Use this mode if you are using the tiller lever on the wheel so as to maximize the available range. Set Ship Mode=129, Analogs as Joystick (Wheel) to enable analogs to send joystick messages. Wheel sends Slider without wrapping, Lever 1 sends Joystick X, Lever 2 sends Joystick Y, Switch 1 sends Z axis, Switch 2 sends Z rot. Use this mode if you are using a wheel attachment on the wheel. The number of turns required to span the range depends on the Sensitivity chosen in output report 10, Wheel Sensitivity or output report 11, Tiller Sensitivity. The center of the range can be set by sending an output report 12, Zero Wheel. Set Ship Mode=0 (Data Only) to disable joystick messages being sent from the analog controls. Regardless of the Ship Mode all data appears in input report.

10. Wheel Sensitivity
Applicable only if Ship Mode=129, Joystick as Analogs (Wheel)

Byte 1* | Byte 2 | Byte 3 | Bytes 4-36
Constant | Command | Sensitivity | Constant
0 | 218 | Sensitivity | 0

Sensitivity: 0-255, where the bigger the number the more turns of the wheel required to span range. Default 13.

11. Tiller Sensitivity
Applicable only if Ship Mode=1, Joystick as Analogs (Tiller)

Byte 1* | Byte 2 | Byte 3 | Bytes 4-36
Constant | Command | Sensitivity | Constant
0 | 219 | Sensitivity | 0

Sensitivity: 0-255, where the bigger the number the less turning to fill the range. Default 50.

12. Deadzone for Switches
Sets a "dead" or silent zone for the two analog switches in the center so that motion of the switch within the zero detent does not cause change in data. Affects only the calibrated data in Bytes 21 and 22. The raw data in Bytes 16 and 17 will still show the changing data when switch is moved about the zero detent. Default for each is 5000 or 136 for the LSB and 19 for the MSB.

Byte 1* | Byte 2 | Byte 3 | Byte 4 | Byte 5 | Byte 6 | Bytes 7-36
Constant | Command | S2 LSB | S2 MSB | S1 LSB | S1 MSB | Constant
0 | 190 | S2L | S2H | S1L | S1H | 0

S2L: The LSB of deadzone setting for switch 2 (bottom switch).
S2H: The MSB of deadzone setting for switch 2 (bottom switch).
S1L: The LSB of deadzone setting for switch 1(top switch).
S1H: The MSB of deadzone setting for switch 1(top switch).

13. Zero Wheel
Applicable only if Ship Mode=129, Joystick as Analogs (Wheel). Send this command to center the wheel in the range.

Byte 1* | Byte 2 | Bytes 3-36
Constant | Command | Constant
0 | 217 | 0

14. Keyboard Reflector
Sends native keyboard messages.

Byte 1* | Byte 2 | Byte 3 | Byte 4 | Byte 5 | Byte 6 | Byte 7 | Byte 8 | Byte 9 | Byte 10 | Bytes 11-36
Constant | Keyboard Reflector Command | Modifier | Constant | Hid Code 1 | Hid Code 2 | Hid Code 3 | Hid Code 4 | Hid Code 5 | Hid Code 6 | Constant
0 | 201 | Modifier | 0 | HC1 | HC2 | HC3 | HC4 | HC5 | HC6 | 0

Modifier: Bit 1=Left Ctrl, bit 2=Left Shift, bit 3=Left Alt, bit 4=Left Gui, bit 5=Right Ctrl, bit 6=Right Shift, bit 7=Right Alt, bit 8=Right Gui.
HC1=Hid Code for 1st key down, or 0 to release previous key press in this byte position.
HC2=Hid Code for 2nd key down, or 0 to release previous key press in this byte position.
HC3=Hid Code for 3rd key down, or 0 to release previous key press in this byte position.
HC4=Hid Code for 4th key down, or 0 to release previous key press in this byte position.
HC5=Hid Code for 5th key down, or 0 to release previous key press in this byte position.
HC6=Hid Code for 6th key down, or 0 to release previous key press in this byte position.

15. Joystick Reflector
Sends native joystick messages.

Byte 1* | Byte 2 | Byte 3 | Byte 4 | Byte 5 | Byte 6 | Byte 7 | Byte 8 | Byte 9 | Byte 10 | Byte 11 | Byte 12 | Byte 13 | Bytes 14-36
Constant | Joystick Reflector Command | Joystick X | Joystick Y | Z rot. | Joystick Z | Slider | Game Buttons | Game Buttons | Game Buttons | Game Buttons | Constant | Point of View Hat | Constant
0 | 202 | X | Y | Z rot. | Z | Slider | GB1 | GB2 | GB3 | GB4 | 0 | Hat | 0

X: Joystick X, 0-127 is from center to full right, 255-128 is from center to full left.
Y: Joystick Y, 0-127 is from center to bottom, 255-128 is from center to top.
Z rot: Joystick Z, 0-127 is from center to bottom, 255-128 is from center to top.
Z: Joystick Z, 0-127 is from center to bottom, 255-128 is from center to top.
GB1: Game buttons 1-8, bit 1= game button 1, bit 2=game button 2, etc.
GB2: Game buttons 9-16, bit 1= game button 9, bit 2=game button 10, etc.
GB3: Game buttons 17-24, bit 1= game button 17, bit 2=game button 18, etc.
GB4: Game buttons 25-32, bit 1= game button 25, bit 2=game button 26, etc.
Hat: 0 to 7 clockwise, 8 is no hat.

*This first byte may be omitted on some non-PC operating systems. On these systems the read and write lengths will be 1 byte smaller.
Back to top