diff --git a/Cargo.toml b/Cargo.toml index 1753393..02f0207 100755 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,10 +15,10 @@ exclude = [ ] [dependencies] -embedded-hal = "0.2.7" +embedded-hal = "1.0.0" bit_reverse = { version = "0.1.7", default-features = false } bitflags = "1.0" byteorder = { version = "1.2", default-features = false } [dev-dependencies] -linux-embedded-hal = "0.2.2" +linux-embedded-hal = "0.4.0" diff --git a/examples/baton.rs b/examples/baton.rs index a1642b6..7de49f7 100755 --- a/examples/baton.rs +++ b/examples/baton.rs @@ -2,10 +2,8 @@ extern crate bit_reverse; extern crate linux_embedded_hal as linux_hal; extern crate pscontroller_rs; -use linux_hal::spidev::{SpidevOptions, SPI_MODE_3}; -use linux_hal::Pin; -use linux_hal::Spidev; -use std::io; +use linux_hal::spidev::{SpiModeFlags, SpidevOptions}; +use linux_hal::{CdevPin, SpidevBus}; use pscontroller_rs::PlayStationPort; @@ -15,12 +13,12 @@ const SPI_DEVICE: &str = "/dev/spidev0.0"; const SPI_SPEED: u32 = 10_000; // This will build the SPI device communication for us -fn build_spi() -> io::Result { - let mut spi = Spidev::open(SPI_DEVICE)?; +fn build_spi() -> Result> { + let mut spi = SpidevBus::open(SPI_DEVICE)?; let opts = SpidevOptions::new() .bits_per_word(8) .max_speed_hz(SPI_SPEED) - .mode(SPI_MODE_3) + .mode(SpiModeFlags::SPI_MODE_3) .build(); spi.configure(&opts)?; @@ -29,7 +27,7 @@ fn build_spi() -> io::Result { fn main() { let spi = build_spi().unwrap(); - let mut psp = PlayStationPort::new(spi, None::); + let mut psp: PlayStationPort<_, CdevPin> = PlayStationPort::new(spi, None); let mut controller; diff --git a/examples/console.rs b/examples/console.rs index 01797bb..b6d8d02 100755 --- a/examples/console.rs +++ b/examples/console.rs @@ -2,10 +2,8 @@ extern crate embedded_hal; extern crate linux_embedded_hal as linux_hal; extern crate pscontroller_rs; -use linux_hal::spidev::{SpidevOptions, SPI_MODE_3}; -use linux_hal::Pin; -use linux_hal::Spidev; -use std::io; +use linux_hal::spidev::{SpiModeFlags, SpidevOptions}; +use linux_hal::{CdevPin, SpidevBus}; use std::{thread, time}; use pscontroller_rs::PlayStationPort; @@ -16,14 +14,14 @@ const SPI_DEVICE: &str = "/dev/spidev0.0"; const SPI_SPEED: u32 = 100_000; // If you need to use an alternate pin for cable select, uncomment the relevant bits // and pass the pin into psp's new() function. -//const SPI_ENABLE_PIN: u64 = 4; +//const SPI_ENABLE_PIN: u32 = 4; -fn build_spi() -> io::Result { - let mut spi = Spidev::open(SPI_DEVICE)?; +fn build_spi() -> Result> { + let mut spi = SpidevBus::open(SPI_DEVICE)?; let opts = SpidevOptions::new() .bits_per_word(8) .max_speed_hz(SPI_SPEED) - .mode(SPI_MODE_3) + .mode(SpiModeFlags::SPI_MODE_3) .build(); spi.configure(&opts)?; @@ -32,9 +30,7 @@ fn build_spi() -> io::Result { fn main() { let spi = build_spi().unwrap(); - //let enable_pin = Pin::new(SPI_ENABLE_PIN); - //let mut psp = PlayStationPort::new(spi, Some(enable_pin)); - let mut psp = PlayStationPort::new(spi, None::); + let mut psp: PlayStationPort<_, CdevPin> = PlayStationPort::new(spi, None); let mut command = [0u8; 32]; let mut buffer = [0u8; 32]; diff --git a/examples/dualshock.rs b/examples/dualshock.rs index 4702b5f..69e5004 100755 --- a/examples/dualshock.rs +++ b/examples/dualshock.rs @@ -2,10 +2,8 @@ extern crate bit_reverse; extern crate linux_embedded_hal as linux_hal; extern crate pscontroller_rs; -use linux_hal::spidev::{SpidevOptions, SPI_MODE_3}; -use linux_hal::Pin; -use linux_hal::Spidev; -use std::io; +use linux_hal::spidev::{SpiModeFlags, SpidevOptions}; +use linux_hal::{CdevPin, SpidevBus}; use pscontroller_rs::{classic::GamepadButtons, dualshock::ControlDS, Device, PlayStationPort}; @@ -15,12 +13,12 @@ const SPI_DEVICE: &str = "/dev/spidev0.0"; const SPI_SPEED: u32 = 10_000; // This will build the -fn build_spi() -> io::Result { - let mut spi = Spidev::open(SPI_DEVICE)?; +fn build_spi() -> Result> { + let mut spi = SpidevBus::open(SPI_DEVICE)?; let opts = SpidevOptions::new() .bits_per_word(8) .max_speed_hz(SPI_SPEED) - .mode(SPI_MODE_3) + .mode(SpiModeFlags::SPI_MODE_3) .build(); spi.configure(&opts)?; @@ -47,7 +45,7 @@ fn set_motors(buttons: &GamepadButtons, small: &mut bool, big: &mut u8) { fn main() { let spi = build_spi().unwrap(); - let mut psp = PlayStationPort::new(spi, None::); + let mut psp: PlayStationPort<_, CdevPin> = PlayStationPort::new(spi, None); let mut control_ds = ControlDS::new(false, 0); let mut big: u8 = 0; diff --git a/examples/guitarhero.rs b/examples/guitarhero.rs index 8989fc1..938d9ea 100755 --- a/examples/guitarhero.rs +++ b/examples/guitarhero.rs @@ -2,10 +2,8 @@ extern crate bit_reverse; extern crate linux_embedded_hal as linux_hal; extern crate pscontroller_rs; -use linux_hal::spidev::{SpidevOptions, SPI_MODE_3}; -use linux_hal::Pin; -use linux_hal::Spidev; -use std::io; +use linux_hal::spidev::{SpiModeFlags, SpidevOptions}; +use linux_hal::{CdevPin, SpidevBus}; use pscontroller_rs::PlayStationPort; @@ -15,12 +13,12 @@ const SPI_DEVICE: &str = "/dev/spidev0.0"; const SPI_SPEED: u32 = 10_000; // This will build the -fn build_spi() -> io::Result { - let mut spi = Spidev::open(SPI_DEVICE)?; +fn build_spi() -> Result> { + let mut spi = SpidevBus::open(SPI_DEVICE)?; let opts = SpidevOptions::new() .bits_per_word(8) .max_speed_hz(SPI_SPEED) - .mode(SPI_MODE_3) + .mode(SpiModeFlags::SPI_MODE_3) .build(); spi.configure(&opts)?; @@ -29,7 +27,7 @@ fn build_spi() -> io::Result { fn main() { let spi = build_spi().unwrap(); - let mut psp = PlayStationPort::new(spi, None::); + let mut psp: PlayStationPort<_, CdevPin> = PlayStationPort::new(spi, None); let mut controller; diff --git a/examples/jogcon.rs b/examples/jogcon.rs index 061cd14..764d4f9 100755 --- a/examples/jogcon.rs +++ b/examples/jogcon.rs @@ -9,10 +9,8 @@ extern crate embedded_hal; extern crate linux_embedded_hal as linux_hal; extern crate pscontroller_rs; -use linux_hal::spidev::{SpidevOptions, SPI_MODE_3}; -use linux_hal::Pin; -use linux_hal::Spidev; -use std::io; +use linux_hal::spidev::{SpiModeFlags, SpidevOptions}; +use linux_hal::{CdevPin, SpidevBus}; use pscontroller_rs::{ jogcon::{ControlJC, JogControl}, @@ -24,12 +22,12 @@ use pscontroller_rs::{ const SPI_DEVICE: &str = "/dev/spidev0.0"; const SPI_SPEED: u32 = 10_000; -fn build_spi() -> io::Result { - let mut spi = Spidev::open(SPI_DEVICE)?; +fn build_spi() -> Result> { + let mut spi = SpidevBus::open(SPI_DEVICE)?; let opts = SpidevOptions::new() .bits_per_word(8) .max_speed_hz(SPI_SPEED) - .mode(SPI_MODE_3) + .mode(SpiModeFlags::SPI_MODE_3) .build(); spi.configure(&opts)?; @@ -38,7 +36,7 @@ fn build_spi() -> io::Result { fn main() { let spi = build_spi().unwrap(); - let mut psp = PlayStationPort::new(spi, None::); + let mut psp: PlayStationPort<_, CdevPin> = PlayStationPort::new(spi, None); let mut control_jc = ControlJC::new(JogControl::Stop, 15); psp.enable_jogcon() diff --git a/examples/mouse.rs b/examples/mouse.rs index 4cd3fac..378d36f 100755 --- a/examples/mouse.rs +++ b/examples/mouse.rs @@ -1,11 +1,10 @@ extern crate linux_embedded_hal as linux_hal; extern crate pscontroller_rs; -use std::{io, thread, time}; +use std::{thread, time}; -use linux_hal::spidev::{SpidevOptions, SPI_MODE_3}; -use linux_hal::Pin; -use linux_hal::Spidev; +use linux_hal::spidev::{SpiModeFlags, SpidevOptions}; +use linux_hal::{CdevPin, SpidevBus}; use pscontroller_rs::{Device, PlayStationPort}; @@ -15,12 +14,12 @@ const SPI_DEVICE: &str = "/dev/spidev0.0"; const SPI_SPEED: u32 = 100_000; // This will build the -fn build_spi() -> io::Result { - let mut spi = Spidev::open(SPI_DEVICE)?; +fn build_spi() -> Result> { + let mut spi = SpidevBus::open(SPI_DEVICE)?; let opts = SpidevOptions::new() .bits_per_word(8) .max_speed_hz(SPI_SPEED) - .mode(SPI_MODE_3) + .mode(SpiModeFlags::SPI_MODE_3) .build(); spi.configure(&opts)?; @@ -29,7 +28,7 @@ fn build_spi() -> io::Result { fn main() { let spi = build_spi().unwrap(); - let mut psp = PlayStationPort::new(spi, None::); + let mut psp: PlayStationPort<_, CdevPin> = PlayStationPort::new(spi, None); let sleep_duration = time::Duration::from_millis(10); let mut x: i32 = 0; diff --git a/examples/playstation.rs b/examples/playstation.rs index bd9c231..d14bd2a 100755 --- a/examples/playstation.rs +++ b/examples/playstation.rs @@ -2,10 +2,8 @@ extern crate bit_reverse; extern crate linux_embedded_hal as linux_hal; extern crate pscontroller_rs; -use linux_hal::spidev::{SpidevOptions, SPI_MODE_3}; -use linux_hal::Pin; -use linux_hal::Spidev; -use std::io; +use linux_hal::spidev::{SpiModeFlags, SpidevOptions}; +use linux_hal::{CdevPin, SpidevBus}; use pscontroller_rs::{Device, PlayStationPort}; @@ -15,12 +13,12 @@ const SPI_DEVICE: &str = "/dev/spidev0.0"; const SPI_SPEED: u32 = 100_000; // This will build the -fn build_spi() -> io::Result { - let mut spi = Spidev::open(SPI_DEVICE)?; +fn build_spi() -> Result> { + let mut spi = SpidevBus::open(SPI_DEVICE)?; let opts = SpidevOptions::new() .bits_per_word(8) .max_speed_hz(SPI_SPEED) - .mode(SPI_MODE_3) + .mode(SpiModeFlags::SPI_MODE_3) .build(); spi.configure(&opts)?; @@ -36,7 +34,7 @@ fn dump_hex(buffer: &[u8]) { fn main() { let spi = build_spi().unwrap(); - let mut psp = PlayStationPort::new(spi, None::); + let mut psp: PlayStationPort<_, CdevPin> = PlayStationPort::new(spi, None); psp.enable_pressure().unwrap(); diff --git a/examples/scanner.rs b/examples/scanner.rs index 921dd7d..a1efb01 100755 --- a/examples/scanner.rs +++ b/examples/scanner.rs @@ -2,10 +2,8 @@ extern crate embedded_hal; extern crate linux_embedded_hal as linux_hal; extern crate pscontroller_rs; -use linux_hal::spidev::{SpidevOptions, SPI_MODE_3}; -use linux_hal::Pin; -use linux_hal::Spidev; -use std::io; +use linux_hal::spidev::{SpiModeFlags, SpidevOptions}; +use linux_hal::{CdevPin, SpidevBus}; use std::{thread, time}; use pscontroller_rs::{MultitapPort, PlayStationPort}; @@ -26,12 +24,12 @@ const SCAN_RESPONSE_WIDTH: u8 = 10; const SAMPLE_PAUSE: u64 = 0_000; const USE_MULTITAP: bool = false; -fn build_spi() -> io::Result { - let mut spi = Spidev::open(SPI_DEVICE)?; +fn build_spi() -> Result> { + let mut spi = SpidevBus::open(SPI_DEVICE)?; let opts = SpidevOptions::new() .bits_per_word(8) .max_speed_hz(SPI_SPEED) - .mode(SPI_MODE_3) + .mode(SpiModeFlags::SPI_MODE_3) .build(); spi.configure(&opts)?; @@ -40,7 +38,7 @@ fn build_spi() -> io::Result { fn main() { let spi = build_spi().unwrap(); - let mut psp = PlayStationPort::new(spi, None::); + let mut psp: PlayStationPort<_, CdevPin> = PlayStationPort::new(spi, None); let mut command = [0u8; SCAN_RESPONSE_WIDTH as usize]; let mut buffer = [0u8; SCAN_RESPONSE_WIDTH as usize]; let mut _dummy = [0u8; SCAN_RESPONSE_WIDTH as usize]; diff --git a/src/lib.rs b/src/lib.rs index 337d2f2..c2f3d7b 100755 --- a/src/lib.rs +++ b/src/lib.rs @@ -66,8 +66,8 @@ extern crate embedded_hal as hal; use bit_reverse::ParallelReverse; use core::fmt; -use hal::blocking::spi; -use hal::digital::v2::OutputPin; +use hal::digital::OutputPin; +use hal::spi::SpiBus; use baton::Baton; use classic::{Classic, GamepadButtons}; @@ -285,9 +285,9 @@ pub struct PlayStationPort { multitap_port: MultitapPort, } -impl PlayStationPort +impl PlayStationPort where - SPI: spi::Transfer, + SPI: SpiBus, CS: OutputPin, { /// Create a new device to talk over the PlayStation's controller @@ -319,7 +319,7 @@ where } /// Sends commands to the underlying hardware and provides responses - pub fn send_command(&mut self, command: &[u8], result: &mut [u8]) -> Result<(), E> { + pub fn send_command(&mut self, command: &[u8], result: &mut [u8]) -> Result<(), SPI::Error> { // Pack in bytes for the command we'll be sending result[..command.len()].copy_from_slice(command); result[0] = self.multitap_port.clone() as u8; @@ -332,7 +332,7 @@ where let _ = x.set_low(); } - self.dev.transfer(result)?; + self.dev.transfer_in_place(result)?; if let Some(ref mut x) = self.select { let _ = x.set_high(); @@ -345,7 +345,7 @@ where /// Configure the controller to set it to DualShock2 mode. This will also /// enable analog mode on DualShock1 controllers. - pub fn enable_pressure(&mut self) -> Result<(), E> { + pub fn enable_pressure(&mut self) -> Result<(), SPI::Error> { // TODO: Redefine this to allow input parameters. Right now they're are hard coded // TODO: Detect and return actual protocol errors @@ -370,7 +370,7 @@ where /// JogCon will go to sleep until buttons are pressed. If no polling is /// done for 10 seconds, it will drop out of this mode and revert to /// the standard Controller mode - pub fn enable_jogcon(&mut self) -> Result<(), E> { + pub fn enable_jogcon(&mut self) -> Result<(), SPI::Error> { let mut buffer = [0u8; MESSAGE_MAX_LENGTH]; // Wake up the controller if needed @@ -386,7 +386,7 @@ where /// Read various parameters from the controller including its current /// status. - pub fn read_config(&mut self) -> Result { + pub fn read_config(&mut self) -> Result { let mut config: ControllerConfiguration = Default::default(); let mut buffer = [0u8; MESSAGE_MAX_LENGTH]; @@ -418,7 +418,7 @@ where fn read_port( &mut self, command: Option<&dyn PollCommand>, - ) -> Result<[u8; MESSAGE_MAX_LENGTH], Error> { + ) -> Result<[u8; MESSAGE_MAX_LENGTH], Error> { let mut buffer = [0u8; MESSAGE_MAX_LENGTH]; let mut data = [0u8; MESSAGE_MAX_LENGTH]; @@ -453,7 +453,7 @@ where pub fn read_raw( &mut self, command: Option<&dyn PollCommand>, - ) -> Result> { + ) -> Result> { let mut buffer = [0u8; MESSAGE_MAX_LENGTH]; let data = self.read_port(command)?; @@ -468,7 +468,10 @@ where /// Ask the controller for input states. Different contoller types will be returned automatically /// for you. If you'd like to cooerce a controller yourself, use `read_raw`. - pub fn read_input(&mut self, command: Option<&dyn PollCommand>) -> Result> { + pub fn read_input( + &mut self, + command: Option<&dyn PollCommand>, + ) -> Result> { let mut buffer = [0u8; MESSAGE_MAX_LENGTH]; let data = self.read_port(command)?;