diff --git a/src-slider_io/src/output/config.rs b/src-slider_io/src/output/config.rs index 5f0a378..cc504f9 100644 --- a/src-slider_io/src/output/config.rs +++ b/src-slider_io/src/output/config.rs @@ -27,6 +27,12 @@ pub enum GamepadLayout { Neardayo, } +#[derive(Debug, Clone, Copy)] +pub enum HoriLayout { + Full, + SliderOnly, +} + #[derive(Debug, Clone)] pub enum OutputMode { None, @@ -41,6 +47,7 @@ pub enum OutputMode { sensitivity: u8, }, Hori { + layout: HoriLayout, polling: PollingRate, sensitivity: u8, }, @@ -128,6 +135,12 @@ impl OutputMode { sensitivity: u8::try_from(v["keyboardSensitivity"].as_i64()?).ok()?, }, "gamepad-hori" => OutputMode::Hori { + layout: HoriLayout::Full, + polling: PollingRate::from_str(v["outputPolling"].as_str()?)?, + sensitivity: u8::try_from(v["keyboardSensitivity"].as_i64()?).ok()?, + }, + "gamepad-hori-wide" => OutputMode::Hori { + layout: HoriLayout::SliderOnly, polling: PollingRate::from_str(v["outputPolling"].as_str()?)?, sensitivity: u8::try_from(v["keyboardSensitivity"].as_i64()?).ok()?, }, diff --git a/src-slider_io/src/output/hori.rs b/src-slider_io/src/output/hori.rs index 0061d21..5bf8640 100644 --- a/src-slider_io/src/output/hori.rs +++ b/src-slider_io/src/output/hori.rs @@ -4,20 +4,27 @@ use vigem_client::{Client, DS4Report, DualShock4Wired, TargetId}; use crate::shared::hori::HoriState; -use super::output::OutputHandler; +use super::{config::HoriLayout, output::OutputHandler}; pub struct HoriOutput { target: DualShock4Wired, + slider_only: bool, gamepad: DS4Report, } impl HoriOutput { - pub fn new() -> Option { + pub fn new(layout: HoriLayout) -> Option { let target = Self::get_target(); + let slider_only = match layout { + HoriLayout::Full => false, + HoriLayout::SliderOnly => true, + }; + match target { Ok(target) => Some(Self { target, + slider_only, gamepad: DS4Report::default(), }), Err(e) => { @@ -50,7 +57,10 @@ impl HoriOutput { impl OutputHandler for HoriOutput { fn tick(&mut self, flat_input: &Vec) -> bool { - let hori_state = HoriState::from_flat(flat_input); + let hori_state = match self.slider_only { + false => HoriState::from_flat(flat_input), + true => HoriState::from_flat_to_wide(flat_input) + }; let buttons: u16 = hori_state .bt diff --git a/src-slider_io/src/output/output.rs b/src-slider_io/src/output/output.rs index 8868df2..f057738 100644 --- a/src-slider_io/src/output/output.rs +++ b/src-slider_io/src/output/output.rs @@ -67,11 +67,12 @@ impl AsyncJob for OutputJob { } } OutputMode::Hori { + layout, polling, sensitivity, } => { self.sensitivity = sensitivity; - let handler = HoriOutput::new(); + let handler = HoriOutput::new(layout.clone()); self.timer = interval(Duration::from_micros(polling.to_t_u64())); match handler { diff --git a/src-slider_io/src/shared/hori.rs b/src-slider_io/src/shared/hori.rs index df2467e..0eaffef 100644 --- a/src-slider_io/src/shared/hori.rs +++ b/src-slider_io/src/shared/hori.rs @@ -24,4 +24,17 @@ impl HoriState { hori_state } + + pub fn from_flat_to_wide(flat_input: &Vec) -> Self { + let mut hori_state = Self { + slider: [false; 16], + bt: [false; 4], + }; + + for (idx, i) in flat_input[0..32].iter().enumerate() { + hori_state.slider[idx / 2] |= *i; + } + + hori_state + } } diff --git a/src/App.svelte b/src/App.svelte index b85d405..84b70c2 100644 --- a/src/App.svelte +++ b/src/App.svelte @@ -304,8 +304,9 @@ - DS4, HORI DIVA FT ASC Layout +