Skip to content

Releases: artzox/DS5Dongle-Studio

Dongle+AutoHapticsMax v.1.35.2

Choose a tag to compare

@artzox artzox released this 27 Aug 12:54
93fcb05

Added

  • Staged battery notification on the controller's lightbar. Three stages, each with its own battery level, blink count and colour — e.g. 5 amber blinks at 50%, 10 red at 10%, or whatever suits you. A stage fires once when the battery falls past its level and then stops. It is a prompt to go and plug in, not an indicator that flashes until you do.

LED notification is a pulse, not a bl -brightness fades up and back down over about 1.6 seconds rather than switching hard on and off — the same gentle breath DS4Windows uses for its low-battery indicator.

A stage re-arms when the battery climbs back above its level or the controller goes on charge, so a reading hovering on a boundary cannot re-announce itself.

The per-stage tick is stored separately from the level, so turning a stage off keeps the level and colour you set for when you turn it back on.

10% steps only. That is the resolution the DualSense reports its own charge at; a value in between is not something the controller can tell us

This is additive to the Pico LED indicator, which is unchanged and still blinks continuously below 10%. The two suit different distances — the Pico LED when the dongle is on the desk in front of you, the lightbar from across the room — and most people will want one or the other rather than both.

Dongle+AutoHapticsMax v.1.34.0

Choose a tag to compare

@artzox artzox released this 27 Aug 08:26
0ac5178

Added

  • Double tap — a macro row can fire on two presses of its trigger within 250 ms, adapted from upstream's button-shortcut work. Tick double tap on a button row; it is not offered on hold rows (driven by the held set) or long presses (resolved by duration), and the portal clears the others if you tick it.

It costs nothing in terms of latency unless you use it. A single tap can only be resolved late if a double-tap row exists on the same trigger — until the window closes there is no way to know which was meant. So the wait is applied only to a trigger that has both: every other row still fires the instant the button goes down, and a table with no double-tap rows behaves exactly as it did before. A double-tap row on a different trigger does not slow this one down either.

A double-tap row can output a controller or mouse button as well as keys. Those outputs are a state in the report the game reads rather than a keyboard sequence, so a one-shot now presses the button for 80 ms and releases it.

Selecting a controller output still switches hold while held on, since a remap almost always wants it — but no longer when double tap is already ticked, which would have cleared the choice just made.

Fixed

  • A held key was dropped for two reports whenever a hold macro was pressed. This resulted in not being able to have WASD on L stick and dodge action on gamepad button and executing a directional dodge. Now fixed.

  • Unticking a macro with "centre stick always" left the stick centred and un-useable until a reconnect. Now fixed, you can disable a macro even if you don't untick the "center stick always" before that.

Dongle+AutoHapticsMax v.1.33.0

Choose a tag to compare

@artzox artzox released this 26 Aug 18:42
af8585c

Added

  • Centre stick always — a new option on a stick macro row, beside hide input from game. With hide alone the stick is only centred for the game while a direction is past the threshold, so at rest the stick's own jitter still reaches the game as a stream of small, constantly changing axis values. A game's dead zone stops that from moving the character, but prompt detection usually reads raw deltas before the dead zone — so the on-screen button prompts flip back to controller glyphs while the macro's keys say keyboard, over and over. Nothing in the game's settings can fix it; the values have to stop leaving the dongle. Turn this on and the stick is centred for as long as the row is enabled.

It is opt-in, and rows saved before this release are unchanged. The old behaviour is a legitimate hybrid because using the threshold allows you both have an analog stick and execute a a key.

  • Live test panel on the Macros tab. The portal reads the same interface the game does, so it can show the report after the firmware has rewritten it: buttons, sticks, triggers, touchpad and the Edge Fn buttons and paddles, with the observed report rate. Alongside it, the macro engine's own view of what it is hiding and injecting this tick — moved here from the Device tab, where it sat one tab away from the rows it describes. Together they separate "the rule never fired" from "the rewrite never reached the report".

The stick threshold is drawn as a ring, the two-stage boundary as a line on the trigger bar, and the touchpad's neutral band is shaded with the last press's landing point marked — the position that decides which half fires.

Fixed

  • tools/t2-tests had not compiled since 1.32.8, when the rewrite gate began calling macro_report_active() that the harness does not stub. It reported nothing from then on. Both missing stubs added; the suite passes again.

