Toggle menu
Toggle preferences menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.
The main server is currently down. We are running on a backup server, so editing and search functionality are temporarily disabled. Please check back in a few hours.
Revision as of 03:05, 20 October 2024 by HydeWing (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
joycontrol-kb
General
AuthorQueenLinuxGlitch
TypeRemote Play and Streaming
Version2020
LicenseGPL-3.0
Last Updated2020/08/12
Links
Download
Website
Source

Emulate Nintendo Switch Controllers over Bluetooth w/ Amiibo Support through Python3. Based on joycontrol-ms.

Tested on Debian, Generic Hardware.

Features

  • Emulation of JOYCON_R, JOYCON_L and PRO_CONTROLLER.
    • button commands
    • stick state
    • nfc data
    • controller keybinding
    • controller macro recording, playback, deleting

Installation

Install dependencies:

  • Deb-systems:
    • Install the dbus-python libhidapi-hidraw0 and keyboard packages
    • sudo apt install python3-dbus libhidapi-hidraw0
    • sudo pip3 install keyboard
  • Arch Linux Derivatives:
    • Install the hidapi and bluez-utils-compat(AUR) packages.

Clone the repository and install the joycontrol package to get missing dependencies:

  • (Note: Controller script needs super user rights, so python packages must be installed as root.)
  • In the joycontrol folder run: sudo pip3 install .

Disable the bluez "input" plugin, see #8.

User guide

Command line interface example

Run the script:

  • sudo python3 run_controller_cli.py PRO_CONTROLLER
  • This will create a PRO_CONTROLLER instance waiting for the Switch to connect.

Open the "Change Grip/Order" menu of the Switch:

  • The Switch only pairs with new controllers in the "Change Grip/Order" menu.
  • Note: If you already connected an emulated controller once, you can use the reconnect option of the script (-r "<Switch Bluetooth Mac address>"). This does not require the "Change Grip/Order" menu to be opened. You can find out a paired mac address using the "bluetoothctl" system command.

After connecting, a command line interface is opened. Note: Press <enter> if you don't see a prompt.

  • Call "help" to see a list of available commands.
  • If you call "test_buttons", the emulated controller automatically navigates to the "Test Controller Buttons" menu.

CLI Readme

While running the cli, call "help" for an explanation of available commands.

Usage:
    run_controller_cli.py <controller> [--device_id | -d  <bluetooth_adapter_id>]
                                       [--spi_flash <spi_flash_memory_file>]
                                       [--reconnect_bt_addr | -r <console_bluetooth_address>]
                                       [--log | -l <communication_log_file>]
                                       [--nfc <nfc_data_file>]
    run_controller_cli.py -h | --help

Arguments:
    controller      Choose which controller to emulate. Either "JOYCON_R", "JOYCON_L" or "PRO_CONTROLLER"

Options:
    -d --device_id <bluetooth_adapter_id>   ID of the bluetooth adapter. Integer matching the digit in the hci* notation
                                            (e.g. hci0, hci1, ...) or Bluetooth mac address of the adapter in string
                                            notation (e.g. "FF:FF:FF:FF:FF:FF").
                                            Note: Selection of adapters may not work if the bluez "input" plugin is
                                            enabled.

    --spi_flash <spi_flash_memory_file>     Memory dump of a real Switch controller. Required for joystick emulation.
                                            Allows displaying of JoyCon colors.
                                            Memory dumps can be created using the dump_spi_flash.py script.

    -r --reconnect_bt_addr <console_bluetooth_address>  Previously connected Switch console Bluetooth address in string
                                                        notation (e.g. "FF:FF:FF:FF:FF:FF") for reconnection.
                                                        Does not require the "Change Grip/Order" menu to be opened,

    -l --log <communication_log_file>       Write hid communication (input reports and output reports) to a file.

    --nfc <nfc_data_file>                   Sets the nfc data of the controller to a given nfc dump upon initial
                                            connection.

Resources

Known issues

  • Some bluetooth adapters seem to cause disconnects for reasons unknown, try to use an usb adapter instead.
  • Incompatibility with Bluetooth "input" plugin requires a bluetooth restart, see #8.
  • It seems like the Switch is slower processing incoming messages while in the "Change Grip/Order" menu. This causes flooding of packets and makes pairing somewhat inconsistent. Not sure yet what exactly a real controller does to prevent that. A workaround is to use the reconnect option after a controller was paired once, so that opening of the "Change Grip/Order" menu is not required.

External links

Advertising: