#蓝牙 #hid #gamedev #send-receive #joycon #nintendo-switch

bin+lib joycon-rs

这是一个在Rust中轻松高效地处理任天堂Switch Joy-Con的框架

17个版本

0.6.3 2021年12月5日
0.6.1 2020年6月6日
0.5.6 2020年6月5日
0.5.3 2020年5月31日
0.1.1 2020年4月16日

#318 in 游戏开发

Apache-2.0

125KB
2.5K SLoC


Joycon-rs

文档| 示例| 变更日志| 文档

通过蓝牙轻松高效地处理任天堂Switch Joy-Con的框架。

Joycon-rs提供了查找、通信和操作Joy-Con的实用工具。请参阅文档注释以获取如何使用的详细说明。

Joycon-rs仍在开发中,并且目前还不完整。请注意,更新将包括一些破坏性的变化。请原谅我们正在清理灰尘!

设置

在macOS或Windows上,没有准备工作。

在linux上,

$ sudo apt-get install libudev-dev libusb-1.0-0-dev libfox-1.6-dev

使用方法

首先,在Cargo.toml中添加依赖项

[dependencies]
joycon_rs = "*"

然后,在.rs文件中使用预定义

use joycon_rs::prelude::*;

太好了!现在你可以在代码中使用Joycon-rs了。

接收报告

从简单的Joy-Con信号开始。如果你使用多个Joy-Con,mspc会非常有帮助。

use joycon_rs::prelude::*;

let (tx, rx) = std::sync::mpsc::channel();

let _output = std::thread::spawn(move || {
    // Push buttons or tilt the stick please.
    // Stop with `Cmd + C` or `Ctrl + C`
    while let Ok(message) = rx.recv() {
        dbg!(message);
    }
});

let manager = JoyConManager::get_instance();
let (managed_devices, new_devices) = {
let lock = manager.lock();
    match lock {
        Ok(m) => (m.managed_devices(),m.new_devices()),
        Err(_) => unreachable!()
    }
};

managed_devices.into_iter()
    .chain(new_devices)
    .flat_map(|dev| SimpleJoyConDriver::new(&dev))
    .try_for_each::<_, JoyConResult<()>>(|driver| {
        // Change JoyCon to Simple hid mode.
        let simple_hid_mode = SimpleHIDMode::new(driver)?;
    
        let tx = tx.clone();
    
        // Spawn thread
        std::thread::spawn( move || {
            loop {
                // Forward the report to the main thread
                tx.send(simple_hid_mode.read_input_report()).unwrap();
            }
        });
    
        Ok(())
    })
    .unwrap();

设置玩家灯

然后,让我们处理玩家灯。

use joycon_rs::prelude::{*, lights::*};

let (tx, rx) = std::sync::mpsc::channel();

let _output = std::thread::spawn(move || {
    // Stop with `Cmd + C` or `Ctrl + C`
    while let Ok(message) = rx.recv() {
        dbg!(message);
    }
});

let manager = JoyConManager::get_instance();
let (managed_devices, new_devices) = {
let lock = manager.lock();
    match lock {
        Ok(m) => (m.managed_devices(),m.new_devices()),
        Err(_) => unreachable!()
    }
};

managed_devices.into_iter()
    .chain(new_devices)
    .flat_map(|dev| SimpleJoyConDriver::new(&dev))
    .try_for_each::<_, JoyConResult<()>>(|mut driver| {
        // Set player lights
        // [SL BUTTON] 📸💡📸💡 [SR BUTTON]
        driver.set_player_lights(&vec![LightUp::LED1, LightUp::LED3], &vec![Flash::LED0, Flash::LED2]).unwrap();
        tx.send(driver.get_player_lights()).unwrap();
        Ok(())
    })
    .unwrap();

振动

use joycon_rs::prelude::*;
use std::convert::TryInto;
use std::ops::Deref;
use joycon_rs::joycon::joycon_features::JoyConFeature;

fn main() -> JoyConResult<()> {
    // First, connect your Joy-Cons to your computer!

    let manager = JoyConManager::get_instance();
    let (managed_devices, new_devices) = {
        let lock = manager.lock();
        match lock {
            Ok(manager) =>
                (manager.managed_devices(), manager.new_devices()),
            Err(_) => unreachable!(),
        }
    };

    managed_devices.into_iter()
        .chain(new_devices)
        .inspect(|d| {
            let lock = d.lock();
            let device = match lock {
                Ok(device) => device,
                Err(e) => e.into_inner(),
            };
            let hid_device: JoyConResult<&HidDevice> = device.deref().try_into();
            if let Ok(hid_device) = hid_device {
                println!("{:?}", hid_device.get_product_string())
            }
        })
        .try_for_each::<_, JoyConResult<()>>(|d| {
            let mut driver = SimpleJoyConDriver::new(&d)?;

            driver.enable_feature(JoyConFeature::Vibration)?;

            // let rumble = Rumble::new(80.0,0.2);
            let rumble = Rumble::new(300.0,0.9);
            driver.rumble((Some(rumble), Some(rumble)))?;

            Ok(())
        })?;

    Ok(())
}

更多示例

这里.

功能

您可以使用Joycon-rs进行...

规划

  • 接收 NFC/IR 数据
  • 处理 Pro 控制器

许可

在 Apache 许可证 2.0 版下授权(LICENSEhttp://www.apache.org/licenses/LICENSE-2.0

贡献

我们乐意通过 GitHub pull requests 接受贡献。如果您在库中找到错误,如果能详细报告到 问题,以便可以重现,将不胜感激。

依赖项

~0.7–1.3MB
~23K SLoC