Skip to content

feat(capture): Camera Scanning UI for the Fujifilm Bluetooth trigger - #653

Open
rohanpandula wants to merge 2 commits into
marcinz606:mainfrom
rohanpandula:fuji-ble-ui
Open

feat(capture): Camera Scanning UI for the Fujifilm Bluetooth trigger#653
rohanpandula wants to merge 2 commits into
marcinz606:mainfrom
rohanpandula:fuji-ble-ui

Conversation

@rohanpandula

Copy link
Copy Markdown
Contributor

Stacked on #652

This is the sidebar UI for the Fujifilm Bluetooth trigger connector added in #652. The first commit here is #652 — review the UI commit; once #652 merges, this PR's diff shrinks to UI-only.

Summary

Exposes the optional Bluetooth trigger in the Camera Scanning sidebar. The pairing is treated as opaque config the worker owns — the sidebar never touches a fujitrigger type; it talks only through the fuji_ble adapter and the controller signals, keeping the connector boundary from #652 intact.

What it adds

  • Trigger selector in the CAMERA section — USB (gphoto2) or Fujifilm Bluetooth.
  • Pair… button + status line + WiFi drop-folder picker. Discovery and pairing run off the UI thread (worker slots) and report back via controller signals; an already-bonded body is detected on activation and offered for linking (a bonded GFX keeps advertising, so it's found without a fresh pairing).
  • ScanlightSettings persists the backend choice plus the opaque Fuji config.
  • Capability gating — live view, the exposure steppers, and calibration grey out in Bluetooth mode (the remote carries only the shutter, so there's no preview to aim at). RGB scanning still works: the Scanlight supplies the per-channel exposure; the body's shutter/ISO/aperture are set by hand on the body (documented in docs/CAMERA_SCANNING.md).

Validation

Review note

Kept separate from the connector so #652's boundary can be reviewed on its own, per the glue-first norm from #615.

…e backend)

Thin connector from the standalone fuji-ble-negpy-trigger package into NegPy,
mirroring how python-sane and gphoto2 are consumed: an optional dependency,
imported lazily, entirely absent by default. NegPy keeps only the glue
(capture/fuji_ble.py); all Fuji BLE device code lives in the standalone package
(pinned to an immutable commit, like coolscanpy).

- fuji_ble.py is the only module importing fujitrigger; accepts/returns plain
  dicts, translates vendor errors to RuntimeError with __cause__ preserved
- Camera protocol gains is_open() so the worker treats every backend uniformly
  (gphoto2 USB and Bluetooth trigger both report it) — no vendor special-casing
- CaptureWorker gains a backend seam (set_camera_backend / detect / pair) that
  builds the BLE camera through the adapter and gates live-view/settings off via
  capabilities (the remote carries only the shutter)
- build.py bundles fujitrigger+bleak and adds NSBluetoothAlwaysUsageDescription
  when the fuji-ble group is installed
- adapter tests inject a fake fujitrigger module (no hardware), as marcinz606#615 does

No sidebar UI here — that lands stacked on top.
Stacked on the fuji-ble connector. Exposes the optional Bluetooth trigger in the
Camera Scanning sidebar, treating the pairing as opaque config the worker owns.

- Trigger selector (USB gphoto2 / Fujifilm Bluetooth) in the CAMERA section
- Pair button + status + WiFi drop-folder picker; discovery/pairing run off the
  UI thread and report back via controller signals
- An already-bonded body is detected on activation and offered for linking
- ScanlightSettings persists the backend + opaque fuji config
- Capability gating greys live-view/settings/calibration in Bluetooth mode (the
  remote carries only the shutter); RGB scanning still works via the Scanlight
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