#校准 #Wiimote #Wii #输入输出 #蓝牙 #加速度计 #动作

wiimote-rs

Rust 编程语言用于与Wii遥控器通信的库

3 个版本

0.1.2 2024年6月30日
0.1.1 2024年4月27日
0.1.0 2024年4月26日

#329硬件支持

Download history 264/week @ 2024-04-25 11/week @ 2024-05-02 180/week @ 2024-06-27 21/week @ 2024-07-04

每月下载量 234

MIT 许可证

87KB
2K SLoC

wiimote-rs

crates.io CI Documentation License

一个通过蓝牙与Wii遥控器通信的Rust库。

功能

wiimote-rs 目前处于开发中,支持以下功能:

  • 通过按下 1+2 按钮连接Wii遥控器
  • 以输出报告形式发送数据
  • 以输入报告形式接收数据
  • 读取加速度计校准并将其从原始值转换为有效值
  • 读取运动加校准并将其从原始值转换为有效值

设置

Windows:无需额外设置

Linux:在基于 Debian 的系统上安装以下软件包,或在其他发行版上安装其等效软件包

sudo apt install libudev-dev libbluetooth-dev clang

macOS:目前不支持

示例

查看 examples 目录以获取完整示例。

接受Wii遥控器连接

use wiimote_rs::prelude::*;

fn main() -> WiimoteResult<()> {
    let manager = WiimoteManager::get_instance();
    let new_devices = {
        let manager = manager.lock().unwrap();
        manager.new_devices_receiver()
    };

    new_devices.iter().try_for_each(|device| -> WiimoteResult<()> {
        // Do something with the connected Wii remote
        Ok(())
    })
}

向Wii遥控器发送数据

use std::sync::{Arc, Mutex};

use wiimote_rs::prelude::*;

use wiimote_rs::output::{OutputReport, PlayerLedFlags};

fn change_leds(device: Arc<Mutex<WiimoteDevice>>) -> WiimoteResult<()> {
    let led_report = OutputReport::PlayerLed(PlayerLedFlags::LED_2 | PlayerLedFlags::LED_3);
    device.lock().unwrap().write(&led_report)
}

从Wii遥控器接收数据

use std::sync::{Arc, Mutex};

use wiimote_rs::prelude::*;

use wiimote_rs::input::InputReport;

fn read_buttons(device: Arc<Mutex<WiimoteDevice>>) -> WiimoteResult<()> {
    let input_report = device.lock().unwrap().read()?;
    match input_report {
        InputReport::DataReport(_, data) => {
            // All data reports except 0x3d contain button data
            let buttons = data.buttons();
        }
        _ => {}
    }
    Ok(())
}

读取加速度计数据

use std::sync::{Arc, Mutex};

use wiimote_rs::prelude::*;

use wiimote_rs::input::InputReport;

fn read_accelerometer(device: Arc<Mutex<WiimoteDevice>>) -> WiimoteResult<()> {
    // The accelerometer calibration can be stored and reused per WiimoteDevice
    let accelerometer_calibration = device.lock().unwrap().accelerometer_calibration().clone();

    let input_report = device.lock().unwrap().read()?;
    match input_report {
        // Note that the data report mode needs to be set to a mode that includes accelerometer data such as 0x31
        InputReport::DataReport(0x31, wiimote_data) => {
            let accelerometer_data = AccelerometerData::from_normal_reporting(&wiimote_data.data);
            let (x, y, z) = accelerometer_calibration.get_acceleration(&accelerometer_data);
        }
        _ => {}
    }
    Ok(())
}

依赖项

~0.5–36MB
~540K SLoC