buttplug 0.7.0

Buttplug Intimate Hardware Control Library
use super::xinput_device_impl::XInputDeviceImplCreator;
use crate::core::ButtplugResultFuture;
use crate::server::comm_managers::{
  DeviceCommunicationEvent,
  DeviceCommunicationManager,
  DeviceCommunicationManagerCreator,
};
use async_channel::Sender;
use futures::future;

#[derive(Debug, Display, Clone, Copy)]
#[repr(u8)]
pub enum XInputControllerIndex {
  XInputController0 = 0,
  XInputController1 = 1,
  XInputController2 = 2,
  XInputController3 = 3,
}

pub struct XInputDeviceCommunicationManager {
  sender: Sender<DeviceCommunicationEvent>,
  _attached_controllers: Vec<XInputControllerIndex>,
}

impl DeviceCommunicationManagerCreator for XInputDeviceCommunicationManager {
  fn new(sender: Sender<DeviceCommunicationEvent>) -> Self {
    Self {
      sender,
      _attached_controllers: vec![],
    }
  }
}

impl DeviceCommunicationManager for XInputDeviceCommunicationManager {
  fn name(&self) -> &'static str {
    "XInputDeviceCommunicationManager"
  }

  fn start_scanning(&self) -> ButtplugResultFuture {
    info!("XInput manager scanning!");
    let sender = self.sender.clone();
    Box::pin(async move {
      let handle = rusty_xinput::XInputHandle::load_default().unwrap();
      for i in &[
        XInputControllerIndex::XInputController0,
        XInputControllerIndex::XInputController1,
        XInputControllerIndex::XInputController2,
        XInputControllerIndex::XInputController3,
      ] {
        match handle.get_state(*i as u32) {
          Ok(_) => {
            info!("XInput manager found device {}", i);
            let device_creator = Box::new(XInputDeviceImplCreator::new(*i));
            if sender
              .send(DeviceCommunicationEvent::DeviceFound(device_creator))
              .await
              .is_err()
            {}
          }
          Err(_) => continue,
        }
      }
      Ok(())
    })
  }

  fn stop_scanning(&self) -> ButtplugResultFuture {
    Box::pin(future::ready(Ok(())))
  }
}