Tier 1 is live: motion, touchpad, lightbar, and battery now round-trip across the LAN


If you’ve been watching the Satellite roadmap, the line item you’ve been waiting on just shipped. Tier 1 is in main across every platform target, and every input surface a modern DualSense exposes is now flowing end-to-end through the Dish protocol on the V1 platforms.

This post is the short version of what changed and why it matters.

V1 scope note. V1 ships Dish for Android (the phone client) and Satellite for Windows (the receiver). The Tier 1 wire format, capability negotiation, and receiver-side routing apply to every other platform in the table below, but Dish clients for Windows, macOS, and Linux, plus Satellite for Linux, are in active development for later releases. The code paths exist and are reflected here, but you can’t install those clients today. macOS Satellite remains a dev-only build that refuses controller injection.

The short version

Four new wire messages, all ChaCha20-Poly1305 sealed like everything else on the bus:

  • MSG_MOTION (0x000A): 3-axis gyroscope plus 3-axis accelerometer, sampled at up to 250 Hz per controller. Cemuhook DSU axis convention, so DSU-piping tools and emulators consume it unchanged.
  • MSG_BATTERY (0x000B): controller battery level (0–100) plus charge state (unknown, discharging, charging, full, wired). Cadence is one report on connect, then every 30 seconds, with out-of-cadence reports on state transitions.
  • MSG_TOUCHPAD (0x000C): two-finger touchpad with monotonic tracking IDs plus the clicky-pad button. Resolution-independent int16 coordinates so the same packet works on every backend.
  • MSG_LIGHTBAR (0x000D): 24-bit RGB lightbar control. Decoupled from rumble so games that paint the bar without vibrating get a clean signal.

Every message is capability-gated: each Dish advertises what it can capture or render via CAP_MOTION / CAP_LIGHTBAR bits in MSG_CONTROLLER_ADD, and the receiver never wastes a packet on a client that can’t use it.

What this actually unlocks

Three things that weren’t possible before this release:

Gyro aim works

If you’ve played Returnal or Splatoon-style precision shooters on a DualSense or a Switch Pro, you know how transformative gyro aim is for fine targeting. With Tier 1, that signal makes it all the way from the pad in your hand to the game on the gaming PC. Windows DS4 backends accept it on the DualShock 4 IMU surface; emulators that already speak the Cemuhook DSU protocol can re-emit it; and a future Satellite “DSU re-emitter” task (Tier 2) will turn Satellite itself into a UDP DSU server so any motion-aware tool can subscribe.

The Dish-Android case is the fun one: even if your phone doesn’t have a pad with gyro, the phone’s own IMU can stream motion. Tilt-aim from a tablet is a thing now.

The touchpad is a real input

DualSense touchpad two-finger gestures, plus the clicky-pad button as a separate input. The receiver supports three routing modes per device, hot-swappable in the web UI:

  • DS4: straight into the virtual DualShock 4 touchpad surface. Games that look for finger 0 X/Y on the DS4 hardware (the GTA V map, Returnal’s scan ping, Death Stranding’s holster, you know the list) get them.
  • Mouse: finger-0 motion drives the host cursor with a tunable sensitivity (currently 0.042 px/unit). Clicky-pad becomes mouse button 1. Useful for menu-heavy games or for tabletop UI when the controller is doing double-duty.
  • Off: the events are still cached for the web UI dashboard, but nothing is routed. Good for benchmarking.

Lightbar gets to do its job

PS5 games that paint the lightbar to mirror in-game state (Astro’s Playroom, Returnal, Cyberpunk, the GTA V HUD) now get a path to the LED in your hand. Satellite emits MSG_LIGHTBAR whenever the virtual DS4’s LED surface changes, but only to clients that advertised CAP_LIGHTBAR. Coalescing on the receiver side drops identical colors so a game holding a static color for sixty frames doesn’t re-flood the wire.

Platform support

SurfaceWindowsLinuxmacOSAndroid
Forward gyro / accel from padyes (SDL sensor)yes (SDL sensor)yes (GCMotion)n/a (no controller sensor API)
Forward phone IMU as motionn/an/an/ayes (Android SensorManager)
Forward touchpadyes (SDL touchpad)yes (SDL touchpad)yes (GCDualSense...)yes (touch overlay)
Forward lightbaryes (SDL LED)yes (SDL LED)yes (GCController.light)n/a (no LED on phone)
Forward batteryyes (SDL power level + host fallback)yes (SDL power level + /sys/class/power_supply fallback)yes (GCDeviceBattery + IOKit fallback)yes (BatteryManager)
Receive motion / touchpad on virtual padDS4 backend on capable ViGEmBusfuture uhid DualSensen/a (no virtual gamepad backend on macOS)n/a
Receive lightbar on virtual padDS4 backend on capable ViGEmBusfuture uhid DualSensen/an/a

A note on Android: there is no public Android API to drive the LED on a connected Bluetooth controller, so MSG_LIGHTBAR arrives at the phone, is decoded for the web UI’s debug telemetry, and then dropped. We made that explicit in the README rather than pretending to drive a non-existent LED.

A note on macOS: Satellite on macOS still has no signed driver equivalent of ViGEmBus, so it remains a dev-only build that refuses controller injection. Mac as a Dish client is Tier 1 in the code paths but is not part of the V1 install set. It’ll ship when the macOS client is released. The receiver-side Tier 1 features that are installable today land on Windows; the Linux receiver work continues out of band.

What this didn’t change

This release is purely additive. The 12-byte XUSB report on MSG_GAMEPAD_DATA (0x0001), the 2-second heartbeat, the X25519-seeded pair on HTTPS port 9443, the ChaCha20-Poly1305 envelope, the monotonic counter: all unchanged. If you were paired before the update, you’re still paired now.

The OTA flow (Tier 0, shipped a couple of weeks ago) means you don’t need to think about any of this. Open Satellite, hit “Check for updates”, click Install. On Linux AppImage you stay in place; on Windows you get a silent Inno Setup pass; on .deb / .rpm we surface the right apt / dnf command instead of self-installing.

What’s next

Tier 2 is in flight. The two big items:

  • DSU re-emitter: Satellite becomes a Cemuhook DSU UDP server, so every motion-aware tool you already use (Cemu, Ryujinx, BetterJoy, etc.) can subscribe to the motion stream of any paired Dish without any new integration on their side.
  • Linux DualSense uhid backend: give the Linux receiver the same full DualSense surface that Windows already has, instead of routing everything through the Xbox 360 uinput device.

After that, force feedback waveforms (beyond the strong/weak rumble pair) and pressure-sensitive adaptive triggers are the obvious next horizons. Both depend on capable backends below us, so the schedule is “when the underlying driver is ready”, not “when we get to it”.

Try it

Tier 1 is in the latest tagged Dish for Android (Google Play or the signed APK on GitHub Releases) and Satellite for Windows release. Update Satellite from the system tray or from the web UI at http://localhost:9877. It verifies the SHA-256 against the cosign-signed sum file before applying. If you already had a Dish paired, it’ll pick up the new capabilities automatically. The non-V1 platforms in the support matrix continue in active development; their Tier 1 work is in tree but not yet released.

Download Dish · How it works · Security

¿Te gusta lo que lees?

Dish y Satellite son gratuitos y de código abierto. Las donaciones permiten que siga siendo así.

Donar Descargar Dish