Skip to content

Commit 6ecf256

Browse files
committed
Added support for Nintendo JoyCon controllers
1 parent 9b14da7 commit 6ecf256

File tree

2 files changed

+24
-4
lines changed

2 files changed

+24
-4
lines changed

backend/src/api.rs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ pub fn controllers() -> Result<Vec<Controller>> {
3838
if nintendo_pro_controllers.len() == 1 || nintendo_pro_controllers.len() == 2 {
3939
// When we only get one device, we know it's connected via Bluetooth.
4040
// When we get two devices, we know it's connected only via USB. Both will report the same data, so we'll just return the first one.
41-
let controller = nintendo::parse_pro_controller_data(nintendo_pro_controllers[0], &hidapi)?;
41+
let controller = nintendo::parse_controller_data(nintendo_pro_controllers[0], &hidapi)?;
4242
controllers.push(controller);
4343
} else if nintendo_pro_controllers.len() == 3 {
4444
// When we get three devices, we know it's connected via USB + Bluetooth.
@@ -48,11 +48,23 @@ pub fn controllers() -> Result<Vec<Controller>> {
4848
.find(|device_info| device_info.interface_number() == -1);
4949

5050
if let Some(bt_controller) = bt_controller {
51-
let controller = nintendo::parse_pro_controller_data(bt_controller, &hidapi)?;
51+
let controller = nintendo::parse_controller_data(bt_controller, &hidapi)?;
5252
controllers.push(controller);
5353
}
5454
}
5555

56+
let nintendo_non_pro_controllers: Vec<_> = hidapi
57+
.device_list()
58+
.filter(|device_info| {
59+
device_info.vendor_id() == nintendo::VENDOR_ID_NINTENDO
60+
&& device_info.product_id() != nintendo::PRODUCT_ID_NINTENDO_PROCON
61+
})
62+
.collect();
63+
for device_info in nintendo_non_pro_controllers {
64+
let controller = nintendo::parse_controller_data(device_info, &hidapi)?;
65+
controllers.push(controller);
66+
}
67+
5668
// for some reason HidApi's list_devices() is returning multiple instances of the same controller
5769
// so dedupe by serial number
5870
let mut xbox_controllers: Vec<_> = hidapi

backend/src/api/nintendo.rs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ use super::Controller;
99

1010
pub const VENDOR_ID_NINTENDO: u16 = 0x057e;
1111
pub const PRODUCT_ID_NINTENDO_PROCON: u16 = 0x2009;
12+
pub const PRODUCT_ID_NINTENDO_JOYCON_L: u16 = 0x2006;
13+
pub const PRODUCT_ID_NINTENDO_JOYCON_R: u16 = 0x2007;
1214

1315
const INPUT_REPORT_SIZE: usize = 362;
1416

@@ -27,8 +29,14 @@ struct InputReport {
2729
bat_con: u8,
2830
}
2931

30-
pub fn parse_pro_controller_data(device_info: &DeviceInfo, hidapi: &HidApi) -> Result<Controller> {
31-
let mut controller = Controller::from_hidapi(device_info, "Pro Controller", 0, Status::Unknown);
32+
pub fn parse_controller_data(device_info: &DeviceInfo, hidapi: &HidApi) -> Result<Controller> {
33+
let name = match device_info.product_id() {
34+
PRODUCT_ID_NINTENDO_JOYCON_L => "Joy-Con L",
35+
PRODUCT_ID_NINTENDO_JOYCON_R => "Joy-Con R",
36+
PRODUCT_ID_NINTENDO_PROCON => "Pro Controller",
37+
_ => "Nintendo Controller",
38+
};
39+
let mut controller = Controller::from_hidapi(device_info, name, 0, Status::Unknown);
3240

3341
let device = device_info.open_device(hidapi)?;
3442
let mut buf = [0u8; INPUT_REPORT_SIZE];

0 commit comments

Comments
 (0)