| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- use std::thread;
- use hidapi::HidApi;
- use tauri::{Emitter,Window};
- // 全局宏变量
- lazy_static::lazy_static! {
- static ref HIDAPI: HidApi = HidApi::new().expect("Failed to initialize HidApi");
- }
- // 变量
- const LOGITECH_VID: u16 = 0x046D; // 罗技厂商ID
- const G923_PIDS: &[u16] = &[
- 0xC262, // G923 PlayStation
- 0xC267, // G923 Xbox
- 0xC266, // G920(兼容检查)
- ];
- // 读取G923数据
- #[tauri::command]
- fn start_reading_data(window: Window) -> Result<(), String> {
- // 初始化HID API
- let api = &HIDAPI;
- // 自动检测设备
- let device_info = api.device_list().find(|d| d.vendor_id() == LOGITECH_VID && G923_PIDS.contains(&d.product_id())).ok_or("未检测到罗技设备")?;
- println!("找到G923设备: VID:{:04X} PID:{:04X}",
- device_info.vendor_id(),
- device_info.product_id());
- // 打开设备
- let device = device_info.open_device(&api).map_err(|e| format!("无法打开设备: {}", e))?;
- // 启动读取线程
- thread::spawn(move || {
- let mut buf = [0u8; 64];
- loop {
- // 使用带超时的读取(100ms)
- match device.read_timeout(&mut buf, 100) {
- Ok(n) => {
- // 处理&发送数据
- // TODO 会出现数据是空的情况
- let data = &buf[..n];
- let _ = window.emit("g923-data", format!("{:?}", data));
- },
- Err(e) => {
- eprintln!("读取数据失败: {}", e);
- break;
- }
- };
- }
- });
- Ok(())
- }
- pub fn run() {
- tauri::Builder::default()
- .plugin(tauri_plugin_shell::init())
- .plugin(tauri_plugin_mqtt::init())
- .invoke_handler(tauri::generate_handler![start_reading_data])
- .run(tauri::generate_context!())
- .expect("error while running tauri application");
- }
|