Features
What each firmware's commands can do, taken from its documentation.
Motion
Moves, the wheel and horizontal scroll, and how each box smooths them.
| Capability | Stock | Medius | Result |
|---|---|---|---|
| Relative move | km.move | MOVE | Equal |
| Immediate move | km.move_now | MOVE(NOW) | Equal |
| Move with a receipt | RAW_MOVE | No | Stock |
| Query for pending motion | km.moving | No | Stock |
| Flush held motion | No | MOVE(FLUSH) | Medius |
| Discard held motion | No | MOVE(DISCARD) | Medius |
| Absolute move on a virtual screen | km.moveto | No | Stock |
| Tracked pointer position | km.getpos | No | Stock |
| Move, click and move back | km.silent | CLIP_APPEND | Equal |
| Wheel | km.wheel | MOVE | Equal |
| Horizontal scroll (AC Pan) | No | MOVE | Medius |
| Capability | Stock | Medius | Result |
|---|---|---|---|
| Spread over the command interval | INTERPOLATE | OPTION(SPREAD) | Equal |
| Spread over a set time | INTERPOLATE | No | Stock |
| Render through a mouse model | No | OPTION(RENDER) | Medius |
| Render native motion | No | OPTION(RENDER) | Medius |
| Carry injected motion only in native reports | No | OPTION(MOVE_RIDE) | Medius |
Mouse buttons
Stock has a command for each of five buttons. Medius's INJECT covers every button the mouse has, up to 16.
| Button | Stock | Medius | Result |
|---|---|---|---|
| Left | km.left | INJECT | Equal |
| Right | km.right | INJECT | Equal |
| Middle | km.middle | INJECT | Equal |
| Side 1 | km.side1 | INJECT | Equal |
| Side 2 | km.side2 | INJECT | Equal |
| Buttons 6-16 | No | INJECT | Medius |
| Capability | Stock | Medius | Result |
|---|---|---|---|
| Clicks timed by the box | km.click | CLIP_APPEND | Equal |
| Query native buttons | PHYS_BUTTONS | No | Stock |
Keys and media keys
Keyboard keys, and media keys such as volume and play.
| Capability | Stock | Medius | Result |
|---|---|---|---|
| Key down | km.down | INJECT | Equal |
| Key up | km.up | INJECT | Equal |
| Key press timed by the box | km.press | CLIP_APPEND | Equal |
| Several keys down in one command | km.multidown | No | Stock |
| Several keys up in one command | km.multiup | No | Stock |
| Several keys pressed in one command | km.multipress | No | Stock |
| String typed by the box | km.string | CLIP_APPEND | Equal |
| Release every injected key | km.init | RESET | Equal |
| Query a key's state | km.isdown | No | Stock |
| Media key down and up | No | INJECT | Medius |
Locks, scaling and remaps
On both boxes a lock or a scale acts on native input and leaves injected input alone.
| Button | Stock | Medius | Result |
|---|---|---|---|
| Left | km.left_mask | LOCK | Equal |
| Right | km.right_mask | LOCK | Equal |
| Middle | km.middle_mask | LOCK | Equal |
| Side 1 | km.side1_mask | LOCK | Equal |
| Side 2 | km.side2_mask | LOCK | Equal |
| Buttons 6-16 | No | LOCK | Medius |
| Capability | Stock | Medius | Result |
|---|---|---|---|
| Block cursor motion per direction | km.move_mask | LOCK | Equal |
| Block the wheel per direction | km.wheel_mask | LOCK | Equal |
| Block horizontal scroll | No | LOCK | Medius |
| Block a key | km.mask | LOCK | Equal |
| Block a media key | No | LOCK | Medius |
| Block every key in one command | No | LOCK | Medius |
| Block only the press or only the release | No | LOCK | Medius |
| Query active locks | INJECT_SNAPSHOT | QUERY(LOCKS) | Equal |
| Capability | Stock | Medius | Result |
|---|---|---|---|
| Scale motion, 0-255% | No | LOCK | Medius |
| Reverse motion | No | LOCK | Medius |
| Scale motion with or against the injected direction | No | LOCK | Medius |
| Scale only motion along the injected direction | No | OPTION(BEARING) | Medius |
| Capability | Stock | Medius | Result |
|---|---|---|---|
| Key to key | km.remap | No | Stock |
| Button to button | No | TRANSFORM | Medius |
| Button to key | No | TRANSFORM | Medius |
| Button to media key | No | TRANSFORM | Medius |
| Axis to axis | No | TRANSFORM | Medius |
| Swap two axes | No | TRANSFORM | Medius |
| Query active remaps | No | QUERY(TRANSFORMS) | Medius |
Game pads
Stock's commands for game pads. Medius relays a pad and has no command for one.
| Capability | Stock | Medius | Result |
|---|---|---|---|
| Read the pad's state | km.controller_physical | No | Stock |
| Stream pad changes | km.controller | No | Stock |
| Drive the pad state the PC gets | km.controller_state | No | Stock |
| Block a pad control | km.controller_mask | No | Stock |
| Recognise the pad's kind | DEVICE | No | Stock |
| Pad response curves and deadzones | CONNECTION | No | Stock |
| Mouse and keyboard as a pad | CONNECTION | No | Stock |
| Saved pad presets | CONNECTION | No | Stock |
| Pad | Stock | Medius | Result |
|---|---|---|---|
| HID pad | km.controller_state | No | Stock |
| DualShock 4 | km.controller_state | No | Stock |
| DualSense | km.controller_state | No | Stock |
| DualSense Edge | km.controller_state | No | Stock |
| Xbox One and Series (GIP) | km.controller_state | No | Stock |
| Xbox 360 (XInput) | km.controller_state | No | Stock |
Input and traffic capture
Watching native input and USB traffic from the control port.
| Capability | Stock | Medius | Result |
|---|---|---|---|
| Stream native button changes | km.buttons | CATCH(BTN) | Equal |
| Stream native key changes | km.keys | CATCH(KEY) | Equal |
| Stream native media key changes | No | CATCH(MEDIA) | Medius |
| Stream native motion | No | CATCH(AXIS) | Medius |
| Capture native HID reports | RAW_PASSTHROUGH | CATCH(HID_IN) | Equal |
| Capture HID OUT reports | No | CATCH(HID_OUT) | Medius |
| Capture vendor interrupt traffic | No | CATCH(VEND_INTR) | Medius |
| Capture vendor bulk traffic | No | CATCH(VEND_BULK) | Medius |
| Capture control transfers | No | CATCH(CONTROL) | Medius |
| Capture reports the clone emits | No | CATCH(EMIT) | Medius |
| Watch bus events | No | CATCH(BUS) | Medius |
Device control
Commands that act on the real device or its traffic. Medius's commands here need imperfect clones on.
| Capability | Stock | Medius | Result |
|---|---|---|---|
| Control transfer to the real device | No | TRANSFER | Medius |
| Raw report to the PC | No | RAW | Medius |
| Raw packet to the real device | No | RAW | Medius |
| Rewrite packets in flight | No | REWRITE | Medius |
| Drop packets in flight | No | REWRITE | Medius |
| Reply to control requests from the box | No | REWRITE | Medius |
| Patch the descriptors the PC reads | No | PATCH | Medius |
Clips
A clip is a set of moves, clicks and keys stored on the box and timed by the box.
| Capability | Stock | Medius | Result |
|---|---|---|---|
| Load onto the box | No | CLIP_APPEND | Medius |
| Play, pause and stop | No | CLIP_CTRL | Medius |
| Loop | No | CLIP_SET | Medius |
| Keep to replay | No | CLIP_SET | Medius |
| Lock native input while playing | No | CLIP_SET | Medius |
| Start on a button, key or media key | No | CLIP_TRIGGER | Medius |
| Start on a matched packet | No | CLIP_TRIGGER | Medius |
Box queries and settings
Queries about the box and the real device, and the box's settings.
| Capability | Stock | Medius | Result |
|---|---|---|---|
| Firmware version number | FIRMWARE_VERSION | QUERY(VERSION) | Equal |
| Real device's kind | DEVICE | QUERY(DEVICE_INFO) | Equal |
| Real device's VID and PID | No | QUERY(DEVICE_INFO) | Medius |
| Native report rate | km.device | QUERY(RATE) | Equal |
| Inputs the real device declares | No | QUERY(CAPS) | Medius |
| Injected state snapshot | INJECT_SNAPSHOT | No | Stock |
| Health flags | No | QUERY(HEALTH) | Medius |
| Drop and reset counters | No | QUERY(STATS) | Medius |
| Diagnostic log | No | LOG | Medius |
| Capability | Stock | Medius | Result |
|---|---|---|---|
| Emit rate | No | OPTION(EMIT) | Medius |
| Forced poll rateWith imperfect clones on | No | OPTION(EMIT) | Medius |
| Box name | No | OPTION(NAME) | Medius |
| Status LED | No | LED | Medius |
| Reboot | No | REBOOT | Medius |
| Return to passthrough | No | RESET | Medius |
| Erase stored settings | No | RESET(NVS) | Medius |
| Baud rate | km.baud | No | Stock |
| Command echo | km.echo | No | Stock |