Dongle+AutoHapticsMax v.1.32.11

Choose a tag to compare

@artzox artzox released this 26 Aug 07:31
4c39791

Added

  • Live macro output readout in the Device tab diagnostics: which buttons the macro engine is hiding and injecting at this instant. Hold the button that refuses to hide and read it - if the button is not listed as hidden, the rule never fired; if it IS listed and the game still sees the press, the report is being rewritten and something downstream is re-adding it. That splits a "hiding does not work" report into two very different faults instead of guessing which one it is.

Fixed

  • L3 and R3 hiding when remapped now works correctly; reason why it didn't explained in full changelog.

Dongle+AutoHapticsMax v.1.32.7

Choose a tag to compare

@artzox artzox released this 25 Aug 21:37
7ad9127

Added

  • Gyro natural sensitivity (real-world scale) with separate vertical multiplier. Gyro-to-mouse aiming can now be expressed as a ratio rather than an arbitrary slider: at 10x multiplier equals 1:1 mouse rotation; rotating the controller 10 degrees turns the in-game view 10 degrees. Set it once and it holds in every game sharing the same mouse counts per 360, instead of being re-tuned per game.
  • Old arbitrary setting stays and is renamed to manual
  • A degrees-rotated diagnostic is exposed so the 1:1 claim can be checked on hardware rather than trusted: rotate 360 degrees angle and compare.
  • Gyro scale trim (50-1000, default 100): corrects the sensor's assumed scale so 1.0x is genuinely 1:1 rather than nominally. The angle check reports the value to enter.
  • Linearity check for setting accurately Mouse counts per 360°. Use both 6500 and half - 3250 measurement to set correctly. Disable mouse acceleration before measurement.

Thanks to @LisatheRisa for the suggestion.

Dongle+AutoHapticsMax v.1.31.1

Choose a tag to compare

@artzox artzox released this 24 Aug 11:21
83b4a7e

Added

  • Seven more macro output buttons: Create, Options, Touchpad click ( no L or R) and the four D-pad directions added to output picker to improve remapping capabilities.

  • Stick to Mouse. Drive the mouse pointer from the right or left stick, the way gyro aiming already can. Both feed the same accumulator, so the stick can do the large turns while the gyro does the fine aim - the usual reason to want this. The chosen stick is centred in the report the game sees, so the game does not also turn from it. This allows games which block Rstick use, e.g. Dishonored 2 to use mouse for Rstick and Mouse-Gyro at the same time.

Fixed

  • L and R touchpad click registration improved.

Dongle+AutoHapticsMax v.1.29.3

Choose a tag to compare

@artzox artzox released this 24 Aug 07:45
d6116fa

[1.29.3] — 2026-08-02

Fixed

  • Regression that every slot activation re-enumerated the device, fixed so the device only reconnects when something really changed, which needs to be enumerated.

  • Macros and slots came back blank after a reconnect. When an activation did legitimately re-enumerate, the portal kept the macro table it had read from the handle that just disappeared, so the panels rendered stale state until the portal was reopened. The caches are dropped before reacquiring and the macro table is re-read on the new handle.

  • "Hide input from game" now works for the Edge buttons and pad-click halves.

Note

Saving the FIRST macro (or removing the last one) changes which HID interfaces the device exposes, so it re-enumerates by design. Windows and Sony's app briefly see the controller disappear and return with a different shape; the app in particular may need to be restarted, or another profile loaded, before it lists the controller again. Adding further macros after the first does not re-enumerate.

Dongle+AutoHapticsMax v.1.29.1

Choose a tag to compare

@artzox artzox released this 23 Aug 22:10
7a37988

Added

  • DualSense Edge Fn buttons and paddles can now be used as macro inputs and for remapping. (also added to the picker)

Fn + D-pad is the combination worth using. Sony's app claims Fn + a face button for switching the controller's on-board profiles, so chords built there compete with it, while Fn + a D-pad direction is unclaimed.
A paddle with an assignment in the Sony app still sends that assignment: the controller applies its own mapping, so use the Default (profile, which has no assignments for any mapping)

  • The touchpad click can now be used for macros and mapping (also added to the picker);

It can distinguish left from right press.

Dongle+AutoHapticsMax v.1.28.4

