Relayed reports

Each box relayed mice and keyboards at several report rates, 15 s each, with every report numbered.

Mouse reports reaching the PC
MouseStockMediusResult
1 kHz mouseAll, once, in orderAll, once, in orderEqual
500 Hz mouseAll, once, in orderAll, once, in orderEqual
250 Hz mouseAll, once, in orderAll, once, in orderEqual
125 Hz mouseAll, once, in orderAll, once, in orderEqual
Mouse in bursts of 7 reportsAll, once, in orderAll, once, in orderEqual
500 Hz mouse for 2 minutesAll, once, in orderAll, once, in orderEqual
Keyboard reports reaching the PC
KeyboardStockMediusResult
1 kHz keyboardAll, once, in orderAll, once, in orderEqual
125 Hz keyboardAll, once, in orderAll, once, in orderEqual
Keyboard in bursts of 7 reportsAll, once, in orderAll, once, in orderEqual
Report bytes reaching the PC
DeviceStockMediusResult
1 kHz mouseUnchangedUnchangedEqual
500 Hz mouseUnchangedUnchangedEqual
250 Hz mouseUnchangedUnchangedEqual
125 Hz mouseUnchangedUnchangedEqual
Mouse in bursts of 7 reportsUnchangedUnchangedEqual
1 kHz keyboardUnchangedUnchangedEqual
125 Hz keyboardUnchangedUnchangedEqual
Keyboard in bursts of 7 reportsUnchangedUnchangedEqual

Report timing

The relay runs above, timed on the PC's USB bus.

Reports >10% early or late, in 15 s
MouseStockMediusResult
1 kHz mouse00Equal
500 Hz mouse2-760Medius
250 Hz mouse0-200Equal
125 Hz mouse0-20Equal
Gaps >1.5× the report interval, in 15 s
MouseStockMediusResult
1 kHz mouse00Equal
500 Hz mouse1-240Medius
250 Hz mouse00Equal
125 Hz mouse00Equal
Reports >10% early or late, in 2 minutes
MouseStockMediusResult
500 Hz mouse2872Medius
Gaps >1.5× the report interval, in 2 minutes
MouseStockMediusResult
500 Hz mouse1050Medius
Keyboard reports >10% early or late, in 15 s
KeyboardStockMediusResult
1 kHz keyboard00-2Equal
125 Hz keyboard00Equal

Report latency

Each native report is timed from the emulator queuing it to the PC receiving the clone's copy. The emulator runs 1,000 ppm slow, so its reports land at every point between polls. Plugged straight into a PC, a native report waits half the native interval on average (4 ms for a 125 Hz mouse).

Report latency, p50
MouseStockMediusResult
1 kHz mouse1.43-1.44 ms1.02-1.04 msMedius
500 Hz mouse1.24-1.39 ms1.50-1.51 msStockStock defect
250 Hz mouse1.22-1.35 ms2.52 msStockStock defect
125 Hz mouseStock's clone declares 1 ms, the mouse 8 ms (see Poll interval)1.32-1.37 ms4.50-4.52 msStockStock defect
Report latency, p95
MouseStockMediusResult
1 kHz mouse2.05-2.61 ms1.46-1.48 msMedius
500 Hz mouse1.99-2.03 ms2.41 msStockStock defect
250 Hz mouse1.90-2.03 ms4.31-4.32 msStockStock defect
125 Hz mouse2.00-2.04 ms8.11-8.12 msStockStock defect
Report latency, p99
MouseStockMediusResult
1 kHz mouse2.20-2.98 ms1.51-1.52 msMedius
500 Hz mouse2.19-2.20 ms2.49 msStockStock defect
250 Hz mouse2.15-2.18 ms4.48 msStockStock defect
125 Hz mouse2.17-2.20 ms8.43 msStockStock defect
Report latency, fastest
MouseStockMediusResult
1 kHz mouse370-381 µs501-502 µsStock
500 Hz mouse335-340 µs487-504 µsStockStock defect
250 Hz mouse318-326 µs502-514 µsStockStock defect
125 Hz mouse328-492 µs499-510 µsStockStock defect

Reads while injecting

The emulated mouse sends its next report only after the box reads the last one, so the count is how often the box read the mouse. Read every millisecond, a 1 kHz mouse gives 15,500 reports in 15.5 s and 5,500 in 5.5 s.

Reports read from a 1 kHz mouse in about 15.5 s

Stock km.moveMedius MOVE

LoadStockkm.moveMediusMOVEResult
Injecting 1,000 moves/s7,133-7,20115,540-15,584MediusStock defect
Reports read from a 1 kHz counting mouse in 15.5 s

Stock km.moveMedius MOVE

Moves sentStockkm.moveMediusMOVEResult
None15,50015,500Equal
1,000/s6,87715,500Medius
500/s5,23815,500Medius
125/s7,02015,499Medius
Reports read from a 1 kHz mouse moving at a varying speed, in 15.5 s

Stock km.moveMedius MOVE

Moves sentStockkm.moveMediusMOVEResult
1,000/s7,180-7,22715,500Medius
500/s6,965-7,02815,500Medius
125/s7,190-7,28715,500Medius
Reports read from a 1 kHz mouse in 15.5 s, injecting 1,000 moves/s

Stock km.moveMedius MOVE

MouseStockkm.moveMediusMOVEResult
Moving 1 count every report15,49315,500Medius
Moving 100 counts every report15,49515,500Medius
Moving 1 count, then -1, alternating15,49615,500Medius
Reports read from a 1 kHz mouse moving at a varying speed, in 5.5 s
Commands sentStockMediusResult
10 moves/s3,0035,500Medius
30 moves/s3,0105,500Medius
1,000 zero-count moves/s5,4965,500Medius
100 queries/s5,5005,500Equal

PC to real device

Requests and reports the PC sent the real device, through its clone.

What reaches the real device
PC sendsStockMediusResult
SET_PROTOCOL(boot)Passed onPassed onEqual
Endpoint halt, then clearPassed onPassed onEqual
Switch to alternate setting 1, then backPassed onPassed onEqual
Switch to configuration 2, then backClone reconnects insteadPassed onMediusStock defect
Keyboard LED reportPassed onPassed onEqual
20 HID output reportsPassed onPassed onEqual
Resets the real device gets
PC sendsStockMediusResult
One bus resetTwiceOnceDiffers
Hub port off for 1 sTwiceOnceDiffers

Real device to PC

A real device stalling its endpoint, one replying to polls with empty packets, and a vendor interface streaming a counter.

What reaches the PC
Native trafficStockMediusResult
A STALL on its interrupt endpointReaches the PCReaches the PCEqual
Empty packets on idle pollsReaches the PCReaches the PCEqual
Vendor stream at 1,000 packets/sReaches the PCReaches the PCEqual

Game pads

Three emulated pads, each moving its left stick through set values for 1.5 s.

Stick values on the PC
PadStockMediusResult
Xbox 360 pad (XInput)UnchangedUnchangedEqual
Xbox One pad (GIP)UnchangedUnchangedEqual
HID padUnchangedUnchangedEqual
PC output reaching the pad
PadStockMediusResult
Xbox 360 pad, LED commandReaches the padReaches the padEqual
Xbox One pad, start-up packetsReaches the padReaches the padEqual