Skip to content

feat: add native PowerStation fan controls - #550

Open
sknowledge1 wants to merge 1 commit into
ShadowBlip:mainfrom
sknowledge1:feat/powerstation-fan-controls
Open

sknowledge1 wants to merge 1 commit into
ShadowBlip:mainfrom
sknowledge1:feat/powerstation-fan-controls

Conversation

@sknowledge1

@sknowledge1 sknowledge1 commented Sep 22, 2026 •

Copy link
Copy Markdown

PowerStation has no native client for its proposed fan interface, leaving supported
handhelds without fan controls in the stock quick-access UI. This adds a Fan
Controls card backed by the versioned D-Bus API in
PowerStation PR #54.

Result

  • Discover fan objects from /org/shadowblip/Performance/Fan and hide the card
    when PowerStation exposes none.
  • Show a selector only when more than one fan is available.
  • Display temperature, RPM, effective duty, backend type, configured limits,
    current state, and automatic-fallback faults.
  • Provide Automatic, Manual, Curve, and named-preset controls using the atomic
    PowerStation methods.
  • Build curve controls from each fan's reported limits instead of embedding
    AYANEO-specific points in OpenGamepadUI.
  • Mark a selected preset as Custom as soon as one of its points is edited.
  • Use the existing card, slider, dropdown, and FocusGroup patterns for full
    controller navigation.

The client requires fan API version 1 before every hardware-changing call. A
missing, legacy, or future interface leaves the status visible but disables the
controls with an upgrade message. Fan state remains global in PowerStation; it is
not added to OpenGamepadUI's per-game profiles.

Service lifecycle

The PowerStation integration recreates CPU, GPU, and fan resources when the
service becomes available again. Fan signal and refresh-timer connections are
removed when a fan is replaced, so an old object cannot update the active card.
Pending slider edits are retained until the user commits them instead of being
overwritten by telemetry refreshes.

Validation

  • cargo fmt --all -- --check
  • cargo check --locked -p opengamepadui-core
  • warning-strict Clippy, allowing only the two lint classes already present in
    the upstream base
  • cargo build --locked -p opengamepadui-core
  • Godot 4.7.1 headless import
  • focused GUT suite: 7 tests, 22 assertions
  • clean git archive rebuild at commit
    c1be4b6348a41722a9290cff33417220dd9906da

The focused suite covers no-fan and multiple-fan visibility, mode mapping,
fallback and API-version status, version-gated writes, preset/custom transitions,
and controller focus. PowerStation PR #54 has completed a controlled real-fan
handoff on the connected AYANEO 3, including Quiet/manual roundtrips and
SIGKILL/watchdog recovery. This OpenGamepadUI branch has not replaced the stock
session on the device; controller/UI acceptance remains a packaged testing-image
gate. The device was returned to its rollback service after backend validation.

Addresses #505. The earlier device-specific plugin/store submission was closed
as superseded by this native path.

@sknowledge1
sknowledge1 force-pushed the feat/powerstation-fan-controls branch from c1be4b6 to 6fc002f Compare October 8, 2026 10:46
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.

1 participant