use super::config::State;
use super::Gpio;
use crate::bus::memory_map::*;
impl<'a> Gpio<'a> {
pub fn get_state(&self, pin: u8) -> bool {
Gpio::is_pin_valid(pin).unwrap();
let mut data: [u32; 3] = [0; 3];
self.pin_get(&mut data, 2, 1);
let mask = 0x1 << pin;
let state = (data[2] & mask) >> pin;
match state {
0 => false,
1 => true,
_ => {
panic!("Error retrieving current pin state. Digital value returned was not 0 or 1")
}
}
}
pub fn get_states(&self) -> [bool; 16] {
let mut data: [u32; 3] = [0; 3];
self.pin_get(&mut data, 2, 1);
let mut pins: [bool; 16] = [false; 16];
for i in 0..16 {
let mask = 0x1 << i;
let state = ((data[2] & mask) >> i) as u8;
pins[i] = match state {
0 => false,
1 => true,
_ => panic!(
"Error retrieving current pin state. Digital value returned was not 0 or 1"
),
};
}
pins
}
fn pin_get(&self, buffer: &mut [u32], buffer_length: u32, address_offset: u16) {
buffer[0] = (fpga_address::GPIO + address_offset) as u32;
buffer[1] = buffer_length;
self.bus
.read(unsafe { std::mem::transmute::<&mut [u32], &mut [u8]>(buffer) });
}
}