Skip to content

Commit

Permalink
Client: code compatibility refactoring for Windows and Linux
Browse files Browse the repository at this point in the history
  • Loading branch information
DvaMishkiLapa committed Nov 17, 2024
1 parent ec9e995 commit 32b9c19
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 88 deletions.
44 changes: 37 additions & 7 deletions client/packages/vita_virtual_device/src/linux.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,10 @@ use input_linux::{
InputId, InputProperty, Key, KeyEvent, KeyState, SynchronizeEvent, UInputHandle,
};

use crate::virtual_button::Button;
use crate::virtual_config::{Config, ConfigBuilder, TouchpadSource};
use crate::virtual_touch::TouchAction;
use crate::virtual_utils::{
compute_dpad_direction, dpad_direction_to_axis_values, get_pressed_buttons,
process_touch_reports,
};
use crate::virtual_button::{Button, DpadDirection};
use crate::virtual_config::{Config, ConfigBuilder, TouchConfig, TouchpadSource};
use crate::virtual_touch::{Point, TouchAction};
use crate::virtual_utils::{compute_dpad_direction, get_pressed_buttons};
use crate::{f32_to_i16, VitaVirtualDevice, FRONT_TOUCHPAD_RECT, REAR_TOUCHPAD_RECT};

type TrackingId = u8;
Expand Down Expand Up @@ -61,6 +58,39 @@ fn map_button_to_ds4(button: Button) -> Key {
}
}

/// Converts DpadDirection to axis values suitable for uinput.
pub fn dpad_direction_to_axis_values(direction: DpadDirection) -> (i32, i32) {
match direction {
DpadDirection::North => (0, -1),
DpadDirection::NorthEast => (1, -1),
DpadDirection::East => (1, 0),
DpadDirection::SouthEast => (1, 1),
DpadDirection::South => (0, 1),
DpadDirection::SouthWest => (-1, 1),
DpadDirection::West => (-1, 0),
DpadDirection::NorthWest => (-1, -1),
DpadDirection::None => (0, 0),
}
}

/// Processes touch reports and returns a list of touch actions.
pub fn process_touch_reports(
touch_reports: &[vita_reports::TouchReport],
touch_config: &Option<TouchConfig>,
) -> Vec<TouchAction> {
let mut actions = Vec::new();
if let Some(TouchConfig::Zones(zones)) = touch_config {
for touch in touch_reports {
if let Some(zone) = zones.locate_at_point(&Point(touch.x.into(), touch.y.into())) {
if let Some(action) = zone.action {
actions.push(action);
}
}
}
}
actions
}

pub struct VitaDevice<F: AsRawFd> {
config: Config,
main_handle: UInputHandle<F>,
Expand Down
38 changes: 2 additions & 36 deletions client/packages/vita_virtual_device/src/virtual_utils.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
use crate::virtual_button::{Button, DpadDirection};
use crate::virtual_config::{TouchConfig, TriggerConfig};
use crate::virtual_touch::{Point, TouchAction};
use vita_reports::{ButtonsData, TouchReport};
use crate::virtual_config::TriggerConfig;
use vita_reports::ButtonsData;

/// Computes the D-Pad direction based on the button states.
pub fn compute_dpad_direction(buttons: &ButtonsData) -> DpadDirection {
Expand All @@ -18,21 +17,6 @@ pub fn compute_dpad_direction(buttons: &ButtonsData) -> DpadDirection {
}
}

/// Converts DpadDirection to axis values suitable for uinput.
pub fn dpad_direction_to_axis_values(direction: DpadDirection) -> (i32, i32) {
match direction {
DpadDirection::North => (0, -1),
DpadDirection::NorthEast => (1, -1),
DpadDirection::East => (1, 0),
DpadDirection::SouthEast => (1, 1),
DpadDirection::South => (0, 1),
DpadDirection::SouthWest => (-1, 1),
DpadDirection::West => (-1, 0),
DpadDirection::NorthWest => (-1, -1),
DpadDirection::None => (0, 0),
}
}

/// Retrieves the list of pressed buttons based on the report and trigger configuration.
pub fn get_pressed_buttons(
report_buttons: &ButtonsData,
Expand Down Expand Up @@ -64,21 +48,3 @@ pub fn get_pressed_buttons(
.filter_map(|(pressed, button)| if pressed { Some(button) } else { None })
.collect()
}

/// Processes touch reports and returns a list of touch actions.
pub fn process_touch_reports(
touch_reports: &[TouchReport],
touch_config: &Option<TouchConfig>,
) -> Vec<TouchAction> {
let mut actions = Vec::new();
if let Some(TouchConfig::Zones(zones)) = touch_config {
for touch in touch_reports {
if let Some(zone) = zones.locate_at_point(&Point(touch.x.into(), touch.y.into())) {
if let Some(action) = zone.action {
actions.push(action);
}
}
}
}
actions
}
46 changes: 1 addition & 45 deletions client/packages/vita_virtual_device/src/windows.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ use vigem_client::{
use crate::virtual_button::{Button, DpadDirection};
use crate::virtual_config::{Config, ConfigBuilder, TouchConfig, TriggerConfig};
use crate::virtual_touch::{Point, TouchAction};
use crate::virtual_utils::{compute_dpad_direction, get_pressed_buttons};
use crate::{f32_to_i16, VitaVirtualDevice, FRONT_TOUCHPAD_RECT, REAR_TOUCHPAD_RECT};

#[derive(Debug, thiserror::Error)]
Expand Down Expand Up @@ -40,51 +41,6 @@ fn map_button_to_ds4(button: Button) -> u16 {
}
}

fn compute_dpad_direction(buttons: &vita_reports::ButtonsData) -> DpadDirection {
match (buttons.up, buttons.down, buttons.left, buttons.right) {
(true, false, false, false) => DpadDirection::North,
(true, false, true, false) => DpadDirection::NorthWest,
(true, false, false, true) => DpadDirection::NorthEast,
(false, true, false, false) => DpadDirection::South,
(false, true, true, false) => DpadDirection::SouthWest,
(false, true, false, true) => DpadDirection::SouthEast,
(false, false, true, false) => DpadDirection::West,
(false, false, false, true) => DpadDirection::East,
_ => DpadDirection::None,
}
}

fn get_pressed_buttons(
report_buttons: &vita_reports::ButtonsData,
trigger_config: TriggerConfig,
) -> Vec<Button> {
let mut buttons = vec![
(report_buttons.circle, Button::Circle),
(report_buttons.square, Button::Square),
(report_buttons.cross, Button::Cross),
(report_buttons.triangle, Button::Triangle),
(report_buttons.start, Button::Options),
(report_buttons.select, Button::Share),
];

// Trigger processing depending on the configuration
match trigger_config {
TriggerConfig::Shoulder => {
buttons.push((report_buttons.lt, Button::ShoulderLeft));
buttons.push((report_buttons.rt, Button::ShoulderRight));
}
TriggerConfig::Trigger => {
buttons.push((report_buttons.lt, Button::TriggerLeft));
buttons.push((report_buttons.rt, Button::TriggerRight));
}
}

buttons
.into_iter()
.filter_map(|(pressed, button)| if pressed { Some(button) } else { None })
.collect()
}

fn map_dpad_direction_to_ds4(dpad: DpadDirection) -> VigemDpadDirection {
match dpad {
DpadDirection::North => VigemDpadDirection::North,
Expand Down

0 comments on commit 32b9c19

Please sign in to comment.