Skip to content

Dev - #952

Merged
qdot merged 74 commits into
masterfrom
dev
Sep 19, 2026
Merged

Dev#952
qdot merged 74 commits into
masterfrom
dev

Conversation

@qdot

@qdot qdot commented Sep 19, 2026

Copy link
Copy Markdown
Member

No description provided.

TapGhoul and others added 30 commits August 10, 2026 10:30
Bumps [postcss](https://github.com/postcss/postcss) from 8.5.15 to 8.5.25.
- [Release notes](https://github.com/postcss/postcss/releases)
- [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md)
- [Commits](postcss/postcss@8.5.15...8.5.25)

---
updated-dependencies:
- dependency-name: postcss
  dependency-version: 8.5.25
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
* Adorime Anal Vibrator 2
* Galaku F1
Added:
* JoyHub Prax
* JoyHub Poptint
* JoyHub Tauros

Altered:
* JoyHub Mowgli II (rotate to oscillate)
* JoyHub Marino (fix constrict index)
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
F1S V3 hardware lacks the f1sv2 protocol's rx (00000a04) characteristic,
so initialization failed with 'Characteristic rx not found'. V3 devices
use the Harmony BLE layout (service 0xFFF0, command 0xFFF1, tx 0xFFF2,
auth 0x0A11), which the lelo-harmony protocol already implements: its
initializer runs the same authorization handshake on the whitelist
endpoint and its vibrate command writes identical bytes to tx.

The F1SV3 device definition moves to lelo-harmony, keeping its existing
definition id so device-level user configuration references remain
stable. Device config bumped to 5.42.

Fixes #920
Bumps [nanoid](https://github.com/ai/nanoid) from 3.3.12 to 3.3.18.
- [Release notes](https://github.com/ai/nanoid/releases)
- [Changelog](https://github.com/ai/nanoid/blob/3.3.18/CHANGELOG.md)
- [Commits](ai/nanoid@3.3.12...3.3.18)

---
updated-dependencies:
- dependency-name: nanoid
  dependency-version: 3.3.18
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
`readValue()` resolves to a DataView. `Uint8Array::new(&data_view)`
treats it as a plain array-like (length undefined) and yields an empty
array, so the subsequent `copy_to` length assertion panics and kills
the wasm instance. Any protocol that performs a hardware read during
init (e.g. sensee-v2) dies right after chooser pairing.

Build the Uint8Array over the DataView's underlying buffer instead,
honoring its byte offset/length — the Subscribe notification handler
already uses the buffer-based pattern.

Verified against a physical Sensee Capsule (CCPA10S2) via Chrome/macOS:
the device identifies and runs through the browser embedded server.

Fixes #941

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QitzJcyNqb1CHnMJ8rcZP1
- SocketBindError now wraps a SocketAddr

- ButtplugWebsocketServerTransport now wraps a SocketAddr

- ButtplugWebsocketServerTransportBuilder now takes a SocketAddr

- intiface_engine sprouts a new CLI option and either passes in or computes the
  right string for EngineOptions and later parses that to hand to the
  ButtplugWebsocketServerTransportBuilder.
…dress

The listen address changes in 54b2a9c replaced the builder's port()
with listen_address() and folded the port into SocketBindError's
SocketAddr. Update the bind-in-use test to construct a SocketAddr,
match the new error shape, and assert on the full address.
The web-sys WebBluetooth bindings are gated behind the
web_sys_unstable_apis cfg, which .cargo/config.toml only sets for
wasm32-unknown-unknown rustflags, so this crate cannot compile for
native targets. Gate the modules and re-exports behind
cfg(target_arch = "wasm32") and move the wasm-only dependencies
into a wasm32 target dependency table so native workspace builds no
longer break on this crate and never unify its wasm-flavored
buttplug_core/buttplug_server feature requests, which would make
native server code call wasm-bindgen imports and panic at runtime.
* Sexverse Aether
* Sexverse Sirius

Also fixing the sexverse-v5 yml
…fier

Adds the SdlGamepadSpecifier enum variant, schema component, protocol YAML
(two 0-65535 vibrate features, low/high motors), and the regenerated device
config (v5.43). Structural inspiration: chiefautism's abandoned PR #860.
qdot added 26 commits September 17, 2026 17:13
The SDL3 gamepad hardware manager builds SDL from source via cmake
(build-from-source-static). SDL's configure step hard-fails when neither
X11 nor Wayland development libraries are present, which broke the
ubuntu build job. Install the X11 and Wayland dev package set (plus ALSA
headers) so SDL configures with both desktop backends available.
The SDL gamepad hardware manager only uses the gamepad (joystick/hidapi)
and rumble (haptic) surfaces of SDL, but was building SDL with every
subsystem autodetected. On Linux that made the cmake configure step
hard-require X11 or Wayland dev libraries, and soft-warn about ALSA,
neither of which a headless gamepad service needs.

Prune the SDL build to gamepad-only via sdl3-sys features: audio, video
(with its gpu/render/camera dependents), dialog, and tray are compiled
out; joystick, haptic, hidapi, power, and sensor stay on. Enable
sdl-unix-console-build so SDL's unix configure no longer demands X11 or
Wayland when video is disabled. SDL now configures and links with no
display or audio stack present, so CI needs no extra apt packages
(revert the previous apt additions).

Verified locally on macOS: cmake cache shows AUDIO/VIDEO/DIALOG/TRAY off
and JOYSTICK/HAPTIC/HIDAPI on; the sdl3_thread_spike example passes,
including enumeration and rumble-capability queries of a real DualSense
controller.
Development-time diagnostic for validating headless SDL init and
gamepad enumeration on a dedicated thread; the production factory and
CI coverage make it redundant. Drop the example target, its CI step,
and the README reference.
A command's reply can arrive before the loop-top pass that follows it,
so asserting driver state right after a single scan races the loop
thread. The existing barrier() helper (two commands) guarantees the
intervening pass has run; three rumble-refresh and disconnect tests
asserted after a single scan instead and failed on windows CI, which
was the first runner to lose that race.

Update the deadline re-arm, disconnect-stops-rumble, and
connected-removal cases to barrier probes.
The comm manager re-emitted DeviceFound for every visible gamepad on
every timed-retry tick, so connected pads logged a found line each
second. Scan results now carry the pad's open state (computed on the
SDL thread from the open pad table) and the manager skips open pads
with a debug log, while continuing to re-offer unopened pads so the
server can retry failed connects.
Bump sdl3 to 0.20.0 and sdl3-sys to 0.7.1 (feature set unchanged: the
0.6.8 and 0.7.1 feature lists are identical). JoystickId became a proper
newtype with a private field in 0.20.0, so raw instance-id accesses move
from tuple field `.0` to the new `.raw()` accessor; no behavioral change.

Runtime (keepalive/dither/hardware) revalidation on SDL 3.4.16 is
pending and recorded as such in the README. Picks up upstream joystick
fixes including Joy-Con partial-user-calibration handling (SDL issue
8085 class).
Add a BatteryLevel command to the SDL thread protocol, mirroring
SetRumbleState: id + generation guards (stale or removed handles get
SdlTaskError::Removed), with the percent sourced from the opened pad's
DriverGamepad::battery_percent. The production override maps
Gamepad::power_info via power_info_to_percent (Charged=100, battery
states clamp 0-100, wired/unknown/error states report distinct errors).

A failed battery read is a reporting error, not device loss: the pad is
never evicted (follow-up rumble still works). Plumbing runs through
SdlTaskHandle/SdlOpenedGamepadHandle and the async SdlOpenedGamepad
seam; fakes implement the new surface with a configurable battery
result map.

Tests: power-level/percentage policy table, command round trip, default
unsupported error, stale-generation rejection, and error-does-not-evict.
SDL hardware now advertises Endpoint::Rx alongside Tx and serves
read_value on it: the read awaits the opened gamepad's battery_level
through the SDL thread, maps task errors via hardware_error, and returns
a one-byte percent HardwareReading. Reads on any other endpoint stay
UnhandledCommand errors. The test mock's battery became configurable.

The sdl-gamepad protocol handler gains handle_battery_level_cmd: it
issues a one-byte HardwareReadCmd on rx and wraps the returned byte as
InputTypeReading::Battery in an InputReadingV4, mirroring the peer
battery protocols (kiiroo-powershot shape).

Tests: rx read round trip + error mapping, non-rx rejection, endpoint
list, and protocol wrapping with a fake readable hardware internal.
…on coverage

Add a shared battery input feature (0-100, Read) to all three
sdl-gamepad definitions at indices 2/4/2, so capability does not vary
by layout; device config regenerates to v5.55. Saved user configs for
sdl-gamepad devices are feature-count invalidated and rebuild from base
(the disabled-channel test fixture gains the battery stub, matching how
input features appear in user configs).

The SDL test device now exposes rx alongside tx, mirroring production.
New test_sdl_gamepad_battery.yaml covers the full client -> server ->
protocol -> hardware-read path with a canned 57% response on rx,
version-gated to v2+ and registered for v2/v3/v4 (embedded + json);
advertised-definition tests assert the battery feature index and
unchanged vibrate features in every layout.

Fix a pre-existing v2 reply conversion bug this coverage exposed:
battery replies to v2 clients now convert directly from the v4 input
reading (the v4->v3->v2 route required a v3 SensorReadCmd request
context a v2 client never sends, so the reply was dropped and the
request hung). Lovense v2 battery tests passed only because their
read runs in an un-awaited spawned task.
@CLAassistant

CLAassistant commented Sep 19, 2026

Copy link
Copy Markdown

CLA assistant check
Thank you for your submission! We really appreciate it. Like many open source projects, we ask that you all sign our Contributor License Agreement before we can accept your contribution.
6 out of 7 committers have signed the CLA.

✅ blackspherefollower
✅ TapGhoul
✅ wwwfeng
✅ lampanlampe
✅ nwf
✅ qdot
❌ dependabot[bot]
You have signed the CLA already but the status is still pending? Let us recheck it.

@qdot
qdot merged commit 911c627 into master Sep 19, 2026
4 of 5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants