From 39c743b9052077c3824e8ea745b8f0be535ec974 Mon Sep 17 00:00:00 2001 From: William Edwards Date: Fri, 5 Apr 2024 18:41:37 -0700 Subject: [PATCH] fix(SteamDeck): add events for gyro + accelerometer --- src/drivers/steam_deck/driver.rs | 6 ++++++ src/drivers/steam_deck/hid_report.rs | 23 ++++++++++------------- src/input/capability.rs | 6 ++++++ src/input/source/hidraw/steam_deck.rs | 16 ++++++++++------ 4 files changed, 32 insertions(+), 19 deletions(-) diff --git a/src/drivers/steam_deck/driver.rs b/src/drivers/steam_deck/driver.rs index 16a2593f..3c687269 100644 --- a/src/drivers/steam_deck/driver.rs +++ b/src/drivers/steam_deck/driver.rs @@ -12,9 +12,15 @@ use super::{ hid_report::{PackedMappingsReport, ReportType}, }; +/// Vendor ID pub const VID: u16 = 0x28de; +/// Product ID pub const PID: u16 = 0x1205; +/// Scale to multiply accelerometer values to get in units of meters per second +pub const ACCEL_SCALE: f64 = 0.0006125; +/// Size of the HID packet const PACKET_SIZE: usize = 64; +/// Timeout in milliseconds for reading an HID packet const HID_TIMEOUT: i32 = 5000; pub struct Driver { diff --git a/src/drivers/steam_deck/hid_report.rs b/src/drivers/steam_deck/hid_report.rs index 622f5d5d..1a756935 100644 --- a/src/drivers/steam_deck/hid_report.rs +++ b/src/drivers/steam_deck/hid_report.rs @@ -219,34 +219,31 @@ pub struct PackedInputDataReport { #[packed_field(bytes = "22..=23", endian = "lsb")] pub r_pad_y: Integer>, - // Accelerometer? // byte 24-29 #[packed_field(bytes = "24..=25", endian = "lsb")] - pub accel_x: Integer>, // Accelerometers I think. Needs more testing. + pub accel_x: Integer>, // Accelerometers #[packed_field(bytes = "26..=27", endian = "lsb")] pub accel_y: Integer>, #[packed_field(bytes = "28..=29", endian = "lsb")] pub accel_z: Integer>, - // Gyro? // byte 30-35 #[packed_field(bytes = "30..=31", endian = "lsb")] - pub pitch: Integer>, // Attitude (?) Needs more testing + pub pitch: Integer>, // Gyro #[packed_field(bytes = "32..=33", endian = "lsb")] pub yaw: Integer>, #[packed_field(bytes = "34..=35", endian = "lsb")] pub roll: Integer>, - // Magnetometer? // byte 36-43 #[packed_field(bytes = "36..=37", endian = "lsb")] - pub _gyro0: Integer>, // Not sure what these are... + pub _magn_0: Integer>, // Magnetometer #[packed_field(bytes = "38..=39", endian = "lsb")] - pub _gyro1: Integer>, // Seems like they might be additional gyros for extra precision (?) + pub _magn_1: Integer>, #[packed_field(bytes = "40..=41", endian = "lsb")] - pub _gyro2: Integer>, + pub _magn_2: Integer>, #[packed_field(bytes = "42..=43", endian = "lsb")] - pub _gyro3: Integer>, + pub _magn_3: Integer>, // byte 44-47 #[packed_field(bytes = "44..=45", endian = "lsb")] @@ -354,10 +351,10 @@ impl PackedInputDataReport { pitch: Integer::from_primitive(0), yaw: Integer::from_primitive(0), roll: Integer::from_primitive(0), - _gyro0: Integer::from_primitive(0), - _gyro1: Integer::from_primitive(0), - _gyro2: Integer::from_primitive(0), - _gyro3: Integer::from_primitive(0), + _magn_0: Integer::from_primitive(0), + _magn_1: Integer::from_primitive(0), + _magn_2: Integer::from_primitive(0), + _magn_3: Integer::from_primitive(0), l_trigg: Integer::from_primitive(0), r_trigg: Integer::from_primitive(0), l_stick_x: Integer::from_primitive(0), diff --git a/src/input/capability.rs b/src/input/capability.rs index 99946141..d7979ede 100644 --- a/src/input/capability.rs +++ b/src/input/capability.rs @@ -151,7 +151,13 @@ pub enum Gamepad { /// Gamepad Trigger typically uses a single unsigned integar value that represents /// how far a trigger has been pulled Trigger(GamepadTrigger), + /// Accelerometer events measure the current acceleration of a device. This is + /// normally used to determine which way is "down" as there will be a constant + /// acceleration towards the center of the earth at 9.8 meters per second. + /// Typical will use (x, y, z) values normalized to meters per second. Accelerometer, + /// Gyro events measure the angular velocity of a device measured + /// with (x, y, z) values normalized to radians per second. Gyro, } diff --git a/src/input/source/hidraw/steam_deck.rs b/src/input/source/hidraw/steam_deck.rs index 3976149c..7c9ef629 100644 --- a/src/input/source/hidraw/steam_deck.rs +++ b/src/input/source/hidraw/steam_deck.rs @@ -6,7 +6,11 @@ use hidapi::DeviceInfo; use tokio::sync::broadcast; use crate::{ - drivers::steam_deck::{self, driver::Driver, hid_report::LIZARD_SLEEP_SEC}, + drivers::steam_deck::{ + self, + driver::{Driver, ACCEL_SCALE}, + hid_report::LIZARD_SLEEP_SEC, + }, input::{ capability::{Capability, Gamepad, GamepadAxis, GamepadButton, GamepadTrigger}, composite_device::Command, @@ -334,15 +338,15 @@ fn translate_event(event: steam_deck::event::Event) -> NativeEvent { }, steam_deck::event::Event::Accelerometer(accel) => match accel { steam_deck::event::AccelerometerEvent::Accelerometer(value) => NativeEvent::new( - Capability::NotImplemented, + Capability::Gamepad(Gamepad::Accelerometer), InputValue::Vector3 { - x: Some(value.x as f64), - y: Some(value.y as f64), - z: Some(value.z as f64), + x: Some(value.x as f64 * ACCEL_SCALE), + y: Some(value.y as f64 * ACCEL_SCALE), + z: Some(value.z as f64 * ACCEL_SCALE), }, ), steam_deck::event::AccelerometerEvent::Attitude(value) => NativeEvent::new( - Capability::NotImplemented, + Capability::Gamepad(Gamepad::Gyro), InputValue::Vector3 { x: Some(value.x as f64), y: Some(value.y as f64),