pub mod average;
pub mod helpers;
pub mod priority;
pub mod toggle;
use evdev::InputEvent;
use gilrs::{Event, GamepadId};
use serde::{Deserialize, Serialize};
#[derive(clap::ValueEnum, Clone, Debug, Default, Serialize, Deserialize, PartialEq)]
pub enum MuxModeType {
Average,
#[default]
Priority,
Toggle,
}
pub struct MuxOutput {
pub events: Vec<InputEvent>,
pub set_active_controllers: Option<Vec<GamepadId>>,
}
impl MuxOutput {
pub fn events(events: Vec<InputEvent>) -> Self {
Self {
events,
set_active_controllers: None,
}
}
pub fn with_active(events: Vec<InputEvent>, active: Vec<GamepadId>) -> Self {
Self {
events,
set_active_controllers: Some(active),
}
}
}
pub trait MuxMode {
fn handle_event(
&mut self,
event: &Event,
primary_id: GamepadId,
assist_id: GamepadId,
gilrs: &gilrs::Gilrs,
) -> Option<MuxOutput>;
fn initial_active_controllers(
&self,
primary_id: GamepadId,
assist_id: GamepadId,
) -> Vec<GamepadId> {
vec![primary_id, assist_id]
}
}
pub fn create_mux_mode(mode: MuxModeType) -> Box<dyn MuxMode> {
match mode {
MuxModeType::Average => Box::new(average::AverageMode),
MuxModeType::Priority => Box::new(priority::PriorityMode),
MuxModeType::Toggle => Box::new(toggle::ToggleMode::default()),
}
}