3 个版本
0.1.2 | 2024年6月30日 |
---|---|
0.1.1 | 2024年4月27日 |
0.1.0 | 2024年4月26日 |
#329 在 硬件支持
每月下载量 234
87KB
2K SLoC
wiimote-rs
一个通过蓝牙与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