lib.rs 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. use std::thread;
  2. use hidapi::HidApi;
  3. use tauri::{Emitter,Window};
  4. // 全局宏变量
  5. lazy_static::lazy_static! {
  6. static ref HIDAPI: HidApi = HidApi::new().expect("Failed to initialize HidApi");
  7. }
  8. // 变量
  9. const LOGITECH_VID: u16 = 0x046D; // 罗技厂商ID
  10. const G923_PIDS: &[u16] = &[
  11. 0xC262, // G923 PlayStation
  12. 0xC267, // G923 Xbox
  13. 0xC266, // G920(兼容检查)
  14. ];
  15. // 读取G923数据
  16. #[tauri::command]
  17. fn start_reading_data(window: Window) -> Result<(), String> {
  18. // 初始化HID API
  19. let api = &HIDAPI;
  20. // 自动检测设备
  21. let device_info = api.device_list().find(|d| d.vendor_id() == LOGITECH_VID && G923_PIDS.contains(&d.product_id())).ok_or("未检测到罗技设备")?;
  22. println!("找到G923设备: VID:{:04X} PID:{:04X}",
  23. device_info.vendor_id(),
  24. device_info.product_id());
  25. // 打开设备
  26. let device = device_info.open_device(&api).map_err(|e| format!("无法打开设备: {}", e))?;
  27. // 启动读取线程
  28. thread::spawn(move || {
  29. let mut buf = [0u8; 64];
  30. loop {
  31. // 使用带超时的读取(100ms)
  32. match device.read_timeout(&mut buf, 100) {
  33. Ok(n) => {
  34. // 处理&发送数据
  35. // TODO 会出现数据是空的情况
  36. let data = &buf[..n];
  37. let _ = window.emit("g923-data", format!("{:?}", data));
  38. },
  39. Err(e) => {
  40. eprintln!("读取数据失败: {}", e);
  41. break;
  42. }
  43. };
  44. }
  45. });
  46. Ok(())
  47. }
  48. pub fn run() {
  49. tauri::Builder::default()
  50. .plugin(tauri_plugin_shell::init())
  51. .plugin(tauri_plugin_mqtt::init())
  52. .invoke_handler(tauri::generate_handler![start_reading_data])
  53. .run(tauri::generate_context!())
  54. .expect("error while running tauri application");
  55. }