From df4eda2fbe7a372a98d7bfd91ca54f984498d2e1 Mon Sep 17 00:00:00 2001 From: Denis Benato Date: Tue, 31 Dec 2024 03:38:52 +0100 Subject: [PATCH] fix(SourceDevice): code cleanup This commit does not modify how the software behaves, while refactoring some code: - remove a method and a big match that was used only once just to avoid calling .clone() - solve the SourceDevice scope creep that was in need (for no reason) to know specific internal details about sub-types --- src/input/composite_device/mod.rs | 2 +- src/input/source/evdev.rs | 48 +++++++- src/input/source/hidraw.rs | 103 +++++++++++++++- src/input/source/iio.rs | 48 +++++++- src/input/source/mod.rs | 196 ++++++------------------------ 5 files changed, 235 insertions(+), 162 deletions(-) diff --git a/src/input/composite_device/mod.rs b/src/input/composite_device/mod.rs index 10f5645..a7d440f 100644 --- a/src/input/composite_device/mod.rs +++ b/src/input/composite_device/mod.rs @@ -620,7 +620,7 @@ impl CompositeDevice { // Add the IIO IMU Dbus interface. We do this here because it needs the source // device transmitter and this is the only place we can refrence it at the moment. - let device = source_device.get_device(); + let device = source_device.get_device_ref().clone(); if let SourceDevice::Iio(_) = source_device { SourceIioImuInterface::listen_on_dbus(self.conn.clone(), device.clone()).await?; } diff --git a/src/input/source/evdev.rs b/src/input/source/evdev.rs index 8f8b8c9..4179c52 100644 --- a/src/input/source/evdev.rs +++ b/src/input/source/evdev.rs @@ -12,7 +12,7 @@ use crate::{ use self::{blocked::BlockedEventDevice, gamepad::GamepadEventDevice}; -use super::{SourceDriver, SourceDriverOptions}; +use super::{SourceDeviceCompatible, SourceDriver, SourceDriverOptions}; /// List of available drivers enum DriverType { @@ -27,6 +27,52 @@ pub enum EventDevice { Gamepad(SourceDriver), } +impl SourceDeviceCompatible for EventDevice { + fn get_device_ref(&self) -> &UdevDevice { + match self { + EventDevice::Blocked(source_driver) => source_driver.info_ref(), + EventDevice::Gamepad(source_driver) => source_driver.info_ref(), + } + } + + fn get_id(&self) -> String { + match self { + EventDevice::Blocked(source_driver) => source_driver.get_id(), + EventDevice::Gamepad(source_driver) => source_driver.get_id(), + } + } + + fn client(&self) -> super::client::SourceDeviceClient { + match self { + EventDevice::Blocked(source_driver) => source_driver.client(), + EventDevice::Gamepad(source_driver) => source_driver.client(), + } + } + + async fn run(self) -> Result<(), Box> { + match self { + EventDevice::Blocked(source_driver) => source_driver.run().await, + EventDevice::Gamepad(source_driver) => source_driver.run().await, + } + } + + fn get_capabilities( + &self, + ) -> Result, super::InputError> { + match self { + EventDevice::Blocked(source_driver) => source_driver.get_capabilities(), + EventDevice::Gamepad(source_driver) => source_driver.get_capabilities(), + } + } + + fn get_device_path(&self) -> String { + match self { + EventDevice::Blocked(source_driver) => source_driver.get_device_path(), + EventDevice::Gamepad(source_driver) => source_driver.get_device_path(), + } + } +} + impl EventDevice { pub fn new( device_info: UdevDevice, diff --git a/src/input/source/hidraw.rs b/src/input/source/hidraw.rs index cc57948..f24eea1 100644 --- a/src/input/source/hidraw.rs +++ b/src/input/source/hidraw.rs @@ -30,7 +30,7 @@ use self::{ opineo::OrangePiNeoTouchpad, steam_deck::DeckController, }; -use super::{SourceDriver, SourceDriverOptions}; +use super::{SourceDeviceCompatible, SourceDriver, SourceDriverOptions}; /// List of available drivers enum DriverType { @@ -64,6 +64,107 @@ pub enum HidRawDevice { XpadUhid(SourceDriver), } +impl SourceDeviceCompatible for HidRawDevice { + fn get_device_ref(&self) -> &UdevDevice { + match self { + HidRawDevice::DualSense(source_driver) => source_driver.info_ref(), + HidRawDevice::Fts3528Touchscreen(source_driver) => source_driver.info_ref(), + HidRawDevice::HoripadSteam(source_driver) => source_driver.info_ref(), + HidRawDevice::LegionGoDCombined(source_driver) => source_driver.info_ref(), + HidRawDevice::LegionGoDSplit(source_driver) => source_driver.info_ref(), + HidRawDevice::LegionGoFPS(source_driver) => source_driver.info_ref(), + HidRawDevice::LegionGoX(source_driver) => source_driver.info_ref(), + HidRawDevice::OrangePiNeo(source_driver) => source_driver.info_ref(), + HidRawDevice::RogAlly(source_driver) => source_driver.info_ref(), + HidRawDevice::SteamDeck(source_driver) => source_driver.info_ref(), + HidRawDevice::XpadUhid(source_driver) => source_driver.info_ref(), + } + } + + fn get_id(&self) -> String { + match self { + HidRawDevice::DualSense(source_driver) => source_driver.get_id(), + HidRawDevice::Fts3528Touchscreen(source_driver) => source_driver.get_id(), + HidRawDevice::HoripadSteam(source_driver) => source_driver.get_id(), + HidRawDevice::LegionGoDCombined(source_driver) => source_driver.get_id(), + HidRawDevice::LegionGoDSplit(source_driver) => source_driver.get_id(), + HidRawDevice::LegionGoFPS(source_driver) => source_driver.get_id(), + HidRawDevice::LegionGoX(source_driver) => source_driver.get_id(), + HidRawDevice::OrangePiNeo(source_driver) => source_driver.get_id(), + HidRawDevice::RogAlly(source_driver) => source_driver.get_id(), + HidRawDevice::SteamDeck(source_driver) => source_driver.get_id(), + HidRawDevice::XpadUhid(source_driver) => source_driver.get_id(), + } + } + + fn client(&self) -> super::client::SourceDeviceClient { + match self { + HidRawDevice::DualSense(source_driver) => source_driver.client(), + HidRawDevice::Fts3528Touchscreen(source_driver) => source_driver.client(), + HidRawDevice::HoripadSteam(source_driver) => source_driver.client(), + HidRawDevice::LegionGoDCombined(source_driver) => source_driver.client(), + HidRawDevice::LegionGoDSplit(source_driver) => source_driver.client(), + HidRawDevice::LegionGoFPS(source_driver) => source_driver.client(), + HidRawDevice::LegionGoX(source_driver) => source_driver.client(), + HidRawDevice::OrangePiNeo(source_driver) => source_driver.client(), + HidRawDevice::RogAlly(source_driver) => source_driver.client(), + HidRawDevice::SteamDeck(source_driver) => source_driver.client(), + HidRawDevice::XpadUhid(source_driver) => source_driver.client(), + + } + } + + async fn run(self) -> Result<(), Box> { + match self { + HidRawDevice::DualSense(source_driver) => source_driver.run().await, + HidRawDevice::Fts3528Touchscreen(source_driver) => source_driver.run().await, + HidRawDevice::HoripadSteam(source_driver) => source_driver.run().await, + HidRawDevice::LegionGoDCombined(source_driver) => source_driver.run().await, + HidRawDevice::LegionGoDSplit(source_driver) => source_driver.run().await, + HidRawDevice::LegionGoFPS(source_driver) => source_driver.run().await, + HidRawDevice::LegionGoX(source_driver) => source_driver.run().await, + HidRawDevice::OrangePiNeo(source_driver) => source_driver.run().await, + HidRawDevice::RogAlly(source_driver) => source_driver.run().await, + HidRawDevice::SteamDeck(source_driver) => source_driver.run().await, + HidRawDevice::XpadUhid(source_driver) => source_driver.run().await, + } + } + + fn get_capabilities( + &self, + ) -> Result, super::InputError> { + match self { + HidRawDevice::DualSense(source_driver) => source_driver.get_capabilities(), + HidRawDevice::Fts3528Touchscreen(source_driver) => source_driver.get_capabilities(), + HidRawDevice::HoripadSteam(source_driver) => source_driver.get_capabilities(), + HidRawDevice::LegionGoDCombined(source_driver) => source_driver.get_capabilities(), + HidRawDevice::LegionGoDSplit(source_driver) => source_driver.get_capabilities(), + HidRawDevice::LegionGoFPS(source_driver) => source_driver.get_capabilities(), + HidRawDevice::LegionGoX(source_driver) => source_driver.get_capabilities(), + HidRawDevice::OrangePiNeo(source_driver) => source_driver.get_capabilities(), + HidRawDevice::RogAlly(source_driver) => source_driver.get_capabilities(), + HidRawDevice::SteamDeck(source_driver) => source_driver.get_capabilities(), + HidRawDevice::XpadUhid(source_driver) => source_driver.get_capabilities(), + } + } + + fn get_device_path(&self) -> String { + match self { + HidRawDevice::DualSense(source_driver) => source_driver.get_device_path(), + HidRawDevice::Fts3528Touchscreen(source_driver) => source_driver.get_device_path(), + HidRawDevice::HoripadSteam(source_driver) => source_driver.get_device_path(), + HidRawDevice::LegionGoDCombined(source_driver) => source_driver.get_device_path(), + HidRawDevice::LegionGoDSplit(source_driver) => source_driver.get_device_path(), + HidRawDevice::LegionGoFPS(source_driver) => source_driver.get_device_path(), + HidRawDevice::LegionGoX(source_driver) => source_driver.get_device_path(), + HidRawDevice::OrangePiNeo(source_driver) => source_driver.get_device_path(), + HidRawDevice::RogAlly(source_driver) => source_driver.get_device_path(), + HidRawDevice::SteamDeck(source_driver) => source_driver.get_device_path(), + HidRawDevice::XpadUhid(source_driver) => source_driver.get_device_path(), + } + } +} + impl HidRawDevice { /// Create a new [HidRawDevice] associated with the given device and /// composite device. The appropriate driver will be selected based on diff --git a/src/input/source/iio.rs b/src/input/source/iio.rs index 4b4230f..0f77c95 100644 --- a/src/input/source/iio.rs +++ b/src/input/source/iio.rs @@ -14,7 +14,7 @@ use crate::{ use self::{accel_gyro_3d_new::AccelGyro3dImu, bmi_imu_new::BmiImu}; -use super::SourceDriver; +use super::{SourceDeviceCompatible, SourceDriver}; /// List of available drivers enum DriverType { @@ -30,6 +30,52 @@ pub enum IioDevice { AccelGryo3D(SourceDriver), } +impl SourceDeviceCompatible for IioDevice { + fn get_device_ref(&self) -> &UdevDevice { + match self { + IioDevice::BmiImu(source_driver) => source_driver.info_ref(), + IioDevice::AccelGryo3D(source_driver) => source_driver.info_ref(), + } + } + + fn get_id(&self) -> String { + match self { + IioDevice::BmiImu(source_driver) => source_driver.get_id(), + IioDevice::AccelGryo3D(source_driver) => source_driver.get_id(), + } + } + + fn client(&self) -> super::client::SourceDeviceClient { + match self { + IioDevice::BmiImu(source_driver) => source_driver.client(), + IioDevice::AccelGryo3D(source_driver) => source_driver.client(), + } + } + + async fn run(self) -> Result<(), Box> { + match self { + IioDevice::BmiImu(source_driver) => source_driver.run().await, + IioDevice::AccelGryo3D(source_driver) => source_driver.run().await, + } + } + + fn get_capabilities( + &self, + ) -> Result, super::InputError> { + match self { + IioDevice::BmiImu(source_driver) => source_driver.get_capabilities(), + IioDevice::AccelGryo3D(source_driver) => source_driver.get_capabilities(), + } + } + + fn get_device_path(&self) -> String { + match self { + IioDevice::BmiImu(source_driver) => source_driver.get_device_path(), + IioDevice::AccelGryo3D(source_driver) => source_driver.get_device_path(), + } + } +} + impl IioDevice { /// Create a new [IioDevice] associated with the given device and /// composite device. The appropriate driver will be selected based on diff --git a/src/input/source/mod.rs b/src/input/source/mod.rs index 08e30af..e8ef128 100644 --- a/src/input/source/mod.rs +++ b/src/input/source/mod.rs @@ -234,11 +234,6 @@ impl SourceDriver self.tx.clone().into() } - /// Returns udev device information about the device - pub fn info(&self) -> UdevDevice { - self.device_info.clone() - } - /// Returns udev device information about the device as a reference pub fn info_ref(&self) -> &UdevDevice { &self.device_info @@ -352,6 +347,26 @@ impl SourceDriver } } +pub(crate) trait SourceDeviceCompatible { + /// Returns a copy of the UdevDevice + fn get_device_ref(&self) -> &UdevDevice; + + /// Returns a unique identifier for the source device. + fn get_id(&self) -> String; + + /// Returns a client channel that can be used to send events to this device + fn client(&self) -> SourceDeviceClient; + + /// Run the source device + async fn run(self) -> Result<(), Box>; + + /// Returns the capabilities that this source device can fulfill. + fn get_capabilities(&self) -> Result, InputError>; + + /// Returns the full path to the device handler (e.g. /dev/input/event3, /dev/hidraw0) + fn get_device_path(&self) -> String; +} + /// A [SourceDevice] is any physical input device that emits input events #[derive(Debug)] pub enum SourceDevice { @@ -361,192 +376,57 @@ pub enum SourceDevice { } impl SourceDevice { - /// Returns a copy of the devices UdevDevice - pub fn get_device(&self) -> UdevDevice { - match self { - SourceDevice::Event(device) => match device { - EventDevice::Gamepad(device) => device.info(), - EventDevice::Blocked(device) => device.info(), - }, - SourceDevice::HidRaw(device) => match device { - HidRawDevice::DualSense(device) => device.info(), - HidRawDevice::SteamDeck(device) => device.info(), - HidRawDevice::LegionGoDCombined(device) => device.info(), - HidRawDevice::LegionGoDSplit(device) => device.info(), - HidRawDevice::LegionGoFPS(device) => device.info(), - HidRawDevice::LegionGoX(device) => device.info(), - HidRawDevice::OrangePiNeo(device) => device.info(), - HidRawDevice::Fts3528Touchscreen(device) => device.info(), - HidRawDevice::XpadUhid(device) => device.info(), - HidRawDevice::RogAlly(device) => device.info(), - HidRawDevice::HoripadSteam(device) => device.info(), - }, - SourceDevice::Iio(device) => match device { - IioDevice::BmiImu(device) => device.info(), - IioDevice::AccelGryo3D(device) => device.info(), - }, - } - } - /// Returns a copy of the UdevDevice pub fn get_device_ref(&self) -> &UdevDevice { match self { - SourceDevice::Event(device) => match device { - EventDevice::Gamepad(device) => device.info_ref(), - EventDevice::Blocked(device) => device.info_ref(), - }, - SourceDevice::HidRaw(device) => match device { - HidRawDevice::DualSense(device) => device.info_ref(), - HidRawDevice::SteamDeck(device) => device.info_ref(), - HidRawDevice::LegionGoDCombined(device) => device.info_ref(), - HidRawDevice::LegionGoDSplit(device) => device.info_ref(), - HidRawDevice::LegionGoFPS(device) => device.info_ref(), - HidRawDevice::LegionGoX(device) => device.info_ref(), - HidRawDevice::OrangePiNeo(device) => device.info_ref(), - HidRawDevice::Fts3528Touchscreen(device) => device.info_ref(), - HidRawDevice::XpadUhid(device) => device.info_ref(), - HidRawDevice::RogAlly(device) => device.info_ref(), - HidRawDevice::HoripadSteam(device) => device.info_ref(), - }, - SourceDevice::Iio(device) => match device { - IioDevice::BmiImu(device) => device.info_ref(), - IioDevice::AccelGryo3D(device) => device.info_ref(), - }, + SourceDevice::Event(device) => device.get_device_ref(), + SourceDevice::HidRaw(device) => device.get_device_ref(), + SourceDevice::Iio(device) => device.get_device_ref(), } } /// Returns a unique identifier for the source device. pub fn get_id(&self) -> String { match self { - SourceDevice::Event(device) => match device { - EventDevice::Gamepad(device) => device.get_id(), - EventDevice::Blocked(device) => device.get_id(), - }, - SourceDevice::HidRaw(device) => match device { - HidRawDevice::DualSense(device) => device.get_id(), - HidRawDevice::SteamDeck(device) => device.get_id(), - HidRawDevice::LegionGoDCombined(device) => device.get_id(), - HidRawDevice::LegionGoDSplit(device) => device.get_id(), - HidRawDevice::LegionGoFPS(device) => device.get_id(), - HidRawDevice::LegionGoX(device) => device.get_id(), - HidRawDevice::OrangePiNeo(device) => device.get_id(), - HidRawDevice::Fts3528Touchscreen(device) => device.get_id(), - HidRawDevice::XpadUhid(device) => device.get_id(), - HidRawDevice::RogAlly(device) => device.get_id(), - HidRawDevice::HoripadSteam(device) => device.get_id(), - }, - SourceDevice::Iio(device) => match device { - IioDevice::BmiImu(device) => device.get_id(), - IioDevice::AccelGryo3D(device) => device.get_id(), - }, + SourceDevice::Event(device) => device.get_id(), + SourceDevice::HidRaw(device) => device.get_id(), + SourceDevice::Iio(device) => device.get_id(), } } /// Returns a client channel that can be used to send events to this device pub fn client(&self) -> SourceDeviceClient { match self { - SourceDevice::Event(device) => match device { - EventDevice::Gamepad(device) => device.client(), - EventDevice::Blocked(device) => device.client(), - }, - SourceDevice::HidRaw(device) => match device { - HidRawDevice::DualSense(device) => device.client(), - HidRawDevice::SteamDeck(device) => device.client(), - HidRawDevice::LegionGoDCombined(device) => device.client(), - HidRawDevice::LegionGoDSplit(device) => device.client(), - HidRawDevice::LegionGoFPS(device) => device.client(), - HidRawDevice::LegionGoX(device) => device.client(), - HidRawDevice::OrangePiNeo(device) => device.client(), - HidRawDevice::Fts3528Touchscreen(device) => device.client(), - HidRawDevice::XpadUhid(device) => device.client(), - HidRawDevice::RogAlly(device) => device.client(), - HidRawDevice::HoripadSteam(device) => device.client(), - }, - SourceDevice::Iio(device) => match device { - IioDevice::BmiImu(device) => device.client(), - IioDevice::AccelGryo3D(device) => device.client(), - }, + SourceDevice::Event(device) => device.client(), + SourceDevice::HidRaw(device) => device.client(), + SourceDevice::Iio(device) => device.client(), } } /// Run the source device pub async fn run(self) -> Result<(), Box> { match self { - SourceDevice::Event(device) => match device { - EventDevice::Gamepad(device) => device.run().await, - EventDevice::Blocked(device) => device.run().await, - }, - SourceDevice::HidRaw(device) => match device { - HidRawDevice::DualSense(device) => device.run().await, - HidRawDevice::SteamDeck(device) => device.run().await, - HidRawDevice::LegionGoDCombined(device) => device.run().await, - HidRawDevice::LegionGoDSplit(device) => device.run().await, - HidRawDevice::LegionGoFPS(device) => device.run().await, - HidRawDevice::LegionGoX(device) => device.run().await, - HidRawDevice::OrangePiNeo(device) => device.run().await, - HidRawDevice::Fts3528Touchscreen(device) => device.run().await, - HidRawDevice::XpadUhid(device) => device.run().await, - HidRawDevice::RogAlly(device) => device.run().await, - HidRawDevice::HoripadSteam(device) => device.run().await, - }, - SourceDevice::Iio(device) => match device { - IioDevice::BmiImu(device) => device.run().await, - IioDevice::AccelGryo3D(device) => device.run().await, - }, + SourceDevice::Event(device) => device.run().await, + SourceDevice::HidRaw(device) => device.run().await, + SourceDevice::Iio(device) => device.run().await, } } /// Returns the capabilities that this source device can fulfill. pub fn get_capabilities(&self) -> Result, InputError> { match self { - SourceDevice::Event(device) => match device { - EventDevice::Gamepad(device) => device.get_capabilities(), - EventDevice::Blocked(device) => device.get_capabilities(), - }, - SourceDevice::HidRaw(device) => match device { - HidRawDevice::DualSense(device) => device.get_capabilities(), - HidRawDevice::SteamDeck(device) => device.get_capabilities(), - HidRawDevice::LegionGoDCombined(device) => device.get_capabilities(), - HidRawDevice::LegionGoDSplit(device) => device.get_capabilities(), - HidRawDevice::LegionGoFPS(device) => device.get_capabilities(), - HidRawDevice::LegionGoX(device) => device.get_capabilities(), - HidRawDevice::OrangePiNeo(device) => device.get_capabilities(), - HidRawDevice::Fts3528Touchscreen(device) => device.get_capabilities(), - HidRawDevice::XpadUhid(device) => device.get_capabilities(), - HidRawDevice::RogAlly(device) => device.get_capabilities(), - HidRawDevice::HoripadSteam(device) => device.get_capabilities(), - }, - SourceDevice::Iio(device) => match device { - IioDevice::BmiImu(device) => device.get_capabilities(), - IioDevice::AccelGryo3D(device) => device.get_capabilities(), - }, + SourceDevice::Event(device) => device.get_capabilities(), + SourceDevice::HidRaw(device) => device.get_capabilities(), + SourceDevice::Iio(device) => device.get_capabilities(), } } /// Returns the full path to the device handler (e.g. /dev/input/event3, /dev/hidraw0) pub fn get_device_path(&self) -> String { match self { - SourceDevice::Event(device) => match device { - EventDevice::Gamepad(device) => device.get_device_path(), - EventDevice::Blocked(device) => device.get_device_path(), - }, - SourceDevice::HidRaw(device) => match device { - HidRawDevice::DualSense(device) => device.get_device_path(), - HidRawDevice::SteamDeck(device) => device.get_device_path(), - HidRawDevice::LegionGoDCombined(device) => device.get_device_path(), - HidRawDevice::LegionGoDSplit(device) => device.get_device_path(), - HidRawDevice::LegionGoFPS(device) => device.get_device_path(), - HidRawDevice::LegionGoX(device) => device.get_device_path(), - HidRawDevice::OrangePiNeo(device) => device.get_device_path(), - HidRawDevice::Fts3528Touchscreen(device) => device.get_device_path(), - HidRawDevice::XpadUhid(device) => device.get_device_path(), - HidRawDevice::RogAlly(device) => device.get_device_path(), - HidRawDevice::HoripadSteam(device) => device.get_device_path(), - }, - SourceDevice::Iio(device) => match device { - IioDevice::BmiImu(device) => device.get_device_path(), - IioDevice::AccelGryo3D(device) => device.get_device_path(), - }, + SourceDevice::Event(device) => device.get_device_path(), + SourceDevice::HidRaw(device) => device.get_device_path(), + SourceDevice::Iio(device) => device.get_device_path(), } } }