Skip to main content
Version: 3.5.x

v3.5.3

3.5.3 is a patch release. The headline changes are smarter auto-pairing that re-pairs when you swap one half of a paired Inverse3 + grip set, an end to false battery alerts on wired Verse Grips, honest firmware-capability checks that no longer silently drop unsupported commands, a steadier status LED on connect, and a crash-free service stop/restart. It also folds in several device and serialization fixes and a few byte-level wire notes.

Highlights

  • Auto-pairing re-pairs when you swap half of a set. When one device of an automatically paired Inverse3 + Verse Grip set is swapped out, the SDK now drops the stale pairing and re-pairs with the newly connected device. Manual pairings are left untouched.
  • No more false battery alerts on wired Verse Grips. Low- and critical-battery alerts now fire only for wirelessly-connected Verse Grips; a wired Verse Grip no longer raises a spurious low- or critical-battery warning.
  • Honest firmware-capability checks. Asking a device for a haptic feature its firmware is too old to run -- uniform or directional damping on firmware older than 7.5, return-to-home on firmware older than 7.4 -- now returns HTTP 422 with a device-protocol-unsupported event, instead of a misleading 200 that silently dropped the request.
  • Steadier status LED on connect. The Inverse3 status LED no longer flashes red on every connect or reconnect: the connection is kept alive through the roughly 5 second post-wakeup settle window, so the firmware's connection watchdog no longer trips.
  • Crash-free service stop and restart. Stopping and restarting the service no longer crashes or hangs; the shutdown and restart path was reworked to eliminate the panics and hangs seen when toggling the service on and off.

Internal improvements

  • Clutch navigation mode (experimental, off by default). A new navigation mode that lets an operator scale down or fully freeze the motion the service exports to the scene while the physical device keeps moving -- a half-speed "precise" mode for fine positioning and a full freeze for repositioning the workspace -- then folds the accumulated offset into the workspace on release so the scene cursor never jumps. Force feedback keeps flowing at every ratio. Opt-in this cycle; the default wire is unchanged.
  • Session-scoped force scaling (preview). A client can duck one simulation session's haptic output toward zero -- for example while a pie menu is open -- and hand the device to the Hub so menu haptics render through the normal control path, with automatic restore when the session closes or the menu is dismissed. Preview-gated this cycle; the default wire is unchanged.
  • Workspace zoom about a pivot (experimental). Pass a pivot point (for example the live cursor) when you update the workspace transform and the view scales around it, so the pivot's on-screen point stays put -- an immediate zoom-to-cursor. Inverse3 only; experimental this cycle, so the default wire is unchanged.
  • Upgraded the JSON serialization engine (glaze) to v7.8.4. Infrastructure only -- no public API or behavior change. One value-preserving float-text wire reformatting rides along; see Potential breaking changes below.

Fixes

  • Changing or resetting a device's mount transform no longer risks a crash. A leftover prototype code path pushed a firmware workspace-boundary box on every mount change; it has been removed.
  • Body orientation refreshes after an inkwell-dock recalibration. After re-docking and recalibrating in the inkwell, the streamed body orientation now refreshes from the device instead of reporting pre-calibration values until the next reconnect. Requires current device firmware; the wire format is unchanged.
  • Minverse always reports a blocked calibration. Minverse now emits a device-calibration-failed event whenever the firmware reports a blocked calibration -- including an oscillating-hall edge case that previously swallowed the failure silently -- so the Device Manager always shows a "Calibration failed" message.
  • Centered presets put the origin at the real reachable center of the workspace. arm_front_centered and led_front_centered (Inverse3 / Inverse3x) were aligned on the arm-joint axis, which is not centered in the reachable envelope, so set_cursor_position at the origin {0, 0, 0} landed off-center; the Minverse centered origin also sat about 10 mm too far right. Each offset is now half the reachable range on each axis, measured with the firmware safety-spring limit zones excluded rather than the mechanically-possible range. (See the origin-shift note under Potential breaking changes.)

Potential breaking changes

  • POST/DELETE /config/filters/damping on firmware older than 7.5 now returns HTTP 422 with a device-protocol-unsupported event, instead of a 200 that silently dropped the write. Firmware 7.5 and newer is unaffected (still 200). Migration: upgrade device firmware to 7.5 or newer, or handle the 422.
  • POST/DELETE /home_return on firmware that lacks the command (older than 7.4) now returns HTTP 422 instead of an unconditional 200. Only old-firmware devices are affected. Migration: upgrade firmware to 7.4 or newer, or handle the 422.
  • Command echoes on config/mount and state/transform (GET/POST/PATCH/DELETE) now serialize transform.rotation in {w,x,y,z} key order instead of {x,y,z,w}, matching the streaming state snapshot's rotation order. Byte-level only -- same values and same key names, only the key order changes; all three components are still echoed. Name-keyed JSON clients need no action; strict byte/order comparisons should re-bless.
  • Change-notification scope names for single-device config applies. The session-updated change-notification event now reports config-scope names (config.mount, config.basis, config.preset) instead of the bare names (mount, basis, preset) when a single device's configuration is applied. Clients that filter these event scope strings must update their matching.
  • Glaze float-text reformatting across all numeric wire values, v3.0 and v3.1 (for example 1.0E-7 -> 1E-7, 16777216 -> 1.6777216E7, -1.0E-37 -> -1E-37). Byte-level only -- numeric parsers read identical values; only the text form changed. String-equality consumers should re-bless their fixtures.
  • Centered-preset origin shift. Because the centered presets now target the real reachable center, the origin they install moves relative to 3.5.2: arm_front_centered / led_front_centered shift 25 mm along the device depth axis, the Minverse centered preset shifts 10 mm in X, 20 mm in Y and 20 mm in Z, and minverse_zup shifts 20 mm in X and 30 mm in Y. This is a default-on surface, and minverse_zup is applied automatically for detected Freeform sessions. Blast radius: content placed at the origin, or geometry positioned relative to it, while a centered preset is active -- it moves with the origin. Migration: re-check origin-anchored geometry, or write the previous offset explicitly as a custom mount transform. The non-centered presets (device_defaults, arm_front, led_front) are identity and unaffected.

Deprecations

  • Legacy values input on the inverse3 control commands is now a warned deprecation. Sending the values array to set_cursor_force, set_cursor_position, set_angular_position, or set_angular_torques instead of the command's named field (vector / position / angles / torques) still works, but it now raises a command-deprecated event (rate-limited to one per 30 seconds per command) instead of being accepted silently. Migrate values to the named field; the legacy input is scheduled for removal in 4.0.
  • Otherwise none affecting the public wire this cycle.