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-unsupportedevent, 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-failedevent 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_centeredandled_front_centered(Inverse3 / Inverse3x) were aligned on the arm-joint axis, which is not centered in the reachable envelope, soset_cursor_positionat 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/dampingon firmware older than 7.5 now returns HTTP 422 with adevice-protocol-unsupportedevent, 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_returnon 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/mountandstate/transform(GET/POST/PATCH/DELETE) now serializetransform.rotationin{w,x,y,z}key order instead of{x,y,z,w}, matching the streamingstatesnapshot'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_centeredshift 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, andminverse_zupshifts 20 mm in X and 30 mm in Y. This is a default-on surface, andminverse_zupis 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
valuesinput on the inverse3 control commands is now a warned deprecation. Sending thevaluesarray toset_cursor_force,set_cursor_position,set_angular_position, orset_angular_torquesinstead of the command's named field (vector/position/angles/torques) still works, but it now raises acommand-deprecatedevent (rate-limited to one per 30 seconds per command) instead of being accepted silently. Migratevaluesto the named field; the legacy input is scheduled for removal in 4.0. - Otherwise none affecting the public wire this cycle.