Skip to content

Steam Controller (2015) over BT issues #159

Description

@C0rn3j
  1. Enabling haptics extremely delays input, to the point where we're not processing input fast enough

  2. Under this delay it exposes another bug where we can process packets out of order which breaks things pretty well - randomly pressing a bunch of buttons at once at times for example, when only using both touchpads.

Log from a debug branch under the delay:

SCBT: rejected out-of-sequence fragment: fd=22 expected=0 got=1
SCBT: discarded incomplete message: fd=22 expected=1 got=0
  1. We do not guard writing hidraw so we crash if that fails. The crash is an old Bluez bug fixed ages ago, but it reproduces on Debian 13 since it ships such an old version:
2026-09-14 19:12:54.809 D SCCDaemon     Starting SCCDaemon...
2026-09-14 19:12:54.850 D SCCDaemon     Initializing drivers...
2026-09-14 19:12:54.850 W SCCDaemon     Skipping disabled driver 'ds4drv'
2026-09-14 19:12:54.850 W SCCDaemon     Skipping disabled driver 'ds5drv'
2026-09-14 19:12:54.857 W SCCDaemon     Skipping disabled driver 'fake'
2026-09-14 19:12:54.871 W SCCDaemon     Skipping disabled driver 'remotepad'
2026-09-14 19:12:54.877 D USB           Registered USB driver for 28de:1304
2026-09-14 19:12:54.877 D USB           Registered USB driver for 28de:1302
2026-09-14 19:12:54.877 D USB           Registered USB driver for 28de:1102
2026-09-14 19:12:54.877 D USB           Registered USB driver for 28de:1142
2026-09-14 19:12:54.878 D USB           Registered USB driver for 28de:1205
2026-09-14 19:12:54.878 D Mapper        Creating virtual devices
2026-09-14 19:12:54.878 D Mapper        Keyboard: <scc.uinput.Keyboard object at 0x7fff242d3230>
2026-09-14 19:12:54.879 D Mapper        Mouse:    <scc.uinput.Mouse object at 0x7fff242d3380>
2026-09-14 19:12:54.880 D Mapper        Gamepad:  <scc.uinput.UInput object at 0x7fff242d34d0>
2026-09-14 19:12:54.883 D SCCDaemon     Created control socket /home/yew/.config/scc/daemon.socket
2026-09-14 19:12:54.883 E SCCDaemon     Neither DISPLAY nor WAYLAND_DISPLAY is set. Some functionality will be unavailable - are you launching SCC via an SSH session?
2026-09-14 19:12:54.883 W py.warnings   /usr/local/lib/python3.13/dist-packages/scc/drivers/usb.py:237: DeprecationWarning: Use "with USBContext() as context:" for safer cleanup on interpreter shutdown. See also USBContext.open().
  self._ctx.setPollFDNotifiers(register_fd, unregister_fd)

2026-09-14 19:12:54.893 W py.warnings   /usr/lib/python3/dist-packages/evdev/eventio_async.py:101: DeprecationWarning: There is no current event loop
  loop = asyncio.get_event_loop()

2026-09-14 19:12:54.893 D asyncio       Using selector: EpollSelector
2026-09-14 19:12:55.062 D SCCDaemon     Assigned default_mapper to <SCByBt scbt1>
2026-09-14 19:12:55.063 D SCCDaemon     Controller added: <SCByBt scbt1>
Traceback (most recent call last):
  File "/usr/local/bin/scc-daemon", line 8, in <module>
    sys.exit(main())
             ~~~~^^
  File "/usr/local/lib/python3.13/dist-packages/scc/bin/scc_daemon.py", line 39, in main
    daemon.debug()
    ~~~~~~~~~~~~^^
  File "/usr/local/lib/python3.13/dist-packages/scc/sccdaemon.py", line 1172, in debug
    self.run()
    ~~~~~~~~^^
  File "/usr/local/lib/python3.13/dist-packages/scc/sccdaemon.py", line 716, in run
    fn()
    ~~^^
  File "/usr/local/lib/python3.13/dist-packages/scc/sccdaemon.py", line 122, in _poll
    self.poller.poll(self.scheduler.get_poll_timeout())
    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.13/dist-packages/scc/poller.py", line 54, in poll
    self._callbacks.get(fd, DO_NOTHING)(fd, Poller.POLLIN)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.13/dist-packages/scc/drivers/sc_by_bt.py", line 309, in _input
    self.flush()
    ~~~~~~~~~~^^
  File "/usr/local/lib/python3.13/dist-packages/scc/drivers/sc_by_bt.py", line 261, in flush
    self._hidrawdev.sendFeatureReport(msg, 3)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^
  File "/usr/local/lib/python3.13/dist-packages/scc/lib/hidraw.py", line 124, in sendFeatureReport
    self._ioctl(
    ~~~~~~~~~~~^
        _HIDIOCSFEATURE(length),
     ^^^^^^^^^^^^^^^^^^^^^^^^
        (ctypes.c_char * length).from_buffer(buf),
     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        True,
     ^^^^^
    )
    ^
  File "/usr/local/lib/python3.13/dist-packages/scc/lib/hidraw.py", line 81, in _ioctl
    result = fcntl.ioctl(self._device, func, arg, mutate_flag)
OSError: [Errno 5] Input/output error
Traceback (most recent call last):
  File "/usr/local/bin/scc-daemon", line 8, in <module>
    sys.exit(main())
             ~~~~^^
  File "/usr/local/lib/python3.13/dist-packages/scc/bin/scc_daemon.py", line 39, in main
    daemon.debug()
    ~~~~~~~~~~~~^^
  File "/usr/local/lib/python3.13/dist-packages/scc/sccdaemon.py", line 1172, in debug
    self.run()
    ~~~~~~~~^^
  File "/usr/local/lib/python3.13/dist-packages/scc/sccdaemon.py", line 716, in run
    fn()
    ~~^^
  File "/usr/local/lib/python3.13/dist-packages/scc/sccdaemon.py", line 122, in _poll
    self.poller.poll(self.scheduler.get_poll_timeout())
    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.13/dist-packages/scc/poller.py", line 54, in poll
    self._callbacks.get(fd, DO_NOTHING)(fd, Poller.POLLIN)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.13/dist-packages/scc/drivers/sc_by_bt.py", line 309, in _input
    self.flush()
    ~~~~~~~~~~^^
  File "/usr/local/lib/python3.13/dist-packages/scc/drivers/sc_by_bt.py", line 261, in flush
    self._hidrawdev.sendFeatureReport(msg, 3)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^
  File "/usr/local/lib/python3.13/dist-packages/scc/lib/hidraw.py", line 124, in sendFeatureReport
    self._ioctl(
    ~~~~~~~~~~~^
        _HIDIOCSFEATURE(length),
     ^^^^^^^^^^^^^^^^^^^^^^^^
        (ctypes.c_char * length).from_buffer(buf),
     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        True,
     ^^^^^
    )
    ^
  File "/usr/local/lib/python3.13/dist-packages/scc/lib/hidraw.py", line 81, in _ioctl
    result = fcntl.ioctl(self._device, func, arg, mutate_flag)
OSError: [Errno 5] Input/output error
Exception ignored in atexit callback <bound method Daemon.delpid of <scc.sccdaemon.SCCDaemon object at 0x7fff252a5a90>>:
Traceback (most recent call last):
  File "/usr/local/lib/python3.13/dist-packages/scc/lib/daemon.py", line 77, in delpid
    os.remove(self.pidfile)
FileNotFoundError: [Errno 2] No such file or directory: '/home/yew/.config/scc/daemon.pid'
[1]+  Exit 1                  scc daemon debug

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions