diff --git a/src/input.rs b/src/input.rs index 17e5e46..d13a521 100644 --- a/src/input.rs +++ b/src/input.rs @@ -22,7 +22,7 @@ use crate::{ filter::{run_waveshaping, FilterGains, KalmanState, WaveshapingValues, FILTER_GAINS}, gcc_hid::GcReport, helpers::XyValuePair, - input_filter::{DummyFilter, InputFilter}, + input_filter::{InputFilter, NaxdyFilter}, stick::{linearize, notch_remap, StickParams}, }; @@ -446,7 +446,7 @@ pub async fn update_button_state_task( let mut override_stick_state: Option = None; // replace this with the input filter of your choice, if you so desire. - let mut input_filter = DummyFilter; + let mut input_filter = NaxdyFilter::new(); loop { update_button_states( diff --git a/src/input_filter.rs b/src/input_filter.rs index 3a8c93b..6d449a5 100644 --- a/src/input_filter.rs +++ b/src/input_filter.rs @@ -1,4 +1,4 @@ -use defmt::warn; +use defmt::{warn, Format}; use crate::{ config::{is_awaitable_button_pressed, AwaitableButtons}, @@ -107,3 +107,80 @@ pub struct DummyFilter; impl InputFilter for DummyFilter { fn apply_filter(&mut self, _gcc_state: &mut GcReport) {} } + +#[derive(Debug, Format, Clone, Copy, PartialEq, Eq)] +enum NaxdyFilterMode { + Steve, + Snake, + Inactive, +} + +pub struct NaxdyFilter { + mode: NaxdyFilterMode, + short_hop_filter: SingleButtonMacroFilter, + item_pickup_filter: SingleButtonMacroFilter, + cstick_up_tilt_filter: CStickUpTiltFilter, +} + +impl NaxdyFilter { + #[allow(dead_code)] + pub fn new() -> Self { + Self { + mode: NaxdyFilterMode::Snake, + short_hop_filter: SingleButtonMacroFilter { + btn_instigator: AwaitableButtons::Y, + btn_to_press: AwaitableButtons::X, + }, + item_pickup_filter: SingleButtonMacroFilter { + btn_instigator: AwaitableButtons::Y, + btn_to_press: AwaitableButtons::L, + }, + cstick_up_tilt_filter: CStickUpTiltFilter, + } + } +} + +impl InputFilter for NaxdyFilter { + fn apply_filter(&mut self, gcc_state: &mut GcReport) { + if gcc_state.buttons_1.button_a + && gcc_state.buttons_1.button_b + && gcc_state.buttons_1.dpad_right + && self.mode != NaxdyFilterMode::Inactive + { + self.mode = NaxdyFilterMode::Snake + } + + if gcc_state.buttons_1.button_a + && gcc_state.buttons_1.button_b + && gcc_state.buttons_1.dpad_left + && self.mode != NaxdyFilterMode::Inactive + { + self.mode = NaxdyFilterMode::Steve; + } + + if gcc_state.buttons_1.button_a + && gcc_state.buttons_1.button_b + && gcc_state.buttons_1.dpad_up + && self.mode == NaxdyFilterMode::Inactive + { + self.mode = NaxdyFilterMode::Snake; + } else if gcc_state.buttons_1.button_a + && gcc_state.buttons_1.button_b + && gcc_state.buttons_1.dpad_down + && self.mode != NaxdyFilterMode::Inactive + { + self.mode = NaxdyFilterMode::Inactive; + } + + match self.mode { + NaxdyFilterMode::Steve => { + self.short_hop_filter.apply_filter(gcc_state); + } + NaxdyFilterMode::Snake => { + self.cstick_up_tilt_filter.apply_filter(gcc_state); + self.item_pickup_filter.apply_filter(gcc_state); + } + NaxdyFilterMode::Inactive => {} + } + } +}