pub mod helpers;
pub mod multicast;
pub mod unicast;
use evdev::InputEvent;
use gilrs::{Event, GamepadId};
use serde::{Deserialize, Serialize};
#[derive(clap::ValueEnum, Clone, Debug, Default, Serialize, Deserialize, PartialEq)]
pub enum DemuxModeType {
Multicast,
#[default]
Unicast,
}
pub struct DemuxOutput {
pub events: Vec<(usize, Vec<InputEvent>)>,
pub set_active_virtuals: Option<Vec<usize>>,
}
impl DemuxOutput {
pub fn events(events: Vec<(usize, Vec<InputEvent>)>) -> Self {
Self {
events,
set_active_virtuals: None,
}
}
}
pub trait DemuxMode {
fn handle_event(
&mut self,
event: &Event,
primary_id: GamepadId,
virtuals: usize,
gilrs: &gilrs::Gilrs,
) -> Option<DemuxOutput>;
fn initial_active_virtuals(&self, virtuals: usize) -> Vec<usize>;
}
pub fn create_demux_mode(mode: DemuxModeType) -> Box<dyn DemuxMode> {
match mode {
DemuxModeType::Multicast => Box::new(multicast::MulticastMode),
DemuxModeType::Unicast => Box::new(unicast::UnicastMode::default()),
}
}