Skip to content

Commit

Permalink
fix(SteamDeck): add events for gyro + accelerometer
Browse files Browse the repository at this point in the history
  • Loading branch information
ShadowApex committed Apr 7, 2024
1 parent c047c23 commit 39c743b
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 19 deletions.
6 changes: 6 additions & 0 deletions src/drivers/steam_deck/driver.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
23 changes: 10 additions & 13 deletions src/drivers/steam_deck/hid_report.rs
Original file line number Diff line number Diff line change
Expand Up @@ -219,34 +219,31 @@ pub struct PackedInputDataReport {
#[packed_field(bytes = "22..=23", endian = "lsb")]
pub r_pad_y: Integer<i16, packed_bits::Bits<16>>,

// Accelerometer?
// byte 24-29
#[packed_field(bytes = "24..=25", endian = "lsb")]
pub accel_x: Integer<i16, packed_bits::Bits<16>>, // Accelerometers I think. Needs more testing.
pub accel_x: Integer<i16, packed_bits::Bits<16>>, // Accelerometers
#[packed_field(bytes = "26..=27", endian = "lsb")]
pub accel_y: Integer<i16, packed_bits::Bits<16>>,
#[packed_field(bytes = "28..=29", endian = "lsb")]
pub accel_z: Integer<i16, packed_bits::Bits<16>>,

// Gyro?
// byte 30-35
#[packed_field(bytes = "30..=31", endian = "lsb")]
pub pitch: Integer<i16, packed_bits::Bits<16>>, // Attitude (?) Needs more testing
pub pitch: Integer<i16, packed_bits::Bits<16>>, // Gyro
#[packed_field(bytes = "32..=33", endian = "lsb")]
pub yaw: Integer<i16, packed_bits::Bits<16>>,
#[packed_field(bytes = "34..=35", endian = "lsb")]
pub roll: Integer<i16, packed_bits::Bits<16>>,

// Magnetometer?
// byte 36-43
#[packed_field(bytes = "36..=37", endian = "lsb")]
pub _gyro0: Integer<i16, packed_bits::Bits<16>>, // Not sure what these are...
pub _magn_0: Integer<i16, packed_bits::Bits<16>>, // Magnetometer
#[packed_field(bytes = "38..=39", endian = "lsb")]
pub _gyro1: Integer<i16, packed_bits::Bits<16>>, // Seems like they might be additional gyros for extra precision (?)
pub _magn_1: Integer<i16, packed_bits::Bits<16>>,
#[packed_field(bytes = "40..=41", endian = "lsb")]
pub _gyro2: Integer<i16, packed_bits::Bits<16>>,
pub _magn_2: Integer<i16, packed_bits::Bits<16>>,
#[packed_field(bytes = "42..=43", endian = "lsb")]
pub _gyro3: Integer<i16, packed_bits::Bits<16>>,
pub _magn_3: Integer<i16, packed_bits::Bits<16>>,

// byte 44-47
#[packed_field(bytes = "44..=45", endian = "lsb")]
Expand Down Expand Up @@ -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),
Expand Down
6 changes: 6 additions & 0 deletions src/input/capability.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
}

Expand Down
16 changes: 10 additions & 6 deletions src/input/source/hidraw/steam_deck.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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),
Expand Down

0 comments on commit 39c743b

Please sign in to comment.