use std::thread::sleep;
use std::time::Duration;
use failure::ResultExt;
use crate::{Programmer, Flash, Result};
pub struct FPGA<'a> {
programmer: &'a Programmer,
}
impl<'a> FPGA<'a> {
pub fn new(programmer: &'a Programmer) -> Self {
Self { programmer }
}
pub fn reset(&self) -> Result<()> {
self.programmer.reset()?;
sleep(Duration::from_millis(10));
self.programmer.unreset()
}
pub fn power_on(&self) -> Result<()> {
self.programmer.power_on()
}
pub fn power_off(&self) -> Result<()> {
self.programmer.power_off()
}
pub fn program(&self, data: &[u8]) -> Result<()> {
self.programmer.reset()?;
let flash = Flash::new(self.programmer);
flash.power_down()?;
self.programmer.fpga_mode()?;
self.programmer.select()?;
self.programmer.unreset()?;
sleep(Duration::from_millis(10));
self.programmer.unselect()?;
self.programmer.write(&[0x00; 1])?;
self.programmer.select()?;
self.programmer.write(data).context("Error writing configuration data")?;
self.programmer.unselect()?;
self.programmer.write(&[0x00; 40])?;
Ok(())
}
}