<!-- Source: https://medius.k4tech.net/comparison/features -->
# 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.

#### Moves

| 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 |

#### Smoothing

| 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.

#### Press and release

| 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 |

#### Clicks and queries

| 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.

#### Key commands

| 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 locks

| 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 |

#### Other locks

| 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 |

#### Motion scaling

| 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 |

#### Remaps

| 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.

#### Pad commands

| 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 |

#### Pads driven

| 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.

#### Capture commands

| 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.

#### Device commands

| 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.

#### Clip commands

| 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.

#### Queries

| 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 |

#### Settings

| 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 |
