use core::fmt::Debug;
use hal::i2c::I2c;
use super::{Expander, ExpanderError, GPIOBank, Register};
pub trait StandardExpanderInterface<I2C, E>: Expander<I2C>
where
E: Debug,
I2C: I2c<Error = E>,
{
fn pin_set_high(&mut self, bank: GPIOBank, pin: u8) -> Result<(), ExpanderError<E>> {
assert!(pin < 8);
let register = match bank {
GPIOBank::Bank0 => Register::OutputPort0,
GPIOBank::Bank1 => Register::OutputPort1,
};
let mut reg_val: u8 = 0x00;
self.read_byte(register, &mut reg_val)?;
self.write_byte(register, reg_val | (0x01 << pin))
}
fn pin_set_low(&mut self, bank: GPIOBank, pin: u8) -> Result<(), ExpanderError<E>> {
assert!(pin < 8);
let register = match bank {
GPIOBank::Bank0 => Register::OutputPort0,
GPIOBank::Bank1 => Register::OutputPort1,
};
let mut reg_val: u8 = 0x00;
self.read_byte(register, &mut reg_val)?;
self.write_byte(register, reg_val & !(0x01 << pin))
}
fn pin_is_high(&mut self, bank: GPIOBank, pin: u8) -> Result<bool, ExpanderError<E>> {
assert!(pin < 8);
let register = match bank {
GPIOBank::Bank0 => Register::InputPort0,
GPIOBank::Bank1 => Register::InputPort1,
};
let mut reg_val: u8 = 0x00;
self.read_byte(register, &mut reg_val)?;
match (reg_val >> pin) & 1 {
1 => Ok(true),
_ => Ok(false),
}
}
fn pin_is_low(&mut self, bank: GPIOBank, pin: u8) -> Result<bool, ExpanderError<E>> {
assert!(pin < 8);
let register = match bank {
GPIOBank::Bank0 => Register::InputPort0,
GPIOBank::Bank1 => Register::InputPort1,
};
let mut reg_val: u8 = 0x00;
self.read_byte(register, &mut reg_val)?;
match (reg_val >> pin) & 1 {
1 => Ok(false),
_ => Ok(true),
}
}
fn pin_into_input(&mut self, bank: GPIOBank, pin: u8) -> Result<(), ExpanderError<E>> {
assert!(pin < 8);
let register = match bank {
GPIOBank::Bank0 => Register::ConfigurationPort0,
GPIOBank::Bank1 => Register::ConfigurationPort1,
};
let mut reg_val: u8 = 0x00;
self.read_byte(register, &mut reg_val)?;
self.write_byte(register, reg_val | (0x01 << pin))
}
fn pin_into_output(&mut self, bank: GPIOBank, pin: u8) -> Result<(), ExpanderError<E>> {
assert!(pin < 8);
let register = match bank {
GPIOBank::Bank0 => Register::ConfigurationPort0,
GPIOBank::Bank1 => Register::ConfigurationPort1,
};
let mut reg_val: u8 = 0x00;
self.read_byte(register, &mut reg_val)?;
self.write_byte(register, reg_val & !(0x01 << pin))
}
fn pin_inverse_polarity(&mut self, bank: GPIOBank, pin: u8) -> Result<(), ExpanderError<E>> {
assert!(pin < 8);
let register = match bank {
GPIOBank::Bank0 => Register::PolarityInversionPort0,
GPIOBank::Bank1 => Register::PolarityInversionPort1,
};
let mut reg_val: u8 = 0x00;
self.read_byte(register, &mut reg_val)?;
self.write_byte(register, reg_val | (0x01 << pin))
}
fn pin_normal_polarity(&mut self, bank: GPIOBank, pin: u8) -> Result<(), ExpanderError<E>> {
assert!(pin < 8);
let register = match bank {
GPIOBank::Bank0 => Register::PolarityInversionPort0,
GPIOBank::Bank1 => Register::PolarityInversionPort1,
};
let mut reg_val: u8 = 0x00;
self.read_byte(register, &mut reg_val)?;
self.write_byte(register, reg_val & !(0x01 << pin))
}
fn inverse_polarity(&mut self) -> Result<(), ExpanderError<E>> {
self.write_halfword(Register::PolarityInversionPort0, 0xFFFF_u16)
}
fn normal_polarity(&mut self) -> Result<(), ExpanderError<E>> {
self.write_halfword(Register::PolarityInversionPort0, 0x0_u16)
}
}