#![feature(duration_from_micros)]
extern crate linux_embedded_hal as linux_hal;
extern crate embedded_hal;
extern crate pscontroller_rs;
use std::io;
use std::{thread, time};
use linux_hal::Spidev;
use linux_hal::spidev::{SpidevOptions, SPI_MODE_3};
use linux_hal::Pin;
use pscontroller_rs::PlayStationPort;
const SPI_DEVICE: &str = "/dev/spidev0.0";
const SPI_SPEED: u32 = 100_000;
fn build_spi() -> io::Result<Spidev> {
let mut spi = Spidev::open(SPI_DEVICE)?;
let opts = SpidevOptions::new()
.bits_per_word(8)
.max_speed_hz(SPI_SPEED)
.mode(SPI_MODE_3)
.build();
spi.configure(&opts)?;
Ok(spi)
}
fn main() {
let spi = build_spi().unwrap();
let mut psp = PlayStationPort::new(spi, None::<Pin>);
let mut command = [0u8; 32];
let mut buffer = [0u8; 32];
command[1] = 0x42;
let mut now = time::Instant::now();
let sleep_duration = time::Duration::from_micros(20_000);
let sample_duration = time::Duration::from_secs(1);
let mut count = 0;
let mut failure = 0;
let mut rate = String::new();
psp.enable_pressure().unwrap();
loop {
thread::sleep(sleep_duration);
psp.send_command(&command, &mut buffer).unwrap();
if now.elapsed() > sample_duration {
now = time::Instant::now();
rate = format!("{0:04}/{1:04}", count, failure);
count = 0;
failure = 0;
}
println!("");
print!("Rate: ({}) - ", rate);
let mut c = 3 + (buffer[1] & 0xF) * 2;
for item in buffer.iter() {
if c == 0 {
break;
}
print!("{:02x} ", item);
c -= 1;
}
if buffer[1] == 0xff {
failure += 1;
} else {
count += 1;
}
}
}