Choose a tag to compare

@artzox artzox released this 22 Aug 09:27
f43ba97

[1.28.4] — 2026-08-22
Reflash both boards. Config version stays at 19 and no flash_nuke is needed.

Supersedes the 1.27.x and 1.28.0-1.28.3 development builds, which were not released.

Added

  • Browser audio bridge (test mode). Feeds PC audio to the dongle from the portal itself, so auto-haptics can be tried without installing Python. Nothing is uploaded — the audio is routed inside the browser and out to the dongle, and the screen share is only how Chrome exposes system audio.

Not a replacement for ds5audio.py. The share dialog cannot be automated, so it cannot start with a game; the feed is stereo, so --map rear, the ch2/3 DSP source and native passthrough on ch2/3 stay script-only; and it needs Chrome (chromium-based browser) on Windows.

Requires the hosted portal. A locally saved copy has no persistent origin, so the browser forgets the audio permission immediately and never lists any output device.
Share the entire screen and tick Share system audio — it is off by default, and the capture is silent without it.
A live signal readout polls the dongle's own level, so it shows what actually arrived rather than what the browser sent.

  • Separate vertical gyro sensitivity. Leave it at 0 and both axes use the existing "Sensitivity" setting. A lower value is the usual choice: a game's vertical aiming range is far smaller than its horizontal one.

Fixed

  • Profile slots could show as empty after a re-enumeration. Reacquiring the device took the first handle it found without checking it worked. The browser can hand back the pre-reconnect object, which reports itself as open while every read silently returns nothing — so the slot sweep saw empty slots and drew an empty list. The handle is now proven with a read before it is adopted.
    The reconnect used by every profile switch went off the USB bus for only 150 ms, against a host port debounce of about 100 ms. The identity-change path has used 250 ms since v1.18.12 for exactly this reason; both now match. A missed disconnect leaves the host on the old descriptor, so a setting that adds or removes an interface appears not to take effect.

  • The configuration could not grow past one flash page. Previously only the 256 bytes were ever programmed, so Config_body was capped far below what the storage allows.

Known

  • Switching slots while the browser audio bridge is running can produce a feedback howl. Set the profile first, then start the bridge.\

Stop sharing, change slot and then re-share.

Dongle+AutoHapticsMax v.1.26.3

Choose a tag to compare

@artzox artzox released this 21 Aug 09:32
54dd501

Reflash both boards. Config version stays at 19 and no flash_nuke is needed. Existing macros are migrated in place on first boot.

Supersedes the 1.24.3–1.26.0 development builds, which were not released.

Added

  • Remapping. A macro row can now replace an input rather than only adding a keystroke to it.

"hold while held" keeps the output asserted for as long as the input is held, instead of firing once. Without it a remap taps its target on release.

"hide input from game" removes the original input from the report, so the game sees only the replacement.

  • Controller buttons as an output — any face, shoulder, stick or trigger button. More reliable in-game than a keystroke: a game that sees a DualSense is in controller mode, and many ignore the keyboard entirely or flip every on-screen prompt when one arrives.

  • Mouse as an output — left, right and middle click, scroll up and scroll down. Clicks are held while the input is held so click-and-drag works; scroll sends one tick per press. Choosing a mouse output makes the dongle present a mouse, so the controller re-enumerates — but only on save, never while a macro is being edited.

  • Sticks as an input. One row drives four outputs, one per direction. Diagonals press both, and each axis has its own threshold with hysteresis so a stick resting on the edge does not chatter.

  • Trigger-to-trigger remaps stay analog. L2 → R2 carries the travel across rather than collapsing a variable throttle into an on/off switch. Any other input driving a trigger is a full press, since there is no travel to copy.

Record and Pick in the Macro section work the same way for every output kind. Choosing keyboard, controller or mouse decides what they capture;

Selecting a controller or mouse output turns "hold while held" on, since that is what a remap almost always means. The checkbox stays editable — a chord that taps a button once is still a legitimate thing to build.

  • Search in the portal, covering both settings and whole panels — searching for gesture, wasd or backup now finds the feature, not just fields.

Fixed

  • Switching gyro output straight to Mouse + Flick Stick did not re-enumerate. The check tested for one specific value rather than the range that needs the mouse interface, so the interface appeared without the host being told.