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"); }