use crate::error::Result;
pub const DEFAULT_BULK_CHUNK_SIZE: usize = 32 * 1024;
pub trait Programmer {
fn name(&self) -> &str;
fn spi_transfer(&mut self, tx: &[u8], rx: &mut [u8]) -> Result<()>;
fn spi_write(&mut self, data: &[u8]) -> Result<()> {
let mut sink = vec![0u8; data.len()];
self.spi_transfer(data, &mut sink)
}
fn spi_read(&mut self, len: usize) -> Result<Vec<u8>> {
let tx = vec![0xFF; len];
let mut rx = vec![0u8; len];
self.spi_transfer(&tx, &mut rx)?;
Ok(rx)
}
fn set_cs(&mut self, active: bool) -> Result<()>;
fn select_cs(&mut self, _index: u8) -> Result<()> {
Ok(())
}
fn spi_read_bulk(&mut self, len: usize) -> Result<Vec<u8>> {
self.spi_read(len)
}
fn spi_transaction(&mut self, tx: &[u8], rx_len: usize) -> Result<Vec<u8>> {
self.set_cs(true)?;
self.spi_write(tx)?;
let rx = self.spi_read(rx_len)?;
self.set_cs(false)?;
Ok(rx)
}
fn spi_transaction_write(&mut self, tx: &[u8]) -> Result<()> {
self.set_cs(true)?;
self.spi_write(tx)?;
self.set_cs(false)?;
Ok(())
}
fn max_bulk_transfer_size(&self) -> usize {
DEFAULT_BULK_CHUNK_SIZE
}
fn set_speed(&mut self, _speed: u8) -> Result<()> {
Ok(())
}
fn i2c_write(&mut self, _addr: u8, _data: &[u8]) -> Result<()> {
use crate::error::Error;
Err(Error::NotSupported(
"I2C write not supported by this programmer".to_string(),
))
}
fn i2c_read(&mut self, _addr: u8, _len: usize) -> Result<Vec<u8>> {
use crate::error::Error;
Err(Error::NotSupported(
"I2C read not supported by this programmer".to_string(),
))
}
fn gpio_set(&mut self, _pin: u8, _level: bool) -> Result<()> {
use crate::error::Error;
Err(Error::NotSupported(
"GPIO control not supported by this programmer".to_string(),
))
}
fn gpio_get(&mut self, _pin: u8) -> Result<bool> {
use crate::error::Error;
Err(Error::NotSupported(
"GPIO read not supported by this programmer".to_string(),
))
}
}
impl Programmer for Box<dyn Programmer> {
fn name(&self) -> &str {
self.as_ref().name()
}
fn spi_transfer(&mut self, tx: &[u8], rx: &mut [u8]) -> Result<()> {
self.as_mut().spi_transfer(tx, rx)
}
fn spi_write(&mut self, data: &[u8]) -> Result<()> {
self.as_mut().spi_write(data)
}
fn spi_read(&mut self, len: usize) -> Result<Vec<u8>> {
self.as_mut().spi_read(len)
}
fn set_cs(&mut self, active: bool) -> Result<()> {
self.as_mut().set_cs(active)
}
fn spi_read_bulk(&mut self, len: usize) -> Result<Vec<u8>> {
self.as_mut().spi_read_bulk(len)
}
fn spi_transaction(&mut self, tx: &[u8], rx_len: usize) -> Result<Vec<u8>> {
self.as_mut().spi_transaction(tx, rx_len)
}
fn spi_transaction_write(&mut self, tx: &[u8]) -> Result<()> {
self.as_mut().spi_transaction_write(tx)
}
fn max_bulk_transfer_size(&self) -> usize {
self.as_ref().max_bulk_transfer_size()
}
fn set_speed(&mut self, speed: u8) -> Result<()> {
self.as_mut().set_speed(speed)
}
fn i2c_write(&mut self, addr: u8, data: &[u8]) -> Result<()> {
self.as_mut().i2c_write(addr, data)
}
fn i2c_read(&mut self, addr: u8, len: usize) -> Result<Vec<u8>> {
self.as_mut().i2c_read(addr, len)
}
fn gpio_set(&mut self, pin: u8, level: bool) -> Result<()> {
self.as_mut().gpio_set(pin, level)
}
fn gpio_get(&mut self, pin: u8) -> Result<bool> {
self.as_mut().gpio_get(pin)
}
}
impl<P: Programmer + ?Sized> Programmer for &mut P {
fn name(&self) -> &str {
(**self).name()
}
fn spi_transfer(&mut self, tx: &[u8], rx: &mut [u8]) -> Result<()> {
(**self).spi_transfer(tx, rx)
}
fn spi_write(&mut self, data: &[u8]) -> Result<()> {
(**self).spi_write(data)
}
fn spi_read(&mut self, len: usize) -> Result<Vec<u8>> {
(**self).spi_read(len)
}
fn set_cs(&mut self, active: bool) -> Result<()> {
(**self).set_cs(active)
}
fn spi_read_bulk(&mut self, len: usize) -> Result<Vec<u8>> {
(**self).spi_read_bulk(len)
}
fn spi_transaction(&mut self, tx: &[u8], rx_len: usize) -> Result<Vec<u8>> {
(**self).spi_transaction(tx, rx_len)
}
fn spi_transaction_write(&mut self, tx: &[u8]) -> Result<()> {
(**self).spi_transaction_write(tx)
}
fn max_bulk_transfer_size(&self) -> usize {
(**self).max_bulk_transfer_size()
}
fn set_speed(&mut self, speed: u8) -> Result<()> {
(**self).set_speed(speed)
}
fn i2c_write(&mut self, addr: u8, data: &[u8]) -> Result<()> {
(**self).i2c_write(addr, data)
}
fn i2c_read(&mut self, addr: u8, len: usize) -> Result<Vec<u8>> {
(**self).i2c_read(addr, len)
}
fn gpio_set(&mut self, pin: u8, level: bool) -> Result<()> {
(**self).gpio_set(pin, level)
}
fn gpio_get(&mut self, pin: u8) -> Result<bool> {
(**self).gpio_get(pin)
}
}