diff --git a/ps2d/src/controller.rs b/ps2d/src/controller.rs index 7eae9e85d3..de4e6180bc 100644 --- a/ps2d/src/controller.rs +++ b/ps2d/src/controller.rs @@ -1,6 +1,6 @@ use syscall::io::{Io, Pio, ReadOnly, WriteOnly}; -use std::{fmt, thread, time}; +use std::fmt; #[derive(Debug)] pub enum Error { @@ -110,25 +110,23 @@ impl Ps2 { } fn wait_write(&mut self) -> Result<(), Error> { - let mut timeout = 100; + let mut timeout = 100_000; while self.status().contains(StatusFlags::INPUT_FULL) { if timeout <= 0 { return Err(Error::WriteTimeout); } timeout -= 1; - thread::sleep(time::Duration::from_millis(1)); } Ok(()) } fn wait_read(&mut self) -> Result<(), Error> { - let mut timeout = 100; + let mut timeout = 100_000; while ! self.status().contains(StatusFlags::OUTPUT_FULL) { if timeout <= 0 { return Err(Error::ReadTimeout); } timeout -= 1; - thread::sleep(time::Duration::from_millis(1)); } Ok(()) } @@ -156,16 +154,6 @@ impl Ps2 { Ok(()) } - fn config(&mut self) -> Result { - self.command(Command::ReadConfig)?; - self.read().map(ConfigFlags::from_bits_truncate) - } - - fn set_config(&mut self, config: ConfigFlags) -> Result<(), Error> { - self.command(Command::WriteConfig)?; - self.write(config.bits()) - } - fn retry Result>(&mut self, name: fmt::Arguments, retries: usize, f: F) -> Result { eprintln!("ps2d: {}", name); let mut res = Err(Error::NoMoreTries); @@ -183,6 +171,30 @@ impl Ps2 { res } + fn config(&mut self) -> Result { + self.retry( + format_args!("read config"), + 4, + |x| { + x.command(Command::ReadConfig)?; + x.read() + } + ).map(ConfigFlags::from_bits_truncate) + } + + fn set_config(&mut self, config: ConfigFlags) -> Result<(), Error> { + self.retry( + format_args!("write config"), + 4, + |x| { + x.command(Command::WriteConfig)?; + x.write(config.bits())?; + Ok(0) + } + )?; + Ok(()) + } + fn keyboard_command_inner(&mut self, command: u8) -> Result { self.write(command as u8)?; match self.read()? {