Types & errors
Every C struct, enum, and status code, by tableThe Medius* types and MEDIUS_* enumerators from medius.h. The calls that produce and consume them are on API index; streams on Streams. What each value means lives with the canonical type docs in the Rust Library and Native API sections.
How C models the enums. Each enum has a fixed-width backing: MediusStatus is int32_t; every other enum is uint8_t. On C23 and C++ the tag carries that underlying type directly (enum MediusButton : uint8_t); on C99 the tag is typedef'd to the integer and you pass the prefixed enumerators (MEDIUS_BUTTON_LEFT). Structs are plain PODs: pass by value, read fields directly. Nothing is heap-allocated, so there's nothing to free per value; only the opaque handles have a *_free.
Sizing constants
Fixed-cap arrays sized to the wire limitsThe event, lock, and log PODs embed fixed-cap arrays sized to the protocol's own limits, with a count field saying how many slots are live. char arrays are NUL-terminated.
| Macro | Value | Caps |
|---|---|---|
MEDIUS_MAX_USAGES | 256 | MediusUsageEvent.usages, MediusClipStatus.held |
MEDIUS_MAX_LOCKS | 256 | MediusLocks.entries |
MEDIUS_MAX_PATH | 512 | MediusPortInfo.path |
MEDIUS_MAX_LOG_TEXT | 512 | MediusLogLine.text |
MEDIUS_MAX_PRODUCT | 128 | MediusDeviceInfo.product |
MEDIUS_MAX_SERIAL | 128 | MediusPortInfo.serial |
MEDIUS_MAX_NAME | 33 | MediusVersion.name |
MEDIUS_CLIP_TRIG_MAX | 8 | MediusClipSettings.triggers |
Enums
uint8_t-backed selectors (MediusStatus is int32_t)Each value is a wire byte; the canonical meaning lives on Enums. The *Kind enums (and MediusClass) tag which arm of a built value (MediusUsage, MediusMotion, MediusCatchEvent) is populated.
MediusDeviceKind
The cloned device's primary kindenum MediusDeviceKind : uint8_t
The kind field of a MediusDeviceInfo, from the cloned device's Boot-interface protocol. Also what medius_device_find_mouse_box / _find_keyboard_box select on. See DeviceKind.
| Enumerator | Value | Meaning |
|---|---|---|
MEDIUS_DEVICE_KIND_UNKNOWN | 0 | Neither a Boot keyboard nor mouse. |
MEDIUS_DEVICE_KIND_KEYBOARD | 1 | The device is a keyboard. |
MEDIUS_DEVICE_KIND_MOUSE | 2 | The device is a mouse. |
MediusAction
The press / release tri-stateenum MediusAction : uint8_t
The override action shared by inject calls, whether a button, key, or media usage. See the injection model.
| Enumerator | Value | Meaning |
|---|---|---|
MEDIUS_ACTION_SOFT_RELEASE | 0 | Drop the box's override, press or force; a physical hold stays down. |
MEDIUS_ACTION_PRESS | 1 | Force the input down. |
MEDIUS_ACTION_FORCE_RELEASE | 2 | Force the input up, masking a physical hold. |
MediusClass
Which arm of a MediusUsage is setenum MediusClass : uint8_t
The kind tag of a MediusUsage you build with medius_usage_button/_key/_media.
| Enumerator | Value | Meaning |
|---|---|---|
MEDIUS_CLASS_BUTTON | 0 | id is a mouse button id. |
MEDIUS_CLASS_KEY | 1 | id is a HID keyboard usage. |
MEDIUS_CLASS_MEDIA | 2 | id is a 16-bit Consumer usage. |
MediusMotionKind
Which arm of a MediusMotion is setenum MediusMotionKind : uint8_t
Tags the MediusMotion you build with medius_motion_cursor/_wheel. See Move.
| Enumerator | Value | Meaning |
|---|---|---|
MEDIUS_MOTION_KIND_CURSOR | 0 | dx/dy apply. |
MEDIUS_MOTION_KIND_WHEEL | 1 | wheel applies. |
MediusLockTargetKind
Which input a MediusLockTarget addressesenum MediusLockTargetKind : uint8_t
The kind of a MediusLockTarget. See Lock.
| Enumerator | Value | Meaning |
|---|---|---|
MEDIUS_LOCK_TARGET_KIND_X | 0 | Horizontal movement. |
MEDIUS_LOCK_TARGET_KIND_Y | 1 | Vertical movement. |
MEDIUS_LOCK_TARGET_KIND_WHEEL | 2 | Scroll wheel. |
MEDIUS_LOCK_TARGET_KIND_USAGE | 3 | A momentary usage (the struct's usage field selects which). |
MediusLockDirection
Which edge a lock applies toenum MediusLockDirection : uint8_t
For an axis or wheel it's a sign; for a usage it's an edge. See LOCK.
| Enumerator | Value | Meaning |
|---|---|---|
MEDIUS_LOCK_DIRECTION_BOTH | 0 | Both signs, or press and release. |
MEDIUS_LOCK_DIRECTION_POSITIVE | 1 | Axis positive (+), or a usage press. |
MEDIUS_LOCK_DIRECTION_NEGATIVE | 2 | Axis negative (-), or a usage release. |
MediusEdge
Which edge of a trigger usage fires a clip bindingenum MediusEdge : uint8_t
The edge of a MediusClipTrigger's on usage that runs its action. Same wire values as MediusLockDirection. See Clip.
| Enumerator | Value | Meaning |
|---|---|---|
MEDIUS_EDGE_BOTH | 0 | Both press and release. |
MEDIUS_EDGE_PRESS | 1 | The press edge only. |
MEDIUS_EDGE_RELEASE | 2 | The release edge only. |
MediusClipAction
The engine action a clip trigger drivesenum MediusClipAction : uint8_t
What a bound MediusClipTrigger does to the clip on its edge; the same verbs as the medius_clip_start/_stop/... calls. See Clip.
| Enumerator | Value | Meaning |
|---|---|---|
MEDIUS_CLIP_ACTION_START | 0 | Rewind and play (resume from a pause). |
MEDIUS_CLIP_ACTION_STOP | 1 | Stop and release held input and the auto-lock. |
MEDIUS_CLIP_ACTION_PAUSE | 2 | Halt mid-clip, retaining the cursor and held input. |
MEDIUS_CLIP_ACTION_RESUME | 3 | Continue from the paused cursor. |
MEDIUS_CLIP_ACTION_RESTART | 4 | Force a rewind and play, even mid-playback. |
MEDIUS_CLIP_ACTION_TOGGLE | 5 | Play if idle/paused, stop if playing. |
MediusBlanket
A whole-group lock selectorenum MediusBlanket : uint8_t
A whole input group: which one medius_device_lock_all/_unlock_all block in one call, and the scope medius_clip_set_autolock auto-locks while a clip plays. See Lock.
The values are ABI-local ordinals (matching the crate's Blanket order), not the CLIP_LOCK_* wire bits.
| Enumerator | Value | Meaning |
|---|---|---|
MEDIUS_BLANKET_AIM | 0 | The X and Y cursor axes. |
MEDIUS_BLANKET_WHEEL | 1 | The wheel. |
MEDIUS_BLANKET_BUTTONS | 2 | Every mouse button. |
MEDIUS_BLANKET_KEYS | 3 | Every keyboard key and modifier. |
MEDIUS_BLANKET_MEDIA | 4 | Every media (Consumer) usage. |
MediusLedTarget
Which chip's status LED to driveenum MediusLedTarget : uint8_t
See LED.
| Enumerator | Value | Meaning |
|---|---|---|
MEDIUS_LED_TARGET_DEVICE | 0 | The device chip's own LED. |
MEDIUS_LED_TARGET_HOST | 1 | The host chip's LED, relayed over the inter-chip link. |
MEDIUS_LED_TARGET_BOTH | 2 | Both LEDs at once. |
MediusLedMode
What to drive the LED toenum MediusLedMode : uint8_t
See LED. Solid / Blink use the command's level.
| Enumerator | Value | Meaning |
|---|---|---|
MEDIUS_LED_MODE_AUTO | 0 | Restore the chip's own status display. |
MEDIUS_LED_MODE_OFF | 1 | LED dark. |
MEDIUS_LED_MODE_SOLID | 2 | Lit steadily at level. |
MEDIUS_LED_MODE_BLINK | 3 | Blinks at level. |
MediusRebootTarget
Which chip to restart, and howenum MediusRebootTarget : uint8_t
See Admin.
| Enumerator | Value | Meaning |
|---|---|---|
MEDIUS_REBOOT_TARGET_DEVICE_DOWNLOAD | 0 | Device chip into ROM download mode (flash over the serial link). |
MEDIUS_REBOOT_TARGET_HOST_DOWNLOAD | 1 | Host chip into ROM download mode (flash over its own USB). |
MEDIUS_REBOOT_TARGET_DEVICE_RUN | 2 | Restart the device chip and run its firmware. |
MEDIUS_REBOOT_TARGET_HOST_RUN | 3 | Restart the host chip and run its firmware. |
MediusEmitMode
What paces injected motionenum MediusEmitMode : uint8_t
See Options.
| Enumerator | Value | Meaning |
|---|---|---|
MEDIUS_EMIT_MODE_LEARNED | 0 | Pace to the mouse's learnt native report rate (the default). |
MEDIUS_EMIT_MODE_INTERVAL | 1 | Pace to the cloned mouse's declared poll rate (its bInterval). |
MEDIUS_EMIT_MODE_FIXED | 2 | Pace to a fixed rate in Hz (snapped to 1000/n, capped 1 kHz). |
MediusCatchEventKind
Which arm of a MediusCatchEvent is setenum MediusCatchEventKind : uint8_t
Tells you which member of the MediusCatchEvent union to read. See Catch.
| Enumerator | Value | Read |
|---|---|---|
MEDIUS_CATCH_EVENT_KIND_MOTION | 0 | data.motion |
MEDIUS_CATCH_EVENT_KIND_USAGES | 1 | data.usages |
MediusLogLevel
Severity tag on a log lineenum MediusLogLevel : uint8_t
The severity of a MediusLogLine. See Logs & counters.
| Enumerator | Value | Meaning |
|---|---|---|
MEDIUS_LOG_LEVEL_ERROR | 0 | A failure the box couldn't recover from. |
MEDIUS_LOG_LEVEL_WARN | 1 | Something off that the box handled. |
MEDIUS_LOG_LEVEL_INFO | 2 | Normal operational notices. |
MEDIUS_LOG_LEVEL_DEBUG | 3 | Detail for diagnosing a problem. |
MEDIUS_LOG_LEVEL_VERBOSE | 4 | The finest-grained trace output. |
MediusCatchMask
Which physical reports raise an eventtypedef uint8_t MediusCatchMask; /* OR the MEDIUS_CATCH_MASK_* bits */
The subscription you hand to medius_device_catch_events. See Catch.
| Macro | Bit | Triggers on |
|---|---|---|
MEDIUS_CATCH_MASK_MOTION | 0x01 | The mouse moved (dx/dy). |
MEDIUS_CATCH_MASK_WHEEL | 0x02 | The wheel turned. |
MEDIUS_CATCH_MASK_BUTTONS | 0x04 | A button changed. |
MEDIUS_CATCH_MASK_KEYS | 0x08 | A keyboard key changed. |
MEDIUS_CATCH_MASK_MEDIA | 0x10 | A media key changed. |
MEDIUS_CATCH_MASK_ALL | 0x1F | Every class. |
MediusKey
A HID keyboard/keypad usagetypedef uint8_t MediusKey; /* modifiers are 0xE0 to 0xE7 */
A raw HID keyboard usage passed to the key calls. Pass any usage byte, or one of the MEDIUS_KEY_* macros. The full set of usages is on Usage IDs.
| Macro group | Example | Usage |
|---|---|---|
| Letters | MEDIUS_KEY_A .. MEDIUS_KEY_Z | 4 to 29 |
| Digits | MEDIUS_KEY_1 .. MEDIUS_KEY_0 | 30 to 39 |
| Function | MEDIUS_KEY_F1 .. MEDIUS_KEY_F12 | 58 to 69 |
| Editing / nav | MEDIUS_KEY_ENTER, _ESCAPE, _TAB, _SPACE, _INSERT, _HOME, _DELETE, arrows | various |
| Modifiers | MEDIUS_KEY_LEFT_CTRL .. MEDIUS_KEY_RIGHT_GUI | 224 to 231 (0xE0 to 0xE7) |
MediusMediaKey
A 16-bit HID Consumer usagetypedef uint16_t MediusMediaKey;
A raw Consumer usage passed to the media calls. Pass any 16-bit usage, or a MEDIUS_MEDIA_* macro. The full set is on Usage IDs.
| Macro | Usage | Macro | Usage |
|---|---|---|---|
MEDIUS_MEDIA_PLAY_PAUSE | 205 | MEDIUS_MEDIA_MUTE | 226 |
MEDIUS_MEDIA_NEXT_TRACK | 181 | MEDIUS_MEDIA_VOLUME_UP | 233 |
MEDIUS_MEDIA_PREV_TRACK | 182 | MEDIUS_MEDIA_VOLUME_DOWN | 234 |
MEDIUS_MEDIA_STOP | 183 | MEDIUS_MEDIA_PLAY | 176 |
MEDIUS_MEDIA_PAUSE | 177 |
MediusFrameType
A wire frame TYPE byte (mock only)enum MediusFrameType : uint8_t /* always defined; read only by the mock recorder */
The TYPE byte of a wire frame, used with the mock recorder (medius_mock_saw / medius_mock_recorded_frame). See the mock feature.
| Enumerator | Value | Enumerator | Value |
|---|---|---|---|
MEDIUS_FRAME_TYPE_MOVE | 1 | MEDIUS_FRAME_TYPE_LOCK | 10 |
MEDIUS_FRAME_TYPE_INJECT | 3 | MEDIUS_FRAME_TYPE_CATCH | 11 |
MEDIUS_FRAME_TYPE_RESET | 4 | MEDIUS_FRAME_TYPE_MOTION_EVENT | 12 |
MEDIUS_FRAME_TYPE_QUERY | 5 | MEDIUS_FRAME_TYPE_USAGE_EVENT | 15 |
MEDIUS_FRAME_TYPE_RESP | 6 | MEDIUS_FRAME_TYPE_OPTION | 17 |
MEDIUS_FRAME_TYPE_REBOOT_DL | 7 | MEDIUS_FRAME_TYPE_CLIP_APPEND | 18 |
MEDIUS_FRAME_TYPE_LOG | 8 | MEDIUS_FRAME_TYPE_CLIP_CTRL | 19 |
MEDIUS_FRAME_TYPE_LED | 9 | MEDIUS_FRAME_TYPE_CLIP_SET | 20 |
MEDIUS_FRAME_TYPE_CLIP_TRIGGER | 21 |
Argument structs
Tagged values you build, then pass inThree small PODs you build with a helper and hand to a call. The medius_*_* constructors set the kind tag and the right field for you.
MediusUsage
A momentary usage for injectWhat medius_device_inject drives. Build with medius_usage_button(...), _key(...), or _media(...); id holds the button id or usage per kind. See Inject.
| Field | C type | Meaning |
|---|---|---|
kind | MediusClass | Which class id names. |
id | uint16_t | Button id, key usage, or media usage. |
MediusMotion
A relative axis for move_axisWhat medius_device_move_axis drives. Build with medius_motion_cursor(dx, dy) or medius_motion_wheel(delta). See Move.
| Field | C type | Meaning |
|---|---|---|
kind | MediusMotionKind | Cursor vs wheel. |
dx | int16_t | X movement (Cursor only). |
dy | int16_t | Y movement (Cursor only). |
wheel | int16_t | Scroll delta (Wheel only). |
MediusLockTarget
What a lock acts onPassed to medius_device_lock / _unlock. Build it with medius_lock_target_axis or medius_lock_target_usage; usage is read only when kind is USAGE. See Lock.
| Field | C type | Meaning |
|---|---|---|
kind | MediusLockTargetKind | X, Y, Wheel, or Usage. |
usage | MediusUsage | The button, key, or media usage, when kind == USAGE. |
Query values
PODs written through a query's out-paramEach medius_device_query_* / _caps / _counters call fills one of these by value. Canonical field docs are on Structs; query semantics on Requests.
MediusVersion
Decoded firmware version and box nameFrom medius_device_query_version. Set the box's name with medius_device_set_name.
| Field | C type | Meaning |
|---|---|---|
proto_ver | uint8_t | Wire-protocol version the firmware speaks. |
fw_major | uint8_t | Firmware major version. |
fw_minor | uint8_t | Firmware minor version. |
fw_patch | uint8_t | Firmware patch version. |
mac | uint8_t[6] | The device chip's base MAC, a stable per-box id. |
name | char[MEDIUS_MAX_NAME] | The box's human-readable name (NUL-terminated; a synthesized default when unset). |
MediusHealth
Box readiness flags (each 0 or 1)From medius_device_query_health.
| Field | C type | True (1) when |
|---|---|---|
link_up | uint8_t | The link to the host chip is up. |
mouse_attached | uint8_t | A real mouse is plugged in. |
clone_configured | uint8_t | The PC has set up the cloned mouse. |
injection_active | uint8_t | At least one injected button or move is held. |
rate_confident | uint8_t | The native-rate estimator window is full. |
lock_on | uint8_t | At least one input lock is active. |
catch_on | uint8_t | A catch subscription is streaming. |
kbd_attached | uint8_t | A keyboard is attached, cloned, and injectable. |
MediusDeviceInfo
The cloned device's USB identity, kind, and productFrom medius_device_device_info; all-zero/empty when nothing is cloned. product is a NUL-terminated UTF-8 string.
| Field | C type | Meaning |
|---|---|---|
vid | uint16_t | USB vendor id (idVendor). |
pid | uint16_t | USB product id (idProduct). |
bcd_device | uint16_t | Device release (bcdDevice). |
bcd_usb | uint16_t | USB version (bcdUSB), e.g. 0x0200. |
has_serial | uint8_t | The clone serves a serial string. |
has_bos | uint8_t | The clone serves a BOS descriptor. |
kind | MediusDeviceKind | The device's primary kind (Boot-interface protocol). |
product | char[MEDIUS_MAX_PRODUCT] | The product string (NUL-terminated; empty when none). |
MediusCaps
The whole cloned device's capabilitiesFrom medius_device_caps: a mouse half and a keyboard half plus the per-class change-driven flags. Test it with medius_caps_has_mouse, medius_caps_has_keyboard, medius_caps_is_composite.
| Field | C type | Meaning |
|---|---|---|
mouse | MediusMouseCaps | The mouse half (all-zero when no mouse is bound). |
keyboard | MediusKbdCaps | The keyboard half (all-zero when no keyboard is bound). |
mouse_change_driven | uint8_t | Always 0: mouse motion is continuous, so it has a learned cadence. |
kbd_change_driven | uint8_t | 1 when a keyboard is bound: it reports only on a key change. |
MediusMouseCaps
What the cloned mouse can doThe mouse half of MediusCaps; all-zero when no mouse interface is bound.
| Field | C type | Meaning |
|---|---|---|
n_buttons | uint8_t | Buttons the mouse report carries. |
has_x | uint8_t | The report carries an X axis. |
has_y | uint8_t | The report carries a Y axis. |
has_wheel | uint8_t | The report carries a wheel. |
has_report_id | uint8_t | The mouse report sits behind a HID report ID. |
n_hid | uint8_t | Cloned HID interfaces; >1 = composite. |
MediusKbdCaps
What the cloned keyboard can doThe keyboard half of MediusCaps; all-zero when no keyboard is bound. n_keys == 0xFF signals an NKRO bitmap.
| Field | C type | Meaning |
|---|---|---|
n_keys | uint8_t | Keycode-array slots, or 0xFF for an NKRO bitmap. |
nkro | uint8_t | The keyboard reports an NKRO bitmap. |
has_consumer | uint8_t | A Consumer collection is present (media injectable). |
has_system | uint8_t | A system-control collection is present (passthrough-only). |
has_report_id | uint8_t | The keyboard report sits behind a HID report ID. |
MediusRate
The native report rate and clone poll periodFrom medius_device_query_rate. Convert to Hz with medius_rate_native_hz(rate, &hz) (returns false when there's no continuous cadence).
| Field | C type | Meaning |
|---|---|---|
native_period_us | uint16_t | Realised native period in µs; 0 = not learned, or change-driven. |
poll_period_us | uint16_t | Cloned inject-endpoint poll period in µs. |
confident | uint8_t | The estimator window is full and the value is trustworthy. |
change_driven | uint8_t | The active input is event-driven (keyboard/media), so no continuous cadence. |
MediusStats
Box-side delivery / telemetry countersFrom medius_device_query_stats. A nonzero tx_drops or tx_wedges means delivery degraded under load.
| Field | C type | Meaning |
|---|---|---|
inject_emits | uint32_t | Pure-injection reports emitted. |
tx_drops | uint16_t | Reports dropped on TX-queue overflow (should stay 0). |
tx_merges | uint16_t | Backed-up reports merged instead of queued. |
tx_maxdepth | uint8_t | Deepest the TX queue has reached. |
tx_wedges | uint8_t | Wedged-endpoint recoveries. |
wakeups | uint16_t | Remote-wakeups issued. |
reset_count | uint16_t | USB bus resets seen. |
config_count | uint16_t | SET_CONFIGURATION events (re-enumerations). |
MediusLocks & MediusLockEntry
The active locks, as an entry listFrom medius_device_query_locks: entries[0..n], one per locked target. Test a target/direction with medius_locks_is_locked(&locks, target, dir), which reports a match from a specific entry or a covering whole-class is_blanket lock. Wire layout on the native LOCKS reply.
| Field | C type | Meaning |
|---|---|---|
n | uint16_t | Live entries in entries. |
entries | MediusLockEntry[MEDIUS_MAX_LOCKS] | One per locked axis or usage. |
| Field | C type | Meaning |
|---|---|---|
target | MediusLockTarget | The locked axis or usage. |
is_blanket | bool | The lock covers a whole class; target.usage.kind names it and target.usage.id is unused. |
positive | bool | The positive edge (axis +, or press) is locked. |
negative | bool | The negative edge (axis -, or release) is locked. |
MediusCatchState
The active catch subscriptionFrom medius_device_query_catch. A nonzero dropped means the box shed events under back-pressure.
| Field | C type | Meaning |
|---|---|---|
mask | uint8_t | Subscribed classes (the MEDIUS_CATCH_MASK_* bits); 0 = none. |
dropped | uint32_t | Box-side events dropped under back-pressure. |
MediusImperfectStatus
The imperfect-clone state (each 0 or 1)From medius_device_query_imperfect. See Options.
| Field | C type | True (1) when |
|---|---|---|
allowed | uint8_t | The opt-in toggle; cloning an over-capacity device is allowed. |
over_capacity | uint8_t | The device needs an interrupt-IN endpoint the box can't service. |
clone_imperfect | uint8_t | The live clone is over-capacity and was cloned anyway, so one interface is dead. |
MediusEmitPaceStatus
The emit-rate pacing stateFrom medius_device_query_emit_pace. See Options.
| Field | C type | Meaning |
|---|---|---|
mode | MediusEmitMode | The selected mode. |
fixed_hz | uint16_t | The rate requested for FIXED (0 otherwise). |
resolved_hz | uint16_t | The ceiling in effect; 0 = learnt/adaptive, or no device yet in INTERVAL. |
MediusCountersSnapshot
Host-side always-on link countersFrom medius_device_counters. See Logs & counters.
| Field | C type | Meaning |
|---|---|---|
frames_tx | uint64_t | Frames sent to the box. |
frames_rx | uint64_t | Frames received from the box. |
crc_drops | uint64_t | Inbound frames dropped on a bad checksum. |
reconnects | uint64_t | Times the library reopened the port. |
MediusPortInfo
A discovered medius serial portFilled by medius_find_ports; path and serial are NUL-terminated. Canonical docs on PortInfo.
| Field | C type | Meaning |
|---|---|---|
path | char[MEDIUS_MAX_PATH] | Serial port path (NUL-terminated). |
vid | uint16_t | USB vendor id (0x1A86). |
pid | uint16_t | USB product id (0x55D3). |
serial | char[MEDIUS_MAX_SERIAL] | The CH343 adapter's serial (NUL-terminated); empty when has_serial == 0. |
has_serial | uint8_t | Whether the adapter serves a serial string. |
MediusBoxInfo
One discovered box: port, version, and cloned deviceFilled by medius_list: one entry per connected box, each opened and handshaked in turn. See BoxInfo.
| Field | C type | Meaning |
|---|---|---|
port | MediusPortInfo | The box's control port (path + CH343 serial). |
version | MediusVersion | Its firmware version, with the box MAC and name. |
device | MediusDeviceInfo | The device it clones. |
Event & log types
Fixed-size PODs off the streamsThe values you read off the catch and log streams. Catch semantics on Catch; canonical docs on Structs.
MediusMotionEvent
One physical relative-axis snapshotThe user's real motion at the merge point, before any lock suppression or injection. Surfaces as the Motion arm of a MediusCatchEvent.
| Field | C type | Meaning |
|---|---|---|
dx | int16_t | Relative X this report (right positive). |
dy | int16_t | Relative Y this report (down positive). |
dz | int16_t | Wheel delta this report (up positive). |
MediusUsageEvent
One held-usage snapshot for a classThe held usages of one class (button, key, or media; modifiers are key usages 0xE0 to 0xE7) in usages[0..n], buttons and keys the same shape. Test one with medius_usage_event_is_held(&event, usage), or diff successive snapshots for edges.
| Field | C type | Meaning |
|---|---|---|
n | uint16_t | Live usages in usages. |
usages | MediusUsage[MEDIUS_MAX_USAGES] | The held MediusUsage usages (button, key, or media). |
MediusCatchEvent
One catch-stream event (a tagged union)struct MediusCatchEvent {
MediusCatchEventKind kind;
union MediusCatchEventData { MediusMotionEvent motion; MediusUsageEvent usages; } data;
}Written by medius_event_stream_recv and friends. Read the union member named by kind.
| Field | C type | Meaning |
|---|---|---|
kind | MediusCatchEventKind | Which union member is live. |
data.motion | MediusMotionEvent | Read when kind == MOTION. |
data.usages | MediusUsageEvent | Read when kind == USAGES. |
MediusLogLine
One device log lineWritten by medius_log_stream_recv; text is NUL-terminated.
| Field | C type | Meaning |
|---|---|---|
level | MediusLogLevel | Severity tag. |
text | char[MEDIUS_MAX_LOG_TEXT] | The decoded message (NUL-terminated). |
MediusClipTrigger
One physical-input binding that drives the clipA managed binding you add with medius_clip_bind: when on hits edge, the box runs action on the clip. Build the on usage with the medius_usage_* helpers. Concept on Clip.
| Field | C type | Meaning |
|---|---|---|
on | MediusUsage | The physical button, key, or media usage that fires the binding. |
edge | MediusEdge | Which edge of on fires it. |
action | MediusClipAction | What it does to the clip. |
consume | uint8_t | 1 to swallow the input so the game never sees it; 0 to let it pass through. |
MediusClipSettings
The clip configuration read back from the boxFrom medius_clip_query_config: the auto-lock scope, the loop/retain/finalize scalars, and the live trigger set. Concept on Clip.
| Field | C type | Meaning |
|---|---|---|
autolock_bits | uint8_t | The auto-lock scope as CLIP_LOCK_* wire bits (set with medius_clip_set_autolock). |
loop_ | uint8_t | Playback loops at the clip end (retained mode only). |
retain | uint8_t | The loaded clip is retained so it can rewind and replay (0 = streaming). |
finalized | uint8_t | A retained clip's end is fixed, so it can replay and loop. |
triggers | MediusClipTrigger[MEDIUS_CLIP_TRIG_MAX] | The bound triggers, triggers[0..n]. |
n | uint8_t | Live entries in triggers. |
MediusClipStatus & MediusClipState
Buffered-clip ring and playback stateFrom medius_clip_query_status; state is a MediusClipState. Concept on Clip.
| Enumerator | Value | Meaning |
|---|---|---|
MEDIUS_CLIP_STATE_IDLE | 0 | No clip playing (empty, or a loaded clip parked at its start). |
MEDIUS_CLIP_STATE_PLAYING | 1 | Draining the ring, one entry per native frame. |
MEDIUS_CLIP_STATE_PAUSED | 2 | Halted mid-clip; the cursor and any held usages are retained. |
MEDIUS_CLIP_STATE_FAULTED | 3 | An append was dropped or the ring overflowed; recover with medius_clip_clear. |
| Field | C type | Meaning |
|---|---|---|
state | MediusClipState | The lifecycle state. |
free | uint32_t | Ring bytes free; pace top-ups off this. |
total | uint32_t | The retained clip size in bytes; streaming, the buffered-but-undrained bytes. |
played | uint32_t | Bytes played from the clip start (retained progress; ~0 while streaming). |
ticks | uint32_t | Content frames drained since the last start (gap runs are not counted). |
underruns | uint16_t | Empty-ring episodes. |
overruns | uint16_t | Appends dropped because the ring was full. |
seq_gaps | uint16_t | Dropped append frames detected. |
held_n | uint16_t | Held usages in held. |
held | MediusUsage[MEDIUS_MAX_USAGES] | The buttons, keys, and media the clip is holding down; test one with medius_clip_status_is_held. |
Errors
MediusStatus plus a thread-local messageenum MediusStatus : int32_t /* MEDIUS_STATUS_OK == 0; everything else is a failure */
Every fallible call returns a MediusStatus and writes its result through an out-param. On failure the detail lives in thread-local state. Read it before the next call on that thread overwrites it. Canonical mapping on Errors.
| Enumerator | Value | Meaning |
|---|---|---|
MEDIUS_STATUS_OK | 0 | Success. |
MEDIUS_STATUS_ERR_IO | 1 | An underlying serial or OS error. |
MEDIUS_STATUS_ERR_NOT_FOUND | 2 | No device matched the expected VID/PID. |
MEDIUS_STATUS_ERR_NO_REPLY | 3 | The box never answered the version query during the handshake. |
MEDIUS_STATUS_ERR_BAD_PROTO_VER | 4 | The box answered with an unexpected proto_ver (see medius_last_error_proto_ver). |
MEDIUS_STATUS_ERR_QUERY_TIMEOUT | 5 | A query waited past its timeout with no reply. |
MEDIUS_STATUS_ERR_DISCONNECTED | 6 | The link dropped (also returned by a stream when it closes). |
MEDIUS_STATUS_ERR_FRAME_TOO_LONG | 7 | An outbound frame exceeded the wire limit. |
MEDIUS_STATUS_ERR_FLASH_TOOL | 8 | The flash subprocess (esptool) failed. |
MEDIUS_STATUS_ERR_INVALID_ARG | 9 | A bad argument (e.g. a null required pointer). |
MEDIUS_STATUS_ERR_PANIC | 10 | A Rust panic was caught at the boundary. |
MEDIUS_STATUS_ERR_UNKNOWN | 11 | An unclassified failure. |
| Function | Returns | Meaning |
|---|---|---|
medius_last_error_message(char *buf, uintptr_t cap) | uintptr_t | Copies the last error's text (NUL-terminated, truncated to cap); returns the full length, so you can size a buffer and retry. |
medius_last_error_proto_ver(void) | uint8_t | The version byte from a BAD_PROTO_VER error, or 0. |
MediusDevice *dev = NULL;
if (medius_device_find(&dev) != MEDIUS_STATUS_OK) {
char buf[256];
medius_last_error_message(buf, sizeof buf);
fprintf(stderr, "open failed: %s\n", buf);
return 1;
}