use crate::bus::memory_map::*;
use crate::Bus;
#[derive(Debug, Clone)]
pub struct Bank<'a> {
bus: &'a Bus,
pub memory_offset: u16,
pub timer_setup: u16,
}
impl<'a> Bank<'a> {
pub fn new(bus: &Bus) -> Bank {
Bank {
bus,
memory_offset: 0x0,
timer_setup: 0x0,
}
}
pub fn new_set(bus: &Bus) -> Vec<Bank> {
let mut banks = vec![Bank::new(&bus).clone(); 4];
let mut gpio_base_address = fpga_address::GPIO + 4;
for mut bank in &mut banks {
bank.memory_offset = gpio_base_address;
gpio_base_address = gpio_base_address + 6;
}
banks
}
pub fn set_period(&self, period: u16) {
self.bus_write(self.memory_offset + 1, period);
}
pub fn set_duty(&self, channel: u16, duty: u16) {
self.bus_write(self.memory_offset + 2 + channel, duty);
}
fn bus_write(&self, memory_offset: u16, timer_setup: u16) {
let mut buffer: [u32; 3] = [0; 3];
buffer[0] = (memory_offset) as u32; buffer[1] = 2; buffer[2] = timer_setup as u32;
self.bus
.write(unsafe { std::mem::transmute::<&mut [u32], &mut [u8]>(&mut buffer) });
}
}